@seekalfred/primitives 0.6.0 → 0.7.1

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 (322) hide show
  1. package/README.md +19 -11
  2. package/dist/activity-heatmap/activity-heatmap.d.ts +92 -0
  3. package/dist/activity-heatmap/activity-heatmap.js +699 -0
  4. package/dist/activity-heatmap/activity-heatmap.js.map +1 -0
  5. package/dist/activity-heatmap/index.d.ts +2 -0
  6. package/dist/activity-heatmap/index.js +2 -0
  7. package/dist/alert/alert.d.ts +5 -1
  8. package/dist/alert/alert.js +68 -7
  9. package/dist/alert/alert.js.map +1 -1
  10. package/dist/alert-dialog/alert-dialog.d.ts +45 -18
  11. package/dist/alert-dialog/alert-dialog.js +128 -9
  12. package/dist/alert-dialog/alert-dialog.js.map +1 -1
  13. package/dist/alert-dialog/index.d.ts +2 -2
  14. package/dist/alert-dialog/index.js +2 -2
  15. package/dist/animated-counter/animated-counter.d.ts +38 -0
  16. package/dist/animated-counter/animated-counter.js +230 -0
  17. package/dist/animated-counter/animated-counter.js.map +1 -0
  18. package/dist/animated-counter/index.d.ts +2 -0
  19. package/dist/animated-counter/index.js +2 -0
  20. package/dist/announcement-bar/announcement-bar.d.ts +67 -0
  21. package/dist/announcement-bar/announcement-bar.js +364 -0
  22. package/dist/announcement-bar/announcement-bar.js.map +1 -0
  23. package/dist/announcement-bar/index.d.ts +2 -0
  24. package/dist/announcement-bar/index.js +2 -0
  25. package/dist/badge/badge.d.ts +1 -1
  26. package/dist/bar-chart/bar-chart.d.ts +51 -0
  27. package/dist/bar-chart/bar-chart.js +565 -0
  28. package/dist/bar-chart/bar-chart.js.map +1 -0
  29. package/dist/bar-chart/index.d.ts +2 -0
  30. package/dist/bar-chart/index.js +2 -0
  31. package/dist/breadcrumb/breadcrumb.d.ts +2 -2
  32. package/dist/breadcrumb/breadcrumb.js +12 -3
  33. package/dist/breadcrumb/breadcrumb.js.map +1 -1
  34. package/dist/brush-chart/brush-chart.d.ts +64 -0
  35. package/dist/brush-chart/brush-chart.js +1056 -0
  36. package/dist/brush-chart/brush-chart.js.map +1 -0
  37. package/dist/brush-chart/index.d.ts +2 -0
  38. package/dist/brush-chart/index.js +2 -0
  39. package/dist/button/button.d.ts +2 -2
  40. package/dist/button/button.js +31 -21
  41. package/dist/button/button.js.map +1 -1
  42. package/dist/button-group/button-group.js +3 -4
  43. package/dist/button-group/button-group.js.map +1 -1
  44. package/dist/card/card.js +1 -1
  45. package/dist/card/card.js.map +1 -1
  46. package/dist/card-stack/card-stack.d.ts +54 -0
  47. package/dist/card-stack/card-stack.js +492 -0
  48. package/dist/card-stack/card-stack.js.map +1 -0
  49. package/dist/card-stack/index.d.ts +2 -0
  50. package/dist/card-stack/index.js +2 -0
  51. package/dist/carousel/carousel.d.ts +56 -0
  52. package/dist/carousel/carousel.js +389 -0
  53. package/dist/carousel/carousel.js.map +1 -0
  54. package/dist/carousel/index.d.ts +2 -0
  55. package/dist/carousel/index.js +2 -0
  56. package/dist/checkbox/checkbox.js +4 -4
  57. package/dist/checkbox/checkbox.js.map +1 -1
  58. package/dist/chip-group/chip-group.d.ts +37 -0
  59. package/dist/chip-group/chip-group.js +148 -0
  60. package/dist/chip-group/chip-group.js.map +1 -0
  61. package/dist/chip-group/index.d.ts +2 -0
  62. package/dist/chip-group/index.js +2 -0
  63. package/dist/countdown/countdown.d.ts +45 -0
  64. package/dist/countdown/countdown.js +298 -0
  65. package/dist/countdown/countdown.js.map +1 -0
  66. package/dist/countdown/index.d.ts +2 -0
  67. package/dist/countdown/index.js +2 -0
  68. package/dist/date-picker/picker-parts.js +1 -1
  69. package/dist/date-picker/picker-parts.js.map +1 -1
  70. package/dist/dialog/dialog.js +1 -1
  71. package/dist/dialog/dialog.js.map +1 -1
  72. package/dist/donut-chart/donut-chart.d.ts +64 -0
  73. package/dist/donut-chart/donut-chart.js +576 -0
  74. package/dist/donut-chart/donut-chart.js.map +1 -0
  75. package/dist/donut-chart/index.d.ts +2 -0
  76. package/dist/donut-chart/index.js +2 -0
  77. package/dist/empty-state/empty-state.d.ts +21 -10
  78. package/dist/empty-state/empty-state.js +32 -26
  79. package/dist/empty-state/empty-state.js.map +1 -1
  80. package/dist/empty-state/index.d.ts +2 -2
  81. package/dist/empty-state/index.js +2 -2
  82. package/dist/file-drop-zone/file-drop-zone.js +1 -1
  83. package/dist/file-drop-zone/file-drop-zone.js.map +1 -1
  84. package/dist/filter-bar/filter-bar.d.ts +47 -26
  85. package/dist/filter-bar/filter-bar.js +272 -156
  86. package/dist/filter-bar/filter-bar.js.map +1 -1
  87. package/dist/gauge/gauge.d.ts +45 -0
  88. package/dist/gauge/gauge.js +219 -0
  89. package/dist/gauge/gauge.js.map +1 -0
  90. package/dist/gauge/index.d.ts +2 -0
  91. package/dist/gauge/index.js +2 -0
  92. package/dist/in-view-title/in-view-title.d.ts +33 -0
  93. package/dist/in-view-title/in-view-title.js +119 -0
  94. package/dist/in-view-title/in-view-title.js.map +1 -0
  95. package/dist/in-view-title/index.d.ts +2 -0
  96. package/dist/in-view-title/index.js +2 -0
  97. package/dist/index.d.ts +49 -6
  98. package/dist/index.js +48 -8
  99. package/dist/lib/cn.js +11 -1
  100. package/dist/lib/cn.js.map +1 -1
  101. package/dist/lib/field-message.js +28 -10
  102. package/dist/lib/field-message.js.map +1 -1
  103. package/dist/lib/field-surface.js +9 -8
  104. package/dist/lib/field-surface.js.map +1 -1
  105. package/dist/lib/flag-emoji.js +50 -0
  106. package/dist/lib/flag-emoji.js.map +1 -0
  107. package/dist/lib/flip.js +11 -3
  108. package/dist/lib/flip.js.map +1 -1
  109. package/dist/lib/menu-highlight.js +64 -0
  110. package/dist/lib/menu-highlight.js.map +1 -0
  111. package/dist/lib/motion.js +9 -2
  112. package/dist/lib/motion.js.map +1 -1
  113. package/dist/lib/rolling-value.js +1 -1
  114. package/dist/lib/rolling-value.js.map +1 -1
  115. package/dist/lib/spring-tween.js +500 -0
  116. package/dist/lib/spring-tween.js.map +1 -0
  117. package/dist/lib/swap-text.js +3 -1
  118. package/dist/lib/swap-text.js.map +1 -1
  119. package/dist/line-chart/index.d.ts +2 -0
  120. package/dist/line-chart/index.js +2 -0
  121. package/dist/line-chart/line-chart.d.ts +76 -0
  122. package/dist/line-chart/line-chart.js +611 -0
  123. package/dist/line-chart/line-chart.js.map +1 -0
  124. package/dist/mention-input/index.d.ts +2 -0
  125. package/dist/mention-input/index.js +2 -0
  126. package/dist/mention-input/mention-input.d.ts +98 -0
  127. package/dist/mention-input/mention-input.js +576 -0
  128. package/dist/mention-input/mention-input.js.map +1 -0
  129. package/dist/menu/menu.d.ts +2 -0
  130. package/dist/menu/menu.js +23 -12
  131. package/dist/menu/menu.js.map +1 -1
  132. package/dist/money-input/index.d.ts +2 -0
  133. package/dist/money-input/index.js +2 -0
  134. package/dist/money-input/money-input.d.ts +65 -0
  135. package/dist/money-input/money-input.js +607 -0
  136. package/dist/money-input/money-input.js.map +1 -0
  137. package/dist/morph-select/index.d.ts +2 -0
  138. package/dist/morph-select/index.js +2 -0
  139. package/dist/morph-select/morph-select.d.ts +71 -0
  140. package/dist/morph-select/morph-select.js +693 -0
  141. package/dist/morph-select/morph-select.js.map +1 -0
  142. package/dist/multi-select/index.d.ts +2 -0
  143. package/dist/multi-select/index.js +2 -0
  144. package/dist/multi-select/multi-select.d.ts +36 -0
  145. package/dist/multi-select/multi-select.js +152 -0
  146. package/dist/multi-select/multi-select.js.map +1 -0
  147. package/dist/number-field/index.d.ts +2 -0
  148. package/dist/number-field/index.js +2 -0
  149. package/dist/number-field/number-field.d.ts +42 -0
  150. package/dist/number-field/number-field.js +199 -0
  151. package/dist/number-field/number-field.js.map +1 -0
  152. package/dist/onboarding-checklist/index.d.ts +2 -0
  153. package/dist/onboarding-checklist/index.js +2 -0
  154. package/dist/onboarding-checklist/onboarding-checklist.d.ts +55 -0
  155. package/dist/onboarding-checklist/onboarding-checklist.js +577 -0
  156. package/dist/onboarding-checklist/onboarding-checklist.js.map +1 -0
  157. package/dist/password-field/password-field.js +2 -2
  158. package/dist/password-field/password-field.js.map +1 -1
  159. package/dist/phone-input/index.d.ts +3 -0
  160. package/dist/phone-input/index.js +3 -0
  161. package/dist/phone-input/phone-countries.d.ts +29 -0
  162. package/dist/phone-input/phone-countries.js +170 -0
  163. package/dist/phone-input/phone-countries.js.map +1 -0
  164. package/dist/phone-input/phone-input.d.ts +66 -0
  165. package/dist/phone-input/phone-input.js +440 -0
  166. package/dist/phone-input/phone-input.js.map +1 -0
  167. package/dist/popover/popover.d.ts +12 -0
  168. package/dist/popover/popover.js +31 -7
  169. package/dist/popover/popover.js.map +1 -1
  170. package/dist/progress/progress.js +1 -1
  171. package/dist/radio-group/radio-group.js +1 -1
  172. package/dist/radio-group/radio-group.js.map +1 -1
  173. package/dist/reactions/index.d.ts +2 -0
  174. package/dist/reactions/index.js +2 -0
  175. package/dist/reactions/reactions.d.ts +50 -0
  176. package/dist/reactions/reactions.js +315 -0
  177. package/dist/reactions/reactions.js.map +1 -0
  178. package/dist/rich-text-editor/index.d.ts +3 -0
  179. package/dist/rich-text-editor/index.js +2 -0
  180. package/dist/rich-text-editor/rich-text-editor.d.ts +70 -0
  181. package/dist/rich-text-editor/rich-text-editor.js +909 -0
  182. package/dist/rich-text-editor/rich-text-editor.js.map +1 -0
  183. package/dist/rich-text-editor/rich-text-engine.d.ts +16 -0
  184. package/dist/rich-text-editor/rich-text-engine.js +366 -0
  185. package/dist/rich-text-editor/rich-text-engine.js.map +1 -0
  186. package/dist/rich-text-editor/rich-text-html.js +174 -0
  187. package/dist/rich-text-editor/rich-text-html.js.map +1 -0
  188. package/dist/rich-text-editor/rich-text-icons.js +43 -0
  189. package/dist/rich-text-editor/rich-text-icons.js.map +1 -0
  190. package/dist/ridgeline/index.d.ts +2 -0
  191. package/dist/ridgeline/index.js +2 -0
  192. package/dist/ridgeline/ridgeline.d.ts +55 -0
  193. package/dist/ridgeline/ridgeline.js +701 -0
  194. package/dist/ridgeline/ridgeline.js.map +1 -0
  195. package/dist/scroll-area/index.d.ts +2 -2
  196. package/dist/scroll-area/index.js +2 -2
  197. package/dist/scroll-area/scroll-area.d.ts +68 -31
  198. package/dist/scroll-area/scroll-area.js +208 -59
  199. package/dist/scroll-area/scroll-area.js.map +1 -1
  200. package/dist/scrub-input/evaluate.d.ts +14 -0
  201. package/dist/scrub-input/evaluate.js +72 -0
  202. package/dist/scrub-input/evaluate.js.map +1 -0
  203. package/dist/scrub-input/index.d.ts +3 -0
  204. package/dist/scrub-input/index.js +3 -0
  205. package/dist/scrub-input/scrub-input.d.ts +74 -0
  206. package/dist/scrub-input/scrub-input.js +486 -0
  207. package/dist/scrub-input/scrub-input.js.map +1 -0
  208. package/dist/search-field/search-field.d.ts +2 -1
  209. package/dist/search-field/search-field.js +4 -4
  210. package/dist/search-field/search-field.js.map +1 -1
  211. package/dist/select/select.d.ts +3 -1
  212. package/dist/select/select.js +20 -8
  213. package/dist/select/select.js.map +1 -1
  214. package/dist/separator/separator.d.ts +1 -1
  215. package/dist/sheet/sheet.js +2 -1
  216. package/dist/sheet/sheet.js.map +1 -1
  217. package/dist/shortcut-recorder/index.d.ts +3 -0
  218. package/dist/shortcut-recorder/index.js +3 -0
  219. package/dist/shortcut-recorder/shortcut-model.d.ts +27 -0
  220. package/dist/shortcut-recorder/shortcut-model.js +206 -0
  221. package/dist/shortcut-recorder/shortcut-model.js.map +1 -0
  222. package/dist/shortcut-recorder/shortcut-recorder.d.ts +93 -0
  223. package/dist/shortcut-recorder/shortcut-recorder.js +489 -0
  224. package/dist/shortcut-recorder/shortcut-recorder.js.map +1 -0
  225. package/dist/slider/index.d.ts +2 -2
  226. package/dist/slider/slider.d.ts +46 -14
  227. package/dist/slider/slider.js +151 -67
  228. package/dist/slider/slider.js.map +1 -1
  229. package/dist/slope-chart/index.d.ts +2 -0
  230. package/dist/slope-chart/index.js +2 -0
  231. package/dist/slope-chart/slope-chart.d.ts +54 -0
  232. package/dist/slope-chart/slope-chart.js +568 -0
  233. package/dist/slope-chart/slope-chart.js.map +1 -0
  234. package/dist/sparkline/index.d.ts +2 -0
  235. package/dist/sparkline/index.js +2 -0
  236. package/dist/sparkline/sparkline.d.ts +46 -0
  237. package/dist/sparkline/sparkline.js +390 -0
  238. package/dist/sparkline/sparkline.js.map +1 -0
  239. package/dist/split-bar/index.d.ts +2 -0
  240. package/dist/split-bar/index.js +2 -0
  241. package/dist/split-bar/split-bar.d.ts +62 -0
  242. package/dist/split-bar/split-bar.js +513 -0
  243. package/dist/split-bar/split-bar.js.map +1 -0
  244. package/dist/split-button/split-button.d.ts +1 -1
  245. package/dist/split-button/split-button.js +12 -11
  246. package/dist/split-button/split-button.js.map +1 -1
  247. package/dist/stat-card/index.d.ts +2 -2
  248. package/dist/stat-card/index.js +2 -2
  249. package/dist/stat-card/stat-card.d.ts +24 -4
  250. package/dist/stat-card/stat-card.js +114 -17
  251. package/dist/stat-card/stat-card.js.map +1 -1
  252. package/dist/stepper/index.d.ts +2 -0
  253. package/dist/stepper/index.js +2 -0
  254. package/dist/stepper/stepper.d.ts +51 -0
  255. package/dist/stepper/stepper.js +215 -0
  256. package/dist/stepper/stepper.js.map +1 -0
  257. package/dist/streamgraph/index.d.ts +2 -0
  258. package/dist/streamgraph/index.js +2 -0
  259. package/dist/streamgraph/streamgraph.d.ts +70 -0
  260. package/dist/streamgraph/streamgraph.js +613 -0
  261. package/dist/streamgraph/streamgraph.js.map +1 -0
  262. package/dist/styles.css +1 -1
  263. package/dist/swipe-actions/index.d.ts +2 -0
  264. package/dist/swipe-actions/index.js +2 -0
  265. package/dist/swipe-actions/swipe-actions.d.ts +67 -0
  266. package/dist/swipe-actions/swipe-actions.js +552 -0
  267. package/dist/swipe-actions/swipe-actions.js.map +1 -0
  268. package/dist/switch/switch.js +2 -2
  269. package/dist/switch/switch.js.map +1 -1
  270. package/dist/table/index.d.ts +2 -2
  271. package/dist/table/index.js +2 -2
  272. package/dist/table/table.d.ts +56 -4
  273. package/dist/table/table.js +340 -165
  274. package/dist/table/table.js.map +1 -1
  275. package/dist/tabs/tabs.js +2 -2
  276. package/dist/tabs/tabs.js.map +1 -1
  277. package/dist/tag-input/index.d.ts +2 -0
  278. package/dist/tag-input/index.js +2 -0
  279. package/dist/tag-input/tag-input.d.ts +40 -0
  280. package/dist/tag-input/tag-input.js +269 -0
  281. package/dist/tag-input/tag-input.js.map +1 -0
  282. package/dist/text-morph/index.d.ts +2 -0
  283. package/dist/text-morph/index.js +2 -0
  284. package/dist/text-morph/text-morph.d.ts +23 -0
  285. package/dist/text-morph/text-morph.js +21 -0
  286. package/dist/text-morph/text-morph.js.map +1 -0
  287. package/dist/text-reveal/index.d.ts +2 -0
  288. package/dist/text-reveal/index.js +2 -0
  289. package/dist/text-reveal/text-reveal.d.ts +27 -0
  290. package/dist/text-reveal/text-reveal.js +51 -0
  291. package/dist/text-reveal/text-reveal.js.map +1 -0
  292. package/dist/text-shimmer/index.d.ts +2 -0
  293. package/dist/text-shimmer/index.js +2 -0
  294. package/dist/text-shimmer/text-shimmer.d.ts +29 -0
  295. package/dist/text-shimmer/text-shimmer.js +29 -0
  296. package/dist/text-shimmer/text-shimmer.js.map +1 -0
  297. package/dist/time-picker/time-picker.js +2 -2
  298. package/dist/time-picker/time-picker.js.map +1 -1
  299. package/dist/toast/index.d.ts +2 -2
  300. package/dist/toast/index.js +2 -2
  301. package/dist/toast/toast.d.ts +6 -0
  302. package/dist/toast/toast.js +82 -40
  303. package/dist/toast/toast.js.map +1 -1
  304. package/dist/tooltip/tooltip.d.ts +9 -2
  305. package/dist/tooltip/tooltip.js +7 -7
  306. package/dist/tooltip/tooltip.js.map +1 -1
  307. package/dist/treemap/index.d.ts +2 -0
  308. package/dist/treemap/index.js +2 -0
  309. package/dist/treemap/treemap.d.ts +53 -0
  310. package/dist/treemap/treemap.js +699 -0
  311. package/dist/treemap/treemap.js.map +1 -0
  312. package/dist/usage-meter/index.d.ts +2 -0
  313. package/dist/usage-meter/index.js +2 -0
  314. package/dist/usage-meter/usage-meter.d.ts +50 -0
  315. package/dist/usage-meter/usage-meter.js +440 -0
  316. package/dist/usage-meter/usage-meter.js.map +1 -0
  317. package/dist/waffle-chart/index.d.ts +2 -0
  318. package/dist/waffle-chart/index.js +2 -0
  319. package/dist/waffle-chart/waffle-chart.d.ts +57 -0
  320. package/dist/waffle-chart/waffle-chart.js +426 -0
  321. package/dist/waffle-chart/waffle-chart.js.map +1 -0
  322. package/package.json +165 -3
