@ojiepermana/angular-theme 22.0.36 → 22.0.43

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.
Files changed (46) hide show
  1. package/README.md +25 -12
  2. package/fesm2022/ojiepermana-angular-theme-layout-types.mjs +10 -1
  3. package/fesm2022/ojiepermana-angular-theme-layout-wrapper.mjs +72 -22
  4. package/fesm2022/ojiepermana-angular-theme-layout.mjs +117 -45
  5. package/fesm2022/ojiepermana-angular-theme-page.mjs +251 -101
  6. package/fesm2022/ojiepermana-angular-theme-styles.mjs +19 -0
  7. package/layout/README.md +41 -36
  8. package/package.json +3 -3
  9. package/page/README.md +53 -15
  10. package/styles/README.md +11 -3
  11. package/styles/css/base/components.css +212 -0
  12. package/styles/css/base/theme.css +117 -49
  13. package/styles/css/base/tokens.css +98 -48
  14. package/styles/css/color/amber.css +2 -0
  15. package/styles/css/color/blue.css +2 -0
  16. package/styles/css/color/cyan.css +2 -0
  17. package/styles/css/color/emerald.css +2 -0
  18. package/styles/css/color/fuchsia.css +2 -0
  19. package/styles/css/color/green.css +2 -0
  20. package/styles/css/color/indigo.css +2 -0
  21. package/styles/css/color/lime.css +2 -0
  22. package/styles/css/color/orange.css +2 -0
  23. package/styles/css/color/pink.css +2 -0
  24. package/styles/css/color/purple.css +2 -0
  25. package/styles/css/color/red.css +2 -0
  26. package/styles/css/color/rose.css +2 -0
  27. package/styles/css/color/sky.css +2 -0
  28. package/styles/css/color/teal.css +2 -0
  29. package/styles/css/color/violet.css +2 -0
  30. package/styles/css/color/yellow.css +2 -0
  31. package/styles/css/neutral/gray.css +2 -0
  32. package/styles/css/neutral/mauve.css +2 -0
  33. package/styles/css/neutral/mist.css +2 -0
  34. package/styles/css/neutral/neutral.css +2 -0
  35. package/styles/css/neutral/olive.css +2 -0
  36. package/styles/css/neutral/slate.css +2 -0
  37. package/styles/css/neutral/stone.css +2 -0
  38. package/styles/css/neutral/taupe.css +2 -0
  39. package/styles/css/neutral/zinc.css +2 -0
  40. package/styles/css/space/index.css +6 -3
  41. package/types/ojiepermana-angular-theme-layout-services.d.ts +1 -1
  42. package/types/ojiepermana-angular-theme-layout-types.d.ts +1 -1
  43. package/types/ojiepermana-angular-theme-layout-wrapper.d.ts +40 -7
  44. package/types/ojiepermana-angular-theme-layout.d.ts +4 -2
  45. package/types/ojiepermana-angular-theme-page.d.ts +88 -36
  46. package/types/ojiepermana-angular-theme-styles.d.ts +1 -0
@@ -19,7 +19,7 @@
19
19
 
20
20
  --border-width-base: 1px;
21
21
 
22
- --shadow-base: 0 1px 2px hsl(240 10% 3.9% / 0.08);
22
+ --shadow-base: 0 1px 2px hsl(0 0% 3.9% / 0.08);
23
23
 
24
24
  --duration-base: 200ms;
25
25
  --ease-base: cubic-bezier(0.4, 0, 0.2, 1);
@@ -82,10 +82,10 @@
82
82
  * re-emitted by the Tailwind @theme mapping as var(--theme-shadow-*) in the
83
83
  * later `theme` layer, so pointing either alias back at --shadow-* would
84
84
  * create a var() cycle that invalidates the whole chain. */
85
- --shadow-xs-base: 0 1px 1px hsl(240 10% 3.9% / 0.05);
86
- --shadow-md-base: 0 4px 6px hsl(240 10% 3.9% / 0.08);
87
- --shadow-lg-base: 0 10px 15px hsl(240 10% 3.9% / 0.1);
88
- --shadow-xl-base: 0 20px 25px hsl(240 10% 3.9% / 0.12);
85
+ --shadow-xs-base: 0 1px 1px hsl(0 0% 3.9% / 0.05);
86
+ --shadow-md-base: 0 4px 6px hsl(0 0% 3.9% / 0.08);
87
+ --shadow-lg-base: 0 10px 15px hsl(0 0% 3.9% / 0.1);
88
+ --shadow-xl-base: 0 20px 25px hsl(0 0% 3.9% / 0.12);
89
89
  --shadow-xs: var(--shadow-xs-base);
90
90
  --shadow-sm: var(--shadow-base);
91
91
  --shadow-md: var(--shadow-md-base);
@@ -157,12 +157,88 @@
157
157
  --timeline-indicator-rose: 349 89% 60%;
