@nocoo/basalt 2.0.2 → 2.1.0

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 (300) hide show
  1. package/README.md +134 -15
  2. package/ai/COMPATIBILITY.md +180 -0
  3. package/ai/INTEGRATION.md +1760 -0
  4. package/ai/RECIPES.md +161 -0
  5. package/ai/USAGE.md +99 -0
  6. package/ai/registry.json +38099 -0
  7. package/ai/sources.json +10 -0
  8. package/dist/assets/brand-mark.d.ts +1 -0
  9. package/dist/assets/brand-mark.js +7 -0
  10. package/dist/assets/brand-mark.js.map +1 -0
  11. package/dist/charts/area.d.ts +58 -5
  12. package/dist/charts/area.js +20 -12
  13. package/dist/charts/area.js.map +1 -1
  14. package/dist/charts/bar.d.ts +54 -5
  15. package/dist/charts/bar.js +16 -10
  16. package/dist/charts/bar.js.map +1 -1
  17. package/dist/charts/bullet.d.ts +18 -1
  18. package/dist/charts/bullet.js +6 -3
  19. package/dist/charts/bullet.js.map +1 -1
  20. package/dist/charts/charts.d.ts +58 -5
  21. package/dist/charts/charts.js +13 -2
  22. package/dist/charts/charts.js.map +1 -1
  23. package/dist/charts/config.d.ts +7 -0
  24. package/dist/charts/config.js +5 -1
  25. package/dist/charts/config.js.map +1 -1
  26. package/dist/charts/custom-chart.d.ts +58 -5
  27. package/dist/charts/custom-chart.js +13 -2
  28. package/dist/charts/custom-chart.js.map +1 -1
  29. package/dist/charts/donut.d.ts +18 -1
  30. package/dist/charts/donut.js +6 -3
  31. package/dist/charts/donut.js.map +1 -1
  32. package/dist/charts/frame.d.ts +40 -3
  33. package/dist/charts/frame.js +55 -28
  34. package/dist/charts/frame.js.map +1 -1
  35. package/dist/charts/funnel.d.ts +18 -1
  36. package/dist/charts/funnel.js +5 -1
  37. package/dist/charts/funnel.js.map +1 -1
  38. package/dist/charts/gauge.d.ts +18 -1
  39. package/dist/charts/gauge.js +38 -20
  40. package/dist/charts/gauge.js.map +1 -1
  41. package/dist/charts/grouped-bar.d.ts +54 -5
  42. package/dist/charts/grouped-bar.js +16 -10
  43. package/dist/charts/grouped-bar.js.map +1 -1
  44. package/dist/charts/heatmap-calendar.d.ts +61 -0
  45. package/dist/charts/heatmap-calendar.js +287 -96
  46. package/dist/charts/heatmap-calendar.js.map +1 -1
  47. package/dist/charts/heatmap-matrix.d.ts +99 -0
  48. package/dist/charts/heatmap-matrix.js +249 -0
  49. package/dist/charts/heatmap-matrix.js.map +1 -0
  50. package/dist/charts/line.d.ts +66 -5
  51. package/dist/charts/line.js +37 -30
  52. package/dist/charts/line.js.map +1 -1
  53. package/dist/charts/palette.d.ts +1 -0
  54. package/dist/charts/palette.js +7 -1
  55. package/dist/charts/palette.js.map +1 -1
  56. package/dist/charts/radar.d.ts +18 -1
  57. package/dist/charts/radar.js +26 -19
  58. package/dist/charts/radar.js.map +1 -1
  59. package/dist/charts/sankey.d.ts +18 -1
  60. package/dist/charts/sankey.js +4 -1
  61. package/dist/charts/sankey.js.map +1 -1
  62. package/dist/charts/series.d.ts +5 -7
  63. package/dist/charts/series.js.map +1 -1
  64. package/dist/charts/slot-bar.d.ts +38 -6
  65. package/dist/charts/slot-bar.js +5 -2
  66. package/dist/charts/slot-bar.js.map +1 -1
  67. package/dist/charts/sparkline.d.ts +35 -5
  68. package/dist/charts/sparkline.js +22 -18
  69. package/dist/charts/sparkline.js.map +1 -1
  70. package/dist/charts/stacked-bar.d.ts +58 -5
  71. package/dist/charts/stacked-bar.js +19 -12
  72. package/dist/charts/stacked-bar.js.map +1 -1
  73. package/dist/charts/stat-card.d.ts +51 -1
  74. package/dist/charts/stat-card.js +66 -39
  75. package/dist/charts/stat-card.js.map +1 -1
  76. package/dist/charts/timeline.d.ts +3 -0
  77. package/dist/charts/timeline.js +4 -3
  78. package/dist/charts/timeline.js.map +1 -1
  79. package/dist/charts/timeseries.d.ts +58 -5
  80. package/dist/charts/timeseries.js +13 -2
  81. package/dist/charts/timeseries.js.map +1 -1
  82. package/dist/charts/tooltip.d.ts +57 -0
  83. package/dist/charts/tooltip.js +119 -2
  84. package/dist/charts/tooltip.js.map +1 -1
  85. package/dist/components/accordion.d.ts +117 -2
  86. package/dist/components/accordion.js +20 -13
  87. package/dist/components/accordion.js.map +1 -1
  88. package/dist/components/alert-dialog.d.ts +131 -13
  89. package/dist/components/alert-dialog.js +13 -10
  90. package/dist/components/alert-dialog.js.map +1 -1
  91. package/dist/components/app-header.js +18 -17
  92. package/dist/components/app-header.js.map +1 -1
  93. package/dist/components/app-shell.js +15 -14
  94. package/dist/components/app-shell.js.map +1 -1
  95. package/dist/components/autocomplete.d.ts +4 -0
  96. package/dist/components/autocomplete.js.map +1 -1
  97. package/dist/components/avatar.d.ts +76 -3
  98. package/dist/components/avatar.js.map +1 -1
  99. package/dist/components/badge.d.ts +15 -1
  100. package/dist/components/badge.js +17 -16
  101. package/dist/components/badge.js.map +1 -1
  102. package/dist/components/banner.d.ts +88 -2
  103. package/dist/components/banner.js +41 -40
  104. package/dist/components/banner.js.map +1 -1
  105. package/dist/components/basalt-mark.js +14 -8
  106. package/dist/components/basalt-mark.js.map +1 -1
  107. package/dist/components/battery-meter.d.ts +10 -0
  108. package/dist/components/battery-meter.js +56 -0
  109. package/dist/components/battery-meter.js.map +1 -0
  110. package/dist/components/breadcrumbs.d.ts +27 -7
  111. package/dist/components/breadcrumbs.js +21 -20
  112. package/dist/components/breadcrumbs.js.map +1 -1
  113. package/dist/components/button.d.ts +48 -2
  114. package/dist/components/button.js +87 -36
  115. package/dist/components/button.js.map +1 -1
  116. package/dist/components/chat-bubble.d.ts +24 -0
  117. package/dist/components/chat-bubble.js +26 -0
  118. package/dist/components/chat-bubble.js.map +1 -0
  119. package/dist/components/chat-composer.d.ts +45 -0
  120. package/dist/components/chat-composer.js +74 -0
  121. package/dist/components/chat-composer.js.map +1 -0
  122. package/dist/components/chat-header.d.ts +25 -0
  123. package/dist/components/chat-header.js +34 -0
  124. package/dist/components/chat-header.js.map +1 -0
  125. package/dist/components/chat-inbox.d.ts +33 -0
  126. package/dist/components/chat-inbox.js +44 -0
  127. package/dist/components/chat-inbox.js.map +1 -0
  128. package/dist/components/checkbox.js +84 -53
  129. package/dist/components/checkbox.js.map +1 -1
  130. package/dist/components/clipboard-text.d.ts +13 -2
  131. package/dist/components/clipboard-text.js +4 -4
  132. package/dist/components/clipboard-text.js.map +1 -1
  133. package/dist/components/collapsible.d.ts +58 -15
  134. package/dist/components/collapsible.js.map +1 -1
  135. package/dist/components/command-palette.d.ts +151 -61
  136. package/dist/components/command-palette.js.map +1 -1
  137. package/dist/components/confirm-dialog.d.ts +1 -1
  138. package/dist/components/confirm-dialog.js +6 -4
  139. package/dist/components/confirm-dialog.js.map +1 -1
  140. package/dist/components/context-menu.d.ts +210 -2
  141. package/dist/components/context-menu.js +7 -4
  142. package/dist/components/context-menu.js.map +1 -1
  143. package/dist/components/data-table.d.ts +40 -2
  144. package/dist/components/data-table.js +168 -120
  145. package/dist/components/data-table.js.map +1 -1
  146. package/dist/components/date-picker.d.ts +53 -2
  147. package/dist/components/date-picker.js +387 -219
  148. package/dist/components/date-picker.js.map +1 -1
  149. package/dist/components/delete-resource.d.ts +7 -1
  150. package/dist/components/delete-resource.js +22 -18
  151. package/dist/components/delete-resource.js.map +1 -1
  152. package/dist/components/description-list.js +16 -15
  153. package/dist/components/description-list.js.map +1 -1
  154. package/dist/components/dialog.d.ts +141 -12
  155. package/dist/components/dialog.js +43 -39
  156. package/dist/components/dialog.js.map +1 -1
  157. package/dist/components/dock.d.ts +39 -0
  158. package/dist/components/dock.js +97 -0
  159. package/dist/components/dock.js.map +1 -0
  160. package/dist/components/dropdown-menu.d.ts +229 -15
  161. package/dist/components/dropdown-menu.js +9 -6
  162. package/dist/components/dropdown-menu.js.map +1 -1
  163. package/dist/components/editable-nav-item.d.ts +33 -0
  164. package/dist/components/editable-nav-item.js +90 -0
  165. package/dist/components/editable-nav-item.js.map +1 -0
  166. package/dist/components/empty.d.ts +22 -2
  167. package/dist/components/empty.js +22 -13
  168. package/dist/components/empty.js.map +1 -1
  169. package/dist/components/fab.d.ts +23 -0
  170. package/dist/components/fab.js +25 -0
  171. package/dist/components/fab.js.map +1 -0
  172. package/dist/components/field.js +31 -30
  173. package/dist/components/field.js.map +1 -1
  174. package/dist/components/file-dropzone.d.ts +37 -0
  175. package/dist/components/file-dropzone.js +103 -0
  176. package/dist/components/file-dropzone.js.map +1 -0
  177. package/dist/components/filter-bar.d.ts +34 -0
  178. package/dist/components/filter-bar.js +52 -0
  179. package/dist/components/filter-bar.js.map +1 -0
  180. package/dist/components/flow.js +19 -18
  181. package/dist/components/flow.js.map +1 -1
  182. package/dist/components/grid.d.ts +3 -1
  183. package/dist/components/grid.js.map +1 -1
  184. package/dist/components/hover-card.d.ts +111 -1
  185. package/dist/components/hover-card.js +9 -6
  186. package/dist/components/hover-card.js.map +1 -1
  187. package/dist/components/icon-picker.d.ts +34 -0
  188. package/dist/components/icon-picker.js +77 -0
  189. package/dist/components/icon-picker.js.map +1 -0
  190. package/dist/components/inline-editable.d.ts +46 -0
  191. package/dist/components/inline-editable.js +124 -0
  192. package/dist/components/inline-editable.js.map +1 -0
  193. package/dist/components/input-area.js +3 -3
  194. package/dist/components/input-group.js +7 -7
  195. package/dist/components/input.js +3 -3
  196. package/dist/components/label.js +18 -17
  197. package/dist/components/label.js.map +1 -1
  198. package/dist/components/layer-card.d.ts +10 -2
  199. package/dist/components/layer-card.js +71 -68
  200. package/dist/components/layer-card.js.map +1 -1
  201. package/dist/components/loader.d.ts +10 -2
  202. package/dist/components/loader.js.map +1 -1
  203. package/dist/components/menu-bar.d.ts +174 -6
  204. package/dist/components/menu-bar.js +33 -29
  205. package/dist/components/menu-bar.js.map +1 -1
  206. package/dist/components/meter.d.ts +27 -2
  207. package/dist/components/meter.js.map +1 -1
  208. package/dist/components/multi-select.d.ts +64 -0
  209. package/dist/components/multi-select.js +218 -0
  210. package/dist/components/multi-select.js.map +1 -0
  211. package/dist/components/navigation-menu.d.ts +88 -5
  212. package/dist/components/navigation-menu.js.map +1 -1
  213. package/dist/components/overlay.js +6 -5
  214. package/dist/components/overlay.js.map +1 -1
  215. package/dist/components/page-header.js +23 -21
  216. package/dist/components/page-header.js.map +1 -1
  217. package/dist/components/pagination.js +7 -7
  218. package/dist/components/popover.d.ts +136 -16
  219. package/dist/components/popover.js +32 -28
  220. package/dist/components/popover.js.map +1 -1
  221. package/dist/components/radio.js +38 -37
  222. package/dist/components/radio.js.map +1 -1
  223. package/dist/components/resource-list.d.ts +26 -1
  224. package/dist/components/resource-list.js +28 -15
  225. package/dist/components/resource-list.js.map +1 -1
  226. package/dist/components/responsive-master-detail.d.ts +27 -0
  227. package/dist/components/responsive-master-detail.js +85 -0
  228. package/dist/components/responsive-master-detail.js.map +1 -0
  229. package/dist/components/section-rule.js +23 -22
  230. package/dist/components/section-rule.js.map +1 -1
  231. package/dist/components/select.d.ts +27 -3
  232. package/dist/components/select.js +11 -11
  233. package/dist/components/select.js.map +1 -1
  234. package/dist/components/sheet.d.ts +115 -11
  235. package/dist/components/sheet.js +37 -30
  236. package/dist/components/sheet.js.map +1 -1
  237. package/dist/components/sidebar.d.ts +109 -17
  238. package/dist/components/sidebar.js +109 -108
  239. package/dist/components/sidebar.js.map +1 -1
  240. package/dist/components/skeleton-line.d.ts +22 -2
  241. package/dist/components/skeleton-line.js.map +1 -1
  242. package/dist/components/slider.d.ts +61 -1
  243. package/dist/components/slider.js +31 -15
  244. package/dist/components/slider.js.map +1 -1
  245. package/dist/components/stat-strip.js +16 -15
  246. package/dist/components/stat-strip.js.map +1 -1
  247. package/dist/components/switch.js +78 -47
  248. package/dist/components/switch.js.map +1 -1
  249. package/dist/components/table-of-contents.js +18 -17
  250. package/dist/components/table-of-contents.js.map +1 -1
  251. package/dist/components/table-pager.js +20 -19
  252. package/dist/components/table-pager.js.map +1 -1
  253. package/dist/components/table.d.ts +9 -3
  254. package/dist/components/table.js +19 -18
  255. package/dist/components/table.js.map +1 -1
  256. package/dist/components/tabs.js +29 -22
  257. package/dist/components/tabs.js.map +1 -1
  258. package/dist/components/tag-badge.d.ts +58 -0
  259. package/dist/components/tag-badge.js +72 -0
  260. package/dist/components/tag-badge.js.map +1 -0
  261. package/dist/components/tag-color-picker.d.ts +20 -0
  262. package/dist/components/tag-color-picker.js +42 -0
  263. package/dist/components/tag-color-picker.js.map +1 -0
  264. package/dist/components/text.js +17 -16
  265. package/dist/components/text.js.map +1 -1
  266. package/dist/components/toast.d.ts +173 -3
  267. package/dist/components/toast.js +1 -1
  268. package/dist/components/toast.js.map +1 -1
  269. package/dist/components/toggle-group.d.ts +88 -2
  270. package/dist/components/toggle-group.js +32 -31
  271. package/dist/components/toggle-group.js.map +1 -1
  272. package/dist/components/toggle.d.ts +35 -2
  273. package/dist/components/toggle.js +12 -11
  274. package/dist/components/toggle.js.map +1 -1
  275. package/dist/components/tooltip.d.ts +144 -6
  276. package/dist/components/tooltip.js +9 -6
  277. package/dist/components/tooltip.js.map +1 -1
  278. package/dist/components/typeahead-field.js +193 -132
  279. package/dist/components/typeahead-field.js.map +1 -1
  280. package/dist/components/upload-queue.d.ts +51 -0
  281. package/dist/components/upload-queue.js +116 -0
  282. package/dist/components/upload-queue.js.map +1 -0
  283. package/dist/providers/accent.d.ts +46 -2
  284. package/dist/providers/accent.js +358 -172
  285. package/dist/providers/accent.js.map +1 -1
  286. package/dist/providers/link.d.ts +14 -4
  287. package/dist/providers/link.js.map +1 -1
  288. package/dist/providers/theme.d.ts +38 -2
  289. package/dist/providers/theme.js +160 -27
  290. package/dist/providers/theme.js.map +1 -1
  291. package/dist/styles/base.css +83 -0
  292. package/dist/styles/standalone.css +820 -120
  293. package/dist/styles/tailwind.css +21 -7
  294. package/dist/styles/tokens.css +146 -91
  295. package/dist/utils/control-surface.d.ts +2 -1
  296. package/dist/utils/control-surface.js +4 -4
  297. package/dist/utils/control-surface.js.map +1 -1
  298. package/dist/utils/selection-indicator.js +2 -2
  299. package/dist/utils/selection-indicator.js.map +1 -1
  300. package/package.json +8 -4
