@dixy-ui/themes 0.1.0-beta.3 → 0.1.0-beta.5

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 (92) hide show
  1. package/README.md +3 -3
  2. package/dist/ansi-panes.css +75 -8
  3. package/dist/arcade/ornament.d.ts +3 -0
  4. package/dist/arcade/ornament.js +8 -0
  5. package/dist/arcade-cabinet.css +1084 -0
  6. package/dist/art-deco.css +75 -8
  7. package/dist/atomic-lounge.css +79 -8
  8. package/dist/authoring.d.ts +8 -8
  9. package/dist/azulejo-tile.css +79 -8
  10. package/dist/blueprint.css +75 -8
  11. package/dist/brutalist-concrete.css +80 -9
  12. package/dist/bytes.json +97 -62
  13. package/dist/candy-clay.css +81 -8
  14. package/dist/catalog.d.ts +294 -0
  15. package/dist/catalog.js +301 -0
  16. package/dist/character.d.ts +1 -1
  17. package/dist/character.js +6 -0
  18. package/dist/chrome.js +13 -3
  19. package/dist/compile-css.js +27 -7
  20. package/dist/dispatch.css +729 -0
  21. package/dist/diwali-lights.css +79 -8
  22. package/dist/documents.d.ts +115 -7
  23. package/dist/documents.js +10 -2
  24. package/dist/foundations.d.ts +8 -0
  25. package/dist/foundations.js +10 -0
  26. package/dist/frame-styles.d.ts +3 -0
  27. package/dist/frame-styles.js +6 -0
  28. package/dist/freighter.css +141 -18
  29. package/dist/glass-ui.css +75 -8
  30. package/dist/holi-colours.css +79 -8
  31. package/dist/ledger.css +564 -0
  32. package/dist/living-forest.css +81 -8
  33. package/dist/mainframe.css +762 -0
  34. package/dist/manifests.d.ts +144 -144
  35. package/dist/material-light.css +79 -8
  36. package/dist/neon-night-market.css +79 -8
  37. package/dist/ocean-depths.css +81 -8
  38. package/dist/orbital-hud.css +141 -18
  39. package/dist/organic-paint-launch.d.ts +9 -0
  40. package/dist/organic-paint-launch.js +121 -46
  41. package/dist/organic-paint.d.ts +1 -1
  42. package/dist/organic-settings.d.ts +109 -25
  43. package/dist/organic-settings.js +49 -0
  44. package/dist/papel-picado.css +79 -8
  45. package/dist/phosphor-terminal.css +79 -8
  46. package/dist/prism-glass.css +75 -8
  47. package/dist/recipes.d.ts +162 -0
  48. package/dist/recipes.js +164 -0
  49. package/dist/resolve.d.ts +18 -2
  50. package/dist/retro-os.css +75 -8
  51. package/dist/riso-zine.css +75 -8
  52. package/dist/save-point.css +946 -0
  53. package/dist/savepoint/ornament.d.ts +3 -0
  54. package/dist/savepoint/ornament.js +8 -0
  55. package/dist/scrapbook.css +75 -8
  56. package/dist/signal.css +561 -0
  57. package/dist/skins/arcade-cabinet.d.ts +68 -0
  58. package/dist/skins/arcade-cabinet.js +68 -0
  59. package/dist/skins/dispatch.d.ts +57 -0
  60. package/dist/skins/dispatch.js +57 -0
  61. package/dist/skins/ledger.d.ts +57 -0
  62. package/dist/skins/ledger.js +57 -0
  63. package/dist/skins/mainframe.d.ts +57 -0
  64. package/dist/skins/mainframe.js +57 -0
  65. package/dist/skins/save-point.d.ts +68 -0
  66. package/dist/skins/save-point.js +68 -0
  67. package/dist/skins/signal.d.ts +57 -0
  68. package/dist/skins/signal.js +57 -0
  69. package/dist/skins/sunset-drive.d.ts +68 -0
  70. package/dist/skins/sunset-drive.js +68 -0
  71. package/dist/solar-sail.css +75 -8
  72. package/dist/starters-launch.d.ts +24 -0
  73. package/dist/starters-launch.js +343 -0
  74. package/dist/studio-hardware.css +79 -8
  75. package/dist/sumi-ink.css +75 -8
  76. package/dist/sunset/ornament.d.ts +3 -0
  77. package/dist/sunset/ornament.js +8 -0
  78. package/dist/sunset-drive.css +1022 -0
  79. package/dist/swiss-poster.css +145 -18
  80. package/dist/tactile-atelier.css +81 -8
  81. package/dist/theme-document.schema.json +34 -6
  82. package/dist/theme-fix.d.ts +11 -0
  83. package/dist/theme-fix.js +32 -0
  84. package/dist/theme-fixes.d.ts +2 -0
  85. package/dist/theme-fixes.js +1 -0
  86. package/dist/theme-schema.d.ts +6 -6
  87. package/dist/theme-schema.js +2 -0
  88. package/dist/tokyo-transit.css +79 -8
  89. package/dist/winamp-signal.css +79 -8
  90. package/dist/y2k-titanium.css +147 -18
  91. package/dist/yule-knit.css +75 -8
  92. package/package.json +50 -3