158
158
  --timeline-indicator-rose-foreground: 0 0% 100%;
159
159
 
160
- --layout-grid-line: var(--border);
161
- --layout-grid-line-opacity: 0.18;
162
- --layout-grid-dot-opacity: 0.22;
163
-
164
- --overlay-backdrop: 240 10% 3.9% / 0.5;
165
- --overlay-backdrop-strong: 240 10% 3.9% / 0.4;
160
+ /* --layout-grid-line is defined per-mode in base/tokens.css and per-neutral
161
+ * by the generated theme-neutral CSS, so the surface grid keeps constant
162
+ * contrast across every neutral — not just base. Opacity is the global
163
+ * visibility knob shared by all grid surfaces:
164
+ * --layout-grid-line-opacity the `grid` + `honeycomb` surfaces
165
+ * (multi-axis patterns)
166
+ * --layout-grid-dot-opacity → `line-vertical` / `line-horizontal`
167
+ * (single-axis rules)
168
+ * The multi-axis patterns are denser so they sit a step below the
169
+ * single-axis lines. Raised from 0.18/0.22 so the pattern actually reads
170
+ * on-screen against the ~16-point line/background lightness gap. */
171
+ --layout-grid-line-opacity: 0.4;
172
+ --layout-grid-dot-opacity: 0.5;
173
+
174
+ /* `grid` surface line color. DEFAULT (fallback) = the neutral --layout-grid-line
175
+ * at --layout-grid-line-opacity (unchanged behavior). Where CSS relative color
176
+ * is supported it's overridden below to FOLLOW THE ACCENT: accent hue+saturation
177
+ * (from --accent-foreground) at the grid's own lightness (82% light / 24% dark,
178
+ * pinned so brightness stays put — grayscale in the base theme, tinted under a
179
+ * color theme). Only the `grid` surface uses this; honeycomb/line-* stay neutral. */
180
+ --layout-grid-color: hsl(var(--layout-grid-line) / var(--layout-grid-line-opacity));
181
+
182
+ /* `grid-line` surface — global faintness of its accent-tinted glow (accent hue
183
+ * from --accent-foreground at lightness --layout-grid-highlight-l, composed in
184
+ * base/components.css). Per-element alpha (faint base grid, faint cell fills,
185
+ * bright glow squares) is baked into the SVG mask, so this multiplies it: lower
186
+ * for a quieter surface, raise for a more assertive glow. */
187
+ --layout-grid-highlight-opacity: 0.55;
188
+
189
+ /* `grid-line` frame border opacity. The square layout frame borders with the
190
+ * accent color (--accent-foreground — the STRONG member of the accent family,
191
+ * so it follows the active theme-color and inverts dark-on-light / light-on-
192
+ * dark). Now that the SURFACE also tints with the accent, the border was too
193
+ * strong — toned down to 0.484, but kept ABOVE the surface's strongest line
194
+ * (≈ --layout-grid-highlight-opacity 0.55 × the brightest baked stroke 0.9 ≈
195
+ * 0.5) so the layout edge still reads as the strongest line. */
196
+ --layout-grid-line-border-opacity: 0.484;
197
+
198
+ /* border-rail appearance — color, opacity, and THICKNESS of the layout's rail
199
+ * lines AND its frame border (all read these). Color/opacity follow the ACCENT
200
+ * (--accent-foreground) globally, so every border-rail layout picks up the
201
+ * active theme-color and reads bright, not the soft neutral --border.
202
+ * --accent-foreground inverts dark-on-light / light-on-dark automatically.
203
+ * --layout-rail-width is the single thickness knob for the layout rails. */
204
+ --layout-rail-color: var(--accent-foreground);
205
+ --layout-rail-opacity: 0.9;
206
+ --layout-rail-width: 1.21px;
207
+
208
+ /* `matrix` surface — a scattered binary (0/1) field tinted with the brand
209
+ * --primary accent (not the neutral --layout-grid-line), so it reads as a soft
210
+ * "digital" signature that recolors with the active theme. Two knobs:
211
+ * --layout-matrix-opacity → global faintness of the field. Per-glyph opacity
212
+ * is baked into the SVG mask, so this multiplies it;
213
+ * toned down for dark mode in base/tokens.css so the
214
+ * inverted (near-white) accent never shouts.
215
+ * --layout-matrix-size → the SVG tile period (square). Larger = sparser.
216
+ * --layout-matrix-glow-opacity → brightness of the sparse edge-glow accents
217
+ * (the `::after` lit digits). Sits ABOVE the field
218
+ * opacity so the ~10% lit digits read as a glow;
219
+ * raised in dark mode (base/tokens.css) so the
220
+ * inverted accent actually blooms. */
221
+ --layout-matrix-opacity: 0.26;
222
+ --layout-matrix-size: 240px;
223
+
224
+ /* `circuit` surface — a tileable PCB / circuit-board texture drawn as two
225
+ * mask layers (base/components.css). Two faintness knobs, one per layer:
226
+ * --layout-circuit-opacity → the neutral copper TRACES (--layout-grid-line).
227
+ * Per-trace alpha (ghost/trace/trunk) is baked
228
+ * into the SVG, so this multiplies it. Sits in
229
+ * the dense multi-axis tier (like `honeycomb`),
230
+ * so it matches --layout-grid-line-opacity.
231
+ * --layout-circuit-node-opacity → the accent via NODES / pads (--primary).
232
+ * Toned down for dark mode in base/tokens.css
233
+ * (the inverted near-white accent blooms). Kept
234
+ * a touch above the trace tier so the sparse
235
+ * nodes read as quiet glints, not noise. */
236
+ --layout-circuit-opacity: 0.4;
237
+ --layout-circuit-node-opacity: 0.5;
238
+ --layout-matrix-glow-opacity: 0.55;
239
+
240
+ --overlay-backdrop: 0 0% 3.9% / 0.5;
241
+ --overlay-backdrop-strong: 0 0% 3.9% / 0.4;
166
242
 