@@ -1,4 +1,8 @@
1
1
  @import "./tokens.css";
2
+ @import "./base.css";
3
+
4
+ /* Library variants follow ThemeProvider without changing the application's dark variant. */
5
+ @custom-variant basalt-dark (&:where(.dark, .dark *, [data-mode="dark"], [data-mode="dark"] *));
2
6
 
3
7
  @theme inline {
4
8
  --color-basalt-background: hsl(var(--basalt-background));
@@ -20,10 +24,13 @@
20
24
  --color-basalt-destructive: hsl(var(--basalt-destructive));
21
25
  --color-basalt-destructive-foreground: hsl(var(--basalt-destructive-foreground));
22
26
  --color-basalt-info: hsl(var(--basalt-info));
27
+ --color-basalt-info-foreground: hsl(var(--basalt-info-foreground));
23
28
  --color-basalt-info-tint: hsl(var(--basalt-info-tint));
24
29
  --color-basalt-warning: hsl(var(--basalt-warning));
30
+ --color-basalt-warning-foreground: hsl(var(--basalt-warning-foreground));
25
31
  --color-basalt-warning-tint: hsl(var(--basalt-warning-tint));
26
32
  --color-basalt-danger: hsl(var(--basalt-danger));
33
+ --color-basalt-danger-foreground: hsl(var(--basalt-danger-foreground));
27
34
  --color-basalt-danger-tint: hsl(var(--basalt-danger-tint));
28
35
  --color-basalt-border: hsl(var(--basalt-border));
29
36
  --color-basalt-input: hsl(var(--basalt-input));
@@ -52,6 +59,11 @@
52
59
  --color-basalt-chart-22: hsl(var(--basalt-chart-22));
53
60
  --color-basalt-chart-23: hsl(var(--basalt-chart-23));
54
61
  --color-basalt-chart-24: hsl(var(--basalt-chart-24));
62
+ --color-basalt-badge-green-foreground: hsl(var(--basalt-badge-green-foreground));
63
+ --color-basalt-badge-teal: hsl(var(--basalt-badge-teal));
64
+ --color-basalt-badge-purple: hsl(var(--basalt-badge-purple));
65
+ --color-basalt-badge-teal-foreground: hsl(var(--basalt-badge-teal-foreground));
66
+ --color-basalt-badge-purple-foreground: hsl(var(--basalt-badge-purple-foreground));
55
67
  --color-basalt-chart-axis: hsl(var(--basalt-chart-axis));
56
68
  --color-basalt-chart-muted: hsl(var(--basalt-chart-muted));
57
69
  --color-basalt-heatmap-green-1: hsl(var(--basalt-heatmap-green-1));
@@ -93,12 +105,14 @@
93
105
  --animate-basalt-tab-in: basalt-tab-in 180ms ease-out;
94
106
  }
