feat(ui): set and document global dark colors (theme-dark)

This commit is contained in:
upsiflu 2024-12-16 15:04:01 +01:00
parent 24c3eec56a
commit 973464a07a
3 changed files with 450 additions and 168 deletions

View File

@ -22,9 +22,12 @@
// Blue
--fw-blue-010: #fdfdff;
--fw-blue-100: #65a2bb;
--fw-blue-400: #067cae;
--fw-blue-500: #05719e;
--fw-blue-600: #00638c;
--fw-blue-400: #0a85ae;
// was --fw-blue-400: #067cae;
--fw-blue-500: #05769d;
// was --fw-blue-500: #05719e;
--fw-blue-600: #00658c;
// was --fw-blue-600: #00638c;
--fw-blue-700: #004f70;
--fw-blue-800: #003f5a;
--fw-blue-900: #1f1f2d;
@ -174,9 +177,7 @@
}
:root{
@include light-theme {
--fw-page-bg-color: var(--fw-beige-100);
.default {
.default, body {
--color: var(--fw-gray-900);
--background-color: var(--fw-beige-100);
--border-color:var(--fw-gray-300);
@ -185,11 +186,11 @@
--hover-background-color:var(--fw-beige-200);
--hover-border-color:var(--fw-gray-800);
--active-color:var(--fw-red-40);
--active-color:var(--fw-red-010);
--active-background-color:var(--fw-beige-400);
--active-border-color:var(--fw-gray-600);
--pressed-color:var(--fw-red-40);
--pressed-color:var(--fw-red-010);
--pressed-background-color:var(--fw-gray-900);
--disabled-color:var(--fw-gray-500);
@ -202,31 +203,6 @@
}
}
.primary {
--color: var(--fw-blue-010);
--background-color:var(--fw-blue-400);
--border-color:var(--fw-blue-010);
--hover-color: var(--fw-blue-010);
--hover-background-color:var(--fw-blue-500);
--active-color: var(--fw-blue-010);
--active-background-color:var(--fw-blue-600);
--pressed-color:var(--fw-blue-010);
--pressed-background-color:var(--fw-blue-800);
--disabled-color:var(--fw-blue-900);
--disabled-background-color:var(--fw-blue-100);
--disabled-border-color:var(--fw-blue-100);
&.raised {
--background-color:var(--fw-blue-500);
--hover-background-color:var(--fw-blue-600);
--active-background-color:var(--fw-blue-700);
}
}
.secondary, button {
--color: var(--fw-gray-700);
--background-color: var(--fw-gray-200);
@ -255,6 +231,31 @@
}
}
.primary {
--color: var(--fw-blue-010);
--background-color:var(--fw-blue-400);
--border-color:var(--fw-blue-010);
--hover-color: var(--fw-blue-010);
--hover-background-color:var(--fw-blue-500);
--active-color: var(--fw-blue-010);
--active-background-color:var(--fw-blue-600);
--pressed-color:var(--fw-blue-010);
--pressed-background-color:var(--fw-blue-800);
--disabled-color:var(--fw-blue-900);
--disabled-background-color:color-mix(in oklab, var(--fw-blue-100) 20%, var(--fw-blue-400));
--disabled-border-color:transparent;
&.raised {
--background-color:var(--fw-blue-500);
--hover-background-color:var(--fw-blue-600);
--active-background-color:var(--fw-blue-700);
}
}
.destructive {
--color: var(--fw-red-010);
--background-color: var(--fw-red-500);
@ -276,7 +277,7 @@
.blue {
--color: var(--fw-blue-900);
--background-color: var(--fw-pastel-blue-1);
.raised, button {
&.raised, .action>button {
--background-color: var(--fw-pastel-blue-2);
--hover-background-color: var(--fw-pastel-blue-3);
--active-background-color: var(--fw-pastel-blue-4);
@ -289,109 +290,222 @@
.red {
--color: var(--fw-red-900);
--background-color: var(--fw-pastel-red-2);
&.raised, .action>button {
--background-color: var(--fw-pastel-red-2);
--hover-background-color: var(--fw-pastel-red-3);
--active-background-color: var(--fw-pastel-red-4);
--disabled-color: var(--fw-gray-700);
--disabled-border-color: var(--fw-gray-400);
--disabled-background-color: transparent;
}
}
.purple {
--color: var(--fw-gray-970);
--background-color: var(--fw-pastel-purple-1);
&.raised, .action>button {
--background-color: var(--fw-pastel-purple-2);
--hover-background-color: var(--fw-pastel-purple-3);
--active-background-color: var(--fw-pastel-purple-4);
--disabled-color: var(--fw-gray-700);
--disabled-border-color: var(--fw-gray-400);
--disabled-background-color: transparent;
}
}
.green {
--color: var(--fw-gray-900);
--background-color: var(--fw-pastel-green-1);
&.raised, .action>button {
--background-color: var(--fw-pastel-green-2);
--hover-background-color: var(--fw-pastel-green-3);
--active-background-color: var(--fw-pastel-green-4);
--disabled-color: var(--fw-gray-700);
--disabled-border-color: var(--fw-gray-400);
--disabled-background-color: transparent;
}
}
.yellow {
--color: var(--fw-gray-900);
--background-color: var(--fw-pastel-yellow-1);
&.raised, .action>button {
--background-color: var(--fw-pastel-yellow-2);
--hover-background-color: var(--fw-pastel-yellow-3);
--active-background-color: var(--fw-pastel-yellow-4);
--disabled-color: var(--fw-gray-700);
--disabled-border-color: var(--fw-gray-400);
--disabled-background-color: transparent;
}
}
}
@include dark-theme {
.is-primary {
--fw-bg-color: var(--fw-blue-600);
--fw-text-color: var(--fw-blue-010);
.default, body {
--color: var(--fw-beige-100);
--background-color: var(--fw-gray-970);
--border-color:var(--fw-gray-700);
&.is-colored {
&[disabled] {
--fw-bg-color: var(--fw-blue-100) !important;
--fw-text-color: var(--fw-blue-900) !important;
}
--hover-color:var(--fw-beige-400);
--hover-background-color:var(--fw-gray-950);
--hover-border-color:var(--fw-beige-400);
&.is-hovered,
&:hover {
--fw-bg-color: var(--fw-blue-700);
}
--active-color:var(--fw-gray-600);
--active-background-color:var(--fw-beige-400);
--active-border-color:var(--fw-gray-600);
&.is-active,
&.active,
&:active {
--fw-bg-color: var(--fw-blue-800);
&.router-link-exact-active {
--fw-bg-color: var(--fw-blue-900);
}
}
--pressed-color:var(--fw-red-010);
--pressed-background-color:var(--fw-gray-900);
--disabled-color:var(--fw-gray-500);
--disabled-background-color:var(--fw-gray-950);
--disabled-border-color:var(--fw-gray-950);
&.raised{
--background-color:var(--fw-gray-800);
--border-color:var(--fw-gray-600);
}
}
.is-secondary {
--fw-bg-color: var(--fw-gray-700);
--fw-text-color: var(--fw-red-010);
.secondary, button {
--color: var(--fw-gray-300);
--background-color: var(--fw-gray-850);
--border-color:var(--fw-gray-600);
&.is-colored {
&.is-hovered,
&:hover {
--fw-bg-color: var(--fw-gray-950);
}
--hover-color:var(--fw-gray-200);
--hover-background-color:var(--fw-gray-800);
--hover-border-color:var(--fw-gray-300);
&.is-active,
&.active,
&:active {
--fw-bg-color: var(--fw-gray-900);
&.router-link-exact-active {
--fw-bg-color: var(--fw-gray-850);
}
}
}
&[disabled] {
--fw-bg-color: var(--fw-gray-600)
--fw-text-color: var(--fw-gray-950)
--active-color:var(--fw-gray-300);
--active-background-color:var(--fw-gray-970);
--active-border-color:var(--fw-gray-400);
--pressed-color:var(--fw-beige-200);
--pressed-background-color:var(--fw-gray-900);
--disabled-color:var(--fw-gray-500);
--disabled-background-color:color-mix(in oklab, var(--fw-gray-900) 20%, var(--fw-gray-950));
--disabled-border-color:transparent;
&.raised {
--color: var(--fw-gray-200);
--background-color:var(--fw-gray-700);
--disabled-background-color:color-mix(in oklab, var(--fw-gray-800) 80%, var(--fw-gray-700));
--border-color:var(--fw-gray-500);
--hover-background-color:color-mix(in oklab, var(--fw-gray-600) 20%, var(--fw-gray-700));
--active-color:var(--fw-gray-400);
--active-background-color:var(--fw-gray-900);
}
}
.is-destructive {
--fw-bg-color: var(--fw-red-600);
--fw-text-color: var(--fw-red-010);
.primary {
--color: var(--fw-blue-010);
--background-color:var(--fw-blue-600);
--border-color:var(--fw-blue-010);
&.is-colored {
&[disabled] {
--fw-bg-color: var(--fw-red-100) !important;
--fw-text-color: var(--fw-red-900) !important;
}
--hover-color: var(--fw-blue-010);
--hover-background-color:var(--fw-blue-500);
&.is-hovered,
&:hover {
--fw-bg-color: var(--fw-red-700);
}
--active-color: var(--fw-blue-010);
--active-background-color:var(--fw-blue-800);
&.is-active,
&.active,
&:active {
--fw-bg-color: var(--fw-red-800);
}
--pressed-color:var(--fw-blue-010);
--pressed-background-color:var(--fw-blue-700);
--disabled-color:color-mix(in oklab, var(--fw-blue-010) 10%, var(--fw-blue-100));
--disabled-background-color:color-mix(in oklab, var(--fw-blue-700) 50%, var(--fw-blue-600));
--disabled-border-color:transparent;
&.raised {
--background-color:var(--fw-blue-500);
--hover-background-color:var(--fw-blue-400);
--active-background-color:var(--fw-blue-900);
--disabled-background-color:color-mix(in oklab, var(--fw-blue-500) 20%, var(--fw-blue-600));
}
}
.destructive {
--color: var(--fw-red-010);
--background-color: var(--fw-red-500);
--border-color:var(--fw-red-500);
--hover-color:var(--fw-gray-100);
--hover-background-color:var(--fw-red-600);
--hover-border-color:var(--fw-red-600);
--active-color:var(--fw-gray-100);
--active-background-color:var(--fw-red-700);
--active-border-color:var(--fw-red-700);
--disabled-color:var(--fw-gray-500);
--disabled-background-color:var(--fw-gray-100);
--disabled-border-color:var(--fw-gray-100);
}
.blue {
--color: var(--fw-blue-900);
--background-color: var(--fw-pastel-blue-1);
&.raised, .action>button {
--background-color: var(--fw-pastel-blue-2);
--hover-background-color: var(--fw-pastel-blue-3);
--active-background-color: var(--fw-pastel-blue-4);
--disabled-color: var(--fw-gray-700);
--disabled-border-color: var(--fw-gray-400);
--disabled-background-color: transparent;
}
}
.red {
--color: var(--fw-red-900);
--background-color: var(--fw-pastel-red-2);
&.raised, .action>button {
--background-color: var(--fw-pastel-red-2);
--hover-background-color: var(--fw-pastel-red-3);
--active-background-color: var(--fw-pastel-red-4);
--disabled-color: var(--fw-gray-700);
--disabled-border-color: var(--fw-gray-400);
--disabled-background-color: transparent;
}
}
.purple {
--color: var(--fw-gray-970);
--background-color: var(--fw-pastel-purple-1);
&.raised, .action>button {
--background-color: var(--fw-pastel-purple-2);
--hover-background-color: var(--fw-pastel-purple-3);
--active-background-color: var(--fw-pastel-purple-4);
--disabled-color: var(--fw-gray-700);
--disabled-border-color: var(--fw-gray-400);
--disabled-background-color: transparent;
}
}
.green {
--color: var(--fw-gray-900);
--background-color: var(--fw-pastel-green-1);
&.raised, .action>button {
--background-color: var(--fw-pastel-green-2);
--hover-background-color: var(--fw-pastel-green-3);
--active-background-color: var(--fw-pastel-green-4);
--disabled-color: var(--fw-gray-700);
--disabled-border-color: var(--fw-gray-400);
--disabled-background-color: transparent;
}
}
.yellow {
--color: var(--fw-gray-900);
--background-color: var(--fw-pastel-yellow-1);
&.raised, .action>button {
--background-color: var(--fw-pastel-yellow-2);
--hover-background-color: var(--fw-pastel-yellow-3);
--active-background-color: var(--fw-pastel-yellow-4);
--disabled-color: var(--fw-gray-700);
--disabled-border-color: var(--fw-gray-400);
--disabled-background-color: transparent;
}
}
}
}
.funkwhale {
@each $pastel in ("blue", "red", "green", "purple", "yellow") {
&.is-#{$pastel} {
--fw-pastel-1: var(--fw-pastel-#{$pastel}-1);
--fw-pastel-2: var(--fw-pastel-#{$pastel}-2);
--fw-pastel-3: var(--fw-pastel-#{$pastel}-3);
--fw-pastel-4: var(--fw-pastel-#{$pastel}-4);
}
}
}

View File

@ -3,10 +3,10 @@ $font-main: "Lato", sans-serif;
@mixin theme($isDark) {
$root-selectors: ();
/* Satisfy both vitepress (docs) and funkwhale (front) convention */
$root-element: ":is(body.theme-dark, html.dark>body:not(.theme-light))";
$root-element: ":is(body.theme-dark, html.dark>body:not(.theme-light), .force-dark-theme)";
@if $isDark == false {
$root-element: ":is(body.theme-light, html:not(.dark)>body:not(.theme-dark))";
$root-element: ":is(body.theme-light, html:not(.dark)>body:not(.theme-dark), .force-light-theme)";
}
// If we call `@include dark-theme {}` at the root of the file

View File

@ -53,39 +53,118 @@ import { color } from "~/composables/colors.ts";
## Base colors
Keep most of the screen neutral. Secondary surfaces indicate actionability. Use them sparingly. Primary and destructive surfaces immediately catch the eye. Use them only once or twice per screen.
### Neutral
<div :class="$style.swatch" v-bind="color('default solid')" />
<div :class="$style.swatch" v-bind="color('default solid interactive')" />
<div :class="$style.swatch" v-bind="color('default solid raised')" />
<div :class="$style.swatch" v-bind="color('default solid interactive')" />
Use neutral colors for non-interactive surfaces
<Layout flex>
<div class="force-dark-theme">
<div v-bind="color('default solid')">
<div :class="$style.swatch" v-bind="color('default solid')" />
<div :class="[$style.swatch, $style.deemphasized]" v-bind="color('default solid interactive')" />
</div><div v-bind="color('default solid raised')">
<div :class="$style.swatch" v-bind="color('default solid raised')" />
<div :class="[$style.swatch, $style.deemphasized]" v-bind="color('default solid raised interactive')" />
</div>
</div>
<div class="force-light-theme">
<div v-bind="color('default solid')">
<div :class="$style.swatch" v-bind="color('default solid')" />
<div :class="[$style.swatch, $style.deemphasized]" v-bind="color('default solid interactive')" />
</div><div v-bind="color('default solid raised')">
<div :class="$style.swatch" v-bind="color('default solid raised')" />
<div :class="[$style.swatch, $style.deemphasized]" v-bind="color('default solid raised interactive')" />
</div>
</div>
</Layout>
### Color
Primary
#### Primary
<div :class="$style.swatch" v-bind="color('primary solid')" />
<div :class="$style.swatch" v-bind="color('primary solid interactive')" />
<div :class="$style.swatch" v-bind="color('primary solid raised')" />
<div :class="$style.swatch" v-bind="color('primary solid interactive')" />
Only use for at most one call-to-action on a screen
Secondary
<Layout flex>
<div class="force-dark-theme">
<div v-bind="color('default solid')">
<div :class="[$style.swatch, $style.deemphasized]" v-bind="color('primary solid')" />
<div :class="[$style.swatch]" v-bind="color('primary solid interactive')" />
</div><div v-bind="color('default solid raised')">
<div :class="[$style.swatch, $style.deemphasized]" v-bind="color('primary solid raised')" />
<div :class="[$style.swatch]" v-bind="color('primary solid raised interactive')" />
</div>
</div>
<div :class="$style.swatch" v-bind="color('secondary solid')" />
<div :class="$style.swatch" v-bind="color('secondary solid interactive')" />
<div :class="$style.swatch" v-bind="color('secondary solid raised')" />
<div :class="$style.swatch" v-bind="color('secondary solid interactive')" />
<div class="force-light-theme">
<div v-bind="color('default solid')">
<div :class="[$style.swatch, $style.deemphasized]" v-bind="color('primary solid')" />
<div :class="[$style.swatch]" v-bind="color('primary solid interactive')" />
</div><div v-bind="color('default solid raised')">
<div :class="[$style.swatch, $style.deemphasized]" v-bind="color('primary solid raised')" />
<div :class="[$style.swatch]" v-bind="color('primary solid raised interactive')" />
</div>
</div>
</Layout>
Destructive
#### Secondary
<div :class="$style.swatch" v-bind="color('destructive solid')" />
<div :class="$style.swatch" v-bind="color('destructive solid interactive')" />
<div :class="$style.swatch" v-bind="color('destructive solid raised')" />
<div :class="$style.swatch" v-bind="color('destructive solid interactive')" />
Use for interactive items and colatilv surfaces such as menus and modals
<Layout flex>
<div class="force-dark-theme">
<div v-bind="color('default solid')">
<div :class="$style.swatch" v-bind="color('secondary solid')" />
<div :class="[$style.swatch]" v-bind="color('secondary solid interactive')" />
</div><div v-bind="color('default solid raised')">
<div :class="$style.swatch" v-bind="color('secondary solid raised')" />
<div :class="[$style.swatch]" v-bind="color('secondary solid raised interactive')" />
</div>
</div>
<div class="force-light-theme">
<div v-bind="color('default solid')">
<div :class="$style.swatch" v-bind="color('secondary solid')" />
<div :class="[$style.swatch]" v-bind="color('secondary solid interactive')" />
</div><div v-bind="color('default solid raised')">
<div :class="$style.swatch" v-bind="color('secondary solid raised')" />
<div :class="[$style.swatch]" v-bind="color('secondary solid raised interactive')" />
</div>
</div>
</Layout>
#### Destructive
Use for dangerous actions
<Layout flex>
<div class="force-dark-theme">
<div v-bind="color('default solid')">
<div :class="[$style.swatch, $style.deemphasized]" v-bind="color('destructive solid')" />
<div :class="[$style.swatch]" v-bind="color('destructive solid interactive')" />
</div><div v-bind="color('default solid raised')">
<div :class="[$style.swatch, $style.deemphasized]" v-bind="color('destructive solid raised')" />
<div :class="[$style.swatch]" v-bind="color('destructive solid raised interactive')" />
</div>
</div>
<div class="force-light-theme">
<div v-bind="color('default solid')">
<div :class="[$style.swatch, $style.deemphasized]" v-bind="color('destructive solid')" />
<div :class="[$style.swatch]" v-bind="color('destructive solid interactive')" />
</div><div v-bind="color('default solid raised')">
<div :class="[$style.swatch, $style.deemphasized]" v-bind="color('destructive solid raised')" />
<div :class="[$style.swatch]" v-bind="color('destructive solid raised interactive')" />
</div>
</div>
</Layout>
### Pastel
Blue, Red, Purple, Green, Yellow
Use `Blue`, `Red`, `Purple`, `Green`, `Yellow` for user-defined tags and for friendly messages such as
Alerts
<div :class="$style.swatch" v-bind="color('blue solid interactive')" />
<div :class="$style.swatch" v-bind="color('red solid interactive')" />
@ -93,58 +172,143 @@ Blue, Red, Purple, Green, Yellow
<div :class="$style.swatch" v-bind="color('green solid interactive')" />
<div :class="$style.swatch" v-bind="color('yellow solid interactive')" />
---
### Variant
Solid (default), Ghost, Outline
You can de-emphasize interactive elements by hiding their background and/or outline.
`Solid` (default), `Ghost`, `Outline`:
<Button round shadow icon="bi-x" solid />
<div :class="$style.swatch" v-bind="color('solid raised')">
<Button round icon="bi-x" ghost />
<Spacer />
<Button round icon="bi-x" outline />
<Button round icon="bi-x" ghost />
<Spacer />
<Button round icon="bi-x" outline />
</div>
<br/>
<Button round shadow icon="bi-x" primary solid />
<div :class="$style.swatch" v-bind="color('primary solid')">
<Button round icon="bi-x" primary ghost />
<Spacer />
<Button round icon="bi-x" primary outline />
</div>
---
<div :class="$style.swatch" v-bind="color('primary solid')">
<Button round icon="bi-x" primary ghost />
<Spacer />
<Button round icon="bi-x" primary outline />
</div>
### Interactive and/or Raised
<div v-bind="color('default solid')" style="display:inline-flex;">
<div :class="$style.swatch" v-bind="color('solid')" />
<div :class="$style.swatch" v-bind="color('solid interactive')" />
Use raised surfaces sparingly, about ¼ of the screen. Only use raised surfaces to highlight one area of a component over others. Good examples are `aside`s such as the sidebar or info-boxes.
Space out interactive surfaces.
<Layout>
<div class="force-light-theme">
<Layout flex>
<div>
<div v-bind="color('default solid')">
<div :class="[$style.swatch]" v-bind="color('solid')" />
<div :class="[$style.swatch]" v-bind="color('solid interactive')" />
<div :class="[$style.swatch]" v-bind="color('solid interactive')" disabled/>
<div :class="[$style.swatch]" v-bind="color('solid interactive')" aria-pressed="true"/>
</div>
<div v-bind="color('secondary solid')">
<div :class="[$style.swatch]" v-bind="color('solid')" />
<div :class="[$style.swatch]" v-bind="color('solid interactive')" />
<div :class="[$style.swatch]" v-bind="color('solid interactive')" disabled/>
<div :class="[$style.swatch]" v-bind="color('solid interactive')" aria-pressed="true"/>
</div>
<div v-bind="color('primary solid')">
<div :class="[$style.swatch]" v-bind="color('solid')" />
<div :class="[$style.swatch]" v-bind="color('solid interactive')" />
<div :class="[$style.swatch]" v-bind="color('solid interactive')" disabled/>
<div :class="[$style.swatch]" v-bind="color('solid interactive')" aria-pressed="true"/>
</div>
</div><div>
<div v-bind="color('default raised solid')">
<div :class="[$style.swatch]" v-bind="color('solid raised')" />
<div :class="[$style.swatch]" v-bind="color('solid interactive raised')" />
<div :class="[$style.swatch]" v-bind="color('solid interactive raised')" disabled/>
<div :class="[$style.swatch]" v-bind="color('solid interactive raised')" aria-pressed="true"/>
</div>
<div v-bind="color('secondary raised solid')">
<div :class="[$style.swatch]" v-bind="color('solid raised')" />
<div :class="[$style.swatch]" v-bind="color('solid interactive raised')" />
<div :class="[$style.swatch]" v-bind="color('solid interactive raised')" disabled/>
<div :class="[$style.swatch]" v-bind="color('solid interactive raised')" aria-pressed="true"/>
</div>
<div v-bind="color('primary raised solid')">
<div :class="[$style.swatch]" v-bind="color('solid raised')" />
<div :class="[$style.swatch]" v-bind="color('solid interactive raised')" />
<div :class="[$style.swatch]" v-bind="color('solid interactive raised')" disabled/>
<div :class="[$style.swatch]" v-bind="color('solid interactive raised')" aria-pressed="true"/>
</div>
</div>
</Layout>
</div>
<div v-bind="color('secondary solid')" style="display:inline-flex;">
<div :class="$style.swatch" v-bind="color('solid')" />
<div :class="$style.swatch" v-bind="color('solid interactive')" />
</div>
<div v-bind="color('primary solid')" style="display:inline-flex;">
<div :class="$style.swatch" v-bind="color('solid')" />
<div :class="$style.swatch" v-bind="color('solid interactive')" />
</div>
<br/>
<div v-bind="color('default raised solid')" style="display:inline-flex;">
<div :class="$style.swatch" v-bind="color('solid raised')" />
<div :class="$style.swatch" v-bind="color('solid interactive raised')" />
</div>
<div v-bind="color('secondary raised solid')" style="display:inline-flex;">
<div :class="$style.swatch" v-bind="color('solid raised')" />
<div :class="$style.swatch" v-bind="color('solid interactive raised')" />
</div>
<div v-bind="color('primary raised solid')" style="display:inline-flex;">
<div :class="$style.swatch" v-bind="color('solid raised')" />
<div :class="$style.swatch" v-bind="color('solid interactive raised')" />
<div class="force-dark-theme">
<Layout flex>
<div>
<div v-bind="color('default solid')">
<div :class="[$style.swatch]" v-bind="color('solid')" />
<div :class="[$style.swatch]" v-bind="color('solid interactive')" />
<div :class="[$style.swatch]" v-bind="color('solid interactive')" disabled/>
<div :class="[$style.swatch]" v-bind="color('solid interactive')" aria-pressed="true"/>
</div>
<div v-bind="color('secondary solid')">
<div :class="[$style.swatch]" v-bind="color('solid')" />
<div :class="[$style.swatch]" v-bind="color('solid interactive')" />
<div :class="[$style.swatch]" v-bind="color('solid interactive')" disabled/>
<div :class="[$style.swatch]" v-bind="color('solid interactive')" aria-pressed="true"/>
</div>
<div v-bind="color('primary solid')">
<div :class="[$style.swatch]" v-bind="color('solid')" />
<div :class="[$style.swatch]" v-bind="color('solid interactive')" />
<div :class="[$style.swatch]" v-bind="color('solid interactive')" disabled/>
<div :class="[$style.swatch]" v-bind="color('solid interactive')" aria-pressed="true"/>
</div><br/>Normal
</div><div>
<div v-bind="color('default raised solid')">
<div :class="[$style.swatch]" v-bind="color('solid raised')" />
<div :class="[$style.swatch]" v-bind="color('solid interactive raised')" />
<div :class="[$style.swatch]" v-bind="color('solid interactive raised')" disabled/>
<div :class="[$style.swatch]" v-bind="color('solid interactive raised')" aria-pressed="true"/>
</div>
<div v-bind="color('secondary raised solid')">
<div :class="[$style.swatch]" v-bind="color('solid raised')" />
<div :class="[$style.swatch]" v-bind="color('solid interactive raised')" />
<div :class="[$style.swatch]" v-bind="color('solid interactive raised')" disabled/>
<div :class="[$style.swatch]" v-bind="color('solid interactive raised')" aria-pressed="true"/>
</div>
<div v-bind="color('primary raised solid')">
<div :class="[$style.swatch]" v-bind="color('solid raised')" />
<div :class="[$style.swatch]" v-bind="color('solid interactive raised')" />
<div :class="[$style.swatch]" v-bind="color('solid interactive raised')" disabled/>
<div :class="[$style.swatch]" v-bind="color('solid interactive raised')" aria-pressed="true"/>
</div><br/><strong>Raised</strong>
</div>
</Layout>
</div>
</Layout>
<Layout flex style="align-items: center;">
| neutral |
| --------- |
| secondary |
| primary |
| (normal) | interactive | disabled | pressed |
| -------- | ----------- | -------- | ------- |
</Layout>
## Palette
The color palette consists of Blues, Reds, Grays, Beiges, as well as pastel blue/red/green/yellow.
@ -281,6 +445,8 @@ It's good practice to limit the scope of a variable to the module that needs it:
Read more about [style modules in the corresponding vue docs](https://vuejs.org/api/sfc-css-features.html#css-modules).
For testing purposes and side-by-side comparisons, you can add the classes `force-dark-theme` and `force-light-theme`.
## Semantic colors
We use semantic color variables that can mean a different shade depending on the currently chosen theme
@ -334,6 +500,7 @@ For each semantic color, we set a foreground and a background. In addition, we n
<style module>
.swatch {
transition:all .15s, filter 0s;
border-radius: 2em;
min-width: 3.2em;
min-height: 3.2em;
@ -344,26 +511,27 @@ For each semantic color, we set a foreground and a background. In addition, we n
justify-items:center;
position:relative;
&::after{
&::after {
position:absolute;
inset:13%;
content:"fw";
line-height:2.68em;
font-size:80%;
text-align: center;
outline: 2.5px dashed currentcolor;
outline-offset:-.95em;
transform:rotate(15deg);
letter-spacing:-.02em;
font-weight:800;
}
&:is(:not(:global(.solid)):not(:hover),:has(*))::after{
&:is(:not(:global(.solid)):not(:hover),:has(*))::after {
opacity:0
}
&:not(:hover)::after{
outline-color:transparent;
}
}
:not(:hover)>.deemphasized {
filter:blur(4px);
opacity:.5;
&::after {
opacity:0;
}
}
.small, .tiny {