@passui/react 0.1.16 → 0.1.19

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 (366) hide show
  1. package/README.md +102 -1
  2. package/dist/types/src/appearance/index.d.ts +2 -0
  3. package/dist/types/src/appearance/platform.d.ts +9 -0
  4. package/dist/types/src/appearance/theme.d.ts +71 -0
  5. package/dist/types/src/components/ambient/ambient.d.ts +12 -0
  6. package/dist/types/src/components/ambient/index.d.ts +1 -0
  7. package/dist/types/src/components/button/button-styles.d.ts +12 -0
  8. package/dist/types/src/components/button/button.d.ts +30 -0
  9. package/dist/types/src/components/button/icon-button.d.ts +10 -0
  10. package/dist/types/src/components/button/pending-spinner.d.ts +5 -0
  11. package/dist/types/src/components/button/use-pending-indicator.d.ts +2 -0
  12. package/dist/types/src/components/chip/chip.d.ts +7 -0
  13. package/dist/types/src/components/compact-date-picker/calendar-month.d.ts +25 -0
  14. package/dist/types/src/components/compact-date-picker/compact-date-picker.d.ts +27 -0
  15. package/dist/types/src/components/compact-time-picker/compact-time-picker.d.ts +26 -0
  16. package/dist/types/src/components/compact-time-picker/time-value.d.ts +18 -0
  17. package/dist/types/src/components/content-view/content-view.d.ts +48 -0
  18. package/dist/types/src/components/content-view/index.d.ts +1 -0
  19. package/dist/types/src/components/context-menu/conceal-menu-source.d.ts +2 -0
  20. package/dist/types/src/components/context-menu/context-menu-host.d.ts +2 -0
  21. package/dist/types/src/components/context-menu/context-menu-store.d.ts +57 -0
  22. package/dist/types/src/components/context-menu/menu-navigation.d.ts +6 -0
  23. package/dist/types/src/components/context-menu/menu-position.d.ts +21 -0
  24. package/dist/types/src/components/context-menu/menu-reveal.d.ts +22 -0
  25. package/dist/types/src/components/context-menu/use-context-menu.d.ts +14 -0
  26. package/dist/types/src/components/conversation/conversation.d.ts +43 -0
  27. package/dist/types/src/components/conversation/index.d.ts +1 -0
  28. package/dist/types/src/components/date-picker/date-picker.d.ts +16 -0
  29. package/dist/types/src/components/date-picker/date-value.d.ts +2 -0
  30. package/dist/types/src/components/dialog/dialog-host.d.ts +6 -0
  31. package/dist/types/src/components/dialog/dialog-store.d.ts +21 -0
  32. package/dist/types/src/components/dialog/dialog.d.ts +30 -0
  33. package/dist/types/src/components/dialog/index.d.ts +1 -0
  34. package/dist/types/src/components/disclosure-group/disclosure-group.d.ts +13 -0
  35. package/dist/types/src/components/divider/divider.d.ts +9 -0
  36. package/dist/types/src/components/inline-disclosure/inline-disclosure.d.ts +15 -0
  37. package/dist/types/src/components/labeled-content/labeled-content.d.ts +19 -0
  38. package/dist/types/src/components/locale-switcher/index.d.ts +1 -0
  39. package/dist/types/src/components/locale-switcher/locale-switcher.d.ts +10 -0
  40. package/dist/types/src/components/menu/menu.d.ts +16 -0
  41. package/dist/types/src/components/picker/picker-trigger.d.ts +2 -0
  42. package/dist/types/src/components/picker/picker.d.ts +37 -0
  43. package/dist/types/src/components/popover/popover-fit.d.ts +21 -0
  44. package/dist/types/src/components/popover/popover.d.ts +14 -0
  45. package/dist/types/src/components/profile-image/profile-image.d.ts +4 -0
  46. package/dist/types/src/components/progress-view/progress-view.d.ts +13 -0
  47. package/dist/types/src/components/search-field/search-field.d.ts +2 -0
  48. package/dist/types/src/components/search-list/search-list.d.ts +19 -0
  49. package/dist/types/src/components/section/section.d.ts +15 -0
  50. package/dist/types/src/components/secure-field/secure-field.d.ts +4 -0
  51. package/dist/types/src/components/segmented-control/segmented-control.d.ts +20 -0
  52. package/dist/types/src/components/sheet/modal-environment.d.ts +2 -0
  53. package/dist/types/src/components/sheet/sheet-portal.d.ts +5 -0
  54. package/dist/types/src/components/sheet/sheet.d.ts +21 -0
  55. package/dist/types/src/components/sheet/use-sheet-focus.d.ts +3 -0
  56. package/dist/types/src/components/sidebar/sidebar.d.ts +18 -0
  57. package/dist/types/src/components/slider/slider.d.ts +14 -0
  58. package/dist/types/src/components/stat-tile/index.d.ts +1 -0
  59. package/dist/types/src/components/stat-tile/stat-tile.d.ts +15 -0
  60. package/dist/types/src/components/status-indicator/status-indicator.d.ts +14 -0
  61. package/dist/types/src/components/stepper/stepper.d.ts +19 -0
  62. package/dist/types/src/components/swatch-picker/swatch-picker.d.ts +17 -0
  63. package/dist/types/src/components/tab-bar/tab-bar.d.ts +40 -0
  64. package/dist/types/src/components/tab-view/tab-view.d.ts +24 -0
  65. package/dist/types/src/components/table/table.d.ts +10 -0
  66. package/dist/types/src/components/text-editor/text-editor.d.ts +2 -0
  67. package/dist/types/src/components/text-field/text-field.d.ts +18 -0
  68. package/dist/types/src/components/toast/toast-store.d.ts +47 -0
  69. package/dist/types/src/components/toast/toaster.d.ts +10 -0
  70. package/dist/types/src/components/toggle/toggle.d.ts +17 -0
  71. package/dist/types/src/components/tooltip/tooltip-host.d.ts +6 -0
  72. package/dist/types/src/components/view-controller/index.d.ts +1 -0
  73. package/dist/types/src/components/view-controller/view-controller.d.ts +21 -0
  74. package/dist/types/src/hooks/scroll/minimize-decision.d.ts +2 -0
  75. package/dist/types/src/hooks/use-anchored-placement.d.ts +7 -0
  76. package/dist/types/src/hooks/use-dismiss.d.ts +9 -0
  77. package/dist/types/src/hooks/use-floating-dismiss.d.ts +3 -0
  78. package/dist/types/src/hooks/use-media-query.d.ts +21 -0
  79. package/dist/types/src/hooks/use-minimize-on-scroll.d.ts +6 -0
  80. package/dist/types/src/hooks/use-visual-viewport.d.ts +4 -0
  81. package/dist/types/src/hooks/viewport/types.d.ts +19 -0
  82. package/dist/types/src/hooks/viewport/viewport-metrics.d.ts +3 -0
  83. package/dist/types/src/icons/icons.d.ts +612 -0
  84. package/dist/types/src/index.d.ts +58 -0
  85. package/dist/types/src/lib/anchored-placement.d.ts +39 -0
  86. package/dist/types/src/lib/class-names.d.ts +2 -0
  87. package/dist/types/src/lib/clipboard.d.ts +6 -0
  88. package/dist/types/src/lib/date.d.ts +50 -0
  89. package/dist/types/src/lib/floating-layers.d.ts +8 -0
  90. package/dist/types/src/lib/haptics.d.ts +8 -0
  91. package/dist/types/src/lib/language.d.ts +4 -0
  92. package/dist/types/src/lib/range-value.d.ts +4 -0
  93. package/dist/types/src/lib/screen-edges.d.ts +12 -0
  94. package/dist/types/src/lib/shapes.d.ts +17 -0
  95. package/dist/types/src/motion/transitions.d.ts +97 -0
  96. package/dist/types/src/tokens.d.ts +1 -0
  97. package/package.json +192 -40
  98. package/src/appearance/platform.tsx +10 -47
  99. package/src/appearance/theme.tsx +42 -142
  100. package/src/components/ambient/ambient.tsx +2 -10
  101. package/src/components/button/button-styles.ts +13 -31
  102. package/src/components/button/button.tsx +19 -14
  103. package/src/components/button/icon-button.tsx +14 -56
  104. package/src/components/button/use-pending-indicator.ts +2 -7
  105. package/src/components/chip/chip.tsx +8 -13
  106. package/src/components/compact-date-picker/calendar-month.ts +13 -57
  107. package/src/components/compact-date-picker/compact-date-picker.tsx +44 -123
  108. package/src/components/compact-time-picker/compact-time-picker.tsx +46 -130
  109. package/src/components/compact-time-picker/time-value.ts +4 -16
  110. package/src/components/content-view/content-view.tsx +13 -56
  111. package/src/components/context-menu/conceal-menu-source.ts +1 -4
  112. package/src/components/context-menu/context-menu-host.tsx +125 -195
  113. package/src/components/context-menu/context-menu-store.ts +3 -11
  114. package/src/components/context-menu/menu-navigation.ts +29 -0
  115. package/src/components/context-menu/menu-position.ts +6 -27
  116. package/src/components/context-menu/menu-reveal.ts +13 -54
  117. package/src/components/context-menu/use-context-menu.ts +6 -30
  118. package/src/components/conversation/conversation.tsx +26 -72
  119. package/src/components/date-picker/date-picker.tsx +8 -37
  120. package/src/components/date-picker/date-value.ts +5 -30
  121. package/src/components/dialog/dialog-host.tsx +31 -76
  122. package/src/components/dialog/dialog-store.ts +1 -3
  123. package/src/components/dialog/dialog.tsx +23 -80
  124. package/src/components/disclosure-group/disclosure-group.tsx +70 -0
  125. package/src/components/divider/divider.tsx +31 -0
  126. package/src/components/inline-disclosure/inline-disclosure.tsx +49 -0
  127. package/src/components/labeled-content/labeled-content.tsx +24 -18
  128. package/src/components/locale-switcher/locale-switcher.tsx +20 -70
  129. package/src/components/menu/menu.tsx +68 -0
  130. package/src/components/picker/picker-trigger.ts +10 -0
  131. package/src/components/picker/picker.tsx +72 -203
  132. package/src/components/popover/popover-fit.ts +69 -0
  133. package/src/components/popover/popover.tsx +94 -77
  134. package/src/components/profile-image/profile-image.tsx +6 -28
  135. package/src/components/progress-view/progress-view.tsx +65 -0
  136. package/src/components/search-field/search-field.tsx +27 -25
  137. package/src/components/search-list/search-list.tsx +43 -69
  138. package/src/components/section/section.tsx +18 -17
  139. package/src/components/secure-field/secure-field.tsx +5 -7
  140. package/src/components/segmented-control/segmented-control.tsx +20 -29
  141. package/src/components/sheet/modal-environment.ts +16 -54
  142. package/src/components/sheet/sheet-portal.tsx +10 -42
  143. package/src/components/sheet/sheet.tsx +17 -25
  144. package/src/components/sheet/use-sheet-focus.ts +15 -51
  145. package/src/components/sidebar/sidebar.tsx +27 -30
  146. package/src/components/slider/slider.tsx +76 -0
  147. package/src/components/stat-tile/stat-tile.tsx +9 -30
  148. package/src/components/status-indicator/status-indicator.tsx +12 -19
  149. package/src/components/stepper/stepper.tsx +80 -0
  150. package/src/components/swatch-picker/swatch-picker.tsx +19 -15
  151. package/src/components/tab-bar/tab-bar.tsx +59 -59
  152. package/src/components/tab-view/tab-view.tsx +52 -57
  153. package/src/components/table/table.tsx +14 -62
  154. package/src/components/text-editor/text-editor.tsx +2 -12
  155. package/src/components/text-field/text-field.tsx +11 -40
  156. package/src/components/toast/toast-store.ts +9 -30
  157. package/src/components/toast/toaster.tsx +90 -104
  158. package/src/components/toggle/toggle.tsx +28 -24
  159. package/src/components/tooltip/tooltip-host.tsx +71 -69
  160. package/src/components/view-controller/view-controller.tsx +4 -21
  161. package/src/hooks/scroll/minimize-decision.ts +1 -5
  162. package/src/hooks/use-anchored-placement.ts +4 -14
  163. package/src/hooks/use-dismiss.ts +5 -23
  164. package/src/hooks/use-floating-dismiss.ts +28 -0
  165. package/src/hooks/use-media-query.ts +12 -31
  166. package/src/hooks/use-minimize-on-scroll.ts +10 -34
  167. package/src/hooks/use-visual-viewport.ts +5 -14
  168. package/src/hooks/viewport/viewport-metrics.ts +4 -16
  169. package/src/icons/icons.tsx +167 -121
  170. package/src/index.ts +9 -1
  171. package/src/lib/anchored-placement.ts +5 -15
  172. package/src/lib/class-names.ts +1 -2
  173. package/src/lib/clipboard.ts +14 -0
  174. package/src/lib/date.ts +4 -15
  175. package/src/lib/floating-layers.ts +18 -8
  176. package/src/lib/haptics.ts +1 -3
  177. package/src/lib/language.ts +2 -7
  178. package/src/lib/range-value.ts +32 -0
  179. package/src/lib/screen-edges.ts +2 -6
  180. package/src/lib/shapes.ts +5 -20
  181. package/src/motion/transitions.ts +18 -12
  182. package/src/components/ambient/ambient.docs.tsx +0 -68
  183. package/src/components/ambient/examples/ambient-images.tsx +0 -30
  184. package/src/components/ambient/examples/ambient-now-playing.tsx +0 -55
  185. package/src/components/ambient/examples/ambient-showcase.tsx +0 -33
  186. package/src/components/ambient/examples/ambient-usage.tsx +0 -19
  187. package/src/components/button/button.docs.tsx +0 -116
  188. package/src/components/button/examples/button-disabled.tsx +0 -19
  189. package/src/components/button/examples/button-icon.tsx +0 -39
  190. package/src/components/button/examples/button-link.tsx +0 -12
  191. package/src/components/button/examples/button-pending.tsx +0 -27
  192. package/src/components/button/examples/button-showcase.tsx +0 -115
  193. package/src/components/button/examples/button-sizes.tsx +0 -12
  194. package/src/components/button/examples/button-usage.tsx +0 -12
  195. package/src/components/button/examples/button-variants.tsx +0 -15
  196. package/src/components/button/examples/button-with-icon.tsx +0 -32
  197. package/src/components/button/examples/icon-button-player.tsx +0 -38
  198. package/src/components/button/examples/icon-button-showcase.tsx +0 -83
  199. package/src/components/button/examples/icon-button-usage.tsx +0 -11
  200. package/src/components/button/examples/icon-button-variants.tsx +0 -39
  201. package/src/components/button/icon-button.docs.tsx +0 -68
  202. package/src/components/chip/chip.docs.tsx +0 -37
  203. package/src/components/chip/examples/chip-in-rows.tsx +0 -19
  204. package/src/components/chip/examples/chip-showcase.tsx +0 -51
  205. package/src/components/chip/examples/chip-tones.tsx +0 -13
  206. package/src/components/chip/examples/chip-usage.tsx +0 -5
  207. package/src/components/compact-date-picker/compact-date-picker.docs.tsx +0 -81
  208. package/src/components/compact-date-picker/examples/compact-date-picker-showcase.tsx +0 -35
  209. package/src/components/compact-date-picker/examples/compact-date-picker-usage.tsx +0 -22
  210. package/src/components/compact-time-picker/compact-time-picker.docs.tsx +0 -80
  211. package/src/components/compact-time-picker/examples/compact-time-picker-showcase.tsx +0 -31
  212. package/src/components/compact-time-picker/examples/compact-time-picker-usage.tsx +0 -21
  213. package/src/components/content-view/content-view.docs.tsx +0 -61
  214. package/src/components/content-view/examples/content-view-header-action.tsx +0 -33
  215. package/src/components/content-view/examples/content-view-showcase.tsx +0 -65
  216. package/src/components/content-view/examples/content-view-stats.tsx +0 -35
  217. package/src/components/content-view/examples/content-view-usage.tsx +0 -14
  218. package/src/components/context-menu/context-menu.docs.tsx +0 -92
  219. package/src/components/context-menu/examples/context-menu-checked.tsx +0 -37
  220. package/src/components/context-menu/examples/context-menu-list.tsx +0 -85
  221. package/src/components/context-menu/examples/context-menu-showcase.tsx +0 -56
  222. package/src/components/context-menu/examples/context-menu-toolbar.tsx +0 -63
  223. package/src/components/context-menu/examples/context-menu-usage.tsx +0 -24
  224. package/src/components/conversation/conversation.docs.tsx +0 -88
  225. package/src/components/conversation/examples/conversation-composer.tsx +0 -36
  226. package/src/components/conversation/examples/conversation-days.tsx +0 -48
  227. package/src/components/conversation/examples/conversation-showcase.tsx +0 -71
  228. package/src/components/conversation/examples/conversation-usage.tsx +0 -28
  229. package/src/components/date-picker/date-picker.docs.tsx +0 -88
  230. package/src/components/date-picker/examples/date-picker-locales.tsx +0 -41
  231. package/src/components/date-picker/examples/date-picker-past-only.tsx +0 -29
  232. package/src/components/date-picker/examples/date-picker-showcase.tsx +0 -49
  233. package/src/components/date-picker/examples/date-picker-usage.tsx +0 -22
  234. package/src/components/dialog/dialog.docs.tsx +0 -114
  235. package/src/components/dialog/examples/dialog-confirm.tsx +0 -24
  236. package/src/components/dialog/examples/dialog-form.tsx +0 -46
  237. package/src/components/dialog/examples/dialog-inline.tsx +0 -48
  238. package/src/components/dialog/examples/dialog-showcase.tsx +0 -53
  239. package/src/components/dialog/examples/dialog-usage.tsx +0 -31
  240. package/src/components/labeled-content/examples/labeled-content-descriptions.tsx +0 -37
  241. package/src/components/labeled-content/examples/labeled-content-showcase.tsx +0 -54
  242. package/src/components/labeled-content/examples/labeled-content-usage.tsx +0 -22
  243. package/src/components/labeled-content/examples/labeled-content-values.tsx +0 -26
  244. package/src/components/labeled-content/examples/labeled-content-wide.tsx +0 -46
  245. package/src/components/labeled-content/labeled-content.docs.tsx +0 -69
  246. package/src/components/locale-switcher/examples/locale-switcher-native-names.tsx +0 -30
  247. package/src/components/locale-switcher/examples/locale-switcher-showcase.tsx +0 -46
  248. package/src/components/locale-switcher/examples/locale-switcher-translated-page.tsx +0 -35
  249. package/src/components/locale-switcher/examples/locale-switcher-usage.tsx +0 -20
  250. package/src/components/locale-switcher/locale-switcher.docs.tsx +0 -91
  251. package/src/components/picker/examples/picker-details.tsx +0 -44
  252. package/src/components/picker/examples/picker-searchable.tsx +0 -48
  253. package/src/components/picker/examples/picker-showcase.tsx +0 -66
  254. package/src/components/picker/examples/picker-usage.tsx +0 -20
  255. package/src/components/picker/picker.docs.tsx +0 -68
  256. package/src/components/popover/examples/popover-help.tsx +0 -57
  257. package/src/components/popover/examples/popover-menu.tsx +0 -51
  258. package/src/components/popover/examples/popover-showcase.tsx +0 -61
  259. package/src/components/popover/examples/popover-usage.tsx +0 -31
  260. package/src/components/popover/popover.docs.tsx +0 -84
  261. package/src/components/profile-image/examples/profile-image-fallbacks.tsx +0 -29
  262. package/src/components/profile-image/examples/profile-image-group.tsx +0 -34
  263. package/src/components/profile-image/examples/profile-image-showcase.tsx +0 -30
  264. package/src/components/profile-image/examples/profile-image-usage.tsx +0 -14
  265. package/src/components/profile-image/profile-image.docs.tsx +0 -81
  266. package/src/components/search-field/examples/search-field-filter.tsx +0 -53
  267. package/src/components/search-field/examples/search-field-showcase.tsx +0 -56
  268. package/src/components/search-field/examples/search-field-toolbar.tsx +0 -27
  269. package/src/components/search-field/examples/search-field-usage.tsx +0 -18
  270. package/src/components/search-field/search-field.docs.tsx +0 -58
  271. package/src/components/search-list/examples/search-list-dropdown.tsx +0 -53
  272. package/src/components/search-list/examples/search-list-groups.tsx +0 -64
  273. package/src/components/search-list/examples/search-list-showcase.tsx +0 -67
  274. package/src/components/search-list/examples/search-list-usage.tsx +0 -27
  275. package/src/components/search-list/search-list.docs.tsx +0 -87
  276. package/src/components/section/examples/section-actions.tsx +0 -35
  277. package/src/components/section/examples/section-groups.tsx +0 -41
  278. package/src/components/section/examples/section-showcase.tsx +0 -63
  279. package/src/components/section/examples/section-usage.tsx +0 -19
  280. package/src/components/section/section.docs.tsx +0 -51
  281. package/src/components/secure-field/examples/secure-field-new-password.tsx +0 -56
  282. package/src/components/secure-field/examples/secure-field-reveal.tsx +0 -20
  283. package/src/components/secure-field/examples/secure-field-showcase.tsx +0 -62
  284. package/src/components/secure-field/examples/secure-field-usage.tsx +0 -19
  285. package/src/components/secure-field/secure-field.docs.tsx +0 -72
  286. package/src/components/segmented-control/examples/segmented-control-overflow.tsx +0 -28
  287. package/src/components/segmented-control/examples/segmented-control-showcase.tsx +0 -59
  288. package/src/components/segmented-control/examples/segmented-control-usage.tsx +0 -20
  289. package/src/components/segmented-control/examples/segmented-control-views.tsx +0 -32
  290. package/src/components/segmented-control/segmented-control.docs.tsx +0 -61
  291. package/src/components/sheet/examples/sheet-choices.tsx +0 -58
  292. package/src/components/sheet/examples/sheet-share.tsx +0 -51
  293. package/src/components/sheet/examples/sheet-showcase.tsx +0 -74
  294. package/src/components/sheet/examples/sheet-usage.tsx +0 -32
  295. package/src/components/sheet/sheet.docs.tsx +0 -75
  296. package/src/components/sidebar/examples/sidebar-groups.tsx +0 -133
  297. package/src/components/sidebar/examples/sidebar-showcase.tsx +0 -123
  298. package/src/components/sidebar/examples/sidebar-unread.tsx +0 -66
  299. package/src/components/sidebar/examples/sidebar-usage.tsx +0 -52
  300. package/src/components/sidebar/sidebar.docs.tsx +0 -135
  301. package/src/components/stat-tile/examples/stat-tile-filters.tsx +0 -32
  302. package/src/components/stat-tile/examples/stat-tile-grid.tsx +0 -21
  303. package/src/components/stat-tile/examples/stat-tile-showcase.tsx +0 -52
  304. package/src/components/stat-tile/examples/stat-tile-usage.tsx +0 -13
  305. package/src/components/stat-tile/stat-tile.docs.tsx +0 -60
  306. package/src/components/status-indicator/examples/status-indicator-live.tsx +0 -34
  307. package/src/components/status-indicator/examples/status-indicator-showcase.tsx +0 -39
  308. package/src/components/status-indicator/examples/status-indicator-states.tsx +0 -17
  309. package/src/components/status-indicator/examples/status-indicator-usage.tsx +0 -9
  310. package/src/components/status-indicator/status-indicator.docs.tsx +0 -43
  311. package/src/components/swatch-picker/examples/swatch-picker-accents.tsx +0 -42
  312. package/src/components/swatch-picker/examples/swatch-picker-labels.tsx +0 -45
  313. package/src/components/swatch-picker/examples/swatch-picker-showcase.tsx +0 -70
  314. package/src/components/swatch-picker/examples/swatch-picker-usage.tsx +0 -39
  315. package/src/components/swatch-picker/swatch-picker.docs.tsx +0 -60
  316. package/src/components/tab-bar/examples/tab-bar-five-tabs.tsx +0 -66
  317. package/src/components/tab-bar/examples/tab-bar-minimize.tsx +0 -71
  318. package/src/components/tab-bar/examples/tab-bar-showcase.tsx +0 -82
  319. package/src/components/tab-bar/examples/tab-bar-usage.tsx +0 -54
  320. package/src/components/tab-bar/tab-bar.docs.tsx +0 -136
  321. package/src/components/tab-view/examples/tab-view-keyboard.tsx +0 -39
  322. package/src/components/tab-view/examples/tab-view-settings.tsx +0 -56
  323. package/src/components/tab-view/examples/tab-view-showcase.tsx +0 -53
  324. package/src/components/tab-view/examples/tab-view-usage.tsx +0 -23
  325. package/src/components/tab-view/tab-view.docs.tsx +0 -77
  326. package/src/components/table/examples/table-empty.tsx +0 -53
  327. package/src/components/table/examples/table-invoices.tsx +0 -102
  328. package/src/components/table/examples/table-selection.tsx +0 -150
  329. package/src/components/table/examples/table-showcase.tsx +0 -115
  330. package/src/components/table/examples/table-usage.tsx +0 -67
  331. package/src/components/table/examples/table-wide.tsx +0 -75
  332. package/src/components/table/table.docs.tsx +0 -131
  333. package/src/components/text-editor/examples/text-editor-comment.tsx +0 -48
  334. package/src/components/text-editor/examples/text-editor-count.tsx +0 -38
  335. package/src/components/text-editor/examples/text-editor-showcase.tsx +0 -58
  336. package/src/components/text-editor/examples/text-editor-usage.tsx +0 -25
  337. package/src/components/text-editor/text-editor.docs.tsx +0 -61
  338. package/src/components/text-field/examples/text-field-icons.tsx +0 -72
  339. package/src/components/text-field/examples/text-field-showcase.tsx +0 -50
  340. package/src/components/text-field/examples/text-field-usage.tsx +0 -18
  341. package/src/components/text-field/examples/text-field-validation.tsx +0 -27
  342. package/src/components/text-field/text-field.docs.tsx +0 -118
  343. package/src/components/toast/examples/toast-action.tsx +0 -32
  344. package/src/components/toast/examples/toast-promise.tsx +0 -45
  345. package/src/components/toast/examples/toast-showcase.tsx +0 -49
  346. package/src/components/toast/examples/toast-usage.tsx +0 -13
  347. package/src/components/toast/toast.docs.tsx +0 -79
  348. package/src/components/toggle/examples/toggle-checkboxes.tsx +0 -43
  349. package/src/components/toggle/examples/toggle-settings.tsx +0 -31
  350. package/src/components/toggle/examples/toggle-showcase.tsx +0 -59
  351. package/src/components/toggle/examples/toggle-usage.tsx +0 -13
  352. package/src/components/toggle/toggle.docs.tsx +0 -69
  353. package/src/components/tooltip/examples/tooltip-icon-buttons.tsx +0 -27
  354. package/src/components/tooltip/examples/tooltip-shortcuts.tsx +0 -38
  355. package/src/components/tooltip/examples/tooltip-showcase.tsx +0 -44
  356. package/src/components/tooltip/examples/tooltip-usage.tsx +0 -13
  357. package/src/components/tooltip/tooltip.docs.tsx +0 -56
  358. package/src/components/view-controller/examples/view-controller-action.tsx +0 -27
  359. package/src/components/view-controller/examples/view-controller-settings.tsx +0 -31
  360. package/src/components/view-controller/examples/view-controller-showcase.tsx +0 -45
  361. package/src/components/view-controller/examples/view-controller-usage.tsx +0 -19
  362. package/src/components/view-controller/view-controller.docs.tsx +0 -71
  363. package/src/docs/index.ts +0 -3
  364. package/src/docs/registry.ts +0 -113
  365. package/src/docs/snippet.ts +0 -17
  366. package/src/docs/types.ts +0 -180
