@sovereignfs/ui 0.54.0 → 0.89.1

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 (473) hide show
  1. package/LICENSE +373 -661
  2. package/NOTICE +8 -0
  3. package/README.md +4 -6
  4. package/dist/Accordion.module.css +1 -1
  5. package/dist/Alert.module.css +1 -1
  6. package/dist/AppsLauncher.module.css +102 -0
  7. package/dist/Avatar.module.css +1 -1
  8. package/dist/Badge.module.css +30 -7
  9. package/dist/BalanceChip.module.css +1 -1
  10. package/dist/Button.module.css +23 -2
  11. package/dist/Card.module.css +7 -1
  12. package/dist/CardTile.module.css +187 -0
  13. package/dist/CheckableListRow.module.css +8 -0
  14. package/dist/Checkbox.module.css +8 -0
  15. package/dist/CodeTextarea.module.css +7 -1
  16. package/dist/Collapsible.module.css +1 -1
  17. package/dist/ColorPicker.module.css +138 -0
  18. package/dist/Combobox.module.css +8 -2
  19. package/dist/Command.module.css +7 -1
  20. package/dist/ConfirmDialog.module.css +8 -2
  21. package/dist/ConsentPrompt.module.css +21 -0
  22. package/dist/DatePicker.module.css +7 -1
  23. package/dist/Dialog.module.css +130 -21
  24. package/dist/DragHandleRow.module.css +6 -0
  25. package/dist/Drawer.module.css +36 -7
  26. package/dist/FileDropzone.module.css +25 -1
  27. package/dist/Header.module.css +68 -0
  28. package/dist/HeaderFooterLayout.module.css +21 -0
  29. package/dist/IconPicker.module.css +15 -5
  30. package/dist/Input.module.css +7 -1
  31. package/dist/Kbd.module.css +1 -1
  32. package/dist/LegalLinks.module.css +9 -2
  33. package/dist/Markdown.module.css +29 -0
  34. package/dist/Menu.module.css +1 -0
  35. package/dist/Message.module.css +10 -1
  36. package/dist/MessageScroller.module.css +12 -1
  37. package/dist/MobileAppsDrawer.module.css +19 -14
  38. package/dist/MobileFooter.module.css +7 -1
  39. package/dist/MobileHeader.module.css +14 -1
  40. package/dist/NavList.module.css +139 -0
  41. package/dist/NavTabs.module.css +8 -2
  42. package/dist/NotificationsPanel.module.css +268 -0
  43. package/dist/OverlayHeader.module.css +1 -1
  44. package/dist/PageContainer.module.css +62 -0
  45. package/dist/PageHeader.module.css +54 -0
  46. package/dist/PageLayout.module.css +51 -0
  47. package/dist/Popover.module.css +1 -1
  48. package/dist/QrCode.module.css +17 -0
  49. package/dist/QuantityStepper.module.css +5 -3
  50. package/dist/RadioGroup.module.css +6 -0
  51. package/dist/Resizable.module.css +3 -3
  52. package/dist/RootLayout.module.css +12 -0
  53. package/dist/SegmentedControl.module.css +7 -1
  54. package/dist/Select.module.css +7 -1
  55. package/dist/Sheet.module.css +20 -2
  56. package/dist/SplitPane.module.css +5 -5
  57. package/dist/StatusBadge.module.css +1 -1
  58. package/dist/StepStrip.module.css +55 -0
  59. package/dist/SuggestionInput.module.css +14 -3
  60. package/dist/SwipableMobileCarousel.module.css +12 -3
  61. package/dist/SwipableMobileCarouselDots.module.css +21 -0
  62. package/dist/SwipeStack.module.css +101 -0
  63. package/dist/SystemBanner.module.css +16 -0
  64. package/dist/Table.module.css +2 -2
  65. package/dist/Tabs.module.css +7 -1
  66. package/dist/TagInput.module.css +8 -2
  67. package/dist/Textarea.module.css +15 -1
  68. package/dist/ThreeColumnLayout.module.css +35 -0
  69. package/dist/Toast.module.css +67 -3
  70. package/dist/Toggle.module.css +7 -0
  71. package/dist/Tooltip.module.css +7 -1
  72. package/dist/UserMenu.module.css +95 -0
  73. package/dist/fonts/OFL.txt +93 -0
  74. package/dist/fonts/hanken-grotesk-cyrillic-ext-wght-normal.woff2 +0 -0
  75. package/dist/fonts/hanken-grotesk-latin-ext-wght-normal.woff2 +0 -0
  76. package/dist/fonts/hanken-grotesk-latin-wght-normal.woff2 +0 -0
  77. package/dist/fonts/hanken-grotesk-vietnamese-wght-normal.woff2 +0 -0
  78. package/dist/index.d.ts +1156 -76
  79. package/dist/index.js +4223 -1513
  80. package/dist/tokens/fonts.css +53 -0
  81. package/dist/tokens/primitives.css +23 -12
  82. package/dist/tokens/semantic.css +32 -0
  83. package/dist/tokens/theme-presets.css +33 -0
  84. package/dist/tokens.css +2 -1
  85. package/package.json +46 -19
  86. package/src/__tests__/motion.test.tsx +0 -105
  87. package/src/components/Accordion/Accordion.module.css +0 -3
  88. package/src/components/Accordion/Accordion.stories.tsx +0 -110
  89. package/src/components/Accordion/Accordion.tsx +0 -53
  90. package/src/components/Accordion/__tests__/Accordion.test.tsx +0 -61
  91. package/src/components/Alert/Alert.module.css +0 -62
  92. package/src/components/Alert/Alert.stories.tsx +0 -96
  93. package/src/components/Alert/Alert.tsx +0 -58
  94. package/src/components/Alert/__tests__/Alert.test.tsx +0 -75
  95. package/src/components/AspectRatio/AspectRatio.module.css +0 -15
  96. package/src/components/AspectRatio/AspectRatio.stories.tsx +0 -78
  97. package/src/components/AspectRatio/AspectRatio.tsx +0 -21
  98. package/src/components/AspectRatio/__tests__/AspectRatio.test.tsx +0 -27
  99. package/src/components/Avatar/Avatar.module.css +0 -38
  100. package/src/components/Avatar/Avatar.tsx +0 -42
  101. package/src/components/Badge/Badge.module.css +0 -154
  102. package/src/components/Badge/Badge.stories.tsx +0 -226
  103. package/src/components/Badge/Badge.tsx +0 -81
  104. package/src/components/Badge/__tests__/Badge.test.tsx +0 -88
  105. package/src/components/BalanceChip/BalanceChip.module.css +0 -32
  106. package/src/components/BalanceChip/BalanceChip.stories.tsx +0 -45
  107. package/src/components/BalanceChip/BalanceChip.tsx +0 -33
  108. package/src/components/Breadcrumb/Breadcrumb.module.css +0 -49
  109. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +0 -47
  110. package/src/components/Breadcrumb/Breadcrumb.tsx +0 -57
  111. package/src/components/Breadcrumb/__tests__/Breadcrumb.test.tsx +0 -52
  112. package/src/components/Button/Button.module.css +0 -153
  113. package/src/components/Button/Button.stories.tsx +0 -83
  114. package/src/components/Button/Button.tsx +0 -52
  115. package/src/components/Button/__tests__/Button.test.tsx +0 -66
  116. package/src/components/ButtonGroup/ButtonGroup.module.css +0 -29
  117. package/src/components/ButtonGroup/ButtonGroup.stories.tsx +0 -57
  118. package/src/components/ButtonGroup/ButtonGroup.tsx +0 -27
  119. package/src/components/ButtonGroup/__tests__/ButtonGroup.test.tsx +0 -29
  120. package/src/components/Calendar/Calendar.module.css +0 -126
  121. package/src/components/Calendar/Calendar.tsx +0 -213
  122. package/src/components/Calendar/__tests__/Calendar.test.tsx +0 -98
  123. package/src/components/Calendar/dateUtils.ts +0 -97
  124. package/src/components/Card/Card.module.css +0 -42
  125. package/src/components/Card/Card.tsx +0 -34
  126. package/src/components/CheckableListRow/CheckableListRow.module.css +0 -95
  127. package/src/components/CheckableListRow/CheckableListRow.stories.tsx +0 -99
  128. package/src/components/CheckableListRow/CheckableListRow.tsx +0 -89
  129. package/src/components/Checkbox/Checkbox.module.css +0 -111
  130. package/src/components/Checkbox/Checkbox.tsx +0 -78
  131. package/src/components/CodeTextarea/CodeTextarea.module.css +0 -53
  132. package/src/components/CodeTextarea/CodeTextarea.stories.tsx +0 -77
  133. package/src/components/CodeTextarea/CodeTextarea.tsx +0 -36
  134. package/src/components/Collapsible/Collapsible.module.css +0 -70
  135. package/src/components/Collapsible/Collapsible.stories.tsx +0 -62
  136. package/src/components/Collapsible/Collapsible.tsx +0 -66
  137. package/src/components/Collapsible/__tests__/Collapsible.test.tsx +0 -71
  138. package/src/components/Combobox/Combobox.module.css +0 -122
  139. package/src/components/Combobox/Combobox.stories.tsx +0 -79
  140. package/src/components/Combobox/Combobox.tsx +0 -186
  141. package/src/components/Combobox/__tests__/Combobox.test.tsx +0 -158
  142. package/src/components/Command/Command.module.css +0 -80
  143. package/src/components/Command/Command.stories.tsx +0 -104
  144. package/src/components/Command/Command.tsx +0 -168
  145. package/src/components/Command/__tests__/Command.test.tsx +0 -162
  146. package/src/components/ConfirmDialog/ConfirmDialog.module.css +0 -113
  147. package/src/components/ConfirmDialog/ConfirmDialog.tsx +0 -124
  148. package/src/components/ConfirmDialog/__tests__/ConfirmDialog.test.tsx +0 -146
  149. package/src/components/ContextMenu/ContextMenu.stories.tsx +0 -81
  150. package/src/components/ContextMenu/ContextMenu.tsx +0 -100
  151. package/src/components/ContextMenu/__tests__/ContextMenu.test.tsx +0 -87
  152. package/src/components/CurrencyInput/CurrencyInput.stories.tsx +0 -50
  153. package/src/components/CurrencyInput/CurrencyInput.tsx +0 -60
  154. package/src/components/DataTable/DataTable.module.css +0 -28
  155. package/src/components/DataTable/DataTable.stories.tsx +0 -74
  156. package/src/components/DataTable/DataTable.tsx +0 -154
  157. package/src/components/DataTable/__tests__/DataTable.test.tsx +0 -123
  158. package/src/components/DatePicker/DatePicker.module.css +0 -61
  159. package/src/components/DatePicker/DatePicker.tsx +0 -103
  160. package/src/components/DatePicker/__tests__/DatePicker.test.tsx +0 -89
  161. package/src/components/DeviceOnlyGate/DeviceOnlyGate.tsx +0 -58
  162. package/src/components/DeviceOnlyGate/__tests__/DeviceOnlyGate.test.tsx +0 -45
  163. package/src/components/DeviceStorageKeyGate/DeviceStorageKeyGate.tsx +0 -100
  164. package/src/components/DeviceStorageKeyGate/__tests__/DeviceStorageKeyGate.test.tsx +0 -119
  165. package/src/components/Dialog/Dialog.module.css +0 -226
  166. package/src/components/Dialog/Dialog.stories.tsx +0 -147
  167. package/src/components/Dialog/Dialog.tsx +0 -160
  168. package/src/components/Dialog/__tests__/Dialog.test.tsx +0 -137
  169. package/src/components/DragHandleRow/DragHandleRow.module.css +0 -57
  170. package/src/components/DragHandleRow/DragHandleRow.tsx +0 -61
  171. package/src/components/Drawer/Drawer.module.css +0 -92
  172. package/src/components/Drawer/Drawer.stories.tsx +0 -132
  173. package/src/components/Drawer/Drawer.tsx +0 -176
  174. package/src/components/Drawer/__tests__/Drawer.test.tsx +0 -199
  175. package/src/components/EmptyState/EmptyState.module.css +0 -27
  176. package/src/components/EmptyState/EmptyState.tsx +0 -27
  177. package/src/components/FileDropzone/FileDropzone.module.css +0 -63
  178. package/src/components/FileDropzone/FileDropzone.tsx +0 -109
  179. package/src/components/FileDropzone/__tests__/FileDropzone.test.tsx +0 -67
  180. package/src/components/FormField/FormField.module.css +0 -33
  181. package/src/components/FormField/FormField.tsx +0 -78
  182. package/src/components/FormField/__tests__/FormField.test.tsx +0 -83
  183. package/src/components/HoverCard/HoverCard.module.css +0 -3
  184. package/src/components/HoverCard/HoverCard.stories.tsx +0 -66
  185. package/src/components/HoverCard/HoverCard.tsx +0 -111
  186. package/src/components/HoverCard/__tests__/HoverCard.test.tsx +0 -99
  187. package/src/components/Icon/Icon.module.css +0 -27
  188. package/src/components/Icon/Icon.stories.tsx +0 -95
  189. package/src/components/Icon/Icon.tsx +0 -43
  190. package/src/components/Icon/__tests__/Icon.test.tsx +0 -40
  191. package/src/components/Icon/icons/activity.tsx +0 -20
  192. package/src/components/Icon/icons/alert-triangle.tsx +0 -22
  193. package/src/components/Icon/icons/apple.tsx +0 -21
  194. package/src/components/Icon/icons/banana.tsx +0 -21
  195. package/src/components/Icon/icons/beef.tsx +0 -22
  196. package/src/components/Icon/icons/beer.tsx +0 -24
  197. package/src/components/Icon/icons/bell.tsx +0 -21
  198. package/src/components/Icon/icons/calendar.tsx +0 -23
  199. package/src/components/Icon/icons/candy.tsx +0 -24
  200. package/src/components/Icon/icons/carrot.tsx +0 -22
  201. package/src/components/Icon/icons/check.tsx +0 -20
  202. package/src/components/Icon/icons/chevron-down.tsx +0 -20
  203. package/src/components/Icon/icons/chevron-left.tsx +0 -20
  204. package/src/components/Icon/icons/chevron-right.tsx +0 -20
  205. package/src/components/Icon/icons/chevron-up.tsx +0 -20
  206. package/src/components/Icon/icons/circle-check.tsx +0 -21
  207. package/src/components/Icon/icons/circle-x.tsx +0 -22
  208. package/src/components/Icon/icons/coffee.tsx +0 -23
  209. package/src/components/Icon/icons/cookie.tsx +0 -25
  210. package/src/components/Icon/icons/croissant.tsx +0 -24
  211. package/src/components/Icon/icons/cup-soda.tsx +0 -23
  212. package/src/components/Icon/icons/drumstick.tsx +0 -21
  213. package/src/components/Icon/icons/egg.tsx +0 -20
  214. package/src/components/Icon/icons/ellipsis-vertical.tsx +0 -22
  215. package/src/components/Icon/icons/external-link.tsx +0 -22
  216. package/src/components/Icon/icons/eye-off.tsx +0 -23
  217. package/src/components/Icon/icons/eye.tsx +0 -21
  218. package/src/components/Icon/icons/file.tsx +0 -21
  219. package/src/components/Icon/icons/fish.tsx +0 -25
  220. package/src/components/Icon/icons/grid-2x2.tsx +0 -22
  221. package/src/components/Icon/icons/house.tsx +0 -21
  222. package/src/components/Icon/icons/index.ts +0 -234
  223. package/src/components/Icon/icons/info.tsx +0 -22
  224. package/src/components/Icon/icons/lock.tsx +0 -21
  225. package/src/components/Icon/icons/log-out.tsx +0 -22
  226. package/src/components/Icon/icons/mail.tsx +0 -21
  227. package/src/components/Icon/icons/menu.tsx +0 -22
  228. package/src/components/Icon/icons/milk.tsx +0 -22
  229. package/src/components/Icon/icons/package.tsx +0 -23
  230. package/src/components/Icon/icons/pencil.tsx +0 -21
  231. package/src/components/Icon/icons/pizza.tsx +0 -24
  232. package/src/components/Icon/icons/plus.tsx +0 -21
  233. package/src/components/Icon/icons/rotate-ccw.tsx +0 -21
  234. package/src/components/Icon/icons/salad.tsx +0 -24
  235. package/src/components/Icon/icons/search.tsx +0 -21
  236. package/src/components/Icon/icons/settings.tsx +0 -21
  237. package/src/components/Icon/icons/shield.tsx +0 -20
  238. package/src/components/Icon/icons/shopping-basket.tsx +0 -26
  239. package/src/components/Icon/icons/sliders-horizontal.tsx +0 -28
  240. package/src/components/Icon/icons/smartphone.tsx +0 -21
  241. package/src/components/Icon/icons/snowflake.tsx +0 -31
  242. package/src/components/Icon/icons/spray-can.tsx +0 -29
  243. package/src/components/Icon/icons/trash-2.tsx +0 -24
  244. package/src/components/Icon/icons/upload.tsx +0 -22
  245. package/src/components/Icon/icons/user.tsx +0 -21
  246. package/src/components/Icon/icons/wine.tsx +0 -23
  247. package/src/components/Icon/icons/x.tsx +0 -21
  248. package/src/components/IconPicker/IconPicker.module.css +0 -63
  249. package/src/components/IconPicker/IconPicker.stories.tsx +0 -84
  250. package/src/components/IconPicker/IconPicker.tsx +0 -90
  251. package/src/components/Input/Input.module.css +0 -52
  252. package/src/components/Input/Input.stories.tsx +0 -86
  253. package/src/components/Input/Input.tsx +0 -14
  254. package/src/components/Input/__tests__/Input.test.tsx +0 -22
  255. package/src/components/Item/Item.module.css +0 -70
  256. package/src/components/Item/Item.stories.tsx +0 -62
  257. package/src/components/Item/Item.tsx +0 -54
  258. package/src/components/Item/__tests__/Item.test.tsx +0 -39
  259. package/src/components/Kbd/Kbd.module.css +0 -14
  260. package/src/components/Kbd/Kbd.stories.tsx +0 -32
  261. package/src/components/Kbd/Kbd.tsx +0 -12
  262. package/src/components/Kbd/__tests__/Kbd.test.tsx +0 -14
  263. package/src/components/Label/Label.module.css +0 -11
  264. package/src/components/Label/Label.stories.tsx +0 -40
  265. package/src/components/Label/Label.tsx +0 -24
  266. package/src/components/Label/__tests__/Label.test.tsx +0 -32
  267. package/src/components/LegalLinks/LegalLinks.module.css +0 -24
  268. package/src/components/LegalLinks/LegalLinks.stories.tsx +0 -22
  269. package/src/components/LegalLinks/LegalLinks.tsx +0 -40
  270. package/src/components/Markdown/Markdown.module.css +0 -49
  271. package/src/components/Markdown/Markdown.stories.tsx +0 -30
  272. package/src/components/Markdown/Markdown.tsx +0 -168
  273. package/src/components/Marker/Marker.module.css +0 -33
  274. package/src/components/Marker/Marker.stories.tsx +0 -39
  275. package/src/components/Marker/Marker.tsx +0 -34
  276. package/src/components/Marker/__tests__/Marker.test.tsx +0 -23
  277. package/src/components/MemberMultiSelect/MemberMultiSelect.module.css +0 -27
  278. package/src/components/MemberMultiSelect/MemberMultiSelect.stories.tsx +0 -74
  279. package/src/components/MemberMultiSelect/MemberMultiSelect.tsx +0 -67
  280. package/src/components/Menu/Menu.module.css +0 -89
  281. package/src/components/Menu/Menu.tsx +0 -159
  282. package/src/components/Menu/__tests__/Menu.test.tsx +0 -197
  283. package/src/components/Menubar/Menubar.stories.tsx +0 -52
  284. package/src/components/Menubar/Menubar.tsx +0 -42
  285. package/src/components/Menubar/__tests__/Menubar.test.tsx +0 -45
  286. package/src/components/Message/Message.module.css +0 -99
  287. package/src/components/Message/Message.stories.tsx +0 -79
  288. package/src/components/Message/Message.tsx +0 -41
  289. package/src/components/Message/__tests__/Message.test.tsx +0 -46
  290. package/src/components/MessageScroller/MessageScroller.module.css +0 -54
  291. package/src/components/MessageScroller/MessageScroller.stories.tsx +0 -84
  292. package/src/components/MessageScroller/MessageScroller.tsx +0 -72
  293. package/src/components/MessageScroller/__tests__/MessageScroller.test.tsx +0 -105
  294. package/src/components/MobileAppsDrawer/MobileAppsDrawer.module.css +0 -81
  295. package/src/components/MobileAppsDrawer/MobileAppsDrawer.tsx +0 -78
  296. package/src/components/MobileAppsDrawer/__tests__/MobileAppsDrawer.test.tsx +0 -80
  297. package/src/components/MobileFooter/MobileFooter.module.css +0 -73
  298. package/src/components/MobileFooter/MobileFooter.stories.tsx +0 -47
  299. package/src/components/MobileFooter/MobileFooter.tsx +0 -109
  300. package/src/components/MobileFooter/__tests__/MobileFooter.test.tsx +0 -71
  301. package/src/components/MobileHeader/MobileHeader.module.css +0 -63
  302. package/src/components/MobileHeader/MobileHeader.stories.tsx +0 -57
  303. package/src/components/MobileHeader/MobileHeader.tsx +0 -77
  304. package/src/components/MobileHeader/__tests__/MobileHeader.test.tsx +0 -58
  305. package/src/components/NavTabs/NavTabs.module.css +0 -50
  306. package/src/components/NavTabs/NavTabs.tsx +0 -61
  307. package/src/components/NavigationMenu/NavigationMenu.module.css +0 -53
  308. package/src/components/NavigationMenu/NavigationMenu.stories.tsx +0 -58
  309. package/src/components/NavigationMenu/NavigationMenu.tsx +0 -125
  310. package/src/components/NavigationMenu/__tests__/NavigationMenu.test.tsx +0 -93
  311. package/src/components/OfflineGate/OfflineGate.tsx +0 -44
  312. package/src/components/OfflineGate/__tests__/OfflineGate.test.tsx +0 -66
  313. package/src/components/OverlayHeader/OverlayHeader.module.css +0 -98
  314. package/src/components/OverlayHeader/OverlayHeader.tsx +0 -62
  315. package/src/components/OverlayHeader/__tests__/OverlayHeader.test.tsx +0 -51
  316. package/src/components/PageContainer/PageContainer.module.css +0 -20
  317. package/src/components/PageContainer/PageContainer.tsx +0 -31
  318. package/src/components/PageContainer/__tests__/PageContainer.test.tsx +0 -37
  319. package/src/components/PageHeader/PageHeader.module.css +0 -32
  320. package/src/components/PageHeader/PageHeader.tsx +0 -35
  321. package/src/components/Pagination/Pagination.module.css +0 -98
  322. package/src/components/Pagination/Pagination.stories.tsx +0 -49
  323. package/src/components/Pagination/Pagination.tsx +0 -87
  324. package/src/components/Pagination/__tests__/Pagination.test.tsx +0 -56
  325. package/src/components/Popover/Popover.module.css +0 -74
  326. package/src/components/Popover/Popover.stories.tsx +0 -357
  327. package/src/components/Popover/Popover.tsx +0 -208
  328. package/src/components/Popover/__tests__/Popover.test.tsx +0 -98
  329. package/src/components/Progress/Progress.module.css +0 -20
  330. package/src/components/Progress/Progress.stories.tsx +0 -40
  331. package/src/components/Progress/Progress.tsx +0 -35
  332. package/src/components/Progress/__tests__/Progress.test.tsx +0 -31
  333. package/src/components/QuantityStepper/QuantityStepper.module.css +0 -67
  334. package/src/components/QuantityStepper/QuantityStepper.stories.tsx +0 -79
  335. package/src/components/QuantityStepper/QuantityStepper.tsx +0 -107
  336. package/src/components/RadioGroup/RadioGroup.module.css +0 -88
  337. package/src/components/RadioGroup/RadioGroup.stories.tsx +0 -69
  338. package/src/components/RadioGroup/RadioGroup.tsx +0 -99
  339. package/src/components/RadioGroup/__tests__/RadioGroup.test.tsx +0 -59
  340. package/src/components/Resizable/Resizable.module.css +0 -70
  341. package/src/components/Resizable/Resizable.stories.tsx +0 -82
  342. package/src/components/Resizable/Resizable.tsx +0 -313
  343. package/src/components/Resizable/__tests__/Resizable.test.tsx +0 -128
  344. package/src/components/ResponsiveSurface/ResponsiveSurface.tsx +0 -24
  345. package/src/components/ResponsiveSurface/__tests__/ResponsiveSurface.test.tsx +0 -73
  346. package/src/components/ScrollArea/ScrollArea.module.css +0 -20
  347. package/src/components/ScrollArea/ScrollArea.stories.tsx +0 -57
  348. package/src/components/ScrollArea/ScrollArea.tsx +0 -27
  349. package/src/components/ScrollArea/__tests__/ScrollArea.test.tsx +0 -39
  350. package/src/components/SegmentedControl/SegmentedControl.module.css +0 -55
  351. package/src/components/SegmentedControl/SegmentedControl.stories.tsx +0 -118
  352. package/src/components/SegmentedControl/SegmentedControl.tsx +0 -56
  353. package/src/components/SegmentedControl/__tests__/SegmentedControl.test.tsx +0 -63
  354. package/src/components/Select/Select.module.css +0 -82
  355. package/src/components/Select/Select.stories.tsx +0 -115
  356. package/src/components/Select/Select.tsx +0 -48
  357. package/src/components/Select/__tests__/Select.test.tsx +0 -59
  358. package/src/components/Sheet/Sheet.module.css +0 -55
  359. package/src/components/Sheet/Sheet.tsx +0 -109
  360. package/src/components/Sheet/__tests__/Sheet.test.tsx +0 -99
  361. package/src/components/Slider/Slider.module.css +0 -95
  362. package/src/components/Slider/Slider.stories.tsx +0 -64
  363. package/src/components/Slider/Slider.tsx +0 -77
  364. package/src/components/Slider/__tests__/Slider.test.tsx +0 -45
  365. package/src/components/Spinner/Spinner.module.css +0 -39
  366. package/src/components/Spinner/Spinner.tsx +0 -23
  367. package/src/components/SplitMethodSelector/SplitMethodSelector.stories.tsx +0 -33
  368. package/src/components/SplitMethodSelector/SplitMethodSelector.tsx +0 -43
  369. package/src/components/SplitPane/SplitPane.module.css +0 -85
  370. package/src/components/SplitPane/SplitPane.stories.tsx +0 -160
  371. package/src/components/SplitPane/SplitPane.tsx +0 -149
  372. package/src/components/SplitPane/__tests__/SplitPane.test.tsx +0 -51
  373. package/src/components/StatusBadge/StatusBadge.module.css +0 -59
  374. package/src/components/StatusBadge/StatusBadge.stories.tsx +0 -74
  375. package/src/components/StatusBadge/StatusBadge.tsx +0 -65
  376. package/src/components/SuggestionInput/SuggestionInput.module.css +0 -103
  377. package/src/components/SuggestionInput/SuggestionInput.stories.tsx +0 -144
  378. package/src/components/SuggestionInput/SuggestionInput.tsx +0 -207
  379. package/src/components/SwipableMobileCarousel/SwipableMobileCarousel.module.css +0 -55
  380. package/src/components/SwipableMobileCarousel/SwipableMobileCarousel.tsx +0 -227
  381. package/src/components/SwipableMobileCarousel/SwipableMobileCarouselSlide.tsx +0 -35
  382. package/src/components/SwipableMobileCarousel/SwipableMobileCarouselSlideBody.tsx +0 -42
  383. package/src/components/SwipableMobileCarousel/SwipableMobileCarouselSlideFooter.tsx +0 -18
  384. package/src/components/SwipableMobileCarousel/SwipableMobileCarouselSlideHeader.tsx +0 -21
  385. package/src/components/SwipableMobileCarousel/SwipableMobileCarouselSlideParts.module.css +0 -29
  386. package/src/components/SwipableMobileCarousel/__tests__/SwipableMobileCarousel.test.tsx +0 -133
  387. package/src/components/SwipableMobileCarousel/__tests__/SwipableMobileCarouselDevGuard.test.tsx +0 -61
  388. package/src/components/SwipableMobileCarousel/context.ts +0 -13
  389. package/src/components/SwipableMobileCarouselDots/SwipableMobileCarouselDots.module.css +0 -49
  390. package/src/components/SwipableMobileCarouselDots/SwipableMobileCarouselDots.tsx +0 -62
  391. package/src/components/SwipableMobileCarouselDots/__tests__/SwipableMobileCarouselDots.test.tsx +0 -63
  392. package/src/components/SystemBanner/SystemBanner.module.css +0 -69
  393. package/src/components/SystemBanner/SystemBanner.stories.tsx +0 -86
  394. package/src/components/SystemBanner/SystemBanner.tsx +0 -50
  395. package/src/components/SystemBanner/__tests__/SystemBanner.test.tsx +0 -50
  396. package/src/components/Table/Table.module.css +0 -45
  397. package/src/components/Table/Table.stories.tsx +0 -125
  398. package/src/components/Table/Table.tsx +0 -51
  399. package/src/components/Table/__tests__/Table.test.tsx +0 -50
  400. package/src/components/Tabs/Tabs.module.css +0 -56
  401. package/src/components/Tabs/Tabs.stories.tsx +0 -100
  402. package/src/components/Tabs/Tabs.tsx +0 -46
  403. package/src/components/Tabs/__tests__/Tabs.test.tsx +0 -45
  404. package/src/components/TagInput/TagInput.module.css +0 -141
  405. package/src/components/TagInput/TagInput.stories.tsx +0 -109
  406. package/src/components/TagInput/TagInput.tsx +0 -174
  407. package/src/components/TagInput/__tests__/TagInput.test.tsx +0 -69
  408. package/src/components/Textarea/Textarea.module.css +0 -39
  409. package/src/components/Textarea/Textarea.tsx +0 -15
  410. package/src/components/Textarea/__tests__/Textarea.test.tsx +0 -29
  411. package/src/components/Toast/Toast.module.css +0 -132
  412. package/src/components/Toast/Toast.stories.tsx +0 -191
  413. package/src/components/Toast/Toast.tsx +0 -139
  414. package/src/components/Toggle/Toggle.module.css +0 -57
  415. package/src/components/Toggle/Toggle.stories.tsx +0 -95
  416. package/src/components/Toggle/Toggle.tsx +0 -39
  417. package/src/components/Toggle/__tests__/Toggle.test.tsx +0 -47
  418. package/src/components/Tooltip/Tooltip.module.css +0 -56
  419. package/src/components/Tooltip/Tooltip.tsx +0 -30
  420. package/src/components/Typography/Typography.module.css +0 -47
  421. package/src/components/Typography/Typography.stories.tsx +0 -62
  422. package/src/components/Typography/Typography.tsx +0 -30
  423. package/src/components/Typography/__tests__/Typography.test.tsx +0 -34
  424. package/src/css-modules.d.ts +0 -4
  425. package/src/hooks/__tests__/useCarouselRouteSync.test.tsx +0 -126
  426. package/src/hooks/__tests__/useDoubleTap.test.tsx +0 -117
  427. package/src/hooks/__tests__/useIsMobile.test.tsx +0 -80
  428. package/src/hooks/__tests__/useIsOffline.test.tsx +0 -53
  429. package/src/hooks/__tests__/useLongPress.test.tsx +0 -158
  430. package/src/hooks/__tests__/useOfflineTileState.test.tsx +0 -69
  431. package/src/hooks/__tests__/useResponsiveLayout.test.tsx +0 -87
  432. package/src/hooks/__tests__/useSnapCarousel.test.tsx +0 -93
  433. package/src/hooks/__tests__/useSwipeReveal.test.tsx +0 -110
  434. package/src/hooks/index.ts +0 -24
  435. package/src/hooks/useCarouselRouteSync.ts +0 -92
  436. package/src/hooks/useCommitOnEnterOrBlur.ts +0 -39
  437. package/src/hooks/useDoubleTap.ts +0 -91
  438. package/src/hooks/useIsMobile.ts +0 -33
  439. package/src/hooks/useIsOffline.ts +0 -41
  440. package/src/hooks/useLongPress.ts +0 -185
  441. package/src/hooks/useOfflineTileState.ts +0 -45
  442. package/src/hooks/useResponsiveLayout.ts +0 -36
  443. package/src/hooks/useSnapCarousel.ts +0 -79
  444. package/src/hooks/useSwipeReveal.ts +0 -107
  445. package/src/index.ts +0 -251
  446. package/src/motion.ts +0 -78
  447. package/src/overlay-shell.ts +0 -94
  448. package/src/scroll-lock.ts +0 -22
  449. package/src/stories/Avatar.stories.tsx +0 -44
  450. package/src/stories/Card.stories.tsx +0 -35
  451. package/src/stories/Checkbox.stories.tsx +0 -45
  452. package/src/stories/DesignSystemOverview.stories.tsx +0 -3187
  453. package/src/stories/DeviceOnlyGate.stories.tsx +0 -35
  454. package/src/stories/DeviceStorageKeyGate.stories.tsx +0 -57
  455. package/src/stories/DragHandleRow.stories.tsx +0 -41
  456. package/src/stories/EmptyState.stories.tsx +0 -33
  457. package/src/stories/FileDropzone.stories.tsx +0 -69
  458. package/src/stories/FormField.stories.tsx +0 -47
  459. package/src/stories/InteractionHooks.stories.tsx +0 -925
  460. package/src/stories/MobilePatterns.stories.tsx +0 -1536
  461. package/src/stories/NavTabs.stories.tsx +0 -53
  462. package/src/stories/OfflineGate.stories.tsx +0 -42
  463. package/src/stories/PageContainer.stories.tsx +0 -37
  464. package/src/stories/PageHeader.stories.tsx +0 -42
  465. package/src/stories/ResponsiveSurface.stories.tsx +0 -47
  466. package/src/stories/Spinner.stories.tsx +0 -25
  467. package/src/stories/SwipableMobileCarousel.stories.tsx +0 -304
  468. package/src/stories/Textarea.stories.tsx +0 -51
  469. package/src/stories/TokenGallery.stories.tsx +0 -602
  470. package/src/stories/Tooltip.stories.tsx +0 -59
  471. package/src/tokens/primitives.css +0 -157
  472. package/src/tokens/semantic.css +0 -130
  473. package/src/tokens.css +0 -5