167
243
  --editor-highlight: 48 96% 80%;
168
244
 
@@ -184,43 +260,28 @@
184
260
  --theme-shadow-xl: var(--shadow-xl-base);
185
261
  }
186
262
 
263
+ /* `grid` surface accent tint — applied only where CSS relative color is
264
+ * supported (otherwise the neutral fallback set on :root above stands). Follows
265
+ * the accent hue+saturation (from --accent-foreground) at the grid's own
266
+ * lightness (--layout-grid-l, per-mode), so brightness is unchanged while the
267
+ * tint tracks the theme-color. --layout-grid-l is per-mode, so this single rule
268
+ * covers light + dark. */
269
+ @supports (color: hsl(from white h s l)) {
270
+ :root {
271
+ --layout-grid-color: hsl(
272
+ from hsl(var(--accent-foreground)) h s var(--layout-grid-l) /
273
+ var(--layout-grid-line-opacity)
274
+ );
275
+ }
276
+ }
277
+
187
278
  :root,
188
279
  [data-mode='light'] {
189
280
  color-scheme: light;
190
-
191
- --background: 0 0% 100%;
192
- --foreground: 240 10% 3.9%;
193
-
194
- --card: 0 0% 100%;
195
- --card-foreground: 240 10% 3.9%;
196
-
197
- --popover: 0 0% 100%;
198
- --popover-foreground: 240 10% 3.9%;
199
-
200
- --muted: 240 4.8% 95.9%;
201
- --muted-foreground: 240 3.8% 46.1%;
202
-
203
- --border: 240 5.9% 90%;
204
- --input: 240 5.9% 90%;
205
281
  }
206
282
 
207
283
  [data-mode='dark'] {
208
284
  color-scheme: dark;
209
-
210
- --background: 240 10% 3.9%;
211
- --foreground: 0 0% 98%;
212
-
213
- --card: 240 10% 3.9%;
214
- --card-foreground: 0 0% 98%;
215
-
216
- --popover: 240 10% 3.9%;
217
- --popover-foreground: 0 0% 98%;
218
-
219
- --muted: 240 3.7% 15.9%;
220
- --muted-foreground: 240 5% 64.9%;
221
-
222
- --border: 240 3.7% 15.9%;
223
- --input: 240 3.7% 15.9%;
224
285
  }
225
286
  }
226
287
 
@@ -238,11 +299,17 @@
238
299
  --info: 217 91% 60%;
239
300
  --info-foreground: 0 0% 100%;
240
301
 
302
+ /*
303
+ * Chart series palette. --chart-1 follows the selected accent (--primary)
304
+ * so the primary series always reflects the picked theme color; --chart-2..5
305
+ * mirror the shadcn/ui chart palette for distinguishable supporting series.
306
+ * Each stays overridable per-theme via the --theme-chart-* hook.
307
+ */
241
308
  --chart-1: var(--theme-chart-1, var(--primary));
242
- --chart-2: var(--theme-chart-2, var(--accent-foreground));
243
- --chart-3: var(--theme-chart-3, 271 81% 56%);
244
- --chart-4: var(--theme-chart-4, 38 92% 50%);
245
- --chart-5: var(--theme-chart-5, 355 78% 56%);
309
+ --chart-2: var(--theme-chart-2, 173 58% 39%);
310
+ --chart-3: var(--theme-chart-3, 197 37% 24%);
311
+ --chart-4: var(--theme-chart-4, 43 74% 66%);
312
+ --chart-5: var(--theme-chart-5, 27 87% 67%);
246
313
 
247
314
  --sidebar: var(--card);
248
315
  --sidebar-background: var(--sidebar);