@@ -29,6 +29,11 @@
29
29
  --dixy-font-title-sm-family:
30
30
  "Archivo Black", "Arial Black", ui-sans-serif, sans-serif;
31
31
  --dixy-skin-edge: #0d0d0d;
32
+ --dixy-skin-field-edge: color-mix(
33
+ in oklab,
34
+ var(--dixy-color-base-9) 50%,
35
+ var(--dixy-color-base-8)
36
+ );
32
37
  --dixy-organic-density: 50;
33
38
  --dixy-organic-cornerDensity: 80;
34
39
  --dixy-organic-canopyDepth: 40;
@@ -121,7 +126,6 @@
121
126
  --dixy-organic-b: #f4f4f4;
122
127
  --dixy-organic-c: #6a6a6a;
123
128
  --dixy-organic-d: #f4f4f4;
124
- --dixy-skin-selected: var(--dixy-skin-finish);
125
129
  --dixy-skin-edge: #f4f4f4;
126
130
  --dixy-skin-surface: color-mix(
127
131
  in srgb,
@@ -134,6 +138,7 @@
134
138
  #111111
135
139
  );
136
140
  }
141
+
137
142
  .dixy-theme[data-dixy-skin="dixy/swiss-poster"][data-relief="2"] {
138
143
  --dixy-skin-shadow:
139
144
  var(--dixy-skin-depth-shadow, var(--dixy-skin-authored-shadow)),
@@ -159,11 +164,9 @@
159
164
  }
160
165
  }
