@selvajs/ui 6.6.0-beta.15 → 6.6.0-beta.17

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 (213) hide show
  1. package/README.md +0 -3
  2. package/dist/components/compute/AppLayout.svelte +5 -3
  3. package/dist/components/compute/CollapsedPanelStrip.svelte +1 -1
  4. package/dist/components/compute/ParameterPresetManager.svelte +1 -1
  5. package/dist/components/compute/SolveMessages.svelte +2 -2
  6. package/dist/components/layout/FooterItemRenderer.svelte +1 -1
  7. package/dist/components/layout/PageFooter.svelte +2 -2
  8. package/dist/components/layout/PageHeader.svelte +1 -1
  9. package/dist/components/layout/SideNav.svelte +3 -3
  10. package/dist/components/layout/SubNav.svelte +2 -2
  11. package/dist/components/preview/ChartOutput.svelte +3 -3
  12. package/dist/components/preview/Group.svelte +7 -7
  13. package/dist/components/preview/ImageOutput.svelte +6 -6
  14. package/dist/components/preview/InputControl.svelte +1 -0
  15. package/dist/components/preview/OutputDisplay.svelte +8 -6
  16. package/dist/components/preview/TabBar.svelte +6 -4
  17. package/dist/components/preview/TabBar.svelte.d.ts +2 -0
  18. package/dist/components/preview/TabContent.svelte +1 -1
  19. package/dist/components/preview/TabLayout.svelte +3 -4
  20. package/dist/components/preview/inputs/ChecklistInput.svelte +3 -3
  21. package/dist/components/preview/inputs/ColorInput.svelte +356 -14
  22. package/dist/components/preview/inputs/ColorInput.svelte.d.ts +1 -0
  23. package/dist/components/preview/inputs/FileInput.svelte +3 -3
  24. package/dist/components/preview/inputs/SegmentedInput.svelte +2 -1
  25. package/dist/components/preview/inputs/TileInput.svelte +1 -1
  26. package/dist/components/primitives/CalculateButton.svelte +2 -2
  27. package/dist/components/primitives/Callout.svelte +8 -6
  28. package/dist/components/primitives/Callout.svelte.d.ts +4 -4
  29. package/dist/components/primitives/DataTable.svelte +1 -1
  30. package/dist/components/primitives/ImageUploadField.svelte +1 -1
  31. package/dist/components/primitives/alert-dialog/alert-dialog-content.svelte +1 -1
  32. package/dist/components/primitives/badge/badge.svelte +2 -2
  33. package/dist/components/primitives/badge/badge.svelte.d.ts +6 -6
  34. package/dist/components/primitives/button/button.svelte +6 -7
  35. package/dist/components/primitives/button/button.svelte.d.ts +18 -18
  36. package/dist/components/primitives/card/card.svelte +1 -1
  37. package/dist/components/primitives/card/card.svelte.d.ts +1 -1
  38. package/dist/components/primitives/checkbox/checkbox.svelte +1 -1
  39. package/dist/components/primitives/command/command-input.svelte +1 -1
  40. package/dist/components/primitives/command/command-item.svelte +1 -1
  41. package/dist/components/primitives/command/command-link-item.svelte +1 -1
  42. package/dist/components/primitives/command/command.svelte +1 -1
  43. package/dist/components/primitives/context-menu/context-menu-checkbox-item.svelte +1 -1
  44. package/dist/components/primitives/context-menu/context-menu-content.svelte +1 -1
  45. package/dist/components/primitives/context-menu/context-menu-item.svelte +1 -1
  46. package/dist/components/primitives/context-menu/context-menu-radio-item.svelte +1 -1
  47. package/dist/components/primitives/context-menu/context-menu-sub-content.svelte +1 -1
  48. package/dist/components/primitives/context-menu/context-menu-sub-trigger.svelte +1 -1
  49. package/dist/components/primitives/dialog/dialog-content.svelte +2 -2
  50. package/dist/components/primitives/drawer/Drawer.svelte +1 -1
  51. package/dist/components/primitives/dropdown-menu/dropdown-menu-checkbox-item.svelte +31 -11
  52. package/dist/components/primitives/dropdown-menu/dropdown-menu-checkbox-item.svelte.d.ts +2 -0
  53. package/dist/components/primitives/dropdown-menu/dropdown-menu-content.svelte +5 -1
  54. package/dist/components/primitives/dropdown-menu/dropdown-menu-content.svelte.d.ts +2 -0
  55. package/dist/components/primitives/dropdown-menu/dropdown-menu-item.svelte +4 -2
  56. package/dist/components/primitives/dropdown-menu/dropdown-menu-item.svelte.d.ts +2 -1
  57. package/dist/components/primitives/dropdown-menu/dropdown-menu-radio-item.svelte +1 -1
  58. package/dist/components/primitives/dropdown-menu/dropdown-menu-shortcut.svelte +1 -1
  59. package/dist/components/primitives/dropdown-menu/dropdown-menu-sub-content.svelte +1 -1
  60. package/dist/components/primitives/dropdown-menu/dropdown-menu-sub-trigger.svelte +1 -1
  61. package/dist/components/primitives/index.d.ts +1 -1
  62. package/dist/components/primitives/index.js +1 -1
  63. package/dist/components/primitives/input/input.svelte +2 -2
  64. package/dist/components/primitives/input-group/input-group.svelte +1 -1
  65. package/dist/components/primitives/popover/popover-content.svelte +1 -1
  66. package/dist/components/primitives/resizable/resizable-handle.svelte +2 -2
  67. package/dist/components/primitives/search/search.svelte +1 -1
  68. package/dist/components/primitives/select/select-content.svelte +1 -1
  69. package/dist/components/primitives/select/select-item.svelte +1 -1
  70. package/dist/components/primitives/select/select-trigger.svelte +1 -1
  71. package/dist/components/primitives/slider/slider.svelte +1 -1
  72. package/dist/components/primitives/switch/switch.svelte +1 -1
  73. package/dist/components/primitives/tabs/tabs-list.svelte +1 -1
  74. package/dist/components/primitives/tabs/tabs-list.svelte.d.ts +3 -3
  75. package/dist/components/primitives/tabs/tabs-trigger.svelte +1 -1
  76. package/dist/components/primitives/tabs/tabs-trigger.svelte.d.ts +3 -3
  77. package/dist/components/primitives/textarea/textarea.svelte +1 -1
  78. package/dist/components/primitives/toggle/toggle.svelte +6 -3
  79. package/dist/components/primitives/toggle/toggle.svelte.d.ts +10 -7
  80. package/dist/components/primitives/toggle-group/toggle-group-item.svelte +1 -1
  81. package/dist/components/primitives/toggle-group/toggle-group.svelte +1 -1
  82. package/dist/components/primitives/tooltip/index.d.ts +6 -0
  83. package/dist/components/primitives/tooltip/index.js +8 -0
  84. package/dist/components/primitives/tooltip/tooltip-content.svelte +34 -0
  85. package/dist/components/primitives/tooltip/tooltip-content.svelte.d.ts +10 -0
  86. package/dist/components/primitives/tooltip/tooltip-portal.svelte +7 -0
  87. package/dist/components/primitives/tooltip/tooltip-portal.svelte.d.ts +4 -0
  88. package/dist/components/primitives/tooltip/tooltip-provider.svelte +7 -0
  89. package/dist/components/primitives/tooltip/tooltip-provider.svelte.d.ts +4 -0
  90. package/dist/components/primitives/tooltip/tooltip-trigger.svelte +7 -0
  91. package/dist/components/primitives/tooltip/tooltip-trigger.svelte.d.ts +4 -0
  92. package/dist/components/primitives/tooltip/tooltip.svelte +7 -0
  93. package/dist/components/primitives/tooltip/tooltip.svelte.d.ts +4 -0
  94. package/dist/components/viewer/MeshMetadataPanel.svelte +1 -1
  95. package/dist/components/viewer/SceneManager.svelte +19 -19
  96. package/dist/components/viewer/Viewer.svelte +68 -157
  97. package/dist/components/viewer/ViewerDock.svelte +404 -0
  98. package/dist/components/viewer/ViewerDock.svelte.d.ts +42 -0
  99. package/dist/i18n/messages.d.ts +11 -0
  100. package/dist/i18n/messages.js +18 -0
  101. package/dist/index.d.ts +1 -0
  102. package/dist/index.js +1 -0
  103. package/dist/public.d.ts +1 -0
  104. package/dist/public.js +1 -0
  105. package/dist/schema/visibility-rules.d.ts +7 -1
  106. package/dist/schema/visibility-rules.js +17 -0
  107. package/dist/styles/base.css +81 -80
  108. package/dist/utils/color-space.d.ts +21 -0
  109. package/dist/utils/color-space.js +90 -0
  110. package/package.json +8 -9
  111. package/src/lib/components/compute/AppLayout.svelte +5 -3
  112. package/src/lib/components/compute/CollapsedPanelStrip.svelte +1 -1
  113. package/src/lib/components/compute/ParameterPresetManager.svelte +1 -1
  114. package/src/lib/components/compute/SolveMessages.svelte +2 -2
  115. package/src/lib/components/layout/FooterItemRenderer.svelte +1 -1
  116. package/src/lib/components/layout/PageFooter.svelte +2 -2
  117. package/src/lib/components/layout/PageHeader.svelte +1 -1
  118. package/src/lib/components/layout/SideNav.svelte +3 -3
  119. package/src/lib/components/layout/SubNav.svelte +2 -2
  120. package/src/lib/components/preview/ChartOutput.svelte +3 -3
  121. package/src/lib/components/preview/Group.svelte +7 -7
  122. package/src/lib/components/preview/ImageOutput.svelte +6 -6
  123. package/src/lib/components/preview/InputControl.svelte +1 -0
  124. package/src/lib/components/preview/OutputDisplay.svelte +8 -6
  125. package/src/lib/components/preview/TabBar.svelte +6 -4
  126. package/src/lib/components/preview/TabContent.svelte +1 -1
  127. package/src/lib/components/preview/TabLayout.svelte +3 -4
  128. package/src/lib/components/preview/inputs/ChecklistInput.svelte +3 -3
  129. package/src/lib/components/preview/inputs/ColorInput.svelte +356 -14
  130. package/src/lib/components/preview/inputs/FileInput.svelte +3 -3
  131. package/src/lib/components/preview/inputs/SegmentedInput.svelte +2 -1
  132. package/src/lib/components/preview/inputs/TileInput.svelte +1 -1
  133. package/src/lib/components/primitives/CalculateButton.svelte +2 -2
  134. package/src/lib/components/primitives/Callout.svelte +8 -6
  135. package/src/lib/components/primitives/DataTable.svelte +1 -1
  136. package/src/lib/components/primitives/ImageUploadField.svelte +1 -1
  137. package/src/lib/components/primitives/alert-dialog/alert-dialog-content.svelte +1 -1
  138. package/src/lib/components/primitives/badge/badge.svelte +2 -2
  139. package/src/lib/components/primitives/button/button.svelte +6 -7
  140. package/src/lib/components/primitives/card/card.svelte +1 -1
  141. package/src/lib/components/primitives/checkbox/checkbox.svelte +1 -1
  142. package/src/lib/components/primitives/command/command-input.svelte +1 -1
  143. package/src/lib/components/primitives/command/command-item.svelte +1 -1
  144. package/src/lib/components/primitives/command/command-link-item.svelte +1 -1
  145. package/src/lib/components/primitives/command/command.svelte +1 -1
  146. package/src/lib/components/primitives/context-menu/context-menu-checkbox-item.svelte +1 -1
  147. package/src/lib/components/primitives/context-menu/context-menu-content.svelte +1 -1
  148. package/src/lib/components/primitives/context-menu/context-menu-item.svelte +1 -1
  149. package/src/lib/components/primitives/context-menu/context-menu-radio-item.svelte +1 -1
  150. package/src/lib/components/primitives/context-menu/context-menu-sub-content.svelte +1 -1
  151. package/src/lib/components/primitives/context-menu/context-menu-sub-trigger.svelte +1 -1
  152. package/src/lib/components/primitives/dialog/dialog-content.svelte +2 -2
  153. package/src/lib/components/primitives/drawer/Drawer.svelte +1 -1
  154. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-checkbox-item.svelte +31 -11
  155. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-content.svelte +5 -1
  156. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-item.svelte +4 -2
  157. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-radio-item.svelte +1 -1
  158. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-shortcut.svelte +1 -1
  159. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-sub-content.svelte +1 -1
  160. package/src/lib/components/primitives/dropdown-menu/dropdown-menu-sub-trigger.svelte +1 -1
  161. package/src/lib/components/primitives/index.ts +1 -1
  162. package/src/lib/components/primitives/input/input.svelte +2 -2
  163. package/src/lib/components/primitives/input-group/input-group.svelte +1 -1
  164. package/src/lib/components/primitives/popover/popover-content.svelte +1 -1
  165. package/src/lib/components/primitives/resizable/resizable-handle.svelte +2 -2
  166. package/src/lib/components/primitives/search/search.svelte +1 -1
  167. package/src/lib/components/primitives/select/select-content.svelte +1 -1
  168. package/src/lib/components/primitives/select/select-item.svelte +1 -1
  169. package/src/lib/components/primitives/select/select-trigger.svelte +1 -1
  170. package/src/lib/components/primitives/slider/slider.svelte +1 -1
  171. package/src/lib/components/primitives/switch/switch.svelte +1 -1
  172. package/src/lib/components/primitives/tabs/tabs-list.svelte +1 -1
  173. package/src/lib/components/primitives/tabs/tabs-trigger.svelte +1 -1
  174. package/src/lib/components/primitives/textarea/textarea.svelte +1 -1
  175. package/src/lib/components/primitives/toggle/toggle.svelte +6 -3
  176. package/src/lib/components/primitives/toggle-group/toggle-group-item.svelte +1 -1
  177. package/src/lib/components/primitives/toggle-group/toggle-group.svelte +1 -1
  178. package/src/lib/components/primitives/tooltip/index.ts +19 -0
  179. package/src/lib/components/primitives/tooltip/tooltip-content.svelte +34 -0
  180. package/src/lib/components/primitives/tooltip/tooltip-portal.svelte +7 -0
  181. package/src/lib/components/primitives/tooltip/tooltip-provider.svelte +7 -0
  182. package/src/lib/components/primitives/tooltip/tooltip-trigger.svelte +7 -0
  183. package/src/lib/components/primitives/tooltip/tooltip.svelte +7 -0
  184. package/src/lib/components/viewer/MeshMetadataPanel.svelte +1 -1
  185. package/src/lib/components/viewer/SceneManager.svelte +19 -19
  186. package/src/lib/components/viewer/Viewer.svelte +68 -157
  187. package/src/lib/components/viewer/ViewerDock.svelte +404 -0
  188. package/src/lib/i18n/messages.ts +29 -0
  189. package/src/lib/index.ts +1 -0
  190. package/src/lib/public.ts +1 -0
  191. package/src/lib/schema/visibility-rules.ts +27 -1
  192. package/src/lib/styles/base.css +81 -80
  193. package/src/lib/utils/color-space.ts +107 -0
  194. package/dist/components/primitives/theme-switcher/ThemeSwitcher.svelte +0 -39
  195. package/dist/components/primitives/theme-switcher/ThemeSwitcher.svelte.d.ts +0 -3
  196. package/dist/components/primitives/theme-switcher/index.d.ts +0 -1
  197. package/dist/components/primitives/theme-switcher/index.js +0 -1
  198. package/dist/styles/themes/cyberpunk.css +0 -98
  199. package/dist/styles/themes/neutral.css +0 -72
  200. package/dist/styles/themes/ocean.css +0 -75
  201. package/dist/styles/themes/selva.css +0 -105
  202. package/dist/theme/themeStore.svelte.d.ts +0 -12
  203. package/dist/theme/themeStore.svelte.js +0 -40
  204. package/dist/theme/themes.d.ts +0 -5
  205. package/dist/theme/themes.js +0 -13
  206. package/src/lib/components/primitives/theme-switcher/ThemeSwitcher.svelte +0 -39
  207. package/src/lib/components/primitives/theme-switcher/index.ts +0 -1
  208. package/src/lib/styles/themes/cyberpunk.css +0 -98
  209. package/src/lib/styles/themes/neutral.css +0 -72
  210. package/src/lib/styles/themes/ocean.css +0 -75
  211. package/src/lib/styles/themes/selva.css +0 -105
  212. package/src/lib/theme/themeStore.svelte.ts +0 -50
  213. package/src/lib/theme/themes.ts +0 -18
