@passui/react 0.1.46 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (429) hide show
  1. package/README.md +29 -109
  2. package/THIRD_PARTY_NOTICES.md +29 -0
  3. package/dist/accordion.d.ts +15 -0
  4. package/dist/accordion.js +93 -0
  5. package/dist/alert-dialog.d.ts +26 -0
  6. package/dist/alert-dialog.js +142 -0
  7. package/dist/alert.d.ts +10 -0
  8. package/dist/alert.js +28 -0
  9. package/dist/{types/src/components/ambient/ambient.d.ts → ambient.d.ts} +4 -4
  10. package/dist/ambient.js +22 -0
  11. package/dist/{types/src/appearance → appearance}/platform.d.ts +3 -3
  12. package/dist/appearance/platform.js +43 -0
  13. package/dist/appearance/theme.d.ts +71 -0
  14. package/dist/appearance/theme.js +236 -0
  15. package/dist/appearance.d.ts +3 -0
  16. package/dist/appearance.js +3 -0
  17. package/dist/{types/src/components/aspect-ratio/aspect-ratio.d.ts → aspect-ratio.d.ts} +4 -4
  18. package/dist/aspect-ratio.js +17 -0
  19. package/dist/avatar.d.ts +5 -0
  20. package/dist/avatar.js +43 -0
  21. package/dist/badge.d.ts +8 -0
  22. package/dist/badge.js +21 -0
  23. package/dist/breadcrumb.d.ts +13 -0
  24. package/dist/breadcrumb.js +63 -0
  25. package/dist/button-group.d.ts +5 -0
  26. package/dist/button-group.js +14 -0
  27. package/dist/button.d.ts +21 -0
  28. package/dist/button.js +58 -0
  29. package/dist/calendar.d.ts +35 -0
  30. package/dist/calendar.js +225 -0
  31. package/dist/card.d.ts +9 -0
  32. package/dist/card.js +54 -0
  33. package/dist/chart.d.ts +30 -0
  34. package/dist/chart.js +226 -0
  35. package/dist/checkbox.d.ts +13 -0
  36. package/dist/checkbox.js +53 -0
  37. package/dist/{types/src/lib/clipboard.d.ts → clipboard.d.ts} +1 -1
  38. package/dist/clipboard.js +16 -0
  39. package/dist/cn.d.ts +2 -0
  40. package/dist/cn.js +10 -0
  41. package/dist/code-block.d.ts +34 -0
  42. package/dist/code-block.js +87 -0
  43. package/dist/collapsible.d.ts +13 -0
  44. package/dist/collapsible.js +49 -0
  45. package/dist/combobox.d.ts +25 -0
  46. package/dist/combobox.js +112 -0
  47. package/dist/command.d.ts +22 -0
  48. package/dist/command.js +129 -0
  49. package/dist/components/toast/toast-store.d.ts +60 -0
  50. package/dist/components/toast/toast-store.js +96 -0
  51. package/dist/{types/src/components → components}/toast/toaster.d.ts +4 -4
  52. package/dist/components/toast/toaster.js +345 -0
  53. package/dist/context-menu.d.ts +2 -0
  54. package/dist/context-menu.js +2 -0
  55. package/dist/conversation.d.ts +48 -0
  56. package/dist/conversation.js +202 -0
  57. package/dist/date-time-picker.d.ts +50 -0
  58. package/dist/date-time-picker.js +235 -0
  59. package/dist/date.d.ts +50 -0
  60. package/dist/date.js +77 -0
  61. package/dist/dialog.d.ts +21 -0
  62. package/dist/dialog.js +113 -0
  63. package/dist/drawer.d.ts +30 -0
  64. package/dist/drawer.js +140 -0
  65. package/dist/dropdown-menu.d.ts +56 -0
  66. package/dist/dropdown-menu.js +295 -0
  67. package/dist/empty.d.ts +11 -0
  68. package/dist/empty.js +51 -0
  69. package/dist/field.d.ts +16 -0
  70. package/dist/field.js +47 -0
  71. package/{src/hooks/scroll/minimize-decision.ts → dist/hooks/scroll/minimize-decision.js} +3 -5
  72. package/dist/{types/src/hooks → hooks}/use-anchored-placement.d.ts +2 -2
  73. package/dist/hooks/use-anchored-placement.js +33 -0
  74. package/dist/{types/src/hooks → hooks}/use-minimize-on-scroll.d.ts +1 -1
  75. package/dist/hooks/use-minimize-on-scroll.js +59 -0
  76. package/dist/{types/src/hooks → hooks}/use-visual-viewport.d.ts +2 -2
  77. package/{src/hooks/use-visual-viewport.ts → dist/hooks/use-visual-viewport.js} +20 -35
  78. package/dist/hooks/viewport/types.d.ts +7 -0
  79. package/dist/hooks/viewport/viewport-metrics.js +13 -0
  80. package/dist/index.d.ts +84 -0
  81. package/dist/index.js +80 -0
  82. package/dist/input-group.d.ts +17 -0
  83. package/dist/input-group.js +55 -0
  84. package/dist/input-otp.d.ts +13 -0
  85. package/dist/input-otp.js +36 -0
  86. package/dist/input.d.ts +4 -0
  87. package/dist/input.js +14 -0
  88. package/dist/item.d.ts +49 -0
  89. package/dist/item.js +142 -0
  90. package/dist/kbd.d.ts +4 -0
  91. package/dist/kbd.js +86 -0
  92. package/dist/label.d.ts +3 -0
  93. package/dist/label.js +12 -0
  94. package/dist/labeled-content.d.ts +24 -0
  95. package/dist/labeled-content.js +41 -0
  96. package/dist/{types/src/lib/language.d.ts → language.d.ts} +1 -1
  97. package/dist/language.js +11 -0
  98. package/dist/layout.d.ts +24 -0
  99. package/dist/layout.js +36 -0
  100. package/dist/{types/src/lib → lib}/anchored-placement.d.ts +27 -27
  101. package/dist/lib/anchored-placement.js +42 -0
  102. package/dist/lib/calendar-month.js +90 -0
  103. package/dist/lib/cx.js +6 -0
  104. package/dist/lib/drawer.math.js +29 -0
  105. package/dist/lib/floating-layers.d.ts +3 -0
  106. package/dist/lib/floating-layers.js +25 -0
  107. package/dist/{types/src/lib → lib}/haptics.d.ts +1 -1
  108. package/dist/lib/haptics.js +13 -0
  109. package/dist/lib/liquid-step.js +33 -0
  110. package/dist/lib/page-scale.js +58 -0
  111. package/dist/lib/portal.js +12 -0
  112. package/dist/lib/presence.js +53 -0
  113. package/dist/lib/range-value.js +25 -0
  114. package/dist/lib/render.d.ts +8 -0
  115. package/dist/lib/render.js +42 -0
  116. package/dist/lib/rolling-digit.js +83 -0
  117. package/dist/{types/src/lib → lib}/screen-edges.d.ts +5 -5
  118. package/dist/lib/screen-edges.js +30 -0
  119. package/dist/lib/swipe-touch-action.js +34 -0
  120. package/dist/lib/visual-viewport.js +27 -0
  121. package/dist/lib/water-drop.js +412 -0
  122. package/dist/lib/wheel.js +125 -0
  123. package/dist/list.d.ts +26 -0
  124. package/dist/list.js +80 -0
  125. package/dist/locales.d.ts +18 -0
  126. package/dist/locales.js +36 -0
  127. package/dist/marker.d.ts +13 -0
  128. package/dist/marker.js +33 -0
  129. package/dist/motion/transitions.d.ts +170 -0
  130. package/dist/motion/transitions.js +156 -0
  131. package/dist/pagination.d.ts +30 -0
  132. package/dist/pagination.js +117 -0
  133. package/dist/popover.d.ts +26 -0
  134. package/dist/popover.js +101 -0
  135. package/dist/progress.d.ts +9 -0
  136. package/dist/progress.js +24 -0
  137. package/dist/questionnaire.d.ts +46 -0
  138. package/dist/questionnaire.js +133 -0
  139. package/dist/radio-group.d.ts +21 -0
  140. package/dist/radio-group.js +67 -0
  141. package/dist/search-field.d.ts +18 -0
  142. package/dist/search-field.js +45 -0
  143. package/dist/segmented-control.d.ts +16 -0
  144. package/dist/segmented-control.js +25 -0
  145. package/dist/select.d.ts +24 -0
  146. package/dist/select.js +107 -0
  147. package/dist/separator.d.ts +9 -0
  148. package/dist/separator.js +17 -0
  149. package/dist/{types/src/lib/shapes.d.ts → shapes.d.ts} +2 -2
  150. package/dist/shapes.js +65 -0
  151. package/dist/sheet.d.ts +24 -0
  152. package/dist/sheet.js +141 -0
  153. package/dist/sidebar.d.ts +32 -0
  154. package/dist/sidebar.js +85 -0
  155. package/dist/skeleton.d.ts +3 -0
  156. package/dist/skeleton.js +13 -0
  157. package/dist/slider.d.ts +9 -0
  158. package/dist/slider.js +42 -0
  159. package/dist/slosh-slider.d.ts +21 -0
  160. package/dist/slosh-slider.js +205 -0
  161. package/dist/spinner.d.ts +3 -0
  162. package/dist/spinner.js +20 -0
  163. package/dist/stat-tile.d.ts +20 -0
  164. package/dist/stat-tile.js +53 -0
  165. package/dist/stepper.d.ts +22 -0
  166. package/dist/stepper.js +98 -0
  167. package/dist/swatch-picker.d.ts +22 -0
  168. package/dist/swatch-picker.js +70 -0
  169. package/dist/switch.d.ts +10 -0
  170. package/dist/switch.js +44 -0
  171. package/dist/tab-bar.d.ts +15 -0
  172. package/dist/tab-bar.js +34 -0
  173. package/dist/{types/src/components/table/table.d.ts → table.d.ts} +3 -3
  174. package/dist/table.js +93 -0
  175. package/dist/tabs.d.ts +32 -0
  176. package/dist/tabs.js +131 -0
  177. package/dist/text.d.ts +25 -0
  178. package/dist/text.js +44 -0
  179. package/dist/textarea.d.ts +3 -0
  180. package/dist/textarea.js +13 -0
  181. package/dist/toast.d.ts +3 -0
  182. package/dist/toast.js +3 -0
  183. package/dist/toggle-group.d.ts +20 -0
  184. package/dist/toggle-group.js +68 -0
  185. package/dist/toggle.d.ts +24 -0
  186. package/dist/toggle.js +37 -0
  187. package/dist/tokens.d.ts +1 -0
  188. package/dist/tooltip.d.ts +21 -0
  189. package/dist/tooltip.js +61 -0
  190. package/dist/trace.d.ts +14 -0
  191. package/dist/trace.js +54 -0
  192. package/dist/{types/src/hooks/use-dismiss.d.ts → use-dismiss.d.ts} +3 -3
  193. package/dist/use-dismiss.js +38 -0
  194. package/dist/{types/src/hooks/use-media-query.d.ts → use-media-query.d.ts} +12 -12
  195. package/dist/use-media-query.js +56 -0
  196. package/dist/use-os.d.ts +12 -0
  197. package/dist/use-os.js +17 -0
  198. package/dist/wake-slider.d.ts +15 -0
  199. package/dist/wake-slider.js +174 -0
  200. package/package.json +122 -253
  201. package/src/styles/code-block.css +4 -0
  202. package/src/styles/globals.css +5 -0
  203. package/src/styles/motion-controls.css +10 -0
  204. package/src/styles/page-scale.css +27 -0
  205. package/src/styles/styles.css +4 -2
  206. package/dist/types/src/appearance/index.d.ts +0 -2
  207. package/dist/types/src/appearance/theme.d.ts +0 -71
  208. package/dist/types/src/components/accordion/accordion.d.ts +0 -23
  209. package/dist/types/src/components/ambient/index.d.ts +0 -1
  210. package/dist/types/src/components/breadcrumb/breadcrumb.d.ts +0 -19
  211. package/dist/types/src/components/button/button-styles.d.ts +0 -12
  212. package/dist/types/src/components/button/button.d.ts +0 -32
  213. package/dist/types/src/components/button/icon-button.d.ts +0 -10
  214. package/dist/types/src/components/button/pending-spinner.d.ts +0 -5
  215. package/dist/types/src/components/button/use-pending-indicator.d.ts +0 -2
  216. package/dist/types/src/components/chip/chip.d.ts +0 -10
  217. package/dist/types/src/components/code-block/code-block.d.ts +0 -13
  218. package/dist/types/src/components/combo-box/combo-box.d.ts +0 -9
  219. package/dist/types/src/components/command/command.d.ts +0 -18
  220. package/dist/types/src/components/compact-date-picker/calendar-month.d.ts +0 -25
  221. package/dist/types/src/components/compact-date-picker/compact-date-picker.d.ts +0 -30
  222. package/dist/types/src/components/compact-time-picker/compact-time-picker.d.ts +0 -29
  223. package/dist/types/src/components/compact-time-picker/time-value.d.ts +0 -18
  224. package/dist/types/src/components/content-unavailable-view/content-unavailable-view.d.ts +0 -12
  225. package/dist/types/src/components/content-view/content-view.d.ts +0 -51
  226. package/dist/types/src/components/content-view/index.d.ts +0 -1
  227. package/dist/types/src/components/context-menu/conceal-menu-source.d.ts +0 -2
  228. package/dist/types/src/components/context-menu/context-menu-host.d.ts +0 -2
  229. package/dist/types/src/components/context-menu/context-menu-store.d.ts +0 -62
  230. package/dist/types/src/components/context-menu/menu-navigation.d.ts +0 -6
  231. package/dist/types/src/components/context-menu/menu-position.d.ts +0 -21
  232. package/dist/types/src/components/context-menu/menu-reveal.d.ts +0 -26
  233. package/dist/types/src/components/context-menu/use-context-menu.d.ts +0 -14
  234. package/dist/types/src/components/conversation/conversation.d.ts +0 -48
  235. package/dist/types/src/components/conversation/index.d.ts +0 -1
  236. package/dist/types/src/components/date-picker/date-picker.d.ts +0 -19
  237. package/dist/types/src/components/date-picker/date-value.d.ts +0 -2
  238. package/dist/types/src/components/dialog/dialog-host.d.ts +0 -6
  239. package/dist/types/src/components/dialog/dialog-store.d.ts +0 -23
  240. package/dist/types/src/components/dialog/dialog.d.ts +0 -33
  241. package/dist/types/src/components/dialog/index.d.ts +0 -1
  242. package/dist/types/src/components/disclosure-group/disclosure-group.d.ts +0 -18
  243. package/dist/types/src/components/divider/divider.d.ts +0 -9
  244. package/dist/types/src/components/inline-disclosure/inline-disclosure.d.ts +0 -15
  245. package/dist/types/src/components/keyboard-shortcut/keyboard-shortcut.d.ts +0 -8
  246. package/dist/types/src/components/labeled-content/labeled-content.d.ts +0 -22
  247. package/dist/types/src/components/locale-switcher/index.d.ts +0 -1
  248. package/dist/types/src/components/locale-switcher/locale-switcher.d.ts +0 -13
  249. package/dist/types/src/components/menu/menu.d.ts +0 -16
  250. package/dist/types/src/components/morph/index.d.ts +0 -2
  251. package/dist/types/src/components/morph/morph.d.ts +0 -32
  252. package/dist/types/src/components/morph/use-morph-disclosure.d.ts +0 -13
  253. package/dist/types/src/components/one-time-code/one-time-code.d.ts +0 -26
  254. package/dist/types/src/components/picker/picker-trigger.d.ts +0 -3
  255. package/dist/types/src/components/picker/picker.d.ts +0 -46
  256. package/dist/types/src/components/popover/anchored-surface.d.ts +0 -17
  257. package/dist/types/src/components/popover/index.d.ts +0 -41
  258. package/dist/types/src/components/popover/popover-content.d.ts +0 -32
  259. package/dist/types/src/components/popover/popover-fit.d.ts +0 -21
  260. package/dist/types/src/components/popover/popover-root.d.ts +0 -22
  261. package/dist/types/src/components/popover/popover-trigger.d.ts +0 -23
  262. package/dist/types/src/components/profile-image/profile-image.d.ts +0 -9
  263. package/dist/types/src/components/progress-view/progress-view.d.ts +0 -13
  264. package/dist/types/src/components/progress-view/use-liquid-progress.d.ts +0 -3
  265. package/dist/types/src/components/radio-group/radio-group.d.ts +0 -20
  266. package/dist/types/src/components/search-field/expanding-search-field.d.ts +0 -5
  267. package/dist/types/src/components/search-field/search-field.d.ts +0 -9
  268. package/dist/types/src/components/search-list/search-list.d.ts +0 -22
  269. package/dist/types/src/components/section/section.d.ts +0 -18
  270. package/dist/types/src/components/secure-field/secure-field.d.ts +0 -4
  271. package/dist/types/src/components/segmented-control/segmented-control.d.ts +0 -25
  272. package/dist/types/src/components/sheet/modal-environment.d.ts +0 -2
  273. package/dist/types/src/components/sheet/sheet-portal.d.ts +0 -5
  274. package/dist/types/src/components/sheet/sheet.d.ts +0 -26
  275. package/dist/types/src/components/sheet/use-sheet-focus.d.ts +0 -3
  276. package/dist/types/src/components/sidebar/sidebar.d.ts +0 -24
  277. package/dist/types/src/components/skeleton/skeleton.d.ts +0 -9
  278. package/dist/types/src/components/slider/slider.d.ts +0 -17
  279. package/dist/types/src/components/slosh-slider/liquid-step.d.ts +0 -6
  280. package/dist/types/src/components/slosh-slider/slosh-slider.d.ts +0 -21
  281. package/dist/types/src/components/stat-tile/index.d.ts +0 -1
  282. package/dist/types/src/components/stat-tile/stat-tile.d.ts +0 -20
  283. package/dist/types/src/components/status-indicator/status-indicator.d.ts +0 -17
  284. package/dist/types/src/components/stepper/rolling-digit.d.ts +0 -11
  285. package/dist/types/src/components/stepper/stepper.d.ts +0 -22
  286. package/dist/types/src/components/swatch-picker/swatch-picker.d.ts +0 -22
  287. package/dist/types/src/components/tab-bar/tab-bar.d.ts +0 -43
  288. package/dist/types/src/components/tab-view/tab-view.d.ts +0 -27
  289. package/dist/types/src/components/text-editor/text-editor.d.ts +0 -9
  290. package/dist/types/src/components/text-field/text-field.d.ts +0 -33
  291. package/dist/types/src/components/toast/toast-store.d.ts +0 -52
  292. package/dist/types/src/components/toggle/toggle.d.ts +0 -22
  293. package/dist/types/src/components/tooltip/tooltip-host.d.ts +0 -7
  294. package/dist/types/src/components/view-controller/index.d.ts +0 -1
  295. package/dist/types/src/components/view-controller/view-controller.d.ts +0 -21
  296. package/dist/types/src/components/wake-slider/wake-slider.d.ts +0 -15
  297. package/dist/types/src/hooks/scroll/minimize-decision.d.ts +0 -2
  298. package/dist/types/src/hooks/use-anchored-disclosure.d.ts +0 -9
  299. package/dist/types/src/hooks/use-floating-dismiss.d.ts +0 -3
  300. package/dist/types/src/hooks/viewport/types.d.ts +0 -19
  301. package/dist/types/src/hooks/viewport/viewport-metrics.d.ts +0 -3
  302. package/dist/types/src/icons/icons.d.ts +0 -616
  303. package/dist/types/src/index.d.ts +0 -73
  304. package/dist/types/src/lib/class-names.d.ts +0 -2
  305. package/dist/types/src/lib/date.d.ts +0 -50
  306. package/dist/types/src/lib/floating-layers.d.ts +0 -8
  307. package/dist/types/src/lib/range-value.d.ts +0 -4
  308. package/dist/types/src/machines/popover.machine.d.ts +0 -30
  309. package/dist/types/src/motion/transitions.d.ts +0 -170
  310. package/src/appearance/index.ts +0 -2
  311. package/src/appearance/platform.tsx +0 -102
  312. package/src/appearance/theme.tsx +0 -467
  313. package/src/components/accordion/accordion.tsx +0 -70
  314. package/src/components/ambient/ambient.tsx +0 -35
  315. package/src/components/ambient/index.ts +0 -1
  316. package/src/components/aspect-ratio/aspect-ratio.tsx +0 -27
  317. package/src/components/breadcrumb/breadcrumb.tsx +0 -73
  318. package/src/components/button/button-styles.ts +0 -49
  319. package/src/components/button/button.tsx +0 -107
  320. package/src/components/button/icon-button.tsx +0 -33
  321. package/src/components/button/pending-spinner.tsx +0 -14
  322. package/src/components/button/use-pending-indicator.ts +0 -22
  323. package/src/components/chip/chip.tsx +0 -45
  324. package/src/components/code-block/code-block.tsx +0 -48
  325. package/src/components/combo-box/combo-box.tsx +0 -13
  326. package/src/components/command/command.tsx +0 -149
  327. package/src/components/compact-date-picker/calendar-month.ts +0 -109
  328. package/src/components/compact-date-picker/compact-date-picker.tsx +0 -337
  329. package/src/components/compact-time-picker/compact-time-picker.tsx +0 -321
  330. package/src/components/compact-time-picker/time-value.ts +0 -58
  331. package/src/components/content-unavailable-view/content-unavailable-view.tsx +0 -78
  332. package/src/components/content-view/content-view.tsx +0 -215
  333. package/src/components/content-view/index.ts +0 -1
  334. package/src/components/context-menu/conceal-menu-source.ts +0 -30
  335. package/src/components/context-menu/context-menu-host.tsx +0 -459
  336. package/src/components/context-menu/context-menu-store.ts +0 -167
  337. package/src/components/context-menu/menu-navigation.ts +0 -36
  338. package/src/components/context-menu/menu-position.ts +0 -38
  339. package/src/components/context-menu/menu-reveal.ts +0 -42
  340. package/src/components/context-menu/use-context-menu.ts +0 -73
  341. package/src/components/conversation/conversation.tsx +0 -309
  342. package/src/components/conversation/index.ts +0 -1
  343. package/src/components/date-picker/date-picker.tsx +0 -106
  344. package/src/components/date-picker/date-value.ts +0 -22
  345. package/src/components/dialog/dialog-host.tsx +0 -119
  346. package/src/components/dialog/dialog-store.ts +0 -66
  347. package/src/components/dialog/dialog.tsx +0 -211
  348. package/src/components/dialog/index.ts +0 -1
  349. package/src/components/disclosure-group/disclosure-group.tsx +0 -108
  350. package/src/components/divider/divider.tsx +0 -33
  351. package/src/components/inline-disclosure/inline-disclosure.tsx +0 -53
  352. package/src/components/keyboard-shortcut/keyboard-shortcut.tsx +0 -32
  353. package/src/components/labeled-content/labeled-content.tsx +0 -84
  354. package/src/components/locale-switcher/index.ts +0 -1
  355. package/src/components/locale-switcher/locale-switcher.tsx +0 -311
  356. package/src/components/menu/menu.tsx +0 -85
  357. package/src/components/morph/index.ts +0 -2
  358. package/src/components/morph/morph.tsx +0 -258
  359. package/src/components/morph/use-morph-disclosure.ts +0 -27
  360. package/src/components/one-time-code/one-time-code.tsx +0 -234
  361. package/src/components/picker/picker-trigger.ts +0 -22
  362. package/src/components/picker/picker.tsx +0 -404
  363. package/src/components/popover/anchored-surface.tsx +0 -264
  364. package/src/components/popover/index.ts +0 -50
  365. package/src/components/popover/popover-content.tsx +0 -334
  366. package/src/components/popover/popover-fit.ts +0 -74
  367. package/src/components/popover/popover-root.tsx +0 -97
  368. package/src/components/popover/popover-trigger.tsx +0 -71
  369. package/src/components/profile-image/profile-image.tsx +0 -96
  370. package/src/components/progress-view/progress-view.tsx +0 -72
  371. package/src/components/progress-view/use-liquid-progress.ts +0 -43
  372. package/src/components/radio-group/radio-group.tsx +0 -86
  373. package/src/components/search-field/expanding-search-field.tsx +0 -197
  374. package/src/components/search-field/search-field.tsx +0 -66
  375. package/src/components/search-list/search-list.tsx +0 -276
  376. package/src/components/section/section.tsx +0 -75
  377. package/src/components/secure-field/secure-field.tsx +0 -8
  378. package/src/components/segmented-control/segmented-control.tsx +0 -157
  379. package/src/components/sheet/modal-environment.ts +0 -82
  380. package/src/components/sheet/sheet-portal.tsx +0 -62
  381. package/src/components/sheet/sheet.tsx +0 -165
  382. package/src/components/sheet/use-sheet-focus.ts +0 -109
  383. package/src/components/sidebar/sidebar.tsx +0 -102
  384. package/src/components/skeleton/skeleton.tsx +0 -38
  385. package/src/components/slider/slider.tsx +0 -134
  386. package/src/components/slosh-slider/liquid-step.ts +0 -43
  387. package/src/components/slosh-slider/slosh-slider.tsx +0 -294
  388. package/src/components/stat-tile/index.ts +0 -1
  389. package/src/components/stat-tile/stat-tile.tsx +0 -90
  390. package/src/components/status-indicator/status-indicator.tsx +0 -54
  391. package/src/components/stepper/rolling-digit.tsx +0 -91
  392. package/src/components/stepper/stepper.tsx +0 -136
  393. package/src/components/swatch-picker/swatch-picker.tsx +0 -138
  394. package/src/components/tab-bar/tab-bar.tsx +0 -182
  395. package/src/components/tab-view/tab-view.tsx +0 -155
  396. package/src/components/table/table.tsx +0 -151
  397. package/src/components/text-editor/text-editor.tsx +0 -42
  398. package/src/components/text-field/text-field.tsx +0 -200
  399. package/src/components/toast/toast-store.ts +0 -164
  400. package/src/components/toast/toaster.tsx +0 -407
  401. package/src/components/toggle/toggle.tsx +0 -320
  402. package/src/components/tooltip/tooltip-host.tsx +0 -178
  403. package/src/components/view-controller/index.ts +0 -1
  404. package/src/components/view-controller/view-controller.tsx +0 -75
  405. package/src/components/wake-slider/wake-slider.tsx +0 -260
  406. package/src/hooks/use-anchored-disclosure.ts +0 -23
  407. package/src/hooks/use-anchored-placement.ts +0 -40
  408. package/src/hooks/use-dismiss.ts +0 -44
  409. package/src/hooks/use-floating-dismiss.ts +0 -30
  410. package/src/hooks/use-media-query.ts +0 -94
  411. package/src/hooks/use-minimize-on-scroll.ts +0 -77
  412. package/src/hooks/viewport/types.ts +0 -19
  413. package/src/hooks/viewport/viewport-metrics.ts +0 -19
  414. package/src/icons/icons.tsx +0 -458
  415. package/src/index.ts +0 -107
  416. package/src/lib/anchored-placement.ts +0 -91
  417. package/src/lib/class-names.ts +0 -21
  418. package/src/lib/clipboard.ts +0 -15
  419. package/src/lib/date.ts +0 -86
  420. package/src/lib/floating-layers.ts +0 -53
  421. package/src/lib/haptics.ts +0 -23
  422. package/src/lib/language.ts +0 -16
  423. package/src/lib/range-value.ts +0 -38
  424. package/src/lib/screen-edges.ts +0 -44
  425. package/src/lib/shapes.ts +0 -59
  426. package/src/machines/popover.machine.ts +0 -51
  427. package/src/motion/transitions.ts +0 -97
  428. package/src/tokens.ts +0 -1
  429. /package/dist/{types/src/tokens.d.ts → tokens.js} +0 -0
