aboutsummaryrefslogtreecommitdiffstats
path: root/app/assets/stylesheets/themes
diff options
context:
space:
mode:
authorsadbeast <sadbeast@sadbeast.com>2024-01-31 17:47:56 -0800
committersadbeast <sadbeast@sadbeast.com>2024-01-31 17:47:56 -0800
commit332ec93366315fa1ed7b4acd7a3407c96e8ddfa7 (patch)
tree6ae553317f12a7a6a29c849c8805ffab96436dc2 /app/assets/stylesheets/themes
downloadtd-main.tar.gz
td-main.tar.bz2
initial mistakeHEADmain
Diffstat (limited to 'app/assets/stylesheets/themes')
-rw-r--r--app/assets/stylesheets/themes/default.scss37
-rw-r--r--app/assets/stylesheets/themes/default/_colors.scss65
-rw-r--r--app/assets/stylesheets/themes/default/_dark.scss159
-rw-r--r--app/assets/stylesheets/themes/default/_light.scss159
-rw-r--r--app/assets/stylesheets/themes/default/_styles.scss247
5 files changed, 667 insertions, 0 deletions
diff --git a/app/assets/stylesheets/themes/default.scss b/app/assets/stylesheets/themes/default.scss
new file mode 100644
index 0000000..c96b7e7
--- /dev/null
+++ b/app/assets/stylesheets/themes/default.scss
@@ -0,0 +1,37 @@
+/**
+ * Theme: default
+ */
+
+// Variables
+@import "../variables";
+@import "default/colors";
+
+// Commons styles
+@import "default/styles";
+
+// Light theme (Default)
+// Can be forced with data-theme="light"
+@import "default/light";
+
+// Dark theme (Auto)
+// Automatically enabled if user has Dark mode enabled
+@import "default/dark";
+@media only screen and (prefers-color-scheme: dark) {
+ :root:not([data-theme]) {
+ @include dark;
+ }
+}
+
+// Dark theme (Forced)
+// Enabled if forced with data-theme="dark"
+[data-theme="dark"] {
+ @include dark;
+}
+
+// Accent-color
+progress,
+[type="checkbox"],
+[type="radio"],
+[type="range"] {
+ accent-color: var(--primary);
+}
diff --git a/app/assets/stylesheets/themes/default/_colors.scss b/app/assets/stylesheets/themes/default/_colors.scss
new file mode 100644
index 0000000..19079ff
--- /dev/null
+++ b/app/assets/stylesheets/themes/default/_colors.scss
@@ -0,0 +1,65 @@
+// Navy-Grey
+$grey-hue: 205 !default;
+$grey-50: hsl($grey-hue, 20%, 94%) !default;
+$grey-100: hsl($grey-hue, 18%, 86%) !default;
+$grey-200: hsl($grey-hue, 16%, 77%) !default;
+$grey-300: hsl($grey-hue, 14%, 68%) !default;
+$grey-400: hsl($grey-hue, 12%, 59%) !default;
+$grey-500: hsl($grey-hue, 10%, 50%) !default;
+$grey-600: hsl($grey-hue, 15%, 41%) !default;
+$grey-700: hsl($grey-hue, 20%, 32%) !default;
+$grey-800: hsl($grey-hue, 25%, 23%) !default;
+$grey-900: hsl($grey-hue, 30%, 15%) !default;
+
+// Light Blue
+$primary-hue: 195 !default;
+$primary-50: hsl($primary-hue, 90%, 94%) !default;
+$primary-100: hsl($primary-hue, 88%, 86%) !default;
+$primary-200: hsl($primary-hue, 86%, 77%) !default;
+$primary-300: hsl($primary-hue, 84%, 68%) !default;
+$primary-400: hsl($primary-hue, 82%, 59%) !default;
+$primary-500: hsl($primary-hue, 80%, 50%) !default;
+$primary-600: hsl($primary-hue, 85%, 41%) !default;
+$primary-700: hsl($primary-hue, 90%, 32%) !default;
+$primary-800: hsl($primary-hue, 95%, 23%) !default;
+$primary-900: hsl($primary-hue, 100%, 15%) !default;
+
+// Black & White
+$black: #000 !default;
+$white: #fff !default;
+
+// Amber
+$amber-50: #fff8e1 !default;
+$amber-100: #ffecb3 !default;
+$amber-200: #ffe082 !default;
+$amber-300: #ffd54f !default;
+$amber-400: #ffca28 !default;
+$amber-500: #ffc107 !default;
+$amber-600: #ffb300 !default;
+$amber-700: #ffa000 !default;
+$amber-800: #ff8f00 !default;
+$amber-900: #ff6f00 !default;
+
+// Green
+$green-50: #e8f5e9 !default;
+$green-100: #c8e6c9 !default;
+$green-200: #a5d6a7 !default;
+$green-300: #81c784 !default;
+$green-400: #66bb6a !default;
+$green-500: #4caf50 !default;
+$green-600: #43a047 !default;
+$green-700: #388e3c !default;
+$green-800: #2e7d32 !default;
+$green-900: #1b5e20 !default;
+
+// Red
+$red-50: #ffebee !default;
+$red-100: #ffcdd2 !default;
+$red-200: #ef9a9a !default;
+$red-300: #e57373 !default;
+$red-400: #ef5350 !default;
+$red-500: #f44336 !default;
+$red-600: #e53935 !default;
+$red-700: #d32f2f !default;
+$red-800: #c62828 !default;
+$red-900: #b71c1c !default;
diff --git a/app/assets/stylesheets/themes/default/_dark.scss b/app/assets/stylesheets/themes/default/_dark.scss
new file mode 100644
index 0000000..2bf12e2
--- /dev/null
+++ b/app/assets/stylesheets/themes/default/_dark.scss
@@ -0,0 +1,159 @@
+@import "../../functions";
+
+// Default: Dark theme
+@mixin dark {
+ --background-color: #{mix($black, $grey-900, 37.5%)};
+
+ // Texts colors
+ --color: #{$grey-200};
+ --h1-color: #{$grey-50};
+ --h2-color: #{mix($grey-100, $grey-50)};
+ --h3-color: #{$grey-100};
+ --h4-color: #{mix($grey-200, $grey-100)};
+ --h5-color: #{$grey-200};
+ --h6-color: #{mix($grey-300, $grey-200)};
+
+ // Muted colors
+ --muted-color: #{$grey-500};
+ --muted-border-color: #{mix($grey-900, $grey-800, 75%)};
+
+ // Primary colors
+ --primary: #{$primary-600};
+ --primary-hover: #{$primary-500};
+ --primary-focus: #{rgba($primary-600, 0.25)};
+ --primary-inverse: #{$white};
+
+ // Secondary colors
+ --secondary: #{$grey-600};
+ --secondary-hover: #{$grey-500};
+ --secondary-focus: #{rgba($grey-500, 0.25)};
+ --secondary-inverse: #{$white};
+
+ // Contrast colors
+ --contrast: #{$grey-50};
+ --contrast-hover: #{$white};
+ --contrast-focus: #{rgba($grey-500, 0.25)};
+ --contrast-inverse: #{$black};
+
+ // Highlighted text (<mark>)
+ --mark-background-color: #{mix($grey-300, $amber-300)};
+ --mark-color: #{mix($black, $grey-900, 37.5%)};
+
+ // Inserted (<ins>) & Deleted (<ins>)
+ --ins-color: #{$green-700};
+ --del-color: #{$red-800};
+
+ // Blockquote
+ --blockquote-border-color: var(--muted-border-color);
+ --blockquote-footer-color: var(--muted-color);
+
+ // Button
+ // To disable box-shadow, remove the var or set to '0 0 0 rgba(0, 0, 0, 0)'
+ // Don't use, 'none, 'false, 'null', '0', etc.
+ --button-box-shadow: 0 0 0 rgba(0, 0, 0, 0);
+ --button-hover-box-shadow: 0 0 0 rgba(0, 0, 0, 0);
+
+ // Form elements
+ --form-element-background-color: #{mix($black, $grey-900, 37.5%)};
+ --form-element-border-color: #{mix($grey-800, $grey-700)};
+ --form-element-color: var(--color);
+ --form-element-placeholder-color: var(--muted-color);
+ --form-element-active-background-color: var(--form-element-background-color);
+ --form-element-active-border-color: var(--primary);
+ --form-element-focus-color: var(--primary-focus);
+ --form-element-disabled-background-color: #{$grey-800};
+ --form-element-disabled-border-color: #{$grey-700};
+ --form-element-disabled-opacity: 0.5;
+ --form-element-invalid-border-color: #{$red-900};
+ --form-element-invalid-active-border-color: #{$red-800};
+ --form-element-invalid-focus-color: #{rgba($red-800, 0.25)};
+ --form-element-valid-border-color: #{$green-800};
+ --form-element-valid-active-border-color: #{$green-700};
+ --form-element-valid-focus-color: #{rgba($green-700, 0.25)};
+
+ // Switch (input[type="checkbox"][role="switch"])
+ --switch-background-color: #{mix($grey-800, $grey-700)};
+ --switch-color: var(--primary-inverse);
+ --switch-checked-background-color: var(--primary);
+
+ // Range (input[type="range"])
+ --range-border-color: #{mix($grey-900, $grey-800)};
+ --range-active-border-color: #{$grey-800};
+ --range-thumb-border-color: var(--background-color);
+ --range-thumb-color: var(--secondary);
+ --range-thumb-hover-color: var(--secondary-hover);
+ --range-thumb-active-color: var(--primary);
+
+ // Table
+ --table-border-color: var(--muted-border-color);
+ --table-row-stripped-background-color: #{rgba($grey-500, 0.05)};
+
+ // Code
+ --code-background-color: #{mix($black, $grey-900, 12.5%)};
+ --code-color: var(--muted-color);
+ --code-kbd-background-color: var(--contrast);
+ --code-kbd-color: var(--contrast-inverse);
+ --code-tag-color: #{hsl(330, 30%, 50%)};
+ --code-property-color: #{hsl(185, 30%, 50%)};
+ --code-value-color: #{hsl(40, 10%, 50%)};
+ --code-comment-color: #{mix($grey-700, $grey-600)};
+
+ // Accordion (<details>)
+ --accordion-border-color: var(--muted-border-color);
+ --accordion-active-summary-color: var(--primary);
+ --accordion-close-summary-color: var(--color);
+ --accordion-open-summary-color: var(--muted-color);
+
+ // Card (<article>)
+ $box-shadow-elevation: 1rem;
+ $box-shadow-blur-strengh: 6rem;
+ $box-shadow-opacity: 0.06;
+ --card-background-color: #{mix($black, $grey-900, 25%)};
+ --card-border-color: var(--card-background-color);
+ --card-box-shadow:
+ #{($box-shadow-elevation * 0.5 * 0.029)} #{($box-shadow-elevation * 0.029)} #{($box-shadow-blur-strengh * 0.029)} #{rgba($black, ($box-shadow-opacity * 0.283))},
+ #{($box-shadow-elevation * 0.5 * 0.067)} #{($box-shadow-elevation * 0.067)} #{($box-shadow-blur-strengh * 0.067)} #{rgba($black, ($box-shadow-opacity * 0.4))},
+ #{($box-shadow-elevation * 0.5 * 0.125)} #{($box-shadow-elevation * 0.125)} #{($box-shadow-blur-strengh * 0.125)} #{rgba($black, ($box-shadow-opacity * 0.5))},
+ #{($box-shadow-elevation * 0.5 * 0.225)} #{($box-shadow-elevation * 0.225)} #{($box-shadow-blur-strengh * 0.225)} #{rgba($black, ($box-shadow-opacity * 0.6))},
+ #{($box-shadow-elevation * 0.5 * 0.417)} #{($box-shadow-elevation * 0.417)} #{($box-shadow-blur-strengh * 0.417)} #{rgba($black, ($box-shadow-opacity * 0.717))},
+ #{($box-shadow-elevation * 0.5)} #{$box-shadow-elevation} #{$box-shadow-blur-strengh} #{rgba($black, $box-shadow-opacity)},
+ 0 0 0 0.0625rem #{rgba($black, ($box-shadow-opacity * 0.25) )};
+ --card-sectionning-background-color: #{mix($black, $grey-900, 12.5%)};
+
+ // Dropdown (<details role="list">)
+ --dropdown-background-color: #{$grey-900};
+ --dropdown-border-color: #{mix($grey-900, $grey-800)};
+ --dropdown-box-shadow: var(--card-box-shadow);
+ --dropdown-color: var(--color);
+ --dropdown-hover-background-color: #{rgba(mix($grey-900, $grey-800), 0.75)};
+
+ // Modal (<dialog>)
+ --modal-overlay-background-color: #{rgba(mix($grey-900, $grey-800), 0.8)};
+
+ // Progress
+ --progress-background-color: #{mix($grey-900, $grey-800)};
+ --progress-color: var(--primary);
+
+ // Loading ([aria-busy=true])
+ --loading-spinner-opacity: 0.5;
+
+ // Tooltip ([data-tooltip])
+ --tooltip-background-color: var(--contrast);
+ --tooltip-color: var(--contrast-inverse);
+
+ // Icons
+ --icon-checkbox: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($white)}' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");
+ --icon-chevron: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($grey-300)}' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
+ --icon-chevron-button: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($white)}' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
+ --icon-chevron-button-inverse: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($black)}' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
+ --icon-close: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($grey-500)}' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='18' y1='6' x2='6' y2='18'%3E%3C/line%3E%3Cline x1='6' y1='6' x2='18' y2='18'%3E%3C/line%3E%3C/svg%3E");
+ --icon-date: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($grey-300)}' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4' width='18' height='18' rx='2' ry='2'%3E%3C/rect%3E%3Cline x1='16' y1='2' x2='16' y2='6'%3E%3C/line%3E%3Cline x1='8' y1='2' x2='8' y2='6'%3E%3C/line%3E%3Cline x1='3' y1='10' x2='21' y2='10'%3E%3C/line%3E%3C/svg%3E");
+ --icon-invalid: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($red-900)}' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='12' y1='8' x2='12' y2='12'%3E%3C/line%3E%3Cline x1='12' y1='16' x2='12.01' y2='16'%3E%3C/line%3E%3C/svg%3E");
+ --icon-minus: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($white)}' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='5' y1='12' x2='19' y2='12'%3E%3C/line%3E%3C/svg%3E");
+ --icon-search: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($grey-300)}' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C/circle%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'%3E%3C/line%3E%3C/svg%3E");
+ --icon-time: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($grey-300)}' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cpolyline points='12 6 12 12 16 14'%3E%3C/polyline%3E%3C/svg%3E");
+ --icon-valid: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($green-800)}' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");
+
+ // Document
+ color-scheme: dark;
+}
diff --git a/app/assets/stylesheets/themes/default/_light.scss b/app/assets/stylesheets/themes/default/_light.scss
new file mode 100644
index 0000000..237fb8f
--- /dev/null
+++ b/app/assets/stylesheets/themes/default/_light.scss
@@ -0,0 +1,159 @@
+@import "../../functions";
+
+// Default: Light theme
+[data-theme="light"],
+:root:not([data-theme="dark"]) {
+ --background-color: #{$white};
+
+ // Texts colors
+ --color: #{$grey-700};
+ --h1-color: #{$grey-900};
+ --h2-color: #{mix($grey-900, $grey-800)};
+ --h3-color: #{$grey-800};
+ --h4-color: #{mix($grey-800, $grey-700)};
+ --h5-color: #{$grey-700};
+ --h6-color: #{mix($grey-700, $grey-600)};
+
+ // Muted colors
+ --muted-color: #{$grey-500};
+ --muted-border-color: #{$grey-50};
+
+ // Primary colors
+ --primary: #{$primary-600};
+ --primary-hover: #{$primary-700};
+ --primary-focus: #{rgba($primary-600, 0.125)};
+ --primary-inverse: #{$white};
+
+ // Secondary colors
+ --secondary: #{$grey-600};
+ --secondary-hover: #{$grey-700};
+ --secondary-focus: #{rgba($grey-600, 0.125)};
+ --secondary-inverse: #{$white};
+
+ // Contrast colors
+ --contrast: #{$grey-900};
+ --contrast-hover: #{$black};
+ --contrast-focus: #{rgba($grey-600, 0.125)};
+ --contrast-inverse: #{$white};
+
+ // Highlighted text (<mark>)
+ --mark-background-color: #{mix($amber-100, $amber-50)};
+ --mark-color: #{mix($grey-900, $amber-900, 75%)};
+
+ // Inserted (<ins>) & Deleted (<ins>)
+ --ins-color: #{$green-700};
+ --del-color: #{$red-800};
+
+ // Blockquote
+ --blockquote-border-color: var(--muted-border-color);
+ --blockquote-footer-color: var(--muted-color);
+
+ // Button
+ // To disable box-shadow, remove the var or set to '0 0 0 rgba(0, 0, 0, 0)'
+ // Don't use, 'none, 'false, 'null', '0', etc.
+ --button-box-shadow: 0 0 0 rgba(0, 0, 0, 0);
+ --button-hover-box-shadow: 0 0 0 rgba(0, 0, 0, 0);
+
+ // Form elements
+ --form-element-background-color: transparent;
+ --form-element-border-color: #{$grey-300};
+ --form-element-color: var(--color);
+ --form-element-placeholder-color: var(--muted-color);
+ --form-element-active-background-color: transparent;
+ --form-element-active-border-color: var(--primary);
+ --form-element-focus-color: var(--primary-focus);
+ --form-element-disabled-background-color: #{$grey-100};
+ --form-element-disabled-border-color: #{$grey-300};
+ --form-element-disabled-opacity: 0.5;
+ --form-element-invalid-border-color: #{$red-800};
+ --form-element-invalid-active-border-color: #{$red-700};
+ --form-element-invalid-focus-color: #{rgba($red-700, 0.125)};
+ --form-element-valid-border-color: #{$green-700};
+ --form-element-valid-active-border-color: #{$green-600};
+ --form-element-valid-focus-color: #{rgba($green-600, 0.125)};
+
+ // Switch (input[type="checkbox"][role="switch"])
+ --switch-background-color: #{$grey-200};
+ --switch-color: var(--primary-inverse);
+ --switch-checked-background-color: var(--primary);
+
+ // Range (input[type="range"])
+ --range-border-color: #{$grey-100};
+ --range-active-border-color: #{$grey-200};
+ --range-thumb-border-color: var(--background-color);
+ --range-thumb-color: var(--secondary);
+ --range-thumb-hover-color: var(--secondary-hover);
+ --range-thumb-active-color: var(--primary);
+
+ // Table
+ --table-border-color: var(--muted-border-color);
+ --table-row-stripped-background-color: #{mix($grey-50, $white)};
+
+ // Code
+ --code-background-color: #{$grey-50};
+ --code-color: var(--muted-color);
+ --code-kbd-background-color: var(--contrast);
+ --code-kbd-color: var(--contrast-inverse);
+ --code-tag-color: #{hsl(330, 40%, 50%)};
+ --code-property-color: #{hsl(185, 40%, 40%)};
+ --code-value-color: #{hsl(40, 20%, 50%)};
+ --code-comment-color: #{$grey-300};
+
+ // Accordion (<details>)
+ --accordion-border-color: var(--muted-border-color);
+ --accordion-close-summary-color: var(--color);
+ --accordion-open-summary-color: var(--muted-color);
+
+ // Card (<article>)
+ $box-shadow-elevation: 1rem;
+ $box-shadow-blur-strengh: 6rem;
+ $box-shadow-opacity: 0.06;
+ --card-background-color: var(--background-color);
+ --card-border-color: var(--muted-border-color);
+ --card-box-shadow:
+ #{($box-shadow-elevation * 0.5 * 0.029)} #{($box-shadow-elevation * 0.029)} #{($box-shadow-blur-strengh * 0.029)} #{rgba($grey-900, ($box-shadow-opacity * 0.283))},
+ #{($box-shadow-elevation * 0.5 * 0.067)} #{($box-shadow-elevation * 0.067)} #{($box-shadow-blur-strengh * 0.067)} #{rgba($grey-900, ($box-shadow-opacity * 0.4))},
+ #{($box-shadow-elevation * 0.5 * 0.125)} #{($box-shadow-elevation * 0.125)} #{($box-shadow-blur-strengh * 0.125)} #{rgba($grey-900, ($box-shadow-opacity * 0.5))},
+ #{($box-shadow-elevation * 0.5 * 0.225)} #{($box-shadow-elevation * 0.225)} #{($box-shadow-blur-strengh * 0.225)} #{rgba($grey-900, ($box-shadow-opacity * 0.6))},
+ #{($box-shadow-elevation * 0.5 * 0.417)} #{($box-shadow-elevation * 0.417)} #{($box-shadow-blur-strengh * 0.417)} #{rgba($grey-900, ($box-shadow-opacity * 0.717))},
+ #{($box-shadow-elevation * 0.5)} #{$box-shadow-elevation} #{$box-shadow-blur-strengh} #{rgba($grey-900, $box-shadow-opacity)},
+ 0 0 0 0.0625rem #{rgba($grey-900, ($box-shadow-opacity * 0.25) )};
+ --card-sectionning-background-color: #{mix($grey-50, $white, 25%)};
+
+ // Dropdown (<details role="list">)
+ --dropdown-background-color: #{mix($grey-50, $white, 25%)};
+ --dropdown-border-color: #{mix($grey-100, $grey-50)};
+ --dropdown-box-shadow: var(--card-box-shadow);
+ --dropdown-color: var(--color);
+ --dropdown-hover-background-color: #{$grey-50};
+
+ // Modal (<dialog>)
+ --modal-overlay-background-color: #{rgba($grey-100, 0.7)};
+
+ // Progress
+ --progress-background-color: #{$grey-100};
+ --progress-color: var(--primary);
+
+ // Loading ([aria-busy=true])
+ --loading-spinner-opacity: 0.5;
+
+ // Tooltip ([data-tooltip])
+ --tooltip-background-color: var(--contrast);
+ --tooltip-color: var(--contrast-inverse);
+
+ // Icons
+ --icon-checkbox: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($white)}' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");
+ --icon-chevron: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($grey-700)}' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
+ --icon-chevron-button: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($white)}' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
+ --icon-chevron-button-inverse: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($white)}' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
+ --icon-close: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($grey-500)}' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='18' y1='6' x2='6' y2='18'%3E%3C/line%3E%3Cline x1='6' y1='6' x2='18' y2='18'%3E%3C/line%3E%3C/svg%3E");
+ --icon-date: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($grey-700)}' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4' width='18' height='18' rx='2' ry='2'%3E%3C/rect%3E%3Cline x1='16' y1='2' x2='16' y2='6'%3E%3C/line%3E%3Cline x1='8' y1='2' x2='8' y2='6'%3E%3C/line%3E%3Cline x1='3' y1='10' x2='21' y2='10'%3E%3C/line%3E%3C/svg%3E");
+ --icon-invalid: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($red-800)}' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='12' y1='8' x2='12' y2='12'%3E%3C/line%3E%3Cline x1='12' y1='16' x2='12.01' y2='16'%3E%3C/line%3E%3C/svg%3E");
+ --icon-minus: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($white)}' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='5' y1='12' x2='19' y2='12'%3E%3C/line%3E%3C/svg%3E");
+ --icon-search: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($grey-700)}' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C/circle%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'%3E%3C/line%3E%3C/svg%3E");
+ --icon-time: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($grey-700)}' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cpolyline points='12 6 12 12 16 14'%3E%3C/polyline%3E%3C/svg%3E");
+ --icon-valid: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='#{to-rgb($green-700)}' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");
+
+ // Document
+ color-scheme: light;
+}
diff --git a/app/assets/stylesheets/themes/default/_styles.scss b/app/assets/stylesheets/themes/default/_styles.scss
new file mode 100644
index 0000000..3a0a46d
--- /dev/null
+++ b/app/assets/stylesheets/themes/default/_styles.scss
@@ -0,0 +1,247 @@
+// Commons Styles
+:root {
+ // Typography
+ --font-family: system-ui, -apple-system, "Segoe UI", "Roboto", "Ubuntu",
+ "Cantarell", "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji",
+ "Segoe UI Symbol", "Noto Color Emoji";
+ --line-height: 1.5;
+ --font-weight: 400;
+ --font-size: 16px;
+
+ // Responsive typography
+ @if $enable-responsive-typography {
+ @if map-get($breakpoints, "sm") {
+ @media (min-width: map-get($breakpoints, "sm")) {
+ --font-size: 17px;
+ }
+ }
+
+ @if map-get($breakpoints, "md") {
+ @media (min-width: map-get($breakpoints, "md")) {
+ --font-size: 18px;
+ }
+ }
+
+ @if map-get($breakpoints, "lg") {
+ @media (min-width: map-get($breakpoints, "lg")) {
+ --font-size: 19px;
+ }
+ }
+
+ @if map-get($breakpoints, "xl") {
+ @media (min-width: map-get($breakpoints, "xl")) {
+ --font-size: 20px;
+ }
+ }
+ }
+
+ // Borders
+ --border-radius: 0.25rem;
+ --border-width: 1px;
+ --outline-width: 3px;
+
+ // Spacings
+ --spacing: 1rem;
+
+ // Spacings for typography elements
+ --typography-spacing-vertical: 1.5rem;
+
+ // Spacings for body > header, body > main, body > footer, section, article
+ --block-spacing-vertical: calc(var(--spacing) * 2);
+ --block-spacing-horizontal: var(--spacing);
+
+ @if ($enable-classes and $enable-grid) {
+ --grid-spacing-vertical: 0;
+ --grid-spacing-horizontal: var(--spacing);
+ }
+
+ // Spacings for form elements and button
+ --form-element-spacing-vertical: 0.75rem;
+ --form-element-spacing-horizontal: 1rem;
+
+ // Spacings for nav component
+ --nav-element-spacing-vertical: 1rem;
+ --nav-element-spacing-horizontal: 0.5rem;
+ --nav-link-spacing-vertical: 0.5rem;
+ --nav-link-spacing-horizontal: 0.5rem;
+
+ // Font weight for form labels & fieldsets legend
+ --form-label-font-weight: var(--font-weight);
+
+ // Transitions
+ --transition: 0.2s ease-in-out;
+
+ // Modal (<dialog>)
+ --modal-overlay-backdrop-filter: blur(0.25rem);
+}
+
+// Responsives spacings
+@if $enable-responsive-spacings {
+ // Sectioning
+ #{$semantic-root-element} > header,
+ #{$semantic-root-element} > main,
+ #{$semantic-root-element} > footer,
+ section {
+ @if map-get($breakpoints, "sm") {
+ @media (min-width: map-get($breakpoints, "sm")) {
+ --block-spacing-vertical: calc(var(--spacing) * 2.5);
+ }
+ }
+
+ @if map-get($breakpoints, "md") {
+ @media (min-width: map-get($breakpoints, "md")) {
+ --block-spacing-vertical: calc(var(--spacing) * 3);
+ }
+ }
+
+ @if map-get($breakpoints, "lg") {
+ @media (min-width: map-get($breakpoints, "lg")) {
+ --block-spacing-vertical: calc(var(--spacing) * 3.5);
+ }
+ }
+
+ @if map-get($breakpoints, "xl") {
+ @media (min-width: map-get($breakpoints, "xl")) {
+ --block-spacing-vertical: calc(var(--spacing) * 4);
+ }
+ }
+ }
+
+ // Card (<article>)
+ article {
+ @if map-get($breakpoints, "sm") {
+ @media (min-width: map-get($breakpoints, "sm")) {
+ --block-spacing-horizontal: calc(var(--spacing) * 1.25);
+ }
+ }
+
+ @if map-get($breakpoints, "md") {
+ @media (min-width: map-get($breakpoints, "md")) {
+ --block-spacing-horizontal: calc(var(--spacing) * 1.5);
+ }
+ }
+
+ @if map-get($breakpoints, "lg") {
+ @media (min-width: map-get($breakpoints, "lg")) {
+ --block-spacing-horizontal: calc(var(--spacing) * 1.75);
+ }
+ }
+
+ @if map-get($breakpoints, "xl") {
+ @media (min-width: map-get($breakpoints, "xl")) {
+ --block-spacing-horizontal: calc(var(--spacing) * 2);
+ }
+ }
+ }
+
+ // Modal
+ dialog > article {
+
+ --block-spacing-vertical: calc(var(--spacing) * 2);
+ --block-spacing-horizontal: var(--spacing);
+
+ @if map-get($breakpoints, "sm") {
+ @media (min-width: map-get($breakpoints, "sm")) {
+ --block-spacing-vertical: calc(var(--spacing) * 2.5);
+ --block-spacing-horizontal: calc(var(--spacing) * 1.25);
+ }
+ }
+
+ @if map-get($breakpoints, "md") {
+ @media (min-width: map-get($breakpoints, "md")) {
+ --block-spacing-vertical: calc(var(--spacing) * 3);
+ --block-spacing-horizontal: calc(var(--spacing) * 1.5);
+ }
+ }
+ }
+}
+
+// Link
+a {
+ --text-decoration: none;
+
+ // Secondary & Contrast
+ @if $enable-classes {
+ &.secondary,
+ &.contrast {
+ --text-decoration: underline;
+ }
+ }
+}
+
+// Small
+small {
+ --font-size: 0.875em;
+}
+
+// Headings
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ --font-weight: 700;
+}
+
+h1 {
+ --font-size: 2rem;
+ --typography-spacing-vertical: 3rem;
+}
+
+h2 {
+ --font-size: 1.75rem;
+ --typography-spacing-vertical: 2.625rem;
+}
+
+h3 {
+ --font-size: 1.5rem;
+ --typography-spacing-vertical: 2.25rem;
+}
+
+h4 {
+ --font-size: 1.25rem;
+ --typography-spacing-vertical: 1.874rem;
+}
+
+h5 {
+ --font-size: 1.125rem;
+ --typography-spacing-vertical: 1.6875rem;
+}
+
+// Forms elements
+[type="checkbox"],
+[type="radio"] {
+ --border-width: 2px;
+}
+
+[type="checkbox"][role="switch"] {
+ --border-width: 3px;
+}
+
+// Table
+thead,
+tfoot {
+ th,
+ td {
+ --border-width: 3px;
+ }
+}
+
+:not(thead, tfoot) > * > td {
+ --font-size: 0.875em;
+}
+
+// Code
+pre,
+code,
+kbd,
+samp {
+ --font-family: "Menlo", "Consolas", "Roboto Mono", "Ubuntu Monospace",
+ "Noto Mono", "Oxygen Mono", "Liberation Mono", monospace,
+ "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+}
+
+kbd {
+ --font-weight: bolder;
+}