95
107
 
96
- .basalt-chart .recharts-wrapper :focus,
97
- .basalt-chart .recharts-wrapper :focus-visible,
98
- .basalt-chart .recharts-surface :focus,
99
- .basalt-chart .recharts-surface :focus-visible,
100
- .basalt-chart .recharts-sector:focus,
101
- .basalt-chart .recharts-rectangle:focus,
102
- .basalt-chart .recharts-layer:focus {
108
+ .basalt-chart .recharts-sector:focus:not(:focus-visible),
109
+ .basalt-chart .recharts-rectangle:focus:not(:focus-visible),
110
+ .basalt-chart .recharts-layer:focus:not(:focus-visible),
111
+ .basalt-chart .recharts-surface:focus:not(:focus-visible) {
103
112
  outline: none;
104
113
  }
114
+
115
+ .basalt-chart :focus-visible {
116
+ outline: 2px solid hsl(var(--basalt-ring));
117
+ outline-offset: 2px;
118
+ }
@@ -10,23 +10,26 @@
10
10
  --basalt-popover: 0 0% 100%;
11
11
  --basalt-popover-foreground: 0 0% 12%;
12
12
  --basalt-bright: 0 0% 100%;
13
- --basalt-primary: 217 91% 60%;
13
+ --basalt-primary: 204 88% 32%;
14
14
  --basalt-primary-foreground: 0 0% 100%;
15
15
  --basalt-muted: 220 14% 92%;
16
- --basalt-muted-foreground: 0 0% 45%;
16
+ --basalt-muted-foreground: 0 0% 40%;
17
17
  --basalt-accent: 220 14% 92%;
18
18
  --basalt-accent-foreground: 0 0% 12%;
19
- --basalt-destructive: 0 72% 51%;
19
+ --basalt-destructive: 0 72% 49%;
20
20
  --basalt-destructive-foreground: 0 0% 100%;
21
21
  --basalt-info: 221 72% 38%;
22
+ --basalt-info-foreground: 0 0% 100%;
22
23
  --basalt-info-tint: 217 80% 95%;
23
24
  --basalt-warning: 28 72% 36%;
25
+ --basalt-warning-foreground: 0 0% 100%;
24
26
  --basalt-warning-tint: 40 86% 95%;
25
27
  --basalt-danger: 0 70% 40%;
28
+ --basalt-danger-foreground: 0 0% 100%;
26
29
  --basalt-danger-tint: 0 78% 96%;
27
30
  --basalt-border: 220 13% 88%;
28
31
  --basalt-input: 220 13% 88%;
29
- --basalt-ring: 217 91% 60%;
32
+ --basalt-ring: var(--basalt-primary);
30
33
  --basalt-control-fill: hsl(var(--basalt-secondary));
31
34
  --basalt-zebra-fill: hsl(var(--basalt-bright));
32
35
  --basalt-radius: 0.75rem;
@@ -35,48 +38,72 @@
35
38
  --basalt-radius-widget: 10px;
36
39
  --basalt-font-sans: "Inter", system-ui, -apple-system, sans-serif;
37
40
  --basalt-font-display: "DM Sans", system-ui, sans-serif;
38
- --basalt-chart-1: 217 91% 60%;
39
- --basalt-chart-2: 200 90% 55%;
40
- --basalt-chart-3: 186 80% 45%;
41
- --basalt-chart-4: 166 72% 44%;
42
- --basalt-chart-5: 142 71% 45%;
43
- --basalt-chart-6: 84 65% 46%;
44
- --basalt-chart-7: 45 93% 47%;
45
- --basalt-chart-8: 30 90% 55%;
46
- --basalt-chart-9: 15 85% 52%;
47
- --basalt-chart-10: 0 72% 51%;
48
- --basalt-chart-11: 340 82% 55%;
49
- --basalt-chart-12: 320 70% 55%;
50
- --basalt-chart-13: 290 65% 55%;
51
- --basalt-chart-14: 270 70% 60%;
52
- --basalt-chart-15: 250 65% 58%;
53
- --basalt-chart-16: 230 70% 56%;
54
- --basalt-chart-17: 210 55% 50%;
55
- --basalt-chart-18: 195 45% 55%;
56
- --basalt-chart-19: 160 50% 50%;
57
- --basalt-chart-20: 100 50% 48%;
58
- --basalt-chart-21: 60 65% 45%;
59
- --basalt-chart-22: 22 80% 50%;
60
- --basalt-chart-23: 350 65% 50%;
61
- --basalt-chart-24: 0 0% 25%;
41
+ /* Match the classic candy swatches; gray and preference ownership stay independent. */
42
+ --basalt-chart-blue: 204 88% 62%;
43
+ --basalt-chart-pink: 345 88% 72%;
44
+ --basalt-chart-green: 113 58% 62%;
45
+ --basalt-chart-yellow: 49 100% 69%;
46
+ --basalt-chart-pearl: 215 12% 48%;
47
+ --basalt-chart-1: var(--basalt-chart-blue);
48
+ --basalt-chart-2: var(--basalt-chart-blue);
49
+ --basalt-chart-3: var(--basalt-chart-green);
50
+ --basalt-chart-4: var(--basalt-chart-green);
51
+ --basalt-chart-5: var(--basalt-chart-green);
52
+ --basalt-chart-6: var(--basalt-chart-green);
53
+ --basalt-chart-7: var(--basalt-chart-yellow);
54
+ --basalt-chart-8: var(--basalt-chart-yellow);
55
+ --basalt-chart-9: var(--basalt-chart-pink);
56
+ --basalt-chart-10: var(--basalt-chart-pink);
57
+ --basalt-chart-11: var(--basalt-chart-pink);
58
+ --basalt-chart-12: var(--basalt-chart-pink);
59
+ --basalt-chart-13: var(--basalt-chart-pink);
60
+ --basalt-chart-14: var(--basalt-chart-blue);
61
+ --basalt-chart-15: var(--basalt-chart-blue);
62
+ --basalt-chart-16: var(--basalt-chart-blue);
63
+ --basalt-chart-17: var(--basalt-chart-pearl);
64
+ --basalt-chart-18: var(--basalt-chart-pearl);
65
+ --basalt-chart-19: var(--basalt-chart-green);
66
+ --basalt-chart-20: var(--basalt-chart-green);
67
+ --basalt-chart-21: var(--basalt-chart-yellow);
68
+ --basalt-chart-22: var(--basalt-chart-yellow);
69
+ --basalt-chart-23: var(--basalt-chart-pink);
70
+ --basalt-chart-24: var(--basalt-chart-pearl);
71
+ /* Control swatches are independent of the chart palette. */
72
+ --basalt-accent-1: 204 88% 62%;
73
+ --basalt-accent-2: 191 79% 70%;
74
+ --basalt-accent-3: 182 62% 47%;
75
+ --basalt-accent-4: 113 58% 62%;
76
+ --basalt-accent-5: 79 70% 64%;
77
+ --basalt-accent-6: 49 100% 69%;
78
+ --basalt-accent-7: 27 95% 65%;
79
+ --basalt-accent-8: 5 85% 66%;
80
+ --basalt-accent-9: 345 88% 72%;
81
+ --basalt-accent-10: 280 53% 71%;
82
+ --basalt-accent-11: 237 66% 69%;
83
+ --basalt-accent-12: 210 20% 87%;
84
+ --basalt-badge-green-foreground: 0 0% 10%;
85
+ --basalt-badge-teal: var(--basalt-accent-3);
86
+ --basalt-badge-purple: var(--basalt-accent-10);
87
+ --basalt-badge-teal-foreground: 0 0% 10%;
88
+ --basalt-badge-purple-foreground: 0 0% 10%;
62
89
  --basalt-chart-axis: 0 0% 40%;
63
- --basalt-chart-muted: 0 0% 70%;
64
- --basalt-heatmap-green-1: 142 50% 85%;
65
- --basalt-heatmap-green-2: 142 55% 65%;
66
- --basalt-heatmap-green-3: 142 60% 45%;
67
- --basalt-heatmap-green-4: 142 65% 30%;
68
- --basalt-heatmap-red-1: 0 55% 85%;
69
- --basalt-heatmap-red-2: 0 60% 65%;
70
- --basalt-heatmap-red-3: 0 65% 48%;
71
- --basalt-heatmap-red-4: 0 65% 35%;
72
- --basalt-heatmap-blue-1: 217 50% 85%;
73
- --basalt-heatmap-blue-2: 217 55% 65%;
74
- --basalt-heatmap-blue-3: 217 60% 48%;
75
- --basalt-heatmap-blue-4: 217 65% 35%;
76
- --basalt-heatmap-orange-1: 30 55% 85%;
77
- --basalt-heatmap-orange-2: 30 60% 65%;
78
- --basalt-heatmap-orange-3: 30 65% 48%;
79
- --basalt-heatmap-orange-4: 30 65% 35%;
90
+ --basalt-chart-muted: 220 12% 86%;
91
+ --basalt-heatmap-green-1: 113 50% 85%;
92
+ --basalt-heatmap-green-2: 113 55% 65%;
93
+ --basalt-heatmap-green-3: 113 60% 45%;
94
+ --basalt-heatmap-green-4: 113 65% 30%;
95
+ --basalt-heatmap-red-1: 345 55% 85%;
96
+ --basalt-heatmap-red-2: 345 60% 65%;
97
+ --basalt-heatmap-red-3: 345 65% 48%;
98
+ --basalt-heatmap-red-4: 345 65% 35%;
99
+ --basalt-heatmap-blue-1: 204 50% 85%;
100
+ --basalt-heatmap-blue-2: 204 55% 65%;
101
+ --basalt-heatmap-blue-3: 204 60% 48%;
102
+ --basalt-heatmap-blue-4: 204 65% 35%;
103
+ --basalt-heatmap-orange-1: 43 55% 85%;
104
+ --basalt-heatmap-orange-2: 43 60% 65%;
105
+ --basalt-heatmap-orange-3: 43 65% 48%;
106
+ --basalt-heatmap-orange-4: 43 65% 35%;
80
107
  }
