@passui/react 0.1.46 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (429) hide show
  1. package/README.md +29 -109
  2. package/THIRD_PARTY_NOTICES.md +29 -0
  3. package/dist/accordion.d.ts +15 -0
  4. package/dist/accordion.js +93 -0
  5. package/dist/alert-dialog.d.ts +26 -0
  6. package/dist/alert-dialog.js +142 -0
  7. package/dist/alert.d.ts +10 -0
  8. package/dist/alert.js +28 -0
  9. package/dist/{types/src/components/ambient/ambient.d.ts → ambient.d.ts} +4 -4
  10. package/dist/ambient.js +22 -0
  11. package/dist/{types/src/appearance → appearance}/platform.d.ts +3 -3
  12. package/dist/appearance/platform.js +43 -0
  13. package/dist/appearance/theme.d.ts +71 -0
  14. package/dist/appearance/theme.js +236 -0
  15. package/dist/appearance.d.ts +3 -0
  16. package/dist/appearance.js +3 -0
  17. package/dist/{types/src/components/aspect-ratio/aspect-ratio.d.ts → aspect-ratio.d.ts} +4 -4
  18. package/dist/aspect-ratio.js +17 -0
  19. package/dist/avatar.d.ts +5 -0
  20. package/dist/avatar.js +43 -0
  21. package/dist/badge.d.ts +8 -0
  22. package/dist/badge.js +21 -0
  23. package/dist/breadcrumb.d.ts +13 -0
  24. package/dist/breadcrumb.js +63 -0
  25. package/dist/button-group.d.ts +5 -0
  26. package/dist/button-group.js +14 -0
  27. package/dist/button.d.ts +21 -0
  28. package/dist/button.js +58 -0
  29. package/dist/calendar.d.ts +35 -0
  30. package/dist/calendar.js +225 -0
  31. package/dist/card.d.ts +9 -0
  32. package/dist/card.js +54 -0
  33. package/dist/chart.d.ts +30 -0
  34. package/dist/chart.js +226 -0
  35. package/dist/checkbox.d.ts +13 -0
  36. package/dist/checkbox.js +53 -0
  37. package/dist/{types/src/lib/clipboard.d.ts → clipboard.d.ts} +1 -1
  38. package/dist/clipboard.js +16 -0
  39. package/dist/cn.d.ts +2 -0
  40. package/dist/cn.js +10 -0
  41. package/dist/code-block.d.ts +34 -0
  42. package/dist/code-block.js +87 -0
  43. package/dist/collapsible.d.ts +13 -0
  44. package/dist/collapsible.js +49 -0
  45. package/dist/combobox.d.ts +25 -0
  46. package/dist/combobox.js +112 -0
  47. package/dist/command.d.ts +22 -0
  48. package/dist/command.js +129 -0
  49. package/dist/components/toast/toast-store.d.ts +60 -0
  50. package/dist/components/toast/toast-store.js +96 -0
  51. package/dist/{types/src/components → components}/toast/toaster.d.ts +4 -4
  52. package/dist/components/toast/toaster.js +345 -0
  53. package/dist/context-menu.d.ts +2 -0
  54. package/dist/context-menu.js +2 -0
  55. package/dist/conversation.d.ts +48 -0
  56. package/dist/conversation.js +202 -0
  57. package/dist/date-time-picker.d.ts +50 -0
  58. package/dist/date-time-picker.js +235 -0
  59. package/dist/date.d.ts +50 -0
  60. package/dist/date.js +77 -0
  61. package/dist/dialog.d.ts +21 -0
  62. package/dist/dialog.js +113 -0
  63. package/dist/drawer.d.ts +30 -0
  64. package/dist/drawer.js +140 -0
  65. package/dist/dropdown-menu.d.ts +56 -0
  66. package/dist/dropdown-menu.js +295 -0
  67. package/dist/empty.d.ts +11 -0
  68. package/dist/empty.js +51 -0
  69. package/dist/field.d.ts +16 -0
  70. package/dist/field.js +47 -0
  71. package/{src/hooks/scroll/minimize-decision.ts → dist/hooks/scroll/minimize-decision.js} +3 -5
  72. package/dist/{types/src/hooks → hooks}/use-anchored-placement.d.ts +2 -2
  73. package/dist/hooks/use-anchored-placement.js +33 -0
  74. package/dist/{types/src/hooks → hooks}/use-minimize-on-scroll.d.ts +1 -1
  75. package/dist/hooks/use-minimize-on-scroll.js +59 -0
  76. package/dist/{types/src/hooks → hooks}/use-visual-viewport.d.ts +2 -2
  77. package/{src/hooks/use-visual-viewport.ts → dist/hooks/use-visual-viewport.js} +20 -35
  78. package/dist/hooks/viewport/types.d.ts +7 -0
  79. package/dist/hooks/viewport/viewport-metrics.js +13 -0
  80. package/dist/index.d.ts +84 -0
  81. package/dist/index.js +80 -0
  82. package/dist/input-group.d.ts +17 -0
  83. package/dist/input-group.js +55 -0
  84. package/dist/input-otp.d.ts +13 -0
  85. package/dist/input-otp.js +36 -0
  86. package/dist/input.d.ts +4 -0
  87. package/dist/input.js +14 -0
  88. package/dist/item.d.ts +49 -0
  89. package/dist/item.js +142 -0
  90. package/dist/kbd.d.ts +4 -0
  91. package/dist/kbd.js +86 -0
  92. package/dist/label.d.ts +3 -0
  93. package/dist/label.js +12 -0
  94. package/dist/labeled-content.d.ts +24 -0
  95. package/dist/labeled-content.js +41 -0
  96. package/dist/{types/src/lib/language.d.ts → language.d.ts} +1 -1
  97. package/dist/language.js +11 -0
  98. package/dist/layout.d.ts +24 -0
  99. package/dist/layout.js +36 -0
  100. package/dist/{types/src/lib → lib}/anchored-placement.d.ts +27 -27
  101. package/dist/lib/anchored-placement.js +42 -0
  102. package/dist/lib/calendar-month.js +90 -0
  103. package/dist/lib/cx.js +6 -0
  104. package/dist/lib/drawer.math.js +29 -0
  105. package/dist/lib/floating-layers.d.ts +3 -0
  106. package/dist/lib/floating-layers.js +25 -0
  107. package/dist/{types/src/lib → lib}/haptics.d.ts +1 -1
  108. package/dist/lib/haptics.js +13 -0
  109. package/dist/lib/liquid-step.js +33 -0
  110. package/dist/lib/page-scale.js +58 -0
  111. package/dist/lib/portal.js +12 -0
  112. package/dist/lib/presence.js +53 -0
  113. package/dist/lib/range-value.js +25 -0
  114. package/dist/lib/render.d.ts +8 -0
  115. package/dist/lib/render.js +42 -0
  116. package/dist/lib/rolling-digit.js +83 -0
  117. package/dist/{types/src/lib → lib}/screen-edges.d.ts +5 -5
  118. package/dist/lib/screen-edges.js +30 -0
  119. package/dist/lib/swipe-touch-action.js +34 -0
  120. package/dist/lib/visual-viewport.js +27 -0
  121. package/dist/lib/water-drop.js +412 -0
  122. package/dist/lib/wheel.js +125 -0
  123. package/dist/list.d.ts +26 -0
  124. package/dist/list.js +80 -0
  125. package/dist/locales.d.ts +18 -0
  126. package/dist/locales.js +36 -0
  127. package/dist/marker.d.ts +13 -0
  128. package/dist/marker.js +33 -0
  129. package/dist/motion/transitions.d.ts +170 -0
  130. package/dist/motion/transitions.js +156 -0
  131. package/dist/pagination.d.ts +30 -0
  132. package/dist/pagination.js +117 -0
  133. package/dist/popover.d.ts +26 -0
  134. package/dist/popover.js +101 -0
  135. package/dist/progress.d.ts +9 -0
  136. package/dist/progress.js +24 -0
  137. package/dist/questionnaire.d.ts +46 -0
  138. package/dist/questionnaire.js +133 -0
  139. package/dist/radio-group.d.ts +21 -0
  140. package/dist/radio-group.js +67 -0
  141. package/dist/search-field.d.ts +18 -0
  142. package/dist/search-field.js +45 -0
  143. package/dist/segmented-control.d.ts +16 -0
  144. package/dist/segmented-control.js +25 -0
  145. package/dist/select.d.ts +24 -0
  146. package/dist/select.js +107 -0
  147. package/dist/separator.d.ts +9 -0
  148. package/dist/separator.js +17 -0
  149. package/dist/{types/src/lib/shapes.d.ts → shapes.d.ts} +2 -2
  150. package/dist/shapes.js +65 -0
  151. package/dist/sheet.d.ts +24 -0
  152. package/dist/sheet.js +141 -0
  153. package/dist/sidebar.d.ts +32 -0
  154. package/dist/sidebar.js +85 -0
  155. package/dist/skeleton.d.ts +3 -0
  156. package/dist/skeleton.js +13 -0
  157. package/dist/slider.d.ts +9 -0
  158. package/dist/slider.js +42 -0
  159. package/dist/slosh-slider.d.ts +21 -0
  160. package/dist/slosh-slider.js +205 -0
  161. package/dist/spinner.d.ts +3 -0
  162. package/dist/spinner.js +20 -0
  163. package/dist/stat-tile.d.ts +20 -0
  164. package/dist/stat-tile.js +53 -0
  165. package/dist/stepper.d.ts +22 -0
  166. package/dist/stepper.js +98 -0
  167. package/dist/swatch-picker.d.ts +22 -0
  168. package/dist/swatch-picker.js +70 -0
  169. package/dist/switch.d.ts +10 -0
  170. package/dist/switch.js +44 -0
  171. package/dist/tab-bar.d.ts +15 -0
  172. package/dist/tab-bar.js +34 -0
  173. package/dist/{types/src/components/table/table.d.ts → table.d.ts} +3 -3
  174. package/dist/table.js +93 -0
  175. package/dist/tabs.d.ts +32 -0
  176. package/dist/tabs.js +131 -0
  177. package/dist/text.d.ts +25 -0
  178. package/dist/text.js +44 -0
  179. package/dist/textarea.d.ts +3 -0
  180. package/dist/textarea.js +13 -0
  181. package/dist/toast.d.ts +3 -0
  182. package/dist/toast.js +3 -0
  183. package/dist/toggle-group.d.ts +20 -0
  184. package/dist/toggle-group.js +68 -0
  185. package/dist/toggle.d.ts +24 -0
  186. package/dist/toggle.js +37 -0
  187. package/dist/tokens.d.ts +1 -0
  188. package/dist/tooltip.d.ts +21 -0
  189. package/dist/tooltip.js +61 -0
  190. package/dist/trace.d.ts +14 -0
  191. package/dist/trace.js +54 -0
  192. package/dist/{types/src/hooks/use-dismiss.d.ts → use-dismiss.d.ts} +3 -3
  193. package/dist/use-dismiss.js +38 -0
  194. package/dist/{types/src/hooks/use-media-query.d.ts → use-media-query.d.ts} +12 -12
  195. package/dist/use-media-query.js +56 -0
  196. package/dist/use-os.d.ts +12 -0
  197. package/dist/use-os.js +17 -0
  198. package/dist/wake-slider.d.ts +15 -0
  199. package/dist/wake-slider.js +174 -0
  200. package/package.json +122 -253
  201. package/src/styles/code-block.css +4 -0
  202. package/src/styles/globals.css +5 -0
  203. package/src/styles/motion-controls.css +10 -0
  204. package/src/styles/page-scale.css +27 -0
  205. package/src/styles/styles.css +4 -2
  206. package/dist/types/src/appearance/index.d.ts +0 -2
  207. package/dist/types/src/appearance/theme.d.ts +0 -71
  208. package/dist/types/src/components/accordion/accordion.d.ts +0 -23
  209. package/dist/types/src/components/ambient/index.d.ts +0 -1
  210. package/dist/types/src/components/breadcrumb/breadcrumb.d.ts +0 -19
  211. package/dist/types/src/components/button/button-styles.d.ts +0 -12
  212. package/dist/types/src/components/button/button.d.ts +0 -32
  213. package/dist/types/src/components/button/icon-button.d.ts +0 -10
  214. package/dist/types/src/components/button/pending-spinner.d.ts +0 -5
  215. package/dist/types/src/components/button/use-pending-indicator.d.ts +0 -2
  216. package/dist/types/src/components/chip/chip.d.ts +0 -10
  217. package/dist/types/src/components/code-block/code-block.d.ts +0 -13
  218. package/dist/types/src/components/combo-box/combo-box.d.ts +0 -9
  219. package/dist/types/src/components/command/command.d.ts +0 -18
  220. package/dist/types/src/components/compact-date-picker/calendar-month.d.ts +0 -25
  221. package/dist/types/src/components/compact-date-picker/compact-date-picker.d.ts +0 -30
  222. package/dist/types/src/components/compact-time-picker/compact-time-picker.d.ts +0 -29
  223. package/dist/types/src/components/compact-time-picker/time-value.d.ts +0 -18
  224. package/dist/types/src/components/content-unavailable-view/content-unavailable-view.d.ts +0 -12
  225. package/dist/types/src/components/content-view/content-view.d.ts +0 -51
  226. package/dist/types/src/components/content-view/index.d.ts +0 -1
  227. package/dist/types/src/components/context-menu/conceal-menu-source.d.ts +0 -2
  228. package/dist/types/src/components/context-menu/context-menu-host.d.ts +0 -2
  229. package/dist/types/src/components/context-menu/context-menu-store.d.ts +0 -62
  230. package/dist/types/src/components/context-menu/menu-navigation.d.ts +0 -6
  231. package/dist/types/src/components/context-menu/menu-position.d.ts +0 -21
  232. package/dist/types/src/components/context-menu/menu-reveal.d.ts +0 -26
  233. package/dist/types/src/components/context-menu/use-context-menu.d.ts +0 -14
  234. package/dist/types/src/components/conversation/conversation.d.ts +0 -48
  235. package/dist/types/src/components/conversation/index.d.ts +0 -1
  236. package/dist/types/src/components/date-picker/date-picker.d.ts +0 -19
  237. package/dist/types/src/components/date-picker/date-value.d.ts +0 -2
  238. package/dist/types/src/components/dialog/dialog-host.d.ts +0 -6
  239. package/dist/types/src/components/dialog/dialog-store.d.ts +0 -23
  240. package/dist/types/src/components/dialog/dialog.d.ts +0 -33
  241. package/dist/types/src/components/dialog/index.d.ts +0 -1
  242. package/dist/types/src/components/disclosure-group/disclosure-group.d.ts +0 -18
  243. package/dist/types/src/components/divider/divider.d.ts +0 -9
  244. package/dist/types/src/components/inline-disclosure/inline-disclosure.d.ts +0 -15
  245. package/dist/types/src/components/keyboard-shortcut/keyboard-shortcut.d.ts +0 -8
  246. package/dist/types/src/components/labeled-content/labeled-content.d.ts +0 -22
  247. package/dist/types/src/components/locale-switcher/index.d.ts +0 -1
  248. package/dist/types/src/components/locale-switcher/locale-switcher.d.ts +0 -13
  249. package/dist/types/src/components/menu/menu.d.ts +0 -16
  250. package/dist/types/src/components/morph/index.d.ts +0 -2
  251. package/dist/types/src/components/morph/morph.d.ts +0 -32
  252. package/dist/types/src/components/morph/use-morph-disclosure.d.ts +0 -13
  253. package/dist/types/src/components/one-time-code/one-time-code.d.ts +0 -26
  254. package/dist/types/src/components/picker/picker-trigger.d.ts +0 -3
  255. package/dist/types/src/components/picker/picker.d.ts +0 -46
  256. package/dist/types/src/components/popover/anchored-surface.d.ts +0 -17
  257. package/dist/types/src/components/popover/index.d.ts +0 -41
  258. package/dist/types/src/components/popover/popover-content.d.ts +0 -32
  259. package/dist/types/src/components/popover/popover-fit.d.ts +0 -21
  260. package/dist/types/src/components/popover/popover-root.d.ts +0 -22
  261. package/dist/types/src/components/popover/popover-trigger.d.ts +0 -23
  262. package/dist/types/src/components/profile-image/profile-image.d.ts +0 -9
  263. package/dist/types/src/components/progress-view/progress-view.d.ts +0 -13
  264. package/dist/types/src/components/progress-view/use-liquid-progress.d.ts +0 -3
  265. package/dist/types/src/components/radio-group/radio-group.d.ts +0 -20
  266. package/dist/types/src/components/search-field/expanding-search-field.d.ts +0 -5
  267. package/dist/types/src/components/search-field/search-field.d.ts +0 -9
  268. package/dist/types/src/components/search-list/search-list.d.ts +0 -22
  269. package/dist/types/src/components/section/section.d.ts +0 -18
  270. package/dist/types/src/components/secure-field/secure-field.d.ts +0 -4
  271. package/dist/types/src/components/segmented-control/segmented-control.d.ts +0 -25
  272. package/dist/types/src/components/sheet/modal-environment.d.ts +0 -2
  273. package/dist/types/src/components/sheet/sheet-portal.d.ts +0 -5
  274. package/dist/types/src/components/sheet/sheet.d.ts +0 -26
  275. package/dist/types/src/components/sheet/use-sheet-focus.d.ts +0 -3
  276. package/dist/types/src/components/sidebar/sidebar.d.ts +0 -24
  277. package/dist/types/src/components/skeleton/skeleton.d.ts +0 -9
  278. package/dist/types/src/components/slider/slider.d.ts +0 -17
  279. package/dist/types/src/components/slosh-slider/liquid-step.d.ts +0 -6
  280. package/dist/types/src/components/slosh-slider/slosh-slider.d.ts +0 -21
  281. package/dist/types/src/components/stat-tile/index.d.ts +0 -1
  282. package/dist/types/src/components/stat-tile/stat-tile.d.ts +0 -20
  283. package/dist/types/src/components/status-indicator/status-indicator.d.ts +0 -17
  284. package/dist/types/src/components/stepper/rolling-digit.d.ts +0 -11
  285. package/dist/types/src/components/stepper/stepper.d.ts +0 -22
  286. package/dist/types/src/components/swatch-picker/swatch-picker.d.ts +0 -22
  287. package/dist/types/src/components/tab-bar/tab-bar.d.ts +0 -43
  288. package/dist/types/src/components/tab-view/tab-view.d.ts +0 -27
  289. package/dist/types/src/components/text-editor/text-editor.d.ts +0 -9
  290. package/dist/types/src/components/text-field/text-field.d.ts +0 -33
  291. package/dist/types/src/components/toast/toast-store.d.ts +0 -52
  292. package/dist/types/src/components/toggle/toggle.d.ts +0 -22
  293. package/dist/types/src/components/tooltip/tooltip-host.d.ts +0 -7
  294. package/dist/types/src/components/view-controller/index.d.ts +0 -1
  295. package/dist/types/src/components/view-controller/view-controller.d.ts +0 -21
  296. package/dist/types/src/components/wake-slider/wake-slider.d.ts +0 -15
  297. package/dist/types/src/hooks/scroll/minimize-decision.d.ts +0 -2
  298. package/dist/types/src/hooks/use-anchored-disclosure.d.ts +0 -9
  299. package/dist/types/src/hooks/use-floating-dismiss.d.ts +0 -3
  300. package/dist/types/src/hooks/viewport/types.d.ts +0 -19
  301. package/dist/types/src/hooks/viewport/viewport-metrics.d.ts +0 -3
  302. package/dist/types/src/icons/icons.d.ts +0 -616
  303. package/dist/types/src/index.d.ts +0 -73
  304. package/dist/types/src/lib/class-names.d.ts +0 -2
  305. package/dist/types/src/lib/date.d.ts +0 -50
  306. package/dist/types/src/lib/floating-layers.d.ts +0 -8
  307. package/dist/types/src/lib/range-value.d.ts +0 -4
  308. package/dist/types/src/machines/popover.machine.d.ts +0 -30
  309. package/dist/types/src/motion/transitions.d.ts +0 -170
  310. package/src/appearance/index.ts +0 -2
  311. package/src/appearance/platform.tsx +0 -102
  312. package/src/appearance/theme.tsx +0 -467
  313. package/src/components/accordion/accordion.tsx +0 -70
  314. package/src/components/ambient/ambient.tsx +0 -35
  315. package/src/components/ambient/index.ts +0 -1
  316. package/src/components/aspect-ratio/aspect-ratio.tsx +0 -27
  317. package/src/components/breadcrumb/breadcrumb.tsx +0 -73
  318. package/src/components/button/button-styles.ts +0 -49
  319. package/src/components/button/button.tsx +0 -107
  320. package/src/components/button/icon-button.tsx +0 -33
  321. package/src/components/button/pending-spinner.tsx +0 -14
  322. package/src/components/button/use-pending-indicator.ts +0 -22
  323. package/src/components/chip/chip.tsx +0 -45
  324. package/src/components/code-block/code-block.tsx +0 -48
  325. package/src/components/combo-box/combo-box.tsx +0 -13
  326. package/src/components/command/command.tsx +0 -149
  327. package/src/components/compact-date-picker/calendar-month.ts +0 -109
  328. package/src/components/compact-date-picker/compact-date-picker.tsx +0 -337
  329. package/src/components/compact-time-picker/compact-time-picker.tsx +0 -321
  330. package/src/components/compact-time-picker/time-value.ts +0 -58
  331. package/src/components/content-unavailable-view/content-unavailable-view.tsx +0 -78
  332. package/src/components/content-view/content-view.tsx +0 -215
  333. package/src/components/content-view/index.ts +0 -1
  334. package/src/components/context-menu/conceal-menu-source.ts +0 -30
  335. package/src/components/context-menu/context-menu-host.tsx +0 -459
  336. package/src/components/context-menu/context-menu-store.ts +0 -167
  337. package/src/components/context-menu/menu-navigation.ts +0 -36
  338. package/src/components/context-menu/menu-position.ts +0 -38
  339. package/src/components/context-menu/menu-reveal.ts +0 -42
  340. package/src/components/context-menu/use-context-menu.ts +0 -73
  341. package/src/components/conversation/conversation.tsx +0 -309
  342. package/src/components/conversation/index.ts +0 -1
  343. package/src/components/date-picker/date-picker.tsx +0 -106
  344. package/src/components/date-picker/date-value.ts +0 -22
  345. package/src/components/dialog/dialog-host.tsx +0 -119
  346. package/src/components/dialog/dialog-store.ts +0 -66
  347. package/src/components/dialog/dialog.tsx +0 -211
  348. package/src/components/dialog/index.ts +0 -1
  349. package/src/components/disclosure-group/disclosure-group.tsx +0 -108
  350. package/src/components/divider/divider.tsx +0 -33
  351. package/src/components/inline-disclosure/inline-disclosure.tsx +0 -53
  352. package/src/components/keyboard-shortcut/keyboard-shortcut.tsx +0 -32
  353. package/src/components/labeled-content/labeled-content.tsx +0 -84
  354. package/src/components/locale-switcher/index.ts +0 -1
  355. package/src/components/locale-switcher/locale-switcher.tsx +0 -311
  356. package/src/components/menu/menu.tsx +0 -85
  357. package/src/components/morph/index.ts +0 -2
  358. package/src/components/morph/morph.tsx +0 -258
  359. package/src/components/morph/use-morph-disclosure.ts +0 -27
  360. package/src/components/one-time-code/one-time-code.tsx +0 -234
  361. package/src/components/picker/picker-trigger.ts +0 -22
  362. package/src/components/picker/picker.tsx +0 -404
  363. package/src/components/popover/anchored-surface.tsx +0 -264
  364. package/src/components/popover/index.ts +0 -50
  365. package/src/components/popover/popover-content.tsx +0 -334
  366. package/src/components/popover/popover-fit.ts +0 -74
  367. package/src/components/popover/popover-root.tsx +0 -97
  368. package/src/components/popover/popover-trigger.tsx +0 -71
  369. package/src/components/profile-image/profile-image.tsx +0 -96
  370. package/src/components/progress-view/progress-view.tsx +0 -72
  371. package/src/components/progress-view/use-liquid-progress.ts +0 -43
  372. package/src/components/radio-group/radio-group.tsx +0 -86
  373. package/src/components/search-field/expanding-search-field.tsx +0 -197
  374. package/src/components/search-field/search-field.tsx +0 -66
  375. package/src/components/search-list/search-list.tsx +0 -276
  376. package/src/components/section/section.tsx +0 -75
  377. package/src/components/secure-field/secure-field.tsx +0 -8
  378. package/src/components/segmented-control/segmented-control.tsx +0 -157
  379. package/src/components/sheet/modal-environment.ts +0 -82
  380. package/src/components/sheet/sheet-portal.tsx +0 -62
  381. package/src/components/sheet/sheet.tsx +0 -165
  382. package/src/components/sheet/use-sheet-focus.ts +0 -109
  383. package/src/components/sidebar/sidebar.tsx +0 -102
  384. package/src/components/skeleton/skeleton.tsx +0 -38
  385. package/src/components/slider/slider.tsx +0 -134
  386. package/src/components/slosh-slider/liquid-step.ts +0 -43
  387. package/src/components/slosh-slider/slosh-slider.tsx +0 -294
  388. package/src/components/stat-tile/index.ts +0 -1
  389. package/src/components/stat-tile/stat-tile.tsx +0 -90
  390. package/src/components/status-indicator/status-indicator.tsx +0 -54
  391. package/src/components/stepper/rolling-digit.tsx +0 -91
  392. package/src/components/stepper/stepper.tsx +0 -136
  393. package/src/components/swatch-picker/swatch-picker.tsx +0 -138
  394. package/src/components/tab-bar/tab-bar.tsx +0 -182
  395. package/src/components/tab-view/tab-view.tsx +0 -155
  396. package/src/components/table/table.tsx +0 -151
  397. package/src/components/text-editor/text-editor.tsx +0 -42
  398. package/src/components/text-field/text-field.tsx +0 -200
  399. package/src/components/toast/toast-store.ts +0 -164
  400. package/src/components/toast/toaster.tsx +0 -407
  401. package/src/components/toggle/toggle.tsx +0 -320
  402. package/src/components/tooltip/tooltip-host.tsx +0 -178
  403. package/src/components/view-controller/index.ts +0 -1
  404. package/src/components/view-controller/view-controller.tsx +0 -75
  405. package/src/components/wake-slider/wake-slider.tsx +0 -260
  406. package/src/hooks/use-anchored-disclosure.ts +0 -23
  407. package/src/hooks/use-anchored-placement.ts +0 -40
  408. package/src/hooks/use-dismiss.ts +0 -44
  409. package/src/hooks/use-floating-dismiss.ts +0 -30
  410. package/src/hooks/use-media-query.ts +0 -94
  411. package/src/hooks/use-minimize-on-scroll.ts +0 -77
  412. package/src/hooks/viewport/types.ts +0 -19
  413. package/src/hooks/viewport/viewport-metrics.ts +0 -19
  414. package/src/icons/icons.tsx +0 -458
  415. package/src/index.ts +0 -107
  416. package/src/lib/anchored-placement.ts +0 -91
  417. package/src/lib/class-names.ts +0 -21
  418. package/src/lib/clipboard.ts +0 -15
  419. package/src/lib/date.ts +0 -86
  420. package/src/lib/floating-layers.ts +0 -53
  421. package/src/lib/haptics.ts +0 -23
  422. package/src/lib/language.ts +0 -16
  423. package/src/lib/range-value.ts +0 -38
  424. package/src/lib/screen-edges.ts +0 -44
  425. package/src/lib/shapes.ts +0 -59
  426. package/src/machines/popover.machine.ts +0 -51
  427. package/src/motion/transitions.ts +0 -97
  428. package/src/tokens.ts +0 -1
  429. /package/dist/{types/src/tokens.d.ts → tokens.js} +0 -0