@@ -1,81 +1,92 @@
1
1
  @custom-variant dark (&:where(.dark, .dark *));
2
2
 
3
+ /* Surfaces, edges and states share one set of names in both modes; each mode only changes the
4
+ values. Ratios are WCAG 2.x. The roles and when to use each: docs/contributing/design-system.md. */
3
5
  :root {
4
- --radius: 0.625rem;
5
6
  --header-h: 3.5rem;
6
7
  --below-header-h: calc(100svh - var(--header-h));
7
8
  --page-px: 1rem;
8
9
  --page-py: 1.75rem;
9
- --background: oklch(0.99 0 0);
10
- --foreground: oklch(0.22 0 0);
11
- /* White, so a card stands apart from background and muted; Group adds a border, since
12
- white on background alone is too close to see. */
10
+ /* Canvas, then surface (cards, panels), then raised (rows, menus, popovers). Light can't go
11
+ lighter than white, so raised is white too and lifts with a border and a shadow instead. */
12
+ --background: oklch(0.91 0 0);
13
13
  --card: oklch(1 0 0);
14
+ --raised: oklch(1 0 0);
15
+ /* Recessed fill for trays, table heads, code and skeletons: darker than the surface around it. */
16
+ --muted: oklch(0.94 0 0);
17
+ /* Fill of anything you type into, on a card: the same step as raised, in both modes. The edge
18
+ (`--input`) carries the boundary. A recessed fill reads as a disabled control. */
19
+ --field: var(--raised);
20
+ --foreground: oklch(0.22 0 0);
14
21
  --card-foreground: oklch(0.22 0 0);
15
- --popover: oklch(0.99 0 0);
16
22
  --popover-foreground: oklch(0.22 0 0);
17
- /* 4.5:1 as text on background, card and muted, and under white text. */
18
- --primary: oklch(0.52 0.07 135);
19
- --primary-foreground: oklch(0.985 0 0);
20
- --secondary: oklch(0.94 0 0);
21
- --secondary-foreground: oklch(0.28 0 0);
22
- --muted: oklch(0.95 0 0);
23
- --muted-foreground: oklch(0.5 0 0);
24
- --accent: oklch(0.93 0 0);
25
- --accent-foreground: oklch(0.3 0 0);
26
- /* 4.5:1 as small text on background, card and muted, and under white text. */
27
- --destructive: oklch(0.55 0.19 27);
28
- --destructive-foreground: oklch(0.985 0 0);
29
- --border: oklch(0.86 0 0);
30
- /* Field borders and unchecked boxes: at least 3:1 against background, card and muted, the
31
- WCAG minimum for a control's boundary. Same for the focus ring, which is drawn opaque. */
32
- --input: oklch(0.62 0 0);
23
+ /* 4.5:1 on every surface. */
24
+ --muted-foreground: oklch(0.48 0 0);
25
+ /* Icons, placeholders, disabled text: 3:1 on every surface. */
26
+ --faint-foreground: oklch(0.6 0 0);
27
+ /* State overlays, laid over whatever surface is underneath. */
28
+ --hover: oklch(0 0 0 / 6%);
29
+ --selected: oklch(0 0 0 / 12%);
30
+ /* Rest fill of a neutral filled control; its hover is `selected`. */
31
+ --secondary: oklch(0 0 0 / 7%);
32
+ --secondary-foreground: oklch(0.22 0 0);
33
+ /* Outlines and separators. */
34
+ --border: oklch(0 0 0 / 11%);
35
+ /* Popovers, outline buttons, dashed drop zones. */
36
+ --border-strong: oklch(0 0 0 / 24%);
37
+ /* Edge of anything you type into or toggle, slider tracks included: at least 3:1 against the
38
+ surfaces around it, the WCAG minimum for a control's boundary. */
39
+ --input: oklch(0 0 0 / 44%);
33
40
  --ring: oklch(0.55 0 0);
34
- --success: oklch(0.66 0.14 145);
41
+ --elevation-raised: 0 1px 2px oklch(0 0 0 / 6%);
42
+ --elevation-popover: 0 8px 24px oklch(0 0 0 / 12%);
43
+ /* 4.5:1 as text on a card and under its foreground; 3:1 as a fill on every surface. */
44
+ --primary: #4a7c52;
45
+ --primary-foreground: oklch(0.985 0 0);
46
+ --destructive: #c9302d;
47
+ --destructive-foreground: #fbfbfb;
48
+ /* 3:1 on every surface, as icons and dots. */
49
+ --success: #51a556;
35
50
  --success-foreground: oklch(0.99 0 0);
36
- --warning: oklch(0.78 0.12 75);
51
+ --warning: #bd8630;
37
52
  --warning-foreground: oklch(0.25 0.04 75);
38
- --info: oklch(0.68 0.11 245);
53
+ --info: #5399d1;
39
54
  --info-foreground: oklch(0.99 0 0);
40
55
  --chart-1: oklch(0.65 0.14 135);
41
56
  --chart-2: oklch(0.7 0.11 200);
42
57
  --chart-3: oklch(0.6 0.13 260);
43
58
  --chart-4: oklch(0.78 0.13 80);
44
59
  --chart-5: oklch(0.68 0.15 30);
45
- --sidebar: oklch(0.96 0 0);
46
- --sidebar-foreground: oklch(0.25 0 0);
47
- --sidebar-primary: oklch(0.52 0.07 135);
48
- --sidebar-primary-foreground: oklch(0.985 0 0);
49
- --sidebar-accent: oklch(0.93 0 0);
50
- --sidebar-accent-foreground: oklch(0.3 0 0);
51
- --sidebar-border: oklch(0.88 0 0);
52
- --sidebar-ring: oklch(0.55 0 0);
53
- --inputparam: oklch(1 0 0);
54
- --outputparam: oklch(1 0 0);
55
60
  /* Scrim behind modal dialogs and drawers. */
56
61
  --overlay: oklch(0 0 0 / 50%);
57
62
  }