81
108
 
82
109
  .dark,
@@ -90,10 +117,10 @@
90
117
  --basalt-popover: 0 0% 10.6%;
91
118
  --basalt-popover-foreground: 0 0% 93%;
92
119
  --basalt-bright: 0 0% 14%;
93
- --basalt-primary: 217 91% 60%;
94
- --basalt-primary-foreground: 0 0% 100%;
120
+ --basalt-primary: 204 90% 70%;
121
+ --basalt-primary-foreground: 0 0% 10%;
95
122
  --basalt-muted: 0 0% 12.2%;
96
- --basalt-muted-foreground: 0 0% 48%;
123
+ --basalt-muted-foreground: 0 0% 63%;
97
124
  --basalt-accent: 0 0% 14%;
98
125
  --basalt-accent-foreground: 0 0% 93%;
99
126
  --basalt-destructive: 0 72% 51%;
@@ -103,54 +130,81 @@
103
130
  --basalt-warning: 32 80% 68%;
104
131
  --basalt-warning-tint: 32 35% 16%;
105
132
  --basalt-danger: 0 75% 70%;
133
+ --basalt-danger-foreground: 0 0% 10%;
106
134
  --basalt-danger-tint: 0 40% 16%;
135
+ --basalt-info-foreground: 0 0% 10%;
136
+ --basalt-warning-foreground: 0 0% 10%;
137
+ --basalt-badge-green-foreground: 0 0% 10%;
138
+ --basalt-badge-teal: var(--basalt-accent-3);
139
+ --basalt-badge-purple: var(--basalt-accent-10);
140
+ --basalt-badge-teal-foreground: 0 0% 10%;
141
+ --basalt-badge-purple-foreground: 0 0% 10%;
107
142
  --basalt-border: 0 0% 16%;
