@kouji-ui/themes 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +42 -0
- package/src/base.css +165 -0
- package/src/index.css +14 -0
- package/src/themes/bauhaus.css +88 -0
- package/src/themes/corporate.css +91 -0
- package/src/themes/cyberpunk.css +82 -0
- package/src/themes/dark.css +91 -0
- package/src/themes/dune.css +85 -0
- package/src/themes/forest.css +87 -0
- package/src/themes/kouji.css +128 -0
- package/src/themes/light.css +97 -0
- package/src/themes/mint.css +99 -0
- package/src/themes/nord.css +85 -0
- package/src/themes/retro.css +89 -0
- package/src/themes/sakura.css +85 -0
- package/src/themes/terminal.css +86 -0
- package/src/themes.spec.ts +87 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/* ─────────────────────────────────────────────────────────────
|
|
2
|
+
forest theme — dark
|
|
3
|
+
Deep moss & pine surfaces, bark fields, mustard-gold primary,
|
|
4
|
+
sage-green accent. Warm parchment text. Woodland mood.
|
|
5
|
+
──────────────────────────────────────────────────────────── */
|
|
6
|
+
|
|
7
|
+
@layer kj.shared {
|
|
8
|
+
[data-theme="forest"] {
|
|
9
|
+
/* ── shape — soft, organic ── */
|
|
10
|
+
--kj-radius-box: var(--kj-base-radius-2);
|
|
11
|
+
--kj-radius-field: var(--kj-base-radius-2);
|
|
12
|
+
--kj-radius-selector: var(--kj-base-radius-2);
|
|
13
|
+
--kj-border: var(--kj-base-border-1);
|
|
14
|
+
--kj-depth: 1;
|
|
15
|
+
|
|
16
|
+
/* ── type — italic serif headlines on dark moss. Warm woodland
|
|
17
|
+
voice; sans body keeps the long-form text crisp on dark. */
|
|
18
|
+
--kj-font-display: var(--kj-base-font-serif);
|
|
19
|
+
--kj-display-weight: 400;
|
|
20
|
+
--kj-display-italic: italic;
|
|
21
|
+
--kj-letter-spacing: -0.025em;
|
|
22
|
+
|
|
23
|
+
/* ── motion ── */
|
|
24
|
+
--kj-transition: var(--kj-base-transition-base);
|
|
25
|
+
|
|
26
|
+
--kj-bg-body: #1a2820;
|
|
27
|
+
--kj-bg-surface: #243630;
|
|
28
|
+
--kj-bg-field: #1f2e26;
|
|
29
|
+
--kj-bg-elevated: #2d4035;
|
|
30
|
+
--kj-bg-overlay: rgba(8, 18, 12, 0.65);
|
|
31
|
+
--kj-bg-inverse: #f0ead8;
|
|
32
|
+
--kj-bg-disabled: #2d3a32;
|
|
33
|
+
|
|
34
|
+
--kj-bg-primary: #d4a017;
|
|
35
|
+
--kj-bg-primary-subtle: #3d3520;
|
|
36
|
+
--kj-bg-accent: #8fbc4a;
|
|
37
|
+
--kj-bg-accent-subtle: #2a3a20;
|
|
38
|
+
|
|
39
|
+
--kj-bg-info: #8ab8d4;
|
|
40
|
+
--kj-bg-info-subtle: #1f2a35;
|
|
41
|
+
--kj-bg-success: #6ba33e;
|
|
42
|
+
--kj-bg-success-subtle: #1f3520;
|
|
43
|
+
--kj-bg-warning: #e0a830;
|
|
44
|
+
--kj-bg-warning-subtle: #3d3520;
|
|
45
|
+
--kj-bg-danger: #d96550;
|
|
46
|
+
--kj-bg-danger-subtle: #3d2520;
|
|
47
|
+
|
|
48
|
+
--kj-fg-default: #e8e0c8;
|
|
49
|
+
--kj-fg-muted: #c0b89a;
|
|
50
|
+
--kj-fg-subtle: #9a9376;
|
|
51
|
+
--kj-fg-disabled: #4a5548;
|
|
52
|
+
|
|
53
|
+
/* On a dark theme, intent fills are mid-bright; dark text passes
|
|
54
|
+
AA on every one (golds/greens/blues all sit at L > 0.30). */
|
|
55
|
+
--kj-fg-on-primary: #1a1a1a;
|
|
56
|
+
--kj-fg-on-accent: #1a1a1a;
|
|
57
|
+
--kj-fg-on-info: #1a1a1a;
|
|
58
|
+
--kj-fg-on-success: #1a1a1a;
|
|
59
|
+
--kj-fg-on-warning: #1a1a1a;
|
|
60
|
+
--kj-fg-on-danger: #1a1a1a;
|
|
61
|
+
--kj-fg-on-inverse: #1a2820;
|
|
62
|
+
|
|
63
|
+
--kj-fg-primary: #d4a017;
|
|
64
|
+
--kj-fg-accent: #8fbc4a;
|
|
65
|
+
--kj-fg-info: #8ab8d4;
|
|
66
|
+
--kj-fg-success: #8fbc4a;
|
|
67
|
+
--kj-fg-warning: #e0a830;
|
|
68
|
+
--kj-fg-danger: #d96550;
|
|
69
|
+
|
|
70
|
+
--kj-border-default: #3a4a40;
|
|
71
|
+
--kj-border-muted: #2d3d33;
|
|
72
|
+
--kj-border-strong: #5a6a60;
|
|
73
|
+
--kj-border-focus: #d4a017;
|
|
74
|
+
--kj-border-disabled: #2d3a32;
|
|
75
|
+
--kj-border-primary: #d4a017;
|
|
76
|
+
--kj-border-danger: #d96550;
|
|
77
|
+
|
|
78
|
+
--kj-shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.25);
|
|
79
|
+
--kj-shadow-md: 0 6px 18px rgba(0, 0, 0, 0.38);
|
|
80
|
+
--kj-shadow-lg: 0 20px 48px rgba(0, 0, 0, 0.50);
|
|
81
|
+
--kj-shadow-focus: 0 0 0 3px rgba(212, 160, 23, 0.35);
|
|
82
|
+
|
|
83
|
+
/* Mustard gold brightens on hover (8% black-mix would push it duller
|
|
84
|
+
on a dark theme — we want it more luminous against the moss bg). */
|
|
85
|
+
--kj-button-bg-hover: #e8b22a;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/* ─────────────────────────────────────────────────────────────
|
|
2
|
+
kouji theme — shared layer
|
|
3
|
+
Brand identity: brutalist near-black + lime accent + JetBrains Mono.
|
|
4
|
+
Recreates the original kouji-ui docs visual identity.
|
|
5
|
+
──────────────────────────────────────────────────────────── */
|
|
6
|
+
|
|
7
|
+
@layer kj.shared {
|
|
8
|
+
[data-theme="kouji"] {
|
|
9
|
+
/* ── shape — brutalist (no radius) ── */
|
|
10
|
+
--kj-radius-box: var(--kj-base-radius-0);
|
|
11
|
+
--kj-radius-field: var(--kj-base-radius-0);
|
|
12
|
+
--kj-radius-selector: var(--kj-base-radius-0);
|
|
13
|
+
--kj-border: var(--kj-base-border-1);
|
|
14
|
+
--kj-depth: 0;
|
|
15
|
+
|
|
16
|
+
/* ── type — mono everywhere. Brutalist identity statement: even
|
|
17
|
+
headlines use JetBrains Mono, no decorative display face. ── */
|
|
18
|
+
--kj-font-sans: var(--kj-base-font-mono);
|
|
19
|
+
--kj-font-display: var(--kj-base-font-mono);
|
|
20
|
+
--kj-display-weight: 700;
|
|
21
|
+
--kj-letter-spacing: -0.02em;
|
|
22
|
+
|
|
23
|
+
/* ── motion ── */
|
|
24
|
+
--kj-transition: var(--kj-base-transition-fast);
|
|
25
|
+
|
|
26
|
+
/* Neutral surfaces (7) */
|
|
27
|
+
--kj-bg-body: #0c0c0c;
|
|
28
|
+
--kj-bg-surface: #141414;
|
|
29
|
+
/* Field sits LIGHTER than both `bg-body` and `bg-surface` so an input
|
|
30
|
+
reads as a distinct interactive slot whether it's on the page body
|
|
31
|
+
or nested inside a card. Going darker doesn't work here because
|
|
32
|
+
body is already near-black — fields would just merge into the page. */
|
|
33
|
+
--kj-bg-field: #1f1f1f;
|
|
34
|
+
--kj-bg-elevated: #1a1a1a;
|
|
35
|
+
--kj-bg-overlay: rgba(0, 0, 0, 0.7);
|
|
36
|
+
--kj-bg-inverse: #f0ede6;
|
|
37
|
+
--kj-bg-disabled: #1a1a1a;
|
|
38
|
+
|
|
39
|
+
/* Intent surfaces — primary */
|
|
40
|
+
--kj-bg-primary: #c4ff3d;
|
|
41
|
+
--kj-bg-primary-subtle: #2a3300;
|
|
42
|
+
|
|
43
|
+
/* Intent surfaces — accent (kouji: same as primary) */
|
|
44
|
+
--kj-bg-accent: #c4ff3d;
|
|
45
|
+
--kj-bg-accent-subtle: #2a3300;
|
|
46
|
+
|
|
47
|
+
/* Intent surfaces — info */
|
|
48
|
+
--kj-bg-info: var(--kj-base-blue-400);
|
|
49
|
+
--kj-bg-info-subtle: #0a1a2a;
|
|
50
|
+
|
|
51
|
+
/* Intent surfaces — success */
|
|
52
|
+
--kj-bg-success: var(--kj-base-lime-500);
|
|
53
|
+
--kj-bg-success-subtle: #1a2a00;
|
|
54
|
+
|
|
55
|
+
/* Intent surfaces — warning */
|
|
56
|
+
--kj-bg-warning: var(--kj-base-amber-500);
|
|
57
|
+
--kj-bg-warning-subtle: #2a1a00;
|
|
58
|
+
|
|
59
|
+
/* Intent surfaces — danger. red-600 (l=55%) gives 5.44:1 vs white,
|
|
60
|
+
passing AA 4.5:1; red-500 (l=63%) only hit 3.91:1. */
|
|
61
|
+
--kj-bg-danger: var(--kj-base-red-600);
|
|
62
|
+
--kj-bg-danger-subtle: #2a0a0a;
|
|
63
|
+
|
|
64
|
+
/* FG Class A — independent */
|
|
65
|
+
--kj-fg-default: #f0ede6;
|
|
66
|
+
--kj-fg-muted: #b8b3a3;
|
|
67
|
+
--kj-fg-subtle: #8a8578;
|
|
68
|
+
--kj-fg-disabled: #5a5648;
|
|
69
|
+
|
|
70
|
+
/* FG Class B — paired */
|
|
71
|
+
--kj-fg-on-primary: #0c0c0c;
|
|
72
|
+
--kj-fg-on-accent: #0c0c0c;
|
|
73
|
+
--kj-fg-on-info: var(--kj-base-gray-950);
|
|
74
|
+
--kj-fg-on-success: var(--kj-base-gray-950);
|
|
75
|
+
--kj-fg-on-warning: var(--kj-base-gray-950);
|
|
76
|
+
--kj-fg-on-danger: var(--kj-base-gray-50);
|
|
77
|
+
--kj-fg-on-inverse: #0c0c0c;
|
|
78
|
+
|
|
79
|
+
/* FG Class C — intent as text */
|
|
80
|
+
--kj-fg-primary: #c4ff3d;
|
|
81
|
+
--kj-fg-accent: #c4ff3d;
|
|
82
|
+
--kj-fg-info: var(--kj-base-blue-400);
|
|
83
|
+
--kj-fg-success: var(--kj-base-lime-500);
|
|
84
|
+
--kj-fg-warning: var(--kj-base-amber-500);
|
|
85
|
+
--kj-fg-danger: var(--kj-base-red-400);
|
|
86
|
+
|
|
87
|
+
/* Borders */
|
|
88
|
+
--kj-border-default: #1a1a1a;
|
|
89
|
+
--kj-border-muted: #141414;
|
|
90
|
+
--kj-border-strong: #2a2a2a;
|
|
91
|
+
--kj-border-focus: #c4ff3d;
|
|
92
|
+
--kj-border-disabled: #1a1a1a;
|
|
93
|
+
--kj-border-primary: #c4ff3d;
|
|
94
|
+
--kj-border-danger: var(--kj-base-red-600);
|
|
95
|
+
|
|
96
|
+
/* Shadows — kouji is brutalist/flat (depth 0) */
|
|
97
|
+
--kj-shadow-sm: 0 0 0 1px #1a1a1a;
|
|
98
|
+
--kj-shadow-md: 0 0 0 1px #1a1a1a;
|
|
99
|
+
--kj-shadow-lg: 0 0 0 2px #1a1a1a;
|
|
100
|
+
--kj-shadow-focus: 0 0 0 2px #c4ff3d;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/* Component-layer overrides specific to the kouji theme.
|
|
105
|
+
Per the brutalist brand: filled buttons brighten + lift on hover instead
|
|
106
|
+
of the default darken behavior. Flip component tokens — never raw
|
|
107
|
+
`background` — so `ghost` / `outline` / `link` keep their own hover
|
|
108
|
+
surfaces (transparent / base-200) instead of the lime accent.
|
|
109
|
+
|
|
110
|
+
`default` and `destructive` are the only variants whose surface is
|
|
111
|
+
filled with brand color in this theme; brightening only those leaves
|
|
112
|
+
the secondary variants untouched.
|
|
113
|
+
|
|
114
|
+
Scoped via `@scope` so the override stops at the nearest nested
|
|
115
|
+
`[data-theme]` boundary. Without it, a preview swatch with
|
|
116
|
+
`data-theme="dark"` nested inside `<html data-theme="kouji">` would
|
|
117
|
+
still receive the lime hover because it remains a descendant of the
|
|
118
|
+
outer kouji theme. */
|
|
119
|
+
@layer kj.component {
|
|
120
|
+
@scope ([data-theme="kouji"]) to ([data-theme]:not([data-theme="kouji"])) {
|
|
121
|
+
.kj-button[data-variant="default"]:hover,
|
|
122
|
+
.kj-button[data-variant="destructive"]:hover {
|
|
123
|
+
--kj-button-bg: #d4ff00;
|
|
124
|
+
--kj-button-fg: #0c0c0c;
|
|
125
|
+
transform: translateY(-2px);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/* ─────────────────────────────────────────────────────────────
|
|
2
|
+
light theme — "Paper (ink)"
|
|
3
|
+
Editorial / print feel: pure white surfaces, warm paper field,
|
|
4
|
+
ink-black primary, dark goldenrod accent. Single signature
|
|
5
|
+
accent hue; intent colors stay restrained and AAA-friendly.
|
|
6
|
+
──────────────────────────────────────────────────────────── */
|
|
7
|
+
|
|
8
|
+
@layer kj.shared {
|
|
9
|
+
[data-theme="light"] {
|
|
10
|
+
/* ── shape — soft, editorial ── */
|
|
11
|
+
--kj-radius-box: var(--kj-base-radius-2);
|
|
12
|
+
--kj-radius-field: var(--kj-base-radius-1);
|
|
13
|
+
--kj-radius-selector: var(--kj-base-radius-1);
|
|
14
|
+
--kj-border: var(--kj-base-border-1);
|
|
15
|
+
--kj-depth: 1;
|
|
16
|
+
|
|
17
|
+
/* ── type — editorial serif headlines (DM Serif Display) on a sans
|
|
18
|
+
body. The "paper / ink" identity calls for serif voice; light
|
|
19
|
+
weight + tight tracking match a print magazine. */
|
|
20
|
+
--kj-font-display: var(--kj-base-font-serif);
|
|
21
|
+
--kj-display-weight: 400;
|
|
22
|
+
--kj-letter-spacing: -0.03em;
|
|
23
|
+
|
|
24
|
+
/* ── motion ── */
|
|
25
|
+
--kj-transition: var(--kj-base-transition-fast);
|
|
26
|
+
|
|
27
|
+
/* Body is pure white; field gets a warm paper tint so inputs sit
|
|
28
|
+
slightly recessed against surface (which is also white). */
|
|
29
|
+
--kj-bg-body: #ffffff;
|
|
30
|
+
--kj-bg-surface: #ffffff;
|
|
31
|
+
--kj-bg-field: #f6f6f4;
|
|
32
|
+
--kj-bg-elevated: #ffffff;
|
|
33
|
+
--kj-bg-overlay: rgba(26, 26, 26, 0.5);
|
|
34
|
+
--kj-bg-inverse: #1a1a1a;
|
|
35
|
+
--kj-bg-disabled: #ececea;
|
|
36
|
+
|
|
37
|
+
/* Ink primary + goldenrod accent — the theme's signature pair.
|
|
38
|
+
fg-on-accent stays ink (#1a1a1a on #b8860b → 5.14:1) instead of
|
|
39
|
+
white because white-on-goldenrod fails AA. */
|
|
40
|
+
--kj-bg-primary: #1a1a1a;
|
|
41
|
+
--kj-bg-primary-subtle: #f2f2f0;
|
|
42
|
+
/* Goldenrod brightened (#b8860b → #d6a300) to match the design's
|
|
43
|
+
paper-with-gilt-edge identity. fg-on-accent stays ink — black on
|
|
44
|
+
#d6a300 ≈ 7.6:1 AA AAA. */
|
|
45
|
+
--kj-bg-accent: #d6a300;
|
|
46
|
+
--kj-bg-accent-subtle: #fdf6e3;
|
|
47
|
+
|
|
48
|
+
--kj-bg-info: #1e40af;
|
|
49
|
+
--kj-bg-info-subtle: #e0e7ff;
|
|
50
|
+
--kj-bg-success: #166534;
|
|
51
|
+
--kj-bg-success-subtle: #d4ecdc;
|
|
52
|
+
--kj-bg-warning: #d97706;
|
|
53
|
+
--kj-bg-warning-subtle: #fef3c7;
|
|
54
|
+
--kj-bg-danger: #991b1b;
|
|
55
|
+
--kj-bg-danger-subtle: #fee2e2;
|
|
56
|
+
|
|
57
|
+
--kj-fg-default: #1a1a1a;
|
|
58
|
+
--kj-fg-muted: #4a4a4a;
|
|
59
|
+
--kj-fg-subtle: #6a6a6a;
|
|
60
|
+
--kj-fg-disabled: #b8b8b6;
|
|
61
|
+
|
|
62
|
+
--kj-fg-on-primary: #ffffff;
|
|
63
|
+
--kj-fg-on-accent: #1a1a1a;
|
|
64
|
+
--kj-fg-on-info: #ffffff;
|
|
65
|
+
--kj-fg-on-success: #ffffff;
|
|
66
|
+
--kj-fg-on-warning: #1a1a1a;
|
|
67
|
+
--kj-fg-on-danger: #ffffff;
|
|
68
|
+
--kj-fg-on-inverse: #ffffff;
|
|
69
|
+
|
|
70
|
+
/* fg.accent is darker than bg.accent — white #b8860b only hits ~3:1
|
|
71
|
+
on body, so use #8b6508 (~5.3:1) for accent-colored text. */
|
|
72
|
+
--kj-fg-primary: #1a1a1a;
|
|
73
|
+
--kj-fg-accent: #8b6508;
|
|
74
|
+
--kj-fg-info: #1e40af;
|
|
75
|
+
--kj-fg-success: #166534;
|
|
76
|
+
--kj-fg-warning: #92400e;
|
|
77
|
+
--kj-fg-danger: #991b1b;
|
|
78
|
+
|
|
79
|
+
--kj-border-default: #e8e6e0;
|
|
80
|
+
--kj-border-muted: #f0eee8;
|
|
81
|
+
--kj-border-strong: #c8c4b8;
|
|
82
|
+
--kj-border-focus: #1a1a1a;
|
|
83
|
+
--kj-border-disabled: #ececea;
|
|
84
|
+
--kj-border-primary: #1a1a1a;
|
|
85
|
+
--kj-border-danger: #991b1b;
|
|
86
|
+
|
|
87
|
+
/* Slightly heavier shadow profile so cards read as paper-on-paper. */
|
|
88
|
+
--kj-shadow-sm: 0 1px 2px rgba(26, 26, 26, 0.06);
|
|
89
|
+
--kj-shadow-md: 0 6px 16px rgba(26, 26, 26, 0.10);
|
|
90
|
+
--kj-shadow-lg: 0 20px 48px rgba(26, 26, 26, 0.16);
|
|
91
|
+
--kj-shadow-focus: 0 0 0 3px rgba(26, 26, 26, 0.25);
|
|
92
|
+
|
|
93
|
+
/* 8% darken against #1a1a1a is nearly imperceptible; lift toward
|
|
94
|
+
#3a3a3a so the hover reads as a deliberate state change. */
|
|
95
|
+
--kj-button-bg-hover: #3a3a3a;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/* ─────────────────────────────────────────────────────────────
|
|
2
|
+
mint theme — light
|
|
3
|
+
Fresh herbal cool greens. Mint-tinted cream body, crisp white
|
|
4
|
+
cards, deep spearmint primary (mono-hue: primary === accent ===
|
|
5
|
+
success). Calm spa / ceramic / fresh-herb feel.
|
|
6
|
+
──────────────────────────────────────────────────────────── */
|
|
7
|
+
|
|
8
|
+
@layer kj.shared {
|
|
9
|
+
[data-theme="mint"] {
|
|
10
|
+
/* ── shape — soft, organic ── */
|
|
11
|
+
--kj-radius-box: var(--kj-base-radius-2);
|
|
12
|
+
--kj-radius-field: var(--kj-base-radius-1);
|
|
13
|
+
--kj-radius-selector: var(--kj-base-radius-1);
|
|
14
|
+
--kj-border: var(--kj-base-border-1);
|
|
15
|
+
--kj-depth: 1;
|
|
16
|
+
|
|
17
|
+
/* ── type — clean sans display, slightly tighter tracking for a
|
|
18
|
+
fresh ceramic-shop feel. */
|
|
19
|
+
--kj-display-weight: 600;
|
|
20
|
+
--kj-letter-spacing: -0.035em;
|
|
21
|
+
|
|
22
|
+
/* ── motion ── */
|
|
23
|
+
--kj-transition: var(--kj-base-transition-base);
|
|
24
|
+
|
|
25
|
+
/* Surfaces — mint-tinted cream body, pure white cards. ~10% L
|
|
26
|
+
between body (#eef5ec ≈ 0.88) and surface (#ffffff = 1.00) so
|
|
27
|
+
cards visibly lift. Field is a deeper mint recess for inputs. */
|
|
28
|
+
--kj-bg-body: #eef5ec;
|
|
29
|
+
--kj-bg-surface: #ffffff;
|
|
30
|
+
--kj-bg-field: #def0db;
|
|
31
|
+
--kj-bg-elevated: #ffffff;
|
|
32
|
+
--kj-bg-overlay: rgba(8, 40, 28, 0.55);
|
|
33
|
+
--kj-bg-inverse: #0c2a1f;
|
|
34
|
+
--kj-bg-disabled: #cee0cb;
|
|
35
|
+
|
|
36
|
+
/* Signature spearmint — used for primary/accent/success. Mono-hue
|
|
37
|
+
identity (cf. corporate Navy / dark Cobalt). Info gets a separate
|
|
38
|
+
restrained slate-blue so it doesn't collide with the spearmint
|
|
39
|
+
success state. */
|
|
40
|
+
--kj-bg-primary: #047857;
|
|
41
|
+
--kj-bg-primary-subtle: #d0ebde;
|
|
42
|
+
--kj-bg-accent: #047857;
|
|
43
|
+
--kj-bg-accent-subtle: #d0ebde;
|
|
44
|
+
|
|
45
|
+
--kj-bg-info: #195e85;
|
|
46
|
+
--kj-bg-info-subtle: #d4e3ed;
|
|
47
|
+
--kj-bg-success: #047857;
|
|
48
|
+
--kj-bg-success-subtle: #d0ebde;
|
|
49
|
+
--kj-bg-warning: #a06400;
|
|
50
|
+
--kj-bg-warning-subtle: #f5e2c0;
|
|
51
|
+
--kj-bg-danger: #b8362c;
|
|
52
|
+
--kj-bg-danger-subtle: #f3d4d0;
|
|
53
|
+
|
|
54
|
+
--kj-fg-default: #0c2a1f;
|
|
55
|
+
--kj-fg-muted: #284a3a;
|
|
56
|
+
--kj-fg-subtle: #4a6a5a;
|
|
57
|
+
--kj-fg-disabled: #a8b8ad;
|
|
58
|
+
|
|
59
|
+
/* Every intent fill is dark enough that white text passes AA
|
|
60
|
+
(≥ 4.5:1). Spearmint #047857 ≈ 5.5:1 with white. */
|
|
61
|
+
--kj-fg-on-primary: #ffffff;
|
|
62
|
+
--kj-fg-on-accent: #ffffff;
|
|
63
|
+
--kj-fg-on-info: #ffffff;
|
|
64
|
+
--kj-fg-on-success: #ffffff;
|
|
65
|
+
--kj-fg-on-warning: #ffffff;
|
|
66
|
+
--kj-fg-on-danger: #ffffff;
|
|
67
|
+
--kj-fg-on-inverse: #eef5ec;
|
|
68
|
+
|
|
69
|
+
/* fg-* tuned so each intent-as-text clears AA on both the mint body
|
|
70
|
+
(~0.88 L) AND the docs-app navbar's primary-subtle-derived bg
|
|
71
|
+
(~0.77 L). `#047857` only hits 4.19:1 on the navbar; deepening to
|
|
72
|
+
`#035a42` reaches ~5.47:1 there. Same color is used for the
|
|
73
|
+
hover-deep button bg below — coincidence is intentional. */
|
|
74
|
+
--kj-fg-primary: #035a42;
|
|
75
|
+
--kj-fg-accent: #035a42;
|
|
76
|
+
--kj-fg-info: #195e85;
|
|
77
|
+
--kj-fg-success: #035a42;
|
|
78
|
+
--kj-fg-warning: #6b4200;
|
|
79
|
+
--kj-fg-danger: #8b2a22;
|
|
80
|
+
|
|
81
|
+
--kj-border-default: #c8dec5;
|
|
82
|
+
--kj-border-muted: #def0db;
|
|
83
|
+
--kj-border-strong: #94b099;
|
|
84
|
+
--kj-border-focus: #047857;
|
|
85
|
+
--kj-border-disabled: #cee0cb;
|
|
86
|
+
--kj-border-primary: #047857;
|
|
87
|
+
--kj-border-danger: #b8362c;
|
|
88
|
+
|
|
89
|
+
/* Cool mint-tinted shadows — spa softness, not generic gray. */
|
|
90
|
+
--kj-shadow-sm: 0 1px 3px rgba(8, 60, 40, 0.10);
|
|
91
|
+
--kj-shadow-md: 0 6px 16px rgba(8, 60, 40, 0.15);
|
|
92
|
+
--kj-shadow-lg: 0 20px 48px rgba(8, 60, 40, 0.22);
|
|
93
|
+
--kj-shadow-focus: 0 0 0 3px rgba(4, 120, 87, 0.30);
|
|
94
|
+
|
|
95
|
+
/* Deepen the spearmint on hover (~10% darker) so the interaction
|
|
96
|
+
reads on the bright body. */
|
|
97
|
+
--kj-button-bg-hover: #035a42;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/* ─────────────────────────────────────────────────────────────
|
|
2
|
+
nord theme — dark
|
|
3
|
+
Arctic Ice Studios palette: polar-night surfaces, frost teal
|
|
4
|
+
primary, aurora accents (green/yellow/red). Cool, desaturated.
|
|
5
|
+
──────────────────────────────────────────────────────────── */
|
|
6
|
+
|
|
7
|
+
@layer kj.shared {
|
|
8
|
+
[data-theme="nord"] {
|
|
9
|
+
/* ── shape ── */
|
|
10
|
+
--kj-radius-box: var(--kj-base-radius-2);
|
|
11
|
+
--kj-radius-field: var(--kj-base-radius-1);
|
|
12
|
+
--kj-radius-selector: var(--kj-base-radius-1);
|
|
13
|
+
--kj-border: var(--kj-base-border-1);
|
|
14
|
+
--kj-depth: 1;
|
|
15
|
+
/* ── type — clean arctic sans (Space Grotesk via base sans). Tighter
|
|
16
|
+
tracking + medium weight for cool calm headlines. */
|
|
17
|
+
--kj-display-weight: 600;
|
|
18
|
+
--kj-letter-spacing: -0.035em;
|
|
19
|
+
|
|
20
|
+
/* ── motion ── */
|
|
21
|
+
--kj-transition: var(--kj-base-transition-fast);
|
|
22
|
+
|
|
23
|
+
/* Polar Night surfaces: nord0 → nord3 */
|
|
24
|
+
--kj-bg-body: #2e3440;
|
|
25
|
+
--kj-bg-surface: #3b4252;
|
|
26
|
+
--kj-bg-field: #434c5e;
|
|
27
|
+
--kj-bg-elevated: #4c566a;
|
|
28
|
+
--kj-bg-overlay: rgba(20, 24, 32, 0.55);
|
|
29
|
+
--kj-bg-inverse: #eceff4;
|
|
30
|
+
--kj-bg-disabled: #3b4252;
|
|
31
|
+
|
|
32
|
+
--kj-bg-primary: #88c0d0;
|
|
33
|
+
--kj-bg-primary-subtle: #3a4658;
|
|
34
|
+
--kj-bg-accent: #81a1c1;
|
|
35
|
+
--kj-bg-accent-subtle: #3a4555;
|
|
36
|
+
|
|
37
|
+
--kj-bg-info: #88c0d0;
|
|
38
|
+
--kj-bg-info-subtle: #3a4658;
|
|
39
|
+
--kj-bg-success: #a3be8c;
|
|
40
|
+
--kj-bg-success-subtle: #3a4540;
|
|
41
|
+
--kj-bg-warning: #ebcb8b;
|
|
42
|
+
--kj-bg-warning-subtle: #4a4535;
|
|
43
|
+
--kj-bg-danger: #d8a0a5;
|
|
44
|
+
--kj-bg-danger-subtle: #4a3838;
|
|
45
|
+
|
|
46
|
+
/* Snow Storm scaled: default = nord6, muted = nord4, subtle = nord4
|
|
47
|
+
darkened. */
|
|
48
|
+
--kj-fg-default: #eceff4;
|
|
49
|
+
--kj-fg-muted: #d8dee9;
|
|
50
|
+
--kj-fg-subtle: #b8c0cd;
|
|
51
|
+
--kj-fg-disabled: #4c566a;
|
|
52
|
+
|
|
53
|
+
--kj-fg-on-primary: #1a1a1a;
|
|
54
|
+
--kj-fg-on-accent: #1a1a1a;
|
|
55
|
+
--kj-fg-on-info: #1a1a1a;
|
|
56
|
+
--kj-fg-on-success: #1a1a1a;
|
|
57
|
+
--kj-fg-on-warning: #1a1a1a;
|
|
58
|
+
--kj-fg-on-danger: #1a1a1a;
|
|
59
|
+
--kj-fg-on-inverse: #2e3440;
|
|
60
|
+
|
|
61
|
+
--kj-fg-primary: #88c0d0;
|
|
62
|
+
--kj-fg-accent: #81a1c1;
|
|
63
|
+
--kj-fg-info: #88c0d0;
|
|
64
|
+
--kj-fg-success: #a3be8c;
|
|
65
|
+
--kj-fg-warning: #ebcb8b;
|
|
66
|
+
--kj-fg-danger: #d8a0a5;
|
|
67
|
+
|
|
68
|
+
--kj-border-default: #434c5e;
|
|
69
|
+
--kj-border-muted: #3b4252;
|
|
70
|
+
--kj-border-strong: #4c566a;
|
|
71
|
+
--kj-border-focus: #88c0d0;
|
|
72
|
+
--kj-border-disabled: #3b4252;
|
|
73
|
+
--kj-border-primary: #88c0d0;
|
|
74
|
+
--kj-border-danger: #d8a0a5;
|
|
75
|
+
|
|
76
|
+
--kj-shadow-sm: 0 1px 3px rgba(20, 24, 32, 0.30);
|
|
77
|
+
--kj-shadow-md: 0 6px 18px rgba(20, 24, 32, 0.42);
|
|
78
|
+
--kj-shadow-lg: 0 20px 48px rgba(20, 24, 32, 0.55);
|
|
79
|
+
--kj-shadow-focus: 0 0 0 3px rgba(136, 192, 208, 0.40);
|
|
80
|
+
|
|
81
|
+
/* Brighten frost teal on hover (dark themes need luminosity lift,
|
|
82
|
+
not the default 8% black-mix darken). */
|
|
83
|
+
--kj-button-bg-hover: #a3d4e2;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/* ─────────────────────────────────────────────────────────────
|
|
2
|
+
retro theme — shared layer
|
|
3
|
+
Warm cream surfaces, terracotta accents, vintage paper feel.
|
|
4
|
+
Inspired by sun-faded mid-century print design.
|
|
5
|
+
──────────────────────────────────────────────────────────── */
|
|
6
|
+
|
|
7
|
+
@layer kj.shared {
|
|
8
|
+
[data-theme="retro"] {
|
|
9
|
+
/* ── shape — soft rounded, vintage cards ── */
|
|
10
|
+
--kj-radius-box: var(--kj-base-radius-2);
|
|
11
|
+
--kj-radius-field: var(--kj-base-radius-2);
|
|
12
|
+
--kj-radius-selector: var(--kj-base-radius-2);
|
|
13
|
+
--kj-border: var(--kj-base-border-1);
|
|
14
|
+
--kj-depth: 1;
|
|
15
|
+
/* ── type — italic serif headlines (mid-century print feel). Light
|
|
16
|
+
weight, italic. Sans body for legibility on warm cream. */
|
|
17
|
+
--kj-font-display: var(--kj-base-font-serif);
|
|
18
|
+
--kj-display-weight: 400;
|
|
19
|
+
--kj-display-italic: italic;
|
|
20
|
+
--kj-letter-spacing: -0.02em;
|
|
21
|
+
|
|
22
|
+
/* ── motion ── */
|
|
23
|
+
--kj-transition: var(--kj-base-transition-base);
|
|
24
|
+
|
|
25
|
+
--kj-bg-body: #ede5d0;
|
|
26
|
+
--kj-bg-surface: #e4d8b4;
|
|
27
|
+
--kj-bg-field: #f4ecd8;
|
|
28
|
+
--kj-bg-elevated: #fff8e4;
|
|
29
|
+
--kj-bg-overlay: rgba(40, 36, 37, 0.5);
|
|
30
|
+
--kj-bg-inverse: #282425;
|
|
31
|
+
--kj-bg-disabled: #d6c89a;
|
|
32
|
+
|
|
33
|
+
--kj-bg-primary: #ef9995;
|
|
34
|
+
--kj-bg-primary-subtle: #fce3df;
|
|
35
|
+
--kj-bg-accent: #7a9eb1;
|
|
36
|
+
--kj-bg-accent-subtle: #d6e2ea;
|
|
37
|
+
|
|
38
|
+
--kj-bg-info: #7a9eb1;
|
|
39
|
+
--kj-bg-info-subtle: #d6e2ea;
|
|
40
|
+
--kj-bg-success: #91b859;
|
|
41
|
+
--kj-bg-success-subtle: #dfecc8;
|
|
42
|
+
--kj-bg-warning: #e9b872;
|
|
43
|
+
--kj-bg-warning-subtle: #faedd5;
|
|
44
|
+
--kj-bg-danger: #c4625d;
|
|
45
|
+
--kj-bg-danger-subtle: #f3d4d2;
|
|
46
|
+
|
|
47
|
+
--kj-fg-default: #282425;
|
|
48
|
+
--kj-fg-muted: #4a3530;
|
|
49
|
+
/* Subtle pulled darker so h3 / muted labels clear AA on bg-body. */
|
|
50
|
+
--kj-fg-subtle: #6a4f43;
|
|
51
|
+
--kj-fg-disabled: #bdb098;
|
|
52
|
+
|
|
53
|
+
--kj-fg-on-primary: #282425;
|
|
54
|
+
--kj-fg-on-accent: #282425;
|
|
55
|
+
--kj-fg-on-info: #282425;
|
|
56
|
+
--kj-fg-on-success: #282425;
|
|
57
|
+
--kj-fg-on-warning: #282425;
|
|
58
|
+
--kj-fg-on-danger: #ede5d0;
|
|
59
|
+
--kj-fg-on-inverse: #ede5d0;
|
|
60
|
+
|
|
61
|
+
/* fg.primary must meet AA on body — terracotta darkened from #ef9995 */
|
|
62
|
+
--kj-fg-primary: #8a3a36;
|
|
63
|
+
--kj-fg-accent: #3d5a6b;
|
|
64
|
+
--kj-fg-info: #3d5a6b;
|
|
65
|
+
--kj-fg-success: #4a6b2b;
|
|
66
|
+
--kj-fg-warning: #8a5a1f;
|
|
67
|
+
--kj-fg-danger: #8a2f2a;
|
|
68
|
+
|
|
69
|
+
--kj-border-default: #d6c89a;
|
|
70
|
+
--kj-border-muted: #e4d8b4;
|
|
71
|
+
--kj-border-strong: #b8a578;
|
|
72
|
+
--kj-border-focus: #7a9eb1;
|
|
73
|
+
--kj-border-disabled: #d6c89a;
|
|
74
|
+
--kj-border-primary: #ef9995;
|
|
75
|
+
--kj-border-danger: #c4625d;
|
|
76
|
+
|
|
77
|
+
--kj-shadow-sm: 0 1px 3px rgba(93, 64, 55, 0.1);
|
|
78
|
+
--kj-shadow-md: 0 4px 12px rgba(93, 64, 55, 0.18);
|
|
79
|
+
--kj-shadow-lg: 0 16px 40px rgba(93, 64, 55, 0.25);
|
|
80
|
+
--kj-shadow-focus: 0 0 0 3px rgba(122, 158, 177, 0.45);
|
|
81
|
+
|
|
82
|
+
/* Retro's `bg-primary` is pale salmon (#ef9995). The 8% darken in
|
|
83
|
+
button.css is nearly imperceptible against it; lift to a deeper
|
|
84
|
+
terracotta so the hover reads on the sun-faded palette. Cream fg
|
|
85
|
+
reads better than the default ink on the deepened terracotta. */
|
|
86
|
+
--kj-button-bg-hover: #d05c57;
|
|
87
|
+
--kj-button-fg-hover: #fff5e4;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/* ─────────────────────────────────────────────────────────────
|
|
2
|
+
sakura theme — light
|
|
3
|
+
Soft pink dawn, washi-paper surfaces, deep aubergine text,
|
|
4
|
+
cherry-magenta primary + plum accent. Cherry-blossom mood.
|
|
5
|
+
──────────────────────────────────────────────────────────── */
|
|
6
|
+
|
|
7
|
+
@layer kj.shared {
|
|
8
|
+
[data-theme="sakura"] {
|
|
9
|
+
/* ── shape — soft, organic ── */
|
|
10
|
+
--kj-radius-box: var(--kj-base-radius-3);
|
|
11
|
+
--kj-radius-field: var(--kj-base-radius-2);
|
|
12
|
+
--kj-radius-selector: var(--kj-base-radius-2);
|
|
13
|
+
--kj-border: var(--kj-base-border-1);
|
|
14
|
+
--kj-depth: 1;
|
|
15
|
+
|
|
16
|
+
/* ── type — light italic serif (DM Serif Display italic). The soft
|
|
17
|
+
feminine voice of the palette calls for elegance, not weight. */
|
|
18
|
+
--kj-font-display: var(--kj-base-font-serif);
|
|
19
|
+
--kj-display-weight: 400;
|
|
20
|
+
--kj-display-italic: italic;
|
|
21
|
+
--kj-letter-spacing: -0.025em;
|
|
22
|
+
|
|
23
|
+
/* ── motion ── */
|
|
24
|
+
--kj-transition: var(--kj-base-transition-base);
|
|
25
|
+
|
|
26
|
+
--kj-bg-body: #fef5f3;
|
|
27
|
+
--kj-bg-surface: #ffffff;
|
|
28
|
+
--kj-bg-field: #fbe9e6;
|
|
29
|
+
--kj-bg-elevated: #ffffff;
|
|
30
|
+
--kj-bg-overlay: rgba(45, 24, 48, 0.45);
|
|
31
|
+
--kj-bg-inverse: #2d1830;
|
|
32
|
+
--kj-bg-disabled: #f0d9d4;
|
|
33
|
+
|
|
34
|
+
--kj-bg-primary: #c2185b;
|
|
35
|
+
--kj-bg-primary-subtle: #fce4ec;
|
|
36
|
+
--kj-bg-accent: #6a1b4f;
|
|
37
|
+
--kj-bg-accent-subtle: #f0e0ee;
|
|
38
|
+
|
|
39
|
+
--kj-bg-info: #5b4880;
|
|
40
|
+
--kj-bg-info-subtle: #ece6f5;
|
|
41
|
+
--kj-bg-success: #2e7d52;
|
|
42
|
+
--kj-bg-success-subtle: #d4ecdc;
|
|
43
|
+
--kj-bg-warning: #d48838;
|
|
44
|
+
--kj-bg-warning-subtle: #fce8d0;
|
|
45
|
+
--kj-bg-danger: #9b1b3a;
|
|
46
|
+
--kj-bg-danger-subtle: #f9d8e0;
|
|
47
|
+
|
|
48
|
+
--kj-fg-default: #2d1830;
|
|
49
|
+
--kj-fg-muted: #4d3050;
|
|
50
|
+
--kj-fg-subtle: #6b4f70;
|
|
51
|
+
--kj-fg-disabled: #c4a8c8;
|
|
52
|
+
|
|
53
|
+
--kj-fg-on-primary: #ffffff;
|
|
54
|
+
--kj-fg-on-accent: #ffffff;
|
|
55
|
+
--kj-fg-on-info: #ffffff;
|
|
56
|
+
--kj-fg-on-success: #ffffff;
|
|
57
|
+
--kj-fg-on-warning: #2d1830;
|
|
58
|
+
--kj-fg-on-danger: #ffffff;
|
|
59
|
+
--kj-fg-on-inverse: #fef5f3;
|
|
60
|
+
|
|
61
|
+
--kj-fg-primary: #a01548;
|
|
62
|
+
--kj-fg-accent: #6a1b4f;
|
|
63
|
+
--kj-fg-info: #5b4880;
|
|
64
|
+
--kj-fg-success: #2e7d52;
|
|
65
|
+
--kj-fg-warning: #8a5a1f;
|
|
66
|
+
--kj-fg-danger: #9b1b3a;
|
|
67
|
+
|
|
68
|
+
--kj-border-default: #f0d9d4;
|
|
69
|
+
--kj-border-muted: #f7e6e3;
|
|
70
|
+
--kj-border-strong: #d4a4a0;
|
|
71
|
+
--kj-border-focus: #c2185b;
|
|
72
|
+
--kj-border-disabled: #f0d9d4;
|
|
73
|
+
--kj-border-primary: #c2185b;
|
|
74
|
+
--kj-border-danger: #9b1b3a;
|
|
75
|
+
|
|
76
|
+
--kj-shadow-sm: 0 1px 3px rgba(194, 24, 91, 0.08);
|
|
77
|
+
--kj-shadow-md: 0 6px 16px rgba(194, 24, 91, 0.12);
|
|
78
|
+
--kj-shadow-lg: 0 20px 48px rgba(194, 24, 91, 0.18);
|
|
79
|
+
--kj-shadow-focus: 0 0 0 3px rgba(194, 24, 91, 0.30);
|
|
80
|
+
|
|
81
|
+
/* Lift the cherry magenta to a deeper rose so the hover reads
|
|
82
|
+
against the warm body. */
|
|
83
|
+
--kj-button-bg-hover: #a01548;
|
|
84
|
+
}
|
|
85
|
+
}
|