@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,264 +0,0 @@
1
- import { springs } from "@passui/tokens/motion";
2
- import { useMediaQuery } from "../../hooks/use-media-query";
3
- import {
4
- forwardRef,
5
- type HTMLAttributes,
6
- useLayoutEffect,
7
- useRef,
8
- useState,
9
- } from "react";
10
- import { useAnchoredPlacement } from "../../hooks/use-anchored-placement";
11
- import { FLOATING_LAYER } from "../../hooks/use-dismiss";
12
- import { useFloatingDismiss } from "../../hooks/use-floating-dismiss";
13
- import { cn } from "../../lib/class-names";
14
- import { registerFloatingLayer } from "../../lib/floating-layers";
15
- import { concealMenuSource } from "../context-menu/conceal-menu-source";
16
- import { menuSurfaceReveal } from "../context-menu/menu-reveal";
17
-
18
- interface AnchoredSurfaceProps extends HTMLAttributes<HTMLDivElement> {
19
- open: boolean;
20
- onExited: () => void;
21
- anchor: HTMLElement;
22
- width: number;
23
- needed: number;
24
- onClose: (restoreFocus: boolean) => void;
25
- contentClassName?: string;
26
- }
27
-
28
- /**
29
- * Shared material and lifetime for portaled
30
- * pickers; their content owns
31
- * selection.
32
- * */
33
- export const AnchoredSurface = forwardRef<HTMLDivElement, AnchoredSurfaceProps>(
34
- function AnchoredSurface(
35
- {
36
- open: present,
37
- onExited: remove,
38
- anchor,
39
- width,
40
- needed,
41
- onClose,
42
- children,
43
- className,
44
- contentClassName,
45
- ...props
46
- },
47
- forwardedRef,
48
- ) {
49
- const root = useRef<HTMLDivElement>(null);
50
- const reducedMotion = useMediaQuery("(prefers-reduced-motion: reduce)");
51
- const material = useRef<HTMLDivElement>(null);
52
- const content = useRef<HTMLDivElement>(null);
53
- const animated = useRef<{
54
- values: number[];
55
- velocities: number[];
56
- opacity: number;
57
- materialOpacity: number;
58
- } | null>(null);
59
- const placement = useAnchoredPlacement(anchor, width, needed, true);
60
- const [geometry, setGeometry] = useState<{
61
- source: ReturnType<typeof menuSurfaceReveal>;
62
- width: number;
63
- height: number;
64
- radius: number;
65
- } | null>(null);
66
-
67
- // biome-ignore lint/correctness/useExhaustiveDependencies: Placement can move without resizing; remeasure the source-relative reveal.
68
- useLayoutEffect(() => {
69
- const panel = root.current;
70
- if (!panel || !present) return;
71
- const measure = () => {
72
- const target = panel.getBoundingClientRect();
73
- const source = anchor.getBoundingClientRect();
74
- const radius =
75
- Number.parseFloat(getComputedStyle(panel).borderTopLeftRadius) || 0;
76
- const reveal = menuSurfaceReveal(source, target);
77
- setGeometry((current) =>
78
- current &&
79
- current.width === target.width &&
80
- current.height === target.height &&
81
- current.radius === radius &&
82
- current.source.x === reveal.x &&
83
- current.source.y === reveal.y &&
84
- current.source.width === reveal.width &&
85
- current.source.height === reveal.height
86
- ? current
87
- : {
88
- source: reveal,
89
- width: target.width,
90
- height: target.height,
91
- radius,
92
- },
93
- );
94
- };
95
- measure();
96
- const observer = new ResizeObserver(measure);
97
- observer.observe(panel);
98
- return () => observer.disconnect();
99
- }, [
100
- anchor,
101
- present,
102
- placement.left,
103
- placement.top,
104
- placement.bottom,
105
- placement.width,
106
- ]);
107
-
108
- useLayoutEffect(() => {
109
- if (!root.current) return;
110
- const unregister = registerFloatingLayer(root.current, anchor);
111
- return unregister;
112
- }, [anchor]);
113
-
114
- useLayoutEffect(() => {
115
- if (!present) return;
116
- const restore = concealMenuSource(anchor, false);
117
- return () => {
118
- restore();
119
- };
120
- }, [anchor, present]);
121
-
122
- useLayoutEffect(() => {
123
- if (!geometry || !material.current || !content.current) {
124
- if (!present) remove?.();
125
- return;
126
- }
127
- const pane = material.current;
128
- const body = content.current;
129
- const source = [
130
- geometry.source.x,
131
- geometry.source.y,
132
- geometry.source.width,
133
- geometry.source.height,
134
- geometry.source.borderRadius,
135
- ];
136
- const target = present
137
- ? [0, 0, geometry.width, geometry.height, geometry.radius]
138
- : source;
139
- const state = animated.current ?? {
140
- values: [...source],
141
- velocities: source.map(() => 0),
142
- opacity: 0,
143
- materialOpacity: 1,
144
- };
145
- animated.current = state;
146
- let frame = 0;
147
- let previous = 0;
148
- const paint = () => {
149
- const [x, y, width, height, radius] = state.values;
150
- pane.style.transform = `translate(${x}px, ${y}px)`;
151
- pane.style.width = `${Math.max(0, width)}px`;
152
- pane.style.height = `${Math.max(0, height)}px`;
153
- pane.style.borderRadius = `${Math.max(0, radius)}px`;
154
- pane.style.opacity = String(state.materialOpacity);
155
- body.style.opacity = String(state.opacity);
156
- };
157
- const tick = (now: number) => {
158
- const dt = previous ? Math.min(0.032, (now - previous) / 1000) : 1 / 60;
159
- previous = now;
160
- const { stiffness, damping, mass } = springs.smooth;
161
- let resting = true;
162
- for (let index = 0; index < target.length; index++) {
163
- state.velocities[index] +=
164
- (((target[index] - state.values[index]) * stiffness -
165
- state.velocities[index] * damping) /
166
- mass) *
167
- dt;
168
- state.values[index] += state.velocities[index] * dt;
169
- if (
170
- Math.abs(target[index] - state.values[index]) > 0.05 ||
171
- Math.abs(state.velocities[index]) > 0.05
172
- )
173
- resting = false;
174
- }
175
- const progress = Math.max(
176
- 0,
177
- Math.min(
178
- 1,
179
- 1 -
180
- Math.abs(geometry.height - state.values[3]) /
181
- Math.max(1, Math.abs(geometry.height - source[3])),
182
- ),
183
- );
184
- const opacity = present ? Math.max(0, (progress - 0.25) / 0.75) : 0;
185
- state.opacity += (opacity - state.opacity) * (1 - Math.exp(-dt / 0.04));
186
- state.materialOpacity +=
187
- ((present ? 1 : 0) - state.materialOpacity) *
188
- (1 - Math.exp(-dt / 0.04));
189
- paint();
190
- if (
191
- resting &&
192
- Math.abs(opacity - state.opacity) < 0.01 &&
193
- Math.abs((present ? 1 : 0) - state.materialOpacity) < 0.01
194
- ) {
195
- state.values = [...target];
196
- state.velocities.fill(0);
197
- state.opacity = present ? 1 : 0;
198
- state.materialOpacity = present ? 1 : 0;
199
- paint();
200
- if (!present) remove?.();
201
- return;
202
- }
203
- frame = requestAnimationFrame(tick);
204
- };
205
- if (reducedMotion) {
206
- state.values = [...target];
207
- state.velocities.fill(0);
208
- state.opacity = present ? 1 : 0;
209
- state.materialOpacity = present ? 1 : 0;
210
- paint();
211
- if (!present) remove?.();
212
- } else {
213
- paint();
214
- frame = requestAnimationFrame(tick);
215
- }
216
- return () => cancelAnimationFrame(frame);
217
- }, [geometry, present, remove, reducedMotion]);
218
-
219
- useFloatingDismiss(root, anchor, (restore) => {
220
- if (present) onClose(restore);
221
- });
222
-
223
- return (
224
- <div
225
- {...props}
226
- ref={(node) => {
227
- root.current = node;
228
- if (typeof forwardedRef === "function") forwardedRef(node);
229
- else if (forwardedRef) forwardedRef.current = node;
230
- }}
231
- {...{ [FLOATING_LAYER]: "" }}
232
- inert={!present}
233
- className={cn(
234
- "fixed isolate z-[80] flex min-w-0 flex-col rounded-3xl outline-none",
235
- !present && "pointer-events-none",
236
- className,
237
- )}
238
- style={{
239
- left: placement.left,
240
- top: placement.top,
241
- bottom: placement.bottom,
242
- width: placement.width,
243
- maxHeight: placement.maxHeight ?? 420,
244
- }}
245
- >
246
- <div
247
- ref={material}
248
- aria-hidden="true"
249
- className="glass-menu pointer-events-none absolute top-0 left-0 -z-10"
250
- />
251
- <div
252
- ref={content}
253
- style={{ opacity: 0 }}
254
- className={cn(
255
- "flex min-h-0 flex-col overflow-y-auto overscroll-contain",
256
- contentClassName,
257
- )}
258
- >
259
- {children}
260
- </div>
261
- </div>
262
- );
263
- },
264
- );
@@ -1,50 +0,0 @@
1
- /**
2
- * Popover — a glass surface that springs open from its trigger.
3
- *
4
- * Compound API (the only API):
5
- *
6
- * ```tsx
7
- * <Popover>
8
- * <Popover.Trigger render={(props) => <Button {...props}>Open</Button>} />
9
- * <Popover.Content origin="top-left" className="top-full left-0 mt-2 w-64 p-4">
10
- * …content…
11
- * </Popover.Content>
12
- * </Popover>
13
- * ```
14
- *
15
- * The `Popover.Trigger` clones its child (or uses a `render` prop) and wires
16
- * up aria-haspopup, aria-expanded, aria-controls, click + keyboard toggling.
17
- * The `Popover.Content` portals out of the authored layout, morphs its glass
18
- * surface from the trigger's rect, and keeps itself inside the viewport as
19
- * it resizes or scrolls. `origin` picks the corner it grows from; pass
20
- * `placement="center"` for a modal center-screen variant.
21
- *
22
- * State is driven by a small pure machine (`popover.machine.ts`) that
23
- * translates directly to a Rust enum — see the architecture plan.
24
- */
25
- export { PopoverRoot as Root } from "./popover-root";
26
- export {
27
- PopoverTrigger as Trigger,
28
- type PopoverTriggerRenderProps,
29
- } from "./popover-trigger";
30
- export {
31
- PopoverContent as Content,
32
- type PopoverOrigin,
33
- } from "./popover-content";
34
-
35
- import { PopoverRoot } from "./popover-root";
36
- import { PopoverTrigger } from "./popover-trigger";
37
- import { PopoverContent } from "./popover-content";
38
-
39
- /**
40
- * Compound Popover. Use as `<Popover>` with `.Trigger` and `.Content` parts,
41
- * or import `Root` / `Trigger` / `Content` directly from the barrel.
42
- */
43
- export const Popover = Object.assign(PopoverRoot, {
44
- Trigger: PopoverTrigger,
45
- Content: PopoverContent,
46
- });
47
-
48
- export type { PopoverRootProps } from "./popover-root";
49
- export type { PopoverTriggerProps } from "./popover-trigger";
50
- export type { PopoverContentProps } from "./popover-content";
@@ -1,374 +0,0 @@
1
- import { AnimatePresence, motion, useReducedMotion } from "motion/react";
2
- import { type ReactNode, useLayoutEffect, useRef, useState } from "react";
3
- import { concealMenuSource } from "../context-menu/conceal-menu-source";
4
- import {
5
- menuSurfaceExit,
6
- menuSurfaceReveal,
7
- type MenuRect,
8
- } from "../context-menu/menu-reveal";
9
- import { useSheetFocus } from "../sheet/use-sheet-focus";
10
- import { SheetPortal } from "../sheet/sheet-portal";
11
- import { cn } from "../../lib/class-names";
12
- import { screenEdges } from "../../lib/screen-edges";
13
- import { fluidCollapse, fluidOvershoot } from "../../motion/transitions";
14
- import { usePopover } from "./popover-root";
15
-
16
- export type PopoverOrigin = "top-left" | "top-right";
17
-
18
- export interface PopoverContentProps {
19
- children: ReactNode;
20
- /** Extra classes for the panel (sizing, padding, max-height). */
21
- className?: string;
22
- /** Accessible name (used when there is no labelledBy). */
23
- label?: string;
24
- /** ID of a visible heading inside the content. */
25
- labelledBy?: string;
26
- /** Allow tapping outside to close. Escape always closes. */
27
- dismissOnOutsidePress?: boolean;
28
- /**
29
- * Where the content rests once expanded:
30
- * - "anchor" positions relative to the trigger (default)
31
- * - "center" floats in the middle of the viewport (modal)
32
- */
33
- placement?: "anchor" | "center";
34
- /**
35
- * Which corner the popover grows from when placement="anchor".
36
- * top-left: panel's left edge aligns to the trigger's left.
37
- * top-right: panel's right edge aligns to the trigger's right.
38
- * @default "top-left"
39
- */
40
- origin?: PopoverOrigin;
41
- /**
42
- * Gap between the trigger and the panel, in pixels.
43
- * @default 8
44
- */
45
- gap?: number;
46
- /**
47
- * ARIA role for the panel. Use "menu" for action menus, "dialog"
48
- * (the default) for free-form content, "tooltip" for tips.
49
- * @default "dialog"
50
- */
51
- role?: "dialog" | "menu" | "tooltip";
52
- }
53
-
54
- interface Placement {
55
- /** Fixed left in viewport px. */
56
- left: number;
57
- /** Fixed top in viewport px. */
58
- top: number;
59
- /** Width cap so the panel never crosses the right safe edge. */
60
- maxWidth: number;
61
- /** Height cap; when set, the panel scrolls inside it. */
62
- maxHeight?: number;
63
- /** True when the panel opens above the trigger. */
64
- above: boolean;
65
- }
66
-
67
- const NO_PLACEMENT: Placement = {
68
- left: 0,
69
- top: 0,
70
- maxWidth: 0,
71
- above: false,
72
- };
73
-
74
- /**
75
- * Place the panel below (or above) the trigger, aligned to the chosen
76
- * corner, kept inside the screen's safe edges. Pure: no DOM, just math.
77
- */
78
- function placePanel(
79
- trigger: DOMRect,
80
- panel: { width: number; height: number },
81
- origin: PopoverOrigin,
82
- gap: number,
83
- ): Placement {
84
- const edges = screenEdges();
85
- const vv = window.visualViewport;
86
- const vw = (vv?.width ?? window.innerWidth) + (vv?.offsetLeft ?? 0);
87
- const vh = (vv?.height ?? window.innerHeight) + (vv?.offsetTop ?? 0);
88
- const safeLeft = edges.left + (vv?.offsetLeft ?? 0);
89
- const safeRight = vw - edges.right;
90
- const safeTop = edges.top + (vv?.offsetTop ?? 0);
91
- const safeBottom = vh - edges.bottom;
92
-
93
- // Horizontal: align the chosen edge to the trigger, then clamp into view.
94
- const maxWidth = Math.max(0, safeRight - safeLeft);
95
- const width = Math.min(panel.width, maxWidth);
96
- const left =
97
- origin === "top-right"
98
- ? Math.max(safeLeft, Math.min(trigger.right - width, safeRight - width))
99
- : Math.max(safeLeft, Math.min(trigger.left, safeRight - width));
100
-
101
- // Vertical: prefer below; flip above when there isn't room below but
102
- // there is above (matching the legacy popover's behaviour).
103
- const roomBelow = safeBottom - trigger.bottom - gap;
104
- const roomAbove = trigger.top - gap - safeTop;
105
- const above = roomBelow < panel.height && roomAbove > roomBelow;
106
- const room = above ? roomAbove : roomBelow;
107
- const top = above
108
- ? trigger.top - gap - Math.min(panel.height, room)
109
- : trigger.bottom + gap;
110
- const maxHeight = panel.height > room ? room : undefined;
111
-
112
- return { left, top, maxWidth, maxHeight, above };
113
- }
114
-
115
- export function PopoverContent({
116
- children,
117
- className,
118
- label,
119
- labelledBy,
120
- dismissOnOutsidePress = true,
121
- placement = "anchor",
122
- origin = "top-left",
123
- gap = 8,
124
- role = "dialog",
125
- }: PopoverContentProps) {
126
- const { state, send, triggerRef, contentId } = usePopover();
127
- const panel = useRef<HTMLDivElement>(null);
128
- const reducedMotion = useReducedMotion();
129
- const [settled, setSettled] = useState(false);
130
- const [material, setMaterial] = useState({ width: 0, height: 0, radius: 0 });
131
- const [placementState, setPlacement] = useState<Placement>(NO_PLACEMENT);
132
- const [reveal, setReveal] = useState<ReturnType<
133
- typeof menuSurfaceReveal
134
- > | null>(null);
135
-
136
- useSheetFocus(panel, () => send("CLOSE"));
137
-
138
- // Re-measure on every layout pass: trigger position, panel size, scroll,
139
- // viewport resize. Recompute the fixed placement + the morph source rect.
140
- useLayoutEffect(() => {
141
- const surface = panel.current;
142
- const source = triggerRef.current;
143
- if (!surface) return;
144
-
145
- const refit = () => {
146
- const trigger = source?.getBoundingClientRect();
147
- // Measure the authored size (padding/width from className) so the
148
- // morph target is the natural panel the author styled.
149
- const natural = surface.getBoundingClientRect();
150
- const radius =
151
- Number.parseFloat(getComputedStyle(surface).borderTopLeftRadius) || 0;
152
- setMaterial((prev) =>
153
- prev.width === natural.width &&
154
- prev.height === natural.height &&
155
- prev.radius === radius
156
- ? prev
157
- : { width: natural.width, height: natural.height, radius },
158
- );
159
-
160
- if (trigger && trigger.width > 0 && trigger.height > 0) {
161
- const next = placePanel(
162
- trigger,
163
- { width: natural.width, height: natural.height },
164
- origin,
165
- gap,
166
- );
167
- setPlacement((current) =>
168
- current.left === next.left &&
169
- current.top === next.top &&
170
- current.maxWidth === next.maxWidth &&
171
- current.maxHeight === next.maxHeight &&
172
- current.above === next.above
173
- ? current
174
- : next,
175
- );
176
- const sourceArg: MenuRect = {
177
- left: trigger.left,
178
- top: trigger.top,
179
- width: trigger.width,
180
- height: trigger.height,
181
- };
182
- setReveal(
183
- menuSurfaceReveal(sourceArg, {
184
- left: next.left,
185
- top: next.top,
186
- width: Math.min(natural.width, next.maxWidth),
187
- height: next.maxHeight
188
- ? Math.min(natural.height, next.maxHeight)
189
- : natural.height,
190
- radius,
191
- }),
192
- );
193
- }
194
- };
195
-
196
- refit();
197
- let frame = 0;
198
- const schedule = () => {
199
- cancelAnimationFrame(frame);
200
- frame = requestAnimationFrame(refit);
201
- };
202
- const observer = new ResizeObserver(schedule);
203
- observer.observe(surface);
204
- if (source) observer.observe(source);
205
- const viewport = window.visualViewport;
206
- viewport?.addEventListener("resize", schedule);
207
- viewport?.addEventListener("scroll", schedule);
208
- window.addEventListener("resize", schedule);
209
- window.addEventListener("scroll", schedule, true);
210
- return () => {
211
- observer.disconnect();
212
- cancelAnimationFrame(frame);
213
- viewport?.removeEventListener("resize", schedule);
214
- viewport?.removeEventListener("scroll", schedule);
215
- window.removeEventListener("resize", schedule);
216
- window.removeEventListener("scroll", schedule, true);
217
- };
218
- }, [triggerRef, origin, gap]);
219
-
220
- // Conceal the trigger while the surface is morphing out of it.
221
- useLayoutEffect(() => {
222
- const source = triggerRef.current;
223
- if (!source) return;
224
- const restore = concealMenuSource(source, false);
225
- return () => {
226
- restore();
227
- };
228
- }, [triggerRef]);
229
-
230
- const anchored = placement === "anchor";
231
- const scrollable = settled && placementState.maxHeight !== undefined;
232
-
233
- return (
234
- <AnimatePresence>
235
- {state !== "closed" && (
236
- <SheetPortal>
237
- {placement === "center" && (
238
- <motion.div
239
- aria-hidden="true"
240
- className="fixed inset-0 z-[75] bg-black/30 backdrop-blur-md"
241
- initial={{ opacity: 0 }}
242
- animate={{ opacity: 1 }}
243
- exit={{ opacity: 0 }}
244
- transition={reducedMotion ? { duration: 0 } : { duration: 0.18 }}
245
- onClick={dismissOnOutsidePress ? () => send("CLOSE") : undefined}
246
- />
247
- )}
248
- <motion.div
249
- ref={panel}
250
- id={contentId}
251
- role={role}
252
- aria-modal={placement === "center" || undefined}
253
- aria-label={labelledBy ? undefined : label}
254
- aria-labelledby={labelledBy}
255
- tabIndex={-1}
256
- data-state={state}
257
- data-placement={
258
- anchored ? (placementState.above ? "top" : "bottom") : "center"
259
- }
260
- className={cn(
261
- "isolate flex flex-col outline-none",
262
- anchored
263
- ? "rounded-5xl absolute z-40 [&>:not([data-popover-surface])]:opacity-[var(--popover-content-opacity)]"
264
- : "rounded-5xl fixed z-[76] max-h-[92%] w-full max-w-[560px] p-6",
265
- scrollable ? "overflow-hidden" : undefined,
266
- className,
267
- )}
268
- style={
269
- anchored
270
- ? {
271
- position: "fixed",
272
- left: placementState.left,
273
- top: placementState.top,
274
- maxWidth: placementState.maxWidth || undefined,
275
- maxHeight: placementState.maxHeight,
276
- overflowY: scrollable ? "auto" : undefined,
277
- transformOrigin:
278
- origin === "top-left"
279
- ? `0% ${placementState.above ? "100%" : "0%"}`
280
- : `100% ${placementState.above ? "100%" : "0%"}`,
281
- }
282
- : undefined
283
- }
284
- initial={
285
- anchored
286
- ? { "--popover-content-opacity": reducedMotion ? 1 : 0 }
287
- : { opacity: 0 }
288
- }
289
- animate={
290
- anchored ? { "--popover-content-opacity": 1 } : { opacity: 1 }
291
- }
292
- exit={
293
- anchored
294
- ? {
295
- "--popover-content-opacity": 0,
296
- transition: { duration: reducedMotion ? 0 : 0.06 },
297
- }
298
- : { opacity: 0 }
299
- }
300
- transition={
301
- anchored
302
- ? reducedMotion
303
- ? { duration: 0 }
304
- : { duration: 0.16, delay: 0.06 }
305
- : reducedMotion
306
- ? { duration: 0 }
307
- : { duration: 0.16, delay: 0.06 }
308
- }
309
- >
310
- {/* The morphing glass surface — starts at the trigger's rect
311
- and grows to fill the panel, with the fluid overshoot bounce. */}
312
- <motion.div
313
- key={reveal ? "surface" : "measure"}
314
- aria-hidden="true"
315
- data-popover-surface=""
316
- onAnimationComplete={() => {
317
- if (state === "opening") send("OPENED");
318
- if (state === "closing") send("CLOSED");
319
- if (reveal) setSettled(true);
320
- }}
321
- className="glass-menu rounded-5xl pointer-events-none absolute top-0 left-0 -z-10"
322
- style={{ width: "100%", height: "100%" }}
323
- initial={reducedMotion || !reveal ? { opacity: 0 } : reveal}
324
- animate={
325
- material.width > 0
326
- ? {
327
- x: 0,
328
- y: 0,
329
- width: material.width,
330
- height: placementState.maxHeight
331
- ? Math.min(material.height, placementState.maxHeight)
332
- : material.height,
333
- opacity: 1,
334
- borderRadius: material.radius,
335
- }
336
- : undefined
337
- }
338
- exit={
339
- reducedMotion || !reveal
340
- ? { opacity: 0 }
341
- : {
342
- ...menuSurfaceExit(reveal),
343
- transition: fluidCollapse,
344
- }
345
- }
346
- transition={
347
- reducedMotion
348
- ? { duration: 0 }
349
- : { ...fluidOvershoot, opacity: { duration: 0.16 } }
350
- }
351
- />
352
- {/* Content fades in after the surface arrives. */}
353
- <motion.div
354
- initial={reducedMotion ? false : { opacity: 0 }}
355
- animate={reducedMotion ? undefined : { opacity: 1 }}
356
- exit={
357
- reducedMotion
358
- ? undefined
359
- : { opacity: 0, transition: { duration: 0.12 } }
360
- }
361
- transition={
362
- reducedMotion
363
- ? { duration: 0 }
364
- : { duration: 0.16, delay: 0.06 }
365
- }
366
- >
367
- {state !== "closing" && children}
368
- </motion.div>
369
- </motion.div>
370
- </SheetPortal>
371
- )}
372
- </AnimatePresence>
373
- );
374
- }