161
166
  @layer dixy.components {
162
- .dixy-theme[data-dixy-skin="dixy/swiss-poster"] {
167
+ .dixy-theme[data-dixy-skin="dixy/swiss-poster"]:not(.dixy-portal-scope) {
163
168
  position: relative;
164
169
  isolation: isolate;
165
- }
166
- .dixy-theme[data-dixy-skin="dixy/swiss-poster"]:not(.dixy-portal-scope) {
167
170
  background-color: var(--dixy-skin-ground);
168
171
  background-image: var(--dixy-skin-canvas);
169
172
  }
@@ -269,6 +272,30 @@
269
272
  ):not([data-variant="soft"]) {
270
273
  background-color: var(--dixy-skin-surface);
271
274
  }
275
+ :is(
276
+ .dixy-dialog-popup,
277
+ .dixy-alert-dialog-popup,
278
+ .dixy-drawer-popup,
279
+ .dixy-popover-popup,
280
+ .dixy-preview-card-popup,
281
+ .dixy-tooltip-popup,
282
+ .dixy-select-popup,
283
+ .dixy-combobox-popup,
284
+ .dixy-autocomplete-popup,
285
+ .dixy-menu-popup,
286
+ .dixy-context-menu-popup,
287
+ .dixy-navigation-menu-popup
288
+ )[data-dixy-skin="dixy/swiss-poster"]:not(
289
+ [data-dixy-material-override]
290
+ ):not(:where([data-dixy-material-override]) *):not(
291
+ [data-variant="solid"]
292
+ ):not([data-variant="soft"]) {
293
+ background-color: color-mix(
294
+ in srgb,
295
+ var(--dixy-color-background-surface-raised) 94%,
296
+ var(--dixy-skin-surface)
297
+ );
298
+ }
272
299
  :is(
273
300
  .dixy-input,
274
301
  .dixy-textarea,
@@ -301,7 +328,7 @@
301
328
  [data-dixy-material-override]
302
329
  ):not(:where([data-dixy-material-override]) *) {
303
330
  border-width: var(--dixy-input-border-width);
304
- border-color: var(--dixy-skin-edge);
331
+ border-color: var(--dixy-skin-field-edge);
305
332
  background-image: var(--dixy-skin-paint);
306
333
  background-color: var(--dixy-color-background-canvas);
307
334
  background-size:
@@ -311,6 +338,45 @@
311
338
  100% 100%;
312
339
  box-shadow: var(--dixy-skin-inset);
313
340
  }
341
+ /* materials.css styles [data-dixy-visual] surfaces at 0,5,0. Match the
342
+ skin's paint to that so its image and grain size always land together;
343
+ otherwise the material image is tiled at the grain size (stripes). */
344
+ :is(
345
+ .dixy-card,
346
+ .dixy-box,
347
+ .dixy-dialog-popup,
348
+ .dixy-alert-dialog-popup,
349
+ .dixy-drawer-popup,
350
+ .dixy-popover-popup,
351
+ .dixy-preview-card-popup,
352
+ .dixy-tooltip-popup,
353
+ .dixy-select-popup,
354
+ .dixy-combobox-popup,
355
+ .dixy-autocomplete-popup,
356
+ .dixy-menu-popup,
357
+ .dixy-context-menu-popup,
358
+ .dixy-navigation-menu-popup,
359
+ .dixy-toast-root,
360
+ .dixy-alert,
361
+ .dixy-list-box,
362
+ .dixy-calendar,
363
+ .dixy-range-calendar,
364
+ .dixy-input,
365
+ .dixy-textarea,
366
+ .dixy-native-select,
367
+ .dixy-select-trigger,
368
+ .dixy-input-group,
369
+ .dixy-combobox-input-group,
370
+ .dixy-autocomplete-input-group,
371
+ .dixy-number-field-group,
372
+ .dixy-otp-field-input
373
+ )[data-dixy-skin="dixy/swiss-poster"]:not(
374
+ [data-dixy-material-override]
375
+ ):not(
376
+ :where([data-dixy-material-override]) *
377
+ )[data-dixy-visual][data-material]:not([data-disabled]) {
378
+ background-image: var(--dixy-skin-paint);
379
+ }
314
380
  :is(.dixy-button)[data-dixy-skin="dixy/swiss-poster"]:not(
315
381
  [data-dixy-material-override]
316
382
  ):not(:where([data-dixy-material-override]) *):is(
@@ -341,14 +407,19 @@
341
407
  border: 1px solid var(--dixy-skin-edge);
342
408
  box-shadow: var(--dixy-skin-inset);
343
409
  }
410
+ /* Selected tabs and toggles are one flat colour, lifted by edge and relief only. A gradient behind the label (thumb art, sheen, material image) splits it across two colours. :not([data-variant="line"]) also outranks materials.css (0,3,0). */
344
411
  :is(.dixy-tabs-indicator)[data-dixy-skin="dixy/swiss-poster"]:not(
345
412
  [data-dixy-material-override]
346
413
  ):not(:where([data-dixy-material-override]) *) {
347
- background-image: var(--dixy-skin-finish);
348
414
  box-shadow: var(--dixy-skin-control-relief);
349
415
  border: 1px solid var(--dixy-skin-edge);
350
416
  }
351
- /* Toggle groups read like tabs: a sunken track, the selected toggle a raised thumb (slider-knob paint in light, the raised finish in dark so its label stays readable). */
417
+ :is(.dixy-tabs-indicator)[data-dixy-skin="dixy/swiss-poster"]:not(
418
+ [data-dixy-material-override]
419
+ ):not(:where([data-dixy-material-override]) *):not([data-variant="line"]) {
420
+ background-image: none;
421
+ }
422
+ /* Toggle groups read like tabs: a sunken track, the selected toggle a raised, flat thumb. */
352
423
  .dixy-theme[data-dixy-skin="dixy/swiss-poster"]
353
424
  .dixy-toggle-group:is([data-attached], [data-segmented]):not(
354
425
  [data-dixy-material-override]
@@ -363,7 +434,7 @@
363
434
  [data-variant="solid"]
364
435
  )[data-pressed]:not([data-disabled]) {
365
436
  background-color: var(--dixy-color-background-surface-raised);
366
- background-image: var(--dixy-skin-selected, var(--dixy-skin-thumb));
437
+ background-image: none;
367
438
  box-shadow: var(--dixy-skin-control-relief);
368
439
  border-color: var(--dixy-skin-edge);
369
440
  color: var(--dixy-color-text-primary);
@@ -672,16 +743,72 @@
672
743
  :is(.dixy-card, .dixy-dialog-popup)[data-dixy-skin="dixy/swiss-poster"] {
673
744
  border-radius: 0;
674
745
  --dixy-chrome-bar-radius: 0px;
675
- clip-path: polygon(
676
- 10px 0,
677
- calc(100% - 10px) 0,
678
- 100% 10px,
679
- 100% calc(100% - 10px),
680
- calc(100% - 10px) 100%,
681
- 10px 100%,
682
- 0 calc(100% - 10px),
683
- 0 10px
684
- );
746
+ }
747
+ @supports (corner-shape: bevel) {
748
+ .dixy-theme[data-dixy-skin="dixy/swiss-poster"]
749
+ :is(.dixy-card, .dixy-dialog-popup)[data-dixy-skin="dixy/swiss-poster"] {
750
+ border-radius: 10px;
751
+ corner-shape: bevel;
752
+ }
753
+ }
754
+ @supports not (corner-shape: bevel) {
755
+ .dixy-theme[data-dixy-skin="dixy/swiss-poster"]
756
+ :is(.dixy-card, .dixy-dialog-popup)[data-dixy-skin="dixy/swiss-poster"] {
757
+ clip-path: polygon(
758
+ 10px 0,
759
+ calc(100% - 10px) 0,
760
+ 100% 10px,
761
+ 100% calc(100% - 10px),
762
+ calc(100% - 10px) 100%,
763
+ 10px 100%,
764
+ 0 calc(100% - 10px),
765
+ 0 10px
766
+ );
767
+ }
768
+ .dixy-theme[data-dixy-skin="dixy/swiss-poster"]
769
+ :is(
770
+ .dixy-card,
771
+ .dixy-dialog-popup
772
+ )[data-dixy-skin="dixy/swiss-poster"]::after {
773
+ content: "";
774
+ position: absolute;
775
+ inset: calc(var(--dixy-skin-frame-width, 1px) * -1);
776
+ pointer-events: none;
777
+ z-index: 1;
778
+ background:
779
+ linear-gradient(
780
+ to bottom right,
781
+ transparent 50%,
782
+ var(--dixy-skin-edge) 50%
783
+ calc(50% + var(--dixy-skin-frame-width, 1px)),
784
+ transparent calc(50% + var(--dixy-skin-frame-width, 1px))
785
+ )
786
+ top left/10px 10px no-repeat,
787
+ linear-gradient(
788
+ to bottom left,
789
+ transparent 50%,
790
+ var(--dixy-skin-edge) 50%
791
+ calc(50% + var(--dixy-skin-frame-width, 1px)),
792
+ transparent calc(50% + var(--dixy-skin-frame-width, 1px))
793
+ )
794
+ top right/10px 10px no-repeat,
795
+ linear-gradient(
796
+ to top right,
797
+ transparent 50%,
798
+ var(--dixy-skin-edge) 50%
799
+ calc(50% + var(--dixy-skin-frame-width, 1px)),
800
+ transparent calc(50% + var(--dixy-skin-frame-width, 1px))
801
+ )
802
+ bottom left/10px 10px no-repeat,
803
+ linear-gradient(
804
+ to top left,
805
+ transparent 50%,
806
+ var(--dixy-skin-edge) 50%
807
+ calc(50% + var(--dixy-skin-frame-width, 1px)),
808
+ transparent calc(50% + var(--dixy-skin-frame-width, 1px))
809
+ )
810
+ bottom right/10px 10px no-repeat;
811
+ }
685
812
  }
686
813
 
687
814
  @supports (backdrop-filter: blur(8px)) {
@@ -40,6 +40,11 @@
40
40
  "Cormorant Garamond Variable", "Cormorant Garamond", "Garamond", ui-serif,
41
41
  Georgia, serif;
42
42
  --dixy-skin-edge: #d9cab3;
43
+ --dixy-skin-field-edge: color-mix(
44
+ in oklab,
45
+ var(--dixy-color-base-9) 50%,
46
+ var(--dixy-color-base-8)
47
+ );
43
48
 
44
49
  --dixy-skin-surface: color-mix(
45
50
  in srgb,
@@ -109,7 +114,6 @@
109
114
  --dixy-font-title-sm-weight: 500;
110
115
  }
111
116
  .dixy-theme[data-dixy-skin="dixy/tactile-atelier"][data-appearance="dark"] {
112
- --dixy-skin-selected: var(--dixy-skin-finish);
113
117
  --dixy-skin-edge: #4a3a2c;
114
118
  --dixy-skin-surface: color-mix(
115
119
  in srgb,
@@ -122,6 +126,7 @@
122
126
  #2a211a
123
127
  );
124
128
  }
129
+
125
130
  .dixy-theme[data-dixy-skin="dixy/tactile-atelier"][data-relief="2"] {
126
131
  --dixy-skin-shadow:
127
132
  var(--dixy-skin-depth-shadow, var(--dixy-skin-authored-shadow)),
@@ -160,6 +165,7 @@
160
165
  --dixy-color-brand-12: oklch(0.255 0.056999 35);
161
166
  --dixy-color-brand-pressed: oklch(0.465 0.1425 35);
162
167
  --dixy-color-brand-on-solid: oklch(1 0 0);
168
+ --dixy-color-brand-focus: oklch(0.5375 0.13175 35);
163
169
  }
164
170
  .dixy-theme[data-dixy-skin="dixy/tactile-atelier"][data-appearance="dark"] {
165
171
  --dixy-color-brand-1: oklch(0.155 0.012 35);
@@ -176,14 +182,13 @@
176
182
  --dixy-color-brand-12: oklch(0.94 0.018 35);
177
183
  --dixy-color-brand-pressed: oklch(0.685 0.113999 35);
178
184
  --dixy-color-brand-on-solid: oklch(0.13 0.005 270);
185
+ --dixy-color-brand-focus: oklch(0.585 0.12 35);
179
186
  }
180
187
  }
181
188
  @layer dixy.components {
182
- .dixy-theme[data-dixy-skin="dixy/tactile-atelier"] {
189
+ .dixy-theme[data-dixy-skin="dixy/tactile-atelier"]:not(.dixy-portal-scope) {
183
190
  position: relative;
184
191
  isolation: isolate;
185
- }
186
- .dixy-theme[data-dixy-skin="dixy/tactile-atelier"]:not(.dixy-portal-scope) {
187
192
  background-color: var(--dixy-skin-ground);
188
193
  background-image: var(--dixy-skin-canvas);
189
194
  }
@@ -289,6 +294,30 @@
289
294
  ):not([data-variant="soft"]) {
290
295
  background-color: var(--dixy-skin-surface);
291
296
  }
297
+ :is(
298
+ .dixy-dialog-popup,
299
+ .dixy-alert-dialog-popup,
300
+ .dixy-drawer-popup,
301
+ .dixy-popover-popup,
302
+ .dixy-preview-card-popup,
303
+ .dixy-tooltip-popup,
304
+ .dixy-select-popup,
305
+ .dixy-combobox-popup,
306
+ .dixy-autocomplete-popup,
307
+ .dixy-menu-popup,
308
+ .dixy-context-menu-popup,
309
+ .dixy-navigation-menu-popup
310
+ )[data-dixy-skin="dixy/tactile-atelier"]:not(
311
+ [data-dixy-material-override]
312
+ ):not(:where([data-dixy-material-override]) *):not(
313
+ [data-variant="solid"]
314
+ ):not([data-variant="soft"]) {
315
+ background-color: color-mix(
316
+ in srgb,
317
+ var(--dixy-color-background-surface-raised) 94%,
318
+ var(--dixy-skin-surface)
319
+ );
320
+ }
292
321
  :is(
293
322
  .dixy-input,
294
323
  .dixy-textarea,
@@ -321,7 +350,7 @@
321
350
  [data-dixy-material-override]
322
351
  ):not(:where([data-dixy-material-override]) *) {
323
352
  border-width: var(--dixy-input-border-width);
324
- border-color: var(--dixy-skin-edge);
353
+ border-color: var(--dixy-skin-field-edge);
325
354
  background-image: var(--dixy-skin-paint);
326
355
  background-color: var(--dixy-color-background-canvas);
327
356
  background-size:
@@ -331,6 +360,45 @@
331
360
  100% 100%;
332
361
  box-shadow: var(--dixy-skin-inset);
333
362
  }
363
+ /* materials.css styles [data-dixy-visual] surfaces at 0,5,0. Match the
364
+ skin's paint to that so its image and grain size always land together;
365
+ otherwise the material image is tiled at the grain size (stripes). */
366
+ :is(
367
+ .dixy-card,
368
+ .dixy-box,
369
+ .dixy-dialog-popup,
370
+ .dixy-alert-dialog-popup,
371
+ .dixy-drawer-popup,
372
+ .dixy-popover-popup,
373
+ .dixy-preview-card-popup,
374
+ .dixy-tooltip-popup,
375
+ .dixy-select-popup,
376
+ .dixy-combobox-popup,
377
+ .dixy-autocomplete-popup,
378
+ .dixy-menu-popup,
379
+ .dixy-context-menu-popup,
380
+ .dixy-navigation-menu-popup,
381
+ .dixy-toast-root,
382
+ .dixy-alert,
383
+ .dixy-list-box,
384
+ .dixy-calendar,
385
+ .dixy-range-calendar,
386
+ .dixy-input,
387
+ .dixy-textarea,
388
+ .dixy-native-select,
389
+ .dixy-select-trigger,
390
+ .dixy-input-group,
391
+ .dixy-combobox-input-group,
392
+ .dixy-autocomplete-input-group,
393
+ .dixy-number-field-group,
394
+ .dixy-otp-field-input
395
+ )[data-dixy-skin="dixy/tactile-atelier"]:not(
396
+ [data-dixy-material-override]
397
+ ):not(
398
+ :where([data-dixy-material-override]) *
399
+ )[data-dixy-visual][data-material]:not([data-disabled]) {
400
+ background-image: var(--dixy-skin-paint);
401
+ }
334
402
  :is(.dixy-button)[data-dixy-skin="dixy/tactile-atelier"]:not(
335
403
  [data-dixy-material-override]
336
404
  ):not(:where([data-dixy-material-override]) *):is(
@@ -361,14 +429,19 @@
361
429
  border: 1px solid var(--dixy-skin-edge);
362
430
  box-shadow: var(--dixy-skin-inset);
363
431
  }
432
+ /* Selected tabs and toggles are one flat colour, lifted by edge and relief only. A gradient behind the label (thumb art, sheen, material image) splits it across two colours. :not([data-variant="line"]) also outranks materials.css (0,3,0). */
364
433
  :is(.dixy-tabs-indicator)[data-dixy-skin="dixy/tactile-atelier"]:not(
365
434
  [data-dixy-material-override]
366
435
  ):not(:where([data-dixy-material-override]) *) {
367
- background-image: var(--dixy-skin-finish);
368
436
  box-shadow: var(--dixy-skin-control-relief);
369
437
  border: 1px solid var(--dixy-skin-edge);
370
438
  }
371
- /* Toggle groups read like tabs: a sunken track, the selected toggle a raised thumb (slider-knob paint in light, the raised finish in dark so its label stays readable). */
439
+ :is(.dixy-tabs-indicator)[data-dixy-skin="dixy/tactile-atelier"]:not(
440
+ [data-dixy-material-override]
441
+ ):not(:where([data-dixy-material-override]) *):not([data-variant="line"]) {
442
+ background-image: none;
443
+ }
444
+ /* Toggle groups read like tabs: a sunken track, the selected toggle a raised, flat thumb. */
372
445
  .dixy-theme[data-dixy-skin="dixy/tactile-atelier"]
373
446
  .dixy-toggle-group:is([data-attached], [data-segmented]):not(
374
447
  [data-dixy-material-override]
@@ -383,7 +456,7 @@
383
456
  [data-variant="solid"]
384
457
  )[data-pressed]:not([data-disabled]) {
385
458
  background-color: var(--dixy-color-background-surface-raised);
386
- background-image: var(--dixy-skin-selected, var(--dixy-skin-thumb));
459
+ background-image: none;
387
460
  box-shadow: var(--dixy-skin-control-relief);
388
461
  border-color: var(--dixy-skin-edge);
389
462
  color: var(--dixy-color-text-primary);
@@ -129,7 +129,9 @@
129
129
  "jetbrains",
130
130
  "manrope",
131
131
  "figtree",
132
- "cormorant"
132
+ "cormorant",
133
+ "plexSans",
134
+ "atkinson"
133
135
  ]
134
136
  },
135
137
  "headingFont": {
@@ -157,7 +159,9 @@
157
159
  "jetbrains",
158
160
  "manrope",
159
161
  "figtree",
160
- "cormorant"
162
+ "cormorant",
163
+ "plexSans",
164
+ "atkinson"
161
165
  ]
162
166
  },
163
167
  "border": { "enum": [1, 2] },
@@ -228,7 +232,14 @@
228
232
  "fiesta-paper",
229
233
  "powder-wash",
230
234
  "wool",
231
- "liquid-glass"
235
+ "liquid-glass",
236
+ "sunset-neon",
237
+ "ledger-ruled",
238
+ "layer-grid",
239
+ "mono-ink",
240
+ "signal-contrast",
241
+ "menu-window",
242
+ "arcade-bezel"
232
243
  ]
