@seekalfred/primitives 0.5.1 → 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 (446) hide show
  1. package/README.md +682 -19
  2. package/dist/accordion/accordion.js +10 -4
  3. package/dist/accordion/accordion.js.map +1 -1
  4. package/dist/action-button/action-button.d.ts +50 -0
  5. package/dist/action-button/action-button.js +159 -0
  6. package/dist/action-button/action-button.js.map +1 -0
  7. package/dist/action-button/index.d.ts +2 -0
  8. package/dist/action-button/index.js +2 -0
  9. package/dist/activity-heatmap/activity-heatmap.d.ts +92 -0
  10. package/dist/activity-heatmap/activity-heatmap.js +699 -0
  11. package/dist/activity-heatmap/activity-heatmap.js.map +1 -0
  12. package/dist/activity-heatmap/index.d.ts +2 -0
  13. package/dist/activity-heatmap/index.js +2 -0
  14. package/dist/alert/alert.d.ts +19 -1
  15. package/dist/alert/alert.js +180 -23
  16. package/dist/alert/alert.js.map +1 -1
  17. package/dist/alert-dialog/alert-dialog.d.ts +45 -18
  18. package/dist/alert-dialog/alert-dialog.js +128 -9
  19. package/dist/alert-dialog/alert-dialog.js.map +1 -1
  20. package/dist/alert-dialog/index.d.ts +2 -2
  21. package/dist/alert-dialog/index.js +2 -2
  22. package/dist/animated-counter/animated-counter.d.ts +38 -0
  23. package/dist/animated-counter/animated-counter.js +230 -0
  24. package/dist/animated-counter/animated-counter.js.map +1 -0
  25. package/dist/animated-counter/index.d.ts +2 -0
  26. package/dist/animated-counter/index.js +2 -0
  27. package/dist/announcement-bar/announcement-bar.d.ts +67 -0
  28. package/dist/announcement-bar/announcement-bar.js +364 -0
  29. package/dist/announcement-bar/announcement-bar.js.map +1 -0
  30. package/dist/announcement-bar/index.d.ts +2 -0
  31. package/dist/announcement-bar/index.js +2 -0
  32. package/dist/avatar/avatar.d.ts +6 -0
  33. package/dist/avatar/avatar.js +47 -16
  34. package/dist/avatar/avatar.js.map +1 -1
  35. package/dist/badge/badge.d.ts +10 -3
  36. package/dist/badge/badge.js +35 -5
  37. package/dist/badge/badge.js.map +1 -1
  38. package/dist/bar-chart/bar-chart.d.ts +51 -0
  39. package/dist/bar-chart/bar-chart.js +565 -0
  40. package/dist/bar-chart/bar-chart.js.map +1 -0
  41. package/dist/bar-chart/index.d.ts +2 -0
  42. package/dist/bar-chart/index.js +2 -0
  43. package/dist/breadcrumb/breadcrumb.d.ts +2 -29
  44. package/dist/breadcrumb/breadcrumb.js +32 -9
  45. package/dist/breadcrumb/breadcrumb.js.map +1 -1
  46. package/dist/brush-chart/brush-chart.d.ts +64 -0
  47. package/dist/brush-chart/brush-chart.js +1056 -0
  48. package/dist/brush-chart/brush-chart.js.map +1 -0
  49. package/dist/brush-chart/index.d.ts +2 -0
  50. package/dist/brush-chart/index.js +2 -0
  51. package/dist/button/button.d.ts +36 -23
  52. package/dist/button/button.js +198 -45
  53. package/dist/button/button.js.map +1 -1
  54. package/dist/button-group/button-group.d.ts +76 -0
  55. package/dist/button-group/button-group.js +402 -0
  56. package/dist/button-group/button-group.js.map +1 -0
  57. package/dist/button-group/index.d.ts +2 -0
  58. package/dist/button-group/index.js +2 -0
  59. package/dist/calendar/calendar.d.ts +1 -1
  60. package/dist/calendar/calendar.js +257 -30
  61. package/dist/calendar/calendar.js.map +1 -1
  62. package/dist/card/card.d.ts +9 -2
  63. package/dist/card/card.js +16 -5
  64. package/dist/card/card.js.map +1 -1
  65. package/dist/card-stack/card-stack.d.ts +54 -0
  66. package/dist/card-stack/card-stack.js +492 -0
  67. package/dist/card-stack/card-stack.js.map +1 -0
  68. package/dist/card-stack/index.d.ts +2 -0
  69. package/dist/card-stack/index.js +2 -0
  70. package/dist/carousel/carousel.d.ts +56 -0
  71. package/dist/carousel/carousel.js +389 -0
  72. package/dist/carousel/carousel.js.map +1 -0
  73. package/dist/carousel/index.d.ts +2 -0
  74. package/dist/carousel/index.js +2 -0
  75. package/dist/checkbox/checkbox.d.ts +0 -7
  76. package/dist/checkbox/checkbox.js +26 -29
  77. package/dist/checkbox/checkbox.js.map +1 -1
  78. package/dist/chip-group/chip-group.d.ts +37 -0
  79. package/dist/chip-group/chip-group.js +148 -0
  80. package/dist/chip-group/chip-group.js.map +1 -0
  81. package/dist/chip-group/index.d.ts +2 -0
  82. package/dist/chip-group/index.js +2 -0
  83. package/dist/confirm-morph/confirm-morph.d.ts +85 -0
  84. package/dist/confirm-morph/confirm-morph.js +652 -0
  85. package/dist/confirm-morph/confirm-morph.js.map +1 -0
  86. package/dist/confirm-morph/index.d.ts +2 -0
  87. package/dist/confirm-morph/index.js +2 -0
  88. package/dist/copy-button/copy-button.d.ts +32 -0
  89. package/dist/copy-button/copy-button.js +134 -0
  90. package/dist/copy-button/copy-button.js.map +1 -0
  91. package/dist/copy-button/index.d.ts +2 -0
  92. package/dist/copy-button/index.js +2 -0
  93. package/dist/countdown/countdown.d.ts +45 -0
  94. package/dist/countdown/countdown.js +298 -0
  95. package/dist/countdown/countdown.js.map +1 -0
  96. package/dist/countdown/index.d.ts +2 -0
  97. package/dist/countdown/index.js +2 -0
  98. package/dist/date-picker/date-picker.d.ts +51 -0
  99. package/dist/date-picker/date-picker.js +241 -0
  100. package/dist/date-picker/date-picker.js.map +1 -0
  101. package/dist/date-picker/date-range-picker.d.ts +78 -0
  102. package/dist/date-picker/date-range-picker.js +1015 -0
  103. package/dist/date-picker/date-range-picker.js.map +1 -0
  104. package/dist/date-picker/index.d.ts +4 -0
  105. package/dist/date-picker/index.js +4 -0
  106. package/dist/date-picker/picker-parts.d.ts +46 -0
  107. package/dist/date-picker/picker-parts.js +135 -0
  108. package/dist/date-picker/picker-parts.js.map +1 -0
  109. package/dist/dialog/dialog.d.ts +10 -14
  110. package/dist/dialog/dialog.js +40 -12
  111. package/dist/dialog/dialog.js.map +1 -1
  112. package/dist/donut-chart/donut-chart.d.ts +64 -0
  113. package/dist/donut-chart/donut-chart.js +576 -0
  114. package/dist/donut-chart/donut-chart.js.map +1 -0
  115. package/dist/donut-chart/index.d.ts +2 -0
  116. package/dist/donut-chart/index.js +2 -0
  117. package/dist/empty-state/empty-state.d.ts +55 -0
  118. package/dist/empty-state/empty-state.js +89 -0
  119. package/dist/empty-state/empty-state.js.map +1 -0
  120. package/dist/empty-state/index.d.ts +2 -0
  121. package/dist/empty-state/index.js +2 -0
  122. package/dist/expanding-button-group/expanding-button-group.d.ts +54 -0
  123. package/dist/expanding-button-group/expanding-button-group.js +350 -0
  124. package/dist/expanding-button-group/expanding-button-group.js.map +1 -0
  125. package/dist/expanding-button-group/index.d.ts +2 -0
  126. package/dist/expanding-button-group/index.js +2 -0
  127. package/dist/file-drop-zone/file-drop-zone.d.ts +71 -0
  128. package/dist/file-drop-zone/file-drop-zone.js +116 -0
  129. package/dist/file-drop-zone/file-drop-zone.js.map +1 -0
  130. package/dist/file-drop-zone/index.d.ts +2 -0
  131. package/dist/file-drop-zone/index.js +2 -0
  132. package/dist/filter-bar/filter-bar.d.ts +142 -0
  133. package/dist/filter-bar/filter-bar.js +416 -0
  134. package/dist/filter-bar/filter-bar.js.map +1 -0
  135. package/dist/filter-bar/index.d.ts +2 -0
  136. package/dist/filter-bar/index.js +2 -0
  137. package/dist/floating-button-group/floating-button-group.d.ts +61 -0
  138. package/dist/floating-button-group/floating-button-group.js +340 -0
  139. package/dist/floating-button-group/floating-button-group.js.map +1 -0
  140. package/dist/floating-button-group/index.d.ts +2 -0
  141. package/dist/floating-button-group/index.js +2 -0
  142. package/dist/gauge/gauge.d.ts +45 -0
  143. package/dist/gauge/gauge.js +219 -0
  144. package/dist/gauge/gauge.js.map +1 -0
  145. package/dist/gauge/index.d.ts +2 -0
  146. package/dist/gauge/index.js +2 -0
  147. package/dist/icon-morph/icon-morph.d.ts +55 -0
  148. package/dist/icon-morph/icon-morph.js +331 -0
  149. package/dist/icon-morph/icon-morph.js.map +1 -0
  150. package/dist/icon-morph/index.d.ts +2 -0
  151. package/dist/icon-morph/index.js +2 -0
  152. package/dist/in-view-title/in-view-title.d.ts +33 -0
  153. package/dist/in-view-title/in-view-title.js +119 -0
  154. package/dist/in-view-title/in-view-title.js.map +1 -0
  155. package/dist/in-view-title/index.d.ts +2 -0
  156. package/dist/in-view-title/index.js +2 -0
  157. package/dist/index.d.ts +71 -6
  158. package/dist/index.js +73 -11
  159. package/dist/input/input.d.ts +22 -0
  160. package/dist/input/input.js +36 -12
  161. package/dist/input/input.js.map +1 -1
  162. package/dist/lib/cn.js +11 -1
  163. package/dist/lib/cn.js.map +1 -1
  164. package/dist/lib/count-to.js +113 -0
  165. package/dist/lib/count-to.js.map +1 -0
  166. package/dist/lib/eye-morph.js +62 -0
  167. package/dist/lib/eye-morph.js.map +1 -0
  168. package/dist/lib/field-message.js +354 -0
  169. package/dist/lib/field-message.js.map +1 -0
  170. package/dist/lib/field-shell.js +81 -0
  171. package/dist/lib/field-shell.js.map +1 -0
  172. package/dist/lib/field-surface.js +11 -8
  173. package/dist/lib/field-surface.js.map +1 -1
  174. package/dist/lib/flag-emoji.js +50 -0
  175. package/dist/lib/flag-emoji.js.map +1 -0
  176. package/dist/lib/flip.js +88 -0
  177. package/dist/lib/flip.js.map +1 -0
  178. package/dist/lib/height-follow.js +59 -0
  179. package/dist/lib/height-follow.js.map +1 -0
  180. package/dist/lib/icon-swap.js +47 -0
  181. package/dist/lib/icon-swap.js.map +1 -0
  182. package/dist/lib/leaving-list.js +57 -0
  183. package/dist/lib/leaving-list.js.map +1 -0
  184. package/dist/lib/menu-highlight.js +64 -0
  185. package/dist/lib/menu-highlight.js.map +1 -0
  186. package/dist/lib/merge-refs.js +3 -3
  187. package/dist/lib/merge-refs.js.map +1 -1
  188. package/dist/lib/morph-text.js +128 -0
  189. package/dist/lib/morph-text.js.map +1 -0
  190. package/dist/lib/motion.js +169 -0
  191. package/dist/lib/motion.js.map +1 -0
  192. package/dist/lib/pausable-timeout.js +67 -0
  193. package/dist/lib/pausable-timeout.js.map +1 -0
  194. package/dist/lib/rolling-value.js +31 -0
  195. package/dist/lib/rolling-value.js.map +1 -0
  196. package/dist/lib/spring-progress.js +114 -0
  197. package/dist/lib/spring-progress.js.map +1 -0
  198. package/dist/lib/spring-tween.js +500 -0
  199. package/dist/lib/spring-tween.js.map +1 -0
  200. package/dist/lib/svg-id.js +10 -0
  201. package/dist/lib/svg-id.js.map +1 -0
  202. package/dist/lib/swap-text.js +79 -0
  203. package/dist/lib/swap-text.js.map +1 -0
  204. package/dist/lib/use-copy-feedback.js +36 -0
  205. package/dist/lib/use-copy-feedback.js.map +1 -0
  206. package/dist/line-chart/index.d.ts +2 -0
  207. package/dist/line-chart/index.js +2 -0
  208. package/dist/line-chart/line-chart.d.ts +76 -0
  209. package/dist/line-chart/line-chart.js +611 -0
  210. package/dist/line-chart/line-chart.js.map +1 -0
  211. package/dist/mention-input/index.d.ts +2 -0
  212. package/dist/mention-input/index.js +2 -0
  213. package/dist/mention-input/mention-input.d.ts +98 -0
  214. package/dist/mention-input/mention-input.js +576 -0
  215. package/dist/mention-input/mention-input.js.map +1 -0
  216. package/dist/menu/menu.d.ts +2 -0
  217. package/dist/menu/menu.js +23 -12
  218. package/dist/menu/menu.js.map +1 -1
  219. package/dist/money-input/index.d.ts +2 -0
  220. package/dist/money-input/index.js +2 -0
  221. package/dist/money-input/money-input.d.ts +65 -0
  222. package/dist/money-input/money-input.js +607 -0
  223. package/dist/money-input/money-input.js.map +1 -0
  224. package/dist/morph-select/index.d.ts +2 -0
  225. package/dist/morph-select/index.js +2 -0
  226. package/dist/morph-select/morph-select.d.ts +71 -0
  227. package/dist/morph-select/morph-select.js +693 -0
  228. package/dist/morph-select/morph-select.js.map +1 -0
  229. package/dist/multi-select/index.d.ts +2 -0
  230. package/dist/multi-select/index.js +2 -0
  231. package/dist/multi-select/multi-select.d.ts +36 -0
  232. package/dist/multi-select/multi-select.js +152 -0
  233. package/dist/multi-select/multi-select.js.map +1 -0
  234. package/dist/number-field/index.d.ts +2 -0
  235. package/dist/number-field/index.js +2 -0
  236. package/dist/number-field/number-field.d.ts +42 -0
  237. package/dist/number-field/number-field.js +199 -0
  238. package/dist/number-field/number-field.js.map +1 -0
  239. package/dist/onboarding-checklist/index.d.ts +2 -0
  240. package/dist/onboarding-checklist/index.js +2 -0
  241. package/dist/onboarding-checklist/onboarding-checklist.d.ts +55 -0
  242. package/dist/onboarding-checklist/onboarding-checklist.js +577 -0
  243. package/dist/onboarding-checklist/onboarding-checklist.js.map +1 -0
  244. package/dist/page-header/index.d.ts +2 -0
  245. package/dist/page-header/index.js +2 -0
  246. package/dist/page-header/page-header.d.ts +75 -0
  247. package/dist/page-header/page-header.js +83 -0
  248. package/dist/page-header/page-header.js.map +1 -0
  249. package/dist/password-field/index.d.ts +2 -0
  250. package/dist/password-field/index.js +2 -0
  251. package/dist/password-field/password-field.d.ts +37 -0
  252. package/dist/password-field/password-field.js +101 -0
  253. package/dist/password-field/password-field.js.map +1 -0
  254. package/dist/password-strength/index.d.ts +2 -0
  255. package/dist/password-strength/index.js +2 -0
  256. package/dist/password-strength/password-strength.d.ts +127 -0
  257. package/dist/password-strength/password-strength.js +455 -0
  258. package/dist/password-strength/password-strength.js.map +1 -0
  259. package/dist/phone-input/index.d.ts +3 -0
  260. package/dist/phone-input/index.js +3 -0
  261. package/dist/phone-input/phone-countries.d.ts +29 -0
  262. package/dist/phone-input/phone-countries.js +170 -0
  263. package/dist/phone-input/phone-countries.js.map +1 -0
  264. package/dist/phone-input/phone-input.d.ts +66 -0
  265. package/dist/phone-input/phone-input.js +440 -0
  266. package/dist/phone-input/phone-input.js.map +1 -0
  267. package/dist/popover/popover.d.ts +20 -0
  268. package/dist/popover/popover.js +33 -9
  269. package/dist/popover/popover.js.map +1 -1
  270. package/dist/progress/progress.js +46 -5
  271. package/dist/progress/progress.js.map +1 -1
  272. package/dist/radio-group/radio-group.js +8 -7
  273. package/dist/radio-group/radio-group.js.map +1 -1
  274. package/dist/reactions/index.d.ts +2 -0
  275. package/dist/reactions/index.js +2 -0
  276. package/dist/reactions/reactions.d.ts +50 -0
  277. package/dist/reactions/reactions.js +315 -0
  278. package/dist/reactions/reactions.js.map +1 -0
  279. package/dist/rich-text-editor/index.d.ts +3 -0
  280. package/dist/rich-text-editor/index.js +2 -0
  281. package/dist/rich-text-editor/rich-text-editor.d.ts +70 -0
  282. package/dist/rich-text-editor/rich-text-editor.js +909 -0
  283. package/dist/rich-text-editor/rich-text-editor.js.map +1 -0
  284. package/dist/rich-text-editor/rich-text-engine.d.ts +16 -0
  285. package/dist/rich-text-editor/rich-text-engine.js +366 -0
  286. package/dist/rich-text-editor/rich-text-engine.js.map +1 -0
  287. package/dist/rich-text-editor/rich-text-html.js +174 -0
  288. package/dist/rich-text-editor/rich-text-html.js.map +1 -0
  289. package/dist/rich-text-editor/rich-text-icons.js +43 -0
  290. package/dist/rich-text-editor/rich-text-icons.js.map +1 -0
  291. package/dist/ridgeline/index.d.ts +2 -0
  292. package/dist/ridgeline/index.js +2 -0
  293. package/dist/ridgeline/ridgeline.d.ts +55 -0
  294. package/dist/ridgeline/ridgeline.js +701 -0
  295. package/dist/ridgeline/ridgeline.js.map +1 -0
  296. package/dist/scroll-area/index.d.ts +2 -2
  297. package/dist/scroll-area/index.js +2 -2
  298. package/dist/scroll-area/scroll-area.d.ts +75 -28
  299. package/dist/scroll-area/scroll-area.js +212 -41
  300. package/dist/scroll-area/scroll-area.js.map +1 -1
  301. package/dist/scrub-input/evaluate.d.ts +14 -0
  302. package/dist/scrub-input/evaluate.js +72 -0
  303. package/dist/scrub-input/evaluate.js.map +1 -0
  304. package/dist/scrub-input/index.d.ts +3 -0
  305. package/dist/scrub-input/index.js +3 -0
  306. package/dist/scrub-input/scrub-input.d.ts +74 -0
  307. package/dist/scrub-input/scrub-input.js +486 -0
  308. package/dist/scrub-input/scrub-input.js.map +1 -0
  309. package/dist/search-field/index.d.ts +2 -0
  310. package/dist/search-field/index.js +2 -0
  311. package/dist/search-field/search-field.d.ts +27 -0
  312. package/dist/search-field/search-field.js +155 -0
  313. package/dist/search-field/search-field.js.map +1 -0
  314. package/dist/select/select.d.ts +3 -1
  315. package/dist/select/select.js +95 -25
  316. package/dist/select/select.js.map +1 -1
  317. package/dist/separator/separator.d.ts +1 -1
  318. package/dist/sheet/sheet.js +4 -2
  319. package/dist/sheet/sheet.js.map +1 -1
  320. package/dist/shortcut-recorder/index.d.ts +3 -0
  321. package/dist/shortcut-recorder/index.js +3 -0
  322. package/dist/shortcut-recorder/shortcut-model.d.ts +27 -0
  323. package/dist/shortcut-recorder/shortcut-model.js +206 -0
  324. package/dist/shortcut-recorder/shortcut-model.js.map +1 -0
  325. package/dist/shortcut-recorder/shortcut-recorder.d.ts +93 -0
  326. package/dist/shortcut-recorder/shortcut-recorder.js +489 -0
  327. package/dist/shortcut-recorder/shortcut-recorder.js.map +1 -0
  328. package/dist/side-nav/index.d.ts +2 -0
  329. package/dist/side-nav/index.js +2 -0
  330. package/dist/side-nav/side-nav.d.ts +72 -0
  331. package/dist/side-nav/side-nav.js +142 -0
  332. package/dist/side-nav/side-nav.js.map +1 -0
  333. package/dist/skeleton/skeleton.d.ts +8 -2
  334. package/dist/skeleton/skeleton.js +6 -2
  335. package/dist/skeleton/skeleton.js.map +1 -1
  336. package/dist/slider/index.d.ts +2 -2
  337. package/dist/slider/slider.d.ts +46 -14
  338. package/dist/slider/slider.js +188 -50
  339. package/dist/slider/slider.js.map +1 -1
  340. package/dist/slope-chart/index.d.ts +2 -0
  341. package/dist/slope-chart/index.js +2 -0
  342. package/dist/slope-chart/slope-chart.d.ts +54 -0
  343. package/dist/slope-chart/slope-chart.js +568 -0
  344. package/dist/slope-chart/slope-chart.js.map +1 -0
  345. package/dist/sparkline/index.d.ts +2 -0
  346. package/dist/sparkline/index.js +2 -0
  347. package/dist/sparkline/sparkline.d.ts +46 -0
  348. package/dist/sparkline/sparkline.js +390 -0
  349. package/dist/sparkline/sparkline.js.map +1 -0
  350. package/dist/split-bar/index.d.ts +2 -0
  351. package/dist/split-bar/index.js +2 -0
  352. package/dist/split-bar/split-bar.d.ts +62 -0
  353. package/dist/split-bar/split-bar.js +513 -0
  354. package/dist/split-bar/split-bar.js.map +1 -0
  355. package/dist/split-button/index.d.ts +2 -0
  356. package/dist/split-button/index.js +2 -0
  357. package/dist/split-button/split-button.d.ts +46 -0
  358. package/dist/split-button/split-button.js +123 -0
  359. package/dist/split-button/split-button.js.map +1 -0
  360. package/dist/stat-card/index.d.ts +2 -0
  361. package/dist/stat-card/index.js +2 -0
  362. package/dist/stat-card/stat-card.d.ts +101 -0
  363. package/dist/stat-card/stat-card.js +249 -0
  364. package/dist/stat-card/stat-card.js.map +1 -0
  365. package/dist/stepper/index.d.ts +2 -0
  366. package/dist/stepper/index.js +2 -0
  367. package/dist/stepper/stepper.d.ts +51 -0
  368. package/dist/stepper/stepper.js +215 -0
  369. package/dist/stepper/stepper.js.map +1 -0
  370. package/dist/streamgraph/index.d.ts +2 -0
  371. package/dist/streamgraph/index.js +2 -0
  372. package/dist/streamgraph/streamgraph.d.ts +70 -0
  373. package/dist/streamgraph/streamgraph.js +613 -0
  374. package/dist/streamgraph/streamgraph.js.map +1 -0
  375. package/dist/styles.css +1 -1
  376. package/dist/swipe-actions/index.d.ts +2 -0
  377. package/dist/swipe-actions/index.js +2 -0
  378. package/dist/swipe-actions/swipe-actions.d.ts +67 -0
  379. package/dist/swipe-actions/swipe-actions.js +552 -0
  380. package/dist/swipe-actions/swipe-actions.js.map +1 -0
  381. package/dist/switch/switch.js +10 -9
  382. package/dist/switch/switch.js.map +1 -1
  383. package/dist/table/index.d.ts +2 -2
  384. package/dist/table/index.js +2 -2
  385. package/dist/table/table.d.ts +87 -4
  386. package/dist/table/table.js +441 -165
  387. package/dist/table/table.js.map +1 -1
  388. package/dist/tabs/tabs.js +143 -7
  389. package/dist/tabs/tabs.js.map +1 -1
  390. package/dist/tag-input/index.d.ts +2 -0
  391. package/dist/tag-input/index.js +2 -0
  392. package/dist/tag-input/tag-input.d.ts +40 -0
  393. package/dist/tag-input/tag-input.js +269 -0
  394. package/dist/tag-input/tag-input.js.map +1 -0
  395. package/dist/text-morph/index.d.ts +2 -0
  396. package/dist/text-morph/index.js +2 -0
  397. package/dist/text-morph/text-morph.d.ts +23 -0
  398. package/dist/text-morph/text-morph.js +21 -0
  399. package/dist/text-morph/text-morph.js.map +1 -0
  400. package/dist/text-reveal/index.d.ts +2 -0
  401. package/dist/text-reveal/index.js +2 -0
  402. package/dist/text-reveal/text-reveal.d.ts +27 -0
  403. package/dist/text-reveal/text-reveal.js +51 -0
  404. package/dist/text-reveal/text-reveal.js.map +1 -0
  405. package/dist/text-shimmer/index.d.ts +2 -0
  406. package/dist/text-shimmer/index.js +2 -0
  407. package/dist/text-shimmer/text-shimmer.d.ts +29 -0
  408. package/dist/text-shimmer/text-shimmer.js +29 -0
  409. package/dist/text-shimmer/text-shimmer.js.map +1 -0
  410. package/dist/textarea/textarea.d.ts +23 -0
  411. package/dist/textarea/textarea.js +24 -2
  412. package/dist/textarea/textarea.js.map +1 -1
  413. package/dist/theme-switch/index.d.ts +2 -0
  414. package/dist/theme-switch/index.js +2 -0
  415. package/dist/theme-switch/theme-switch.d.ts +37 -0
  416. package/dist/theme-switch/theme-switch.js +123 -0
  417. package/dist/theme-switch/theme-switch.js.map +1 -0
  418. package/dist/time-picker/index.d.ts +2 -0
  419. package/dist/time-picker/index.js +2 -0
  420. package/dist/time-picker/time-picker.d.ts +54 -0
  421. package/dist/time-picker/time-picker.js +201 -0
  422. package/dist/time-picker/time-picker.js.map +1 -0
  423. package/dist/toast/index.d.ts +2 -2
  424. package/dist/toast/index.js +2 -2
  425. package/dist/toast/toast.d.ts +6 -0
  426. package/dist/toast/toast.js +98 -36
  427. package/dist/toast/toast.js.map +1 -1
  428. package/dist/tooltip/tooltip.d.ts +10 -3
  429. package/dist/tooltip/tooltip.js +67 -18
  430. package/dist/tooltip/tooltip.js.map +1 -1
  431. package/dist/treemap/index.d.ts +2 -0
  432. package/dist/treemap/index.js +2 -0
  433. package/dist/treemap/treemap.d.ts +53 -0
  434. package/dist/treemap/treemap.js +699 -0
  435. package/dist/treemap/treemap.js.map +1 -0
  436. package/dist/usage-meter/index.d.ts +2 -0
  437. package/dist/usage-meter/index.js +2 -0
  438. package/dist/usage-meter/usage-meter.d.ts +50 -0
  439. package/dist/usage-meter/usage-meter.js +440 -0
  440. package/dist/usage-meter/usage-meter.js.map +1 -0
  441. package/dist/waffle-chart/index.d.ts +2 -0
  442. package/dist/waffle-chart/index.js +2 -0
  443. package/dist/waffle-chart/waffle-chart.d.ts +57 -0
  444. package/dist/waffle-chart/waffle-chart.js +426 -0
  445. package/dist/waffle-chart/waffle-chart.js.map +1 -0
  446. package/package.json +245 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"card-stack.js","names":[],"sources":["../../src/card-stack/card-stack.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n useCallback,\n useId,\n useRef,\n useState,\n type CSSProperties,\n type KeyboardEvent,\n type PointerEvent as ReactPointerEvent,\n type ReactNode,\n type RefObject,\n type SVGProps,\n} from \"react\";\n\nimport { Button, type ButtonProps } from \"../button/button.js\";\nimport { cn } from \"../lib/cn.js\";\nimport { prefersReducedMotion, useExitBackstop, useIsomorphicLayoutEffect } from \"../lib/motion.js\";\n\nexport type CardDecision = \"left\" | \"right\";\n\n/**\n * CardStack: a deck of cards reviewed one at a time. Drag or flick the top card\n * left or right, or use the buttons and the arrow keys. The cards behind peek\n * out below it and rise as it leaves; a card in the hand tips the way it is\n * moving and shows a stamp (the action it will take); let go early and it springs\n * home, let go far enough, or fast enough, and it is thrown. Undo brings the\n * last card back from where it left, and Start over deals the deck again.\n *\n * Use it for quick triage where each item deserves a moment of attention:\n * shortlisting destinations, candidates or design options. Use a list or a\n * table when people need to compare items side by side.\n *\n * Keyboard: the stack takes one tab stop; Left and Right decide the top card,\n * Backspace (or Ctrl or Cmd with Z) undoes. Every decision is announced politely\n * and the buttons do the same, so nothing needs a drag. Reduced motion fades the\n * card out and back instead of throwing it.\n */\nexport interface CardStackProps<T> {\n items: T[];\n /** A stable key for an item. */\n getKey: (item: T) => string;\n /** A short name for the card, used in its accessible label and announcements, such as \"Lisbon\". */\n getLabel: (item: T) => string;\n /** The card's content. It fills the card, whose size the stack sets. */\n renderCard: (item: T) => ReactNode;\n /** Called when a card is decided. */\n onDecide?: (item: T, decision: CardDecision) => void;\n /** Called when a decision is undone. */\n onUndo?: (item: T, decision: CardDecision) => void;\n /** Called when the deck is dealt again. */\n onReset?: () => void;\n /** Action names for each side, used on the buttons and the stamps that appear while dragging. @default { left: \"Pass\", right: \"Keep\" } */\n labels?: { left: string; right: string };\n /** Past tense of each action for announcements, such as \"skipped\" and \"shortlisted\". Without it a decision reads \"Lisbon: Keep\". */\n outcomes?: { left: string; right: string };\n /** Accessible name for the stack. @default \"Cards\" */\n label?: string;\n /** Shown once every card has been decided. Receives a function that brings all cards back. */\n renderEmpty?: (reset: () => void) => ReactNode;\n /** Extra classes for the stack. Merged last. */\n className?: string;\n}\n\ninterface Point {\n x: number;\n y: number;\n}\ntype Exit = Point & { tilt: number };\ntype Return = Exit & { delay: number };\n\n/** Cards rendered in the stack. The last one waits invisibly one step behind and fades in as it rises. */\nconst VISIBLE = 4;\n/** Degrees of rotation per pixel of horizontal travel. */\nconst ROTATE = 0.065;\n/** A release faster than this (px/s) throws the card even when it has only moved a little. */\nconst FLICK = 500;\n/** Drag distance at which the cards behind have fully risen. */\nconst LIFT_DISTANCE = 160;\n/** Vertical travel is not a decision, so past a small free zone it resists like a rubber band. */\nconst FREE_Y = 48;\nconst STRETCH_Y = 140;\n/** The stamp is fully shown at 96px of travel and starts at 16px. */\nconst STAMP_FROM = 16;\nconst STAMP_TO = 96;\n/** A thrown card is gone this long after it starts (the fade finishes well before); the backstop for a transition that never ends. */\nconst FLIGHT_BACKSTOP_MS = 1500;\n\nconst resistY = (raw: number) => {\n const distance = Math.abs(raw);\n return distance <= FREE_Y\n ? raw\n : Math.sign(raw) *\n (FREE_Y + (1 - 1 / (((distance - FREE_Y) * 0.55) / STRETCH_Y + 1)) * STRETCH_Y);\n};\nconst unresistY = (shown: number) => {\n const distance = Math.abs(shown);\n if (distance <= FREE_Y) return shown;\n const stretch = Math.min(distance - FREE_Y, STRETCH_Y - 1);\n return Math.sign(shown) * (FREE_Y + ((1 / (1 - stretch / STRETCH_Y) - 1) * STRETCH_Y) / 0.55);\n};\nconst clampUnit = (value: number) => Math.min(1, Math.max(0, value));\n\n/** Where the card is now, mid-flight included: the computed translate, in px. */\nfunction readOffset(el: HTMLElement): Point {\n const value = getComputedStyle(el).translate;\n if (!value || value === \"none\") return { x: 0, y: 0 };\n const [x, y] = value.split(\" \").map(parseFloat);\n return { x: x || 0, y: y || 0 };\n}\n\nfunction velocityOf(samples: { t: number; x: number; y: number }[], now: number): Point {\n const recent = samples.filter((sample) => now - sample.t <= 80);\n const first = recent[0];\n const last = recent[recent.length - 1];\n if (!first || !last || first === last || now - last.t > 60) return { x: 0, y: 0 };\n const seconds = (last.t - first.t) / 1000;\n return { x: (last.x - first.x) / seconds, y: (last.y - first.y) / seconds };\n}\n\nconst iconProps: SVGProps<SVGSVGElement> = {\n width: 16,\n height: 16,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 1.75,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n \"aria-hidden\": true,\n};\nconst CheckIcon = () => (\n <svg {...iconProps}>\n <path d=\"M5 12.5 10 17.5 19 7\" />\n </svg>\n);\nconst CloseIcon = () => (\n <svg {...iconProps}>\n <path d=\"M6 6l12 12M18 6 6 18\" />\n </svg>\n);\nconst UndoIcon = () => (\n <svg {...iconProps}>\n <path d=\"M4 12a8 8 0 1 0 2.5-5.8M4 4v4.5h4.5\" />\n </svg>\n);\n\n/**\n * A control that stays focusable when it has nothing to do: React Aria drops `aria-disabled` and a disabled button would\n * drop focus to the page when the stack runs out, so the attribute is set by hand and the press is guarded.\n */\nfunction Control({\n disabled,\n onPress,\n ...rest\n}: { disabled: boolean; onPress: () => void } & Omit<ButtonProps, \"onPress\" | \"isDisabled\">) {\n const ref = useRef<HTMLButtonElement>(null);\n useIsomorphicLayoutEffect(() => {\n if (disabled) ref.current?.setAttribute(\"aria-disabled\", \"true\");\n else ref.current?.removeAttribute(\"aria-disabled\");\n }, [disabled]);\n return (\n <Button\n {...rest}\n ref={ref}\n className=\"aria-disabled:cursor-default aria-disabled:opacity-40\"\n onPress={() => {\n if (!disabled) onPress();\n }}\n />\n );\n}\n\n/** Renders a custom empty state; the reset handler travels as a prop so render never touches the stack's refs. */\nfunction EmptySlot({\n render,\n onReset,\n}: {\n render: (reset: () => void) => ReactNode;\n onReset: () => void;\n}) {\n return <>{render(onReset)}</>;\n}\n\nconst HOME_TRANSITION = (delay: number) =>\n `translate var(--duration-smooth) var(--ease-smooth) ${delay}ms, rotate var(--duration-smooth) var(--ease-smooth) ${delay}ms, opacity var(--duration-quick) var(--ease-enter) ${delay}ms`;\nconst SPRING_BACK =\n \"translate var(--duration-morph) var(--ease-morph), rotate var(--duration-morph) var(--ease-morph)\";\nconst THROW =\n \"translate var(--duration-calm) var(--ease-calm), rotate var(--duration-calm) var(--ease-calm), opacity 220ms var(--ease-settle) 120ms\";\nconst REDUCED_FADE = \"opacity 150ms linear\";\n\ninterface CardProps {\n id: string;\n depth: number;\n decision: CardDecision | null;\n returnFrom?: Return;\n interactive: boolean;\n zIndex: number;\n label: string;\n labels: { left: string; right: string };\n stage: RefObject<HTMLDivElement | null>;\n fling: (id: string) => Point | undefined;\n onRelease: (id: string, offset: Point, velocity: Point, width: number) => boolean;\n onThrown: (id: string, exit: Exit) => void;\n onGone: (id: string) => void;\n children: ReactNode;\n}\n\nfunction StackCard({\n id,\n depth,\n decision,\n returnFrom,\n interactive,\n zIndex,\n label,\n labels,\n stage,\n fling,\n onRelease,\n onThrown,\n onGone,\n children,\n}: CardProps) {\n const card = useRef<HTMLDivElement>(null);\n // Grabbing the top half tips the card the way the hand moves; grabbing the bottom half tips it the other way.\n const tilt = useRef(returnFrom?.tilt ?? 1);\n const drag = useRef<{\n ox: number;\n oy: number;\n samples: { t: number; x: number; y: number }[];\n } | null>(null);\n const settled = useRef(!returnFrom);\n const wasDecided = useRef(false);\n\n const lift = (value: number) => stage.current?.style.setProperty(\"--lift\", String(value));\n /** Writes the card's place and what follows from it (its tilt and its stamps) straight to the DOM: a drag never re-renders. */\n const place = (el: HTMLElement, x: number, y: number) => {\n el.style.translate = `${x}px ${y}px`;\n el.style.rotate = `${x * ROTATE * tilt.current}deg`;\n el.style.setProperty(\"--keep\", String(clampUnit((x - STAMP_FROM) / (STAMP_TO - STAMP_FROM))));\n el.style.setProperty(\"--pass\", String(clampUnit((-STAMP_FROM - x) / (STAMP_TO - STAMP_FROM))));\n };\n\n // Leaving the stack (a decision) and coming back (undo, or start over) are the only things that move a card by themselves.\n useIsomorphicLayoutEffect(() => {\n const el = card.current;\n if (!el) return;\n const reduced = prefersReducedMotion();\n if (decision) {\n // A key or button can decide the card mid-drag; the throw takes over from the finger.\n drag.current = null;\n el.removeAttribute(\"data-dragging\");\n wasDecided.current = true;\n const direction = decision === \"right\" ? 1 : -1;\n const { x: cx, y: cy } = readOffset(el);\n // Buttons and keys throw with a default flick; a drag keeps the finger's velocity.\n const velocity = fling(id) ?? { x: direction * 900, y: -120 };\n const speed = Math.hypot(velocity.x, velocity.y);\n // Leave along the flick when it heads the chosen way, otherwise along the drag, otherwise straight out.\n let ux = velocity.x;\n let uy = velocity.y;\n if (speed < 200 || Math.sign(ux) !== direction) {\n ux = Math.abs(cx) > 8 ? cx : direction;\n uy = Math.abs(cx) > 8 ? cy * 0.5 : -0.12;\n }\n const length = Math.hypot(ux, uy) || 1;\n ux /= length;\n uy /= length;\n if (Math.abs(ux) < 0.45) {\n ux = direction * 0.45;\n uy = Math.sign(uy || -1) * Math.sqrt(1 - 0.45 * 0.45);\n }\n // Far enough to clear a typical preview or card column; the fade finishes before the spring does.\n const reach = el.offsetWidth * 1.6;\n const exit = { x: cx + ux * reach, y: cy + uy * reach, tilt: tilt.current };\n onThrown(id, exit);\n el.style.setProperty(direction > 0 ? \"--keep\" : \"--pass\", \"1\");\n if (reduced) {\n el.style.transition = REDUCED_FADE;\n } else {\n el.style.transition = THROW;\n place(el, exit.x, exit.y);\n }\n el.style.opacity = \"0\";\n return;\n }\n // Undo, or a first mount from where the card left: come back from there, catching any flight in progress.\n if (!wasDecided.current && settled.current) return;\n wasDecided.current = false;\n const delay = returnFrom?.delay ?? 0;\n if (!settled.current && !reduced && returnFrom) {\n el.style.transition = \"none\";\n place(el, returnFrom.x, returnFrom.y);\n el.style.opacity = \"0\";\n void el.offsetWidth;\n }\n settled.current = true;\n if (reduced) {\n el.style.transition = `${REDUCED_FADE} ${delay}ms`;\n place(el, 0, 0);\n } else {\n el.style.transition = HOME_TRANSITION(delay);\n place(el, 0, 0);\n }\n el.style.opacity = \"1\";\n // Only the decision drives this effect; the return position is read once at that moment.\n }, [decision]);\n\n const gone = useCallback(() => onGone(id), [onGone, id]);\n useExitBackstop(decision !== null, gone, FLIGHT_BACKSTOP_MS);\n\n function down(event: ReactPointerEvent<HTMLDivElement>) {\n if (!interactive || event.button !== 0 || !event.isPrimary) return;\n if (\n event.target instanceof Element &&\n event.target.closest(\"button, a, input, select, textarea, [role='button']\")\n )\n return;\n const el = event.currentTarget;\n // Freeze wherever the card is (it may be mid-way home), then follow the finger.\n const now = readOffset(el);\n el.style.transition = \"none\";\n if (Math.abs(now.x) < 2) {\n const rect = el.getBoundingClientRect();\n tilt.current = event.clientY < rect.top + rect.height / 2 ? 1 : -1;\n }\n place(el, now.x, now.y);\n drag.current = {\n ox: event.clientX - now.x,\n oy: event.clientY - unresistY(now.y),\n samples: [{ t: event.timeStamp, x: event.clientX, y: event.clientY }],\n };\n try {\n el.setPointerCapture(event.pointerId);\n } catch {\n // A pointer that is no longer active cannot be captured; the drag then follows the card only while the pointer is over it.\n }\n el.setAttribute(\"data-dragging\", \"\");\n }\n function move(event: ReactPointerEvent<HTMLDivElement>) {\n const state = drag.current;\n if (!state || !interactive) return;\n const x = event.clientX - state.ox;\n const y = resistY(event.clientY - state.oy);\n place(event.currentTarget, x, y);\n // The cards behind rise as this one is dragged away.\n lift(clampUnit(Math.hypot(x, y * 0.5) / LIFT_DISTANCE));\n state.samples.push({ t: event.timeStamp, x: event.clientX, y: event.clientY });\n if (state.samples.length > 12) state.samples.shift();\n }\n function up(event: ReactPointerEvent<HTMLDivElement>) {\n const state = drag.current;\n drag.current = null;\n const el = event.currentTarget;\n el.removeAttribute(\"data-dragging\");\n if (el.hasPointerCapture(event.pointerId)) el.releasePointerCapture(event.pointerId);\n if (!state || !interactive) return;\n const velocity =\n event.type === \"pointercancel\" ? { x: 0, y: 0 } : velocityOf(state.samples, event.timeStamp);\n const offset = readOffset(el);\n if (onRelease(id, offset, velocity, el.offsetWidth)) return;\n // Below the threshold the card springs home.\n el.style.transition = prefersReducedMotion() ? \"none\" : SPRING_BACK;\n place(el, 0, 0);\n lift(0);\n }\n\n return (\n <div\n className=\"card-stack-slot\"\n style={{ \"--depth\": depth, zIndex } as CSSProperties}\n aria-hidden={interactive ? undefined : true}\n ref={(node) => {\n if (!node) return;\n if (interactive) node.removeAttribute(\"inert\");\n else node.setAttribute(\"inert\", \"\");\n }}\n >\n <div\n ref={card}\n className=\"card-stack-card\"\n data-top={interactive ? \"\" : undefined}\n data-flying={decision ? \"\" : undefined}\n role={interactive ? \"group\" : undefined}\n aria-label={interactive ? label : undefined}\n onPointerDown={down}\n onPointerMove={move}\n onPointerUp={up}\n onPointerCancel={up}\n onTransitionEnd={(event) => {\n if (decision && event.target === event.currentTarget && event.propertyName === \"opacity\")\n gone();\n }}\n >\n <div className=\"card-stack-face\">\n {children}\n <span className=\"card-stack-shade\" aria-hidden=\"true\" />\n </div>\n <span className=\"card-stack-stamp\" data-side=\"right\" aria-hidden=\"true\">\n <CheckIcon />\n {labels.right}\n </span>\n <span className=\"card-stack-stamp\" data-side=\"left\" aria-hidden=\"true\">\n <CloseIcon />\n {labels.left}\n </span>\n </div>\n </div>\n );\n}\n\nexport function CardStack<T>({\n items,\n getKey,\n getLabel,\n renderCard,\n onDecide,\n onUndo,\n onReset,\n labels = { left: \"Pass\", right: \"Keep\" },\n outcomes,\n label = \"Cards\",\n renderEmpty,\n className,\n}: CardStackProps<T>) {\n const hintId = useId();\n const stage = useRef<HTMLDivElement>(null);\n const [position, setPosition] = useState(0);\n const [history, setHistory] = useState<{ key: string; decision: CardDecision }[]>([]);\n const [flying, setFlying] = useState<string[]>([]);\n const [returning, setReturning] = useState<Record<string, Return>>({});\n const [message, setMessage] = useState(\"\");\n // Where each thrown card left the screen, so undo and start over can bring it back from there. Only those handlers read it,\n // so it lives in a ref: recording an exit must not re-render the stack in the very frame the throw starts.\n const exits = useRef<Record<string, Exit>>({});\n const flings = useRef(new Map<string, Point>());\n const top = items[position];\n const remaining = Math.max(0, items.length - position);\n\n function decide(decision: CardDecision) {\n if (!top) return;\n const key = getKey(top);\n stage.current?.style.setProperty(\"--lift\", \"0\");\n setPosition(position + 1);\n setHistory([...history, { key, decision }]);\n setFlying((current) => [...current, key]);\n setReturning({});\n const left = remaining - 1;\n setMessage(\n `${getLabel(top)}${outcomes ? ` ${outcomes[decision]}` : `: ${labels[decision]}`}. ${left ? `${left} left.` : \"All cards reviewed.\"}`,\n );\n onDecide?.(top, decision);\n }\n\n function undo() {\n const last = history[history.length - 1];\n const item = last && items.find((entry) => getKey(entry) === last.key);\n if (!last || !item) return;\n const exit = exits.current[last.key];\n setPosition(position - 1);\n setHistory(history.slice(0, -1));\n setFlying((current) => current.filter((key) => key !== last.key));\n setReturning(exit ? { [last.key]: { ...exit, delay: 0 } } : {});\n setMessage(`${getLabel(item)} restored.`);\n onUndo?.(item, last.decision);\n }\n\n function reset() {\n if (!history.length) return;\n // The deck deals itself back: the card that will sit deepest returns first, the top card last.\n const count = Math.min(VISIBLE, items.length);\n const back: Record<string, Return> = {};\n items.slice(0, count).forEach((item, index) => {\n const key = getKey(item);\n const exit = exits.current[key];\n if (exit && index < position) back[key] = { ...exit, delay: (count - 1 - index) * 60 };\n });\n setPosition(0);\n setHistory([]);\n setFlying([]);\n setReturning(back);\n setMessage(\"All cards are back in the stack.\");\n onReset?.();\n }\n\n function release(key: string, offset: Point, velocity: Point, width: number) {\n const direction = Math.sign(offset.x);\n if (!direction || !top || getKey(top) !== key) return false;\n const flick =\n Math.abs(velocity.x) > FLICK &&\n Math.sign(velocity.x) === direction &&\n Math.abs(offset.x) > 12;\n const far =\n Math.abs(offset.x) > Math.min(width * 0.35, 140) &&\n !(Math.sign(velocity.x) === -direction && Math.abs(velocity.x) > 300);\n if (!flick && !far) return false;\n flings.current.set(key, velocity);\n decide(direction > 0 ? \"right\" : \"left\");\n return true;\n }\n\n function onKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n if (event.target !== event.currentTarget) return;\n if (event.key === \"ArrowLeft\" || event.key === \"ArrowRight\") {\n event.preventDefault();\n decide(event.key === \"ArrowRight\" ? \"right\" : \"left\");\n } else if (\n event.key === \"Backspace\" ||\n ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === \"z\")\n ) {\n event.preventDefault();\n undo();\n }\n }\n\n const decided = new Map(history.map((entry) => [entry.key, entry.decision]));\n const windowKeys = new Set(items.slice(position, position + VISIBLE).map(getKey));\n const rendered = items.filter(\n (item) => windowKeys.has(getKey(item)) || flying.includes(getKey(item)),\n );\n const empty = position >= items.length && flying.length === 0;\n const takeFling = useCallback((key: string) => {\n const velocity = flings.current.get(key);\n flings.current.delete(key);\n return velocity;\n }, []);\n const recordExit = useCallback((key: string, exit: Exit) => {\n exits.current[key] = exit;\n }, []);\n const finish = useCallback(\n (key: string) => setFlying((current) => current.filter((entry) => entry !== key)),\n [],\n );\n\n return (\n <div data-slot=\"card-stack\" className={cn(\"card-stack\", className)}>\n <div\n ref={stage}\n className=\"card-stack-stage\"\n // A keyboard widget: a focusable group is not allowed, an application is.\n role=\"application\"\n aria-roledescription=\"card stack\"\n aria-label={label}\n aria-describedby={hintId}\n tabIndex={0}\n onKeyDown={onKeyDown}\n >\n {rendered.map((item) => {\n const id = getKey(item);\n const index = items.indexOf(item);\n const decision = decided.get(id) ?? null;\n const depth = decision ? 0 : index - position;\n return (\n <StackCard\n key={id}\n id={id}\n depth={depth}\n decision={decision}\n returnFrom={returning[id]}\n interactive={!decision && depth === 0}\n zIndex={decision ? 20 + flying.indexOf(id) : VISIBLE - depth}\n label={`${getLabel(item)}, ${index + 1} of ${items.length}`}\n labels={labels}\n stage={stage}\n fling={takeFling}\n onRelease={release}\n onThrown={recordExit}\n onGone={finish}\n >\n {renderCard(item)}\n </StackCard>\n );\n })}\n {empty ? (\n <div className=\"card-stack-empty\">\n {renderEmpty ? (\n <EmptySlot render={renderEmpty} onReset={reset} />\n ) : (\n <>\n <p className=\"m-0 text-base font-medium\">All cards reviewed</p>\n <Button variant=\"outline\" onPress={reset} startIcon={<UndoIcon />}>\n Start over\n </Button>\n </>\n )}\n </div>\n ) : null}\n </div>\n <div className=\"flex flex-wrap justify-center gap-2\">\n {/* aria-disabled keeps focus on the button when the stack runs out, instead of dropping it to the page. */}\n <Control\n variant=\"outline\"\n disabled={!top}\n onPress={() => decide(\"left\")}\n startIcon={<CloseIcon />}\n >\n {labels.left}\n </Control>\n <Control variant=\"ghost\" disabled={!history.length} onPress={undo} startIcon={<UndoIcon />}>\n Undo\n </Control>\n <Control\n variant=\"primary\"\n disabled={!top}\n onPress={() => decide(\"right\")}\n startIcon={<CheckIcon />}\n >\n {labels.right}\n </Control>\n </div>\n <p id={hintId} className=\"sr-only\">\n Drag the top card, or use the left and right arrow keys to {labels.left.toLowerCase()} or{\" \"}\n {labels.right.toLowerCase()} it. Backspace undoes the last decision.\n </p>\n <p className=\"sr-only\" role=\"status\" aria-live=\"polite\">\n {message}\n </p>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { CardDecision, CardStack, CardStackProps } from "./card-stack.js";
2
+ export { type CardDecision, CardStack, type CardStackProps };
@@ -0,0 +1,2 @@
1
+ import { CardStack } from "./card-stack.js";
2
+ export { CardStack };
@@ -0,0 +1,56 @@
1
+ import { ReactNode } from "react";
2
+ //#region src/carousel/carousel.d.ts
3
+ /**
4
+ * Carousel: a row of slides people browse by swiping, a trackpad, dragging
5
+ * with a mouse, the arrow keys, or the controls below it. Use it for a short,
6
+ * ordered set of peers such as products or case studies, where the neighbours
7
+ * stay in view as a hint that there is more.
8
+ *
9
+ * The slides sit on a native scroll-snap track, so touch and trackpad swipes
10
+ * are the browser's own. The active slide is centred; its neighbours shrink and
11
+ * dim with their distance, and each page indicator stretches into a pill as the
12
+ * track nears its slide, all written straight from the scroll position without a
13
+ * re-render. A mouse can drag the track, and a flick carries on to the next
14
+ * slide. Arrow keys, Home and End move between slides from the track or the
15
+ * indicators. `interval` adds a play control that rotates through the slides;
16
+ * rotation pauses on hover, keyboard focus and touch, while the carousel is off
17
+ * screen or the tab is hidden, and is unavailable under reduced motion (where
18
+ * scrolling also jumps instead of gliding).
19
+ */
20
+ export interface CarouselProps {
21
+ /** Names the carousel for assistive technology, such as "From the Harbour suites". */
22
+ label: string;
23
+ /** One child per slide. */
24
+ children: ReactNode;
25
+ /** Controlled active slide. Pair with `onIndexChange`. */
26
+ index?: number;
27
+ /** @default 0 */
28
+ defaultIndex?: number;
29
+ onIndexChange?: (index: number) => void;
30
+ /** Width of one slide as a CSS length; `cqw` is a share of the carousel's width. @default "min(80cqw, 340px)" */
31
+ slideSize?: string;
32
+ /** Names each slide and its indicator. @default (index, count) => `${index + 1} of ${count}` */
33
+ slideLabel?: (index: number, count: number) => string;
34
+ /** Milliseconds per slide. Adds a play control that rotates through the slides. */
35
+ interval?: number;
36
+ /** Starts rotating on mount. Off by default, so motion begins with the viewer. @default false */
37
+ autoplay?: boolean;
38
+ /** Names of the controls, for translation. */
39
+ labels?: {
40
+ /** @default "Previous slide" */
41
+ previous?: string;
42
+ /** @default "Next slide" */
43
+ next?: string;
44
+ /** @default "Start slide rotation" */
45
+ play?: string;
46
+ /** @default "Pause slide rotation" */
47
+ pause?: string;
48
+ /** Names the group of indicators. @default "Choose a slide" */
49
+ slides?: string;
50
+ };
51
+ /** Extra classes for the carousel. Merged last. */
52
+ className?: string;
53
+ }
54
+ export declare const Carousel: import("react").ForwardRefExoticComponent<CarouselProps & import("react").RefAttributes<HTMLElement>>;
55
+ //#endregion
56
+ //# sourceMappingURL=carousel.d.ts.map
@@ -0,0 +1,389 @@
1
+ "use client";
2
+ import { cn } from "../lib/cn.js";
3
+ import { mergeRefs } from "../lib/merge-refs.js";
4
+ import { useIsomorphicLayoutEffect, useReducedMotion } from "../lib/motion.js";
5
+ import { Children, forwardRef, isValidElement, useCallback, useEffect, useId, useMemo, useRef, useState } from "react";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+ //#region src/carousel/carousel.tsx
8
+ /** Movement before a mouse press is read as a drag. */
9
+ const SLOP = 6;
10
+ /** Release speed in px/s that always moves at least one slide. */
11
+ const FLICK = 360;
12
+ /** Where a flick would come to rest: velocity (px/s) projected with a paging deceleration rate. */
13
+ const project = (velocity, rate = .995) => velocity / 1e3 * rate / (1 - rate);
14
+ const clamp = (value, min, max) => Math.min(max, Math.max(min, value));
15
+ const defaultSlideLabel = (index, count) => `${index + 1} of ${count}`;
16
+ const PlayGlyph = () => /* @__PURE__ */ jsx("svg", {
17
+ width: 15,
18
+ height: 15,
19
+ viewBox: "0 0 16 16",
20
+ fill: "currentColor",
21
+ "aria-hidden": "true",
22
+ children: /* @__PURE__ */ jsx("path", { d: "M4.5 2.8v10.4a.6.6 0 0 0 .9.5l8.2-5.2a.6.6 0 0 0 0-1L5.4 2.3a.6.6 0 0 0-.9.5Z" })
23
+ });
24
+ const PauseGlyph = () => /* @__PURE__ */ jsxs("svg", {
25
+ width: 15,
26
+ height: 15,
27
+ viewBox: "0 0 16 16",
28
+ fill: "currentColor",
29
+ "aria-hidden": "true",
30
+ children: [/* @__PURE__ */ jsx("rect", {
31
+ x: "3.5",
32
+ y: "2.5",
33
+ width: "3.2",
34
+ height: "11",
35
+ rx: "1"
36
+ }), /* @__PURE__ */ jsx("rect", {
37
+ x: "9.3",
38
+ y: "2.5",
39
+ width: "3.2",
40
+ height: "11",
41
+ rx: "1"
42
+ })]
43
+ });
44
+ const Chevron = ({ back }) => /* @__PURE__ */ jsx("svg", {
45
+ width: 18,
46
+ height: 18,
47
+ viewBox: "0 0 16 16",
48
+ fill: "none",
49
+ stroke: "currentColor",
50
+ strokeWidth: 1.75,
51
+ strokeLinecap: "round",
52
+ strokeLinejoin: "round",
53
+ "aria-hidden": "true",
54
+ children: /* @__PURE__ */ jsx("path", { d: back ? "M10 3.5 5.5 8l4.5 4.5" : "M6 3.5 10.5 8 6 12.5" })
55
+ });
56
+ const Carousel = forwardRef(function Carousel({ label, children, index: controlledIndex, defaultIndex = 0, onIndexChange, slideSize, slideLabel = defaultSlideLabel, interval, autoplay = false, labels, className }, ref) {
57
+ const slides = Children.toArray(children);
58
+ const count = slides.length;
59
+ const last = Math.max(0, count - 1);
60
+ const id = useId();
61
+ const reduced = useReducedMotion();
62
+ const [ownIndex, setOwnIndex] = useState(() => clamp(defaultIndex, 0, last));
63
+ const index = clamp(controlledIndex ?? ownIndex, 0, last);
64
+ const [playing, setPlaying] = useState(autoplay);
65
+ const [hovered, setHovered] = useState(false);
66
+ const [touching, setTouching] = useState(false);
67
+ const [focusPaused, setFocusPaused] = useState(false);
68
+ const [inView, setInView] = useState(true);
69
+ const [pageVisible, setPageVisible] = useState(true);
70
+ const [announcement, setAnnouncement] = useState("");
71
+ const root = useRef(null);
72
+ const rootRef = useMemo(() => mergeRefs(ref, root), [ref]);
73
+ const viewport = useRef(null);
74
+ const track = useRef(null);
75
+ const play = useRef(null);
76
+ const tabs = useRef([]);
77
+ const target = useRef(index);
78
+ const travelling = useRef(null);
79
+ const backstop = useRef(void 0);
80
+ const drag = useRef(null);
81
+ const swallowClick = useRef(false);
82
+ const canRotate = Boolean(interval) && count > 1 && !reduced;
83
+ const running = canRotate && playing && !hovered && !touching && !focusPaused && inView && pageVisible;
84
+ const step = () => {
85
+ const [first, second] = Array.from(track.current?.children ?? []);
86
+ return first && second ? second.offsetLeft - first.offsetLeft : first?.offsetWidth ?? 0;
87
+ };
88
+ /** The scroll position that centres slide `i`. */
89
+ const leftOf = (i) => {
90
+ const node = track.current?.children[i];
91
+ const box = viewport.current;
92
+ return node && box ? node.offsetLeft - (box.clientWidth - node.offsetWidth) / 2 : 0;
93
+ };
94
+ /** Writes how far each slide and indicator is from the centre, straight from the scroll position. Returns the position in slides. */
95
+ const paint = useCallback(() => {
96
+ const box = viewport.current;
97
+ const size = step();
98
+ if (!box || !size) return target.current;
99
+ const position = box.scrollLeft / size;
100
+ Array.from(track.current?.children ?? []).forEach((slide, i) => {
101
+ slide.style.setProperty("--d", String(Math.min(1, Math.abs(position - i))));
102
+ });
103
+ tabs.current.forEach((tab, i) => {
104
+ const dot = tab?.firstElementChild;
105
+ if (dot instanceof HTMLElement) dot.style.setProperty("--e", String(Math.max(0, 1 - Math.abs(clamp(position, 0, last) - i))));
106
+ });
107
+ return position;
108
+ }, [last]);
109
+ function scrollToIndex(i, smooth) {
110
+ const box = viewport.current;
111
+ if (!box) return;
112
+ const left = leftOf(i);
113
+ if (!smooth || reduced || Math.abs(box.scrollLeft - left) < 1) {
114
+ travelling.current = null;
115
+ box.scrollTo({
116
+ left,
117
+ behavior: "auto"
118
+ });
119
+ paint();
120
+ return;
121
+ }
122
+ travelling.current = i;
123
+ clearTimeout(backstop.current);
124
+ backstop.current = setTimeout(() => travelling.current = null, 1e3);
125
+ box.scrollTo({
126
+ left,
127
+ behavior: "smooth"
128
+ });
129
+ }
130
+ function commit(next, announce) {
131
+ target.current = next;
132
+ if (controlledIndex === void 0) setOwnIndex(next);
133
+ onIndexChange?.(next);
134
+ if (announce) setAnnouncement(slideLabel(next, count));
135
+ }
136
+ function select(to, announce = true) {
137
+ const next = clamp(to, 0, last);
138
+ if (next !== target.current) commit(next, announce);
139
+ scrollToIndex(next, true);
140
+ }
141
+ useIsomorphicLayoutEffect(() => {
142
+ scrollToIndex(target.current, false);
143
+ const box = viewport.current;
144
+ if (!box || typeof ResizeObserver === "undefined") return;
145
+ const observer = new ResizeObserver(() => {
146
+ if (!drag.current && travelling.current === null) scrollToIndex(target.current, false);
147
+ });
148
+ observer.observe(box);
149
+ return () => observer.disconnect();
150
+ }, []);
151
+ useIsomorphicLayoutEffect(() => {
152
+ Array.from(track.current?.children ?? []).forEach((slide, i) => slide.toggleAttribute("inert", i !== index));
153
+ }, [index, count]);
154
+ useEffect(() => {
155
+ if (target.current !== index) {
156
+ target.current = index;
157
+ scrollToIndex(index, true);
158
+ }
159
+ }, [index]);
160
+ useEffect(() => () => clearTimeout(backstop.current), []);
161
+ function onScroll() {
162
+ const position = paint();
163
+ const box = viewport.current;
164
+ if (!box || drag.current?.locked) return;
165
+ if (travelling.current !== null) {
166
+ if (Math.abs(box.scrollLeft - leftOf(travelling.current)) < 2) travelling.current = null;
167
+ return;
168
+ }
169
+ const next = clamp(Math.round(position), 0, last);
170
+ if (next !== target.current) commit(next, true);
171
+ }
172
+ const advance = () => select(index >= last ? 0 : index + 1, false);
173
+ useEffect(() => {
174
+ const node = root.current;
175
+ if (!interval || !node) return;
176
+ const observer = typeof IntersectionObserver === "undefined" ? null : new IntersectionObserver(([entry]) => entry && setInView(entry.isIntersecting));
177
+ observer?.observe(node);
178
+ const onVisibility = () => setPageVisible(document.visibilityState !== "hidden");
179
+ document.addEventListener("visibilitychange", onVisibility);
180
+ return () => {
181
+ observer?.disconnect();
182
+ document.removeEventListener("visibilitychange", onVisibility);
183
+ };
184
+ }, [interval]);
185
+ function onPointerDown(event) {
186
+ if (count < 2 || drag.current || event.pointerType !== "mouse" || event.button !== 0) return;
187
+ swallowClick.current = false;
188
+ drag.current = {
189
+ pointer: event.pointerId,
190
+ startX: event.clientX,
191
+ startLeft: event.currentTarget.scrollLeft,
192
+ from: target.current,
193
+ locked: false,
194
+ samples: []
195
+ };
196
+ }
197
+ function onPointerMove(event) {
198
+ const current = drag.current;
199
+ if (!current || current.pointer !== event.pointerId) return;
200
+ const box = event.currentTarget;
201
+ if (!current.locked) {
202
+ if (Math.abs(event.clientX - current.startX) < SLOP) return;
203
+ current.locked = true;
204
+ current.startX = event.clientX;
205
+ travelling.current = null;
206
+ try {
207
+ box.setPointerCapture(event.pointerId);
208
+ } catch {}
209
+ box.dataset.dragging = "";
210
+ }
211
+ box.scrollLeft = current.startLeft - (event.clientX - current.startX);
212
+ current.samples.push([event.timeStamp, box.scrollLeft]);
213
+ if (current.samples.length > 16) current.samples.shift();
214
+ }
215
+ function finish(event, cancelled) {
216
+ const current = drag.current;
217
+ if (!current || current.pointer !== event.pointerId) return;
218
+ drag.current = null;
219
+ if (!current.locked) return;
220
+ const box = event.currentTarget;
221
+ delete box.dataset.dragging;
222
+ swallowClick.current = true;
223
+ const recent = current.samples.filter(([time]) => event.timeStamp - time <= 90);
224
+ const first = recent[0];
225
+ const lastSample = recent[recent.length - 1];
226
+ const velocity = !cancelled && first && lastSample && recent.length > 1 && event.timeStamp - lastSample[0] <= 50 && lastSample[0] > first[0] ? (lastSample[1] - first[1]) / (lastSample[0] - first[0]) * 1e3 : 0;
227
+ const size = step() || 1;
228
+ let to = Math.round((box.scrollLeft + project(velocity)) / size);
229
+ if (Math.abs(velocity) > FLICK) {
230
+ const direction = velocity > 0 ? 1 : -1;
231
+ if ((to - current.from) * direction < 1) to = current.from + direction;
232
+ }
233
+ select(to);
234
+ }
235
+ /** A tap on a neighbour brings it to the centre; a click that ends a drag is not a tap. */
236
+ function onClick(event) {
237
+ if (swallowClick.current) {
238
+ swallowClick.current = false;
239
+ event.preventDefault();
240
+ event.stopPropagation();
241
+ return;
242
+ }
243
+ const hit = Array.from(track.current?.children ?? []).findIndex((slide) => {
244
+ const rect = slide.getBoundingClientRect();
245
+ return event.clientX >= rect.left && event.clientX <= rect.right;
246
+ });
247
+ if (hit >= 0 && hit !== target.current) select(hit);
248
+ }
249
+ function onKeyDown(event) {
250
+ if (event.altKey || event.ctrlKey || event.metaKey || count < 2) return;
251
+ const node = event.target;
252
+ if (node.closest("input, textarea, select, [contenteditable]")) return;
253
+ const from = target.current;
254
+ const to = event.key === "ArrowLeft" ? from - 1 : event.key === "ArrowRight" ? from + 1 : event.key === "Home" ? 0 : event.key === "End" ? last : null;
255
+ if (to === null) return;
256
+ event.preventDefault();
257
+ const next = clamp(to, 0, last);
258
+ select(next);
259
+ if (node.getAttribute("role") === "tab") tabs.current[next]?.focus({ preventScroll: true });
260
+ else if (track.current?.contains(node)) viewport.current?.focus({ preventScroll: true });
261
+ }
262
+ const text = {
263
+ previous: "Previous slide",
264
+ next: "Next slide",
265
+ play: "Start slide rotation",
266
+ pause: "Pause slide rotation",
267
+ slides: "Choose a slide",
268
+ ...labels
269
+ };
270
+ return /* @__PURE__ */ jsxs("section", {
271
+ ref: rootRef,
272
+ "data-slot": "carousel",
273
+ "aria-roledescription": "carousel",
274
+ "aria-label": label,
275
+ className: cn("carousel", className),
276
+ style: slideSize ? { "--carousel-slide-size": slideSize } : void 0,
277
+ onKeyDown,
278
+ onFocus: (event) => setFocusPaused(event.target !== play.current && event.target.matches(":focus-visible")),
279
+ onBlur: (event) => {
280
+ if (!event.currentTarget.contains(event.relatedTarget)) setFocusPaused(false);
281
+ },
282
+ children: [
283
+ /* @__PURE__ */ jsx("div", {
284
+ ref: viewport,
285
+ role: "region",
286
+ "aria-label": "Slides",
287
+ tabIndex: 0,
288
+ "data-slot": "carousel-viewport",
289
+ className: "carousel-viewport",
290
+ onScroll,
291
+ onPointerDown,
292
+ onPointerMove,
293
+ onPointerUp: (event) => finish(event, false),
294
+ onPointerCancel: (event) => finish(event, true),
295
+ onPointerEnter: (event) => event.pointerType === "mouse" && setHovered(true),
296
+ onPointerLeave: () => setHovered(false),
297
+ onTouchStart: () => setTouching(true),
298
+ onTouchEnd: () => setTouching(false),
299
+ onTouchCancel: () => setTouching(false),
300
+ onClickCapture: onClick,
301
+ onDragStart: (event) => event.preventDefault(),
302
+ children: /* @__PURE__ */ jsx("div", {
303
+ ref: track,
304
+ className: "carousel-track",
305
+ children: slides.map((slide, i) => /* @__PURE__ */ jsx("div", {
306
+ id: `${id}-slide-${i}`,
307
+ role: "tabpanel",
308
+ "aria-roledescription": "slide",
309
+ "aria-label": slideLabel(i, count),
310
+ "data-active": i === index || void 0,
311
+ className: "carousel-slide",
312
+ children: slide
313
+ }, isValidElement(slide) && slide.key != null ? slide.key : i))
314
+ })
315
+ }),
316
+ count > 1 ? /* @__PURE__ */ jsxs("div", {
317
+ className: "carousel-controls",
318
+ children: [
319
+ canRotate ? /* @__PURE__ */ jsx("button", {
320
+ ref: play,
321
+ type: "button",
322
+ "aria-label": playing ? text.pause : text.play,
323
+ className: "carousel-control",
324
+ onClick: () => setPlaying(!playing),
325
+ children: playing ? /* @__PURE__ */ jsx(PauseGlyph, {}) : /* @__PURE__ */ jsx(PlayGlyph, {})
326
+ }) : null,
327
+ /* @__PURE__ */ jsx("div", {
328
+ role: "tablist",
329
+ "aria-label": text.slides,
330
+ className: "carousel-tabs",
331
+ children: slides.map((_, i) => /* @__PURE__ */ jsx("button", {
332
+ ref: (node) => {
333
+ tabs.current[i] = node;
334
+ },
335
+ type: "button",
336
+ role: "tab",
337
+ "aria-selected": i === index,
338
+ "aria-controls": `${id}-slide-${i}`,
339
+ "aria-label": slideLabel(i, count),
340
+ tabIndex: i === index ? 0 : -1,
341
+ className: "carousel-tab",
342
+ onClick: () => select(i),
343
+ children: /* @__PURE__ */ jsxs("span", {
344
+ "aria-hidden": "true",
345
+ className: "carousel-dot",
346
+ children: [/* @__PURE__ */ jsx("span", { className: "carousel-dot-fill" }), canRotate && playing && i === index ? /* @__PURE__ */ jsx("span", {
347
+ className: "carousel-drain",
348
+ style: {
349
+ animationDuration: `${interval}ms`,
350
+ animationPlayState: running ? "running" : "paused"
351
+ },
352
+ onAnimationEnd: advance
353
+ }, index) : null]
354
+ })
355
+ }, i))
356
+ }),
357
+ /* @__PURE__ */ jsxs("div", {
358
+ className: "carousel-arrows",
359
+ children: [/* @__PURE__ */ jsx("button", {
360
+ type: "button",
361
+ "aria-label": text.previous,
362
+ "aria-disabled": index === 0,
363
+ className: "carousel-control",
364
+ onClick: () => target.current > 0 && select(target.current - 1),
365
+ children: /* @__PURE__ */ jsx(Chevron, { back: true })
366
+ }), /* @__PURE__ */ jsx("button", {
367
+ type: "button",
368
+ "aria-label": text.next,
369
+ "aria-disabled": index === last,
370
+ className: "carousel-control",
371
+ onClick: () => target.current < last && select(target.current + 1),
372
+ children: /* @__PURE__ */ jsx(Chevron, {})
373
+ })]
374
+ })
375
+ ]
376
+ }) : null,
377
+ /* @__PURE__ */ jsx("span", {
378
+ className: "sr-only",
379
+ "aria-live": "polite",
380
+ "aria-atomic": "true",
381
+ children: announcement
382
+ })
383
+ ]
384
+ });
385
+ });
386
+ //#endregion
387
+ export { Carousel };
388
+
389
+ //# sourceMappingURL=carousel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"carousel.js","names":[],"sources":["../../src/carousel/carousel.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n Children,\n forwardRef,\n isValidElement,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type KeyboardEvent,\n type MouseEvent,\n type PointerEvent,\n type ReactNode,\n} from \"react\";\n\nimport { cn } from \"../lib/cn.js\";\nimport { mergeRefs } from \"../lib/merge-refs.js\";\nimport { useIsomorphicLayoutEffect, useReducedMotion } from \"../lib/motion.js\";\n\n/**\n * Carousel: a row of slides people browse by swiping, a trackpad, dragging\n * with a mouse, the arrow keys, or the controls below it. Use it for a short,\n * ordered set of peers such as products or case studies, where the neighbours\n * stay in view as a hint that there is more.\n *\n * The slides sit on a native scroll-snap track, so touch and trackpad swipes\n * are the browser's own. The active slide is centred; its neighbours shrink and\n * dim with their distance, and each page indicator stretches into a pill as the\n * track nears its slide, all written straight from the scroll position without a\n * re-render. A mouse can drag the track, and a flick carries on to the next\n * slide. Arrow keys, Home and End move between slides from the track or the\n * indicators. `interval` adds a play control that rotates through the slides;\n * rotation pauses on hover, keyboard focus and touch, while the carousel is off\n * screen or the tab is hidden, and is unavailable under reduced motion (where\n * scrolling also jumps instead of gliding).\n */\nexport interface CarouselProps {\n /** Names the carousel for assistive technology, such as \"From the Harbour suites\". */\n label: string;\n /** One child per slide. */\n children: ReactNode;\n /** Controlled active slide. Pair with `onIndexChange`. */\n index?: number;\n /** @default 0 */\n defaultIndex?: number;\n onIndexChange?: (index: number) => void;\n /** Width of one slide as a CSS length; `cqw` is a share of the carousel's width. @default \"min(80cqw, 340px)\" */\n slideSize?: string;\n /** Names each slide and its indicator. @default (index, count) => `${index + 1} of ${count}` */\n slideLabel?: (index: number, count: number) => string;\n /** Milliseconds per slide. Adds a play control that rotates through the slides. */\n interval?: number;\n /** Starts rotating on mount. Off by default, so motion begins with the viewer. @default false */\n autoplay?: boolean;\n /** Names of the controls, for translation. */\n labels?: {\n /** @default \"Previous slide\" */\n previous?: string;\n /** @default \"Next slide\" */\n next?: string;\n /** @default \"Start slide rotation\" */\n play?: string;\n /** @default \"Pause slide rotation\" */\n pause?: string;\n /** Names the group of indicators. @default \"Choose a slide\" */\n slides?: string;\n };\n /** Extra classes for the carousel. Merged last. */\n className?: string;\n}\n\n/** Movement before a mouse press is read as a drag. */\nconst SLOP = 6;\n/** Release speed in px/s that always moves at least one slide. */\nconst FLICK = 360;\n/** Where a flick would come to rest: velocity (px/s) projected with a paging deceleration rate. */\nconst project = (velocity: number, rate = 0.995) => ((velocity / 1000) * rate) / (1 - rate);\nconst clamp = (value: number, min: number, max: number) => Math.min(max, Math.max(min, value));\nconst defaultSlideLabel = (index: number, count: number) => `${index + 1} of ${count}`;\n\nconst PlayGlyph = () => (\n <svg width={15} height={15} viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M4.5 2.8v10.4a.6.6 0 0 0 .9.5l8.2-5.2a.6.6 0 0 0 0-1L5.4 2.3a.6.6 0 0 0-.9.5Z\" />\n </svg>\n);\nconst PauseGlyph = () => (\n <svg width={15} height={15} viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n <rect x=\"3.5\" y=\"2.5\" width=\"3.2\" height=\"11\" rx=\"1\" />\n <rect x=\"9.3\" y=\"2.5\" width=\"3.2\" height=\"11\" rx=\"1\" />\n </svg>\n);\nconst Chevron = ({ back }: { back?: boolean }) => (\n <svg width={18} height={18} viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.75} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d={back ? \"M10 3.5 5.5 8l4.5 4.5\" : \"M6 3.5 10.5 8 6 12.5\"} />\n </svg>\n);\n\ntype Drag = { pointer: number; startX: number; startLeft: number; from: number; locked: boolean; samples: [number, number][] };\n\nexport const Carousel = forwardRef<HTMLElement, CarouselProps>(function Carousel(\n {\n label,\n children,\n index: controlledIndex,\n defaultIndex = 0,\n onIndexChange,\n slideSize,\n slideLabel = defaultSlideLabel,\n interval,\n autoplay = false,\n labels,\n className,\n },\n ref,\n) {\n const slides = Children.toArray(children);\n const count = slides.length;\n const last = Math.max(0, count - 1);\n const id = useId();\n const reduced = useReducedMotion();\n const [ownIndex, setOwnIndex] = useState(() => clamp(defaultIndex, 0, last));\n const index = clamp(controlledIndex ?? ownIndex, 0, last);\n const [playing, setPlaying] = useState(autoplay);\n const [hovered, setHovered] = useState(false);\n const [touching, setTouching] = useState(false);\n const [focusPaused, setFocusPaused] = useState(false);\n const [inView, setInView] = useState(true);\n const [pageVisible, setPageVisible] = useState(true);\n const [announcement, setAnnouncement] = useState(\"\");\n\n const root = useRef<HTMLElement | null>(null);\n const rootRef = useMemo(() => mergeRefs(ref, root), [ref]);\n const viewport = useRef<HTMLDivElement>(null);\n const track = useRef<HTMLDivElement>(null);\n const play = useRef<HTMLButtonElement>(null);\n const tabs = useRef<(HTMLButtonElement | null)[]>([]);\n // The slide the carousel is on, as the component last decided it (state lags a render behind).\n const target = useRef(index);\n // Set while a scroll we started is in flight, so the in-between slides are not reported as the viewer's choice.\n const travelling = useRef<number | null>(null);\n const backstop = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const drag = useRef<Drag | null>(null);\n const swallowClick = useRef(false);\n\n const canRotate = Boolean(interval) && count > 1 && !reduced;\n const running = canRotate && playing && !hovered && !touching && !focusPaused && inView && pageVisible;\n\n const step = () => {\n const [first, second] = Array.from(track.current?.children ?? []) as HTMLElement[];\n return first && second ? second.offsetLeft - first.offsetLeft : (first?.offsetWidth ?? 0);\n };\n /** The scroll position that centres slide `i`. */\n const leftOf = (i: number) => {\n const node = track.current?.children[i] as HTMLElement | undefined;\n const box = viewport.current;\n return node && box ? node.offsetLeft - (box.clientWidth - node.offsetWidth) / 2 : 0;\n };\n\n /** Writes how far each slide and indicator is from the centre, straight from the scroll position. Returns the position in slides. */\n const paint = useCallback(() => {\n const box = viewport.current;\n const size = step();\n if (!box || !size) return target.current;\n const position = box.scrollLeft / size;\n Array.from(track.current?.children ?? []).forEach((slide, i) => {\n (slide as HTMLElement).style.setProperty(\"--d\", String(Math.min(1, Math.abs(position - i))));\n });\n tabs.current.forEach((tab, i) => {\n const dot = tab?.firstElementChild;\n if (dot instanceof HTMLElement) dot.style.setProperty(\"--e\", String(Math.max(0, 1 - Math.abs(clamp(position, 0, last) - i))));\n });\n return position;\n }, [last]);\n\n function scrollToIndex(i: number, smooth: boolean) {\n const box = viewport.current;\n if (!box) return;\n const left = leftOf(i);\n if (!smooth || reduced || Math.abs(box.scrollLeft - left) < 1) {\n travelling.current = null;\n box.scrollTo({ left, behavior: \"auto\" });\n paint();\n return;\n }\n travelling.current = i;\n clearTimeout(backstop.current);\n // A scroll that never reports arriving (a resize mid-flight) must not hold the carousel deaf to the viewer's own swipes.\n backstop.current = setTimeout(() => (travelling.current = null), 1000);\n box.scrollTo({ left, behavior: \"smooth\" });\n }\n\n function commit(next: number, announce: boolean) {\n target.current = next;\n if (controlledIndex === undefined) setOwnIndex(next);\n onIndexChange?.(next);\n if (announce) setAnnouncement(slideLabel(next, count));\n }\n\n function select(to: number, announce = true) {\n const next = clamp(to, 0, last);\n if (next !== target.current) commit(next, announce);\n scrollToIndex(next, true);\n }\n\n // The start slide is in place before first paint, so nothing glides on mount; later resizes keep the carousel on its slide.\n useIsomorphicLayoutEffect(() => {\n scrollToIndex(target.current, false);\n const box = viewport.current;\n if (!box || typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(() => {\n if (!drag.current && travelling.current === null) scrollToIndex(target.current, false);\n });\n observer.observe(box);\n return () => observer.disconnect();\n }, []);\n\n // The viewer's own slides, inert unless active, are the only ones in the tab order or the accessibility tree's reach.\n useIsomorphicLayoutEffect(() => {\n Array.from(track.current?.children ?? []).forEach((slide, i) => slide.toggleAttribute(\"inert\", i !== index));\n }, [index, count]);\n\n // A controlled index that moves by itself brings the carousel along.\n useEffect(() => {\n if (target.current !== index) {\n target.current = index;\n scrollToIndex(index, true);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps -- only a changed index matters\n }, [index]);\n\n useEffect(() => () => clearTimeout(backstop.current), []);\n\n function onScroll() {\n const position = paint();\n const box = viewport.current;\n if (!box || drag.current?.locked) return;\n if (travelling.current !== null) {\n if (Math.abs(box.scrollLeft - leftOf(travelling.current)) < 2) travelling.current = null;\n return;\n }\n const next = clamp(Math.round(position), 0, last);\n if (next !== target.current) commit(next, true);\n }\n\n const advance = () => select(index >= last ? 0 : index + 1, false);\n\n useEffect(() => {\n const node = root.current;\n if (!interval || !node) return;\n const observer = typeof IntersectionObserver === \"undefined\" ? null : new IntersectionObserver(([entry]) => entry && setInView(entry.isIntersecting));\n observer?.observe(node);\n const onVisibility = () => setPageVisible(document.visibilityState !== \"hidden\");\n document.addEventListener(\"visibilitychange\", onVisibility);\n return () => {\n observer?.disconnect();\n document.removeEventListener(\"visibilitychange\", onVisibility);\n };\n }, [interval]);\n\n function onPointerDown(event: PointerEvent<HTMLDivElement>) {\n if (count < 2 || drag.current || event.pointerType !== \"mouse\" || event.button !== 0) return;\n swallowClick.current = false;\n drag.current = { pointer: event.pointerId, startX: event.clientX, startLeft: event.currentTarget.scrollLeft, from: target.current, locked: false, samples: [] };\n }\n\n function onPointerMove(event: PointerEvent<HTMLDivElement>) {\n const current = drag.current;\n if (!current || current.pointer !== event.pointerId) return;\n const box = event.currentTarget;\n if (!current.locked) {\n if (Math.abs(event.clientX - current.startX) < SLOP) return;\n // The slop is consumed, so the track starts moving from the pointer without a jump. Snapping is off while it is held.\n current.locked = true;\n current.startX = event.clientX;\n travelling.current = null;\n try {\n box.setPointerCapture(event.pointerId);\n } catch {\n // The pointer already ended; the drag simply stops following it.\n }\n box.dataset.dragging = \"\";\n }\n box.scrollLeft = current.startLeft - (event.clientX - current.startX);\n current.samples.push([event.timeStamp, box.scrollLeft]);\n if (current.samples.length > 16) current.samples.shift();\n }\n\n function finish(event: PointerEvent<HTMLDivElement>, cancelled: boolean) {\n const current = drag.current;\n if (!current || current.pointer !== event.pointerId) return;\n drag.current = null;\n if (!current.locked) return;\n const box = event.currentTarget;\n delete box.dataset.dragging;\n swallowClick.current = true;\n const recent = current.samples.filter(([time]) => event.timeStamp - time <= 90);\n const first = recent[0];\n const lastSample = recent[recent.length - 1];\n const velocity =\n !cancelled && first && lastSample && recent.length > 1 && event.timeStamp - lastSample[0] <= 50 && lastSample[0] > first[0]\n ? ((lastSample[1] - first[1]) / (lastSample[0] - first[0])) * 1000\n : 0;\n const size = step() || 1;\n // The landing slide comes from where the flick would carry the track, not from where the pointer let go.\n let to = Math.round((box.scrollLeft + project(velocity)) / size);\n if (Math.abs(velocity) > FLICK) {\n const direction = velocity > 0 ? 1 : -1;\n if ((to - current.from) * direction < 1) to = current.from + direction;\n }\n select(to);\n }\n\n /** A tap on a neighbour brings it to the centre; a click that ends a drag is not a tap. */\n function onClick(event: MouseEvent<HTMLDivElement>) {\n if (swallowClick.current) {\n swallowClick.current = false;\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n const hit = Array.from(track.current?.children ?? []).findIndex((slide) => {\n const rect = slide.getBoundingClientRect();\n return event.clientX >= rect.left && event.clientX <= rect.right;\n });\n if (hit >= 0 && hit !== target.current) select(hit);\n }\n\n function onKeyDown(event: KeyboardEvent<HTMLElement>) {\n if (event.altKey || event.ctrlKey || event.metaKey || count < 2) return;\n const node = event.target as HTMLElement;\n if (node.closest(\"input, textarea, select, [contenteditable]\")) return;\n const from = target.current;\n const to =\n event.key === \"ArrowLeft\" ? from - 1 : event.key === \"ArrowRight\" ? from + 1 : event.key === \"Home\" ? 0 : event.key === \"End\" ? last : null;\n if (to === null) return;\n event.preventDefault();\n const next = clamp(to, 0, last);\n select(next);\n if (node.getAttribute(\"role\") === \"tab\") tabs.current[next]?.focus({ preventScroll: true });\n else if (track.current?.contains(node)) viewport.current?.focus({ preventScroll: true });\n }\n\n const text = { previous: \"Previous slide\", next: \"Next slide\", play: \"Start slide rotation\", pause: \"Pause slide rotation\", slides: \"Choose a slide\", ...labels };\n\n return (\n <section\n ref={rootRef}\n data-slot=\"carousel\"\n aria-roledescription=\"carousel\"\n aria-label={label}\n className={cn(\"carousel\", className)}\n style={slideSize ? ({ \"--carousel-slide-size\": slideSize } as CSSProperties) : undefined}\n onKeyDown={onKeyDown}\n onFocus={(event) => setFocusPaused(event.target !== play.current && event.target.matches(\":focus-visible\"))}\n onBlur={(event) => {\n if (!event.currentTarget.contains(event.relatedTarget)) setFocusPaused(false);\n }}\n >\n <div\n ref={viewport}\n role=\"region\"\n aria-label=\"Slides\"\n tabIndex={0}\n data-slot=\"carousel-viewport\"\n className=\"carousel-viewport\"\n onScroll={onScroll}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={(event) => finish(event, false)}\n onPointerCancel={(event) => finish(event, true)}\n onPointerEnter={(event) => event.pointerType === \"mouse\" && setHovered(true)}\n onPointerLeave={() => setHovered(false)}\n onTouchStart={() => setTouching(true)}\n onTouchEnd={() => setTouching(false)}\n onTouchCancel={() => setTouching(false)}\n onClickCapture={onClick}\n onDragStart={(event) => event.preventDefault()}\n >\n <div ref={track} className=\"carousel-track\">\n {slides.map((slide, i) => (\n <div\n key={isValidElement(slide) && slide.key != null ? slide.key : i}\n id={`${id}-slide-${i}`}\n role=\"tabpanel\"\n aria-roledescription=\"slide\"\n aria-label={slideLabel(i, count)}\n data-active={i === index || undefined}\n className=\"carousel-slide\"\n >\n {slide}\n </div>\n ))}\n </div>\n </div>\n {count > 1 ? (\n <div className=\"carousel-controls\">\n {canRotate ? (\n <button\n ref={play}\n type=\"button\"\n aria-label={playing ? text.pause : text.play}\n className=\"carousel-control\"\n onClick={() => setPlaying(!playing)}\n >\n {playing ? <PauseGlyph /> : <PlayGlyph />}\n </button>\n ) : null}\n <div role=\"tablist\" aria-label={text.slides} className=\"carousel-tabs\">\n {slides.map((_, i) => (\n <button\n key={i}\n ref={(node) => {\n tabs.current[i] = node;\n }}\n type=\"button\"\n role=\"tab\"\n aria-selected={i === index}\n aria-controls={`${id}-slide-${i}`}\n aria-label={slideLabel(i, count)}\n tabIndex={i === index ? 0 : -1}\n className=\"carousel-tab\"\n onClick={() => select(i)}\n >\n <span aria-hidden=\"true\" className=\"carousel-dot\">\n <span className=\"carousel-dot-fill\" />\n {canRotate && playing && i === index ? (\n <span\n key={index}\n className=\"carousel-drain\"\n style={{ animationDuration: `${interval}ms`, animationPlayState: running ? \"running\" : \"paused\" }}\n onAnimationEnd={advance}\n />\n ) : null}\n </span>\n </button>\n ))}\n </div>\n <div className=\"carousel-arrows\">\n <button\n type=\"button\"\n aria-label={text.previous}\n aria-disabled={index === 0}\n className=\"carousel-control\"\n onClick={() => target.current > 0 && select(target.current - 1)}\n >\n <Chevron back />\n </button>\n <button\n type=\"button\"\n aria-label={text.next}\n aria-disabled={index === last}\n className=\"carousel-control\"\n onClick={() => target.current < last && select(target.current + 1)}\n >\n <Chevron />\n </button>\n </div>\n </div>\n ) : null}\n <span className=\"sr-only\" aria-live=\"polite\" aria-atomic=\"true\">\n {announcement}\n </span>\n </section>\n );\n});\n"],"mappings":";;;;;;;;AA4EA,MAAM,OAAO;;AAEb,MAAM,QAAQ;;AAEd,MAAM,WAAW,UAAkB,OAAO,SAAY,WAAW,MAAQ,QAAS,IAAI;AACtF,MAAM,SAAS,OAAe,KAAa,QAAgB,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,CAAC;AAC7F,MAAM,qBAAqB,OAAe,UAAkB,GAAG,QAAQ,EAAE,MAAM;AAE/E,MAAM,kBACJ,oBAAC,OAAD;CAAK,OAAO;CAAI,QAAQ;CAAI,SAAQ;CAAY,MAAK;CAAe,eAAY;CAC9E,UAAA,oBAAC,QAAD,EAAM,GAAE,gFAAiF,CAAA;AACtF,CAAA;AAEP,MAAM,mBACJ,qBAAC,OAAD;CAAK,OAAO;CAAI,QAAQ;CAAI,SAAQ;CAAY,MAAK;CAAe,eAAY;CAAhF,UAAA,CACE,oBAAC,QAAD;EAAM,GAAE;EAAM,GAAE;EAAM,OAAM;EAAM,QAAO;EAAK,IAAG;CAAK,CAAA,GACtD,oBAAC,QAAD;EAAM,GAAE;EAAM,GAAE;EAAM,OAAM;EAAM,QAAO;EAAK,IAAG;CAAK,CAAA,CACnD;;AAEP,MAAM,WAAW,EAAE,WACjB,oBAAC,OAAD;CAAK,OAAO;CAAI,QAAQ;CAAI,SAAQ;CAAY,MAAK;CAAO,QAAO;CAAe,aAAa;CAAM,eAAc;CAAQ,gBAAe;CAAQ,eAAY;CAC5J,UAAA,oBAAC,QAAD,EAAM,GAAG,OAAO,0BAA0B,uBAAyB,CAAA;AAChE,CAAA;AAKP,MAAa,WAAW,WAAuC,SAAS,SACtE,EACE,OACA,UACA,OAAO,iBACP,eAAe,GACf,eACA,WACA,aAAa,mBACb,UACA,WAAW,OACX,QACA,aAEF,KACA;CACA,MAAM,SAAS,SAAS,QAAQ,QAAQ;CACxC,MAAM,QAAQ,OAAO;CACrB,MAAM,OAAO,KAAK,IAAI,GAAG,QAAQ,CAAC;CAClC,MAAM,KAAK,MAAM;CACjB,MAAM,UAAU,iBAAiB;CACjC,MAAM,CAAC,UAAU,eAAe,eAAe,MAAM,cAAc,GAAG,IAAI,CAAC;CAC3E,MAAM,QAAQ,MAAM,mBAAmB,UAAU,GAAG,IAAI;CACxD,MAAM,CAAC,SAAS,cAAc,SAAS,QAAQ;CAC/C,MAAM,CAAC,SAAS,cAAc,SAAS,KAAK;CAC5C,MAAM,CAAC,UAAU,eAAe,SAAS,KAAK;CAC9C,MAAM,CAAC,aAAa,kBAAkB,SAAS,KAAK;CACpD,MAAM,CAAC,QAAQ,aAAa,SAAS,IAAI;CACzC,MAAM,CAAC,aAAa,kBAAkB,SAAS,IAAI;CACnD,MAAM,CAAC,cAAc,mBAAmB,SAAS,EAAE;CAEnD,MAAM,OAAO,OAA2B,IAAI;CAC5C,MAAM,UAAU,cAAc,UAAU,KAAK,IAAI,GAAG,CAAC,GAAG,CAAC;CACzD,MAAM,WAAW,OAAuB,IAAI;CAC5C,MAAM,QAAQ,OAAuB,IAAI;CACzC,MAAM,OAAO,OAA0B,IAAI;CAC3C,MAAM,OAAO,OAAqC,CAAC,CAAC;CAEpD,MAAM,SAAS,OAAO,KAAK;CAE3B,MAAM,aAAa,OAAsB,IAAI;CAC7C,MAAM,WAAW,OAAkD,KAAA,CAAS;CAC5E,MAAM,OAAO,OAAoB,IAAI;CACrC,MAAM,eAAe,OAAO,KAAK;CAEjC,MAAM,YAAY,QAAQ,QAAQ,KAAK,QAAQ,KAAK,CAAC;CACrD,MAAM,UAAU,aAAa,WAAW,CAAC,WAAW,CAAC,YAAY,CAAC,eAAe,UAAU;CAE3F,MAAM,aAAa;EACjB,MAAM,CAAC,OAAO,UAAU,MAAM,KAAK,MAAM,SAAS,YAAY,CAAC,CAAC;EAChE,OAAO,SAAS,SAAS,OAAO,aAAa,MAAM,aAAc,OAAO,eAAe;CACzF;;CAEA,MAAM,UAAU,MAAc;EAC5B,MAAM,OAAO,MAAM,SAAS,SAAS;EACrC,MAAM,MAAM,SAAS;EACrB,OAAO,QAAQ,MAAM,KAAK,cAAc,IAAI,cAAc,KAAK,eAAe,IAAI;CACpF;;CAGA,MAAM,QAAQ,kBAAkB;EAC9B,MAAM,MAAM,SAAS;EACrB,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,OAAO,CAAC,MAAM,OAAO,OAAO;EACjC,MAAM,WAAW,IAAI,aAAa;EAClC,MAAM,KAAK,MAAM,SAAS,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,OAAO,MAAM;GAC9D,MAAuB,MAAM,YAAY,OAAO,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;EAC7F,CAAC;EACD,KAAK,QAAQ,SAAS,KAAK,MAAM;GAC/B,MAAM,MAAM,KAAK;GACjB,IAAI,eAAe,aAAa,IAAI,MAAM,YAAY,OAAO,OAAO,KAAK,IAAI,GAAG,IAAI,KAAK,IAAI,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;EAC9H,CAAC;EACD,OAAO;CACT,GAAG,CAAC,IAAI,CAAC;CAET,SAAS,cAAc,GAAW,QAAiB;EACjD,MAAM,MAAM,SAAS;EACrB,IAAI,CAAC,KAAK;EACV,MAAM,OAAO,OAAO,CAAC;EACrB,IAAI,CAAC,UAAU,WAAW,KAAK,IAAI,IAAI,aAAa,IAAI,IAAI,GAAG;GAC7D,WAAW,UAAU;GACrB,IAAI,SAAS;IAAE;IAAM,UAAU;GAAO,CAAC;GACvC,MAAM;GACN;EACF;EACA,WAAW,UAAU;EACrB,aAAa,SAAS,OAAO;EAE7B,SAAS,UAAU,iBAAkB,WAAW,UAAU,MAAO,GAAI;EACrE,IAAI,SAAS;GAAE;GAAM,UAAU;EAAS,CAAC;CAC3C;CAEA,SAAS,OAAO,MAAc,UAAmB;EAC/C,OAAO,UAAU;EACjB,IAAI,oBAAoB,KAAA,GAAW,YAAY,IAAI;EACnD,gBAAgB,IAAI;EACpB,IAAI,UAAU,gBAAgB,WAAW,MAAM,KAAK,CAAC;CACvD;CAEA,SAAS,OAAO,IAAY,WAAW,MAAM;EAC3C,MAAM,OAAO,MAAM,IAAI,GAAG,IAAI;EAC9B,IAAI,SAAS,OAAO,SAAS,OAAO,MAAM,QAAQ;EAClD,cAAc,MAAM,IAAI;CAC1B;CAGA,gCAAgC;EAC9B,cAAc,OAAO,SAAS,KAAK;EACnC,MAAM,MAAM,SAAS;EACrB,IAAI,CAAC,OAAO,OAAO,mBAAmB,aAAa;EACnD,MAAM,WAAW,IAAI,qBAAqB;GACxC,IAAI,CAAC,KAAK,WAAW,WAAW,YAAY,MAAM,cAAc,OAAO,SAAS,KAAK;EACvF,CAAC;EACD,SAAS,QAAQ,GAAG;EACpB,aAAa,SAAS,WAAW;CACnC,GAAG,CAAC,CAAC;CAGL,gCAAgC;EAC9B,MAAM,KAAK,MAAM,SAAS,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,OAAO,MAAM,MAAM,gBAAgB,SAAS,MAAM,KAAK,CAAC;CAC7G,GAAG,CAAC,OAAO,KAAK,CAAC;CAGjB,gBAAgB;EACd,IAAI,OAAO,YAAY,OAAO;GAC5B,OAAO,UAAU;GACjB,cAAc,OAAO,IAAI;EAC3B;CAEF,GAAG,CAAC,KAAK,CAAC;CAEV,sBAAsB,aAAa,SAAS,OAAO,GAAG,CAAC,CAAC;CAExD,SAAS,WAAW;EAClB,MAAM,WAAW,MAAM;EACvB,MAAM,MAAM,SAAS;EACrB,IAAI,CAAC,OAAO,KAAK,SAAS,QAAQ;EAClC,IAAI,WAAW,YAAY,MAAM;GAC/B,IAAI,KAAK,IAAI,IAAI,aAAa,OAAO,WAAW,OAAO,CAAC,IAAI,GAAG,WAAW,UAAU;GACpF;EACF;EACA,MAAM,OAAO,MAAM,KAAK,MAAM,QAAQ,GAAG,GAAG,IAAI;EAChD,IAAI,SAAS,OAAO,SAAS,OAAO,MAAM,IAAI;CAChD;CAEA,MAAM,gBAAgB,OAAO,SAAS,OAAO,IAAI,QAAQ,GAAG,KAAK;CAEjE,gBAAgB;EACd,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,YAAY,CAAC,MAAM;EACxB,MAAM,WAAW,OAAO,yBAAyB,cAAc,OAAO,IAAI,sBAAsB,CAAC,WAAW,SAAS,UAAU,MAAM,cAAc,CAAC;EACpJ,UAAU,QAAQ,IAAI;EACtB,MAAM,qBAAqB,eAAe,SAAS,oBAAoB,QAAQ;EAC/E,SAAS,iBAAiB,oBAAoB,YAAY;EAC1D,aAAa;GACX,UAAU,WAAW;GACrB,SAAS,oBAAoB,oBAAoB,YAAY;EAC/D;CACF,GAAG,CAAC,QAAQ,CAAC;CAEb,SAAS,cAAc,OAAqC;EAC1D,IAAI,QAAQ,KAAK,KAAK,WAAW,MAAM,gBAAgB,WAAW,MAAM,WAAW,GAAG;EACtF,aAAa,UAAU;EACvB,KAAK,UAAU;GAAE,SAAS,MAAM;GAAW,QAAQ,MAAM;GAAS,WAAW,MAAM,cAAc;GAAY,MAAM,OAAO;GAAS,QAAQ;GAAO,SAAS,CAAC;EAAE;CAChK;CAEA,SAAS,cAAc,OAAqC;EAC1D,MAAM,UAAU,KAAK;EACrB,IAAI,CAAC,WAAW,QAAQ,YAAY,MAAM,WAAW;EACrD,MAAM,MAAM,MAAM;EAClB,IAAI,CAAC,QAAQ,QAAQ;GACnB,IAAI,KAAK,IAAI,MAAM,UAAU,QAAQ,MAAM,IAAI,MAAM;GAErD,QAAQ,SAAS;GACjB,QAAQ,SAAS,MAAM;GACvB,WAAW,UAAU;GACrB,IAAI;IACF,IAAI,kBAAkB,MAAM,SAAS;GACvC,QAAQ,CAER;GACA,IAAI,QAAQ,WAAW;EACzB;EACA,IAAI,aAAa,QAAQ,aAAa,MAAM,UAAU,QAAQ;EAC9D,QAAQ,QAAQ,KAAK,CAAC,MAAM,WAAW,IAAI,UAAU,CAAC;EACtD,IAAI,QAAQ,QAAQ,SAAS,IAAI,QAAQ,QAAQ,MAAM;CACzD;CAEA,SAAS,OAAO,OAAqC,WAAoB;EACvE,MAAM,UAAU,KAAK;EACrB,IAAI,CAAC,WAAW,QAAQ,YAAY,MAAM,WAAW;EACrD,KAAK,UAAU;EACf,IAAI,CAAC,QAAQ,QAAQ;EACrB,MAAM,MAAM,MAAM;EAClB,OAAO,IAAI,QAAQ;EACnB,aAAa,UAAU;EACvB,MAAM,SAAS,QAAQ,QAAQ,QAAQ,CAAC,UAAU,MAAM,YAAY,QAAQ,EAAE;EAC9E,MAAM,QAAQ,OAAO;EACrB,MAAM,aAAa,OAAO,OAAO,SAAS;EAC1C,MAAM,WACJ,CAAC,aAAa,SAAS,cAAc,OAAO,SAAS,KAAK,MAAM,YAAY,WAAW,MAAM,MAAM,WAAW,KAAK,MAAM,MACnH,WAAW,KAAK,MAAM,OAAO,WAAW,KAAK,MAAM,MAAO,MAC5D;EACN,MAAM,OAAO,KAAK,KAAK;EAEvB,IAAI,KAAK,KAAK,OAAO,IAAI,aAAa,QAAQ,QAAQ,KAAK,IAAI;EAC/D,IAAI,KAAK,IAAI,QAAQ,IAAI,OAAO;GAC9B,MAAM,YAAY,WAAW,IAAI,IAAI;GACrC,KAAK,KAAK,QAAQ,QAAQ,YAAY,GAAG,KAAK,QAAQ,OAAO;EAC/D;EACA,OAAO,EAAE;CACX;;CAGA,SAAS,QAAQ,OAAmC;EAClD,IAAI,aAAa,SAAS;GACxB,aAAa,UAAU;GACvB,MAAM,eAAe;GACrB,MAAM,gBAAgB;GACtB;EACF;EACA,MAAM,MAAM,MAAM,KAAK,MAAM,SAAS,YAAY,CAAC,CAAC,CAAC,CAAC,WAAW,UAAU;GACzE,MAAM,OAAO,MAAM,sBAAsB;GACzC,OAAO,MAAM,WAAW,KAAK,QAAQ,MAAM,WAAW,KAAK;EAC7D,CAAC;EACD,IAAI,OAAO,KAAK,QAAQ,OAAO,SAAS,OAAO,GAAG;CACpD;CAEA,SAAS,UAAU,OAAmC;EACpD,IAAI,MAAM,UAAU,MAAM,WAAW,MAAM,WAAW,QAAQ,GAAG;EACjE,MAAM,OAAO,MAAM;EACnB,IAAI,KAAK,QAAQ,4CAA4C,GAAG;EAChE,MAAM,OAAO,OAAO;EACpB,MAAM,KACJ,MAAM,QAAQ,cAAc,OAAO,IAAI,MAAM,QAAQ,eAAe,OAAO,IAAI,MAAM,QAAQ,SAAS,IAAI,MAAM,QAAQ,QAAQ,OAAO;EACzI,IAAI,OAAO,MAAM;EACjB,MAAM,eAAe;EACrB,MAAM,OAAO,MAAM,IAAI,GAAG,IAAI;EAC9B,OAAO,IAAI;EACX,IAAI,KAAK,aAAa,MAAM,MAAM,OAAO,KAAK,QAAQ,KAAK,EAAE,MAAM,EAAE,eAAe,KAAK,CAAC;OACrF,IAAI,MAAM,SAAS,SAAS,IAAI,GAAG,SAAS,SAAS,MAAM,EAAE,eAAe,KAAK,CAAC;CACzF;CAEA,MAAM,OAAO;EAAE,UAAU;EAAkB,MAAM;EAAc,MAAM;EAAwB,OAAO;EAAwB,QAAQ;EAAkB,GAAG;CAAO;CAEhK,OACE,qBAAC,WAAD;EACE,KAAK;EACL,aAAU;EACV,wBAAqB;EACrB,cAAY;EACZ,WAAW,GAAG,YAAY,SAAS;EACnC,OAAO,YAAa,EAAE,yBAAyB,UAAU,IAAsB,KAAA;EACpE;EACX,UAAU,UAAU,eAAe,MAAM,WAAW,KAAK,WAAW,MAAM,OAAO,QAAQ,gBAAgB,CAAC;EAC1G,SAAS,UAAU;GACjB,IAAI,CAAC,MAAM,cAAc,SAAS,MAAM,aAAa,GAAG,eAAe,KAAK;EAC9E;EAXF,UAAA;GAaE,oBAAC,OAAD;IACE,KAAK;IACL,MAAK;IACL,cAAW;IACX,UAAU;IACV,aAAU;IACV,WAAU;IACA;IACK;IACA;IACf,cAAc,UAAU,OAAO,OAAO,KAAK;IAC3C,kBAAkB,UAAU,OAAO,OAAO,IAAI;IAC9C,iBAAiB,UAAU,MAAM,gBAAgB,WAAW,WAAW,IAAI;IAC3E,sBAAsB,WAAW,KAAK;IACtC,oBAAoB,YAAY,IAAI;IACpC,kBAAkB,YAAY,KAAK;IACnC,qBAAqB,YAAY,KAAK;IACtC,gBAAgB;IAChB,cAAc,UAAU,MAAM,eAAe;IAE7C,UAAA,oBAAC,OAAD;KAAK,KAAK;KAAO,WAAU;KACxB,UAAA,OAAO,KAAK,OAAO,MAClB,oBAAC,OAAD;MAEE,IAAI,GAAG,GAAG,SAAS;MACnB,MAAK;MACL,wBAAqB;MACrB,cAAY,WAAW,GAAG,KAAK;MAC/B,eAAa,MAAM,SAAS,KAAA;MAC5B,WAAU;MAET,UAAA;KACE,GATE,eAAe,KAAK,KAAK,MAAM,OAAO,OAAO,MAAM,MAAM,CAS3D,CACN;IACE,CAAA;GACF,CAAA;GACJ,QAAQ,IACP,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KACG,YACC,oBAAC,UAAD;MACE,KAAK;MACL,MAAK;MACL,cAAY,UAAU,KAAK,QAAQ,KAAK;MACxC,WAAU;MACV,eAAe,WAAW,CAAC,OAAO;MAEjC,UAAA,UAAU,oBAAC,YAAD,CAAa,CAAA,IAAI,oBAAC,WAAD,CAAY,CAAA;KAClC,CAAA,IACN;KACJ,oBAAC,OAAD;MAAK,MAAK;MAAU,cAAY,KAAK;MAAQ,WAAU;MACpD,UAAA,OAAO,KAAK,GAAG,MACd,oBAAC,UAAD;OAEE,MAAM,SAAS;QACb,KAAK,QAAQ,KAAK;OACpB;OACA,MAAK;OACL,MAAK;OACL,iBAAe,MAAM;OACrB,iBAAe,GAAG,GAAG,SAAS;OAC9B,cAAY,WAAW,GAAG,KAAK;OAC/B,UAAU,MAAM,QAAQ,IAAI;OAC5B,WAAU;OACV,eAAe,OAAO,CAAC;OAEvB,UAAA,qBAAC,QAAD;QAAM,eAAY;QAAO,WAAU;QAAnC,UAAA,CACE,oBAAC,QAAD,EAAM,WAAU,oBAAqB,CAAA,GACpC,aAAa,WAAW,MAAM,QAC7B,oBAAC,QAAD;SAEE,WAAU;SACV,OAAO;UAAE,mBAAmB,GAAG,SAAS;UAAK,oBAAoB,UAAU,YAAY;SAAS;SAChG,gBAAgB;QACjB,GAJM,KAIN,IACC,IACA;;MACA,GAxBD,CAwBC,CACT;KACE,CAAA;KACL,qBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACE,oBAAC,UAAD;OACE,MAAK;OACL,cAAY,KAAK;OACjB,iBAAe,UAAU;OACzB,WAAU;OACV,eAAe,OAAO,UAAU,KAAK,OAAO,OAAO,UAAU,CAAC;OAE9D,UAAA,oBAAC,SAAD,EAAS,MAAA,KAAM,CAAA;MACT,CAAA,GACR,oBAAC,UAAD;OACE,MAAK;OACL,cAAY,KAAK;OACjB,iBAAe,UAAU;OACzB,WAAU;OACV,eAAe,OAAO,UAAU,QAAQ,OAAO,OAAO,UAAU,CAAC;OAEjE,UAAA,oBAAC,SAAD,CAAU,CAAA;MACJ,CAAA,CACL;;IACF;GACH,CAAA,IAAA;GACJ,oBAAC,QAAD;IAAM,WAAU;IAAU,aAAU;IAAS,eAAY;IACtD,UAAA;GACG,CAAA;EACC;;AAEb,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Carousel, CarouselProps } from "./carousel.js";
2
+ export { Carousel, type CarouselProps };
@@ -0,0 +1,2 @@
1
+ import { Carousel } from "./carousel.js";
2
+ export { Carousel };
@@ -38,13 +38,6 @@ import { CheckboxProps } from "react-aria-components";
38
38
  */
39
39
  export declare const checkboxVariants: (props?: import("class-variance-authority/types").ClassProp | undefined) => string;
40
40
  export declare const checkboxBoxVariants: (props?: import("class-variance-authority/types").ClassProp | undefined) => string;
41
- /**
42
- * A checkbox.
43
- *
44
- * @example
45
- * <Checkbox defaultSelected>Email me about new courses</Checkbox>
46
- * <Checkbox aria-label="Select row" />
47
- */
48
41
  interface CheckboxProps$1 extends Omit<CheckboxProps, "className" | "style" | "children"> {
49
42
  /**
50
43
  * The label, and the control's accessible name.