@@ -1,234 +0,0 @@
1
- import {
2
- type CSSProperties,
3
- type InputHTMLAttributes,
4
- type Ref,
5
- useEffect,
6
- useId,
7
- useRef,
8
- } from "react";
9
- import { CheckIcon } from "../../icons/icons";
10
- import { cn } from "../../lib/class-names";
11
-
12
- export type OneTimeCodeStatus = "idle" | "verifying" | "success" | "error";
13
- export type OneTimeCodeFormat = "numeric" | "alphanumeric";
14
- export type OneTimeCodeSize = "sm" | "md" | "lg";
15
-
16
- const checkSizes: Record<OneTimeCodeSize, number> = {
17
- sm: 20,
18
- md: 24,
19
- lg: 28,
20
- };
21
- const statusText: Record<OneTimeCodeSize, string> = {
22
- sm: "mt-1.5 text-caption2",
23
- md: "mt-2 text-footnote",
24
- lg: "mt-2.5 text-subheadline",
25
- };
26
- export interface OneTimeCodeProps
27
- extends Omit<
28
- InputHTMLAttributes<HTMLInputElement>,
29
- "value" | "defaultValue" | "onChange" | "type" | "maxLength" | "size"
30
- > {
31
- label: string;
32
- value: string;
33
- onChange: (value: string) => void;
34
- /** Called when a complete code is entered, including paste and autofill. */
35
- onComplete?: (value: string) => void;
36
- /** Number of characters, 3–8. @default 6 */
37
- length?: number;
38
- /** Accepted characters. Alphanumeric codes use uppercase ASCII letters and digits. @default "numeric" */
39
- format?: OneTimeCodeFormat;
40
- /** Ref to the single native input, for focus and selection. */
41
- ref?: Ref<HTMLInputElement>;
42
- status?: OneTimeCodeStatus;
43
- /** Localized verification feedback announced without reading decorative cells. */
44
- statusLabel?: string;
45
- /** Cell height, digit text scale and check icon size. @default "md" */
46
- size?: OneTimeCodeSize;
47
- }
48
-
49
- /** Normalize common numeric keyboards and optional ASCII letters in one native field. */
50
- export function normalizeCode(
51
- value: string,
52
- length: number,
53
- format: OneTimeCodeFormat = "numeric",
54
- ) {
55
- return Array.from(value, (digit) => {
56
- const point = digit.codePointAt(0) ?? 0;
57
- for (const base of [0x30, 0x660, 0x6f0, 0xff10]) {
58
- if (point >= base && point < base + 10) return String(point - base);
59
- }
60
- return format === "alphanumeric" && /^[a-z]$/i.test(digit)
61
- ? digit.toUpperCase()
62
- : "";
63
- })
64
- .join("")
65
- .slice(0, length);
66
- }
67
-
68
- /** Six cells, one field: paste, autofill, selection and Backspace stay native. */
69
- export function OneTimeCode({
70
- label,
71
- value,
72
- onChange,
73
- onComplete,
74
- length = 6,
75
- format = "numeric",
76
- ref,
77
- status = "idle",
78
- statusLabel,
79
- size = "md",
80
- className,
81
- disabled,
82
- id: suppliedId,
83
- ...props
84
- }: OneTimeCodeProps) {
85
- const generated = useId();
86
- const id = suppliedId ?? generated;
87
- const filter = `otp-goo-${generated.replace(/:/g, "")}`;
88
- const input = useRef<HTMLInputElement>(null);
89
- const count = Number.isFinite(length)
90
- ? Math.max(3, Math.min(8, Math.round(length)))
91
- : 6;
92
- const code = normalizeCode(value, count, format);
93
- const locked =
94
- disabled ||
95
- props.readOnly ||
96
- status === "verifying" ||
97
- status === "success";
98
- useEffect(() => {
99
- if (status === "error") input.current?.select();
100
- }, [status]);
101
- const update = (next: string) => {
102
- if (locked) return;
103
- const normalized = normalizeCode(next, count, format);
104
- onChange(normalized);
105
- if (normalized.length === count && normalized !== code)
106
- onComplete?.(normalized);
107
- };
108
- return (
109
- <div
110
- className={cn("passui-one-time-code not-typeset", className)}
111
- data-status={status}
112
- data-size={size}
113
- style={
114
- {
115
- "--otp-length": count,
116
- "--otp-middle": (count - 1) / 2,
117
- } as CSSProperties
118
- }
119
- >
120
- <svg aria-hidden="true" width="0" height="0" className="absolute">
121
- <defs>
122
- <filter
123
- id={filter}
124
- x="-20%"
125
- y="-50%"
126
- width="140%"
127
- height="200%"
128
- colorInterpolationFilters="sRGB"
129
- >
130
- <feGaussianBlur stdDeviation="3" result="smear" />
131
- <feColorMatrix
132
- in="smear"
133
- type="matrix"
134
- values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 24 -10"
135
- />
136
- </filter>
137
- </defs>
138
- </svg>
139
- <div className="passui-otp-row" dir="ltr">
140
- {/* A right code fuses: cells converge on one point while a capsule
141
- grows there. The filter joins the material, never the digits. */}
142
- <div
143
- aria-hidden="true"
144
- className="passui-otp-materials"
145
- style={{ filter: `url(#${filter})` }}
146
- >
147
- {Array.from({ length: count }, (_, index) => (
148
- <span
149
- key={index}
150
- className="passui-otp-cell"
151
- style={{ "--otp-index": index } as CSSProperties}
152
- />
153
- ))}
154
- <span className="passui-otp-capsule" />
155
- </div>
156
- <div aria-hidden="true" className="passui-otp-digits">
157
- {Array.from({ length: count }, (_, index) => (
158
- <span
159
- key={index}
160
- className="passui-otp-digit"
161
- data-active={
162
- index === Math.min(code.length, count - 1) || undefined
163
- }
164
- style={{ "--otp-index": index } as CSSProperties}
165
- >
166
- {code[index] && (
167
- <span key={code[index] ?? index} className="passui-otp-glyph">
168
- {code[index]}
169
- </span>
170
- )}
171
- </span>
172
- ))}
173
- </div>
174
- <CheckIcon
175
- aria-hidden="true"
176
- className="passui-otp-check"
177
- size={checkSizes[size]}
178
- />
179
- <input
180
- {...props}
181
- ref={(node) => {
182
- input.current = node;
183
- if (typeof ref === "function") return ref(node);
184
- if (ref) ref.current = node;
185
- }}
186
- id={id}
187
- type="text"
188
- inputMode={format === "numeric" ? "numeric" : "text"}
189
- autoComplete={props.autoComplete ?? "one-time-code"}
190
- autoCapitalize={format === "alphanumeric" ? "characters" : "off"}
191
- spellCheck={false}
192
- pattern={format === "numeric" ? "[0-9]*" : "[A-Za-z0-9]*"}
193
- maxLength={count}
194
- minLength={count}
195
- aria-label={label}
196
- value={code}
197
- disabled={disabled}
198
- readOnly={locked}
199
- aria-busy={status === "verifying" || undefined}
200
- aria-invalid={status === "error" || props["aria-invalid"]}
201
- aria-describedby={
202
- [props["aria-describedby"], statusLabel && `${id}-status`]
203
- .filter(Boolean)
204
- .join(" ") || undefined
205
- }
206
- onChange={(event) => update(event.target.value)}
207
- onPaste={(event) => {
208
- props.onPaste?.(event);
209
- if (event.defaultPrevented || locked) return;
210
- const pasted = event.clipboardData.getData("text");
211
- const normalized = normalizeCode(pasted, count, format);
212
- if (normalized && normalized !== pasted) {
213
- event.preventDefault();
214
- update(normalized);
215
- }
216
- }}
217
- className="passui-otp-input"
218
- />
219
- </div>
220
- {statusLabel && (
221
- <p
222
- id={`${id}-status`}
223
- role="status"
224
- className={cn(
225
- statusText[size],
226
- status === "error" ? "text-danger" : "text-label-secondary",
227
- )}
228
- >
229
- {statusLabel}
230
- </p>
231
- )}
232
- </div>
233
- );
234
- }
@@ -1,22 +0,0 @@
1
- import { cn } from "../../lib/class-names";
2
-
3
- export type PickerSize = "sm" | "md" | "lg";
4
-
5
- const triggerSizes: Record<PickerSize, string> = {
6
- sm: "px-2.5 py-1.5 text-caption rounded-lg",
7
- md: "px-3 py-2 text-subheadline rounded-lg",
8
- lg: "px-4 py-3 text-body rounded-xl",
9
- };
10
-
11
- /** Shared field treatment for the popup-based Picker, date and time controls. */
12
- export function pickerTriggerStyle(
13
- className?: string,
14
- size: PickerSize = "md",
15
- ) {
16
- return cn(
17
- "control-field text-label flex w-full min-w-0 items-center gap-2 text-start",
18
- "disabled:cursor-not-allowed disabled:opacity-40",
19
- triggerSizes[size],
20
- className,
21
- );
22
- }
@@ -1,404 +0,0 @@
1
- import { useAnchoredDisclosure } from "../../hooks/use-anchored-disclosure";
2
- import {
3
- type KeyboardEvent,
4
- useCallback,
5
- useEffect,
6
- useId,
7
- useMemo,
8
- useRef,
9
- useState,
10
- } from "react";
11
- import { createPortal } from "react-dom";
12
- import { CheckIcon, SearchIcon, SelectorIcon } from "../../icons/icons";
13
- import { cn } from "../../lib/class-names";
14
- import { haptic } from "../../lib/haptics";
15
- import { AnchoredSurface } from "../popover/anchored-surface";
16
- import { pickerTriggerStyle, type PickerSize } from "./picker-trigger";
17
-
18
- export interface PickerOption<T extends string> {
19
- value: T;
20
- label: string;
21
- /** A quieter second line or trailing note, such as "Free" or a region. */
22
- disabled?: boolean;
23
- keywords?: string[];
24
- detail?: string;
25
- /** The option's own language, so it is spoken and shaped right. */
26
- lang?: string;
27
- }
28
-
29
- /** Values and callbacks share the option value type, including literal unions. */
30
- export interface PickerProps<T extends string> {
31
- /** The selected option's value. */
32
- value: T;
33
- /** Available choices. Use a literal union for a fixed set of values. */
34
- options: ReadonlyArray<PickerOption<T>>;
35
- /** Called with the selected option value. */
36
- onChange: (value: NoInfer<T>) => void;
37
- /** Accessible name for the trigger. */
38
- label: string;
39
- /** Shown when the selected value has no matching option. */
40
- placeholder?: string;
41
- /** Defaults to on for lists of ten or more options. */
42
- searchable?: boolean;
43
- /** Label for the filter field. @default "Search" */
44
- searchPlaceholder?: string;
45
- /** Shown when the filter matches nothing. @default "No matches" */
46
- emptyLabel?: string;
47
- /** Offers a new value when no option has the same label or value. */
48
- onCreate?: (query: string) => void;
49
- /** Localized creation action; receives the trimmed query. */
50
- createLabel?: (query: string) => string;
51
- className?: string;
52
- /** Prevents opening or choosing an option. @default false */
53
- disabled?: boolean;
54
- /** Trigger height and text scale. @default "md" */
55
- size?: PickerSize;
56
- }
57
-
58
- /** Long lists get a filter field, as in the system pickers. */
59
- const SEARCH_FROM = 10;
60
-
61
- /**
62
- * A pop-up button: shows the chosen value and opens a list that floats
63
- * above everything, flips upward near the bottom edge and filters long
64
- * lists. Replaces the browser's own select, which looks foreign on every
65
- * platform.
66
- */
67
- export function Picker<T extends string>({
68
- value,
69
- options,
70
- onChange,
71
- label,
72
- placeholder,
73
- searchable,
74
- searchPlaceholder = "Search",
75
- emptyLabel = "No matches",
76
- className,
77
- onCreate,
78
- createLabel,
79
- disabled = false,
80
- size = "md",
81
- }: PickerProps<T>) {
82
- const panel = useAnchoredDisclosure(disabled);
83
- const { open } = panel;
84
- const trigger = useRef<HTMLButtonElement>(null);
85
- const listId = useId();
86
- const selected = options.find((option) => option.value === value);
87
-
88
- const close = useCallback(
89
- (refocus: boolean) => {
90
- panel.close();
91
- if (refocus) trigger.current?.focus({ preventScroll: true });
92
- },
93
- [panel.close],
94
- );
95
-
96
- const onTriggerKey = (event: KeyboardEvent<HTMLButtonElement>) => {
97
- if (event.key === "ArrowDown" || event.key === "ArrowUp") {
98
- event.preventDefault();
99
- panel.show();
100
- }
101
- };
102
-
103
- return (
104
- <>
105
- <button
106
- ref={trigger}
107
- type="button"
108
- role="combobox"
109
- aria-label={label}
110
- aria-haspopup="listbox"
111
- aria-expanded={open && !disabled}
112
- aria-controls={open && !disabled ? listId : undefined}
113
- disabled={disabled}
114
- onClick={() => panel.toggle()}
115
- onKeyDown={onTriggerKey}
116
- className={pickerTriggerStyle(className, size)}
117
- >
118
- <span
119
- lang={selected?.lang}
120
- className={cn(
121
- "min-w-0 grow truncate",
122
- !selected && "text-label-tertiary",
123
- )}
124
- >
125
- {selected?.label ?? placeholder ?? ""}
126
- </span>
127
- <SelectorIcon
128
- size={15}
129
- strokeWidth={2}
130
- className="text-label-tertiary shrink-0"
131
- />
132
- </button>
133
- {typeof document !== "undefined" &&
134
- createPortal(
135
- panel.mounted && trigger.current ? (
136
- <SelectList
137
- open={open}
138
- onExited={panel.onExited}
139
- id={listId}
140
- anchor={trigger.current}
141
- options={options}
142
- value={value}
143
- label={label}
144
- searchable={
145
- searchable ??
146
- (Boolean(onCreate) || options.length >= SEARCH_FROM)
147
- }
148
- searchPlaceholder={searchPlaceholder}
149
- emptyLabel={emptyLabel}
150
- onCreate={onCreate}
151
- createLabel={createLabel}
152
- onPick={(next) => {
153
- close(true);
154
- if (next === value) return;
155
- haptic("selection");
156
- onChange(next);
157
- }}
158
- onClose={close}
159
- />
160
- ) : null,
161
- document.body,
162
- )}
163
- </>
164
- );
165
- }
166
-
167
- function SelectList<T extends string>({
168
- open,
169
- onExited,
170
- id,
171
- anchor,
172
- options,
173
- value,
174
- label,
175
- searchable,
176
- searchPlaceholder,
177
- emptyLabel,
178
- onPick,
179
- onClose,
180
- onCreate,
181
- createLabel,
182
- }: {
183
- open: boolean;
184
- onExited: () => void;
185
- id: string;
186
- anchor: HTMLElement;
187
- options: ReadonlyArray<PickerOption<T>>;
188
- value: T;
189
- label: string;
190
- searchable: boolean;
191
- searchPlaceholder: string;
192
- emptyLabel: string;
193
- onCreate?: (query: string) => void;
194
- createLabel?: (query: string) => string;
195
- onPick: (value: T) => void;
196
- onClose: (refocus: boolean) => void;
197
- }) {
198
- const list = useRef<HTMLDivElement>(null);
199
- const search = useRef<HTMLInputElement>(null);
200
- const [query, setQuery] = useState("");
201
- const typed = useRef({ text: "", at: 0 });
202
-
203
- const shown = useMemo(() => {
204
- const needle = query.trim().toLocaleLowerCase();
205
- if (!needle) return options;
206
- return options.filter((option) =>
207
- `${option.label} ${option.detail ?? ""} ${option.value} ${(option.keywords ?? []).join(" ")}`
208
- .toLocaleLowerCase()
209
- .includes(needle),
210
- );
211
- }, [options, query]);
212
-
213
- const enabled = shown.filter((option) => !option.disabled);
214
- const trimmed = query.trim();
215
- const canCreate = Boolean(
216
- onCreate &&
217
- trimmed &&
218
- !options.some(
219
- (option) =>
220
- option.label.toLocaleLowerCase() === trimmed.toLocaleLowerCase() ||
221
- option.value.toLocaleLowerCase() === trimmed.toLocaleLowerCase(),
222
- ),
223
- );
224
- const create = () => {
225
- if (!canCreate) return;
226
- onClose(true);
227
- onCreate?.(trimmed);
228
- };
229
- const [active, setActive] = useState(() =>
230
- Math.max(
231
- 0,
232
- options
233
- .filter((option) => !option.disabled)
234
- .findIndex((option) => option.value === value),
235
- ),
236
- );
237
- const last = enabled.length + (canCreate ? 1 : 0) - 1;
238
- const activeOption = enabled[Math.min(active, last)];
239
- const activeId = activeOption
240
- ? `${id}-${activeOption.value}`
241
- : canCreate
242
- ? `${id}-create`
243
- : undefined;
244
-
245
- useEffect(() => {
246
- if (searchable) search.current?.focus();
247
- else list.current?.focus();
248
- }, [searchable]);
249
-
250
- // The chosen option starts in view, then follows the keyboard.
251
- useEffect(() => {
252
- if (!activeOption) return;
253
- list.current
254
- ?.querySelector(`[data-value="${CSS.escape(activeOption.value)}"]`)
255
- ?.scrollIntoView({ block: "nearest" });
256
- }, [activeOption]);
257
-
258
- const onKeyDown = (event: KeyboardEvent) => {
259
- const step = (to: number) => {
260
- event.preventDefault();
261
- setActive(Math.max(0, Math.min(last, to)));
262
- };
263
- const current = Math.min(active, last);
264
- if (event.key === "ArrowDown") step(current + 1);
265
- else if (event.key === "ArrowUp") step(current - 1);
266
- else if (event.key === "Home" && !searchable) step(0);
267
- else if (event.key === "End" && !searchable) step(last);
268
- else if (event.key === "PageDown") step(current + 8);
269
- else if (event.key === "PageUp") step(current - 8);
270
- else if (event.key === "Enter" || (event.key === " " && !searchable)) {
271
- event.preventDefault();
272
- if (activeOption) onPick(activeOption.value);
273
- else if (canCreate) create();
274
- } else if (event.key === "Escape") {
275
- event.preventDefault();
276
- event.stopPropagation();
277
- onClose(true);
278
- } else if (event.key === "Tab") {
279
- onClose(false);
280
- } else if (
281
- !searchable &&
282
- event.key.length === 1 &&
283
- !event.metaKey &&
284
- !event.ctrlKey
285
- ) {
286
- // Type to jump, as in a native pop-up button.
287
- const now = Date.now();
288
- const text =
289
- (now - typed.current.at < 700 ? typed.current.text : "") + event.key;
290
- typed.current = { text, at: now };
291
- const match = enabled.findIndex((option) =>
292
- option.label.toLocaleLowerCase().startsWith(text.toLocaleLowerCase()),
293
- );
294
- if (match >= 0) setActive(match);
295
- }
296
- };
297
-
298
- return (
299
- <AnchoredSurface
300
- open={open}
301
- onExited={onExited}
302
- anchor={anchor}
303
- width={Math.min(Math.max(anchor.getBoundingClientRect().width, 220), 360)}
304
- needed={240}
305
- onClose={onClose}
306
- onKeyDown={onKeyDown}
307
- contentClassName="overflow-hidden"
308
- >
309
- {searchable && (
310
- <div className="border-separator/70 flex shrink-0 items-center gap-2 border-b px-3 py-2">
311
- <SearchIcon size={15} className="text-label-tertiary shrink-0" />
312
- <input
313
- ref={search}
314
- value={query}
315
- placeholder={searchPlaceholder}
316
- aria-label={searchPlaceholder}
317
- aria-controls={id}
318
- aria-activedescendant={activeId}
319
- onChange={(event) => {
320
- setQuery(event.target.value);
321
- setActive(0);
322
- }}
323
- className="text-subheadline text-label placeholder:text-label-tertiary min-w-0 grow bg-transparent outline-none"
324
- />
325
- </div>
326
- )}
327
- <div
328
- ref={list}
329
- id={id}
330
- role="listbox"
331
- aria-label={label}
332
- tabIndex={-1}
333
- aria-activedescendant={activeId}
334
- className="no-scrollbar flex min-h-0 flex-col overflow-y-auto overscroll-contain p-1.5 outline-none"
335
- >
336
- {shown.map((option) => {
337
- const chosen = option.value === value;
338
- const focused = option === activeOption;
339
- return (
340
- // biome-ignore lint/a11y/useKeyWithClickEvents: option div handles keyboard via role=option and aria-selected
341
- <div
342
- key={option.value}
343
- id={`${id}-${option.value}`}
344
- data-value={option.value}
345
- role="option"
346
- tabIndex={-1}
347
- aria-selected={chosen}
348
- aria-disabled={option.disabled || undefined}
349
- lang={option.lang}
350
- onPointerMove={() =>
351
- !option.disabled && setActive(enabled.indexOf(option))
352
- }
353
- onClick={() => !option.disabled && onPick(option.value)}
354
- className={cn(
355
- "text-subheadline flex min-h-8 cursor-default items-center gap-2 rounded-lg px-2 py-1.5 [@media(pointer:coarse)]:min-h-11",
356
- focused ? "bg-fill" : "",
357
- option.disabled && "opacity-40",
358
- chosen ? "text-label font-semibold" : "text-label",
359
- )}
360
- >
361
- <span className="flex w-4 shrink-0 justify-center">
362
- {chosen && (
363
- <CheckIcon
364
- size={15}
365
- strokeWidth={2.4}
366
- className="text-accent-text"
367
- />
368
- )}
369
- </span>
370
- <span className="min-w-0 grow break-words">{option.label}</span>
371
- {option.detail && (
372
- <span className="text-caption text-label-tertiary shrink-0 font-normal">
373
- {option.detail}
374
- </span>
375
- )}
376
- </div>
377
- );
378
- })}
379
- {canCreate && (
380
- // biome-ignore lint/a11y/useKeyWithClickEvents: create div handles keyboard via role=option
381
- <div
382
- id={`${id}-create`}
383
- role="option"
384
- aria-selected={false}
385
- tabIndex={-1}
386
- onPointerMove={() => setActive(enabled.length)}
387
- onClick={create}
388
- className={cn(
389
- "text-subheadline text-accent-text flex min-h-9 cursor-default items-center rounded-lg px-2 py-1.5",
390
- !activeOption && "bg-fill",
391
- )}
392
- >
393
- {createLabel?.(trimmed) ?? trimmed}
394
- </div>
395
- )}
396
- {shown.length === 0 && !canCreate && (
397
- <p className="text-footnote text-label-tertiary px-3 py-2">
398
- {emptyLabel}
399
- </p>
400
- )}
401
- </div>
402
- </AnchoredSurface>
403
- );
404
- }