233
244
  },
234
245
  "version": { "enum": [1] },
@@ -343,7 +354,10 @@
343
354
  "picado",
344
355
  "gulal",
345
356
  "knit",
346
- "liquid"
357
+ "liquid",
358
+ "sunset",
359
+ "menu",
360
+ "marquee"
347
361
  ]
348
362
  },
349
363
  "version": { "enum": [1] },
@@ -455,7 +469,19 @@
455
469
  "Specular rim",
456
470
  "Refraction",
457
471
  "Light catch",
458
- "Clear"
472
+ "Clear",
473
+ "Sun and grid",
474
+ "Sun only",
475
+ "Grid only",
476
+ "Bare coast",
477
+ "Cursor and stars",
478
+ "Cursor only",
479
+ "Stars only",
480
+ "Plain window",
481
+ "Bulbs and credits",
482
+ "Bulbs only",
483
+ "Credits only",
484
+ "Dark cabinet"
459
485
  ]
460
486
  },
461
487
  "canopy": {
@@ -679,7 +705,9 @@
679
705
  "details": {
680
706
  "type": "object",
681
707
  "properties": {
682
- "focus": { "enum": ["ring", "double", "dashed", "glow", "offset"] },
708
+ "focus": {
709
+ "enum": ["ring", "double", "dashed", "glow", "offset", "halo"]
710
+ },
683
711
  "divider": {
684
712
  "enum": ["line", "dashed", "dotted", "double", "groove"]
685
713
  },
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Theme fixes are deep partial patches over a starter document. Objects merge
3
+ * key by key; any other value (including arrays) replaces the starter's.
4
+ */
5
+ export type ThemeFix = {
6
+ readonly [key: string]: unknown;
7
+ };
8
+ /** Return `base` with `fix` merged in. Neither input is changed. */
9
+ export declare function applyThemeFix<T>(base: T, fix: ThemeFix | undefined): T;
10
+ /** The smallest patch that turns `base` into `next`, or undefined if equal. */
11
+ export declare function diffThemeDocument(base: unknown, next: unknown): ThemeFix | undefined;
@@ -0,0 +1,32 @@
1
+ const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
2
+ /** Return `base` with `fix` merged in. Neither input is changed. */
3
+ export function applyThemeFix(base, fix) {
4
+ if (!fix)
5
+ return base;
6
+ return merge(base, fix);
7
+ }
8
+ function merge(base, patch) {
9
+ if (!isRecord(base) || !isRecord(patch))
10
+ return patch;
11
+ const result = { ...base };
12
+ for (const [key, value] of Object.entries(patch))
13
+ result[key] = merge(base[key], value);
14
+ return result;
15
+ }
16
+ /** The smallest patch that turns `base` into `next`, or undefined if equal. */
17
+ export function diffThemeDocument(base, next) {
18
+ const patch = diff(base, next);
19
+ return isRecord(patch) ? patch : undefined;
20
+ }
21
+ function diff(base, next) {
22
+ if (isRecord(base) && isRecord(next)) {
23
+ const result = {};
24
+ for (const key of Object.keys(next)) {
25
+ const change = diff(base[key], next[key]);
26
+ if (change !== undefined)
27
+ result[key] = change;
28
+ }
29
+ return Object.keys(result).length ? result : undefined;
30
+ }
31
+ return JSON.stringify(base) === JSON.stringify(next) ? undefined : next;
32
+ }
@@ -0,0 +1,2 @@
1
+ import type { ThemeFix } from "./theme-fix.ts";
2
+ export declare const themeFixes: Readonly<Record<string, ThemeFix>>;
@@ -0,0 +1 @@
1
+ export const themeFixes = {};
@@ -80,10 +80,10 @@ export declare const themeDocumentSchema: {
80
80
  readonly enum: readonly ["light", "dark"];
81
81
  };
82
82
  readonly bodyFont: {
83
- readonly enum: readonly ["inter", "grotesk", "system", "serif", "mono", "fraunces", "deco", "pixel", "techno", "rounded", "lcd", "plex", "archivo", "neon", "mincho", "gothic", "playfair", "caveat", "bricolage", "terminal", "jetbrains", "manrope", "figtree", "cormorant"];
83
+ readonly enum: readonly ["inter", "grotesk", "system", "serif", "mono", "fraunces", "deco", "pixel", "techno", "rounded", "lcd", "plex", "archivo", "neon", "mincho", "gothic", "playfair", "caveat", "bricolage", "terminal", "jetbrains", "manrope", "figtree", "cormorant", "plexSans", "atkinson"];
84
84
  };
85
85
  readonly headingFont: {
86
- readonly enum: readonly ["inter", "grotesk", "system", "serif", "mono", "fraunces", "deco", "pixel", "techno", "rounded", "lcd", "plex", "archivo", "neon", "mincho", "gothic", "playfair", "caveat", "bricolage", "terminal", "jetbrains", "manrope", "figtree", "cormorant"];
86
+ readonly enum: readonly ["inter", "grotesk", "system", "serif", "mono", "fraunces", "deco", "pixel", "techno", "rounded", "lcd", "plex", "archivo", "neon", "mincho", "gothic", "playfair", "caveat", "bricolage", "terminal", "jetbrains", "manrope", "figtree", "cormorant", "plexSans", "atkinson"];
87
87
  };
88
88
  readonly border: {
89
89
  readonly enum: readonly [1, 2];
@@ -111,7 +111,7 @@ export declare const themeDocumentSchema: {
111
111
  readonly type: "object";
112
112
  readonly properties: {
113
113
  readonly id: {
114
- readonly enum: ("botanical-paper" | "pixel-enamel" | "gunmetal" | "ceramic" | "prismatic-glass" | "atelier-paper" | "sea-glass" | "candy-clay" | "lacquer-brass" | "titanium" | "frosted-porcelain" | "scrapbook-paper" | "cyanotype" | "riso-paper" | "wet-asphalt" | "washi" | "station-enamel" | "phosphor-glass" | "ansi-term" | "poster-stock" | "glazed-tile" | "concrete" | "atomic-laminate" | "hologram" | "painted-steel" | "gold-foil" | "marigold-silk" | "red-paper" | "fiesta-paper" | "powder-wash" | "wool" | "liquid-glass")[];
114
+ readonly enum: ("botanical-paper" | "pixel-enamel" | "gunmetal" | "ceramic" | "prismatic-glass" | "atelier-paper" | "sea-glass" | "candy-clay" | "lacquer-brass" | "titanium" | "frosted-porcelain" | "scrapbook-paper" | "cyanotype" | "riso-paper" | "wet-asphalt" | "washi" | "station-enamel" | "phosphor-glass" | "ansi-term" | "poster-stock" | "glazed-tile" | "concrete" | "atomic-laminate" | "hologram" | "painted-steel" | "gold-foil" | "marigold-silk" | "red-paper" | "fiesta-paper" | "powder-wash" | "wool" | "liquid-glass" | "sunset-neon" | "ledger-ruled" | "layer-grid" | "mono-ink" | "signal-contrast" | "menu-window" | "arcade-bezel")[];
115
115
  };
116
116
  readonly version: {
117
117
  readonly enum: readonly [1];
@@ -185,7 +185,7 @@ export declare const themeDocumentSchema: {
185
185
  readonly type: "object";
186
186
  readonly properties: {
187
187
  readonly id: {
188
- readonly enum: ("none" | "coral" | "forest" | "cushion" | "deco" | "drafting" | "riso" | "neon" | "sumi" | "transit" | "crt" | "panes" | "swiss" | "azulejo" | "formwork" | "atomic" | "hud" | "hazard" | "orbit" | "rangoli" | "papercut" | "picado" | "gulal" | "knit" | "liquid" | "glass" | "pixel" | "halo" | "ceramic" | "rails" | "stitch" | "chamfer")[];
188
+ readonly enum: ("none" | "menu" | "marquee" | "coral" | "forest" | "cushion" | "deco" | "drafting" | "riso" | "neon" | "sumi" | "transit" | "crt" | "panes" | "swiss" | "azulejo" | "formwork" | "atomic" | "hud" | "hazard" | "orbit" | "rangoli" | "papercut" | "picado" | "gulal" | "knit" | "liquid" | "sunset" | "glass" | "pixel" | "halo" | "ceramic" | "rails" | "stitch" | "chamfer")[];
189
189
  };
190
190
  readonly version: {
191
191
  readonly enum: readonly [1];
@@ -194,7 +194,7 @@ export declare const themeDocumentSchema: {
194
194
  readonly type: "object";
195
195
  readonly properties: {
196
196
  readonly style: {
197
- readonly enum: ("Woodland mix" | "Wild ivy" | "Fern grove" | "Willow canopy" | "Oak & moss" | "Spring growth" | "Ginkgo fans" | "Maple grove" | "Eucalyptus" | "Olive branch" | "Clover meadow" | "Wildflower hedge" | "Piped petals" | "Twisted rope" | "Candy pebbles" | "Ribbon folds" | "Tidal ribbons" | "Seafoam beads" | "Glass droplets" | "Quiet currents" | "Fine filigree" | "Art deco" | "Hammered edge" | "Quiet gilding" | "Dimensioned" | "Ruler ticks" | "Construction lines" | "Quiet draft" | "Misprint" | "Halftone" | "Taped corners" | "Clean stamp" | "Tube outline" | "Broken tubes" | "Sign shapes" | "Low hum" | "Bamboo" | "Plum blossom" | "Dry brush" | "Ensō" | "Line map" | "Station roundels" | "Platform edge" | "Quiet line" | "Box corners" | "Status line" | "Raster ticks" | "Quiet cursor" | "Pane titles" | "Key hints" | "Split panes" | "Bare panes" | "Crop marks" | "Red block" | "Grid ticks" | "Bare grid" | "Corner tiles" | "Border run" | "Floral rosette" | "Single tile" | "Tie holes" | "Stencil marks" | "Board seams" | "Bare concrete" | "Starbursts" | "Boomerangs" | "Orbit atoms" | "Lone star" | "Target brackets" | "Telemetry" | "Reticle" | "Clean brackets" | "Hazard stripes" | "Rivet seams" | "Cargo stencils" | "Clean plate" | "Orbit rings" | "Gold foil" | "Star field" | "Single orbit" | "Rangoli corners" | "Diya row" | "Marigold string" | "Single diya" | "Lanterns" | "Scallop edge" | "Cloud scrolls" | "Single lantern" | "Bunting" | "Marigold garland" | "Paper confetti" | "Short string" | "Powder clouds" | "Splashes" | "Speckle dust" | "Soft haze" | "Fair Isle band" | "Snowflakes" | "Cable stitch" | "Plain rib" | "Specular rim" | "Refraction" | "Light catch" | "Clear")[];
197
+ readonly enum: ("Woodland mix" | "Wild ivy" | "Fern grove" | "Willow canopy" | "Oak & moss" | "Spring growth" | "Ginkgo fans" | "Maple grove" | "Eucalyptus" | "Olive branch" | "Clover meadow" | "Wildflower hedge" | "Piped petals" | "Twisted rope" | "Candy pebbles" | "Ribbon folds" | "Tidal ribbons" | "Seafoam beads" | "Glass droplets" | "Quiet currents" | "Fine filigree" | "Art deco" | "Hammered edge" | "Quiet gilding" | "Dimensioned" | "Ruler ticks" | "Construction lines" | "Quiet draft" | "Misprint" | "Halftone" | "Taped corners" | "Clean stamp" | "Tube outline" | "Broken tubes" | "Sign shapes" | "Low hum" | "Bamboo" | "Plum blossom" | "Dry brush" | "Ensō" | "Line map" | "Station roundels" | "Platform edge" | "Quiet line" | "Box corners" | "Status line" | "Raster ticks" | "Quiet cursor" | "Pane titles" | "Key hints" | "Split panes" | "Bare panes" | "Crop marks" | "Red block" | "Grid ticks" | "Bare grid" | "Corner tiles" | "Border run" | "Floral rosette" | "Single tile" | "Tie holes" | "Stencil marks" | "Board seams" | "Bare concrete" | "Starbursts" | "Boomerangs" | "Orbit atoms" | "Lone star" | "Target brackets" | "Telemetry" | "Reticle" | "Clean brackets" | "Hazard stripes" | "Rivet seams" | "Cargo stencils" | "Clean plate" | "Orbit rings" | "Gold foil" | "Star field" | "Single orbit" | "Rangoli corners" | "Diya row" | "Marigold string" | "Single diya" | "Lanterns" | "Scallop edge" | "Cloud scrolls" | "Single lantern" | "Bunting" | "Marigold garland" | "Paper confetti" | "Short string" | "Powder clouds" | "Splashes" | "Speckle dust" | "Soft haze" | "Fair Isle band" | "Snowflakes" | "Cable stitch" | "Plain rib" | "Specular rim" | "Refraction" | "Light catch" | "Clear" | "Sun and grid" | "Sun only" | "Grid only" | "Bare coast" | "Cursor and stars" | "Cursor only" | "Stars only" | "Plain window" | "Bulbs and credits" | "Bulbs only" | "Credits only" | "Dark cabinet")[];
198
198
  };
199
199
  readonly canopy: {
200
200
  readonly enum: readonly ["Scattered trails", "Corner cascades", "Overhead boughs", "Long tendrils", "Open crown"];
@@ -368,7 +368,7 @@ export declare const themeDocumentSchema: {
368
368
  readonly type: "object";
369
369
  readonly properties: {
370
370
  readonly focus: {
371
- readonly enum: readonly ["ring", "double", "dashed", "glow", "offset"];
371
+ readonly enum: readonly ["ring", "double", "dashed", "glow", "offset", "halo"];
372
372
  };
373
373
  readonly divider: {
374
374
  readonly enum: readonly ["line", "dashed", "dotted", "double", "groove"];
@@ -38,6 +38,8 @@ const fontKeys = [
38
38
  "manrope",
39
39
  "figtree",
40
40
  "cormorant",
41
+ "plexSans",
42
+ "atkinson",
41
43
  ];
42
44
  /** This closed JSON Schema also supplies TypeScript types, validation and control metadata. */
43
45
  export const themeDocumentSchema = freezeData({