58
63
 
59
64
  .dark {
60
- --background: oklch(0.17 0 0);
65
+ --background: oklch(0.155 0 0);
66
+ --card: oklch(0.235 0 0);
67
+ --raised: oklch(0.275 0 0);
68
+ --muted: oklch(0.18 0 0);
61
69
  --foreground: oklch(0.96 0 0);
62
- --card: oklch(0.23 0 0);
63
70
  --card-foreground: oklch(0.96 0 0);
64
- --popover: oklch(0.23 0 0);
65
71
  --popover-foreground: oklch(0.96 0 0);
66
- --primary: oklch(0.74 0.07 135);
67
- --primary-foreground: oklch(0.18 0 0);
68
- --secondary: oklch(0.3 0 0);
69
- --secondary-foreground: oklch(0.96 0 0);
70
- --muted: oklch(0.27 0 0);
71
72
  --muted-foreground: oklch(0.72 0 0);
72
- --accent: oklch(0.36 0 0);
73
- --accent-foreground: oklch(0.92 0 0);
74
- --destructive: oklch(0.7 0.17 22);
75
- --destructive-foreground: oklch(0.985 0 0);
76
- --border: oklch(1 0 0 / 14%);
77
- --input: oklch(1 0 0 / 36%);
73
+ --faint-foreground: oklch(0.56 0 0);
74
+ --hover: oklch(1 0 0 / 6%);
75
+ --selected: oklch(1 0 0 / 12%);
76
+ --secondary: oklch(1 0 0 / 8%);
77
+ --secondary-foreground: oklch(0.96 0 0);
78
+ --border: oklch(1 0 0 / 11%);
79
+ --border-strong: oklch(1 0 0 / 24%);
80
+ --input: oklch(1 0 0 / 41%);
78
81
  --ring: oklch(0.74 0 0);
82
+ /* Shadows barely show on a dark canvas, so raised things catch a top highlight instead. */
83
+ --elevation-raised: inset 0 1px 0 oklch(1 0 0 / 5%);
84
+ --elevation-popover: 0 8px 24px oklch(0 0 0 / 50%), inset 0 1px 0 oklch(1 0 0 / 6%);
85
+ --primary: #86ab78;
86
+ --primary-foreground: oklch(0.18 0 0);
87
+ /* White text can't reach 4.5:1 on a red light enough to also be text on the dark card. */
88
+ --destructive: oklch(0.7 0.17 22);
89
+ --destructive-foreground: oklch(0.18 0 0);
79
90
  --success: oklch(0.74 0.15 145);
80
91
  --success-foreground: oklch(0.18 0.03 145);
81
92
  --warning: oklch(0.8 0.14 75);
@@ -87,41 +98,39 @@
87
98
  --chart-3: oklch(0.68 0.14 260);
88
99
  --chart-4: oklch(0.78 0.14 80);
89
100
  --chart-5: oklch(0.7 0.16 30);
90
- --sidebar: oklch(0.21 0 0);
91
- --sidebar-foreground: oklch(0.96 0 0);
92
- --sidebar-primary: oklch(0.74 0.07 135);
93
- --sidebar-primary-foreground: oklch(0.18 0 0);
94
- --sidebar-accent: oklch(0.32 0 0);
95
- --sidebar-accent-foreground: oklch(0.92 0 0);
96
- --sidebar-border: oklch(1 0 0 / 10%);
97
- --sidebar-ring: oklch(0.74 0 0);
98
- --inputparam: oklch(0.15 0 0);
99
- --outputparam: oklch(0.25 0 0);
100
101
  }