108
143
  --basalt-input: 0 0% 18%;
109
- --basalt-ring: 217 91% 60%;
144
+ --basalt-ring: var(--basalt-primary);
110
145
  --basalt-control-fill: hsl(var(--basalt-secondary));
111
146
  --basalt-zebra-fill: hsl(var(--basalt-bright));
112
- --basalt-chart-1: 217 91% 65%;
113
- --basalt-chart-2: 200 90% 60%;
114
- --basalt-chart-3: 186 80% 50%;
115
- --basalt-chart-4: 166 72% 50%;
116
- --basalt-chart-5: 142 71% 50%;
117
- --basalt-chart-6: 84 65% 52%;
118
- --basalt-chart-7: 45 93% 52%;
119
- --basalt-chart-8: 30 90% 60%;
120
- --basalt-chart-9: 15 85% 57%;
121
- --basalt-chart-10: 0 72% 56%;
122
- --basalt-chart-11: 340 82% 60%;
123
- --basalt-chart-12: 320 70% 60%;
124
- --basalt-chart-13: 290 65% 60%;
125
- --basalt-chart-14: 270 70% 65%;
126
- --basalt-chart-15: 250 65% 63%;
127
- --basalt-chart-16: 230 70% 61%;
128
- --basalt-chart-17: 210 55% 56%;
129
- --basalt-chart-18: 195 45% 60%;
130
- --basalt-chart-19: 160 50% 55%;
131
- --basalt-chart-20: 100 50% 53%;
132
- --basalt-chart-21: 60 65% 50%;
133
- --basalt-chart-22: 22 80% 55%;
134
- --basalt-chart-23: 350 65% 55%;
135
- --basalt-chart-24: 0 0% 65%;
136
- --basalt-chart-axis: 0 0% 50%;
137
- --basalt-chart-muted: 0 0% 35%;
138
- --basalt-heatmap-green-1: 142 45% 25%;
139
- --basalt-heatmap-green-2: 142 50% 35%;
140
- --basalt-heatmap-green-3: 142 55% 45%;
141
- --basalt-heatmap-green-4: 142 60% 58%;
142
- --basalt-heatmap-red-1: 0 45% 25%;
143
- --basalt-heatmap-red-2: 0 55% 35%;
144
- --basalt-heatmap-red-3: 0 60% 45%;
145
- --basalt-heatmap-red-4: 0 65% 55%;
146
- --basalt-heatmap-blue-1: 217 45% 25%;
147
- --basalt-heatmap-blue-2: 217 50% 35%;
148
- --basalt-heatmap-blue-3: 217 55% 45%;
149
- --basalt-heatmap-blue-4: 217 60% 55%;
150
- --basalt-heatmap-orange-1: 30 45% 25%;
151
- --basalt-heatmap-orange-2: 30 55% 35%;
152
- --basalt-heatmap-orange-3: 30 60% 45%;
153
- --basalt-heatmap-orange-4: 30 65% 55%;
147
+ /* Match the classic candy swatches; gray and preference ownership stay independent. */
148
+ --basalt-chart-blue: 204 90% 70%;
149
+ --basalt-chart-pink: 345 88% 77%;
150
+ --basalt-chart-green: 113 58% 70%;
151
+ --basalt-chart-yellow: 49 100% 73%;
152
+ --basalt-chart-pearl: 210 20% 86%;
153
+ --basalt-chart-1: var(--basalt-chart-blue);
154
+ --basalt-chart-2: var(--basalt-chart-blue);
155
+ --basalt-chart-3: var(--basalt-chart-green);
156
+ --basalt-chart-4: var(--basalt-chart-green);
157
+ --basalt-chart-5: var(--basalt-chart-green);
158
+ --basalt-chart-6: var(--basalt-chart-green);
159
+ --basalt-chart-7: var(--basalt-chart-yellow);
160
+ --basalt-chart-8: var(--basalt-chart-yellow);
161
+ --basalt-chart-9: var(--basalt-chart-pink);
162
+ --basalt-chart-10: var(--basalt-chart-pink);
163
+ --basalt-chart-11: var(--basalt-chart-pink);
164
+ --basalt-chart-12: var(--basalt-chart-pink);
165
+ --basalt-chart-13: var(--basalt-chart-pink);
166
+ --basalt-chart-14: var(--basalt-chart-blue);
167
+ --basalt-chart-15: var(--basalt-chart-blue);
168
+ --basalt-chart-16: var(--basalt-chart-blue);
169
+ --basalt-chart-17: var(--basalt-chart-pearl);
170
+ --basalt-chart-18: var(--basalt-chart-pearl);
171
+ --basalt-chart-19: var(--basalt-chart-green);
172
+ --basalt-chart-20: var(--basalt-chart-green);
173
+ --basalt-chart-21: var(--basalt-chart-yellow);
174
+ --basalt-chart-22: var(--basalt-chart-yellow);
175
+ --basalt-chart-23: var(--basalt-chart-pink);
176
+ --basalt-chart-24: var(--basalt-chart-pearl);
177
+ /* Control swatches are independent of the chart palette. */
178
+ --basalt-accent-1: 204 90% 70%;
179
+ --basalt-accent-2: 191 79% 74%;
180
+ --basalt-accent-3: 182 62% 63%;
181
+ --basalt-accent-4: 113 58% 70%;
182
+ --basalt-accent-5: 79 70% 70%;
183
+ --basalt-accent-6: 49 100% 73%;
184
+ --basalt-accent-7: 27 95% 72%;
185
+ --basalt-accent-8: 5 85% 73%;
186
+ --basalt-accent-9: 345 88% 77%;
187
+ --basalt-accent-10: 280 53% 77%;
188
+ --basalt-accent-11: 237 66% 77%;
189
+ --basalt-accent-12: 210 20% 88%;
190
+ --basalt-chart-axis: 0 0% 63%;
191
+ --basalt-chart-muted: 220 6% 24%;
192
+ --basalt-heatmap-green-1: 113 45% 25%;
193
+ --basalt-heatmap-green-2: 113 50% 35%;
194
+ --basalt-heatmap-green-3: 113 55% 45%;
195
+ --basalt-heatmap-green-4: 113 60% 58%;
196
+ --basalt-heatmap-red-1: 345 45% 25%;
197
+ --basalt-heatmap-red-2: 345 55% 35%;
198
+ --basalt-heatmap-red-3: 345 60% 45%;
199
+ --basalt-heatmap-red-4: 345 65% 55%;
200
+ --basalt-heatmap-blue-1: 204 45% 25%;
201
+ --basalt-heatmap-blue-2: 204 50% 35%;
202
+ --basalt-heatmap-blue-3: 204 55% 45%;
203
+ --basalt-heatmap-blue-4: 204 60% 55%;
204
+ --basalt-heatmap-orange-1: 43 45% 25%;
205
+ --basalt-heatmap-orange-2: 43 55% 35%;
206
+ --basalt-heatmap-orange-3: 43 60% 45%;
207
+ --basalt-heatmap-orange-4: 43 65% 55%;
154
208
  }
