@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,61 @@
1
+ import { ReactNode } from "react";
2
+ //#region src/floating-button-group/floating-button-group.d.ts
3
+ export type FloatingButtonGroupVariant = "muted" | "floating";
4
+ export type FloatingButtonGroupSize = "sm" | "md";
5
+ export type FloatingButtonGroupOrientation = "horizontal" | "vertical";
6
+ export interface FloatingButtonGroupAction {
7
+ type?: "action";
8
+ /** Stable key, also passed to onAction. */
9
+ id: string;
10
+ /** Visible label, and the accessible name when the item shows only its icon. */
11
+ label: string;
12
+ /** An icon before the label. Mark it `aria-hidden`. */
13
+ icon?: ReactNode;
14
+ /** Shows only the icon. The label moves into a tooltip and the accessible name. Overrides the group's iconOnly. */
15
+ iconOnly?: boolean;
16
+ onSelect?: () => void;
17
+ isDisabled?: boolean;
18
+ /** Marks an action that switches a mode on, such as Present. Sets aria-pressed and keeps a quiet tint while on. */
19
+ isPressed?: boolean;
20
+ /** A shortcut hint shown in the tooltip, such as "⌘Z". The component does not bind the key. */
21
+ shortcut?: string;
22
+ /** Other labels this item can switch to, such as ["Copied"] for Share. The button keeps the width of the widest, so a label change never moves anything. */
23
+ reserveLabels?: readonly string[];
24
+ }
25
+ export interface FloatingButtonGroupSeparator {
26
+ type: "separator";
27
+ id?: string;
28
+ }
29
+ export type FloatingButtonGroupItem = FloatingButtonGroupAction | FloatingButtonGroupSeparator;
30
+ export interface FloatingButtonGroupProps {
31
+ items: readonly FloatingButtonGroupItem[];
32
+ /** Accessible name of the toolbar, such as "Board actions". */
33
+ label: string;
34
+ /** `muted` sits quietly on a page; `floating` raises the tray with the floating shadow for overlays such as a selection toolbar. @default "muted" */
35
+ variant?: FloatingButtonGroupVariant;
36
+ /** @default "md" */
37
+ size?: FloatingButtonGroupSize;
38
+ /** @default "horizontal" */
39
+ orientation?: FloatingButtonGroupOrientation;
40
+ /** Shows every item as an icon only, with its label in a tooltip. Items with their own iconOnly win. */
41
+ iconOnly?: boolean;
42
+ /** Side of the item tooltips. Defaults to top for a row and right for a column. */
43
+ tooltipSide?: "top" | "bottom" | "left" | "right";
44
+ /** Called with the item id after the item's own onSelect. */
45
+ onAction?: (id: string) => void;
46
+ /** Extra classes. Merged last, so they win conflicts with ours. */
47
+ className?: string;
48
+ }
49
+ /**
50
+ * Separate soft buttons in a quiet tray. One shared highlight morphs, in
51
+ * position and size, to whichever button the pointer or keyboard focus is on,
52
+ * fades when the pointer leaves the tray, and settles darker in place while a
53
+ * button is pressed. It is the toolbar's main hover and focus indicator. Arrow
54
+ * keys move focus, Home and End jump to the ends, Enter and Space act.
55
+ *
56
+ * @example
57
+ * <FloatingButtonGroup label="Board actions" items={[{ id: "undo", label: "Undo", icon: <UndoIcon aria-hidden />, iconOnly: true, shortcut: "⌘Z" }]} />
58
+ */
59
+ export declare function FloatingButtonGroup({ items, label, variant, size, orientation, iconOnly: groupIconOnly, tooltipSide, onAction, className }: FloatingButtonGroupProps): import("react").JSX.Element;
60
+ //#endregion
61
+ //# sourceMappingURL=floating-button-group.d.ts.map
@@ -0,0 +1,340 @@
1
+ "use client";
2
+ import { cn } from "../lib/cn.js";
3
+ import { prefersReducedMotion, useExitBackstop, useIsomorphicLayoutEffect, useLeavingItems } from "../lib/motion.js";
4
+ import { Tooltip as Tooltip$1, TooltipTrigger as TooltipTrigger$1 } from "../tooltip/tooltip.js";
5
+ import { Fragment, useCallback, useEffect, useRef, useState } from "react";
6
+ import { Focusable } from "react-aria-components";
7
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
8
+ //#region src/floating-button-group/floating-button-group.tsx
9
+ const isAction = (item) => item.type !== "separator";
10
+ const PHASE = "col-start-1 row-start-1 inline-flex items-center gap-1.5 whitespace-nowrap";
11
+ function LeavingPhase({ id, onDone, children }) {
12
+ const remove = useCallback(() => onDone(id), [onDone, id]);
13
+ useExitBackstop(true, remove);
14
+ return /* @__PURE__ */ jsx("span", {
15
+ "aria-hidden": "true",
16
+ onAnimationEnd: (event) => {
17
+ if (event.target === event.currentTarget) remove();
18
+ },
19
+ className: cn(PHASE + " motion-safe:animate-label-out motion-reduce:animate-fade-out"),
20
+ children
21
+ });
22
+ }
23
+ /**
24
+ * Icon and label. Every label the item can show is laid out invisibly in the
25
+ * same grid cell, so the button always has the width of the widest one: a label
26
+ * change crossfades in place and never resizes the button, its neighbours or the
27
+ * tray.
28
+ */
29
+ function ItemBody({ label, icon, iconOnly, reserve }) {
30
+ const phaseRef = useRef(null);
31
+ const node = /* @__PURE__ */ jsxs(Fragment$1, { children: [icon ? /* @__PURE__ */ jsx("span", {
32
+ className: "inline-flex flex-none [&_svg]:size-(--icon-sm)",
33
+ children: icon
34
+ }) : null, iconOnly ? null : /* @__PURE__ */ jsx("span", {
35
+ className: "block",
36
+ children: label
37
+ })] });
38
+ const { leaving, changed, remove } = useLeavingItems(label, node, () => phaseRef.current);
39
+ const ghosts = iconOnly ? [] : Array.from(/* @__PURE__ */ new Set([label, ...reserve]));
40
+ return /* @__PURE__ */ jsxs("span", {
41
+ className: "relative z-2 inline-grid items-center justify-items-center group-aria-[orientation=vertical]/fg:justify-items-start",
42
+ children: [
43
+ ghosts.map((text) => /* @__PURE__ */ jsxs("span", {
44
+ "aria-hidden": "true",
45
+ className: cn(PHASE + " pointer-events-none invisible"),
46
+ children: [icon ? /* @__PURE__ */ jsx("span", { className: "block size-4 flex-none" }) : null, /* @__PURE__ */ jsx("span", {
47
+ className: "block",
48
+ children: text
49
+ })]
50
+ }, text)),
51
+ leaving.map((entry) => /* @__PURE__ */ jsx(LeavingPhase, {
52
+ id: entry.id,
53
+ onDone: remove,
54
+ children: entry.value
55
+ }, entry.id)),
56
+ /* @__PURE__ */ jsx("span", {
57
+ ref: phaseRef,
58
+ className: cn(PHASE + (changed ? " motion-safe:animate-label-in motion-reduce:animate-fade-in" : "")),
59
+ children: node
60
+ }, label)
61
+ ]
62
+ });
63
+ }
64
+ function TipContent({ label, shortcut }) {
65
+ return /* @__PURE__ */ jsxs("span", {
66
+ className: "inline-flex items-baseline gap-3 whitespace-nowrap",
67
+ children: [label, shortcut ? /* @__PURE__ */ jsx("kbd", {
68
+ className: "font-[inherit] tabular-nums opacity-70",
69
+ children: shortcut
70
+ }) : null]
71
+ });
72
+ }
73
+ const MORPH = "translate var(--duration-morph) var(--ease-morph), width var(--duration-morph) var(--ease-morph), height var(--duration-morph) var(--ease-morph)";
74
+ const SCALE = "scale var(--duration-snappy) var(--ease-snappy)";
75
+ const BACKGROUND = "background-color var(--duration-quick) var(--ease-settle)";
76
+ const FADE_IN = "opacity var(--duration-quick) var(--ease-settle)";
77
+ const FADE_OUT = "opacity var(--duration-standard) var(--ease-settle)";
78
+ const FADE_INSTANT = "opacity var(--duration-instant) var(--ease-settle)";
79
+ /**
80
+ * Separate soft buttons in a quiet tray. One shared highlight morphs, in
81
+ * position and size, to whichever button the pointer or keyboard focus is on,
82
+ * fades when the pointer leaves the tray, and settles darker in place while a
83
+ * button is pressed. It is the toolbar's main hover and focus indicator. Arrow
84
+ * keys move focus, Home and End jump to the ends, Enter and Space act.
85
+ *
86
+ * @example
87
+ * <FloatingButtonGroup label="Board actions" items={[{ id: "undo", label: "Undo", icon: <UndoIcon aria-hidden />, iconOnly: true, shortcut: "⌘Z" }]} />
88
+ */
89
+ function FloatingButtonGroup({ items, label, variant = "muted", size = "md", orientation = "horizontal", iconOnly: groupIconOnly = false, tooltipSide, onAction, className }) {
90
+ const tray = useRef(null);
91
+ const highlight = useRef(null);
92
+ const nodes = useRef(/* @__PURE__ */ new Map());
93
+ const [hoverId, setHoverId] = useState(null);
94
+ const [focusId, setFocusId] = useState(null);
95
+ const [pressing, setPressing] = useState(false);
96
+ const [tabStop, setTabStop] = useState(null);
97
+ const actions = items.filter(isAction);
98
+ const byId = new Map(actions.map((action) => [action.id, action]));
99
+ const enabled = (id) => !!id && !!byId.get(id) && !byId.get(id)?.isDisabled;
100
+ const activeId = enabled(hoverId) ? hoverId : focusId && byId.has(focusId) ? focusId : null;
101
+ const stop = enabled(tabStop) ? tabStop : actions.find((action) => !action.isDisabled)?.id ?? null;
102
+ const vertical = orientation === "vertical";
103
+ const side = tooltipSide ?? (vertical ? "right" : "top");
104
+ const idsKey = actions.map((action) => action.id).join("\0");
105
+ const visible = useRef(false);
106
+ const traveling = useRef(false);
107
+ const travelTimer = useRef(void 0);
108
+ const activeRef = useRef(activeId);
109
+ const pressingRef = useRef(pressing);
110
+ /** The button's box in tray coordinates, exact to the device pixel (offsetLeft rounds to whole pixels) and free of ancestor transforms. */
111
+ const measure = useCallback((node) => {
112
+ const root = tray.current;
113
+ if (!root) return null;
114
+ const outer = root.getBoundingClientRect();
115
+ const box = node.getBoundingClientRect();
116
+ const unscale = outer.width ? root.offsetWidth / outer.width : 1;
117
+ const dpr = window.devicePixelRatio || 1;
118
+ const snap = (value) => Math.round(value * unscale * dpr) / dpr;
119
+ return {
120
+ x: snap(box.left - outer.left) - root.clientLeft,
121
+ y: snap(box.top - outer.top) - root.clientTop,
122
+ width: snap(box.width),
123
+ height: snap(box.height)
124
+ };
125
+ }, []);
126
+ /** Moves the highlight to a button. "move" travels on the morph spring; "follow" keeps up with a layout change without travelling. */
127
+ const place = useCallback((id, mode) => {
128
+ const el = highlight.current;
129
+ if (!el) return;
130
+ const reduced = prefersReducedMotion();
131
+ const node = id ? nodes.current.get(id) : void 0;
132
+ if (!node) {
133
+ el.style.transition = [
134
+ BACKGROUND,
135
+ SCALE,
136
+ reduced ? FADE_INSTANT : FADE_OUT
137
+ ].join(", ");
138
+ el.style.opacity = "0";
139
+ visible.current = false;
140
+ return;
141
+ }
142
+ const rect = measure(node);
143
+ if (!rect) return;
144
+ const fade = reduced ? FADE_INSTANT : FADE_IN;
145
+ if (!reduced && visible.current && (mode === "move" || traveling.current)) {
146
+ traveling.current = true;
147
+ clearTimeout(travelTimer.current);
148
+ travelTimer.current = setTimeout(() => {
149
+ traveling.current = false;
150
+ }, 740);
151
+ el.style.transition = [
152
+ MORPH,
153
+ SCALE,
154
+ fade,
155
+ BACKGROUND
156
+ ].join(", ");
157
+ } else {
158
+ traveling.current = false;
159
+ el.style.transition = [
160
+ SCALE,
161
+ fade,
162
+ BACKGROUND
163
+ ].join(", ");
164
+ if (!visible.current && !reduced) {
165
+ el.style.transition = "none";
166
+ el.style.scale = "0.94";
167
+ el.offsetWidth;
168
+ el.style.transition = [
169
+ SCALE,
170
+ fade,
171
+ BACKGROUND
172
+ ].join(", ");
173
+ el.style.scale = pressingRef.current ? "0.965" : "1";
174
+ }
175
+ }
176
+ el.style.translate = rect.x + "px " + rect.y + "px";
177
+ el.style.width = rect.width + "px";
178
+ el.style.height = rect.height + "px";
179
+ el.style.opacity = "1";
180
+ visible.current = true;
181
+ }, [measure]);
182
+ useIsomorphicLayoutEffect(() => {
183
+ activeRef.current = activeId;
184
+ place(activeId, "move");
185
+ }, [activeId, place]);
186
+ useEffect(() => {
187
+ pressingRef.current = pressing;
188
+ const el = highlight.current;
189
+ if (!el) return;
190
+ el.style.scale = pressing && activeId ? "0.965" : "1";
191
+ }, [activeId, pressing]);
192
+ useEffect(() => {
193
+ const root = tray.current;
194
+ if (!root || typeof ResizeObserver === "undefined") return;
195
+ let frame = 0;
196
+ const observer = new ResizeObserver(() => {
197
+ cancelAnimationFrame(frame);
198
+ frame = requestAnimationFrame(() => {
199
+ if (activeRef.current) place(activeRef.current, "follow");
200
+ });
201
+ });
202
+ observer.observe(root);
203
+ nodes.current.forEach((node) => observer.observe(node));
204
+ return () => {
205
+ cancelAnimationFrame(frame);
206
+ observer.disconnect();
207
+ };
208
+ }, [idsKey, place]);
209
+ useEffect(() => {
210
+ const root = tray.current;
211
+ if (!root) return;
212
+ const leave = () => {
213
+ setHoverId(null);
214
+ setPressing(false);
215
+ };
216
+ root.addEventListener("pointerleave", leave);
217
+ return () => root.removeEventListener("pointerleave", leave);
218
+ }, []);
219
+ useEffect(() => () => clearTimeout(travelTimer.current), []);
220
+ const buttons = () => Array.from(tray.current?.querySelectorAll("[data-fg-item]") ?? []);
221
+ const onKeyDown = (event) => {
222
+ const all = buttons();
223
+ const index = all.findIndex((node) => node === document.activeElement);
224
+ if (index < 0) return;
225
+ const next = vertical ? "ArrowDown" : "ArrowRight";
226
+ const previous = vertical ? "ArrowUp" : "ArrowLeft";
227
+ const usable = (node) => node.getAttribute("aria-disabled") !== "true";
228
+ let target;
229
+ if (event.key === "Home") target = all.find(usable);
230
+ else if (event.key === "End") target = [...all].reverse().find(usable);
231
+ else if (event.key === next || event.key === previous) {
232
+ const step = event.key === next ? 1 : -1;
233
+ for (let offset = 1; offset <= all.length; offset += 1) {
234
+ const candidate = all[(index + step * offset + all.length * offset) % all.length];
235
+ if (usable(candidate)) {
236
+ target = candidate;
237
+ break;
238
+ }
239
+ }
240
+ } else return;
241
+ event.preventDefault();
242
+ if (!target) return;
243
+ setHoverId(null);
244
+ target.focus();
245
+ };
246
+ const onBlur = (event) => {
247
+ if (tray.current?.contains(event.relatedTarget)) return;
248
+ setFocusId(null);
249
+ setPressing(false);
250
+ };
251
+ return /* @__PURE__ */ jsxs("div", {
252
+ ref: tray,
253
+ role: "toolbar",
254
+ "aria-label": label,
255
+ "aria-orientation": orientation,
256
+ "data-variant": variant,
257
+ "data-size": size,
258
+ onKeyDown,
259
+ onBlur,
260
+ className: cn("floating-group group/fg", className),
261
+ children: [/* @__PURE__ */ jsx("span", {
262
+ ref: highlight,
263
+ "aria-hidden": "true",
264
+ "data-pressing": pressing && activeId ? "" : void 0,
265
+ className: "floating-group-highlight"
266
+ }), items.map((item, position) => {
267
+ if (!isAction(item)) return /* @__PURE__ */ jsx("span", {
268
+ role: "separator",
269
+ "aria-orientation": vertical ? "horizontal" : "vertical",
270
+ className: "floating-group-separator"
271
+ }, item.id ?? "separator-" + position);
272
+ const { id, label: itemLabel, icon, onSelect, isDisabled = false, isPressed, shortcut, reserveLabels = [] } = item;
273
+ const iconOnly = !!icon && (item.iconOnly ?? groupIconOnly);
274
+ const button = /* @__PURE__ */ jsx("button", {
275
+ ref: (node) => {
276
+ if (node) nodes.current.set(id, node);
277
+ else nodes.current.delete(id);
278
+ },
279
+ type: "button",
280
+ "data-fg-item": "",
281
+ "data-active": activeId === id ? "" : void 0,
282
+ "data-icon": icon ? "" : void 0,
283
+ "data-icon-only": iconOnly ? "" : void 0,
284
+ "aria-label": itemLabel,
285
+ "aria-pressed": isPressed === void 0 ? void 0 : isPressed,
286
+ "aria-disabled": isDisabled || void 0,
287
+ tabIndex: stop === id ? 0 : -1,
288
+ onPointerMove: (event) => {
289
+ if (event.pointerType === "mouse" || event.pointerType === "pen") setHoverId(id);
290
+ },
291
+ onPointerDown: (event) => {
292
+ if (isDisabled || event.button !== 0) return;
293
+ setHoverId(id);
294
+ setPressing(true);
295
+ },
296
+ onPointerUp: () => setPressing(false),
297
+ onPointerCancel: () => setPressing(false),
298
+ onPointerLeave: () => setPressing(false),
299
+ onKeyDown: (event) => {
300
+ if ((event.key === "Enter" || event.key === " ") && !event.repeat && !isDisabled) setPressing(true);
301
+ },
302
+ onKeyUp: (event) => {
303
+ if (event.key === "Enter" || event.key === " ") setPressing(false);
304
+ },
305
+ onFocus: (event) => {
306
+ setTabStop(id);
307
+ let keyboard = true;
308
+ try {
309
+ keyboard = event.currentTarget.matches(":focus-visible");
310
+ } catch {}
311
+ setFocusId(keyboard ? id : null);
312
+ },
313
+ onClick: () => {
314
+ if (isDisabled) return;
315
+ onSelect?.();
316
+ onAction?.(id);
317
+ },
318
+ className: cn("floating-group-item focus-visible:outline-solid focus-visible:outline-(length:--focus-ring-width) focus-visible:outline-offset-(--focus-ring-offset) focus-visible:outline-(--color-ring)"),
319
+ children: /* @__PURE__ */ jsx(ItemBody, {
320
+ label: itemLabel,
321
+ icon,
322
+ iconOnly,
323
+ reserve: reserveLabels
324
+ })
325
+ });
326
+ if (!iconOnly && !shortcut) return /* @__PURE__ */ jsx(Fragment, { children: button }, id);
327
+ return /* @__PURE__ */ jsxs(TooltipTrigger$1, { children: [/* @__PURE__ */ jsx(Focusable, { children: button }), /* @__PURE__ */ jsx(Tooltip$1, {
328
+ placement: side,
329
+ children: /* @__PURE__ */ jsx(TipContent, {
330
+ label: itemLabel,
331
+ shortcut
332
+ })
333
+ })] }, id);
334
+ })]
335
+ });
336
+ }
337
+ //#endregion
338
+ export { FloatingButtonGroup };
339
+
340
+ //# sourceMappingURL=floating-button-group.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"floating-button-group.js","names":["TooltipTrigger","Tooltip"],"sources":["../../src/floating-button-group/floating-button-group.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n Fragment,\n useCallback,\n useEffect,\n useRef,\n useState,\n type FocusEvent,\n type KeyboardEvent,\n type ReactNode,\n} from \"react\";\nimport { Focusable } from \"react-aria-components\";\n\nimport { cn } from \"../lib/cn.js\";\nimport {\n prefersReducedMotion,\n useExitBackstop,\n useIsomorphicLayoutEffect,\n useLeavingItems,\n} from \"../lib/motion.js\";\nimport { Tooltip, TooltipTrigger } from \"../tooltip/tooltip.js\";\n\nexport type FloatingButtonGroupVariant = \"muted\" | \"floating\";\nexport type FloatingButtonGroupSize = \"sm\" | \"md\";\nexport type FloatingButtonGroupOrientation = \"horizontal\" | \"vertical\";\n\nexport interface FloatingButtonGroupAction {\n type?: \"action\";\n /** Stable key, also passed to onAction. */\n id: string;\n /** Visible label, and the accessible name when the item shows only its icon. */\n label: string;\n /** An icon before the label. Mark it `aria-hidden`. */\n icon?: ReactNode;\n /** Shows only the icon. The label moves into a tooltip and the accessible name. Overrides the group's iconOnly. */\n iconOnly?: boolean;\n onSelect?: () => void;\n isDisabled?: boolean;\n /** Marks an action that switches a mode on, such as Present. Sets aria-pressed and keeps a quiet tint while on. */\n isPressed?: boolean;\n /** A shortcut hint shown in the tooltip, such as \"⌘Z\". The component does not bind the key. */\n shortcut?: string;\n /** Other labels this item can switch to, such as [\"Copied\"] for Share. The button keeps the width of the widest, so a label change never moves anything. */\n reserveLabels?: readonly string[];\n}\n\nexport interface FloatingButtonGroupSeparator {\n type: \"separator\";\n id?: string;\n}\n\nexport type FloatingButtonGroupItem = FloatingButtonGroupAction | FloatingButtonGroupSeparator;\n\nexport interface FloatingButtonGroupProps {\n items: readonly FloatingButtonGroupItem[];\n /** Accessible name of the toolbar, such as \"Board actions\". */\n label: string;\n /** `muted` sits quietly on a page; `floating` raises the tray with the floating shadow for overlays such as a selection toolbar. @default \"muted\" */\n variant?: FloatingButtonGroupVariant;\n /** @default \"md\" */\n size?: FloatingButtonGroupSize;\n /** @default \"horizontal\" */\n orientation?: FloatingButtonGroupOrientation;\n /** Shows every item as an icon only, with its label in a tooltip. Items with their own iconOnly win. */\n iconOnly?: boolean;\n /** Side of the item tooltips. Defaults to top for a row and right for a column. */\n tooltipSide?: \"top\" | \"bottom\" | \"left\" | \"right\";\n /** Called with the item id after the item's own onSelect. */\n onAction?: (id: string) => void;\n /** Extra classes. Merged last, so they win conflicts with ours. */\n className?: string;\n}\n\nconst isAction = (item: FloatingButtonGroupItem): item is FloatingButtonGroupAction =>\n item.type !== \"separator\";\n\nconst PHASE = \"col-start-1 row-start-1 inline-flex items-center gap-1.5 whitespace-nowrap\";\n\nfunction LeavingPhase({\n id,\n onDone,\n children,\n}: {\n id: number;\n onDone: (id: number) => void;\n children: ReactNode;\n}) {\n const remove = useCallback(() => onDone(id), [onDone, id]);\n useExitBackstop(true, remove);\n return (\n <span\n aria-hidden=\"true\"\n onAnimationEnd={(event) => {\n if (event.target === event.currentTarget) remove();\n }}\n className={cn(PHASE + \" motion-safe:animate-label-out motion-reduce:animate-fade-out\")}\n >\n {children}\n </span>\n );\n}\n\n/**\n * Icon and label. Every label the item can show is laid out invisibly in the\n * same grid cell, so the button always has the width of the widest one: a label\n * change crossfades in place and never resizes the button, its neighbours or the\n * tray.\n */\nfunction ItemBody({\n label,\n icon,\n iconOnly,\n reserve,\n}: {\n label: string;\n icon?: ReactNode;\n iconOnly: boolean;\n reserve: readonly string[];\n}) {\n const phaseRef = useRef<HTMLSpanElement>(null);\n const node = (\n <>\n {icon ? <span className=\"inline-flex flex-none [&_svg]:size-(--icon-sm)\">{icon}</span> : null}\n {iconOnly ? null : <span className=\"block\">{label}</span>}\n </>\n );\n const { leaving, changed, remove } = useLeavingItems(label, node, () => phaseRef.current);\n const ghosts = iconOnly ? [] : Array.from(new Set([label, ...reserve]));\n return (\n <span className=\"relative z-2 inline-grid items-center justify-items-center group-aria-[orientation=vertical]/fg:justify-items-start\">\n {ghosts.map((text) => (\n <span\n key={text}\n aria-hidden=\"true\"\n className={cn(PHASE + \" pointer-events-none invisible\")}\n >\n {icon ? <span className=\"block size-4 flex-none\" /> : null}\n <span className=\"block\">{text}</span>\n </span>\n ))}\n {leaving.map((entry) => (\n <LeavingPhase key={entry.id} id={entry.id} onDone={remove}>\n {entry.value}\n </LeavingPhase>\n ))}\n <span\n key={label}\n ref={phaseRef}\n className={cn(\n PHASE + (changed ? \" motion-safe:animate-label-in motion-reduce:animate-fade-in\" : \"\"),\n )}\n >\n {node}\n </span>\n </span>\n );\n}\n\nfunction TipContent({ label, shortcut }: { label: string; shortcut?: string }) {\n return (\n <span className=\"inline-flex items-baseline gap-3 whitespace-nowrap\">\n {label}\n {shortcut ? <kbd className=\"font-[inherit] tabular-nums opacity-70\">{shortcut}</kbd> : null}\n </span>\n );\n}\n\nconst MORPH =\n \"translate var(--duration-morph) var(--ease-morph), width var(--duration-morph) var(--ease-morph), height var(--duration-morph) var(--ease-morph)\";\nconst SCALE = \"scale var(--duration-snappy) var(--ease-snappy)\";\nconst BACKGROUND = \"background-color var(--duration-quick) var(--ease-settle)\";\nconst FADE_IN = \"opacity var(--duration-quick) var(--ease-settle)\";\nconst FADE_OUT = \"opacity var(--duration-standard) var(--ease-settle)\";\nconst FADE_INSTANT = \"opacity var(--duration-instant) var(--ease-settle)\";\n\nconst focusRing =\n \"focus-visible:outline-solid focus-visible:outline-(length:--focus-ring-width) focus-visible:outline-offset-(--focus-ring-offset) focus-visible:outline-(--color-ring)\";\n\n/**\n * Separate soft buttons in a quiet tray. One shared highlight morphs, in\n * position and size, to whichever button the pointer or keyboard focus is on,\n * fades when the pointer leaves the tray, and settles darker in place while a\n * button is pressed. It is the toolbar's main hover and focus indicator. Arrow\n * keys move focus, Home and End jump to the ends, Enter and Space act.\n *\n * @example\n * <FloatingButtonGroup label=\"Board actions\" items={[{ id: \"undo\", label: \"Undo\", icon: <UndoIcon aria-hidden />, iconOnly: true, shortcut: \"⌘Z\" }]} />\n */\nexport function FloatingButtonGroup({\n items,\n label,\n variant = \"muted\",\n size = \"md\",\n orientation = \"horizontal\",\n iconOnly: groupIconOnly = false,\n tooltipSide,\n onAction,\n className,\n}: FloatingButtonGroupProps) {\n const tray = useRef<HTMLDivElement>(null);\n const highlight = useRef<HTMLSpanElement>(null);\n const nodes = useRef(new Map<string, HTMLButtonElement>());\n const [hoverId, setHoverId] = useState<string | null>(null);\n const [focusId, setFocusId] = useState<string | null>(null);\n const [pressing, setPressing] = useState(false);\n const [tabStop, setTabStop] = useState<string | null>(null);\n\n const actions = items.filter(isAction);\n const byId = new Map(actions.map((action) => [action.id, action]));\n const enabled = (id: string | null) => !!id && !!byId.get(id) && !byId.get(id)?.isDisabled;\n // Pointer wins over keyboard focus while it is in the tray; a disabled item under the pointer hands back to focus.\n const activeId = enabled(hoverId) ? hoverId : focusId && byId.has(focusId) ? focusId : null;\n const stop = enabled(tabStop)\n ? tabStop\n : (actions.find((action) => !action.isDisabled)?.id ?? null);\n const vertical = orientation === \"vertical\";\n const side = tooltipSide ?? (vertical ? \"right\" : \"top\");\n const idsKey = actions.map((action) => action.id).join(\"\\u0000\");\n\n const visible = useRef(false);\n const traveling = useRef(false);\n const travelTimer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const activeRef = useRef(activeId);\n const pressingRef = useRef(pressing);\n\n /** The button's box in tray coordinates, exact to the device pixel (offsetLeft rounds to whole pixels) and free of ancestor transforms. */\n const measure = useCallback((node: HTMLElement) => {\n const root = tray.current;\n if (!root) return null;\n const outer = root.getBoundingClientRect();\n const box = node.getBoundingClientRect();\n const unscale = outer.width ? root.offsetWidth / outer.width : 1;\n const dpr = window.devicePixelRatio || 1;\n const snap = (value: number) => Math.round(value * unscale * dpr) / dpr;\n return {\n x: snap(box.left - outer.left) - root.clientLeft,\n y: snap(box.top - outer.top) - root.clientTop,\n width: snap(box.width),\n height: snap(box.height),\n };\n }, []);\n\n /** Moves the highlight to a button. \"move\" travels on the morph spring; \"follow\" keeps up with a layout change without travelling. */\n const place = useCallback(\n (id: string | null, mode: \"move\" | \"follow\") => {\n const el = highlight.current;\n if (!el) return;\n const reduced = prefersReducedMotion();\n const node = id ? nodes.current.get(id) : undefined;\n if (!node) {\n el.style.transition = [BACKGROUND, SCALE, reduced ? FADE_INSTANT : FADE_OUT].join(\", \");\n el.style.opacity = \"0\";\n visible.current = false;\n return;\n }\n const rect = measure(node);\n if (!rect) return;\n const fade = reduced ? FADE_INSTANT : FADE_IN;\n // Travel between buttons on the morph spring. Appearing from nothing, and every move with reduced motion, lands in place.\n const travel = !reduced && visible.current && (mode === \"move\" || traveling.current);\n if (travel) {\n traveling.current = true;\n clearTimeout(travelTimer.current);\n travelTimer.current = setTimeout(() => {\n traveling.current = false;\n }, 740);\n el.style.transition = [MORPH, SCALE, fade, BACKGROUND].join(\", \");\n } else {\n traveling.current = false;\n el.style.transition = [SCALE, fade, BACKGROUND].join(\", \");\n if (!visible.current && !reduced) {\n // It grows into place as it appears.\n el.style.transition = \"none\";\n el.style.scale = \"0.94\";\n void el.offsetWidth;\n el.style.transition = [SCALE, fade, BACKGROUND].join(\", \");\n el.style.scale = pressingRef.current ? \"0.965\" : \"1\";\n }\n }\n el.style.translate = rect.x + \"px \" + rect.y + \"px\";\n el.style.width = rect.width + \"px\";\n el.style.height = rect.height + \"px\";\n el.style.opacity = \"1\";\n visible.current = true;\n },\n [measure],\n );\n\n useIsomorphicLayoutEffect(() => {\n activeRef.current = activeId;\n place(activeId, \"move\");\n }, [activeId, place]);\n\n useEffect(() => {\n pressingRef.current = pressing;\n const el = highlight.current;\n if (!el) return;\n el.style.scale = pressing && activeId ? \"0.965\" : \"1\";\n }, [activeId, pressing]);\n\n // A font that loads or a container that reflows moves the buttons; the highlight follows without travel.\n // The follow is deferred a frame, so moving it inside the notification cannot report a ResizeObserver loop.\n useEffect(() => {\n const root = tray.current;\n if (!root || typeof ResizeObserver === \"undefined\") return;\n let frame = 0;\n const observer = new ResizeObserver(() => {\n cancelAnimationFrame(frame);\n frame = requestAnimationFrame(() => {\n if (activeRef.current) place(activeRef.current, \"follow\");\n });\n });\n observer.observe(root);\n nodes.current.forEach((node) => observer.observe(node));\n return () => {\n cancelAnimationFrame(frame);\n observer.disconnect();\n };\n }, [idsKey, place]);\n\n // A native listener, because React bubbles pointer events through portals: moving from a button onto its tooltip\n // would not count as leaving the tray, and the highlight would stay behind.\n useEffect(() => {\n const root = tray.current;\n if (!root) return;\n const leave = () => {\n setHoverId(null);\n setPressing(false);\n };\n root.addEventListener(\"pointerleave\", leave);\n return () => root.removeEventListener(\"pointerleave\", leave);\n }, []);\n\n useEffect(() => () => clearTimeout(travelTimer.current), []);\n\n const buttons = () =>\n Array.from(tray.current?.querySelectorAll<HTMLButtonElement>(\"[data-fg-item]\") ?? []);\n\n const onKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n const all = buttons();\n const index = all.findIndex((node) => node === document.activeElement);\n if (index < 0) return;\n const next = vertical ? \"ArrowDown\" : \"ArrowRight\";\n const previous = vertical ? \"ArrowUp\" : \"ArrowLeft\";\n const usable = (node: HTMLButtonElement) => node.getAttribute(\"aria-disabled\") !== \"true\";\n let target: HTMLButtonElement | undefined;\n if (event.key === \"Home\") target = all.find(usable);\n else if (event.key === \"End\") target = [...all].reverse().find(usable);\n else if (event.key === next || event.key === previous) {\n const step = event.key === next ? 1 : -1;\n for (let offset = 1; offset <= all.length; offset += 1) {\n const candidate = all[(index + step * offset + all.length * offset) % all.length]!;\n if (usable(candidate)) {\n target = candidate;\n break;\n }\n }\n } else return;\n event.preventDefault();\n if (!target) return;\n // The keyboard takes the highlight back until the pointer moves again.\n setHoverId(null);\n target.focus();\n };\n\n const onBlur = (event: FocusEvent<HTMLDivElement>) => {\n if (tray.current?.contains(event.relatedTarget)) return;\n setFocusId(null);\n setPressing(false);\n };\n\n return (\n <div\n ref={tray}\n role=\"toolbar\"\n aria-label={label}\n aria-orientation={orientation}\n data-variant={variant}\n data-size={size}\n onKeyDown={onKeyDown}\n onBlur={onBlur}\n className={cn(\"floating-group group/fg\", className)}\n >\n <span\n ref={highlight}\n aria-hidden=\"true\"\n data-pressing={pressing && activeId ? \"\" : undefined}\n className=\"floating-group-highlight\"\n />\n {items.map((item, position) => {\n if (!isAction(item))\n return (\n <span\n key={item.id ?? \"separator-\" + position}\n role=\"separator\"\n aria-orientation={vertical ? \"horizontal\" : \"vertical\"}\n className=\"floating-group-separator\"\n />\n );\n const {\n id,\n label: itemLabel,\n icon,\n onSelect,\n isDisabled = false,\n isPressed,\n shortcut,\n reserveLabels = [],\n } = item;\n const iconOnly = !!icon && (item.iconOnly ?? groupIconOnly);\n const button = (\n <button\n ref={(node) => {\n if (node) nodes.current.set(id, node);\n else nodes.current.delete(id);\n }}\n type=\"button\"\n data-fg-item=\"\"\n data-active={activeId === id ? \"\" : undefined}\n data-icon={icon ? \"\" : undefined}\n data-icon-only={iconOnly ? \"\" : undefined}\n aria-label={itemLabel}\n aria-pressed={isPressed === undefined ? undefined : isPressed}\n aria-disabled={isDisabled || undefined}\n tabIndex={stop === id ? 0 : -1}\n onPointerMove={(event) => {\n if (event.pointerType === \"mouse\" || event.pointerType === \"pen\") setHoverId(id);\n }}\n onPointerDown={(event) => {\n if (isDisabled || event.button !== 0) return;\n setHoverId(id);\n setPressing(true);\n }}\n onPointerUp={() => setPressing(false)}\n onPointerCancel={() => setPressing(false)}\n onPointerLeave={() => setPressing(false)}\n onKeyDown={(event) => {\n if ((event.key === \"Enter\" || event.key === \" \") && !event.repeat && !isDisabled)\n setPressing(true);\n }}\n onKeyUp={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") setPressing(false);\n }}\n onFocus={(event) => {\n setTabStop(id);\n let keyboard = true;\n try {\n keyboard = event.currentTarget.matches(\":focus-visible\");\n } catch {\n /* older engines */\n }\n setFocusId(keyboard ? id : null);\n }}\n onClick={() => {\n if (isDisabled) return;\n onSelect?.();\n onAction?.(id);\n }}\n className={cn(\"floating-group-item \" + focusRing)}\n >\n <ItemBody label={itemLabel} icon={icon} iconOnly={iconOnly} reserve={reserveLabels} />\n </button>\n );\n // Tooltips render no wrapper element, so every button stays a direct child of the tray and measures against it.\n if (!iconOnly && !shortcut) return <Fragment key={id}>{button}</Fragment>;\n return (\n <TooltipTrigger key={id}>\n <Focusable>{button}</Focusable>\n <Tooltip placement={side}>\n <TipContent label={itemLabel} shortcut={shortcut} />\n </Tooltip>\n </TooltipTrigger>\n );\n })}\n </div>\n );\n}\n"],"mappings":";;;;;;;;AA0EA,MAAM,YAAY,SAChB,KAAK,SAAS;AAEhB,MAAM,QAAQ;AAEd,SAAS,aAAa,EACpB,IACA,QACA,YAKC;CACD,MAAM,SAAS,kBAAkB,OAAO,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC;CACzD,gBAAgB,MAAM,MAAM;CAC5B,OACE,oBAAC,QAAD;EACE,eAAY;EACZ,iBAAiB,UAAU;GACzB,IAAI,MAAM,WAAW,MAAM,eAAe,OAAO;EACnD;EACA,WAAW,GAAG,QAAQ,+DAA+D;EAEpF;CACG,CAAA;AAEV;;;;;;;AAQA,SAAS,SAAS,EAChB,OACA,MACA,UACA,WAMC;CACD,MAAM,WAAW,OAAwB,IAAI;CAC7C,MAAM,OACJ,qBAAA,YAAA,EAAA,UAAA,CACG,OAAO,oBAAC,QAAD;EAAM,WAAU;EAAkD,UAAA;CAAW,CAAA,IAAI,MACxF,WAAW,OAAO,oBAAC,QAAD;EAAM,WAAU;EAAS,UAAA;CAAY,CAAA,CACxD,EAAA,CAAA;CAEJ,MAAM,EAAE,SAAS,SAAS,WAAW,gBAAgB,OAAO,YAAY,SAAS,OAAO;CACxF,MAAM,SAAS,WAAW,CAAC,IAAI,MAAM,qBAAK,IAAI,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,CAAC;CACtE,OACE,qBAAC,QAAD;EAAM,WAAU;EAAhB,UAAA;GACG,OAAO,KAAK,SACX,qBAAC,QAAD;IAEE,eAAY;IACZ,WAAW,GAAG,QAAQ,gCAAgC;IAHxD,UAAA,CAKG,OAAO,oBAAC,QAAD,EAAM,WAAU,yBAA0B,CAAA,IAAI,MACtD,oBAAC,QAAD;KAAM,WAAU;KAAS,UAAA;IAAW,CAAA,CAChC;GANC,GAAA,IAMD,CACP;GACA,QAAQ,KAAK,UACZ,oBAAC,cAAD;IAA6B,IAAI,MAAM;IAAI,QAAQ;IAChD,UAAA,MAAM;GACK,GAFK,MAAM,EAEX,CACf;GACD,oBAAC,QAAD;IAEE,KAAK;IACL,WAAW,GACT,SAAS,UAAU,gEAAgE,GACrF;IAEC,UAAA;GACG,GAPC,KAOD;EACF;;AAEV;AAEA,SAAS,WAAW,EAAE,OAAO,YAAkD;CAC7E,OACE,qBAAC,QAAD;EAAM,WAAU;EAAhB,UAAA,CACG,OACA,WAAW,oBAAC,OAAD;GAAK,WAAU;GAA0C,UAAA;EAAc,CAAA,IAAI,IACnF;;AAEV;AAEA,MAAM,QACJ;AACF,MAAM,QAAQ;AACd,MAAM,aAAa;AACnB,MAAM,UAAU;AAChB,MAAM,WAAW;AACjB,MAAM,eAAe;;;;;;;;;;;AAerB,SAAgB,oBAAoB,EAClC,OACA,OACA,UAAU,SACV,OAAO,MACP,cAAc,cACd,UAAU,gBAAgB,OAC1B,aACA,UACA,aAC2B;CAC3B,MAAM,OAAO,OAAuB,IAAI;CACxC,MAAM,YAAY,OAAwB,IAAI;CAC9C,MAAM,QAAQ,uBAAO,IAAI,IAA+B,CAAC;CACzD,MAAM,CAAC,SAAS,cAAc,SAAwB,IAAI;CAC1D,MAAM,CAAC,SAAS,cAAc,SAAwB,IAAI;CAC1D,MAAM,CAAC,UAAU,eAAe,SAAS,KAAK;CAC9C,MAAM,CAAC,SAAS,cAAc,SAAwB,IAAI;CAE1D,MAAM,UAAU,MAAM,OAAO,QAAQ;CACrC,MAAM,OAAO,IAAI,IAAI,QAAQ,KAAK,WAAW,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC;CACjE,MAAM,WAAW,OAAsB,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,IAAI,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE;CAEhF,MAAM,WAAW,QAAQ,OAAO,IAAI,UAAU,WAAW,KAAK,IAAI,OAAO,IAAI,UAAU;CACvF,MAAM,OAAO,QAAQ,OAAO,IACxB,UACC,QAAQ,MAAM,WAAW,CAAC,OAAO,UAAU,CAAC,EAAE,MAAM;CACzD,MAAM,WAAW,gBAAgB;CACjC,MAAM,OAAO,gBAAgB,WAAW,UAAU;CAClD,MAAM,SAAS,QAAQ,KAAK,WAAW,OAAO,EAAE,CAAC,CAAC,KAAK,IAAQ;CAE/D,MAAM,UAAU,OAAO,KAAK;CAC5B,MAAM,YAAY,OAAO,KAAK;CAC9B,MAAM,cAAc,OAAkD,KAAA,CAAS;CAC/E,MAAM,YAAY,OAAO,QAAQ;CACjC,MAAM,cAAc,OAAO,QAAQ;;CAGnC,MAAM,UAAU,aAAa,SAAsB;EACjD,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,MAAM,OAAO;EAClB,MAAM,QAAQ,KAAK,sBAAsB;EACzC,MAAM,MAAM,KAAK,sBAAsB;EACvC,MAAM,UAAU,MAAM,QAAQ,KAAK,cAAc,MAAM,QAAQ;EAC/D,MAAM,MAAM,OAAO,oBAAoB;EACvC,MAAM,QAAQ,UAAkB,KAAK,MAAM,QAAQ,UAAU,GAAG,IAAI;EACpE,OAAO;GACL,GAAG,KAAK,IAAI,OAAO,MAAM,IAAI,IAAI,KAAK;GACtC,GAAG,KAAK,IAAI,MAAM,MAAM,GAAG,IAAI,KAAK;GACpC,OAAO,KAAK,IAAI,KAAK;GACrB,QAAQ,KAAK,IAAI,MAAM;EACzB;CACF,GAAG,CAAC,CAAC;;CAGL,MAAM,QAAQ,aACX,IAAmB,SAA4B;EAC9C,MAAM,KAAK,UAAU;EACrB,IAAI,CAAC,IAAI;EACT,MAAM,UAAU,qBAAqB;EACrC,MAAM,OAAO,KAAK,MAAM,QAAQ,IAAI,EAAE,IAAI,KAAA;EAC1C,IAAI,CAAC,MAAM;GACT,GAAG,MAAM,aAAa;IAAC;IAAY;IAAO,UAAU,eAAe;GAAQ,CAAC,CAAC,KAAK,IAAI;GACtF,GAAG,MAAM,UAAU;GACnB,QAAQ,UAAU;GAClB;EACF;EACA,MAAM,OAAO,QAAQ,IAAI;EACzB,IAAI,CAAC,MAAM;EACX,MAAM,OAAO,UAAU,eAAe;EAGtC,IADe,CAAC,WAAW,QAAQ,YAAY,SAAS,UAAU,UAAU,UAChE;GACV,UAAU,UAAU;GACpB,aAAa,YAAY,OAAO;GAChC,YAAY,UAAU,iBAAiB;IACrC,UAAU,UAAU;GACtB,GAAG,GAAG;GACN,GAAG,MAAM,aAAa;IAAC;IAAO;IAAO;IAAM;GAAU,CAAC,CAAC,KAAK,IAAI;EAClE,OAAO;GACL,UAAU,UAAU;GACpB,GAAG,MAAM,aAAa;IAAC;IAAO;IAAM;GAAU,CAAC,CAAC,KAAK,IAAI;GACzD,IAAI,CAAC,QAAQ,WAAW,CAAC,SAAS;IAEhC,GAAG,MAAM,aAAa;IACtB,GAAG,MAAM,QAAQ;IACjB,GAAQ;IACR,GAAG,MAAM,aAAa;KAAC;KAAO;KAAM;IAAU,CAAC,CAAC,KAAK,IAAI;IACzD,GAAG,MAAM,QAAQ,YAAY,UAAU,UAAU;GACnD;EACF;EACA,GAAG,MAAM,YAAY,KAAK,IAAI,QAAQ,KAAK,IAAI;EAC/C,GAAG,MAAM,QAAQ,KAAK,QAAQ;EAC9B,GAAG,MAAM,SAAS,KAAK,SAAS;EAChC,GAAG,MAAM,UAAU;EACnB,QAAQ,UAAU;CACpB,GACA,CAAC,OAAO,CACV;CAEA,gCAAgC;EAC9B,UAAU,UAAU;EACpB,MAAM,UAAU,MAAM;CACxB,GAAG,CAAC,UAAU,KAAK,CAAC;CAEpB,gBAAgB;EACd,YAAY,UAAU;EACtB,MAAM,KAAK,UAAU;EACrB,IAAI,CAAC,IAAI;EACT,GAAG,MAAM,QAAQ,YAAY,WAAW,UAAU;CACpD,GAAG,CAAC,UAAU,QAAQ,CAAC;CAIvB,gBAAgB;EACd,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,QAAQ,OAAO,mBAAmB,aAAa;EACpD,IAAI,QAAQ;EACZ,MAAM,WAAW,IAAI,qBAAqB;GACxC,qBAAqB,KAAK;GAC1B,QAAQ,4BAA4B;IAClC,IAAI,UAAU,SAAS,MAAM,UAAU,SAAS,QAAQ;GAC1D,CAAC;EACH,CAAC;EACD,SAAS,QAAQ,IAAI;EACrB,MAAM,QAAQ,SAAS,SAAS,SAAS,QAAQ,IAAI,CAAC;EACtD,aAAa;GACX,qBAAqB,KAAK;GAC1B,SAAS,WAAW;EACtB;CACF,GAAG,CAAC,QAAQ,KAAK,CAAC;CAIlB,gBAAgB;EACd,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,MAAM;EACX,MAAM,cAAc;GAClB,WAAW,IAAI;GACf,YAAY,KAAK;EACnB;EACA,KAAK,iBAAiB,gBAAgB,KAAK;EAC3C,aAAa,KAAK,oBAAoB,gBAAgB,KAAK;CAC7D,GAAG,CAAC,CAAC;CAEL,sBAAsB,aAAa,YAAY,OAAO,GAAG,CAAC,CAAC;CAE3D,MAAM,gBACJ,MAAM,KAAK,KAAK,SAAS,iBAAoC,gBAAgB,KAAK,CAAC,CAAC;CAEtF,MAAM,aAAa,UAAyC;EAC1D,MAAM,MAAM,QAAQ;EACpB,MAAM,QAAQ,IAAI,WAAW,SAAS,SAAS,SAAS,aAAa;EACrE,IAAI,QAAQ,GAAG;EACf,MAAM,OAAO,WAAW,cAAc;EACtC,MAAM,WAAW,WAAW,YAAY;EACxC,MAAM,UAAU,SAA4B,KAAK,aAAa,eAAe,MAAM;EACnF,IAAI;EACJ,IAAI,MAAM,QAAQ,QAAQ,SAAS,IAAI,KAAK,MAAM;OAC7C,IAAI,MAAM,QAAQ,OAAO,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,MAAM;OAChE,IAAI,MAAM,QAAQ,QAAQ,MAAM,QAAQ,UAAU;GACrD,MAAM,OAAO,MAAM,QAAQ,OAAO,IAAI;GACtC,KAAK,IAAI,SAAS,GAAG,UAAU,IAAI,QAAQ,UAAU,GAAG;IACtD,MAAM,YAAY,KAAK,QAAQ,OAAO,SAAS,IAAI,SAAS,UAAU,IAAI;IAC1E,IAAI,OAAO,SAAS,GAAG;KACrB,SAAS;KACT;IACF;GACF;EACF,OAAO;EACP,MAAM,eAAe;EACrB,IAAI,CAAC,QAAQ;EAEb,WAAW,IAAI;EACf,OAAO,MAAM;CACf;CAEA,MAAM,UAAU,UAAsC;EACpD,IAAI,KAAK,SAAS,SAAS,MAAM,aAAa,GAAG;EACjD,WAAW,IAAI;EACf,YAAY,KAAK;CACnB;CAEA,OACE,qBAAC,OAAD;EACE,KAAK;EACL,MAAK;EACL,cAAY;EACZ,oBAAkB;EAClB,gBAAc;EACd,aAAW;EACA;EACH;EACR,WAAW,GAAG,2BAA2B,SAAS;EATpD,UAAA,CAWE,oBAAC,QAAD;GACE,KAAK;GACL,eAAY;GACZ,iBAAe,YAAY,WAAW,KAAK,KAAA;GAC3C,WAAU;EACX,CAAA,GACA,MAAM,KAAK,MAAM,aAAa;GAC7B,IAAI,CAAC,SAAS,IAAI,GAChB,OACE,oBAAC,QAAD;IAEE,MAAK;IACL,oBAAkB,WAAW,eAAe;IAC5C,WAAU;GACX,GAJM,KAAK,MAAM,eAAe,QAIhC;GAEL,MAAM,EACJ,IACA,OAAO,WACP,MACA,UACA,aAAa,OACb,WACA,UACA,gBAAgB,CAAC,MACf;GACJ,MAAM,WAAW,CAAC,CAAC,SAAS,KAAK,YAAY;GAC7C,MAAM,SACJ,oBAAC,UAAD;IACE,MAAM,SAAS;KACb,IAAI,MAAM,MAAM,QAAQ,IAAI,IAAI,IAAI;UAC/B,MAAM,QAAQ,OAAO,EAAE;IAC9B;IACA,MAAK;IACL,gBAAa;IACb,eAAa,aAAa,KAAK,KAAK,KAAA;IACpC,aAAW,OAAO,KAAK,KAAA;IACvB,kBAAgB,WAAW,KAAK,KAAA;IAChC,cAAY;IACZ,gBAAc,cAAc,KAAA,IAAY,KAAA,IAAY;IACpD,iBAAe,cAAc,KAAA;IAC7B,UAAU,SAAS,KAAK,IAAI;IAC5B,gBAAgB,UAAU;KACxB,IAAI,MAAM,gBAAgB,WAAW,MAAM,gBAAgB,OAAO,WAAW,EAAE;IACjF;IACA,gBAAgB,UAAU;KACxB,IAAI,cAAc,MAAM,WAAW,GAAG;KACtC,WAAW,EAAE;KACb,YAAY,IAAI;IAClB;IACA,mBAAmB,YAAY,KAAK;IACpC,uBAAuB,YAAY,KAAK;IACxC,sBAAsB,YAAY,KAAK;IACvC,YAAY,UAAU;KACpB,KAAK,MAAM,QAAQ,WAAW,MAAM,QAAQ,QAAQ,CAAC,MAAM,UAAU,CAAC,YACpE,YAAY,IAAI;IACpB;IACA,UAAU,UAAU;KAClB,IAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAK,YAAY,KAAK;IACnE;IACA,UAAU,UAAU;KAClB,WAAW,EAAE;KACb,IAAI,WAAW;KACf,IAAI;MACF,WAAW,MAAM,cAAc,QAAQ,gBAAgB;KACzD,QAAQ,CAER;KACA,WAAW,WAAW,KAAK,IAAI;IACjC;IACA,eAAe;KACb,IAAI,YAAY;KAChB,WAAW;KACX,WAAW,EAAE;IACf;IACA,WAAW,GAAG,2LAAkC;IAEhD,UAAA,oBAAC,UAAD;KAAU,OAAO;KAAiB;KAAgB;KAAU,SAAS;IAAgB,CAAA;GAC/E,CAAA;GAGV,IAAI,CAAC,YAAY,CAAC,UAAU,OAAO,oBAAC,UAAD,EAAA,UAAoB,OAAiB,GAAtB,EAAsB;GACxE,OACE,qBAACA,kBAAD,EAAA,UAAA,CACE,oBAAC,WAAD,EAAA,UAAY,OAAkB,CAAA,GAC9B,oBAACC,WAAD;IAAS,WAAW;IAClB,UAAA,oBAAC,YAAD;KAAY,OAAO;KAAqB;IAAW,CAAA;GAC5C,CAAA,CACK,EAAA,GALK,EAKL;EAEpB,CAAC,CACE;;AAET"}
@@ -0,0 +1,2 @@
1
+ import { FloatingButtonGroup, FloatingButtonGroupAction, FloatingButtonGroupItem, FloatingButtonGroupOrientation, FloatingButtonGroupProps, FloatingButtonGroupSeparator, FloatingButtonGroupSize, FloatingButtonGroupVariant } from "./floating-button-group.js";
2
+ export { FloatingButtonGroup, type FloatingButtonGroupAction, type FloatingButtonGroupItem, type FloatingButtonGroupOrientation, type FloatingButtonGroupProps, type FloatingButtonGroupSeparator, type FloatingButtonGroupSize, type FloatingButtonGroupVariant };
@@ -0,0 +1,2 @@
1
+ import { FloatingButtonGroup } from "./floating-button-group.js";
2
+ export { FloatingButtonGroup };
@@ -0,0 +1,45 @@
1
+ import { ComponentPropsWithoutRef } from "react";
2
+ //#region src/gauge/gauge.d.ts
3
+ /**
4
+ * Gauge: one value against a range, as a ring open at the bottom with the
5
+ * number at its centre. Use it for a score or a fill level; use Progress for a
6
+ * task that finishes.
7
+ *
8
+ * The ring fills the first time it is seen, slowly and without overshoot, like
9
+ * a ring closing. After that it springs to each new value with a little life
10
+ * while the count follows without overshooting. A band that starts at
11
+ * `from` sets the colour and names the state ("Healthy", "At risk"): the
12
+ * highest band the value reaches wins, and it changes exactly as the count
13
+ * crosses the threshold, so state never rests on colour alone. The label,
14
+ * status and detail rise in when they change, from the side the value moved
15
+ * toward.
16
+ *
17
+ * Plain SVG and CSS. One small spring tween writes the ring and the count
18
+ * straight to the DOM. The ring is a `meter` for assistive technology.
19
+ */
20
+ export type GaugeTone = "primary" | "success" | "warning" | "danger";
21
+ export interface GaugeThreshold {
22
+ /** The band starts at this value (in the same unit as `value`). */
23
+ from: number;
24
+ tone: GaugeTone;
25
+ /** Names the state. Shown under the number and announced with the value. */
26
+ label: string;
27
+ }
28
+ export interface GaugeProps extends Omit<ComponentPropsWithoutRef<"figure">, "children"> {
29
+ value: number;
30
+ /** @default 0 */
31
+ min?: number;
32
+ /** @default 100 */
33
+ max?: number;
34
+ /** What is measured. Names the meter. */
35
+ label: string;
36
+ /** A line under the label, such as "Up 4 from last week". */
37
+ detail?: string;
38
+ /** The colour when no band applies. @default "primary" */
39
+ tone?: GaugeTone;
40
+ /** Bands that set the tone and name the state. */
41
+ thresholds?: GaugeThreshold[];
42
+ }
43
+ export declare const Gauge: import("react").ForwardRefExoticComponent<GaugeProps & import("react").RefAttributes<HTMLElement>>;
44
+ //#endregion
45
+ //# sourceMappingURL=gauge.d.ts.map