@@ -273,10 +340,11 @@
273
340
 
274
341
  --editor-highlight: 48 70% 30%;
275
342
 
343
+ /* Chart palette (dark) — --chart-1 follows --primary; rest track shadcn/ui. */
276
344
  --chart-1: var(--theme-chart-1, var(--primary));
277
- --chart-2: var(--theme-chart-2, var(--accent-foreground));
278
- --chart-3: var(--theme-chart-3, 271 85% 70%);
279
- --chart-4: var(--theme-chart-4, 38 96% 62%);
280
- --chart-5: var(--theme-chart-5, 355 82% 68%);
345
+ --chart-2: var(--theme-chart-2, 160 60% 45%);
346
+ --chart-3: var(--theme-chart-3, 30 80% 55%);
347
+ --chart-4: var(--theme-chart-4, 280 65% 60%);
348
+ --chart-5: var(--theme-chart-5, 340 75% 55%);
281
349
  }
282
350
  }
@@ -7,39 +7,57 @@
7
7
  --highlight-border-alpha: 0.7;
8
8
  --highlight-background-alpha: 0.7;
9
9
 
10
- --background: 210 38% 98%;
10
+ --background: 0 0% 98%;
11
11
  --surface: 0 0% 89.8%;
12
- --surface-foreground: 211 56% 12%;
13
- --foreground: 211 56% 12%;
12
+ --surface-foreground: 0 0% 12%;
13
+ --foreground: 0 0% 12%;
14
14
 
15
15
  --card: 0 0% 100%;
16
- --card-foreground: 211 56% 12%;
16
+ --card-foreground: 0 0% 12%;
17
17
 
18
18
  --popover: 0 0% 100%;
19
- --popover-foreground: 211 56% 12%;
20
-
21
- --muted: 211 34% 94%;
22
- --muted-foreground: 211 24% 38%;
23
-
24
- --border: 211 28% 82%;
25
- --input: 211 28% 82%;
19
+ --popover-foreground: 0 0% 12%;
20
+
21
+ --muted: 0 0% 94%;
22
+ --muted-foreground: 0 0% 38%;
23
+
24
+ --border: 0 0% 82%;
25
+ --input: 0 0% 82%;
26
+
27
+ /* Surface-grid line for the base neutral. Explicit (not var(--border)) so the
28
+ * grid keeps the same ~16-point lightness gap vs --background that every
29
+ * generated neutral targets — base is no longer a special case. */
30
+ --layout-grid-line: 0 0% 82%;
31
+ /* LIGHTNESS of the `grid` surface lines — used to pin lightness when the grid
32
+ * follows the accent (see --layout-grid-color in base/theme.css), so the tint
33
+ * tracks the theme-color while brightness stays at the current ~82% (light). */
34
+ --layout-grid-l: 82%;
35
+
36
+ /* `grid-line` surface highlight LIGHTNESS. The glow now FOLLOWS the accent:
37
+ * the surface paints with the accent hue+saturation (from --accent-foreground,
38
+ * via CSS relative color in base/components.css) but pins lightness to this
39
+ * value, so the brightness stays exactly as before while the tint tracks the
40
+ * active theme-color. Medium-dark in light mode so the mosaic reads as soft
41
+ * darker lines on a light surface; inverts to near-white in dark (dark block).
42
+ * Global faintness lives in --layout-grid-highlight-opacity (base/theme.css). */
43
+ --layout-grid-highlight-l: 45%;
26
44
 
27
45
  /* Base accent = near-black neutral (FluxUI "base"); inverts to near-white in
28
46
  * dark mode (see :root[data-mode='dark'] below). Accent palettes
29
47
  * (theme-color) override these at higher specificity. */
30
- --primary: 240 6% 10%;
48
+ --primary: 0 0% 10%;
31
49
  --primary-foreground: 0 0% 100%;
32
- --accent: 210 30% 95%;
33
- --accent-foreground: 222 20% 14%;
34
- --secondary: 210 24% 95%;
35
- --secondary-foreground: 222 20% 18%;
36
- --ring: 222 18% 16%;
50
+ --accent: 0 0% 95%;
51
+ --accent-foreground: 0 0% 14%;
52
+ --secondary: 0 0% 95%;
53
+ --secondary-foreground: 0 0% 18%;
54
+ --ring: 0 0% 16%;
37
55
 
38
56
  /* Brand identity color — set by the consumer via ThemeBrandService
39
57
  * (provideUiTheme({ brand }) or setBrand()). Concrete (not var(--primary))
40
58
  * so the theme-color='brand' preset never forms a var() cycle. Defaults to
41
59
  * the base accent and inverts in dark mode. */
42
- --brand: 240 6% 10%;
60
+ --brand: 0 0% 10%;
43
61
  --brand-foreground: 0 0% 100%;
44
62
 