@@ -1,65 +0,0 @@
1
- import type { ReactNode } from 'react';
2
- import styles from './StatusBadge.module.css';
3
-
4
- export type StatusBadgeStatus =
5
- | 'unmodified'
6
- | 'draft'
7
- | 'committed'
8
- | 'conflict'
9
- | 'pending-delete'
10
- | 'synced'
11
- | 'warning'
12
- | 'error';
13
-
14
- export interface StatusBadgeProps {
15
- status: StatusBadgeStatus;
16
- children?: ReactNode;
17
- /** Accessible label when the visible text is abbreviated or contextual. */
18
- 'aria-label'?: string;
19
- className?: string;
20
- }
21
-
22
- const STATUS_CLASS: Record<StatusBadgeStatus, string> = {
23
- unmodified: styles.neutral as string,
24
- draft: styles.info as string,
25
- committed: styles.success as string,
26
- conflict: styles.error as string,
27
- 'pending-delete': styles.warning as string,
28
- synced: styles.success as string,
29
- warning: styles.warning as string,
30
- error: styles.error as string,
31
- };
32
-
33
- const STATUS_LABEL: Record<StatusBadgeStatus, string> = {
34
- unmodified: 'Unmodified',
35
- draft: 'Draft',
36
- committed: 'Committed',
37
- conflict: 'Conflict',
38
- 'pending-delete': 'Pending delete',
39
- synced: 'Synced',
40
- warning: 'Warning',
41
- error: 'Error',
42
- };
43
-
44
- /**
45
- * StatusBadge — compact inline status indicator for editor lists, draft
46
- * workflows, and sync states.
47
- */
48
- export function StatusBadge({
49
- status,
50
- children,
51
- className,
52
- 'aria-label': ariaLabel,
53
- }: StatusBadgeProps) {
54
- const label = children ?? STATUS_LABEL[status];
55
-
56
- return (
57
- <span
58
- className={[styles.badge, STATUS_CLASS[status], className].filter(Boolean).join(' ')}
59
- aria-label={ariaLabel}
60
- >
61
- <span className={styles.dot} aria-hidden="true" />
62
- <span className={styles.label}>{label}</span>
63
- </span>
64
- );
65
- }
@@ -1,103 +0,0 @@
1
- .input {
2
- display: block;
3
- width: 100%;
4
- padding: var(--sv-space-2) var(--sv-space-3);
5
- font-family: var(--sv-font-family);
6
- font-size: var(--sv-font-size-sm);
7
- line-height: 1.5;
8
- color: var(--sv-color-text-primary);
9
- background-color: var(--sv-color-surface);
10
- border: 1px solid var(--sv-color-border-strong);
11
- border-radius: var(--sv-radius-md);
12
- transition:
13
- border-color 0.15s ease,
14
- box-shadow 0.15s ease;
15
- }
16
-
17
- /* iOS Safari auto-zooms on focused inputs under 16px — see Input.module.css
18
- for the full rationale; kept in sync here since this isn't built on Input. */
19
- @media (pointer: coarse) {
20
- .input {
21
- font-size: var(--sv-font-size-md);
22
- }
23
- }
24
-
25
- .input::placeholder {
26
- color: var(--sv-color-text-muted);
27
- }
28
-
29
- .input:focus-visible {
30
- outline: none;
31
- border-color: var(--sv-color-accent);
32
- box-shadow: 0 0 0 2px var(--sv-color-focus-ring);
33
- }
34
-
35
- .input:disabled {
36
- opacity: 0.5;
37
- cursor: not-allowed;
38
- }
39
-
40
- .list {
41
- list-style: none;
42
- margin: 0;
43
- padding: var(--sv-space-1);
44
- max-height: 320px;
45
- overflow-y: auto;
46
- }
47
-
48
- .status {
49
- padding: var(--sv-space-2) var(--sv-space-3);
50
- font-size: var(--sv-font-size-sm);
51
- color: var(--sv-color-text-muted);
52
- }
53
-
54
- .option {
55
- display: flex;
56
- align-items: center;
57
- gap: var(--sv-space-2);
58
- width: 100%;
59
- padding: var(--sv-space-2) var(--sv-space-3);
60
- border: none;
61
- border-radius: var(--sv-radius-sm);
62
- background: transparent;
63
- font-family: var(--sv-font-family);
64
- font-size: var(--sv-font-size-sm);
65
- color: var(--sv-color-text-primary);
66
- text-align: left;
67
- cursor: pointer;
68
- }
69
-
70
- .option:hover,
71
- .optionActive {
72
- background: var(--sv-color-surface-sunken);
73
- }
74
-
75
- .optionIcon {
76
- display: flex;
77
- align-items: center;
78
- flex-shrink: 0;
79
- }
80
-
81
- .optionLabel {
82
- flex: 1;
83
- min-width: 0;
84
- overflow: hidden;
85
- text-overflow: ellipsis;
86
- white-space: nowrap;
87
- }
88
-
89
- .optionMeta {
90
- flex-shrink: 0;
91
- font-size: var(--sv-font-size-xs);
92
- color: var(--sv-color-text-subtle);
93
- }
94
-
95
- .optionCreate {
96
- font-style: italic;
97
- color: var(--sv-color-text-muted);
98
- }
99
-
100
- .divider {
101
- margin: var(--sv-space-1) var(--sv-space-2);
102
- border-top: 1px solid var(--sv-color-border);
103
- }
@@ -1,144 +0,0 @@
1
- import { useMemo, useState } from 'react';
2
- import type { Meta, StoryObj } from '@storybook/react-vite';
3
- import { SuggestionInput, type SuggestionOption } from './SuggestionInput';
4
-
5
- const meta = {
6
- title: 'Components/SuggestionInput',
7
- component: SuggestionInput,
8
- parameters: {
9
- layout: 'padded',
10
- docs: {
11
- description: {
12
- component:
13
- 'A text field with an anchored, keyboard-navigable list of async suggestions, plus an optional trailing "create new" row so free text is always a valid commit.',
14
- },
15
- },
16
- },
17
- args: {
18
- value: '',
19
- onChange: () => {},
20
- options: [],
21
- onSelect: () => {},
22
- 'aria-label': 'Add an item',
23
- },
24
- } satisfies Meta<typeof SuggestionInput>;
25
-
26
- export default meta;
27
- type Story = StoryObj<typeof meta>;
28
-
29
- const CATALOG: SuggestionOption[] = [
30
- { id: '1', label: 'Bananas', icon: '🍌', meta: 'bought 4× recently' },
31
- { id: '2', label: 'Banana bread mix', icon: '🍞' },
32
- { id: '3', label: 'Milk', icon: '🥛' },
33
- { id: '4', label: 'Eggs', icon: '🥚' },
34
- { id: '5', label: 'Olive oil', icon: '🫒' },
35
- ];
36
-
37
- function ControlledSuggestionInput({ withCreateRow = true }: { withCreateRow?: boolean }) {
38
- const [value, setValue] = useState('');
39
- const [selected, setSelected] = useState<string | null>(null);
40
- const options = useMemo(
41
- () =>
42
- value.trim()
43
- ? CATALOG.filter((c) => c.label.toLowerCase().includes(value.trim().toLowerCase()))
44
- : [],
45
- [value],
46
- );
47
-
48
- return (
49
- <div style={{ width: 320 }}>
50
- <SuggestionInput
51
- value={value}
52
- onChange={setValue}
53
- options={options}
54
- onSelect={(option) => {
55
- setSelected(option.label);
56
- setValue('');
57
- }}
58
- placeholder="Add an item…"
59
- aria-label="Add an item"
60
- createLabel={withCreateRow ? (v) => `Add "${v}" as a new item` : undefined}
61
- onCreate={
62
- withCreateRow
63
- ? (v) => {
64
- setSelected(v);
65
- setValue('');
66
- }
67
- : undefined
68
- }
69
- />
70
- {selected && <p style={{ marginTop: 12, fontSize: 13 }}>Added: {selected}</p>}
71
- </div>
72
- );
73
- }
74
-
75
- export const Default: Story = {
76
- render: () => <ControlledSuggestionInput />,
77
- };
78
-
79
- export const NoCreateRow: Story = {
80
- name: 'Without create row (matched options only)',
81
- render: () => <ControlledSuggestionInput withCreateRow={false} />,
82
- };
83
-
84
- export const OpenWithOptions: Story = {
85
- render: () => (
86
- <div style={{ width: 320 }}>
87
- <SuggestionInput
88
- value="ban"
89
- onChange={() => {}}
90
- options={CATALOG.slice(0, 2)}
91
- onSelect={() => {}}
92
- aria-label="Add an item"
93
- createLabel={(v) => `Add "${v}" as a new item`}
94
- onCreate={() => {}}
95
- />
96
- </div>
97
- ),
98
- };
99
-
100
- export const Loading: Story = {
101
- render: () => (
102
- <div style={{ width: 320 }}>
103
- <SuggestionInput
104
- value="ban"
105
- onChange={() => {}}
106
- options={[]}
107
- onSelect={() => {}}
108
- loading
109
- aria-label="Add an item"
110
- />
111
- </div>
112
- ),
113
- };
114
-
115
- export const Empty: Story = {
116
- name: 'Empty (no matches, no create row)',
117
- render: () => (
118
- <div style={{ width: 320 }}>
119
- <SuggestionInput
120
- value="xyz"
121
- onChange={() => {}}
122
- options={[]}
123
- onSelect={() => {}}
124
- aria-label="Add an item"
125
- />
126
- </div>
127
- ),
128
- };
129
-
130
- export const Disabled: Story = {
131
- render: () => (
132
- <div style={{ width: 320 }}>
133
- <SuggestionInput
134
- value=""
135
- onChange={() => {}}
136
- options={[]}
137
- onSelect={() => {}}
138
- disabled
139
- placeholder="Add an item…"
140
- aria-label="Add an item"
141
- />
142
- </div>
143
- ),
144
- };
@@ -1,207 +0,0 @@
1
- 'use client';
2
-
3
- import { useId, useRef, useState, type KeyboardEvent, type ReactNode } from 'react';
4
- import { Popover } from '../Popover/Popover';
5
- import styles from './SuggestionInput.module.css';
6
-
7
- export interface SuggestionOption {
8
- id: string;
9
- label: string;
10
- icon?: ReactNode;
11
- /** Secondary text shown right-aligned on the row, e.g. "bought 4× recently". */
12
- meta?: string;
13
- }
14
-
15
- export interface SuggestionInputProps {
16
- value: string;
17
- onChange: (value: string) => void;
18
- options: SuggestionOption[];
19
- onSelect: (option: SuggestionOption) => void;
20
- placeholder?: string;
21
- 'aria-label': string;
22
- id?: string;
23
- disabled?: boolean;
24
- /** Shown in place of the options list while a suggestion fetch is in flight. */
25
- loading?: boolean;
26
- /**
27
- * Label for a trailing, always-selectable row that commits the raw typed
28
- * text instead of a matched option — e.g. `(v) => \`Add "${v}" as a new item\`}`.
29
- * Shown whenever `value` is non-empty and `onCreate` is provided, even
30
- * when `options` is empty, so the input is never a dead end.
31
- */
32
- createLabel?: (value: string) => string;
33
- onCreate?: (value: string) => void;
34
- className?: string;
35
- }
36
-
37
- /**
38
- * SuggestionInput — a text field with an anchored, keyboard-navigable list
39
- * of async suggestions (a combobox), plus an optional trailing "create new"
40
- * row so free text is always a valid commit, not just a matched option.
41
- *
42
- * Fully controlled: the caller owns `value`/`onChange` and supplies
43
- * `options` (e.g. debounced server-fetched results) — this component only
44
- * handles open/close, keyboard navigation, and selection. Built on `Popover`
45
- * for positioning (`width: 'trigger'`, so the panel always matches the
46
- * input's own width).
47
- */
48
- export function SuggestionInput({
49
- value,
50
- onChange,
51
- options,
52
- onSelect,
53
- placeholder,
54
- 'aria-label': ariaLabel,
55
- id,
56
- disabled = false,
57
- loading = false,
58
- createLabel,
59
- onCreate,
60
- className,
61
- }: SuggestionInputProps) {
62
- const generatedId = useId();
63
- const inputId = id ?? generatedId;
64
- const listId = `${inputId}-suggestions`;
65
- const inputRef = useRef<HTMLInputElement>(null);
66
- const [focused, setFocused] = useState(false);
67
- const [activeIndex, setActiveIndex] = useState(-1);
68
-
69
- const showCreateRow = Boolean(onCreate && createLabel && value.trim());
70
- const rowCount = options.length + (showCreateRow ? 1 : 0);
71
- const open = focused && (rowCount > 0 || loading);
72
-
73
- function close() {
74
- setFocused(false);
75
- setActiveIndex(-1);
76
- }
77
-
78
- function commitIndex(index: number) {
79
- if (index < 0 || index >= rowCount) return;
80
- const option = options[index];
81
- if (option) {
82
- onSelect(option);
83
- } else if (onCreate) {
84
- onCreate(value);
85
- }
86
- close();
87
- }
88
-
89
- function handleKeyDown(e: KeyboardEvent<HTMLInputElement>) {
90
- if (!open) return;
91
- // Some synthetic input sources (seen from automated/CDP-driven key
92
- // dispatch) send a keydown with `key`/`code` as "Unidentified" or empty
93
- // and no `keyCode` either — nothing here can special-case that further,
94
- // but checking the legacy numeric code costs nothing and covers sources
95
- // that do populate it even when `key` doesn't (older browsers, some
96
- // assistive tech, IME edge cases).
97
- const isArrowDown = e.key === 'ArrowDown' || e.keyCode === 40;
98
- const isArrowUp = e.key === 'ArrowUp' || e.keyCode === 38;
99
- const isEnter = e.key === 'Enter' || e.keyCode === 13;
100
- const isEscape = e.key === 'Escape' || e.keyCode === 27;
101
-
102
- if (isArrowDown) {
103
- e.preventDefault();
104
- setActiveIndex((i) => (i + 1) % rowCount);
105
- } else if (isArrowUp) {
106
- e.preventDefault();
107
- setActiveIndex((i) => (i <= 0 ? rowCount - 1 : i - 1));
108
- } else if (isEnter) {
109
- e.preventDefault();
110
- commitIndex(activeIndex === -1 ? 0 : activeIndex);
111
- } else if (isEscape) {
112
- close();
113
- }
114
- }
115
-
116
- const trigger = (
117
- <input
118
- ref={inputRef}
119
- id={inputId}
120
- type="text"
121
- role="combobox"
122
- aria-expanded={open}
123
- aria-controls={listId}
124
- aria-autocomplete="list"
125
- aria-activedescendant={activeIndex >= 0 ? `${listId}-option-${activeIndex}` : undefined}
126
- aria-label={ariaLabel}
127
- className={[styles.input, className].filter(Boolean).join(' ')}
128
- value={value}
129
- placeholder={placeholder}
130
- disabled={disabled}
131
- autoComplete="off"
132
- onChange={(e) => {
133
- onChange(e.target.value);
134
- setActiveIndex(-1);
135
- }}
136
- onFocus={() => setFocused(true)}
137
- onKeyDown={handleKeyDown}
138
- />
139
- );
140
-
141
- return (
142
- <Popover
143
- trigger={trigger}
144
- open={open}
145
- onClose={close}
146
- width="trigger"
147
- aria-label={`${ariaLabel} suggestions`}
148
- >
149
- <ul id={listId} role="listbox" className={styles.list}>
150
- {loading ? (
151
- <li className={styles.status}>Loading…</li>
152
- ) : (
153
- <>
154
- {options.map((option, index) => (
155
- <li key={option.id} role="none">
156
- <button
157
- id={`${listId}-option-${index}`}
158
- role="option"
159
- aria-selected={index === activeIndex}
160
- type="button"
161
- className={[styles.option, index === activeIndex ? styles.optionActive : '']
162
- .filter(Boolean)
163
- .join(' ')}
164
- // Selecting via mouse fires before the input's blur — use
165
- // onMouseDown (not onClick) so the click doesn't lose focus
166
- // and close the popover before the selection registers.
167
- onMouseDown={(e) => {
168
- e.preventDefault();
169
- commitIndex(index);
170
- }}
171
- >
172
- {option.icon && <span className={styles.optionIcon}>{option.icon}</span>}
173
- <span className={styles.optionLabel}>{option.label}</span>
174
- {option.meta && <span className={styles.optionMeta}>{option.meta}</span>}
175
- </button>
176
- </li>
177
- ))}
178
- {showCreateRow && createLabel && (
179
- <li role="none">
180
- {options.length > 0 && <div className={styles.divider} />}
181
- <button
182
- id={`${listId}-option-${options.length}`}
183
- role="option"
184
- aria-selected={options.length === activeIndex}
185
- type="button"
186
- className={[
187
- styles.option,
188
- styles.optionCreate,
189
- options.length === activeIndex ? styles.optionActive : '',
190
- ]
191
- .filter(Boolean)
192
- .join(' ')}
193
- onMouseDown={(e) => {
194
- e.preventDefault();
195
- commitIndex(options.length);
196
- }}
197
- >
198
- {createLabel(value)}
199
- </button>
200
- </li>
201
- )}
202
- </>
203
- )}
204
- </ul>
205
- </Popover>
206
- );
207
- }
@@ -1,55 +0,0 @@
1
- .wrap {
2
- position: relative;
3
- height: 100%;
4
- width: 100%;
5
- }
6
-
7
- .scroller {
8
- height: 100%;
9
- width: 100%;
10
- display: flex;
11
- overflow-x: auto;
12
- overflow-y: hidden;
13
- scroll-snap-type: x mandatory;
14
- /* Momentum + rubber-banding come from the browser's native scroll physics —
15
- no hand-rolled pointer/touch dragging. Deliberately NOT
16
- -webkit-overflow-scrolling: touch: that legacy iOS <13 hint promotes its
17
- element to its own compositing layer for GPU-accelerated momentum
18
- scroll, and that layer's paint order relative to siblings/fixed
19
- descendants elsewhere in the tree isn't always reliable on real iOS
20
- Safari (confirmed via sovereign-tasks' and sovereign-shopper's own
21
- carousels, which hit and fixed this exact bug — a position:fixed
22
- overlay opened above the scroller painted BEHIND it instead of above).
23
- Removing it doesn't disable momentum scrolling on any iOS version this
24
- platform realistically targets. */
25
- }
26
-
27
- .slide {
28
- flex: 0 0 100%;
29
- width: 100%;
30
- height: 100%;
31
- min-width: 0;
32
- overflow: hidden;
33
- scroll-snap-align: start;
34
- scroll-snap-stop: always;
35
- /* Slide content is a flex column so Header/Footer stay their natural size
36
- and Body (flex: 1 1 auto, min-height: 0) fills and scrolls the rest —
37
- see SwipableMobileCarouselSlideParts.module.css. */
38
- display: flex;
39
- flex-direction: column;
40
- }
41
-
42
- .dots {
43
- /* Overlays the bottom of .wrap rather than taking its own layout row —
44
- matches both sovereign-tasks' and sovereign-shopper's existing dots
45
- placement. */
46
- position: absolute;
47
- left: 0;
48
- right: 0;
49
- bottom: var(--sv-space-3);
50
- pointer-events: none;
51
- }
52
-
53
- .dots > * {
54
- pointer-events: auto;
55
- }