101
102
 
102
103
  @theme inline {
103
- --radius-sm: calc(var(--radius) - 4px);
104
- --radius-md: calc(var(--radius) - 2px);
105
- --radius-lg: var(--radius);
106
- --radius-xl: calc(var(--radius) + 4px);
104
+ /* Concentric: an item inside a padded container takes the container's radius minus the
105
+ padding. A 12px menu with 4px padding holds 8px items; a 10px control with 2px padding
106
+ holds 8px segments. */
107
+ --radius-sm: 6px;
108
+ --radius-inner: 8px;
109
+ --radius-md: 10px;
110
+ --radius-lg: 12px;
111
+ --radius-xl: 16px;
107
112
  --color-background: var(--background);
108
113
  --color-foreground: var(--foreground);
109
114
  --color-card: var(--card);
110
115
  --color-card-foreground: var(--card-foreground);
111
- --color-popover: var(--popover);
116
+ --color-raised: var(--raised);
117
+ --color-popover: var(--raised);
112
118
  --color-popover-foreground: var(--popover-foreground);
113
- --color-primary: var(--primary);
114
- --color-primary-foreground: var(--primary-foreground);
115
- --color-secondary: var(--secondary);
116
- --color-secondary-foreground: var(--secondary-foreground);
119
+ --color-field: var(--field);
117
120
  --color-muted: var(--muted);
118
121
  --color-muted-foreground: var(--muted-foreground);
119
- --color-accent: var(--accent);
120
- --color-accent-foreground: var(--accent-foreground);
122
+ --color-faint-foreground: var(--faint-foreground);
123
+ --color-hover: var(--hover);
124
+ --color-selected: var(--selected);
125
+ --color-secondary: var(--secondary);
126
+ --color-secondary-foreground: var(--secondary-foreground);
127
+ --color-primary: var(--primary);
128
+ --color-primary-foreground: var(--primary-foreground);
121
129
  --color-destructive: var(--destructive);
122
130
  --color-destructive-foreground: var(--destructive-foreground);
123
131
  --color-overlay: var(--overlay);
124
132
  --color-border: var(--border);
133
+ --color-border-strong: var(--border-strong);
125
134
  --color-input: var(--input);
126
135
  --color-ring: var(--ring);
127
136
  --color-success: var(--success);
@@ -135,16 +144,8 @@
135
144
  --color-chart-3: var(--chart-3);
136
145
  --color-chart-4: var(--chart-4);
137
146
  --color-chart-5: var(--chart-5);
138
- --color-sidebar: var(--sidebar);
139
- --color-sidebar-foreground: var(--sidebar-foreground);
140
- --color-sidebar-primary: var(--sidebar-primary);
141
- --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
142
- --color-sidebar-accent: var(--sidebar-accent);
143
- --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
144
- --color-sidebar-border: var(--sidebar-border);
145
- --color-sidebar-ring: var(--sidebar-ring);
146
- --color-inputparam: var(--inputparam);
147
- --color-outputparam: var(--outputparam);
147
+ --shadow-raised: var(--elevation-raised);
148
+ --shadow-popover: var(--elevation-popover);
148
149
  }
