@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,26 +0,0 @@
1
- // Generated by scripts/generate-icons.ts — do not edit.
2
- // Source: Lucide (https://lucide.dev) — ISC license, see packages/ui/NOTICE.
3
- import type { SVGProps } from 'react';
4
-
5
- export function ShoppingBasketIcon(props: SVGProps<SVGSVGElement>) {
6
- return (
7
- <svg
8
- xmlns="http://www.w3.org/2000/svg"
9
- viewBox="0 0 24 24"
10
- fill="none"
11
- stroke="currentColor"
12
- strokeWidth="2"
13
- strokeLinecap="round"
14
- strokeLinejoin="round"
15
- {...props}
16
- >
17
- <path d="m15 11-1 9" />
18
- <path d="m19 11-4-7" />
19
- <path d="M2 11h20" />
20
- <path d="m3.5 11 1.6 7.4a2 2 0 0 0 2 1.6h9.8a2 2 0 0 0 2-1.6l1.7-7.4" />
21
- <path d="M4.5 15.5h15" />
22
- <path d="m5 11 4-7" />
23
- <path d="m9 11 1 9" />
24
- </svg>
25
- );
26
- }
@@ -1,28 +0,0 @@
1
- // Generated by scripts/generate-icons.ts — do not edit.
2
- // Source: Lucide (https://lucide.dev) — ISC license, see packages/ui/NOTICE.
3
- import type { SVGProps } from 'react';
4
-
5
- export function SlidersHorizontalIcon(props: SVGProps<SVGSVGElement>) {
6
- return (
7
- <svg
8
- xmlns="http://www.w3.org/2000/svg"
9
- viewBox="0 0 24 24"
10
- fill="none"
11
- stroke="currentColor"
12
- strokeWidth="2"
13
- strokeLinecap="round"
14
- strokeLinejoin="round"
15
- {...props}
16
- >
17
- <path d="M10 5H3" />
18
- <path d="M12 19H3" />
19
- <path d="M14 3v4" />
20
- <path d="M16 17v4" />
21
- <path d="M21 12h-9" />
22
- <path d="M21 19h-5" />
23
- <path d="M21 5h-7" />
24
- <path d="M8 10v4" />
25
- <path d="M8 12H3" />
26
- </svg>
27
- );
28
- }
@@ -1,21 +0,0 @@
1
- // Generated by scripts/generate-icons.ts — do not edit.
2
- // Source: Lucide (https://lucide.dev) — ISC license, see packages/ui/NOTICE.
3
- import type { SVGProps } from 'react';
4
-
5
- export function SmartphoneIcon(props: SVGProps<SVGSVGElement>) {
6
- return (
7
- <svg
8
- xmlns="http://www.w3.org/2000/svg"
9
- viewBox="0 0 24 24"
10
- fill="none"
11
- stroke="currentColor"
12
- strokeWidth="2"
13
- strokeLinecap="round"
14
- strokeLinejoin="round"
15
- {...props}
16
- >
17
- <rect width="14" height="20" x="5" y="2" rx="2" ry="2" />
18
- <path d="M12 18h.01" />
19
- </svg>
20
- );
21
- }
@@ -1,31 +0,0 @@
1
- // Generated by scripts/generate-icons.ts — do not edit.
2
- // Source: Lucide (https://lucide.dev) — ISC license, see packages/ui/NOTICE.
3
- import type { SVGProps } from 'react';
4
-
5
- export function SnowflakeIcon(props: SVGProps<SVGSVGElement>) {
6
- return (
7
- <svg
8
- xmlns="http://www.w3.org/2000/svg"
9
- viewBox="0 0 24 24"
10
- fill="none"
11
- stroke="currentColor"
12
- strokeWidth="2"
13
- strokeLinecap="round"
14
- strokeLinejoin="round"
15
- {...props}
16
- >
17
- <path d="m10 20-1.25-2.5L6 18" />
18
- <path d="M10 4 8.75 6.5 6 6" />
19
- <path d="m14 20 1.25-2.5L18 18" />
20
- <path d="m14 4 1.25 2.5L18 6" />
21
- <path d="m17 21-3-6h-4" />
22
- <path d="m17 3-3 6 1.5 3" />
23
- <path d="M2 12h6.5L10 9" />
24
- <path d="m20 10-1.5 2 1.5 2" />
25
- <path d="M22 12h-6.5L14 15" />
26
- <path d="m4 10 1.5 2L4 14" />
27
- <path d="m7 21 3-6-1.5-3" />
28
- <path d="m7 3 3 6h4" />
29
- </svg>
30
- );
31
- }
@@ -1,29 +0,0 @@
1
- // Generated by scripts/generate-icons.ts — do not edit.
2
- // Source: Lucide (https://lucide.dev) — ISC license, see packages/ui/NOTICE.
3
- import type { SVGProps } from 'react';
4
-
5
- export function SprayCanIcon(props: SVGProps<SVGSVGElement>) {
6
- return (
7
- <svg
8
- xmlns="http://www.w3.org/2000/svg"
9
- viewBox="0 0 24 24"
10
- fill="none"
11
- stroke="currentColor"
12
- strokeWidth="2"
13
- strokeLinecap="round"
14
- strokeLinejoin="round"
15
- {...props}
16
- >
17
- <path d="M3 3h.01" />
18
- <path d="M7 5h.01" />
19
- <path d="M11 7h.01" />
20
- <path d="M3 7h.01" />
21
- <path d="M7 9h.01" />
22
- <path d="M3 11h.01" />
23
- <rect width="4" height="4" x="15" y="5" />
24
- <path d="m19 9 2 2v10c0 .6-.4 1-1 1h-6c-.6 0-1-.4-1-1V11l2-2" />
25
- <path d="m13 14 8-2" />
26
- <path d="m13 19 8-2" />
27
- </svg>
28
- );
29
- }
@@ -1,24 +0,0 @@
1
- // Generated by scripts/generate-icons.ts — do not edit.
2
- // Source: Lucide (https://lucide.dev) — ISC license, see packages/ui/NOTICE.
3
- import type { SVGProps } from 'react';
4
-
5
- export function Trash2Icon(props: SVGProps<SVGSVGElement>) {
6
- return (
7
- <svg
8
- xmlns="http://www.w3.org/2000/svg"
9
- viewBox="0 0 24 24"
10
- fill="none"
11
- stroke="currentColor"
12
- strokeWidth="2"
13
- strokeLinecap="round"
14
- strokeLinejoin="round"
15
- {...props}
16
- >
17
- <path d="M10 11v6" />
18
- <path d="M14 11v6" />
19
- <path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6" />
20
- <path d="M3 6h18" />
21
- <path d="M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" />
22
- </svg>
23
- );
24
- }
@@ -1,22 +0,0 @@
1
- // Generated by scripts/generate-icons.ts — do not edit.
2
- // Source: Lucide (https://lucide.dev) — ISC license, see packages/ui/NOTICE.
3
- import type { SVGProps } from 'react';
4
-
5
- export function UploadIcon(props: SVGProps<SVGSVGElement>) {
6
- return (
7
- <svg
8
- xmlns="http://www.w3.org/2000/svg"
9
- viewBox="0 0 24 24"
10
- fill="none"
11
- stroke="currentColor"
12
- strokeWidth="2"
13
- strokeLinecap="round"
14
- strokeLinejoin="round"
15
- {...props}
16
- >
17
- <path d="M12 3v12" />
18
- <path d="m17 8-5-5-5 5" />
19
- <path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" />
20
- </svg>
21
- );
22
- }
@@ -1,21 +0,0 @@
1
- // Generated by scripts/generate-icons.ts — do not edit.
2
- // Source: Lucide (https://lucide.dev) — ISC license, see packages/ui/NOTICE.
3
- import type { SVGProps } from 'react';
4
-
5
- export function UserIcon(props: SVGProps<SVGSVGElement>) {
6
- return (
7
- <svg
8
- xmlns="http://www.w3.org/2000/svg"
9
- viewBox="0 0 24 24"
10
- fill="none"
11
- stroke="currentColor"
12
- strokeWidth="2"
13
- strokeLinecap="round"
14
- strokeLinejoin="round"
15
- {...props}
16
- >
17
- <path d="M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2" />
18
- <circle cx="12" cy="7" r="4" />
19
- </svg>
20
- );
21
- }
@@ -1,23 +0,0 @@
1
- // Generated by scripts/generate-icons.ts — do not edit.
2
- // Source: Lucide (https://lucide.dev) — ISC license, see packages/ui/NOTICE.
3
- import type { SVGProps } from 'react';
4
-
5
- export function WineIcon(props: SVGProps<SVGSVGElement>) {
6
- return (
7
- <svg
8
- xmlns="http://www.w3.org/2000/svg"
9
- viewBox="0 0 24 24"
10
- fill="none"
11
- stroke="currentColor"
12
- strokeWidth="2"
13
- strokeLinecap="round"
14
- strokeLinejoin="round"
15
- {...props}
16
- >
17
- <path d="M8 22h8" />
18
- <path d="M7 10h10" />
19
- <path d="M12 15v7" />
20
- <path d="M12 15a5 5 0 0 0 5-5c0-2-.5-4-2-8H9c-1.5 4-2 6-2 8a5 5 0 0 0 5 5Z" />
21
- </svg>
22
- );
23
- }
@@ -1,21 +0,0 @@
1
- // Generated by scripts/generate-icons.ts — do not edit.
2
- // Source: Lucide (https://lucide.dev) — ISC license, see packages/ui/NOTICE.
3
- import type { SVGProps } from 'react';
4
-
5
- export function XIcon(props: SVGProps<SVGSVGElement>) {
6
- return (
7
- <svg
8
- xmlns="http://www.w3.org/2000/svg"
9
- viewBox="0 0 24 24"
10
- fill="none"
11
- stroke="currentColor"
12
- strokeWidth="2"
13
- strokeLinecap="round"
14
- strokeLinejoin="round"
15
- {...props}
16
- >
17
- <path d="M18 6 6 18" />
18
- <path d="m6 6 12 12" />
19
- </svg>
20
- );
21
- }
@@ -1,63 +0,0 @@
1
- .trigger {
2
- display: flex;
3
- align-items: center;
4
- gap: var(--sv-space-2);
5
- padding: var(--sv-space-2);
6
- border: 1px solid var(--sv-color-border-strong);
7
- border-radius: var(--sv-radius-md);
8
- background: var(--sv-color-surface);
9
- color: var(--sv-color-text-primary);
10
- cursor: pointer;
11
- }
12
-
13
- .trigger:hover {
14
- background: var(--sv-color-surface-sunken);
15
- }
16
-
17
- .trigger:disabled {
18
- opacity: 0.5;
19
- cursor: not-allowed;
20
- }
21
-
22
- .placeholder {
23
- display: flex;
24
- align-items: center;
25
- justify-content: center;
26
- width: var(--sv-icon-size-md);
27
- height: var(--sv-icon-size-md);
28
- color: var(--sv-color-text-subtle);
29
- font-size: var(--sv-font-size-sm);
30
- }
31
-
32
- .triggerLabel {
33
- font-size: var(--sv-font-size-sm);
34
- color: var(--sv-color-text-primary);
35
- }
36
-
37
- .grid {
38
- display: grid;
39
- grid-template-columns: repeat(5, 1fr);
40
- gap: var(--sv-space-1);
41
- padding: var(--sv-space-2);
42
- }
43
-
44
- .option {
45
- display: flex;
46
- align-items: center;
47
- justify-content: center;
48
- width: var(--sv-touch-target-min);
49
- height: var(--sv-touch-target-min);
50
- border: none;
51
- border-radius: var(--sv-radius-sm);
52
- background: transparent;
53
- color: var(--sv-color-text-primary);
54
- cursor: pointer;
55
- }
56
-
57
- .option:hover {
58
- background: var(--sv-color-surface-sunken);
59
- }
60
-
61
- .optionSelected {
62
- background: var(--sv-color-accent-subtle);
63
- }
@@ -1,84 +0,0 @@
1
- import { useState } from 'react';
2
- import type { Meta, StoryObj } from '@storybook/react-vite';
3
- import { IconPicker } from './IconPicker';
4
- import type { IconName } from '../Icon/Icon';
5
-
6
- const meta = {
7
- title: 'Components/IconPicker',
8
- component: IconPicker,
9
- parameters: {
10
- layout: 'padded',
11
- docs: {
12
- description: {
13
- component:
14
- 'A trigger button showing the current icon that opens a Popover grid of selectable icons — for a curated, bounded icon set rather than the full design-system library.',
15
- },
16
- },
17
- },
18
- args: {
19
- value: null,
20
- onChange: () => {},
21
- options: [],
22
- 'aria-label': 'Icon',
23
- },
24
- } satisfies Meta<typeof IconPicker>;
25
-
26
- export default meta;
27
- type Story = StoryObj<typeof meta>;
28
-
29
- const GROCERY_ICONS: IconName[] = [
30
- 'banana',
31
- 'apple',
32
- 'carrot',
33
- 'egg',
34
- 'milk',
35
- 'beef',
36
- 'drumstick',
37
- 'fish',
38
- 'croissant',
39
- 'cookie',
40
- 'pizza',
41
- 'salad',
42
- 'coffee',
43
- 'wine',
44
- 'beer',
45
- 'cup-soda',
46
- 'candy',
47
- 'spray-can',
48
- 'snowflake',
49
- 'shopping-basket',
50
- ];
51
-
52
- function ControlledIconPicker({ initial = null }: { initial?: IconName | null }) {
53
- const [value, setValue] = useState<IconName | null>(initial);
54
- return (
55
- <IconPicker
56
- value={value}
57
- onChange={setValue}
58
- options={GROCERY_ICONS}
59
- aria-label="Item icon"
60
- triggerLabel={value ?? 'Choose icon'}
61
- />
62
- );
63
- }
64
-
65
- export const Default: Story = {
66
- render: () => <ControlledIconPicker />,
67
- };
68
-
69
- export const Preselected: Story = {
70
- render: () => <ControlledIconPicker initial="banana" />,
71
- };
72
-
73
- export const Disabled: Story = {
74
- render: () => (
75
- <IconPicker
76
- value="milk"
77
- onChange={() => {}}
78
- options={GROCERY_ICONS}
79
- aria-label="Item icon"
80
- triggerLabel="Milk"
81
- disabled
82
- />
83
- ),
84
- };
@@ -1,90 +0,0 @@
1
- 'use client';
2
-
3
- import { useState } from 'react';
4
- import { Icon, type IconName } from '../Icon/Icon';
5
- import { Popover } from '../Popover/Popover';
6
- import styles from './IconPicker.module.css';
7
-
8
- export interface IconPickerProps {
9
- value: IconName | null;
10
- onChange: (icon: IconName) => void;
11
- /** Icons offered in the grid, in display order. */
12
- options: readonly IconName[];
13
- 'aria-label': string;
14
- /** Shown next to the trigger's icon preview, e.g. the item's name. */
15
- triggerLabel?: string;
16
- disabled?: boolean;
17
- className?: string;
18
- }
19
-
20
- /**
21
- * IconPicker — a trigger button showing the current icon that opens a
22
- * `Popover` grid of selectable icons. Built for cases with a curated,
23
- * bounded icon set (e.g. Sovereign Shopper's grocery category icons,
24
- * SHP-05) rather than the full design-system icon library.
25
- *
26
- * Selecting an icon both closes the picker and calls `onChange` — a
27
- * consumer's `onChange` never needs to close the picker itself.
28
- */
29
- export function IconPicker({
30
- value,
31
- onChange,
32
- options,
33
- 'aria-label': ariaLabel,
34
- triggerLabel,
35
- disabled = false,
36
- className,
37
- }: IconPickerProps) {
38
- const [open, setOpen] = useState(false);
39
-
40
- const trigger = (
41
- <button
42
- type="button"
43
- className={[styles.trigger, className].filter(Boolean).join(' ')}
44
- onClick={() => setOpen((o) => !o)}
45
- disabled={disabled}
46
- aria-label={ariaLabel}
47
- aria-haspopup="true"
48
- aria-expanded={open}
49
- >
50
- {value ? (
51
- <Icon name={value} size="md" aria-hidden />
52
- ) : (
53
- <span className={styles.placeholder} aria-hidden>
54
- ?
55
- </span>
56
- )}
57
- {triggerLabel && <span className={styles.triggerLabel}>{triggerLabel}</span>}
58
- </button>
59
- );
60
-
61
- return (
62
- <Popover
63
- trigger={trigger}
64
- open={open}
65
- onClose={() => setOpen(false)}
66
- width={240}
67
- aria-label={`${ariaLabel} options`}
68
- >
69
- <div className={styles.grid} role="listbox" aria-label={ariaLabel}>
70
- {options.map((name) => (
71
- <button
72
- key={name}
73
- type="button"
74
- role="option"
75
- aria-selected={name === value}
76
- className={[styles.option, name === value ? styles.optionSelected : '']
77
- .filter(Boolean)
78
- .join(' ')}
79
- onClick={() => {
80
- onChange(name);
81
- setOpen(false);
82
- }}
83
- >
84
- <Icon name={name} size="md" aria-hidden />
85
- </button>
86
- ))}
87
- </div>
88
- </Popover>
89
- );
90
- }
@@ -1,52 +0,0 @@
1
- .input {
2
- display: block;
3
- width: 100%;
4
- /* 36px rendered height. Explicit height + border-box (rather than
5
- deriving height from padding and line-height) gives an exact,
6
- browser-independent target instead of an approximation. */
7
- height: 36px;
8
- box-sizing: border-box;
9
- padding: 4px var(--sv-space-3);
10
- font-family: var(--sv-font-family);
11
- font-size: var(--sv-font-size-sm);
12
- line-height: 1.5;
13
- color: var(--sv-color-text-primary);
14
- background-color: var(--sv-color-surface);
15
- border: 1px solid var(--sv-color-border-strong);
16
- border-radius: var(--sv-radius-md);
17
- transition:
18
- border-color 0.15s ease,
19
- box-shadow 0.15s ease;
20
- }
21
-
22
- /* iOS Safari (tab and standalone PWA) auto-zooms the page whenever a focused
23
- input's font-size is below 16px. The viewport intentionally allows pinch-zoom
24
- (no maximum-scale — an accessibility requirement), so the only way to stop the
25
- focus-zoom is to render the field at >=16px on touch devices. */
26
- @media (pointer: coarse) {
27
- .input {
28
- font-size: var(--sv-font-size-md);
29
- }
30
- }
31
-
32
- .input::placeholder {
33
- color: var(--sv-color-text-muted);
34
- }
35
-
36
- .input:focus-visible {
37
- outline: none;
38
- border-color: var(--sv-color-accent);
39
- box-shadow: 0 0 0 2px var(--sv-color-focus-ring);
40
- }
41
-
42
- .input:read-only {
43
- background-color: var(--sv-color-surface-sunken);
44
- color: var(--sv-color-text-muted);
45
- border-color: var(--sv-color-border);
46
- cursor: default;
47
- }
48
-
49
- .input:disabled {
50
- opacity: 0.5;
51
- cursor: not-allowed;
52
- }
@@ -1,86 +0,0 @@
1
- import type { Meta, StoryObj } from '@storybook/react-vite';
2
- import { Input } from './Input';
3
-
4
- // Wrap in a label so a11y checks pass (Input is a bare <input> — no built-in
5
- // label association).
6
- function Labeled({ label, ...props }: React.ComponentProps<typeof Input> & { label: string }) {
7
- return (
8
- <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>
9
- <label
10
- htmlFor="sb-input"
11
- style={{ fontSize: 14, color: 'var(--sv-color-text-primary)', fontFamily: 'system-ui' }}
12
- >
13
- {label}
14
- </label>
15
- <Input id="sb-input" {...props} />
16
- </div>
17
- );
18
- }
19
-
20
- const meta = {
21
- title: 'Components/Input',
22
- component: Input,
23
- parameters: {
24
- layout: 'centered',
25
- docs: {
26
- description: {
27
- component:
28
- 'The primitive text field. RSC-safe; forwards all native `<input>` props. No label is built-in — always pair with a `<label>` for accessibility.',
29
- },
30
- },
31
- },
32
- } satisfies Meta<typeof Input>;
33
-
34
- export default meta;
35
- type Story = StoryObj<typeof meta>;
36
-
37
- // ---------------------------------------------------------------------------
38
-
39
- export const Text: Story = {
40
- render: (_args) => <Labeled label="Display name" type="text" placeholder="e.g. Jane Smith" />,
41
- };
42
-
43
- export const Email: Story = {
44
- render: (_args) => <Labeled label="Email address" type="email" placeholder="you@example.com" />,
45
- };
46
-
47
- export const Password: Story = {
48
- render: (_args) => <Labeled label="Password" type="password" placeholder="••••••••" />,
49
- };
50
-
51
- export const Disabled: Story = {
52
- render: (_args) => (
53
- <Labeled label="Read-only field" type="text" defaultValue="Cannot be changed" disabled />
54
- ),
55
- };
56
-
57
- /** Mimics an error state — the container adds red border via CSS token. */
58
- export const ErrorState: Story = {
59
- render: (_args) => (
60
- <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>
61
- <label
62
- htmlFor="sb-input-err"
63
- style={{ fontSize: 14, color: 'var(--sv-color-text-primary)', fontFamily: 'system-ui' }}
64
- >
65
- Email address
66
- </label>
67
- <Input
68
- id="sb-input-err"
69
- type="email"
70
- defaultValue="not-an-email"
71
- aria-invalid="true"
72
- aria-describedby="sb-input-err-msg"
73
- style={{
74
- borderColor: 'var(--sv-color-error-border)',
75
- outline: 'none',
76
- }}
77
- />
78
- <span
79
- id="sb-input-err-msg"
80
- style={{ fontSize: 12, color: 'var(--sv-color-error-text)', fontFamily: 'system-ui' }}
81
- >
82
- Enter a valid email address.
83
- </span>
84
- </div>
85
- ),
86
- };
@@ -1,14 +0,0 @@
1
- import type { InputHTMLAttributes } from 'react';
2
- import styles from './Input.module.css';
3
-
4
- export type InputProps = InputHTMLAttributes<HTMLInputElement>;
5
-
6
- /**
7
- * Input — the primitive text field. Presentational and RSC-safe: it forwards
8
- * all native input props to the underlying `<input>`. Styling references
9
- * `--sv-*` tokens via CSS Modules; there are no hardcoded values.
10
- */
11
- export function Input({ type = 'text', className, ...rest }: InputProps) {
12
- const classes = [styles.input, className].filter(Boolean).join(' ');
13
- return <input type={type} className={classes} {...rest} />;
14
- }
@@ -1,22 +0,0 @@
1
- // @vitest-environment jsdom
2
- import { describe, expect, it } from 'vitest';
3
- import { render, screen } from '@testing-library/react';
4
- import { Input } from '../Input';
5
-
6
- describe('Input', () => {
7
- it('renders and forwards native props', () => {
8
- render(<Input placeholder="Email" defaultValue="a@b.c" />);
9
- const input = screen.getByPlaceholderText('Email') as HTMLInputElement;
10
- expect(input.value).toBe('a@b.c');
11
- });
12
-
13
- it('defaults to type="text"', () => {
14
- render(<Input aria-label="field" />);
15
- expect((screen.getByLabelText('field') as HTMLInputElement).type).toBe('text');
16
- });
17
-
18
- it('honours an explicit type', () => {
19
- render(<Input aria-label="pw" type="password" />);
20
- expect((screen.getByLabelText('pw') as HTMLInputElement).type).toBe('password');
21
- });
22
- });