155
209
 
156
210
  [data-basalt-surface-root] {
@@ -183,6 +237,7 @@
183
237
  --basalt-zebra-fill: hsl(var(--basalt-secondary));
184
238
  }
185
239
 
240
+ /* biome-ignore lint/style/noDescendingSpecificity: Rootless surface trees cannot overlap a surface-root tree. */
186
241
  [data-basalt-surface]:not([data-basalt-surface-root] *) [data-basalt-surface] {
187
242
  background: hsl(var(--basalt-secondary));
188
243
  --basalt-control-fill: hsl(var(--basalt-secondary));
@@ -1,2 +1,3 @@
1
- export declare const CONTROL_SURFACE_CLASS = "rounded-basalt-md border border-basalt-border bg-basalt-control text-sm";
1
+ export declare const BASALT_UI_CLASS = "basalt-ui";
2
+ export declare const CONTROL_SURFACE_CLASS = "basalt-ui rounded-basalt-md border border-basalt-border bg-basalt-control text-sm";
2
3
  export declare function controlSurfaceClass(className?: string): string;
@@ -1,11 +1,11 @@
1
1
  "use client";
2
2
  import { cn as e } from "./cn.js";
3
3
  //#region src/utils/control-surface.ts
4
- var t = "rounded-basalt-md border border-basalt-border bg-basalt-control text-sm";
5
- function n(n) {
6
- return e(t, n);
4
+ var t = "basalt-ui", n = "basalt-ui rounded-basalt-md border border-basalt-border bg-basalt-control text-sm";
5
+ function r(t) {
6
+ return e(n, t);
7
7
  }
8
8
  //#endregion
9
- export { t as CONTROL_SURFACE_CLASS, n as controlSurfaceClass };
9
+ export { t as BASALT_UI_CLASS, n as CONTROL_SURFACE_CLASS, r as controlSurfaceClass };
10
10
 
11
11
  //# sourceMappingURL=control-surface.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"control-surface.js","names":[],"sources":["../../src/utils/control-surface.ts"],"sourcesContent":["import { cn } from \"./cn\";\n\nexport const CONTROL_SURFACE_CLASS =\n\t\"rounded-basalt-md border border-basalt-border bg-basalt-control text-sm\";\n\nexport function controlSurfaceClass(className?: string) {\n\treturn cn(CONTROL_SURFACE_CLASS, className);\n}\n"],"mappings":";;;AAEA,IAAa,IACZ;AAED,SAAgB,EAAoB,GAAoB;CACvD,OAAO,EAAG,GAAuB,CAAS;AAC3C"}
1
+ {"version":3,"file":"control-surface.js","names":[],"sources":["../../src/utils/control-surface.ts"],"sourcesContent":["import { cn } from \"./cn\";\n\nexport const BASALT_UI_CLASS = \"basalt-ui\";\n\nexport const CONTROL_SURFACE_CLASS =\n\t\"basalt-ui rounded-basalt-md border border-basalt-border bg-basalt-control text-sm\";\n\nexport function controlSurfaceClass(className?: string) {\n\treturn cn(CONTROL_SURFACE_CLASS, className);\n}\n"],"mappings":";;;AAEA,IAAa,IAAkB,aAElB,IACZ;AAED,SAAgB,EAAoB,GAAoB;CACvD,OAAO,EAAG,GAAuB,CAAS;AAC3C"}
@@ -26,7 +26,7 @@ function o(e) {
26
26
  for (let n of e.children) n instanceof HTMLElement && n.getAttribute("aria-hidden") !== "true" && t.push(n);
27
27
  return t;
28
28
  }
29
- function s({ itemSelector: s, enabled: c = !0, mapGeometry: l = i, ref: u }) {
29
+ function s({ itemSelector: s, enabled: c = !0, mapGeometry: l, ref: u }) {
30
30
  let d = e.useRef(null), f = e.useMemo(() => (e) => {
31
31
  d.current = e, r(u, e);
32
32
  }, [u]), [p, m] = e.useState({
@@ -60,7 +60,7 @@ function s({ itemSelector: s, enabled: c = !0, mapGeometry: l = i, ref: u }) {
60
60
  }));
61
61
  return;
62
62
  }
63
- let r = l(t, e);
63
+ let r = (l ?? i)(t, e);
64
64
  m((e) => ({
65
65
  ...r,
66
66
  visible: !0,
@@ -1 +1 @@
1
- {"version":3,"file":"selection-indicator.js","names":[],"sources":["../../src/utils/selection-indicator.ts"],"sourcesContent":["import * as React from \"react\";\n\nexport const SELECTION_INDICATOR_MOTION_CLASS =\n\t\"transition-[left,width,top,height] duration-200 ease-out\";\n\nexport type SelectionGeometry = {\n\tleft: number;\n\twidth: number;\n\ttop: number;\n\theight: number;\n};\n\nexport type SelectionIndicatorState = SelectionGeometry & {\n\tvisible: boolean;\n\tanimated: boolean;\n};\n\nconst EMPTY: SelectionGeometry = { left: 0, width: 0, top: 0, height: 0 };\n\nexport function assignRef<T>(ref: React.Ref<T> | undefined, value: T | null) {\n\tif (typeof ref === \"function\") {\n\t\tref(value);\n\t} else if (ref) {\n\t\t(ref as React.MutableRefObject<T | null>).current = value;\n\t}\n}\n\nexport function measureSelectionItem(item: HTMLElement): SelectionGeometry {\n\treturn {\n\t\tleft: item.offsetLeft,\n\t\twidth: item.offsetWidth,\n\t\ttop: item.offsetTop,\n\t\theight: item.offsetHeight,\n\t};\n}\n\nfunction prefersReducedMotion() {\n\treturn (\n\t\ttypeof window !== \"undefined\" && window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches\n\t);\n}\n\nfunction selectionTargets(root: HTMLElement) {\n\tconst targets: HTMLElement[] = [root];\n\tfor (const node of root.children) {\n\t\tif (node instanceof HTMLElement && node.getAttribute(\"aria-hidden\") !== \"true\") {\n\t\t\ttargets.push(node);\n\t\t}\n\t}\n\treturn targets;\n}\n\nexport function useSelectionIndicator({\n\titemSelector,\n\tenabled = true,\n\tmapGeometry = measureSelectionItem,\n\tref,\n}: {\n\titemSelector: string;\n\tenabled?: boolean;\n\tmapGeometry?: (item: HTMLElement, root: HTMLElement) => SelectionGeometry;\n\tref?: React.Ref<HTMLElement | null>;\n}) {\n\tconst rootRef = React.useRef<HTMLElement | null>(null);\n\tconst composedRef = React.useMemo(() => {\n\t\treturn (node: HTMLElement | null) => {\n\t\t\trootRef.current = node;\n\t\t\tassignRef(ref, node);\n\t\t};\n\t}, [ref]);\n\tconst [state, setState] = React.useState<SelectionIndicatorState>({\n\t\t...EMPTY,\n\t\tvisible: false,\n\t\tanimated: false,\n\t});\n\tconst [reduced, setReduced] = React.useState(prefersReducedMotion);\n\n\tReact.useEffect(() => {\n\t\tconst media = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n\t\tconst onChange = () => setReduced(media.matches);\n\t\tonChange();\n\t\tmedia.addEventListener(\"change\", onChange);\n\t\treturn () => media.removeEventListener(\"change\", onChange);\n\t}, []);\n\n\tconst sync = React.useCallback(() => {\n\t\tconst root = rootRef.current;\n\t\tif (!root || !enabled) {\n\t\t\tsetState((current) => ({ ...current, ...EMPTY, visible: false, animated: false }));\n\t\t\treturn;\n\t\t}\n\t\tconst item = root.querySelector<HTMLElement>(itemSelector);\n\t\tif (!item) {\n\t\t\tsetState((current) => ({ ...current, width: 0, height: 0, visible: false, animated: false }));\n\t\t\treturn;\n\t\t}\n\t\tconst geometry = mapGeometry(item, root);\n\t\tsetState((current) => ({\n\t\t\t...geometry,\n\t\t\tvisible: true,\n\t\t\tanimated: current.visible && !reduced,\n\t\t}));\n\t}, [enabled, itemSelector, mapGeometry, reduced]);\n\n\tReact.useLayoutEffect(() => {\n\t\tconst root = rootRef.current;\n\t\tif (!root || !enabled) {\n\t\t\treturn;\n\t\t}\n\t\tlet frame = 0;\n\t\tconst ro = new ResizeObserver(() => {\n\t\t\tcancelAnimationFrame(frame);\n\t\t\tframe = requestAnimationFrame(sync);\n\t\t});\n\t\tconst observe = () => {\n\t\t\tro.disconnect();\n\t\t\tfor (const node of selectionTargets(root)) {\n\t\t\t\tro.observe(node);\n\t\t\t}\n\t\t};\n\t\tobserve();\n\t\tsync();\n\t\tconst mo = new MutationObserver(() => {\n\t\t\tcancelAnimationFrame(frame);\n\t\t\tframe = requestAnimationFrame(() => {\n\t\t\t\tobserve();\n\t\t\t\tsync();\n\t\t\t});\n\t\t});\n\t\tmo.observe(root, {\n\t\t\tattributes: true,\n\t\t\tsubtree: true,\n\t\t\tchildList: true,\n\t\t\tcharacterData: true,\n\t\t\tattributeFilter: [\"data-state\"],\n\t\t});\n\t\treturn () => {\n\t\t\tcancelAnimationFrame(frame);\n\t\t\tmo.disconnect();\n\t\t\tro.disconnect();\n\t\t};\n\t}, [enabled, sync]);\n\n\treturn {\n\t\tref: composedRef,\n\t\tstate,\n\t\tmotionClassName: state.animated && !reduced ? SELECTION_INDICATOR_MOTION_CLASS : undefined,\n\t};\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"selection-indicator.js","names":[],"sources":["../../src/utils/selection-indicator.ts"],"sourcesContent":["import * as React from \"react\";\n\nexport const SELECTION_INDICATOR_MOTION_CLASS =\n\t\"transition-[left,width,top,height] duration-200 ease-out\";\n\nexport type SelectionGeometry = {\n\tleft: number;\n\twidth: number;\n\ttop: number;\n\theight: number;\n};\n\nexport type SelectionIndicatorState = SelectionGeometry & {\n\tvisible: boolean;\n\tanimated: boolean;\n};\n\nconst EMPTY: SelectionGeometry = { left: 0, width: 0, top: 0, height: 0 };\n\nexport function assignRef<T>(ref: React.Ref<T> | undefined, value: T | null) {\n\tif (typeof ref === \"function\") {\n\t\tref(value);\n\t} else if (ref) {\n\t\t(ref as React.MutableRefObject<T | null>).current = value;\n\t}\n}\n\nexport function measureSelectionItem(item: HTMLElement): SelectionGeometry {\n\treturn {\n\t\tleft: item.offsetLeft,\n\t\twidth: item.offsetWidth,\n\t\ttop: item.offsetTop,\n\t\theight: item.offsetHeight,\n\t};\n}\n\nfunction prefersReducedMotion() {\n\treturn (\n\t\ttypeof window !== \"undefined\" && window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches\n\t);\n}\n\nfunction selectionTargets(root: HTMLElement) {\n\tconst targets: HTMLElement[] = [root];\n\tfor (const node of root.children) {\n\t\tif (node instanceof HTMLElement && node.getAttribute(\"aria-hidden\") !== \"true\") {\n\t\t\ttargets.push(node);\n\t\t}\n\t}\n\treturn targets;\n}\n\nexport function useSelectionIndicator({\n\titemSelector,\n\tenabled = true,\n\tmapGeometry,\n\tref,\n}: {\n\titemSelector: string;\n\tenabled?: boolean;\n\tmapGeometry?: (item: HTMLElement, root: HTMLElement) => SelectionGeometry;\n\tref?: React.Ref<HTMLElement | null>;\n}) {\n\tconst rootRef = React.useRef<HTMLElement | null>(null);\n\tconst composedRef = React.useMemo(() => {\n\t\treturn (node: HTMLElement | null) => {\n\t\t\trootRef.current = node;\n\t\t\tassignRef(ref, node);\n\t\t};\n\t}, [ref]);\n\tconst [state, setState] = React.useState<SelectionIndicatorState>({\n\t\t...EMPTY,\n\t\tvisible: false,\n\t\tanimated: false,\n\t});\n\tconst [reduced, setReduced] = React.useState(prefersReducedMotion);\n\n\tReact.useEffect(() => {\n\t\tconst media = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n\t\tconst onChange = () => setReduced(media.matches);\n\t\tonChange();\n\t\tmedia.addEventListener(\"change\", onChange);\n\t\treturn () => media.removeEventListener(\"change\", onChange);\n\t}, []);\n\n\tconst sync = React.useCallback(() => {\n\t\tconst root = rootRef.current;\n\t\tif (!root || !enabled) {\n\t\t\tsetState((current) => ({ ...current, ...EMPTY, visible: false, animated: false }));\n\t\t\treturn;\n\t\t}\n\t\tconst item = root.querySelector<HTMLElement>(itemSelector);\n\t\tif (!item) {\n\t\t\tsetState((current) => ({ ...current, width: 0, height: 0, visible: false, animated: false }));\n\t\t\treturn;\n\t\t}\n\t\t// Keep the optional dependency undefined. Production optimizers may inline a\n\t\t// function-valued parameter default, creating a new effect dependency every render.\n\t\tconst geometry = (mapGeometry ?? measureSelectionItem)(item, root);\n\t\tsetState((current) => ({\n\t\t\t...geometry,\n\t\t\tvisible: true,\n\t\t\tanimated: current.visible && !reduced,\n\t\t}));\n\t}, [enabled, itemSelector, mapGeometry, reduced]);\n\n\tReact.useLayoutEffect(() => {\n\t\tconst root = rootRef.current;\n\t\tif (!root || !enabled) {\n\t\t\treturn;\n\t\t}\n\t\tlet frame = 0;\n\t\tconst ro = new ResizeObserver(() => {\n\t\t\tcancelAnimationFrame(frame);\n\t\t\tframe = requestAnimationFrame(sync);\n\t\t});\n\t\tconst observe = () => {\n\t\t\tro.disconnect();\n\t\t\tfor (const node of selectionTargets(root)) {\n\t\t\t\tro.observe(node);\n\t\t\t}\n\t\t};\n\t\tobserve();\n\t\tsync();\n\t\tconst mo = new MutationObserver(() => {\n\t\t\tcancelAnimationFrame(frame);\n\t\t\tframe = requestAnimationFrame(() => {\n\t\t\t\tobserve();\n\t\t\t\tsync();\n\t\t\t});\n\t\t});\n\t\tmo.observe(root, {\n\t\t\tattributes: true,\n\t\t\tsubtree: true,\n\t\t\tchildList: true,\n\t\t\tcharacterData: true,\n\t\t\tattributeFilter: [\"data-state\"],\n\t\t});\n\t\treturn () => {\n\t\t\tcancelAnimationFrame(frame);\n\t\t\tmo.disconnect();\n\t\t\tro.disconnect();\n\t\t};\n\t}, [enabled, sync]);\n\n\treturn {\n\t\tref: composedRef,\n\t\tstate,\n\t\tmotionClassName: state.animated && !reduced ? SELECTION_INDICATOR_MOTION_CLASS : undefined,\n\t};\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nocoo/basalt",
3
- "version": "2.0.2",
3
+ "version": "2.1.0",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -13,16 +13,19 @@
13
13
  },
14
14
  "files": [
15
15
  "dist",
16
+ "ai",
16
17
  "README.md",
17
18
  "LICENSE"
18
19
  ],
19
20
  "scripts": {
20
- "build": "bun run build:css && vite build && tsc -p tsconfig.build.json && bun scripts/rewrite-declarations.ts && bun scripts/verify-dist.ts && bun scripts/root-boundary.ts && node scripts/verify-runtime.mjs",
21
+ "build": "bun run build:metadata && bun run build:css && vite build && tsc -p tsconfig.build.json && bun scripts/rewrite-declarations.ts && bun scripts/verify-dist.ts && bun scripts/verify-public-api.ts && bun scripts/root-boundary.ts && node scripts/verify-runtime.mjs",
21
22
  "build:css": "bun ../../scripts/build-basalt-standalone.ts",
23
+ "build:metadata": "bun ../../scripts/catalog-api-cli.ts check",
22
24
  "pack:check": "bun scripts/verify-pack.ts",
23
25
  "prepublishOnly": "bun run --cwd ../.. package:prepublish",
24
26
  "publint": "publint --strict --pack npm",
25
- "types:check": "tsc -p type-tests/tsconfig.bundler.json --noEmit && tsc -p type-tests/tsconfig.nodenext.json --noEmit"
27
+ "types:check": "tsc -p type-tests/tsconfig.bundler.json --noEmit && tsc -p type-tests/tsconfig.nodenext.json --noEmit",
28
+ "verify:api": "bun scripts/verify-public-api.ts"
26
29
  },
27
30
  "sideEffects": [
28
31
  "*.css"
@@ -103,5 +106,6 @@
103
106
  "@tanstack/react-table": {
104
107
  "optional": true
105
108
  }
106
- }
109
+ },
110
+ "homepage": "https://basaltui.com"
107
111
  }