@@ -0,0 +1,215 @@
1
+ "use client";
2
+ import { cn } from "../lib/cn.js";
3
+ import { prefersReducedMotion } from "../lib/motion.js";
4
+ import { SwapText } from "../lib/swap-text.js";
5
+ import { useHeightFollow } from "../lib/height-follow.js";
6
+ import { forwardRef, useRef, useState } from "react";
7
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
8
+ //#region src/stepper/stepper.tsx
9
+ const STATUS_TEXT = {
10
+ complete: "Completed",
11
+ current: "",
12
+ upcoming: "Not started",
13
+ error: "Error"
14
+ };
15
+ /** Stagger between connectors when progress jumps across several steps (ms). */
16
+ const LINE_STAGGER_MS = 80;
17
+ /** Text that rises in when it changes. Its frame follows the new height, so a message that wraps eases the steps below down instead of pushing them. */
18
+ function StepText({ text, tone, className }) {
19
+ const frame = useRef(null);
20
+ const content = useRef(null);
21
+ const key = text ? `${tone}:${text}` : "";
22
+ useHeightFollow(frame, content, key);
23
+ return /* @__PURE__ */ jsx("span", {
24
+ ref: frame,
25
+ className: "height-follow block",
26
+ children: /* @__PURE__ */ jsx("span", {
27
+ ref: content,
28
+ className: "relative block",
29
+ children: /* @__PURE__ */ jsx(SwapText, {
30
+ swapKey: key,
31
+ className: cn("block", className),
32
+ children: text
33
+ })
34
+ })
35
+ });
36
+ }
37
+ /** The number, check and alert share one spot: the outgoing glyph shrinks away while the next one pops in and draws its stroke. */
38
+ function Glyph({ kind, number, delay }) {
39
+ return /* @__PURE__ */ jsx(SwapText, {
40
+ swapKey: kind,
41
+ motion: "glyph",
42
+ delay,
43
+ className: "grid place-items-center",
44
+ children: kind === "number" ? number : /* @__PURE__ */ jsx("svg", {
45
+ className: "stepper-icon",
46
+ viewBox: "0 0 24 24",
47
+ fill: "none",
48
+ stroke: "currentColor",
49
+ strokeWidth: 2.5,
50
+ strokeLinecap: "round",
51
+ strokeLinejoin: "round",
52
+ "aria-hidden": "true",
53
+ children: kind === "check" ? /* @__PURE__ */ jsx("path", {
54
+ className: "stepper-draw",
55
+ pathLength: 1,
56
+ d: "M5.5 12.5l4.25 4.25L18.5 8"
57
+ }) : /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("path", {
58
+ className: "stepper-draw",
59
+ pathLength: 1,
60
+ d: "M12 6.75v6.5"
61
+ }), /* @__PURE__ */ jsx("circle", {
62
+ className: "stepper-dot",
63
+ cx: 12,
64
+ cy: 17.4,
65
+ r: 1.4,
66
+ fill: "currentColor",
67
+ stroke: "none"
68
+ })] })
69
+ })
70
+ });
71
+ }
72
+ const Stepper = forwardRef(function Stepper({ steps, current, orientation = "horizontal", onStepSelect, details = "all", compact = false, label = "Progress", completeLabel = "All steps complete", className }, ref) {
73
+ const count = steps.length;
74
+ const active = Math.min(Math.max(Math.round(current), 0), count);
75
+ const [travel, setTravel] = useState({
76
+ to: active,
77
+ from: active
78
+ });
79
+ if (travel.to !== active) setTravel({
80
+ to: active,
81
+ from: travel.to
82
+ });
83
+ const from = travel.from;
84
+ const still = typeof window !== "undefined" && prefersReducedMotion();
85
+ const delayAt = (index) => {
86
+ if (still) return 0;
87
+ if (active > from) return index >= from && index < active ? (index - from) * LINE_STAGGER_MS : 0;
88
+ return index >= active && index < from ? (from - 1 - index) * LINE_STAGGER_MS : 0;
89
+ };
90
+ const ringDelay = still ? 0 : Math.max(0, Math.abs(active - from) - 1) * LINE_STAGGER_MS + 120;
91
+ const interactive = Boolean(onStepSelect);
92
+ const vertical = orientation === "vertical";
93
+ const now = active >= count ? void 0 : steps[active];
94
+ /** Arrow keys move between the steps you can reach; Home and End jump to the first and the current one. */
95
+ function onKeyDown(event) {
96
+ const rtl = !vertical && getComputedStyle(event.currentTarget).direction === "rtl";
97
+ const back = ["ArrowUp", rtl ? "ArrowRight" : "ArrowLeft"];
98
+ const ahead = ["ArrowDown", rtl ? "ArrowLeft" : "ArrowRight"];
99
+ if (![
100
+ ...back,
101
+ ...ahead,
102
+ "Home",
103
+ "End"
104
+ ].includes(event.key)) return;
105
+ const targets = Array.from(event.currentTarget.querySelectorAll("button[data-reachable]"));
106
+ const at = targets.indexOf(event.target);
107
+ if (at < 0) return;
108
+ event.preventDefault();
109
+ targets[event.key === "Home" ? 0 : event.key === "End" ? targets.length - 1 : back.includes(event.key) ? Math.max(0, at - 1) : Math.min(targets.length - 1, at + 1)]?.focus();
110
+ }
111
+ return /* @__PURE__ */ jsxs(interactive ? "nav" : "div", {
112
+ ref,
113
+ "aria-label": label,
114
+ role: interactive ? void 0 : "group",
115
+ "data-slot": "stepper",
116
+ "data-orientation": orientation,
117
+ "data-compact": compact ? "" : void 0,
118
+ style: { "--stepper-ring-delay": `${ringDelay}ms` },
119
+ className: cn("stepper box-border font-sans", className),
120
+ children: [
121
+ /* @__PURE__ */ jsx("ol", {
122
+ className: "stepper-list",
123
+ style: vertical ? void 0 : { gridTemplateColumns: count > 1 ? `repeat(${count - 1}, minmax(0, 1fr)) auto` : "auto" },
124
+ onKeyDown: interactive ? onKeyDown : void 0,
125
+ children: steps.map((step, index) => {
126
+ const isCurrent = index === active;
127
+ const status = step.error ? "error" : index < active ? "complete" : isCurrent ? "current" : "upcoming";
128
+ const clickable = interactive && index < active;
129
+ const detail = step.error ?? (details === "all" || isCurrent ? step.description : void 0);
130
+ const kind = step.error ? "error" : index < active ? "check" : "number";
131
+ const delay = delayAt(index);
132
+ const content = /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsxs("span", {
133
+ className: "stepper-marker",
134
+ "aria-hidden": "true",
135
+ children: [/* @__PURE__ */ jsx("span", { className: "stepper-ring" }), /* @__PURE__ */ jsx("span", {
136
+ className: "stepper-disc",
137
+ children: /* @__PURE__ */ jsx(Glyph, {
138
+ kind,
139
+ number: index + 1,
140
+ delay
141
+ })
142
+ })]
143
+ }), /* @__PURE__ */ jsxs("span", {
144
+ className: "stepper-text",
145
+ children: [
146
+ /* @__PURE__ */ jsx("span", {
147
+ className: "stepper-label",
148
+ children: step.label
149
+ }),
150
+ STATUS_TEXT[status] ? /* @__PURE__ */ jsxs("span", {
151
+ className: "sr-only",
152
+ children: [", ", STATUS_TEXT[status]]
153
+ }) : null,
154
+ /* @__PURE__ */ jsx(StepText, {
155
+ text: detail,
156
+ tone: step.error ? "error" : "description",
157
+ className: step.error ? "stepper-detail stepper-error" : "stepper-detail"
158
+ })
159
+ ]
160
+ })] });
161
+ return /* @__PURE__ */ jsxs("li", {
162
+ className: "stepper-item",
163
+ "data-status": status,
164
+ "data-current": isCurrent ? "" : void 0,
165
+ style: { "--stepper-delay": `${delay}ms` },
166
+ children: [index < count - 1 ? /* @__PURE__ */ jsx("span", {
167
+ className: "stepper-connector",
168
+ "aria-hidden": "true",
169
+ children: /* @__PURE__ */ jsx("span", {
170
+ className: "stepper-fill",
171
+ "data-filled": index < active ? "" : void 0
172
+ })
173
+ }) : null, interactive ? /* @__PURE__ */ jsx("button", {
174
+ type: "button",
175
+ className: "stepper-head",
176
+ "data-clickable": clickable ? "" : void 0,
177
+ "data-reachable": index <= active ? "" : void 0,
178
+ "aria-current": isCurrent ? "step" : void 0,
179
+ "aria-disabled": clickable ? void 0 : true,
180
+ tabIndex: clickable ? void 0 : -1,
181
+ onClick: clickable ? () => onStepSelect?.(index) : void 0,
182
+ children: content
183
+ }) : /* @__PURE__ */ jsx("span", {
184
+ className: "stepper-head",
185
+ "aria-current": isCurrent ? "step" : void 0,
186
+ children: content
187
+ })]
188
+ }, step.id);
189
+ })
190
+ }),
191
+ vertical ? null : /* @__PURE__ */ jsxs("span", {
192
+ className: "stepper-caption",
193
+ "aria-hidden": "true",
194
+ children: [/* @__PURE__ */ jsx(StepText, {
195
+ text: now?.label ?? completeLabel,
196
+ tone: "label",
197
+ className: "stepper-caption-label"
198
+ }), /* @__PURE__ */ jsx(StepText, {
199
+ text: now?.error ?? now?.description,
200
+ tone: now?.error ? "error" : "description",
201
+ className: now?.error ? "stepper-detail stepper-error" : "stepper-detail"
202
+ })]
203
+ }),
204
+ /* @__PURE__ */ jsx("span", {
205
+ className: "sr-only",
206
+ "aria-live": "polite",
207
+ children: now ? `Step ${active + 1} of ${count}: ${now.label}` : completeLabel
208
+ })
209
+ ]
210
+ });
211
+ });
212
+ //#endregion
213
+ export { Stepper };
214
+
215
+ //# sourceMappingURL=stepper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stepper.js","names":[],"sources":["../../src/stepper/stepper.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n forwardRef,\n useRef,\n useState,\n type CSSProperties,\n type KeyboardEvent,\n type ReactNode,\n} from \"react\";\n\nimport { cn } from \"../lib/cn.js\";\nimport { useHeightFollow } from \"../lib/height-follow.js\";\nimport { prefersReducedMotion } from \"../lib/motion.js\";\nimport { SwapText } from \"../lib/swap-text.js\";\n\n/**\n * Stepper: a steps indicator for onboarding, checkout and setup flows. Place it\n * above (horizontal) or beside (vertical) the step content and drive it with\n * `current`; set `current` to `steps.length` once every step is done.\n *\n * Moving on fills the connector behind the step that was finished (a jump\n * across several steps fills or drains them one after another), the number turns\n * into a check that draws itself, and a ring grows out behind the new current\n * step. A step marked `error` morphs its marker into an alert. A changed\n * description rises in while the old one lifts away, and the steps below follow\n * the new height. Nothing animates on first render.\n *\n * Pass `onStepSelect` to let people return to completed steps by click or\n * keyboard (arrow keys move between the steps they can reach). Without it the\n * stepper is a read-only indicator. A horizontal stepper folds to markers on\n * its own below 30rem and names the current step underneath.\n */\nexport type StepperOrientation = \"horizontal\" | \"vertical\";\nexport type StepperStatus = \"complete\" | \"current\" | \"upcoming\" | \"error\";\n\nexport interface StepperStep {\n /** Stable key, so each step keeps its own motion when the list changes. */\n id: string;\n label: string;\n /** A short hint under the label. */\n description?: string;\n /** Marks the step as failed: the marker morphs into an alert and this message replaces the description. */\n error?: string;\n}\n\nexport interface StepperProps {\n steps: StepperStep[];\n /** Index of the step in progress. `steps.length` marks the whole flow complete. */\n current: number;\n /** @default \"horizontal\" */\n orientation?: StepperOrientation;\n /** Called with the index of a completed step when it is chosen. Without it the stepper is a read-only indicator. */\n onStepSelect?: (index: number) => void;\n /** `current` shows only the active step's description, for tight spaces. Errors always show. @default \"all\" */\n details?: \"all\" | \"current\";\n /** Markers only; labels stay available to assistive tech. A horizontal stepper switches to this below 30rem on its own and shows the current step's label underneath. */\n compact?: boolean;\n /** Accessible name for the stepper. @default \"Progress\" */\n label?: string;\n /** Announced, and shown in the compact caption, once every step is complete. @default \"All steps complete\" */\n completeLabel?: string;\n /** Extra classes for the stepper. Merged last. */\n className?: string;\n}\n\ntype GlyphKind = \"number\" | \"check\" | \"error\";\n\nconst STATUS_TEXT: Record<StepperStatus, string> = {\n complete: \"Completed\",\n current: \"\",\n upcoming: \"Not started\",\n error: \"Error\",\n};\n\n/** Stagger between connectors when progress jumps across several steps (ms). */\nconst LINE_STAGGER_MS = 80;\n\n/** Text that rises in when it changes. Its frame follows the new height, so a message that wraps eases the steps below down instead of pushing them. */\nfunction StepText({ text, tone, className }: { text?: string | undefined; tone: \"description\" | \"error\" | \"label\"; className: string }) {\n const frame = useRef<HTMLSpanElement>(null);\n const content = useRef<HTMLSpanElement>(null);\n const key = text ? `${tone}:${text}` : \"\";\n useHeightFollow(frame, content, key);\n return (\n <span ref={frame} className=\"height-follow block\">\n <span ref={content} className=\"relative block\">\n <SwapText swapKey={key} className={cn(\"block\", className)}>\n {text}\n </SwapText>\n </span>\n </span>\n );\n}\n\n/** The number, check and alert share one spot: the outgoing glyph shrinks away while the next one pops in and draws its stroke. */\nfunction Glyph({ kind, number, delay }: { kind: GlyphKind; number: number; delay: number }) {\n return (\n <SwapText swapKey={kind} motion=\"glyph\" delay={delay} className=\"grid place-items-center\">\n {kind === \"number\" ? (\n number\n ) : (\n <svg\n className=\"stepper-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n {kind === \"check\" ? (\n <path className=\"stepper-draw\" pathLength={1} d=\"M5.5 12.5l4.25 4.25L18.5 8\" />\n ) : (\n <>\n <path className=\"stepper-draw\" pathLength={1} d=\"M12 6.75v6.5\" />\n <circle className=\"stepper-dot\" cx={12} cy={17.4} r={1.4} fill=\"currentColor\" stroke=\"none\" />\n </>\n )}\n </svg>\n )}\n </SwapText>\n );\n}\n\nexport const Stepper = forwardRef<HTMLElement, StepperProps>(function Stepper(\n {\n steps,\n current,\n orientation = \"horizontal\",\n onStepSelect,\n details = \"all\",\n compact = false,\n label = \"Progress\",\n completeLabel = \"All steps complete\",\n className,\n },\n ref,\n) {\n const count = steps.length;\n const active = Math.min(Math.max(Math.round(current), 0), count);\n // Remember where progress came from, so a jump across several steps fills or drains its connectors one after another.\n const [travel, setTravel] = useState({ to: active, from: active });\n if (travel.to !== active) setTravel({ to: active, from: travel.to });\n const from = travel.from;\n const still = typeof window !== \"undefined\" && prefersReducedMotion();\n const delayAt = (index: number) => {\n if (still) return 0;\n if (active > from) return index >= from && index < active ? (index - from) * LINE_STAGGER_MS : 0;\n return index >= active && index < from ? (from - 1 - index) * LINE_STAGGER_MS : 0;\n };\n // The ring grows out once the connectors have filled, so the eye lands on the new step last.\n const ringDelay = still ? 0 : Math.max(0, Math.abs(active - from) - 1) * LINE_STAGGER_MS + 120;\n const interactive = Boolean(onStepSelect);\n const vertical = orientation === \"vertical\";\n const done = active >= count;\n const now = done ? undefined : steps[active];\n\n /** Arrow keys move between the steps you can reach; Home and End jump to the first and the current one. */\n function onKeyDown(event: KeyboardEvent<HTMLOListElement>) {\n const rtl = !vertical && getComputedStyle(event.currentTarget).direction === \"rtl\";\n const back = [\"ArrowUp\", rtl ? \"ArrowRight\" : \"ArrowLeft\"];\n const ahead = [\"ArrowDown\", rtl ? \"ArrowLeft\" : \"ArrowRight\"];\n if (![...back, ...ahead, \"Home\", \"End\"].includes(event.key)) return;\n const targets = Array.from(\n event.currentTarget.querySelectorAll<HTMLButtonElement>(\"button[data-reachable]\"),\n );\n const at = targets.indexOf(event.target as HTMLButtonElement);\n if (at < 0) return;\n event.preventDefault();\n const next =\n event.key === \"Home\"\n ? 0\n : event.key === \"End\"\n ? targets.length - 1\n : back.includes(event.key)\n ? Math.max(0, at - 1)\n : Math.min(targets.length - 1, at + 1);\n targets[next]?.focus();\n }\n\n const Root = interactive ? \"nav\" : \"div\";\n return (\n <Root\n ref={ref as never}\n aria-label={label}\n role={interactive ? undefined : \"group\"}\n data-slot=\"stepper\"\n data-orientation={orientation}\n data-compact={compact ? \"\" : undefined}\n style={{ \"--stepper-ring-delay\": `${ringDelay}ms` } as CSSProperties}\n className={cn(\"stepper box-border font-sans\", className)}\n >\n <ol\n className=\"stepper-list\"\n style={\n vertical\n ? undefined\n : { gridTemplateColumns: count > 1 ? `repeat(${count - 1}, minmax(0, 1fr)) auto` : \"auto\" }\n }\n onKeyDown={interactive ? onKeyDown : undefined}\n >\n {steps.map((step, index) => {\n const isCurrent = index === active;\n const status: StepperStatus = step.error\n ? \"error\"\n : index < active\n ? \"complete\"\n : isCurrent\n ? \"current\"\n : \"upcoming\";\n const clickable = interactive && index < active;\n const detail = step.error ?? (details === \"all\" || isCurrent ? step.description : undefined);\n const kind: GlyphKind = step.error ? \"error\" : index < active ? \"check\" : \"number\";\n const delay = delayAt(index);\n const content: ReactNode = (\n <>\n <span className=\"stepper-marker\" aria-hidden=\"true\">\n <span className=\"stepper-ring\" />\n <span className=\"stepper-disc\">\n <Glyph kind={kind} number={index + 1} delay={delay} />\n </span>\n </span>\n <span className=\"stepper-text\">\n <span className=\"stepper-label\">{step.label}</span>\n {STATUS_TEXT[status] ? <span className=\"sr-only\">, {STATUS_TEXT[status]}</span> : null}\n <StepText\n text={detail}\n tone={step.error ? \"error\" : \"description\"}\n className={step.error ? \"stepper-detail stepper-error\" : \"stepper-detail\"}\n />\n </span>\n </>\n );\n return (\n <li\n key={step.id}\n className=\"stepper-item\"\n data-status={status}\n data-current={isCurrent ? \"\" : undefined}\n style={{ \"--stepper-delay\": `${delay}ms` } as CSSProperties}\n >\n {index < count - 1 ? (\n <span className=\"stepper-connector\" aria-hidden=\"true\">\n <span className=\"stepper-fill\" data-filled={index < active ? \"\" : undefined} />\n </span>\n ) : null}\n {interactive ? (\n <button\n type=\"button\"\n className=\"stepper-head\"\n data-clickable={clickable ? \"\" : undefined}\n data-reachable={index <= active ? \"\" : undefined}\n aria-current={isCurrent ? \"step\" : undefined}\n aria-disabled={clickable ? undefined : true}\n tabIndex={clickable ? undefined : -1}\n onClick={clickable ? () => onStepSelect?.(index) : undefined}\n >\n {content}\n </button>\n ) : (\n <span className=\"stepper-head\" aria-current={isCurrent ? \"step\" : undefined}>\n {content}\n </span>\n )}\n </li>\n );\n })}\n </ol>\n {vertical ? null : (\n <span className=\"stepper-caption\" aria-hidden=\"true\">\n <StepText text={now?.label ?? completeLabel} tone=\"label\" className=\"stepper-caption-label\" />\n <StepText\n text={now?.error ?? now?.description}\n tone={now?.error ? \"error\" : \"description\"}\n className={now?.error ? \"stepper-detail stepper-error\" : \"stepper-detail\"}\n />\n </span>\n )}\n <span className=\"sr-only\" aria-live=\"polite\">\n {now ? `Step ${active + 1} of ${count}: ${now.label}` : completeLabel}\n </span>\n </Root>\n );\n});\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Streamgraph, StreamgraphDatum, StreamgraphProps, StreamgraphSeries } from "./streamgraph.js";
2
+ export { Streamgraph, type StreamgraphDatum, type StreamgraphProps, type StreamgraphSeries };
@@ -0,0 +1,2 @@
1
+ import { Streamgraph } from "./streamgraph.js";
2
+ export { Streamgraph };
@@ -0,0 +1,70 @@
1
+ //#region src/streamgraph/streamgraph.d.ts
2
+ /**
3
+ * Streamgraph: how the mix of several parts changes over time, when the overall
4
+ * shape matters more than exact values. Layers flow around a centre line, the
5
+ * first through the middle and the rest alternating above and below it.
6
+ *
7
+ * The stream swells out of a hairline along its centre the first time it is
8
+ * seen. New data blends every layer from the shape on screen to the new one;
9
+ * switching a layer off thins it to nothing while the others close over it.
10
+ * Hovering, touching or the arrow keys read the stream at a point in time: a
11
+ * crosshair glides to it and a tooltip lists every layer. The layer under the
12
+ * pointer (or chosen with the up and down keys, or the legend) comes forward and
13
+ * the rest step back. Each layer is named inside its widest stretch when it is
14
+ * thick enough to hold the text.
15
+ *
16
+ * Plain SVG written straight to the DOM by one small spring tween; the curves
17
+ * are resampled onto a shared grid, so datasets of any length morph into each
18
+ * other.
19
+ */
20
+ export interface StreamgraphSeries {
21
+ /** Stable identity. A layer keeps its place and colour across data changes, so switching datasets morphs it. */
22
+ key: string;
23
+ /** Name in the legend, the direct label, the tooltip and the data table. */
24
+ label: string;
25
+ /** Any CSS colour. Defaults to chart-1 to chart-4 for the first four layers, then neutral steps. */
26
+ color?: string;
27
+ }
28
+ export interface StreamgraphDatum {
29
+ /** Stable identity, such as an ISO week. */
30
+ key: string;
31
+ /** Full label for the tooltip and screen readers, such as "Week of Sep 14". */
32
+ label: string;
33
+ /** Short label on the time axis. Leave it out to keep the axis quiet at that point. */
34
+ axisLabel?: string;
35
+ /** One value per series key. Missing values count as zero; negatives are treated as zero. */
36
+ values: Record<string, number | undefined>;
37
+ }
38
+ export interface StreamgraphProps {
39
+ data: StreamgraphDatum[];
40
+ /** Layers from the centre out: the first runs through the middle of the stream, the rest alternate above and below it. */
41
+ series: StreamgraphSeries[];
42
+ /** What is measured, such as "Support tickets by topic". Names the chart for assistive technology. */
43
+ label: string;
44
+ /** Unit after each value, such as "tickets". */
45
+ unit?: string;
46
+ /** Plot height in pixels. The width follows the container. @default 260 */
47
+ height?: number;
48
+ /** "wiggle" minimises layer slopes for a flowing stream, "silhouette" centres the stack, "zero" stacks from a flat baseline. @default "wiggle" */
49
+ offset?: "wiggle" | "silhouette" | "zero";
50
+ formatValue?: (value: number, series: StreamgraphSeries) => string;
51
+ /** Controlled hidden layer keys. A hidden layer thins to nothing and the rest reflow. */
52
+ hiddenSeries?: string[];
53
+ defaultHiddenSeries?: string[];
54
+ onHiddenSeriesChange?: (hidden: string[]) => void;
55
+ /** Called as the reading moves, and with nulls when it leaves. */
56
+ onActiveChange?: (index: number | null, seriesKey: string | null) => void;
57
+ /** Layer toggles above the plot. @default true */
58
+ legend?: boolean;
59
+ /** Names each layer inside its widest stretch when it is thick enough to hold the text. @default true */
60
+ directLabels?: boolean;
61
+ /** Header of the first column in the screen reader table. @default "Date" */
62
+ categoryLabel?: string;
63
+ /** @default "No data for this range" */
64
+ emptyLabel?: string;
65
+ /** Extra classes for the root. Merged last. */
66
+ className?: string;
67
+ }
68
+ export declare const Streamgraph: import("react").ForwardRefExoticComponent<StreamgraphProps & import("react").RefAttributes<HTMLElement>>;
69
+ //#endregion
70
+ //# sourceMappingURL=streamgraph.d.ts.map