45
63
  --radius-base: 0.625rem;
@@ -53,17 +71,17 @@
53
71
  * --shadow-* — the Tailwind @theme mapping re-emits
54
72
  * --shadow-*: var(--theme-shadow-*) in the later `theme` layer, which
55
73
  * turns that into a var() cycle and invalidates both tokens. */
56
- --shadow-base: 0 1px 0 0 hsl(211 95% 12% / 0.08);
57
- --shadow-md-base: 0 8px 18px -14px hsl(211 95% 12% / 0.24);
58
- --shadow-lg-base: 0 18px 36px -28px hsl(211 95% 12% / 0.34);
59
- --shadow-xl-base: 0 24px 48px -36px hsl(211 95% 12% / 0.4);
74
+ --shadow-base: 0 1px 0 0 hsl(0 0% 12% / 0.08);
75
+ --shadow-md-base: 0 8px 18px -14px hsl(0 0% 12% / 0.24);
76
+ --shadow-lg-base: 0 18px 36px -28px hsl(0 0% 12% / 0.34);
77
+ --shadow-xl-base: 0 24px 48px -36px hsl(0 0% 12% / 0.4);
60
78
  --shadow-sm: var(--shadow-base);
61
79
  --shadow-md: var(--shadow-md-base);
62
80
  --shadow-lg: var(--shadow-lg-base);
63
81
  --shadow-xl: var(--shadow-xl-base);
64
82
 
65
83
  --theme-shadow-sm: var(--shadow-base);
66
- --theme-shadow: 0 2px 4px -2px hsl(211 95% 12% / 0.14);
84
+ --theme-shadow: 0 2px 4px -2px hsl(0 0% 12% / 0.14);
67
85
  --theme-shadow-md: var(--shadow-md-base);
68
86
  --theme-shadow-lg: var(--shadow-lg-base);
69
87
  --theme-shadow-xl: var(--shadow-xl-base);
@@ -80,21 +98,28 @@
80
98
  --line-height-base: 1.5;
81
99
  --control-height-base: 2.25rem;
82
100
  --nav-font-family: var(--font-sans);
83
- --nav-text-size: calc(var(--text-base) - 0.125rem);
84
- --nav-text-line-height: var(--text-base--line-height);
101
+ /* Item labels — the nav baseline tier (14px, snug line-height). */
102
+ --nav-text-size: var(--text-sm);
103
+ --nav-text-line-height: var(--text-sm--line-height);
85
104
  --nav-heading-font-family: var(--font-sans);
86
- --nav-heading-size: var(--text-sm);
87
- --nav-heading-line-height: var(--text-sm--line-height);
105
+ /* Section/group headings — a distinct micro-label tier *below* item labels:
106
+ * smaller (11px), uppercase, heavier weight, restrained tracking. Keeping it
107
+ * smaller than --nav-text-size is what gives the sidebar a clear hierarchy. */
108
+ --nav-heading-size: var(--text-2xs-plus);
109
+ --nav-heading-line-height: var(--text-2xs-plus--line-height);
88
110
  --nav-heading-weight: 600;
89
- --nav-heading-letter-spacing: 0.12em;
111
+ --nav-heading-letter-spacing: 0.08em;
90
112
  --nav-badge-font-family: var(--font-sans);
91
- --nav-badge-size: var(--text-sm);
92
- --nav-badge-line-height: var(--text-sm--line-height);
113
+ /* Badges/counters — compact pill tier (11px), aligned with the heading tier. */
114
+ --nav-badge-size: var(--text-2xs-plus);
115
+ --nav-badge-line-height: var(--text-2xs-plus--line-height);
93
116
  --nav-badge-weight: 500;
94
117
  --letter-spacing: 0;
95
118
  --spacing-base: 0.25rem;
96
119
  --space-unit: var(--spacing-base);
97
- --layout-topbar-height: 3.25rem;
120
+ /* Matches the actual shell bar height (h-12 = 3rem) used by the navigation
121
+ * header/footer/navbar and page header/footer. */
122
+ --layout-topbar-height: 3rem;
98
123
 
99
124
  --layout-shell-padding: clamp(1rem, 2vw, 2rem);
100
125
  --layout-frame-radius: var(--radius-lg);
@@ -114,36 +139,61 @@
114
139
  --highlight-border-alpha: 0.45;
115
140
  --highlight-background-alpha: 0.55;
116
141
 
117
- --background: 211 38% 9%;
118
- --surface: 211 22% 18%;
119
- --surface-foreground: 210 40% 96%;
120
- --foreground: 210 40% 96%;
142
+ --background: 0 0% 9%;
143
+ --surface: 0 0% 18%;
144
+ --surface-foreground: 0 0% 96%;
145
+ --foreground: 0 0% 96%;
146
+
147
+ --card: 0 0% 11%;
148
+ --card-foreground: 0 0% 96%;
149
+
150
+ --popover: 0 0% 11%;
151
+ --popover-foreground: 0 0% 96%;
152
+
153
+ --muted: 0 0% 18%;
154
+ --muted-foreground: 0 0% 70%;
155
+
156
+ --border: 0 0% 24%;
157
+ --input: 0 0% 24%;
121
158
 