@@ -1,38 +0,0 @@
1
- import type { ComponentProps } from "react";
2
- import { cn } from "../../lib/class-names";
3
-
4
- export type SkeletonSize = "sm" | "md" | "lg";
5
-
6
- const minHeights: Record<SkeletonSize, string> = {
7
- sm: "min-h-3 rounded-md",
8
- md: "min-h-4 rounded-md",
9
- lg: "min-h-6 rounded-lg",
10
- };
11
-
12
- export interface SkeletonProps extends ComponentProps<"div"> {
13
- label?: string;
14
- /** Minimum height and rounding. @default "md" */
15
- size?: SkeletonSize;
16
- }
17
- /** A loading placeholder that becomes still when Reduce Motion is enabled. */
18
- export function Skeleton({
19
- label,
20
- size = "md",
21
- className,
22
- ...props
23
- }: SkeletonProps) {
24
- return (
25
- <div
26
- {...props}
27
- role={label ? "status" : undefined}
28
- aria-hidden={label ? undefined : true}
29
- className={cn(
30
- "bg-fill motion-safe:animate-pulse",
31
- minHeights[size],
32
- className,
33
- )}
34
- >
35
- {label && <span className="sr-only">{label}</span>}
36
- </div>
37
- );
38
- }
@@ -1,134 +0,0 @@
1
- import { type ComponentProps, useId } from "react";
2
- import { cn } from "../../lib/class-names";
3
- import { clampRange } from "../../lib/range-value";
4
-
5
- export type SliderSize = "sm" | "md" | "lg";
6
-
7
- const labelSizes: Record<SliderSize, string> = {
8
- sm: "text-footnote font-semibold text-label",
9
- md: "text-subheadline font-semibold text-label",
10
- lg: "text-body font-semibold text-label",
11
- };
12
- const inputHeights: Record<SliderSize, string> = {
13
- sm: "h-9",
14
- md: "h-11",
15
- lg: "h-13",
16
- };
17
- const descriptionSizes: Record<SliderSize, string> = {
18
- sm: "text-caption2 text-label-secondary",
19
- md: "text-footnote text-label-secondary",
20
- lg: "text-subheadline text-label-secondary",
21
- };
22
- // Track height, thumb size, and the webkit thumb's -mt offset (derived from
23
- // (thumb - track) / 2: md (20-6)/2=7, sm (16-4)/2=6, lg (24-8)/2=8).
24
- const webkitTrack: Record<SliderSize, string> = {
25
- sm: "[&::-webkit-slider-runnable-track]:h-1 [&::-webkit-slider-runnable-track]:rounded-full [&::-webkit-slider-runnable-track]:bg-separator",
26
- md: "[&::-webkit-slider-runnable-track]:h-1.5 [&::-webkit-slider-runnable-track]:rounded-full [&::-webkit-slider-runnable-track]:bg-separator",
27
- lg: "[&::-webkit-slider-runnable-track]:h-2 [&::-webkit-slider-runnable-track]:rounded-full [&::-webkit-slider-runnable-track]:bg-separator",
28
- };
29
- const webkitThumb: Record<SliderSize, string> = {
30
- sm: "[&::-webkit-slider-thumb]:-mt-[6px] [&::-webkit-slider-thumb]:size-4 [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:border-2 [&::-webkit-slider-thumb]:border-accent [&::-webkit-slider-thumb]:bg-elevated [&::-webkit-slider-thumb]:shadow-sm",
31
- md: "[&::-webkit-slider-thumb]:-mt-[7px] [&::-webkit-slider-thumb]:size-5 [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:border-2 [&::-webkit-slider-thumb]:border-accent [&::-webkit-slider-thumb]:bg-elevated [&::-webkit-slider-thumb]:shadow-sm",
32
- lg: "[&::-webkit-slider-thumb]:-mt-[8px] [&::-webkit-slider-thumb]:size-6 [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:border-2 [&::-webkit-slider-thumb]:border-accent [&::-webkit-slider-thumb]:bg-elevated [&::-webkit-slider-thumb]:shadow-sm",
33
- };
34
- const mozTrack: Record<SliderSize, string> = {
35
- sm: "[&::-moz-range-track]:h-1 [&::-moz-range-track]:rounded-full [&::-moz-range-track]:bg-separator",
36
- md: "[&::-moz-range-track]:h-1.5 [&::-moz-range-track]:rounded-full [&::-moz-range-track]:bg-separator",
37
- lg: "[&::-moz-range-track]:h-2 [&::-moz-range-track]:rounded-full [&::-moz-range-track]:bg-separator",
38
- };
39
- const mozProgress: Record<SliderSize, string> = {
40
- sm: "[&::-moz-range-progress]:h-1 [&::-moz-range-progress]:rounded-full [&::-moz-range-progress]:bg-accent",
41
- md: "[&::-moz-range-progress]:h-1.5 [&::-moz-range-progress]:rounded-full [&::-moz-range-progress]:bg-accent",
42
- lg: "[&::-moz-range-progress]:h-2 [&::-moz-range-progress]:rounded-full [&::-moz-range-progress]:bg-accent",
43
- };
44
- const mozThumb: Record<SliderSize, string> = {
45
- sm: "[&::-moz-range-thumb]:size-3 [&::-moz-range-thumb]:rounded-full [&::-moz-range-thumb]:border-2 [&::-moz-range-thumb]:border-accent [&::-moz-range-thumb]:bg-elevated",
46
- md: "[&::-moz-range-thumb]:size-4 [&::-moz-range-thumb]:rounded-full [&::-moz-range-thumb]:border-2 [&::-moz-range-thumb]:border-accent [&::-moz-range-thumb]:bg-elevated",
47
- lg: "[&::-moz-range-thumb]:size-5 [&::-moz-range-thumb]:rounded-full [&::-moz-range-thumb]:border-2 [&::-moz-range-thumb]:border-accent [&::-moz-range-thumb]:bg-elevated",
48
- };
49
-
50
- export interface SliderProps
51
- extends Omit<
52
- ComponentProps<"input">,
53
- | "type"
54
- | "value"
55
- | "defaultValue"
56
- | "onChange"
57
- | "min"
58
- | "max"
59
- | "step"
60
- | "size"
61
- > {
62
- value: number;
63
- onChange: (value: number) => void;
64
- label: string;
65
- min?: number;
66
- max?: number;
67
- step?: number;
68
- description?: string;
69
- /** Provides a localized, spoken description of the current value. */
70
- formatValue?: (value: number) => string;
71
- /** Track height, thumb size and label/description text scale. @default "md" */
72
- size?: SliderSize;
73
- }
74
-
75
- /** Native keyboard, touch and pointer behavior with Passui's control treatment. */
76
- export function Slider({
77
- value,
78
- onChange,
79
- label,
80
- min = 0,
81
- max = 100,
82
- step = 1,
83
- description,
84
- formatValue,
85
- size = "md",
86
- id: suppliedId,
87
- className,
88
- disabled,
89
- ...props
90
- }: SliderProps) {
91
- const generatedId = useId();
92
- const id = suppliedId ?? generatedId;
93
- const upper = Math.max(min, max);
94
- const current = clampRange(value, min, upper);
95
-
96
- return (
97
- <div
98
- className={cn("flex min-w-0 flex-col gap-2", disabled && "opacity-45")}
99
- >
100
- <label htmlFor={id} className={labelSizes[size]}>
101
- {label}
102
- </label>
103
- <input
104
- {...props}
105
- id={id}
106
- type="range"
107
- min={min}
108
- max={upper}
109
- step={step > 0 ? step : 1}
110
- value={current}
111
- disabled={disabled || upper === min}
112
- aria-valuetext={formatValue?.(current)}
113
- aria-describedby={description ? `${id}-description` : undefined}
114
- onChange={(event) => onChange(Number(event.currentTarget.value))}
115
- className={cn(
116
- "accent-accent w-full min-w-0 cursor-pointer appearance-none bg-transparent",
117
- inputHeights[size],
118
- "focus-visible:outline-accent-text focus-visible:rounded-lg focus-visible:outline-2 focus-visible:outline-offset-2",
119
- webkitTrack[size],
120
- webkitThumb[size],
121
- mozTrack[size],
122
- mozProgress[size],
123
- mozThumb[size],
124
- className,
125
- )}
126
- />
127
- {description && (
128
- <p id={`${id}-description`} className={descriptionSizes[size]}>
129
- {description}
130
- </p>
131
- )}
132
- </div>
133
- );
134
- }
@@ -1,43 +0,0 @@
1
- import { clampRange } from "../../lib/range-value";
2
-
3
- export interface LiquidState {
4
- fill: number;
5
- velocity: number;
6
- }
7
-
8
- /** Bencho's frame-normalized liquid spring. See THIRD_PARTY_NOTICES.md. */
9
- export function stepLiquid(
10
- state: LiquidState,
11
- target: number,
12
- viscosity: number,
13
- dt: number,
14
- ): LiquidState {
15
- const soft = clampRange(viscosity, 0, 100) / 100;
16
- target = clampRange(target, 0, 100);
17
- dt = clampRange(dt, 0, 2.5);
18
- if (soft === 0) {
19
- /* 0 is an ordinary slider and has to be exactly that,
20
- not a very stiff spring that still rings. */
21
- return { fill: target, velocity: 0 };
22
- }
23
- /* Stiffness falls and damping rises together: thin liquid is slow to
24
- answer and slow to forget, which is why these are one knob. */
25
- const stiff = 0.34 - soft * 0.29;
26
- const damp = 0.74 + soft * 0.22;
27
- let velocity =
28
- (state.velocity + (target - state.fill) * stiff * dt) * damp ** dt;
29
- let fill = state.fill + velocity * dt;
30
- /* The end stop is a wall, and a wall gives some back. Without this
31
- the overshoot is swallowed exactly where you are looking at it. */
32
- if (fill > 100) {
33
- fill = 100;
34
- velocity = -velocity * 0.42;
35
- }
36
- if (fill < 0) {
37
- fill = 0;
38
- velocity = -velocity * 0.42;
39
- }
40
- if (Math.abs(target - fill) < 0.02 && Math.abs(velocity) < 0.02)
41
- return { fill: target, velocity: 0 };
42
- return { fill, velocity };
43
- }
@@ -1,294 +0,0 @@
1
- // Adapted from Bencho. See THIRD_PARTY_NOTICES.md for the MIT notice.
2
- import { type CSSProperties, useEffect, useRef } from "react";
3
- import { useMediaQuery } from "../../hooks/use-media-query";
4
- import { cn } from "../../lib/class-names";
5
- import { clampRange as clamp } from "../../lib/range-value";
6
- import { stepLiquid } from "./liquid-step";
7
-
8
- export type SloshSliderSize = "sm" | "md" | "lg";
9
-
10
- export interface SloshSliderProps {
11
- label: string;
12
- value?: number;
13
- defaultValue?: number;
14
- onChange?: (value: number) => void;
15
- /** 0 is rigid; 100 is loose liquid. @default 15 */
16
- viscosity?: number;
17
- /** How far the handle coasts after release, 0–100. @default 55 */
18
- momentum?: number;
19
- /** Lean of the liquid's leading edge, 0–100. @default 45 */
20
- tilt?: number;
21
- /** Track corner, from square to a pill, 0–20. @default 20 */
22
- corner?: number;
23
- /** Track height and knob scale. @default "md" */
24
- size?: SloshSliderSize;
25
- disabled?: boolean;
26
- className?: string;
27
- formatValue?: (value: number) => string;
28
- }
29
-
30
- /* A slider whose value has mass.
31
-
32
- The handle is rigid — it is under your finger and anything under a
33
- finger that lags it is broken. The FILL is a second spring behind it,
34
- softer and barely damped, so a fast drag throws it past the handle,
35
- into the end stop, and rocks it back before it settles.
36
-
37
- The tilt is what sells it as liquid. A bar that lags is a laggy bar;
38
- a bar whose leading edge leans has a meniscus. Same lag, different object.
39
-
40
- The loop writes geometry directly and parks as soon as it rests.
41
- React receives only changed integer values for the application's state. */
42
- export function SloshSlider({
43
- label,
44
- value,
45
- defaultValue = 62,
46
- onChange,
47
- viscosity = 15,
48
- momentum = 55,
49
- tilt = 45,
50
- corner = 20,
51
- size = "md",
52
- disabled = false,
53
- className,
54
- formatValue,
55
- }: SloshSliderProps) {
56
- const reduced = useMediaQuery("(prefers-reduced-motion: reduce)");
57
- const track = useRef<HTMLDivElement>(null);
58
- const fillEl = useRef<HTMLDivElement>(null);
59
- const knobEl = useRef<HTMLDivElement>(null);
60
- const initial = clamp(value ?? defaultValue, 0, 100);
61
- const state = useRef({
62
- value: initial,
63
- handleVelocity: 0,
64
- fill: initial,
65
- velocity: 0,
66
- held: false,
67
- raf: 0,
68
- previous: 0,
69
- last: { value: initial, time: 0 },
70
- notified: Math.round(initial),
71
- });
72
- const settings = useRef({
73
- viscosity,
74
- momentum,
75
- tilt,
76
- reduced,
77
- onChange,
78
- formatValue,
79
- });
80
- settings.current = {
81
- viscosity,
82
- momentum,
83
- tilt,
84
- reduced,
85
- onChange,
86
- formatValue,
87
- };
88
- const run = useRef<() => void>(() => {});
89
-
90
- useEffect(() => {
91
- const s = state.current;
92
- const paint = () => {
93
- if (!track.current || !fillEl.current || !knobEl.current) return;
94
- fillEl.current.style.width = `${s.fill.toFixed(2)}%`;
95
- knobEl.current.style.insetInlineStart = `${s.value.toFixed(2)}%`;
96
- /* Proportional to how fast the fill is actually moving: upright
97
- at rest, so it cannot be decoration when nothing travels. */
98
- const lean = settings.current.reduced
99
- ? 0
100
- : clamp(
101
- (clamp(settings.current.tilt, 0, 100) / 100) * s.velocity * 3,
102
- -20,
103
- 20,
104
- );
105
- fillEl.current.style.setProperty("--slosh-lean", `${lean.toFixed(2)}px`);
106
- const next = Math.round(s.value);
107
- track.current.setAttribute("aria-valuenow", String(next));
108
- const spoken = settings.current.formatValue?.(next);
109
- if (spoken) track.current.setAttribute("aria-valuetext", spoken);
110
- else track.current.removeAttribute("aria-valuetext");
111
- if (s.notified !== next) {
112
- s.notified = next;
113
- settings.current.onChange?.(next);
114
- }
115
- };
116
- const tick = (time: number) => {
117
- const dt = s.previous ? clamp((time - s.previous) / 16.67, 0, 2.5) : 1;
118
- s.previous = time;
119
- const knobs = settings.current;
120
- /* Friction is per frame, raised to dt: a dropped frame must
121
- not double the deceleration. The release is a throw, not a stop. */
122
- if (!s.held && s.handleVelocity) {
123
- s.value += s.handleVelocity * dt;
124
- s.handleVelocity *=
125
- (0.86 + (clamp(knobs.momentum, 0, 100) / 100) * 0.115) ** dt;
126
- if (s.value <= 0 || s.value >= 100) {
127
- s.value = clamp(s.value, 0, 100);
128
- s.handleVelocity = 0;
129
- }
130
- if (Math.abs(s.handleVelocity) < 0.01) s.handleVelocity = 0;
131
- }
132
- const next = stepLiquid(
133
- s,
134
- s.value,
135
- knobs.reduced ? 0 : knobs.viscosity,
136
- dt,
137
- );
138
- s.fill = next.fill;
139
- s.velocity = next.velocity;
140
- paint();
141
- if (
142
- !s.handleVelocity &&
143
- !s.velocity &&
144
- Math.abs(s.fill - s.value) < 0.02
145
- ) {
146
- s.raf = 0;
147
- s.previous = 0;
148
- return;
149
- }
150
- s.raf = requestAnimationFrame(tick);
151
- };
152
- run.current = () => {
153
- // The handle paints on the input event; it never waits for the fill.
154
- paint();
155
- if (!s.raf) s.raf = requestAnimationFrame(tick);
156
- };
157
- paint();
158
- return () => {
159
- cancelAnimationFrame(s.raf);
160
- s.raf = 0;
161
- s.previous = 0;
162
- };
163
- }, []);
164
-
165
- // biome-ignore lint/correctness/useExhaustiveDependencies: Motion settings can wake a parked loop without changing its value.
166
- useEffect(() => {
167
- const s = state.current;
168
- if (
169
- value !== undefined &&
170
- Math.round(clamp(value, 0, 100)) !== s.notified
171
- ) {
172
- s.value = clamp(value, 0, 100);
173
- s.notified = Math.round(s.value);
174
- s.handleVelocity = 0;
175
- }
176
- if (reduced || disabled) {
177
- s.handleVelocity = 0;
178
- s.held = false;
179
- }
180
- run.current();
181
- }, [value, reduced, disabled, viscosity, tilt, formatValue]);
182
-
183
- const readAt = (clientX: number) => {
184
- const t = track.current;
185
- if (!t) return 0;
186
- const box = t.getBoundingClientRect();
187
- const fraction = box.width ? (clientX - box.left) / box.width : 0;
188
- return clamp(
189
- (getComputedStyle(t).direction === "rtl" ? 1 - fraction : fraction) * 100,
190
- 0,
191
- 100,
192
- );
193
- };
194
- const release = (cancelled = false) => {
195
- const s = state.current;
196
- if (!s.held) return;
197
- s.held = false;
198
- /* Leaves along its measured velocity, capped so a full-track flick
199
- does not simply pin it. A cancelled gesture never throws. */
200
- s.handleVelocity =
201
- cancelled || reduced ? 0 : clamp(s.handleVelocity, -6, 6);
202
- if (performance.now() - s.last.time > 100) s.handleVelocity = 0;
203
- run.current();
204
- };
205
- return (
206
- <div
207
- className={cn(
208
- "passui-slosh-slider not-typeset",
209
- disabled && "opacity-40",
210
- className,
211
- )}
212
- style={{ "--slosh-radius": `${clamp(corner, 0, 20)}px` } as CSSProperties}
213
- data-size={size}
214
- >
215
- {/* Nothing but the track: the liquid is the value's motion, not a
216
- second numeric readout that lags and overshoots beside it. */}
217
- <div
218
- ref={track}
219
- className="passui-slosh-track"
220
- role="slider"
221
- tabIndex={disabled ? -1 : 0}
222
- aria-label={label}
223
- aria-disabled={disabled || undefined}
224
- aria-valuemin={0}
225
- aria-valuemax={100}
226
- aria-valuenow={Math.round(initial)}
227
- aria-valuetext={formatValue?.(Math.round(initial))}
228
- onPointerDown={(event) => {
229
- if (disabled || event.button !== 0) return;
230
- event.currentTarget.focus();
231
- event.currentTarget.setPointerCapture(event.pointerId);
232
- const s = state.current;
233
- s.held = true;
234
- s.handleVelocity = 0;
235
- s.value = readAt(event.clientX);
236
- s.last = { value: s.value, time: performance.now() };
237
- run.current();
238
- }}
239
- onPointerMove={(event) => {
240
- const s = state.current;
241
- if (!s.held || disabled) return;
242
- const next = readAt(event.clientX);
243
- const now = performance.now();
244
- /* Per frame, not per ms: the loop's release velocity must
245
- use the same unit as the spring. */
246
- s.handleVelocity =
247
- ((next - s.last.value) / Math.max(1, now - s.last.time)) * 16.67;
248
- s.last = { value: next, time: now };
249
- s.value = next;
250
- run.current();
251
- }}
252
- onPointerUp={() => release()}
253
- onPointerCancel={() => release(true)}
254
- onLostPointerCapture={() => release(true)}
255
- onKeyDown={(event) => {
256
- if (disabled) return;
257
- const s = state.current;
258
- const step = event.shiftKey ? 10 : 2;
259
- const rtl = getComputedStyle(event.currentTarget).direction === "rtl";
260
- const next =
261
- event.key === "ArrowUp" ||
262
- event.key === (rtl ? "ArrowLeft" : "ArrowRight")
263
- ? s.value + step
264
- : event.key === "ArrowDown" ||
265
- event.key === (rtl ? "ArrowRight" : "ArrowLeft")
266
- ? s.value - step
267
- : event.key === "Home"
268
- ? 0
269
- : event.key === "End"
270
- ? 100
271
- : null;
272
- if (next === null) return;
273
- event.preventDefault();
274
- s.handleVelocity = 0;
275
- s.value = clamp(next, 0, 100);
276
- run.current();
277
- }}
278
- >
279
- <div
280
- aria-hidden="true"
281
- ref={fillEl}
282
- className="passui-slosh-fill"
283
- style={{ width: `${initial}%` }}
284
- />
285
- <div
286
- aria-hidden="true"
287
- ref={knobEl}
288
- className="passui-slosh-knob"
289
- style={{ insetInlineStart: `${initial}%` }}
290
- />
291
- </div>
292
- </div>
293
- );
294
- }
@@ -1 +0,0 @@
1
- export * from "./stat-tile";
@@ -1,90 +0,0 @@
1
- import type { ReactNode } from "react";
2
- import { cn } from "../../lib/class-names";
3
-
4
- export type StatTileTone = "critical";
5
- export type StatTileSize = "sm" | "md" | "lg";
6
-
7
- const tileSizes: Record<
8
- StatTileSize,
9
- { padding: string; valueText: string; labelText: string }
10
- > = {
11
- sm: { padding: "p-3", valueText: "text-title3", labelText: "text-caption" },
12
- md: { padding: "p-4", valueText: "text-title1", labelText: "text-footnote" },
13
- lg: {
14
- padding: "p-5",
15
- valueText: "text-title",
16
- labelText: "text-subheadline",
17
- },
18
- };
19
-
20
- export interface StatTileProps {
21
- label: string;
22
- value: number;
23
- /** A quiet line under the number, like "3 signed in now". */
24
- caption?: ReactNode;
25
- /** Turns the number red once it's above zero. */
26
- tone?: StatTileTone;
27
- /** Makes the tile a toggle, e.g. a filter. */
28
- onClick?: () => void;
29
- active?: boolean;
30
- /** Custom classes for the tile container. */
31
- className?: string;
32
- /** Tile padding and number scale. @default "md" */
33
- size?: StatTileSize;
34
- }
35
-
36
- /** One number with its label, optionally a toggle. */
37
- export function StatTile({
38
- label,
39
- value,
40
- caption,
41
- tone,
42
- onClick,
43
- active = false,
44
- className,
45
- size = "md",
46
- }: StatTileProps) {
47
- const dims = tileSizes[size];
48
- const body = (
49
- <>
50
- <span className={cn(dims.labelText, "text-label-secondary")}>
51
- {label}
52
- </span>
53
- <span
54
- className={cn(
55
- "font-semibold tabular-nums",
56
- dims.valueText,
57
- tone === "critical" && value > 0 && "text-danger",
58
- )}
59
- >
60
- {value.toLocaleString("en-US")}
61
- </span>
62
- {caption && (
63
- <span className={cn(dims.labelText, "text-label-tertiary")}>
64
- {caption}
65
- </span>
66
- )}
67
- </>
68
- );
69
- const tileClass = cn(
70
- "border-separator/35 bg-elevated flex min-w-0 flex-col gap-2 rounded-2xl border text-left shadow-xs",
71
- dims.padding,
72
- className,
73
- );
74
-
75
- if (!onClick) return <div className={tileClass}>{body}</div>;
76
- return (
77
- <button
78
- type="button"
79
- aria-pressed={active}
80
- onClick={onClick}
81
- className={cn(
82
- tileClass,
83
- "hover:bg-fill/60 ring-1 ring-transparent transition-colors",
84
- active && "bg-fill/70 ring-label/15",
85
- )}
86
- >
87
- {body}
88
- </button>
89
- );
90
- }
@@ -1,54 +0,0 @@
1
- import type { HTMLAttributes, ReactNode } from "react";
2
- import { cn } from "../../lib/class-names";
3
-
4
- const dots = {
5
- saved: "bg-success",
6
- syncing: "bg-warning animate-pulse",
7
- offline: "bg-label-tertiary",
8
- } as const;
9
-
10
- export type StatusIndicatorState = keyof typeof dots;
11
- export type StatusIndicatorSize = "sm" | "md";
12
-
13
- const dotSizes: Record<StatusIndicatorSize, string> = {
14
- sm: "size-[6px]",
15
- md: "size-[7px]",
16
- };
17
-
18
- const textSizes: Record<StatusIndicatorSize, string> = {
19
- sm: "text-caption",
20
- md: "text-footnote",
21
- };
22
-
23
- export interface StatusIndicatorProps extends HTMLAttributes<HTMLSpanElement> {
24
- /** Visual treatment of the status dot. */
25
- state: StatusIndicatorState;
26
- children: ReactNode;
27
- /** Dot diameter and text scale. @default "md" */
28
- size?: StatusIndicatorSize;
29
- }
30
-
31
- export function StatusIndicator({
32
- state,
33
- children,
34
- size = "md",
35
- className,
36
- ...props
37
- }: StatusIndicatorProps) {
38
- return (
39
- <span
40
- className={cn(
41
- "text-label-tertiary flex items-center gap-1.5",
42
- textSizes[size],
43
- className,
44
- )}
45
- {...props}
46
- >
47
- <span
48
- aria-hidden="true"
49
- className={cn(dotSizes[size], "rounded-full", dots[state])}
50
- />
51
- {children}
52
- </span>
53
- );
54
- }