@passui/react 0.1.47 → 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 (427) 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 -38
  259. package/dist/types/src/components/popover/popover-root.d.ts +0 -22
  260. package/dist/types/src/components/popover/popover-trigger.d.ts +0 -23
  261. package/dist/types/src/components/profile-image/profile-image.d.ts +0 -9
  262. package/dist/types/src/components/progress-view/progress-view.d.ts +0 -13
  263. package/dist/types/src/components/progress-view/use-liquid-progress.d.ts +0 -3
  264. package/dist/types/src/components/radio-group/radio-group.d.ts +0 -20
  265. package/dist/types/src/components/search-field/expanding-search-field.d.ts +0 -5
  266. package/dist/types/src/components/search-field/search-field.d.ts +0 -9
  267. package/dist/types/src/components/search-list/search-list.d.ts +0 -22
  268. package/dist/types/src/components/section/section.d.ts +0 -18
  269. package/dist/types/src/components/secure-field/secure-field.d.ts +0 -4
  270. package/dist/types/src/components/segmented-control/segmented-control.d.ts +0 -25
  271. package/dist/types/src/components/sheet/modal-environment.d.ts +0 -2
  272. package/dist/types/src/components/sheet/sheet-portal.d.ts +0 -5
  273. package/dist/types/src/components/sheet/sheet.d.ts +0 -26
  274. package/dist/types/src/components/sheet/use-sheet-focus.d.ts +0 -3
  275. package/dist/types/src/components/sidebar/sidebar.d.ts +0 -24
  276. package/dist/types/src/components/skeleton/skeleton.d.ts +0 -9
  277. package/dist/types/src/components/slider/slider.d.ts +0 -17
  278. package/dist/types/src/components/slosh-slider/liquid-step.d.ts +0 -6
  279. package/dist/types/src/components/slosh-slider/slosh-slider.d.ts +0 -21
  280. package/dist/types/src/components/stat-tile/index.d.ts +0 -1
  281. package/dist/types/src/components/stat-tile/stat-tile.d.ts +0 -20
  282. package/dist/types/src/components/status-indicator/status-indicator.d.ts +0 -17
  283. package/dist/types/src/components/stepper/rolling-digit.d.ts +0 -11
  284. package/dist/types/src/components/stepper/stepper.d.ts +0 -22
  285. package/dist/types/src/components/swatch-picker/swatch-picker.d.ts +0 -22
  286. package/dist/types/src/components/tab-bar/tab-bar.d.ts +0 -43
  287. package/dist/types/src/components/tab-view/tab-view.d.ts +0 -27
  288. package/dist/types/src/components/text-editor/text-editor.d.ts +0 -9
  289. package/dist/types/src/components/text-field/text-field.d.ts +0 -33
  290. package/dist/types/src/components/toast/toast-store.d.ts +0 -52
  291. package/dist/types/src/components/toggle/toggle.d.ts +0 -22
  292. package/dist/types/src/components/tooltip/tooltip-host.d.ts +0 -7
  293. package/dist/types/src/components/view-controller/index.d.ts +0 -1
  294. package/dist/types/src/components/view-controller/view-controller.d.ts +0 -21
  295. package/dist/types/src/components/wake-slider/wake-slider.d.ts +0 -15
  296. package/dist/types/src/hooks/scroll/minimize-decision.d.ts +0 -2
  297. package/dist/types/src/hooks/use-anchored-disclosure.d.ts +0 -9
  298. package/dist/types/src/hooks/use-floating-dismiss.d.ts +0 -3
  299. package/dist/types/src/hooks/viewport/types.d.ts +0 -19
  300. package/dist/types/src/hooks/viewport/viewport-metrics.d.ts +0 -3
  301. package/dist/types/src/icons/icons.d.ts +0 -616
  302. package/dist/types/src/index.d.ts +0 -73
  303. package/dist/types/src/lib/class-names.d.ts +0 -2
  304. package/dist/types/src/lib/date.d.ts +0 -50
  305. package/dist/types/src/lib/floating-layers.d.ts +0 -8
  306. package/dist/types/src/lib/range-value.d.ts +0 -4
  307. package/dist/types/src/machines/popover.machine.d.ts +0 -30
  308. package/dist/types/src/motion/transitions.d.ts +0 -170
  309. package/src/appearance/index.ts +0 -2
  310. package/src/appearance/platform.tsx +0 -102
  311. package/src/appearance/theme.tsx +0 -467
  312. package/src/components/accordion/accordion.tsx +0 -70
  313. package/src/components/ambient/ambient.tsx +0 -35
  314. package/src/components/ambient/index.ts +0 -1
  315. package/src/components/aspect-ratio/aspect-ratio.tsx +0 -27
  316. package/src/components/breadcrumb/breadcrumb.tsx +0 -73
  317. package/src/components/button/button-styles.ts +0 -49
  318. package/src/components/button/button.tsx +0 -107
  319. package/src/components/button/icon-button.tsx +0 -33
  320. package/src/components/button/pending-spinner.tsx +0 -14
  321. package/src/components/button/use-pending-indicator.ts +0 -22
  322. package/src/components/chip/chip.tsx +0 -45
  323. package/src/components/code-block/code-block.tsx +0 -48
  324. package/src/components/combo-box/combo-box.tsx +0 -13
  325. package/src/components/command/command.tsx +0 -149
  326. package/src/components/compact-date-picker/calendar-month.ts +0 -109
  327. package/src/components/compact-date-picker/compact-date-picker.tsx +0 -337
  328. package/src/components/compact-time-picker/compact-time-picker.tsx +0 -321
  329. package/src/components/compact-time-picker/time-value.ts +0 -58
  330. package/src/components/content-unavailable-view/content-unavailable-view.tsx +0 -78
  331. package/src/components/content-view/content-view.tsx +0 -215
  332. package/src/components/content-view/index.ts +0 -1
  333. package/src/components/context-menu/conceal-menu-source.ts +0 -30
  334. package/src/components/context-menu/context-menu-host.tsx +0 -459
  335. package/src/components/context-menu/context-menu-store.ts +0 -167
  336. package/src/components/context-menu/menu-navigation.ts +0 -36
  337. package/src/components/context-menu/menu-position.ts +0 -38
  338. package/src/components/context-menu/menu-reveal.ts +0 -42
  339. package/src/components/context-menu/use-context-menu.ts +0 -73
  340. package/src/components/conversation/conversation.tsx +0 -309
  341. package/src/components/conversation/index.ts +0 -1
  342. package/src/components/date-picker/date-picker.tsx +0 -106
  343. package/src/components/date-picker/date-value.ts +0 -22
  344. package/src/components/dialog/dialog-host.tsx +0 -119
  345. package/src/components/dialog/dialog-store.ts +0 -66
  346. package/src/components/dialog/dialog.tsx +0 -211
  347. package/src/components/dialog/index.ts +0 -1
  348. package/src/components/disclosure-group/disclosure-group.tsx +0 -108
  349. package/src/components/divider/divider.tsx +0 -33
  350. package/src/components/inline-disclosure/inline-disclosure.tsx +0 -53
  351. package/src/components/keyboard-shortcut/keyboard-shortcut.tsx +0 -32
  352. package/src/components/labeled-content/labeled-content.tsx +0 -84
  353. package/src/components/locale-switcher/index.ts +0 -1
  354. package/src/components/locale-switcher/locale-switcher.tsx +0 -310
  355. package/src/components/menu/menu.tsx +0 -85
  356. package/src/components/morph/index.ts +0 -2
  357. package/src/components/morph/morph.tsx +0 -258
  358. package/src/components/morph/use-morph-disclosure.ts +0 -27
  359. package/src/components/one-time-code/one-time-code.tsx +0 -234
  360. package/src/components/picker/picker-trigger.ts +0 -22
  361. package/src/components/picker/picker.tsx +0 -404
  362. package/src/components/popover/anchored-surface.tsx +0 -264
  363. package/src/components/popover/index.ts +0 -50
  364. package/src/components/popover/popover-content.tsx +0 -374
  365. package/src/components/popover/popover-root.tsx +0 -97
  366. package/src/components/popover/popover-trigger.tsx +0 -71
  367. package/src/components/profile-image/profile-image.tsx +0 -96
  368. package/src/components/progress-view/progress-view.tsx +0 -72
  369. package/src/components/progress-view/use-liquid-progress.ts +0 -43
  370. package/src/components/radio-group/radio-group.tsx +0 -86
  371. package/src/components/search-field/expanding-search-field.tsx +0 -197
  372. package/src/components/search-field/search-field.tsx +0 -66
  373. package/src/components/search-list/search-list.tsx +0 -276
  374. package/src/components/section/section.tsx +0 -75
  375. package/src/components/secure-field/secure-field.tsx +0 -8
  376. package/src/components/segmented-control/segmented-control.tsx +0 -157
  377. package/src/components/sheet/modal-environment.ts +0 -82
  378. package/src/components/sheet/sheet-portal.tsx +0 -62
  379. package/src/components/sheet/sheet.tsx +0 -165
  380. package/src/components/sheet/use-sheet-focus.ts +0 -109
  381. package/src/components/sidebar/sidebar.tsx +0 -102
  382. package/src/components/skeleton/skeleton.tsx +0 -38
  383. package/src/components/slider/slider.tsx +0 -134
  384. package/src/components/slosh-slider/liquid-step.ts +0 -43
  385. package/src/components/slosh-slider/slosh-slider.tsx +0 -294
  386. package/src/components/stat-tile/index.ts +0 -1
  387. package/src/components/stat-tile/stat-tile.tsx +0 -90
  388. package/src/components/status-indicator/status-indicator.tsx +0 -54
  389. package/src/components/stepper/rolling-digit.tsx +0 -91
  390. package/src/components/stepper/stepper.tsx +0 -136
  391. package/src/components/swatch-picker/swatch-picker.tsx +0 -138
  392. package/src/components/tab-bar/tab-bar.tsx +0 -182
  393. package/src/components/tab-view/tab-view.tsx +0 -155
  394. package/src/components/table/table.tsx +0 -151
  395. package/src/components/text-editor/text-editor.tsx +0 -42
  396. package/src/components/text-field/text-field.tsx +0 -200
  397. package/src/components/toast/toast-store.ts +0 -164
  398. package/src/components/toast/toaster.tsx +0 -407
  399. package/src/components/toggle/toggle.tsx +0 -320
  400. package/src/components/tooltip/tooltip-host.tsx +0 -178
  401. package/src/components/view-controller/index.ts +0 -1
  402. package/src/components/view-controller/view-controller.tsx +0 -75
  403. package/src/components/wake-slider/wake-slider.tsx +0 -260
  404. package/src/hooks/use-anchored-disclosure.ts +0 -23
  405. package/src/hooks/use-anchored-placement.ts +0 -40
  406. package/src/hooks/use-dismiss.ts +0 -44
  407. package/src/hooks/use-floating-dismiss.ts +0 -30
  408. package/src/hooks/use-media-query.ts +0 -94
  409. package/src/hooks/use-minimize-on-scroll.ts +0 -77
  410. package/src/hooks/viewport/types.ts +0 -19
  411. package/src/hooks/viewport/viewport-metrics.ts +0 -19
  412. package/src/icons/icons.tsx +0 -458
  413. package/src/index.ts +0 -107
  414. package/src/lib/anchored-placement.ts +0 -91
  415. package/src/lib/class-names.ts +0 -21
  416. package/src/lib/clipboard.ts +0 -15
  417. package/src/lib/date.ts +0 -86
  418. package/src/lib/floating-layers.ts +0 -53
  419. package/src/lib/haptics.ts +0 -23
  420. package/src/lib/language.ts +0 -16
  421. package/src/lib/range-value.ts +0 -38
  422. package/src/lib/screen-edges.ts +0 -44
  423. package/src/lib/shapes.ts +0 -59
  424. package/src/machines/popover.machine.ts +0 -51
  425. package/src/motion/transitions.ts +0 -97
  426. package/src/tokens.ts +0 -1
  427. /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
- }