122
- --card: 211 34% 11%;
123
- --card-foreground: 210 40% 96%;
159
+ /* Surface-grid line for the base neutral (dark). See light block. */
160
+ --layout-grid-line: 0 0% 24%;
161
+ /* `grid` surface line lightness (dark) — see light block. */
162
+ --layout-grid-l: 24%;
124
163
 
125
- --popover: 211 34% 11%;
126
- --popover-foreground: 210 40% 96%;
164
+ /* `grid-line` highlight lightness inverts to near-white so the glow squares
165
+ * read bright on the dark surface, matching the dark mosaic reference; the
166
+ * accent hue is mixed in via relative color (see light block). */
167
+ --layout-grid-highlight-l: 88%;
127
168
 
128
- --muted: 211 22% 18%;
129
- --muted-foreground: 211 18% 70%;
169
+ /* `matrix` is tinted with --primary, which inverts to near-white on dark
170
+ * so tone the field down here to keep it as faint behind content as it is in
171
+ * light mode (see --layout-matrix-opacity in base/theme.css). The edge-glow
172
+ * accents are raised instead: near-white on near-black actually blooms, so the
173
+ * lit digits read as a glow against the dark surface. */
174
+ --layout-matrix-opacity: 0.19;
175
+ --layout-matrix-glow-opacity: 0.7;
130
176
 
131
- --border: 211 24% 24%;
132
- --input: 211 24% 24%;
177
+ /* `circuit` via nodes are tinted with --primary, which inverts to near-white
178
+ * on dark and blooms — so tone the node layer down here to keep the glints as
179
+ * quiet as they are in light mode (same treatment as --layout-matrix-opacity).
180
+ * The neutral traces use --layout-grid-line (already per-mode), so they need
181
+ * no dark override. */
182
+ --layout-circuit-node-opacity: 0.4;
133
183
 
134
184
  /* Base accent inverts: near-white primary on dark. */
135
185
  --primary: 0 0% 98%;
136
- --primary-foreground: 222 20% 12%;
137
- --accent: 211 40% 16%;
186
+ --primary-foreground: 0 0% 12%;
187
+ --accent: 0 0% 16%;
138
188
  --accent-foreground: 0 0% 98%;
139
- --secondary: 211 24% 18%;
189
+ --secondary: 0 0% 18%;
140
190
  --secondary-foreground: 0 0% 96%;
141
191
  --ring: 0 0% 85%;
142
192
 
143
193
  --brand: 0 0% 98%;
144
- --brand-foreground: 222 20% 12%;
194
+ --brand-foreground: 0 0% 12%;
145
195
 
146
- --shadow-base: 0 1px 0 0 hsl(210 40% 96% / 0.08);
196
+ --shadow-base: 0 1px 0 0 hsl(0 0% 96% / 0.08);
147
197
  --shadow-sm: var(--shadow-base);
148
198
  --theme-shadow-sm: var(--shadow-base);
149
199
 
@@ -15,6 +15,7 @@
15
15
  --muted-foreground: 38 18% 40%;
16
16
  --border: 38 28% 87%;
17
17
  --input: 38 28% 87%;
18
+ --layout-grid-line: 38 28% 82%;
18
19
  --primary: 38 92% 48%;
19
20
  --primary-foreground: 0 0% 12%;
20
21
  --accent: 38 55% 94%;
@@ -38,6 +39,7 @@
38
39
  --muted-foreground: 38 18% 64%;
39
40
  --border: 38 23% 18%;
40
41
  --input: 38 23% 18%;
42
+ --layout-grid-line: 38 23% 23%;
41
43
  --primary: 38 92% 58%;
42
44
  --primary-foreground: 0 0% 10%;
43
45
  --accent: 38 46% 18%;
@@ -15,6 +15,7 @@
15
15
  --muted-foreground: 221 17% 40%;
16
16
  --border: 221 25% 87%;
17
17
  --input: 221 25% 87%;
18
+ --layout-grid-line: 221 25% 82%;
18
19
  --primary: 221 83% 48%;
19
20
  --primary-foreground: 0 0% 100%;
20
21
  --accent: 221 50% 94%;
@@ -38,6 +39,7 @@
38
39
  --muted-foreground: 221 17% 64%;
39
40
  --border: 221 21% 18%;
40
41
  --input: 221 21% 18%;
42
+ --layout-grid-line: 221 21% 23%;
41
43
  --primary: 221 83% 58%;
42
44
  --primary-foreground: 0 0% 100%;
