@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,42 +0,0 @@
1
- export type MenuRect = {
2
- left: number;
3
- top: number;
4
- width: number;
5
- height: number;
6
- };
7
-
8
- /** Return toward the source while handing its material back to the real trigger. */
9
- export function menuSurfaceExit(source: ReturnType<typeof menuSurfaceReveal>) {
10
- return { ...source, opacity: 0 };
11
- }
12
-
13
- /** Animate the material's bounds independently so menu text never stretches. */
14
- export function menuSurfaceReveal(
15
- source: MenuRect | undefined,
16
- target: MenuRect & { radius?: number },
17
- ) {
18
- if (
19
- !source ||
20
- source.width <= 0 ||
21
- source.height <= 0 ||
22
- target.width <= 0 ||
23
- target.height <= 0
24
- ) {
25
- return {
26
- x: 0,
27
- y: -4,
28
- width: target.width,
29
- height: target.height,
30
- opacity: 0,
31
- borderRadius: target.radius ?? 0,
32
- };
33
- }
34
- return {
35
- x: source.left - target.left,
36
- y: source.top - target.top,
37
- width: source.width,
38
- height: source.height,
39
- opacity: 1,
40
- borderRadius: Math.min(source.width, source.height) / 2,
41
- };
42
- }
@@ -1,73 +0,0 @@
1
- import { type MouseEvent, type PointerEvent, useRef } from "react";
2
- import { haptic } from "../../lib/haptics";
3
- import { type ContextMenuItem, openContextMenu } from "./context-menu-store";
4
-
5
- const LONG_PRESS_MS = 480;
6
- const MOVE_TOLERANCE = 10;
7
-
8
- /**
9
- * Right-click on desktop, long-press on touch screens: both open the same
10
- * menu of actions. Spread the returned handlers onto the element.
11
- */
12
- export function useContextMenu(items: () => ContextMenuItem[]) {
13
- const press = useRef<{
14
- x: number;
15
- y: number;
16
- timer: ReturnType<typeof setTimeout>;
17
- } | null>(null);
18
- const suppressClick = useRef(false);
19
-
20
- const cancel = () => {
21
- if (press.current) clearTimeout(press.current.timer);
22
- press.current = null;
23
- };
24
-
25
- return {
26
- onContextMenu(event: MouseEvent) {
27
- event.preventDefault();
28
- cancel();
29
- openContextMenu(
30
- event.clientX,
31
- event.clientY,
32
- items(),
33
- false,
34
- event.currentTarget,
35
- );
36
- },
37
- onPointerDown(event: PointerEvent) {
38
- if (event.pointerType !== "touch") return;
39
- const { clientX: x, clientY: y } = event;
40
- const anchor = event.currentTarget;
41
- cancel();
42
- press.current = {
43
- x,
44
- y,
45
- timer: setTimeout(() => {
46
- press.current = null;
47
- suppressClick.current = true;
48
- haptic("medium");
49
- openContextMenu(x, y, items(), true, anchor);
50
- }, LONG_PRESS_MS),
51
- };
52
- },
53
- onPointerMove(event: PointerEvent) {
54
- const start = press.current;
55
- if (
56
- start &&
57
- Math.hypot(event.clientX - start.x, event.clientY - start.y) >
58
- MOVE_TOLERANCE
59
- ) {
60
- cancel();
61
- }
62
- },
63
- onPointerUp: cancel,
64
- onPointerCancel: cancel,
65
- // The tap that ends a long-press shouldn't also open the row.
66
- onClickCapture(event: MouseEvent) {
67
- if (!suppressClick.current) return;
68
- suppressClick.current = false;
69
- event.preventDefault();
70
- event.stopPropagation();
71
- },
72
- };
73
- }
@@ -1,309 +0,0 @@
1
- import { IconButton } from "../button/icon-button";
2
- import { SendIcon } from "../../icons/icons";
3
- import type { ReactNode } from "react";
4
- import { useState } from "react";
5
- import { formatTime } from "../../lib/date";
6
- import { cn } from "../../lib/class-names";
7
-
8
- export type ConversationMessage = {
9
- id: string;
10
- body: string;
11
- /** Written by whoever is looking: drawn on the right. */
12
- mine: boolean;
13
- author?: string;
14
- /** Shown beside the other side's messages, like their avatar. */
15
- avatar?: ReactNode;
16
- createdAt: string;
17
- };
18
-
19
- export type ConversationSize = "sm" | "md" | "lg";
20
-
21
- const avatarSizes: Record<ConversationSize, string> = {
22
- sm: "size-6",
23
- md: "size-7",
24
- lg: "size-8",
25
- };
26
- const bubbleClasses: Record<ConversationSize, string> = {
27
- sm: "rounded-3xl px-3 py-1.5 text-footnote leading-snug",
28
- md: "rounded-4xl px-3.5 py-2 text-subheadline leading-snug",
29
- lg: "rounded-5xl px-4 py-2.5 text-body leading-snug",
30
- };
31
- const bubbleTails: Record<ConversationSize, string> = {
32
- sm: "rounded-br-sm",
33
- md: "rounded-br-md",
34
- lg: "rounded-br-lg",
35
- };
36
- const bubbleTailsOther: Record<ConversationSize, string> = {
37
- sm: "rounded-bl-sm",
38
- md: "rounded-bl-md",
39
- lg: "rounded-bl-lg",
40
- };
41
- const authorText: Record<ConversationSize, string> = {
42
- sm: "px-3 text-caption2 text-label-secondary",
43
- md: "px-3 text-caption2 text-label-secondary",
44
- lg: "px-3.5 text-caption text-label-secondary",
45
- };
46
- const timeText: Record<ConversationSize, string> = {
47
- sm: "px-3 text-caption2 text-label-secondary tabular-nums",
48
- md: "px-3 text-caption2 text-label-secondary tabular-nums",
49
- lg: "px-3.5 text-caption text-label-secondary tabular-nums",
50
- };
51
- const dayMargins: Record<ConversationSize, string> = {
52
- sm: "my-3",
53
- md: "my-4",
54
- lg: "my-5",
55
- };
56
-
57
- // Composer size records
58
- const composerSurfaces: Record<ConversationSize, string> = {
59
- sm: "flex items-end gap-2 rounded-4xl border border-separator bg-elevated py-1 pr-1 pl-3 transition-colors focus-within:border-accent-text/60",
60
- md: "flex items-end gap-2 rounded-5xl border border-separator bg-elevated py-1.5 pr-1.5 pl-4 transition-colors focus-within:border-accent-text/60",
61
- lg: "flex items-end gap-2 rounded-5xl border border-separator bg-elevated py-2 pr-2 pl-5 transition-colors focus-within:border-accent-text/60",
62
- };
63
- const textareaClasses: Record<ConversationSize, string> = {
64
- sm: "field-sizing-content max-h-48 min-h-8 flex-1 resize-none bg-transparent py-1 text-footnote text-label outline-none placeholder:text-label-secondary",
65
- md: "field-sizing-content max-h-48 min-h-9 flex-1 resize-none bg-transparent py-1.5 text-subheadline text-label outline-none placeholder:text-label-secondary",
66
- lg: "field-sizing-content max-h-48 min-h-10 flex-1 resize-none bg-transparent py-2 text-body text-label outline-none placeholder:text-label-secondary",
67
- };
68
- const sendButtonClasses: Record<ConversationSize, string> = {
69
- sm: "size-7 shrink-0 rounded-full",
70
- md: "size-8 shrink-0 rounded-full",
71
- lg: "size-9 shrink-0 rounded-full",
72
- };
73
- const sendIconSizes: Record<ConversationSize, number> = {
74
- sm: 16,
75
- md: 18,
76
- lg: 20,
77
- };
78
- const counterText: Record<ConversationSize, string> = {
79
- sm: "text-caption2 text-label-secondary tabular-nums",
80
- md: "text-caption2 text-label-secondary tabular-nums",
81
- lg: "text-caption text-label-secondary tabular-nums",
82
- };
83
-
84
- const GROUP_GAP_MS = 5 * 60 * 1000;
85
-
86
- function dayLabel(iso: string, locale?: string) {
87
- const date = new Date(iso);
88
- const today = new Date();
89
- const yesterday = new Date();
90
- yesterday.setDate(today.getDate() - 1);
91
- const offset =
92
- date.toDateString() === today.toDateString()
93
- ? 0
94
- : date.toDateString() === yesterday.toDateString()
95
- ? -1
96
- : null;
97
- if (offset === null)
98
- return date.toLocaleDateString(locale, {
99
- weekday: "long",
100
- month: "long",
101
- day: "numeric",
102
- });
103
- const word = new Intl.RelativeTimeFormat(locale, {
104
- numeric: "auto",
105
- }).format(offset, "day");
106
- return word.charAt(0).toLocaleUpperCase(locale) + word.slice(1);
107
- }
108
-
109
- const clock = (iso: string, locale?: string) =>
110
- new Date(iso).toLocaleTimeString(locale, {
111
- hour: "numeric",
112
- minute: "2-digit",
113
- });
114
-
115
- /**
116
- * A thread of plain-text messages like Messages on iPhone: a day line when
117
- * the date changes, back-to-back messages from one side grouped under one
118
- * name, theirs on the left with an avatar, yours on the right.
119
- */
120
- function Messages({
121
- messages,
122
- locale,
123
- size = "md",
124
- }: {
125
- messages: ConversationMessage[];
126
- /** For day names and times; the reader's own by default. */
127
- locale?: string;
128
- /** Bubble, avatar, author and time scale. @default "md" */
129
- size?: ConversationSize;
130
- }) {
131
- return (
132
- <ol data-not-typeset className="flex flex-col">
133
- {messages.map((message, index) => {
134
- const prev = messages[index - 1];
135
- const next = messages[index + 1];
136
- const newDay =
137
- !prev ||
138
- new Date(prev.createdAt).toDateString() !==
139
- new Date(message.createdAt).toDateString();
140
- const startsGroup =
141
- newDay ||
142
- prev.mine !== message.mine ||
143
- new Date(message.createdAt).getTime() -
144
- new Date(prev.createdAt).getTime() >
145
- GROUP_GAP_MS;
146
- const endsGroup =
147
- !next ||
148
- next.mine !== message.mine ||
149
- new Date(next.createdAt).getTime() -
150
- new Date(message.createdAt).getTime() >
151
- GROUP_GAP_MS;
152
-
153
- return (
154
- <li key={message.id} className="flex flex-col">
155
- {newDay && (
156
- <span
157
- suppressHydrationWarning
158
- className={cn(
159
- dayMargins[size],
160
- "text-caption2 text-label-secondary text-center font-medium",
161
- )}
162
- >
163
- {dayLabel(message.createdAt, locale)}
164
- </span>
165
- )}
166
- <div
167
- className={cn(
168
- "flex items-end gap-2",
169
- message.mine ? "justify-end" : "justify-start",
170
- startsGroup ? "mt-3" : "mt-0.5",
171
- )}
172
- >
173
- {!message.mine && (
174
- <span
175
- className={cn(
176
- "flex shrink-0 items-center justify-center",
177
- avatarSizes[size],
178
- )}
179
- >
180
- {endsGroup && message.avatar}
181
- </span>
182
- )}
183
- <div
184
- className={cn(
185
- "flex max-w-[78%] flex-col gap-1",
186
- message.mine ? "items-end" : "items-start",
187
- )}
188
- >
189
- {startsGroup && message.author && (
190
- <span className={authorText[size]}>{message.author}</span>
191
- )}
192
- <p
193
- suppressHydrationWarning
194
- title={formatTime(message.createdAt)}
195
- className={cn(
196
- bubbleClasses[size],
197
- "wrap-break-word whitespace-pre-wrap",
198
- message.mine
199
- ? "bg-inverse text-on-inverse"
200
- : "bg-fill text-label",
201
- endsGroup &&
202
- (message.mine
203
- ? bubbleTails[size]
204
- : bubbleTailsOther[size]),
205
- )}
206
- >
207
- {message.body}
208
- </p>
209
- {endsGroup && (
210
- <time
211
- suppressHydrationWarning
212
- dateTime={message.createdAt}
213
- className={timeText[size]}
214
- >
215
- {clock(message.createdAt, locale)}
216
- </time>
217
- )}
218
- </div>
219
- </div>
220
- </li>
221
- );
222
- })}
223
- </ol>
224
- );
225
- }
226
-
227
- type ComposerProps = {
228
- onSend: (body: string) => Promise<unknown>;
229
- pending?: boolean;
230
- maxLength: number;
231
- placeholder: string;
232
- /** Extra controls under the field, like a status picker. */
233
- actions?: ReactNode;
234
- /** Names the round Send button for screen readers. */
235
- sendLabel: string;
236
- /**
237
- * Words for the characters left, shown near the limit, such as
238
- * (count) => `${count} left`. Without it, just the number shows.
239
- */
240
- remaining?: (count: number) => string;
241
- /** Surface, textarea, send button and counter scale. @default "md" */
242
- size?: ConversationSize;
243
- };
244
-
245
- /** A reply field with a round send button; Ctrl/Cmd+Enter sends, and it clears only once the send worked. */
246
- function Composer({
247
- onSend,
248
- pending = false,
249
- maxLength,
250
- placeholder,
251
- actions,
252
- sendLabel,
253
- remaining,
254
- size = "md",
255
- }: ComposerProps) {
256
- const [body, setBody] = useState("");
257
- const ready = body.trim().length > 0 && !pending;
258
- const send = async () => {
259
- if (!ready) return;
260
- await onSend(body.trim());
261
- setBody("");
262
- };
263
-
264
- return (
265
- <form
266
- data-not-typeset
267
- className="flex flex-col gap-2"
268
- onSubmit={(event) => {
269
- event.preventDefault();
270
- void send();
271
- }}
272
- >
273
- <div className={composerSurfaces[size]}>
274
- <textarea
275
- value={body}
276
- onChange={(event) => setBody(event.target.value)}
277
- onKeyDown={(event) => {
278
- if (event.key === "Enter" && (event.metaKey || event.ctrlKey)) {
279
- event.preventDefault();
280
- void send();
281
- }
282
- }}
283
- maxLength={maxLength}
284
- placeholder={placeholder}
285
- rows={1}
286
- className={textareaClasses[size]}
287
- />
288
- <IconButton
289
- type="submit"
290
- size="icon-xs"
291
- disabled={!ready}
292
- label={sendLabel}
293
- className={sendButtonClasses[size]}
294
- >
295
- <SendIcon size={sendIconSizes[size]} strokeWidth={2.5} />
296
- </IconButton>
297
- </div>
298
- <div className="flex min-h-6 items-center gap-2 px-1">
299
- {actions}
300
- <span className={cn("ml-auto", counterText[size])}>
301
- {body.length > maxLength * 0.8 &&
302
- (remaining?.(maxLength - body.length) ?? maxLength - body.length)}
303
- </span>
304
- </div>
305
- </form>
306
- );
307
- }
308
-
309
- export const Conversation = { Messages, Composer };
@@ -1 +0,0 @@
1
- export * from "./conversation";
@@ -1,106 +0,0 @@
1
- import { useState } from "react";
2
- import { TextField, type TextFieldSize } from "../text-field/text-field";
3
- import { cn } from "../../lib/class-names";
4
- import { dateValue } from "./date-value";
5
-
6
- const legendText: Record<TextFieldSize, string> = {
7
- xs: "mb-2 text-caption font-medium",
8
- sm: "mb-2 text-footnote font-medium",
9
- md: "mb-3 text-subheadline font-medium",
10
- lg: "mb-3 text-body font-medium",
11
- };
12
- const fieldsetGap: Record<TextFieldSize, string> = {
13
- xs: "gap-2",
14
- sm: "gap-2",
15
- md: "gap-3",
16
- lg: "gap-4",
17
- };
18
- const errorText: Record<TextFieldSize, string> = {
19
- xs: "text-caption2 text-danger",
20
- sm: "text-caption text-danger",
21
- md: "text-footnote text-danger",
22
- lg: "text-subheadline text-danger",
23
- };
24
-
25
- type DatePickerProps = {
26
- value: string;
27
- onChange: (value: string) => void;
28
- label: string;
29
- labels: {
30
- day: string;
31
- month: string;
32
- year: string;
33
- invalid: string;
34
- };
35
- locale: string;
36
- max?: string;
37
- /** Field scale passed to each TextField; matches TextField's xs|sm|md|lg. @default "md" */
38
- size?: TextFieldSize;
39
- };
40
-
41
- /** Segmented date entry suited to birthdays, without a native calendar dialog. */
42
- export function DatePicker({
43
- value,
44
- onChange,
45
- label,
46
- labels,
47
- locale,
48
- max,
49
- size = "md",
50
- }: DatePickerProps) {
51
- const [year, month, day] = value.split("-");
52
- const [parts, setParts] = useState({
53
- year: year ?? "",
54
- month: month ?? "",
55
- day: day ?? "",
56
- });
57
- const complete = parts.year.length === 4 && Boolean(parts.month && parts.day);
58
- const invalid =
59
- complete && !dateValue(parts.year, parts.month, parts.day, max);
60
- const order = new Intl.DateTimeFormat(locale, {
61
- year: "numeric",
62
- month: "2-digit",
63
- day: "2-digit",
64
- timeZone: "UTC",
65
- })
66
- .formatToParts(new Date("2000-01-02T00:00:00Z"))
67
- .filter(
68
- (
69
- part,
70
- ): part is Intl.DateTimeFormatPart & {
71
- type: "year" | "month" | "day";
72
- } => part.type === "year" || part.type === "month" || part.type === "day",
73
- );
74
- return (
75
- <fieldset className={cn("flex min-w-0 flex-col", fieldsetGap[size])}>
76
- <legend className={legendText[size]}>{label}</legend>
77
- <div className={cn("grid grid-cols-3", fieldsetGap[size])}>
78
- {order.map(({ type }) => (
79
- <TextField
80
- key={type}
81
- label={labels[type]}
82
- inputMode="numeric"
83
- autoComplete={`bday-${type}`}
84
- maxLength={type === "year" ? 4 : 2}
85
- value={parts[type]}
86
- size={size}
87
- aria-invalid={invalid || undefined}
88
- onChange={(event) => {
89
- const next = {
90
- ...parts,
91
- [type]: event.target.value.replace(/\D/g, ""),
92
- };
93
- setParts(next);
94
- onChange(dateValue(next.year, next.month, next.day, max));
95
- }}
96
- />
97
- ))}
98
- </div>
99
- {invalid && (
100
- <p role="status" className={errorText[size]}>
101
- {labels.invalid}
102
- </p>
103
- )}
104
- </fieldset>
105
- );
106
- }
@@ -1,22 +0,0 @@
1
- /** Returns a date-only value without timezone conversion or date rollover. */
2
- export function dateValue(
3
- year: string,
4
- month: string,
5
- day: string,
6
- max?: string,
7
- ) {
8
- if (
9
- !/^\d{4}$/.test(year) ||
10
- !/^\d{1,2}$/.test(month) ||
11
- !/^\d{1,2}$/.test(day)
12
- )
13
- return "";
14
- const y = Number(year);
15
- const m = Number(month);
16
- const d = Number(day);
17
- const leap = y % 4 === 0 && (y % 100 !== 0 || y % 400 === 0);
18
- const days = [31, leap ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
19
- if (y < 1 || m < 1 || m > 12 || d < 1 || d > days[m - 1]) return "";
20
- const value = `${year}-${month.padStart(2, "0")}-${day.padStart(2, "0")}`;
21
- return max && value > max ? "" : value;
22
- }
@@ -1,119 +0,0 @@
1
- import { AnimatePresence, motion, useReducedMotion } from "motion/react";
2
- import { useEffect, useRef, useSyncExternalStore } from "react";
3
- import { Button } from "../button/button";
4
- import { spring } from "../../motion/transitions";
5
- import {
6
- advanceDialogQueue,
7
- getDialog,
8
- type PendingDialog,
9
- settleDialog,
10
- subscribeDialogs,
11
- } from "./dialog-store";
12
-
13
- /**
14
- * Renders confirmation dialogs: a glass card that springs up over blurred
15
- * content. Escape or a click outside cancels; Enter confirms unless the
16
- * action is destructive, where the safe choice has focus.
17
- */
18
- export function DialogHost() {
19
- const dialog = useSyncExternalStore(subscribeDialogs, getDialog, () => null);
20
- return (
21
- <AnimatePresence mode="wait" onExitComplete={advanceDialogQueue}>
22
- {dialog && <ConfirmCard key={dialog.id} dialog={dialog} />}
23
- </AnimatePresence>
24
- );
25
- }
26
-
27
- function ConfirmCard({ dialog }: { dialog: PendingDialog }) {
28
- const reducedMotion = useReducedMotion();
29
- const confirmRef = useRef<HTMLButtonElement>(null);
30
- const cancelRef = useRef<HTMLButtonElement>(null);
31
- const titleId = `dialog-title-${dialog.id}`;
32
- const messageId = `dialog-message-${dialog.id}`;
33
-
34
- useEffect(() => {
35
- const previous = window.document.activeElement as HTMLElement | null;
36
- (dialog.destructive ? cancelRef : confirmRef).current?.focus();
37
- const onKey = (event: KeyboardEvent) => {
38
- if (event.key === "Escape") {
39
- event.preventDefault();
40
- settleDialog(false, dialog.id);
41
- }
42
- // Keep focus inside the dialog.
43
- if (event.key === "Tab") {
44
- const order = [cancelRef.current, confirmRef.current].filter(
45
- Boolean,
46
- ) as HTMLElement[];
47
- const at = order.indexOf(window.document.activeElement as HTMLElement);
48
- event.preventDefault();
49
- order[
50
- (at + (event.shiftKey ? -1 : 1) + order.length) % order.length
51
- ]?.focus();
52
- }
53
- };
54
- window.addEventListener("keydown", onKey);
55
- return () => {
56
- window.removeEventListener("keydown", onKey);
57
- previous?.focus?.();
58
- };
59
- }, [dialog.destructive, dialog.id]);
60
-
61
- return (
62
- <div className="fixed inset-0 z-[70] flex items-center justify-center p-5">
63
- <motion.div
64
- aria-hidden="true"
65
- className="absolute inset-0 bg-black/25 backdrop-blur-md"
66
- initial={{ opacity: 0 }}
67
- animate={{ opacity: 1 }}
68
- exit={{ opacity: 0 }}
69
- transition={reducedMotion ? { duration: 0 } : spring.smooth}
70
- onClick={() => settleDialog(false, dialog.id)}
71
- />
72
- <motion.div
73
- role="alertdialog"
74
- aria-modal="true"
75
- aria-labelledby={titleId}
76
- aria-describedby={dialog.message ? messageId : undefined}
77
- className="glass-menu rounded-5xl relative flex w-full max-w-[340px] flex-col gap-4 p-5 text-center"
78
- initial={reducedMotion ? { opacity: 0 } : { opacity: 0, y: 12 }}
79
- animate={{ opacity: 1, y: 0 }}
80
- exit={reducedMotion ? { opacity: 0 } : { opacity: 0, y: 6 }}
81
- transition={reducedMotion ? { duration: 0 } : spring.smooth}
82
- >
83
- <div className="flex flex-col gap-1.5 px-1 pt-1">
84
- <h2 id={titleId} className="text-body text-label font-semibold">
85
- {dialog.title}
86
- </h2>
87
- {dialog.message && (
88
- <p
89
- id={messageId}
90
- className="text-subheadline text-label-secondary leading-snug"
91
- >
92
- {dialog.message}
93
- </p>
94
- )}
95
- </div>
96
- <div className="flex gap-2.5">
97
- <Button
98
- ref={cancelRef}
99
- type="button"
100
- variant="secondary"
101
- onClick={() => settleDialog(false, dialog.id)}
102
- className="min-w-0 grow rounded-2xl"
103
- >
104
- {dialog.cancelLabel ?? "Cancel"}
105
- </Button>
106
- <Button
107
- ref={confirmRef}
108
- type="button"
109
- variant={dialog.destructive ? "destructive" : "default"}
110
- onClick={() => settleDialog(true, dialog.id)}
111
- className="min-w-0 grow rounded-2xl"
112
- >
113
- {dialog.confirmLabel ?? "OK"}
114
- </Button>
115
- </div>
116
- </motion.div>
117
- </div>
118
- );
119
- }