149
150
 
150
151
  /* Design tokens beyond Tailwind's defaults. Reach for these before an arbitrary value: the
@@ -0,0 +1,107 @@
1
+ export interface Rgb {
2
+ r: number;
3
+ g: number;
4
+ b: number;
5
+ }
6
+
7
+ /** h in [0, 360), s and v in [0, 1]. */
8
+ export interface Hsv {
9
+ h: number;
10
+ s: number;
11
+ v: number;
12
+ }
13
+
14
+ const clamp = (n: number, min: number, max: number) => Math.min(max, Math.max(min, n));
15
+
16
+ /** Accepts `#rgb`, `#rrggbb` and the same without `#`. Returns lowercase `#rrggbb`, or null. */
17
+ export function normalizeHex(input: string): string | null {
18
+ const raw = input.trim().replace(/^#/, '');
19
+ if (/^[0-9a-f]{3}$/i.test(raw)) {
20
+ return `#${raw
21
+ .split('')
22
+ .map((c) => c + c)
23
+ .join('')
24
+ .toLowerCase()}`;
25
+ }
26
+ if (/^[0-9a-f]{6}$/i.test(raw)) return `#${raw.toLowerCase()}`;
27
+ return null;
28
+ }
29
+
30
+ export function hexToRgb(hex: string): Rgb | null {
31
+ const normalized = normalizeHex(hex);
32
+ if (!normalized) return null;
33
+ return {
34
+ r: parseInt(normalized.slice(1, 3), 16),
35
+ g: parseInt(normalized.slice(3, 5), 16),
36
+ b: parseInt(normalized.slice(5, 7), 16)
37
+ };
38
+ }
39
+
40
+ export function rgbToHex({ r, g, b }: Rgb): string {
41
+ const channel = (n: number) => clamp(Math.round(n), 0, 255).toString(16).padStart(2, '0');
42
+ return `#${channel(r)}${channel(g)}${channel(b)}`;
43
+ }
44
+
45
+ export function rgbToHsv({ r, g, b }: Rgb): Hsv {
46
+ const rn = r / 255;
47
+ const gn = g / 255;
48
+ const bn = b / 255;
49
+ const max = Math.max(rn, gn, bn);
50
+ const delta = max - Math.min(rn, gn, bn);
51
+
52
+ let h = 0;
53
+ if (delta !== 0) {
54
+ if (max === rn) h = ((gn - bn) / delta) % 6;
55
+ else if (max === gn) h = (bn - rn) / delta + 2;
56
+ else h = (rn - gn) / delta + 4;
57
+ h *= 60;
58
+ if (h < 0) h += 360;
59
+ }
60
+ return { h, s: max === 0 ? 0 : delta / max, v: max };
61
+ }
62
+
63
+ export function hsvToRgb({ h, s, v }: Hsv): Rgb {
64
+ const c = v * s;
65
+ const hp = (((h % 360) + 360) % 360) / 60;
66
+ const x = c * (1 - Math.abs((hp % 2) - 1));
67
+ const [r1, g1, b1] =
68
+ hp < 1
69
+ ? [c, x, 0]
70
+ : hp < 2
71
+ ? [x, c, 0]
72
+ : hp < 3
73
+ ? [0, c, x]
74
+ : hp < 4
75
+ ? [0, x, c]
76
+ : hp < 5
77
+ ? [x, 0, c]
78
+ : [c, 0, x];
79
+ const m = v - c;
80
+ return { r: (r1 + m) * 255, g: (g1 + m) * 255, b: (b1 + m) * 255 };
81
+ }
82
+
83
+ export const hexToHsv = (hex: string): Hsv | null => {
84
+ const rgb = hexToRgb(hex);
85
+ return rgb ? rgbToHsv(rgb) : null;
86
+ };
87
+
88
+ export const hsvToHex = (hsv: Hsv): string => rgbToHex(hsvToRgb(hsv));
89
+
90
+ /** WCAG relative luminance of an sRGB color. */
91
+ function luminance({ r, g, b }: Rgb): number {
92
+ const lin = (c: number) => {
93
+ const n = c / 255;
94
+ return n <= 0.04045 ? n / 12.92 : Math.pow((n + 0.055) / 1.055, 2.4);
95
+ };
96
+ return 0.2126 * lin(r) + 0.7152 * lin(g) + 0.0722 * lin(b);
97
+ }
98
+
99
+ /** WCAG contrast ratio between two hex colors, 1 to 21. Null if either isn't a hex color. */
100
+ export function contrastRatio(a: string, b: string): number | null {
101
+ const ra = hexToRgb(a);
102
+ const rb = hexToRgb(b);
103
+ if (!ra || !rb) return null;
104
+ const la = luminance(ra);
105
+ const lb = luminance(rb);
106
+ return (Math.max(la, lb) + 0.05) / (Math.min(la, lb) + 0.05);
107
+ }
@@ -1,39 +0,0 @@
1
- <script lang="ts">
2
- import { themeStore, type Theme } from '../../../theme/themeStore.svelte';
3
- import * as Select from '../select';
4
- import { Palette } from '@lucide/svelte';
5
-
6
- const themes: { value: Theme; label: string; description: string }[] = [
7
- { value: 'neutral', label: 'Neutral', description: 'Classic grayscale' },
8
- { value: 'selva', label: 'Selva', description: 'Forest green' },
9
- { value: 'ocean', label: 'Ocean', description: 'Calm blue tones' },
10
- { value: 'cyberpunk', label: 'Cyberpunk', description: 'Vibrant neon colors' }
11
- ];
12
-
13
- let value = $state(themeStore.current);
14
-
15
- $effect(() => {
16
- if (value) {
17
- themeStore.set(value as Theme);
18
- }
19
- });
20
-
21
- const triggerContent = $derived(themes.find((t) => t.value === value)?.label ?? 'Select theme');
22
- </script>
23
-
24
- <Select.Root type="single" bind:value>
25
- <Select.Trigger class="gap-2 w-35">
26
- <Palette size={14} />
27
- <span>{triggerContent}</span>
28
- </Select.Trigger>
29
- <Select.Content>
30
- {#each themes as theme (theme.value)}
31
- <Select.Item value={theme.value} label={theme.label}>
32
- <div class="flex flex-col items-start">
33
- <span class="font-medium text-sm">{theme.label}</span>
34
- <span class="text-xs text-muted-foreground">{theme.description}</span>
35
- </div>
36
- </Select.Item>
37
- {/each}
38
- </Select.Content>
39
- </Select.Root>
@@ -1,3 +0,0 @@
1
- declare const ThemeSwitcher: import("svelte").Component<Record<string, never>, {}, "">;
2
- type ThemeSwitcher = ReturnType<typeof ThemeSwitcher>;
3
- export default ThemeSwitcher;
@@ -1 +0,0 @@
1
- export { default as ThemeSwitcher } from './ThemeSwitcher.svelte';
@@ -1 +0,0 @@
1
- export { default as ThemeSwitcher } from './ThemeSwitcher.svelte';
@@ -1,98 +0,0 @@
1
- :root {
2
- --radius: 0.625rem;
3
-
4
- --background: oklch(0.98 0.01 300);
5
- --foreground: oklch(0.18 0.05 300);
6
-
7
- --card: oklch(0.97 0.015 300);
8
- --card-foreground: oklch(0.18 0.05 300);
9
-
10
- --popover: oklch(0.97 0.015 300);
11
- --popover-foreground: oklch(0.18 0.05 300);
12
-
13
- --primary: oklch(0.7 0.28 295);
14
- --primary-foreground: oklch(0.98 0 0);
15
-
16
- --secondary: oklch(0.9 0.05 300);
17
- --secondary-foreground: oklch(0.18 0.05 300);
18
-
19
- --muted: oklch(0.92 0.015 300);
20
- --muted-foreground: oklch(0.5 0.03 300);
21
-
22
- --accent: oklch(0.78 0.2 305);
23
- --accent-foreground: oklch(0.12 0.05 300);
24
-
25
- --destructive: oklch(0.62 0.25 20);
26
- --destructive-foreground: oklch(0.98 0 0);
27
-
28
- --border: oklch(0.86 0.02 300);
29
- --input: oklch(0.92 0.015 300);
30
- --ring: oklch(0.75 0.18 295);
31
-
32
- --chart-1: oklch(0.7 0.28 295);
33
- --chart-2: oklch(0.8 0.24 305);
34
- --chart-3: oklch(0.65 0.22 310);
35
- --chart-4: oklch(0.55 0.18 290);
36
- --chart-5: oklch(0.85 0.15 300);
37
-
38
- --sidebar: oklch(0.97 0.015 300);
39
- --sidebar-foreground: oklch(0.18 0.05 300);
40
- --sidebar-primary: oklch(0.7 0.28 295);
41
- --sidebar-primary-foreground: oklch(0.98 0 0);
42
- --sidebar-accent: oklch(0.92 0.015 300);
43
- --sidebar-accent-foreground: oklch(0.18 0.05 300);
44
- --sidebar-border: oklch(0.86 0.02 300);
45
- --sidebar-ring: oklch(0.75 0.18 295);
46
-
47
- --inputparam: oklch(0.86 0.02 300);
48
- --outputparam: oklch(0.86 0.04 305);
49
- --downloadparam: oklch(0.86 0.05 295);
50
- }
51
-
52
- .dark {
53
- --background: oklch(0.18 0.05 300);
54
- --foreground: oklch(0.98 0 0);
55
-
56
- --card: oklch(0.22 0.05 300);
57
- --card-foreground: oklch(0.98 0 0);
58
-
59
- --popover: oklch(0.22 0.05 300);
60
- --popover-foreground: oklch(0.98 0 0);
61
-
62
- --primary: oklch(0.7 0.28 295);
63
- --primary-foreground: oklch(0.18 0.05 300);
64
-
65
- --secondary: oklch(0.28 0.03 300);
66
- --secondary-foreground: oklch(0.98 0 0);
67
-
68
- --muted: oklch(0.28 0.03 300);
69
- --muted-foreground: oklch(0.75 0.04 300);
70
-
71
- --accent: oklch(0.22 0.05 305);
72
- --accent-foreground: oklch(0.98 0 0);
73
-
74
- --destructive: oklch(0.55 0.22 20);
75
- --destructive-foreground: oklch(0.18 0.05 300);
76
-
77
- --border: oklch(0.35 0.04 300);
78
- --input: oklch(0.3 0.03 300);
79
- --ring: oklch(0.75 0.18 295);
80
-
81
- --chart-1: oklch(0.7 0.28 295);
82
- --chart-2: oklch(0.8 0.24 305);
83
- --chart-3: oklch(0.65 0.22 310);
84
- --chart-4: oklch(0.32 0.03 300);
85
- --chart-5: oklch(0.85 0.15 300);
86
-
87
- --sidebar: oklch(0.18 0.05 300);
88
- --sidebar-foreground: oklch(0.98 0 0);
89
- --sidebar-primary: oklch(0.7 0.28 295);
90
- --sidebar-primary-foreground: oklch(0.18 0.05 300);
91
- --sidebar-accent: oklch(0.28 0.03 300);
92
- --sidebar-accent-foreground: oklch(0.98 0 0);
93
- --sidebar-border: oklch(0.35 0.04 300);
94
- --sidebar-ring: oklch(0.75 0.18 295);
95
-
96
- --inputparam: oklch(0.12 0.03 300);
97
- --outputparam: oklch(0.32 0.04 305);
98
- }
@@ -1,72 +0,0 @@
1
- :root {
2
- --radius: 0.625rem;
3
- --background: oklch(1 0 0);
4
- --foreground: oklch(0.145 0 0);
5
- --card: oklch(1 0 0);
6
- --card-foreground: oklch(0.145 0 0);
7
- --popover: oklch(1 0 0);
8
- --popover-foreground: oklch(0.145 0 0);
9
- --primary: oklch(0.205 0 0);
10
- --primary-foreground: oklch(0.985 0 0);
11
- --secondary: oklch(0.97 0 0);
12
- --secondary-foreground: oklch(0.205 0 0);
13
- --muted: oklch(0.97 0 0);
14
- --muted-foreground: oklch(0.556 0 0);
15
- --accent: oklch(0.97 0 0);
16
- --accent-foreground: oklch(0.205 0 0);
17
- --destructive: oklch(0.577 0.245 27.325);
18
- --border: oklch(87.61% 0.0001 271.152);
19
- --input: oklch(0.922 0 0);
20
- --ring: oklch(0.708 0 0);
21
- --chart-1: oklch(0.646 0.222 41.116);
22
- --chart-2: oklch(0.6 0.118 184.704);
23
- --chart-3: oklch(0.398 0.07 227.392);
24
- --chart-4: oklch(0.828 0.189 84.429);
25
- --chart-5: oklch(0.769 0.188 70.08);
26
- --sidebar: oklch(0.985 0 0);
27
- --sidebar-foreground: oklch(0.145 0 0);
28
- --sidebar-primary: oklch(0.205 0 0);
29
- --sidebar-primary-foreground: oklch(0.985 0 0);
30
- --sidebar-accent: oklch(0.97 0 0);
31
- --sidebar-accent-foreground: oklch(0.205 0 0);
32
- --sidebar-border: oklch(0.922 0 0);
33
- --sidebar-ring: oklch(0.708 0 0);
34
- --inputparam: oklch(100% 0.00011 271.152);
35
- --outputparam: oklch(100% 0.00011 271.152);
36
- }
37
-
38
- .dark {
39
- --background: oklch(0.145 0 0);
40
- --foreground: oklch(0.985 0 0);
41
- --card: oklch(0.205 0 0);
42
- --card-foreground: oklch(0.985 0 0);
43
- --popover: oklch(0.205 0 0);
44
- --popover-foreground: oklch(0.985 0 0);
45
- --primary: oklch(0.922 0 0);
46
- --primary-foreground: oklch(0.205 0 0);
47
- --secondary: oklch(0.269 0 0);
48
- --secondary-foreground: oklch(0.985 0 0);
49
- --muted: oklch(0.269 0 0);
50
- --muted-foreground: oklch(0.708 0 0);
51
- --accent: oklch(0.269 0 0);
52
- --accent-foreground: oklch(0.985 0 0);
53
- --destructive: oklch(0.704 0.191 22.216);
54
- --border: oklch(1 0 0 / 10%);
55
- --input: oklch(1 0 0 / 15%);
56
- --ring: oklch(0.556 0 0);
57
- --chart-1: oklch(0.488 0.243 264.376);
58
- --chart-2: oklch(0.696 0.17 162.48);
59
- --chart-3: oklch(0.769 0.188 70.08);
60
- --chart-4: oklch(0.627 0.265 303.9);
61
- --chart-5: oklch(0.645 0.246 16.439);
62
- --sidebar: oklch(0.205 0 0);
63
- --sidebar-foreground: oklch(0.985 0 0);
64
- --sidebar-primary: oklch(0.488 0.243 264.376);
65
- --sidebar-primary-foreground: oklch(0.985 0 0);
66
- --sidebar-accent: oklch(0.269 0 0);
67
- --sidebar-accent-foreground: oklch(0.985 0 0);
68
- --sidebar-border: oklch(1 0 0 / 10%);
69
- --sidebar-ring: oklch(0.556 0 0);
70
- --inputparam: oklch(0% 0 271.152);
71
- --outputparam: oklch(23.574% 0.00241 67.461);
72
- }
@@ -1,75 +0,0 @@
1
- :root {
2
- --radius: 0.625rem;
3
- --background: oklch(0.98 0.003 260);
4
- --foreground: oklch(0.22 0.01 260);
5
- --card: oklch(0.97 0.002 260);
6
- --card-foreground: oklch(0.22 0.01 260);
7
- --popover: oklch(0.97 0.002 260);
8
- --popover-foreground: oklch(0.22 0.01 260);
9
- --primary: oklch(0.62 0.18 275);
10
- --primary-foreground: oklch(0.98 0 0);
11
- --secondary: oklch(0.85 0.05 260);
12
- --secondary-foreground: oklch(0.22 0.01 260);
13
- --muted: oklch(0.92 0.01 260);
14
- --muted-foreground: oklch(0.45 0.02 260);
15
- --accent: oklch(0.78 0.04 275);
16
- --accent-foreground: oklch(0.15 0.01 260);
17
- --destructive: oklch(0.6 0.23 20);
18
- --destructive-foreground: oklch(0.98 0 0);
19
- --border: oklch(0.85 0.01 260);
20
- --input: oklch(0.92 0.01 260);
21
- --ring: oklch(0.55 0.04 275);
22
- --chart-1: oklch(0.62 0.18 275);
23
- --chart-2: oklch(0.68 0.14 255);
24
- --chart-3: oklch(0.74 0.12 290);
25
- --chart-4: oklch(0.5 0.09 270);
26
- --chart-5: oklch(0.82 0.06 250);
27
- --sidebar: oklch(0.97 0.002 260);
28
- --sidebar-foreground: oklch(0.22 0.01 260);
29
- --sidebar-primary: oklch(0.62 0.18 275);
30
- --sidebar-primary-foreground: oklch(0.98 0 0);
31
- --sidebar-accent: oklch(0.92 0.01 260);
32
- --sidebar-accent-foreground: oklch(0.22 0.01 260);
33
- --sidebar-border: oklch(0.85 0.01 260);
34
- --sidebar-ring: oklch(0.55 0.04 275);
35
- --inputparam: oklch(0.86 0.01 260);
36
- --outputparam: oklch(0.86 0.0156 280);
37
- --downloadparam: oklch(0.86 0.021 265);
38
- }
39
-
40
- .dark {
41
- --background: oklch(0.22 0.01 260);
42
- --foreground: oklch(0.98 0 0);
43
- --card: oklch(0.27 0.01 260);
44
- --card-foreground: oklch(0.98 0 0);
45
- --popover: oklch(0.27 0.01 260);
46
- --popover-foreground: oklch(0.98 0 0);
47
- --primary: oklch(0.62 0.18 275);
48
- --primary-foreground: oklch(0.22 0.01 260);
49
- --secondary: oklch(0.32 0.015 260);
50
- --secondary-foreground: oklch(0.98 0 0);
51
- --muted: oklch(0.32 0.01 260);
52
- --muted-foreground: oklch(0.78 0.02 260);
53
- --accent: oklch(0.27 0.01 275);
54
- --accent-foreground: oklch(0.98 0 0);
55
- --destructive: oklch(0.55 0.22 20);
56
- --destructive-foreground: oklch(0.22 0.01 260);
57
- --border: oklch(0.4 0.01 260);
58
- --input: oklch(0.35 0.01 260);
59
- --ring: oklch(0.78 0.02 260);
60
- --chart-1: oklch(0.62 0.18 275);
61
- --chart-2: oklch(0.68 0.14 255);
62
- --chart-3: oklch(0.74 0.12 290);
63
- --chart-4: oklch(0.32 0.015 260);
64
- --chart-5: oklch(0.82 0.06 250);
65
- --sidebar: oklch(0.22 0.01 260);
66
- --sidebar-foreground: oklch(0.98 0 0);
67
- --sidebar-primary: oklch(0.62 0.18 275);
68
- --sidebar-primary-foreground: oklch(0.22 0.01 260);
69
- --sidebar-accent: oklch(0.32 0.015 260);
70
- --sidebar-accent-foreground: oklch(0.98 0 0);
71
- --sidebar-border: oklch(0.4 0.01 260);
72
- --sidebar-ring: oklch(0.78 0.02 260);
73
- --inputparam: oklch(0.12 0.01 260);
74
- --outputparam: oklch(0.36 0.0156 280);
75
- }