43
45
  --accent: 221 42% 18%;
@@ -15,6 +15,7 @@
15
15
  --muted-foreground: 191 17% 40%;
16
16
  --border: 191 26% 87%;
17
17
  --input: 191 26% 87%;
18
+ --layout-grid-line: 191 26% 82%;
18
19
  --primary: 191 85% 48%;
19
20
  --primary-foreground: 0 0% 100%;
20
21
  --accent: 191 51% 94%;
@@ -38,6 +39,7 @@
38
39
  --muted-foreground: 191 17% 64%;
39
40
  --border: 191 21% 18%;
40
41
  --input: 191 21% 18%;
42
+ --layout-grid-line: 191 21% 23%;
41
43
  --primary: 191 85% 58%;
42
44
  --primary-foreground: 0 0% 100%;
43
45
  --accent: 191 43% 18%;
@@ -15,6 +15,7 @@
15
15
  --muted-foreground: 160 16% 40%;
16
16
  --border: 160 23% 87%;
17
17
  --input: 160 23% 87%;
18
+ --layout-grid-line: 160 23% 82%;
18
19
  --primary: 160 78% 48%;
19
20
  --primary-foreground: 0 0% 100%;
20
21
  --accent: 160 47% 94%;
@@ -38,6 +39,7 @@
38
39
  --muted-foreground: 160 16% 64%;
39
40
  --border: 160 20% 18%;
40
41
  --input: 160 20% 18%;
42
+ --layout-grid-line: 160 20% 23%;
41
43
  --primary: 160 78% 58%;
42
44
  --primary-foreground: 0 0% 100%;
43
45
  --accent: 160 39% 18%;
@@ -15,6 +15,7 @@
15
15
  --muted-foreground: 292 16% 40%;
16
16
  --border: 292 24% 87%;
17
17
  --input: 292 24% 87%;
18
+ --layout-grid-line: 292 24% 82%;
18
19
  --primary: 292 80% 48%;
19
20
  --primary-foreground: 0 0% 100%;
20
21
  --accent: 292 48% 94%;
@@ -38,6 +39,7 @@
38
39
  --muted-foreground: 292 16% 64%;
39
40
  --border: 292 20% 18%;
40
41
  --input: 292 20% 18%;
42
+ --layout-grid-line: 292 20% 23%;
41
43
  --primary: 292 80% 58%;
42
44
  --primary-foreground: 0 0% 100%;
43
45
  --accent: 292 40% 18%;
@@ -15,6 +15,7 @@
15
15
  --muted-foreground: 142 14% 40%;
16
16
  --border: 142 21% 87%;
17
17
  --input: 142 21% 87%;
18
+ --layout-grid-line: 142 21% 82%;
18
19
  --primary: 142 69% 48%;
19
20
  --primary-foreground: 0 0% 100%;
20
21
  --accent: 142 41% 94%;
@@ -38,6 +39,7 @@
38
39
  --muted-foreground: 142 14% 64%;
39
40
  --border: 142 17% 18%;
40
41
  --input: 142 17% 18%;
42
+ --layout-grid-line: 142 17% 23%;
41
43
  --primary: 142 69% 58%;
42
44
  --primary-foreground: 0 0% 100%;
43
45
  --accent: 142 35% 18%;
@@ -15,6 +15,7 @@
15
15
  --muted-foreground: 239 16% 40%;
16
16
  --border: 239 23% 87%;
17
17
  --input: 239 23% 87%;
18
+ --layout-grid-line: 239 23% 82%;
18
19
  --primary: 239 78% 48%;
19
20
  --primary-foreground: 0 0% 100%;
20
21
  --accent: 239 47% 94%;
@@ -38,6 +39,7 @@
38
39
  --muted-foreground: 239 16% 64%;
39
40
  --border: 239 20% 18%;
40
41
  --input: 239 20% 18%;
42
+ --layout-grid-line: 239 20% 23%;
41
43
  --primary: 239 78% 58%;
42
44
  --primary-foreground: 0 0% 100%;
43
45
  --accent: 239 39% 18%;
@@ -15,6 +15,7 @@
15
15
  --muted-foreground: 84 16% 40%;
16
16
  --border: 84 23% 87%;
17
17
  --input: 84 23% 87%;
18
+ --layout-grid-line: 84 23% 82%;
18
19
  --primary: 84 78% 48%;
19
20
  --primary-foreground: 0 0% 12%;
20
21
  --accent: 84 47% 94%;
@@ -38,6 +39,7 @@
38
39
  --muted-foreground: 84 16% 64%;
39
40
  --border: 84 20% 18%;
40
41
  --input: 84 20% 18%;
42
+ --layout-grid-line: 84 20% 23%;
41
43
  --primary: 84 78% 58%;
42
44
  --primary-foreground: 0 0% 10%;
