diff options
Diffstat (limited to 'app/assets/stylesheets/themes')
| -rw-r--r-- | app/assets/stylesheets/themes/default.scss | 37 | ||||
| -rw-r--r-- | app/assets/stylesheets/themes/default/_colors.scss | 65 | ||||
| -rw-r--r-- | app/assets/stylesheets/themes/default/_dark.scss | 159 | ||||
| -rw-r--r-- | app/assets/stylesheets/themes/default/_light.scss | 159 | ||||
| -rw-r--r-- | app/assets/stylesheets/themes/default/_styles.scss | 247 | 
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; +} |