@@ -1,8 +1,4 @@
1
- import {
2
- AnimatePresence,
3
- motion,
4
- useReducedMotion,
5
- } from "motion/react"
1
+ import { AnimatePresence, motion, useReducedMotion } from "motion/react"
6
2
  import {
7
3
  type KeyboardEvent,
8
4
  useCallback,
@@ -14,21 +10,15 @@ import {
14
10
  useState,
15
11
  } from "react"
16
12
  import { createPortal } from "react-dom"
13
+ import { useAnchoredPlacement } from "../../hooks/use-anchored-placement"
14
+ import { useFloatingDismiss } from "../../hooks/use-floating-dismiss"
17
15
  import { FLOATING_LAYER } from "../../hooks/use-dismiss"
18
- import {
19
- CheckIcon,
20
- SearchIcon,
21
- SelectorIcon,
22
- } from "../../icons/icons"
16
+ import { CheckIcon, SearchIcon, SelectorIcon } from "../../icons/icons"
23
17
  import { cn } from "../../lib/class-names"
24
- import {
25
- type AnchoredPlacement,
26
- placeInViewport,
27
- } from "../../lib/anchored-placement"
28
18
  import { registerFloatingLayer } from "../../lib/floating-layers"
29
19
  import { haptic } from "../../lib/haptics"
30
- import { screenEdges } from "../../lib/screen-edges"
31
- import { spring } from "../../motion/transitions"
20
+ import { floatingPanelMotion } from "../../motion/transitions"
21
+ import { pickerTriggerStyle } from "./picker-trigger"
32
22
 
33
23
  export interface PickerOption<T extends string> {
34
24
  value: T
@@ -39,6 +29,29 @@ export interface PickerOption<T extends string> {
39
29
  lang?: string
40
30
  }
41
31
 
32
+ /** Values and callbacks share the option value type, including literal unions. */
33
+ export interface PickerProps<T extends string> {
34
+ /** The selected option's value. */
35
+ value: T
36
+ /** Available choices. Use a literal union for a fixed set of values. */
37
+ options: ReadonlyArray<PickerOption<T>>
38
+ /** Called with the selected option value. */
39
+ onChange: (value: NoInfer<T>) => void
40
+ /** Accessible name for the trigger. */
41
+ label: string
42
+ /** Shown when the selected value has no matching option. */
43
+ placeholder?: string
44
+ /** Defaults to on for lists of ten or more options. */
45
+ searchable?: boolean
46
+ /** Label for the filter field. @default "Search" */
47
+ searchPlaceholder?: string
48
+ /** Shown when the filter matches nothing. @default "No matches" */
49
+ emptyLabel?: string
50
+ className?: string
51
+ /** Prevents opening or choosing an option. @default false */
52
+ disabled?: boolean
53
+ }
54
+
42
55
  /** Long lists get a filter field, as in the system pickers. */
43
56
  const SEARCH_FROM = 10
44
57
 
@@ -58,39 +71,20 @@ export function Picker<T extends string>({
58
71
  searchPlaceholder = "Search",
59
72
  emptyLabel = "No matches",
60
73
  className,
61
- }: {
62
- value: T
63
- options: ReadonlyArray<PickerOption<T>>
64
- onChange: (value: T) => void
65
- /** Read by assistive technology; the visible label is the field around it. */
66
- label: string
67
- placeholder?: string
68
- /** Defaults to on for lists longer than ten. */
69
- searchable?: boolean
70
- searchPlaceholder?: string
71
- /** Shown when the filter matches nothing. */
72
- emptyLabel?: string
73
- className?: string
74
- }) {
74
+ disabled = false,
75
+ }: PickerProps<T>) {
75
76
  const [open, setOpen] = useState(false)
76
77
  const trigger = useRef<HTMLButtonElement>(null)
77
78
  const listId = useId()
78
- const selected = options.find(
79
- (option) => option.value === value
80
- )
79
+ const selected = options.find((option) => option.value === value)
81
80
 
82
81
  const close = useCallback((refocus: boolean) => {
83
82
  setOpen(false)
84
- if (refocus) trigger.current?.focus()
83
+ if (refocus) trigger.current?.focus({ preventScroll: true })
85
84
  }, [])
86
85
 
87
- const onTriggerKey = (
88
- event: KeyboardEvent<HTMLButtonElement>
89
- ) => {
90
- if (
91
- event.key === "ArrowDown" ||
92
- event.key === "ArrowUp"
93
- ) {
86
+ const onTriggerKey = (event: KeyboardEvent<HTMLButtonElement>) => {
87
+ if (event.key === "ArrowDown" || event.key === "ArrowUp") {
94
88
  event.preventDefault()
95
89
  setOpen(true)
96
90
  }
@@ -104,48 +98,33 @@ export function Picker<T extends string>({
104
98
  role="combobox"
105
99
  aria-label={label}
106
100
  aria-haspopup="listbox"
107
- aria-expanded={open}
108
- aria-controls={open ? listId : undefined}
101
+ aria-expanded={open && !disabled}
102
+ aria-controls={open && !disabled ? listId : undefined}
103
+ disabled={disabled}
109
104
  onClick={() => setOpen((current) => !current)}
110
105
  onKeyDown={onTriggerKey}
111
- className={cn(
112
- "flex w-full min-w-0 items-center gap-2 rounded-lg control-field px-3 py-2 text-start text-subheadline text-label",
113
- className
114
- )}
106
+ className={pickerTriggerStyle(className)}
115
107
  >
116
108
  <span
117
109
  lang={selected?.lang}
118
- className={cn(
119
- "min-w-0 grow truncate",
120
- !selected && "text-label-tertiary"
121
- )}
110
+ className={cn("min-w-0 grow truncate", !selected && "text-label-tertiary")}
122
111
  >
123
112
  {selected?.label ?? placeholder ?? ""}
124
113
  </span>
125
- <SelectorIcon
126
- size={15}
127
- strokeWidth={2}
128
- className="shrink-0 text-label-tertiary"
129
- />
114
+ <SelectorIcon size={15} strokeWidth={2} className="shrink-0 text-label-tertiary" />
130
115
  </button>
131
116
  {typeof document !== "undefined" &&
132
117
  createPortal(
133
118
  <AnimatePresence>
134
- {open && trigger.current && (
119
+ {open && !disabled && trigger.current && (
135
120
  <SelectList
136
121
  id={listId}
137
122
  anchor={trigger.current}
138
123
  options={options}
139
124
  value={value}
140
125
  label={label}
141
- searchable={
142
- searchable ??
143
- options.length >
144
- SEARCH_FROM
145
- }
146
- searchPlaceholder={
147
- searchPlaceholder
148
- }
126
+ searchable={searchable ?? options.length > SEARCH_FROM}
127
+ searchPlaceholder={searchPlaceholder}
149
128
  emptyLabel={emptyLabel}
150
129
  onPick={(next) => {
151
130
  close(true)
@@ -163,30 +142,6 @@ export function Picker<T extends string>({
163
142
  )
164
143
  }
165
144
 
166
- function place(anchor: HTMLElement): AnchoredPlacement {
167
- const rect = anchor.getBoundingClientRect()
168
- const viewport = window.visualViewport
169
- const frame = {
170
- anchor: {
171
- top: rect.top,
172
- bottom: rect.bottom,
173
- left: rect.left,
174
- },
175
- viewport: {
176
- width: viewport?.width ?? window.innerWidth,
177
- height: viewport?.height ?? window.innerHeight,
178
- },
179
- edges: screenEdges(),
180
- }
181
- const width = Math.min(Math.max(rect.width, 220), 360)
182
- const placed = placeInViewport(frame, width, 240)
183
- // Long lists scroll rather than stretch past 420 px.
184
- return {
185
- ...placed,
186
- maxHeight: Math.min(placed.maxHeight ?? 420, 420),
187
- }
188
- }
189
-
190
145
  function SelectList<T extends string>({
191
146
  id,
192
147
  anchor,
@@ -214,8 +169,10 @@ function SelectList<T extends string>({
214
169
  const reducedMotion = useReducedMotion()
215
170
  const list = useRef<HTMLDivElement>(null)
216
171
  const search = useRef<HTMLInputElement>(null)
217
- const [placement, setPlacement] = useState(() =>
218
- place(anchor)
172
+ const placement = useAnchoredPlacement(
173
+ anchor,
174
+ Math.min(Math.max(anchor.getBoundingClientRect().width, 220), 360),
175
+ 240
219
176
  )
220
177
  const [query, setQuery] = useState("")
221
178
  const typed = useRef({ text: "", at: 0 })
@@ -233,20 +190,14 @@ function SelectList<T extends string>({
233
190
  const [active, setActive] = useState(() =>
234
191
  Math.max(
235
192
  0,
236
- options.findIndex(
237
- (option) => option.value === value
238
- )
193
+ options.findIndex((option) => option.value === value)
239
194
  )
240
195
  )
241
- const activeOption =
242
- shown[Math.min(active, shown.length - 1)]
196
+ const activeOption = shown[Math.min(active, shown.length - 1)]
243
197
 
244
198
  useLayoutEffect(() => {
245
199
  if (!root.current) return
246
- const unregister = registerFloatingLayer(
247
- root.current,
248
- anchor
249
- )
200
+ const unregister = registerFloatingLayer(root.current, anchor)
250
201
  if (searchable) search.current?.focus()
251
202
  else list.current?.focus()
252
203
  return unregister
@@ -256,58 +207,11 @@ function SelectList<T extends string>({
256
207
  useEffect(() => {
257
208
  if (!activeOption) return
258
209
  list.current
259
- ?.querySelector(
260
- `[data-value="${CSS.escape(activeOption.value)}"]`
261
- )
210
+ ?.querySelector(`[data-value="${CSS.escape(activeOption.value)}"]`)
262
211
  ?.scrollIntoView({ block: "nearest" })
263
212
  }, [activeOption])
264
213
 
265
- useEffect(() => {
266
- const onPointer = (event: PointerEvent) => {
267
- const target = event.target as Node
268
- if (
269
- !root.current?.contains(target) &&
270
- !anchor.contains(target)
271
- )
272
- onClose(false)
273
- }
274
- const onScroll = (event: Event) => {
275
- if (!root.current?.contains(event.target as Node))
276
- setPlacement(place(anchor))
277
- }
278
- const onResize = () => setPlacement(place(anchor))
279
- const onBlur = () => onClose(false)
280
- document.addEventListener(
281
- "pointerdown",
282
- onPointer,
283
- true
284
- )
285
- window.addEventListener("scroll", onScroll, true)
286
- window.addEventListener("resize", onResize)
287
- window.visualViewport?.addEventListener(
288
- "resize",
289
- onResize
290
- )
291
- window.addEventListener("blur", onBlur)
292
- return () => {
293
- document.removeEventListener(
294
- "pointerdown",
295
- onPointer,
296
- true
297
- )
298
- window.removeEventListener(
299
- "scroll",
300
- onScroll,
301
- true
302
- )
303
- window.removeEventListener("resize", onResize)
304
- window.visualViewport?.removeEventListener(
305
- "resize",
306
- onResize
307
- )
308
- window.removeEventListener("blur", onBlur)
309
- }
310
- }, [anchor, onClose])
214
+ useFloatingDismiss(root, anchor, onClose)
311
215
 
312
216
  const onKeyDown = (event: KeyboardEvent) => {
313
217
  const last = shown.length - 1
@@ -319,14 +223,10 @@ function SelectList<T extends string>({
319
223
  if (event.key === "ArrowDown") step(current + 1)
320
224
  else if (event.key === "ArrowUp") step(current - 1)
321
225
  else if (event.key === "Home" && !searchable) step(0)
322
- else if (event.key === "End" && !searchable)
323
- step(last)
226
+ else if (event.key === "End" && !searchable) step(last)
324
227
  else if (event.key === "PageDown") step(current + 8)
325
228
  else if (event.key === "PageUp") step(current - 8)
326
- else if (
327
- event.key === "Enter" ||
328
- (event.key === " " && !searchable)
329
- ) {
229
+ else if (event.key === "Enter" || (event.key === " " && !searchable)) {
330
230
  event.preventDefault()
331
231
  if (activeOption) onPick(activeOption.value)
332
232
  } else if (event.key === "Escape") {
@@ -335,23 +235,13 @@ function SelectList<T extends string>({
335
235
  onClose(true)
336
236
  } else if (event.key === "Tab") {
337
237
  onClose(false)
338
- } else if (
339
- !searchable &&
340
- event.key.length === 1 &&
341
- !event.metaKey &&
342
- !event.ctrlKey
343
- ) {
238
+ } else if (!searchable && event.key.length === 1 && !event.metaKey && !event.ctrlKey) {
344
239
  // Type to jump, as in a native pop-up button.
345
240
  const now = Date.now()
346
- const text =
347
- (now - typed.current.at < 700
348
- ? typed.current.text
349
- : "") + event.key
241
+ const text = (now - typed.current.at < 700 ? typed.current.text : "") + event.key
350
242
  typed.current = { text, at: now }
351
243
  const match = shown.findIndex((option) =>
352
- option.label
353
- .toLocaleLowerCase()
354
- .startsWith(text.toLocaleLowerCase())
244
+ option.label.toLocaleLowerCase().startsWith(text.toLocaleLowerCase())
355
245
  )
356
246
  if (match >= 0) setActive(match)
357
247
  }
@@ -365,7 +255,7 @@ function SelectList<T extends string>({
365
255
  ? { opacity: 0 }
366
256
  : {
367
257
  opacity: 0,
368
- scale: 0.96,
258
+ scale: 1,
369
259
  y: placement.above ? 6 : -6,
370
260
  }
371
261
  }
@@ -375,24 +265,22 @@ function SelectList<T extends string>({
375
265
  ? { opacity: 0 }
376
266
  : {
377
267
  opacity: 0,
378
- scale: 0.98,
379
- transition: { duration: 0.1 },
268
+ scale: 1,
269
+ y: placement.above ? 4 : -4,
380
270
  }
381
271
  }
382
272
  transition={
383
273
  reducedMotion
384
274
  ? { duration: 0 }
385
- : spring.smooth
275
+ : floatingPanelMotion(placement.above ? "above" : "below").transition
386
276
  }
387
277
  style={{
388
278
  left: placement.left,
389
279
  width: placement.width,
390
280
  top: placement.top,
391
281
  bottom: placement.bottom,
392
- maxHeight: placement.maxHeight,
393
- transformOrigin: placement.above
394
- ? "50% 100%"
395
- : "50% 0%",
282
+ maxHeight: Math.min(placement.maxHeight ?? 420, 420),
283
+ transformOrigin: placement.above ? "50% 100%" : "50% 0%",
396
284
  }}
397
285
  className="glass-menu fixed z-[80] flex flex-col overflow-hidden rounded-3xl"
398
286
  {...{ [FLOATING_LAYER]: "" }}
@@ -400,10 +288,7 @@ function SelectList<T extends string>({
400
288
  >
401
289
  {searchable && (
402
290
  <div className="flex shrink-0 items-center gap-2 border-b border-separator/70 px-3 py-2">
403
- <SearchIcon
404
- size={15}
405
- className="shrink-0 text-label-tertiary"
406
- />
291
+ <SearchIcon size={15} className="shrink-0 text-label-tertiary" />
407
292
  <input
408
293
  ref={search}
409
294
  value={query}
@@ -411,9 +296,7 @@ function SelectList<T extends string>({
411
296
  aria-label={searchPlaceholder}
412
297
  aria-controls={id}
413
298
  aria-activedescendant={
414
- activeOption
415
- ? `${id}-${activeOption.value}`
416
- : undefined
299
+ activeOption ? `${id}-${activeOption.value}` : undefined
417
300
  }
418
301
  onChange={(event) => {
419
302
  setQuery(event.target.value)
@@ -429,11 +312,7 @@ function SelectList<T extends string>({
429
312
  role="listbox"
430
313
  aria-label={label}
431
314
  tabIndex={-1}
432
- aria-activedescendant={
433
- activeOption
434
- ? `${id}-${activeOption.value}`
435
- : undefined
436
- }
315
+ aria-activedescendant={activeOption ? `${id}-${activeOption.value}` : undefined}
437
316
  className="no-scrollbar flex min-h-0 flex-col overflow-y-auto overscroll-contain p-1.5 outline-none"
438
317
  >
439
318
  {shown.map((option, index) => {
@@ -448,18 +327,12 @@ function SelectList<T extends string>({
448
327
  tabIndex={-1}
449
328
  aria-selected={chosen}
450
329
  lang={option.lang}
451
- onPointerMove={() =>
452
- setActive(index)
453
- }
454
- onClick={() =>
455
- onPick(option.value)
456
- }
330
+ onPointerMove={() => setActive(index)}
331
+ onClick={() => onPick(option.value)}
457
332
  className={cn(
458
333
  "flex min-h-8 cursor-default items-center gap-2 rounded-lg px-2 py-1.5 text-subheadline [@media(pointer:coarse)]:min-h-11",
459
334
  focused ? "bg-fill" : "",
460
- chosen
461
- ? "font-semibold text-label"
462
- : "text-label"
335
+ chosen ? "font-semibold text-label" : "text-label"
463
336
  )}
464
337
  >
465
338
  <span className="flex w-4 shrink-0 justify-center">
@@ -471,9 +344,7 @@ function SelectList<T extends string>({
471
344
  />
472
345
  )}
473
346
  </span>
474
- <span className="min-w-0 grow break-words">
475
- {option.label}
476
- </span>
347
+ <span className="min-w-0 grow break-words">{option.label}</span>
477
348
  {option.detail && (
478
349
  <span className="shrink-0 text-caption font-normal text-label-tertiary">
479
350
  {option.detail}
@@ -483,9 +354,7 @@ function SelectList<T extends string>({
483
354
  )
484
355
  })}
485
356
  {shown.length === 0 && (
486
- <p className="px-3 py-2 text-footnote text-label-tertiary">
487
- {emptyLabel}
488
- </p>
357
+ <p className="px-3 py-2 text-footnote text-label-tertiary">{emptyLabel}</p>
489
358
  )}
490
359
  </div>
491
360
  </motion.div>
@@ -0,0 +1,69 @@
1
+ import { type PlacementFrame, placeInViewport } from "../../lib/anchored-placement"
2
+
3
+ interface PanelRect {
4
+ left: number
5
+ top: number
6
+ width: number
7
+ height: number
8
+ }
9
+
10
+ interface AnchorRect {
11
+ top: number
12
+ bottom: number
13
+ }
14
+
15
+ export interface PopoverFit {
16
+ shiftX: number
17
+ shiftY: number
18
+ maxWidth: number
19
+ maxHeight?: number
20
+ above: boolean
21
+ }
22
+
23
+ /** Keep an absolutely positioned popover visible without scaling its contents. */
24
+ export function fitPopover(
25
+ panel: PanelRect,
26
+ anchor: AnchorRect | undefined,
27
+ frame: Pick<PlacementFrame, "viewport" | "edges">,
28
+ gap = 6,
29
+ origin: "top-left" | "top-right" = "top-left"
30
+ ): PopoverFit {
31
+ const { viewport, edges } = frame
32
+ const topEdge = edges.top
33
+ const bottomEdge = viewport.height - edges.bottom
34
+ const availableHeight = Math.max(0, bottomEdge - topEdge)
35
+ const placement = placeInViewport(
36
+ {
37
+ ...frame,
38
+ anchor: {
39
+ left: panel.left,
40
+ top: anchor?.top ?? panel.top,
41
+ bottom: anchor?.bottom ?? panel.top,
42
+ },
43
+ },
44
+ panel.width,
45
+ panel.height,
46
+ gap
47
+ )
48
+
49
+ const above = Boolean(anchor && panel.top + panel.height > bottomEdge && placement.above)
50
+ const aboveHeight = anchor ? Math.max(0, anchor.top - topEdge - gap) : 0
51
+ const visibleHeight = above
52
+ ? Math.min(panel.height, aboveHeight)
53
+ : Math.min(panel.height, availableHeight)
54
+ const desiredTop = above
55
+ ? (anchor?.top ?? panel.top) - gap - visibleHeight
56
+ : Math.max(topEdge, Math.min(panel.top, bottomEdge - visibleHeight))
57
+ const heightRoom = above ? aboveHeight : Math.max(0, bottomEdge - desiredTop)
58
+
59
+ return {
60
+ shiftX:
61
+ placement.left -
62
+ panel.left -
63
+ (origin === "top-right" ? panel.width - placement.width : 0),
64
+ shiftY: desiredTop - panel.top,
65
+ maxWidth: Math.max(0, viewport.width - edges.left - edges.right),
66
+ maxHeight: panel.height > heightRoom ? heightRoom : undefined,
67
+ above,
68
+ }
69
+ }