diff --git a/src/App.vue b/src/App.vue index dec28560a..5138a8b91 100644 --- a/src/App.vue +++ b/src/App.vue @@ -133,14 +133,14 @@ export default defineComponent({ position: absolute; width: 100vw; bottom: 5vh; - color: $white; + color: var(--white); padding: 0 1rem; h1 { font-weight: bold; font-size: 1.5rem; text-align: center; - color: $white; + color: var(--white); font-weight: 700 !important; font-size: 1.5rem; } diff --git a/src/components/home/contentAuth.vue b/src/components/home/contentAuth.vue index d68cdb43f..56252ffc6 100644 --- a/src/components/home/contentAuth.vue +++ b/src/components/home/contentAuth.vue @@ -166,7 +166,7 @@ export default { } .card { - background: $white; + background: var(--white); } } } @@ -195,7 +195,7 @@ export default { right: 1rem; z-index: 4500; // The modal has a z-index of 4000 - color: $grey-500; + color: var(--grey-500); transition: color $transition; @media screen and (max-width: $tablet) { diff --git a/src/components/home/contentLinkShare.vue b/src/components/home/contentLinkShare.vue index 7dff2fbb9..d0d708c91 100644 --- a/src/components/home/contentLinkShare.vue +++ b/src/components/home/contentLinkShare.vue @@ -65,11 +65,11 @@ export default { } .card { - background: $white; + background: var(--white); } .title { - text-shadow: 0 0 1rem $white; + text-shadow: 0 0 1rem var(--white); } } diff --git a/src/components/home/contentNoAuth.vue b/src/components/home/contentNoAuth.vue index b95739067..30204e5eb 100644 --- a/src/components/home/contentNoAuth.vue +++ b/src/components/home/contentNoAuth.vue @@ -68,7 +68,7 @@ export default { \ No newline at end of file diff --git a/src/components/misc/card.vue b/src/components/misc/card.vue index 8db04b3a6..bf6cc501d 100644 --- a/src/components/misc/card.vue +++ b/src/components/misc/card.vue @@ -57,22 +57,22 @@ export default { \ No newline at end of file diff --git a/src/components/misc/legal.vue b/src/components/misc/legal.vue index ff74921ac..c4e7c21ee 100644 --- a/src/components/misc/legal.vue +++ b/src/components/misc/legal.vue @@ -22,7 +22,7 @@ export default { .legal-links { margin-top: 1rem; text-align: right; - color: $grey-300; + color: var(--grey-300); font-size: 1rem; } \ No newline at end of file diff --git a/src/components/misc/shortcut.vue b/src/components/misc/shortcut.vue index 5d155db20..0afe177e1 100644 --- a/src/components/misc/shortcut.vue +++ b/src/components/misc/shortcut.vue @@ -27,8 +27,8 @@ export default { kbd { padding: .1rem .35rem; - border: 1px solid $grey-300; - background: $grey-100; + border: 1px solid var(--grey-300); + background: var(--grey-100); border-radius: 3px; font-size: .75rem; } diff --git a/src/components/notifications/notifications.vue b/src/components/notifications/notifications.vue index b67d8816a..51442b517 100644 --- a/src/components/notifications/notifications.vue +++ b/src/components/notifications/notifications.vue @@ -145,9 +145,9 @@ export default { width: .75rem; height: .75rem; - background: $primary; + background: var(--primary); border-radius: 100%; - border: 2px solid $white; + border: 2px solid var(--white); } .notifications-list { @@ -157,7 +157,7 @@ export default { max-height: 400px; overflow-y: auto; - background: $white; + background: var(--white); width: 350px; max-width: calc(100vw - 2rem); padding: .75rem .25rem; @@ -183,14 +183,14 @@ export default { transition: background-color $transition; &:hover { - background: $grey-100; + background: var(--grey-100); border-radius: $radius; } .read-indicator { width: .35rem; height: .35rem; - background: $primary; + background: var(--primary); border-radius: 100%; margin-left: .5rem; @@ -219,7 +219,7 @@ export default { } .created { - color: $grey-400; + color: var(--grey-400); } &:last-child { @@ -227,14 +227,14 @@ export default { } a { - color: $grey-800; + color: var(--grey-800); } } .nothing { text-align: center; padding: 1rem 0; - color: $grey-500; + color: var(--grey-500); .explainer { font-size: .75rem; diff --git a/src/components/quick-actions/quick-actions.vue b/src/components/quick-actions/quick-actions.vue index 93388d86b..204dd4ebe 100644 --- a/src/components/quick-actions/quick-actions.vue +++ b/src/components/quick-actions/quick-actions.vue @@ -490,11 +490,11 @@ export default { .results { text-align: left; width: 100%; - color: $grey-800; + color: var(--grey-800); .result { &-title { - background: $grey-50; + background: var(--grey-50); padding: .5rem; display: block; font-size: .75rem; @@ -516,12 +516,12 @@ export default { cursor: pointer; &:focus, &:hover { - background: $grey-50; + background: var(--grey-50); box-shadow: none !important; } &:active { - background: $grey-100; + background: var(--grey-100); } } } diff --git a/src/components/tasks/edit-task.vue b/src/components/tasks/edit-task.vue index d032fc94c..2969f7084 100644 --- a/src/components/tasks/edit-task.vue +++ b/src/components/tasks/edit-task.vue @@ -160,7 +160,7 @@ ul.assingees { a { float: right; - color: $red; + color: var(--danger); transition: all $transition; } } diff --git a/src/components/tasks/gantt-component.vue b/src/components/tasks/gantt-component.vue index 874977dc7..53e218a18 100644 --- a/src/components/tasks/gantt-component.vue +++ b/src/components/tasks/gantt-component.vue @@ -447,12 +447,12 @@ export default { \ No newline at end of file diff --git a/src/components/tasks/partials/priorityLabel.vue b/src/components/tasks/partials/priorityLabel.vue index 11e4d0175..0625412b1 100644 --- a/src/components/tasks/partials/priorityLabel.vue +++ b/src/components/tasks/partials/priorityLabel.vue @@ -54,7 +54,7 @@ export default { } span.high-priority { - color: $red; + color: var(--danger); width: auto !important; // To override the width set in tasks .icon { @@ -64,7 +64,7 @@ span.high-priority { } &.not-so-high { - color: $orange; + color: var(--warning); } } \ No newline at end of file diff --git a/src/components/tasks/partials/relatedTasks.vue b/src/components/tasks/partials/relatedTasks.vue index 3badac6cc..df247ceda 100644 --- a/src/components/tasks/partials/relatedTasks.vue +++ b/src/components/tasks/partials/relatedTasks.vue @@ -274,7 +274,7 @@ $remove-icon-width: 24px; } .different-list { - color: $grey-500; + color: var(--grey-500); width: auto; } @@ -312,16 +312,16 @@ $remove-icon-width: 24px; border: 2px solid transparent; a { - color: $text; + color: var(--text); transition: color ease $transition-duration; &:hover { - color: $grey-900; + color: var(--grey-900); } } .remove { - color: $red; + color: var(--danger); } } } diff --git a/src/components/tasks/partials/reminders.vue b/src/components/tasks/partials/reminders.vue index 9d2a629ff..45a0ceabb 100644 --- a/src/components/tasks/partials/reminders.vue +++ b/src/components/tasks/partials/reminders.vue @@ -112,7 +112,7 @@ export default { align-items: center; &.overdue :deep(.datepicker a.show) { - color: $red; + color: var(--danger); } &:last-child { @@ -120,7 +120,7 @@ export default { } a.remove { - color: $red; + color: var(--danger); padding-left: .5rem; } } diff --git a/src/components/tasks/partials/singleTaskInList.vue b/src/components/tasks/partials/singleTaskInList.vue index da679bcaa..9e955d5c8 100644 --- a/src/components/tasks/partials/singleTaskInList.vue +++ b/src/components/tasks/partials/singleTaskInList.vue @@ -227,7 +227,7 @@ export default { border: 2px solid transparent; &:hover { - background-color: $grey-100; + background-color: var(--grey-100); } .tasktext, @@ -239,13 +239,13 @@ export default { flex: 1 0 50%; .overdue { - color: $red; + color: var(--danger); } } .task-list { width: auto; - color: $grey-400; + color: var(--grey-400); font-size: .9rem; white-space: nowrap; } @@ -273,11 +273,11 @@ export default { } a { - color: $text; + color: var(--text); transition: color ease $transition-duration; &:hover { - color: $grey-900; + color: var(--grey-900); } } @@ -288,12 +288,12 @@ export default { transition: opacity $transition, color $transition; &:hover { - color: $orange; + color: var(--warning); } &.is-favorite { opacity: 1; - color: $orange; + color: var(--warning); } } @@ -324,16 +324,16 @@ export default { .tasktext.done { text-decoration: line-through; - color: $grey-500; + color: var(--grey-500); } span.parent-tasks { - color: $grey-500; + color: var(--grey-500); width: auto; } .remove { - color: $red; + color: var(--danger); } input[type="checkbox"] { @@ -351,8 +351,8 @@ export default { left: calc(50% - 1rem); width: 2rem; height: 2rem; - border-left-color: $grey-300; - border-bottom-color: $grey-300; + border-left-color: var(--grey-300); + border-bottom-color: var(--grey-300); } } \ No newline at end of file diff --git a/src/styles/components/labels.scss b/src/styles/components/labels.scss index ee06d3f2e..049702652 100644 --- a/src/styles/components/labels.scss +++ b/src/styles/components/labels.scss @@ -6,7 +6,7 @@ .tag { margin: .5rem 0 .5rem .5rem; - background: $grey-200; + background: var(--grey-200); // FIXME: only used in ListLabels.vue &.disabled { diff --git a/src/styles/components/task.scss b/src/styles/components/task.scss index 3db356444..212fd05f4 100644 --- a/src/styles/components/task.scss +++ b/src/styles/components/task.scss @@ -7,8 +7,8 @@ .modal-container .task-view { border-radius: $radius; padding: 1rem; - color: $text; - background-color: $light-background !important; + color: var(--text); + background-color: var(--light-background) !important; @media screen and (max-width: 800px) { border-radius: 0; diff --git a/src/styles/components/tooltip.scss b/src/styles/components/tooltip.scss index 20acf5792..a5b77b3d1 100644 --- a/src/styles/components/tooltip.scss +++ b/src/styles/components/tooltip.scss @@ -5,7 +5,7 @@ z-index: 10000; font-size: 0.8rem; text-align: center; - background: $dark; + background: var(--dark); color: white; border-radius: 5px; padding: 5px 10px 5px; @@ -28,7 +28,7 @@ height: 0; border-left: 5px solid transparent; border-right: 5px solid transparent; - border-top: 5px solid $dark; + border-top: 5px solid var(--dark); &.bottom { transform: rotate(180deg); diff --git a/src/styles/theme/background.scss b/src/styles/theme/background.scss index e57ef22ca..9766811ac 100644 --- a/src/styles/theme/background.scss +++ b/src/styles/theme/background.scss @@ -8,7 +8,7 @@ // FIXME: move to pagination component .pagination-link:not(.is-current) { - background: $light-background; + background: var(--light-background); } .box, diff --git a/src/styles/theme/content.scss b/src/styles/theme/content.scss index 4be780b15..08eadd1c3 100644 --- a/src/styles/theme/content.scss +++ b/src/styles/theme/content.scss @@ -6,7 +6,7 @@ } .table.has-actions { - border-top: 1px solid $grey-100; + border-top: 1px solid var(--grey-100); border-radius: 4px; overflow: hidden; diff --git a/src/styles/theme/navigation.scss b/src/styles/theme/navigation.scss index 894ef2e12..ef23d5f5e 100644 --- a/src/styles/theme/navigation.scss +++ b/src/styles/theme/navigation.scss @@ -6,14 +6,14 @@ z-index: 31; font-weight: bold; font-size: 2rem; - color: $grey-400; + color: var(--grey-400); line-height: 1; transition: all $transition; &:hover, &:focus { height: 1rem; - color: $grey-600; + color: var(--grey-600); } } @@ -31,7 +31,7 @@ &::after { display: block; content: ''; - border-top: 3px solid $grey-400; + border-top: 3px solid var(--grey-400); border-radius: $radius; transition: all $transition; } @@ -68,7 +68,7 @@ &:hover, &:focus { - color: $text; + color: var(--text); } } @@ -84,7 +84,7 @@ .menu-bottom-link { width: 100%; - color: $grey-300; + color: var(--grey-300); text-align: center; display: block; margin: 1rem 0; diff --git a/src/styles/theme/scrollbars.scss b/src/styles/theme/scrollbars.scss index 29d241067..c985376ee 100644 --- a/src/styles/theme/scrollbars.scss +++ b/src/styles/theme/scrollbars.scss @@ -1,7 +1,7 @@ $scrollbar-height: 8px; -$scrollbar-track-color: $grey-200; -$scrollbar-thumb-color: $grey-300; -$scrollbar-hover-color: $grey-500; +$scrollbar-track-color: var(--grey-200); +$scrollbar-thumb-color: var(--grey-300); +$scrollbar-hover-color: var(--grey-500); // Chrome ::-webkit-scrollbar { diff --git a/src/styles/theme/theme.scss b/src/styles/theme/theme.scss index b2549db73..0f5aeff47 100644 --- a/src/styles/theme/theme.scss +++ b/src/styles/theme/theme.scss @@ -6,7 +6,7 @@ } :focus { - box-shadow: 0 0 0 2px rgba($primary, 0.5); + box-shadow: 0 0 0 2px var(--primary-translucent); } :focus:not(:focus-visible) { @@ -15,11 +15,11 @@ :focus-visible, :-moz-focusring { - box-shadow: 0 0 0 2px rgba($primary, 0.5); + box-shadow: 0 0 0 2px var(--primary-translucent); } body { - background: $light-background; + background: var(--light-background); min-height: 100vh; } @@ -54,7 +54,7 @@ h6 { &::-moz-progress-bar, &::-webkit-progress-value { - background: $grey-500; + background: var(--grey-500); } @media screen and (max-width: $tablet) { @@ -103,11 +103,11 @@ button.table { } .icon:not(.has-text-success) { - color: $grey-300 !important; + color: var(--grey-300) !important; } &.has-text-danger .icon { - color: $danger !important; + color: var(--danger) !important; } &.is-disabled { @@ -165,6 +165,6 @@ button.table { } .box { - border: 1px solid $grey-200; + border: 1px solid var(--grey-200); box-shadow: $shadow-sm; } \ No newline at end of file diff --git a/src/styles/variables/colors.scss b/src/styles/variables/colors.scss index 09d04c1dd..fd6ca96e5 100644 --- a/src/styles/variables/colors.scss +++ b/src/styles/variables/colors.scss @@ -1,18 +1,96 @@ -$grey-50: #F9FAFB; -$grey-100: #f3f4f6; -$grey-200: #E5E7EB; -$grey-300: #D1D5DB; -$grey-400: #9CA3AF; -$grey-500: #6B7280; -$grey-600: #4B5563; -$grey-700: #374151; -$grey-800: #1F2937; -$grey-900: #111827; +:root { + + /* Vikunja colors as CSS custom properties */ + --grey-50: hsl(210, 20%, 98%); + --grey-100: hsl(220, 14.3%, 95.9%); + --grey-200: hsl(220, 13%, 91%); + --grey-300: hsl(216, 12.2%, 83.9%); + --grey-400: hsl(217.9, 10.6%, 64.9%); + --grey-500-hsl: 220, 8.9%, 46.1%; + --grey-500: hsla(var(--grey-500-hsl), 1); + --grey-600: hsl(215, 13.8%, 34.1%); + --grey-700: hsl(216.9, 19.1%, 26.7%); + --grey-800: hsl(215, 27.9%, 16.9%); + --grey-900: hsl(220.9, 39.3%, 11%); + + --light-background: var(--grey-100); + --scheme-main: var(--white); + +// Vikunja overrides of Bulma defaults + // --black-bis: #121212; + // --black-ter: #242424; + --grey-darker: var(--grey-700); + --grey-dark: var(--grey-800); + --grey: var(--grey-500); + --grey-light: var(--grey-300); + --grey-lighter: var(--grey-200); + --grey-lightest: var(--grey-100); + //--white-ter: whitesmoke; + //--white-bis: #fafafa; + + --white-h: 0deg; + --white-s: 0%; + --white-l: 100%; + --white-a: 1; + --white: hsla(var(--white-h), var(--white-s), var(--white-l), var(--white-a)); + --white-translucent: hsla(var(--white-h), var(--white-s), var(--white-l), 0.75); + + --black-h: 0deg; + --black-s: 0%; + --black-l: 4%; + --black-a: 1; + --black: hsla(var(--black-h), var(--black-s), var(--black-l), var(--black-a)); + + //$warning/$orange: #ff851b or hsl(27.9, 100%, 55.3%) + --warning-h: 27.9deg !important; + --warning-s: 100% !important; + --warning-l: 55.3% !important; + --warning-a: 1 !important; + --warning: hsla(var(--warning-h), var(--warning-s), var(--warning-l), var(--warning-a)); + //$success/$green is #00db60 or hsl(146.3, 100%, 42.9%) + --success-h: 146.3deg !important; + --success-s: 100% !important; + --success-l: 42.9% !important; + --success-a: 1 !important; + --success: hsla(var(--success-h), var(--success-s), var(--success-l), var(--success-a)); + //$danger/$red is #ff4136 or hsl(3.3, 100%, 60.6%) + --danger-h: 3.3deg !important; + --danger-s: 100% !important; + --danger-l: 60.6% !important; + --danger-a: 1 !important; + --danger: hsla(var(--danger-h), var(--danger-s), var(--danger-l), var(--danger-a)); + //var(--primary)/$blue is #1973ff or hsl(216.5, 100%, 54.9%) + --primary-h: 216.5deg !important; + --primary-s: 100% !important; + --primary-l: 54.9% !important; + --primary-a: 1 !important; + --primary: hsla(var(--primary-h), var(--primary-s), var(--primary-l), var(--primary-a)); + + --primary-translucent: hsla(var(--primary-h), var(--primary-s), var(--primary-l), 0.5); +} + +@media (prefers-color-scheme: dark) { + :root { + /* Light mode colours in reverse order for dark mode */ + --grey-900: hsl(210, 20%, 98%); + --grey-800: hsl(220, 14.3%, 95.9%); + --grey-700: hsl(220, 13%, 91%); + --grey-600: hsl(216, 12.2%, 83.9%); + --grey-500-hsl: 217.9, 10.6%, 64.9%; + --grey-500: hsla(var(--grey-500-hsl), 1); + --grey-400: hsl(220, 8.9%, 46.1%); + --grey-300: hsl(215, 13.8%, 34.1%); + --grey-200: hsl(216.9, 19.1%, 26.7%); + --grey-100: hsl(215, 27.9%, 16.9%); + --grey-50: hsl(220.9, 39.3%, 11%); + + --white-l: 4% !important; + --black-l: 100% !important; + + --text: var(--grey-800) !important; + --text-invert: #000 !important; + --text-light: var(--grey-300) !important; + --text-strong: var(--grey-900) !important; + } +} -// Bulma defaults -$grey-dark: $grey-800; -$grey-darker: $grey-700; -$grey: $grey-500; -$grey-light: $grey-300; -$grey-lighter: $grey-200; -$grey-lightest: $grey-100; diff --git a/src/styles/variables/shadows.scss b/src/styles/variables/shadows.scss index 5782efd99..fdbf4b237 100644 --- a/src/styles/variables/shadows.scss +++ b/src/styles/variables/shadows.scss @@ -1,5 +1,9 @@ -$shadow-xs: 0 1px 3px rgba($grey-500, .12), 0 1px 2px rgba($grey-500, .24); -$shadow-sm: 0 3px 6px rgba($grey-500, .12), 0 2px 4px rgba($grey-500, .10); -$shadow-md: 0 10px 20px rgba($grey-500, .12), 0 3px 6px rgba($grey-500, .08); -$shadow-lg: 0 15px 25px rgba($grey-500, .12), 0 5px 10px rgba($grey-500, .05); -$shadow-xl: 0 20px 40px rgba($grey-500, .2); +$shadow-xs: 0 1px 3px hsla(var(--grey-500-hsl),.12), + 0 1px 2px hsla(var(--grey-500-hsl), .24); +$shadow-sm: 0 3px 6px hsla(var(--grey-500-hsl), .12), + 0 2px 4px hsla(var(--grey-500-hsl), .10); +$shadow-md: 0 10px 20px hsla(var(--grey-500-hsl), .12), + 0 3px 6px hsla(var(--grey-500-hsl), .08); +$shadow-lg: 0 15px 25px hsla(var(--grey-500-hsl), .12), + 0 5px 10px hsla(var(--grey-500-hsl), .05); +$shadow-xl: 0 20px 40px hsla(var(--grey-500-hsl), .2); diff --git a/src/styles/variables/variables.scss b/src/styles/variables/variables.scss index a699d9cf4..8d2e61cd3 100644 --- a/src/styles/variables/variables.scss +++ b/src/styles/variables/variables.scss @@ -1,12 +1,12 @@ -$info-invert: $white; +$info-invert: #fff; $family-sans-serif: 'Open Sans', Helvetica, Arial, sans-serif; $vikunja-font: 'Quicksand', sans-serif; $thickness: 1px; -$pagination-current-border: $primary; -$navbar-item-active-color: $primary; +$pagination-current-border: var(--primary); +$navbar-item-active-color: var(--primary); $dropdown-content-shadow: none; $dropdown-item-hover-background-color: var(--grey-100); diff --git a/src/views/list/ShowList.vue b/src/views/list/ShowList.vue index cca9b3d52..5834f6b26 100644 --- a/src/views/list/ShowList.vue +++ b/src/views/list/ShowList.vue @@ -158,7 +158,7 @@ export default { } .switch-view { - background: $white; + background: var(--white); display: inline-flex; border-radius: $radius; font-size: .75rem; @@ -180,17 +180,17 @@ export default { &.is-active, &:hover { - color: $white; + color: var(--white); } &.is-active { - background: $primary; + background: var(--primary); font-weight: bold; box-shadow: $shadow-xs; } &:hover { - background: $primary; + background: var(--primary); } } } diff --git a/src/views/list/settings/background.vue b/src/views/list/settings/background.vue index bb3ead15d..197fa0013 100644 --- a/src/views/list/settings/background.vue +++ b/src/views/list/settings/background.vue @@ -167,7 +167,7 @@ export default { font-size: .8rem; a { - color: $grey-800; + color: var(--grey-800); } } @@ -224,7 +224,7 @@ export default { background: rgba(0, 0, 0, 0.5); font-size: .75rem; font-weight: bold; - color: $white; + color: var(--white); transition: opacity $transition; } diff --git a/src/views/list/views/Kanban.vue b/src/views/list/views/Kanban.vue index 1aa1a3c89..c1271a38b 100644 --- a/src/views/list/views/Kanban.vue +++ b/src/views/list/views/Kanban.vue @@ -593,7 +593,7 @@ export default { \ No newline at end of file diff --git a/src/views/teams/ListTeams.vue b/src/views/teams/ListTeams.vue index 2fc6f87e7..503a8b3d1 100644 --- a/src/views/teams/ListTeams.vue +++ b/src/views/teams/ListTeams.vue @@ -68,7 +68,7 @@ ul.teams { transition: background-color $transition; &:hover { - background: $grey-100; + background: var(--grey-100); } } } diff --git a/src/views/user/Settings.vue b/src/views/user/Settings.vue index f2612e575..aba2931d5 100644 --- a/src/views/user/Settings.vue +++ b/src/views/user/Settings.vue @@ -88,13 +88,13 @@ export default { a { display: block; padding: .5rem; - color: $dark; + color: var(--dark); width: 100%; border-left: 3px solid transparent; &:hover, &.router-link-active { - background: $white; - border-color: $primary; + background: var(--white); + border-color: var(--primary); } } } diff --git a/src/views/user/settings/Avatar.vue b/src/views/user/settings/Avatar.vue index 72e097535..2f9b74d61 100644 --- a/src/views/user/settings/Avatar.vue +++ b/src/views/user/settings/Avatar.vue @@ -149,6 +149,6 @@ export default { } .vue-advanced-cropper__background { - background: $white; + background: var(--white); }