43
45
  --accent: 84 39% 18%;
@@ -15,6 +15,7 @@
15
15
  --muted-foreground: 24 19% 40%;
16
16
  --border: 24 29% 87%;
17
17
  --input: 24 29% 87%;
18
+ --layout-grid-line: 24 29% 82%;
18
19
  --primary: 24 95% 48%;
19
20
  --primary-foreground: 0 0% 100%;
20
21
  --accent: 24 57% 94%;
@@ -38,6 +39,7 @@
38
39
  --muted-foreground: 24 19% 64%;
39
40
  --border: 24 24% 18%;
40
41
  --input: 24 24% 18%;
42
+ --layout-grid-line: 24 24% 23%;
41
43
  --primary: 24 95% 58%;
42
44
  --primary-foreground: 0 0% 100%;
43
45
  --accent: 24 48% 18%;
@@ -15,6 +15,7 @@
15
15
  --muted-foreground: 330 16% 40%;
16
16
  --border: 330 23% 87%;
17
17
  --input: 330 23% 87%;
18
+ --layout-grid-line: 330 23% 82%;
18
19
  --primary: 330 78% 48%;
19
20
  --primary-foreground: 0 0% 100%;
20
21
  --accent: 330 47% 94%;
@@ -38,6 +39,7 @@
38
39
  --muted-foreground: 330 16% 64%;
39
40
  --border: 330 20% 18%;
40
41
  --input: 330 20% 18%;
42
+ --layout-grid-line: 330 20% 23%;
41
43
  --primary: 330 78% 58%;
42
44
  --primary-foreground: 0 0% 100%;
43
45
  --accent: 330 39% 18%;
@@ -15,6 +15,7 @@
15
15
  --muted-foreground: 271 16% 40%;
16
16
  --border: 271 24% 87%;
17
17
  --input: 271 24% 87%;
18
+ --layout-grid-line: 271 24% 82%;
18
19
  --primary: 271 81% 48%;
19
20
  --primary-foreground: 0 0% 100%;
20
21
  --accent: 271 49% 94%;
@@ -38,6 +39,7 @@
38
39
  --muted-foreground: 271 16% 64%;
39
40
  --border: 271 20% 18%;
40
41
  --input: 271 20% 18%;
42
+ --layout-grid-line: 271 20% 23%;
41
43
  --primary: 271 81% 58%;
42
44
  --primary-foreground: 0 0% 100%;
43
45
  --accent: 271 41% 18%;
@@ -15,6 +15,7 @@
15
15
  --muted-foreground: 0 14% 40%;
16
16
  --border: 0 22% 87%;
17
17
  --input: 0 22% 87%;
18
+ --layout-grid-line: 0 22% 82%;
18
19
  --primary: 0 72% 48%;
19
20
  --primary-foreground: 0 0% 100%;
20
21
  --accent: 0 43% 94%;
@@ -38,6 +39,7 @@
38
39
  --muted-foreground: 0 14% 64%;
39
40
  --border: 0 18% 18%;
40
41
  --input: 0 18% 18%;
42
+ --layout-grid-line: 0 18% 23%;
41
43
  --primary: 0 72% 58%;
42
44
  --primary-foreground: 0 0% 100%;
43
45
  --accent: 0 36% 18%;
@@ -15,6 +15,7 @@
15
15
  --muted-foreground: 349 17% 40%;
16
16
  --border: 349 25% 87%;
17
17
  --input: 349 25% 87%;
18
+ --layout-grid-line: 349 25% 82%;
18
19
  --primary: 349 84% 48%;
19
20
  --primary-foreground: 0 0% 100%;
20
21
  --accent: 349 50% 94%;
@@ -38,6 +39,7 @@
38
39
  --muted-foreground: 349 17% 64%;
39
40
  --border: 349 21% 18%;
40
41
  --input: 349 21% 18%;
42
+ --layout-grid-line: 349 21% 23%;
41
43
  --primary: 349 84% 58%;
42
44
  --primary-foreground: 0 0% 100%;
43
45
  --accent: 349 42% 18%;
@@ -15,6 +15,7 @@
15
15
  --muted-foreground: 199 18% 40%;
16
16
  --border: 199 27% 87%;
17
17
  --input: 199 27% 87%;
18
+ --layout-grid-line: 199 27% 82%;
18
19
  --primary: 199 89% 48%;
19
20
  --primary-foreground: 0 0% 100%;
20
21
  --accent: 199 53% 94%;
@@ -38,6 +39,7 @@
38
39
  --muted-foreground: 199 18% 64%;
39
40
  --border: 199 22% 18%;
40
41
  --input: 199 22% 18%;
42
+ --layout-grid-line: 199 22% 23%;
41
43
  --primary: 199 89% 58%;
42
44
  --primary-foreground: 0 0% 100%;
43
45
  --accent: 199 45% 18%;