@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,89 +0,0 @@
1
- 'use client';
2
-
3
- import type { KeyboardEvent, ReactNode } from 'react';
4
- import styles from './CheckableListRow.module.css';
5
-
6
- export interface CheckableListRowProps {
7
- checked: boolean;
8
- onCheckedChange: (checked: boolean) => void;
9
- label: string;
10
- /** Leading icon, e.g. a per-item `<Icon>`. */
11
- icon?: ReactNode;
12
- /** Trailing content, e.g. a quantity, a `QuantityStepper`, or a badge. */
13
- trailing?: ReactNode;
14
- disabled?: boolean;
15
- className?: string;
16
- }
17
-
18
- /**
19
- * CheckableListRow — a whole-row tap target that toggles a checked state,
20
- * with strike-through on the label when checked. Built for "tap the row to
21
- * mark it done" lists (Sovereign Shopper's tap-to-buy, SHP-07) where the
22
- * checkbox itself is too small a target on mobile and the row already has
23
- * nothing else competing for the tap.
24
- *
25
- * Renders as `role="checkbox"` on the row itself rather than composing
26
- * `Checkbox`'s native `<input>` — nesting a real checkbox input inside the
27
- * row's own click handler would mean two overlapping interactive elements
28
- * (invalid HTML, and the input's own click would double-fire the row's
29
- * toggle). The visual box matches `Checkbox`'s styling for consistency.
30
- *
31
- * `trailing` content (e.g. a `QuantityStepper`) is rendered outside the
32
- * `role="checkbox"` element so its own interactive controls (+/- buttons)
33
- * don't sit inside another interactive element either — clicking those
34
- * doesn't toggle the row.
35
- */
36
- export function CheckableListRow({
37
- checked,
38
- onCheckedChange,
39
- label,
40
- icon,
41
- trailing,
42
- disabled = false,
43
- className,
44
- }: CheckableListRowProps) {
45
- function toggle() {
46
- if (!disabled) onCheckedChange(!checked);
47
- }
48
-
49
- function handleKeyDown(e: KeyboardEvent<HTMLDivElement>) {
50
- if (e.key === ' ' || e.key === 'Enter') {
51
- e.preventDefault();
52
- toggle();
53
- }
54
- }
55
-
56
- return (
57
- <div className={[styles.row, className].filter(Boolean).join(' ')}>
58
- <div
59
- role="checkbox"
60
- aria-checked={checked}
61
- aria-label={label}
62
- aria-disabled={disabled || undefined}
63
- tabIndex={disabled ? -1 : 0}
64
- className={styles.tapTarget}
65
- onClick={toggle}
66
- onKeyDown={handleKeyDown}
67
- >
68
- <span className={[styles.box, checked ? styles.checked : ''].filter(Boolean).join(' ')}>
69
- {checked && (
70
- <svg className={styles.tick} viewBox="0 0 10 8" fill="none" aria-hidden="true">
71
- <path
72
- d="M1 4l3 3 5-6"
73
- stroke="currentColor"
74
- strokeWidth="1.5"
75
- strokeLinecap="round"
76
- strokeLinejoin="round"
77
- />
78
- </svg>
79
- )}
80
- </span>
81
- {icon && <span className={styles.icon}>{icon}</span>}
82
- <span className={[styles.label, checked ? styles.struck : ''].filter(Boolean).join(' ')}>
83
- {label}
84
- </span>
85
- </div>
86
- {trailing && <span className={styles.trailing}>{trailing}</span>}
87
- </div>
88
- );
89
- }
@@ -1,111 +0,0 @@
1
- .root {
2
- display: inline-flex;
3
- align-items: center;
4
- gap: var(--sv-space-2);
5
- cursor: pointer;
6
- }
7
-
8
- /* The visual box. Sizing audit: reviewed against the rest of this scale's
9
- compact controls. Kept the 18px box unchanged — deliberately on the
10
- larger side for touch-friendliness, not a gap to close. */
11
- .box {
12
- --checkbox-box-size: 18px;
13
- position: relative;
14
- flex-shrink: 0;
15
- width: var(--checkbox-box-size);
16
- height: var(--checkbox-box-size);
17
- border-radius: var(--sv-radius-sm);
18
- border: 1.5px solid var(--sv-color-border-strong);
19
- background: var(--sv-color-surface);
20
- transition:
21
- background-color 0.15s ease,
22
- border-color 0.15s ease;
23
- display: flex;
24
- align-items: center;
25
- justify-content: center;
26
- }
27
-
28
- .checked {
29
- background-color: var(--sv-color-accent);
30
- border-color: var(--sv-color-accent);
31
- color: var(--sv-white);
32
- }
33
-
34
- /* Hide the native input visually but keep it accessible */
35
- .input {
36
- position: absolute;
37
- inset: 0;
38
- opacity: 0;
39
- margin: 0;
40
- width: 100%;
41
- height: 100%;
42
- cursor: pointer;
43
- }
44
-
45
- .input:disabled {
46
- cursor: not-allowed;
47
- }
48
-
49
- /* Expand the tappable region to the platform's minimum touch target without
50
- growing the visible box — consumers (e.g. task rows) align the box to the
51
- pixel against header icons, so its visual footprint and layout must stay
52
- identical. Gated to (pointer: coarse), the *primary* pointer, so a
53
- touchscreen laptop with mouse/trackpad as primary keeps desktop density. */
54
- @media (pointer: coarse) {
55
- .input {
56
- inset: calc((var(--checkbox-box-size) - var(--sv-touch-target-min, 44px)) / 2);
57
- }
58
- }
59
-
60
- .input:focus-visible + .tick,
61
- .input:focus-visible {
62
- outline: none;
63
- }
64
-
65
- .box:has(.input:focus-visible) {
66
- outline: 2px solid var(--sv-color-focus-ring);
67
- outline-offset: 2px;
68
- }
69
-
70
- .tick {
71
- width: 10px;
72
- height: 8px;
73
- pointer-events: none;
74
- }
75
-
76
- /* Label */
77
- .label {
78
- font-size: var(--sv-font-size-sm);
79
- color: var(--sv-color-text-primary);
80
- cursor: pointer;
81
- user-select: none;
82
- transition: color 0.15s ease;
83
- /* Strike-through animates via clip-path on a pseudo-element */
84
- position: relative;
85
- }
86
-
87
- .label::after {
88
- content: '';
89
- position: absolute;
90
- left: 0;
91
- top: 50%;
92
- width: 100%;
93
- height: 1.5px;
94
- background: var(--sv-color-text-muted);
95
- transform: scaleX(0);
96
- transform-origin: left center;
97
- transition: transform 0.2s ease;
98
- }
99
-
100
- .struck {
101
- color: var(--sv-color-text-muted);
102
- }
103
-
104
- .struck::after {
105
- transform: scaleX(1);
106
- }
107
-
108
- .disabled {
109
- opacity: 0.5;
110
- cursor: not-allowed;
111
- }
@@ -1,78 +0,0 @@
1
- 'use client';
2
-
3
- import type { InputHTMLAttributes } from 'react';
4
- import styles from './Checkbox.module.css';
5
-
6
- export interface CheckboxProps extends Omit<
7
- InputHTMLAttributes<HTMLInputElement>,
8
- 'type' | 'onChange'
9
- > {
10
- checked: boolean;
11
- onChange: (checked: boolean) => void;
12
- label: string;
13
- /** Renders the label with a strike-through when checked. */
14
- strikeThrough?: boolean;
15
- disabled?: boolean;
16
- }
17
-
18
- export function Checkbox({
19
- checked,
20
- onChange,
21
- label,
22
- strikeThrough = false,
23
- disabled,
24
- className,
25
- id,
26
- ...rest
27
- }: CheckboxProps) {
28
- const inputId = id ?? `checkbox-${label.toLowerCase().replace(/\s+/g, '-')}`;
29
-
30
- return (
31
- <span className={[styles.root, className].filter(Boolean).join(' ')}>
32
- <span className={[styles.box, checked ? styles.checked : ''].filter(Boolean).join(' ')}>
33
- <input
34
- {...rest}
35
- id={inputId}
36
- type="checkbox"
37
- checked={checked}
38
- disabled={disabled}
39
- className={styles.input}
40
- onChange={(e) => onChange(e.target.checked)}
41
- />
42
- {checked && (
43
- <svg className={styles.tick} viewBox="0 0 10 8" fill="none" aria-hidden="true">
44
- <path
45
- d="M1 4l3 3 5-6"
46
- stroke="currentColor"
47
- strokeWidth="1.5"
48
- strokeLinecap="round"
49
- strokeLinejoin="round"
50
- />
51
- </svg>
52
- )}
53
- </span>
54
- {/* Callers pass label="" for icon-only/screen-reader-only usage (an
55
- aria-label on the Checkbox's own root covers accessibility in that
56
- case) — omitting the element entirely, rather than rendering an
57
- empty <label>, matters because .root's flex `gap` still applies
58
- between .box and a rendered-but-empty label, silently adding an
59
- extra --sv-space-2 of invisible space after the checkbox that
60
- every icon-only consumer was unknowingly stacking on top of their
61
- own layout's spacing. */}
62
- {label && (
63
- <label
64
- htmlFor={inputId}
65
- className={[
66
- styles.label,
67
- strikeThrough && checked ? styles.struck : '',
68
- disabled ? styles.disabled : '',
69
- ]
70
- .filter(Boolean)
71
- .join(' ')}
72
- >
73
- {label}
74
- </label>
75
- )}
76
- </span>
77
- );
78
- }
@@ -1,53 +0,0 @@
1
- .textarea {
2
- display: block;
3
- width: 100%;
4
- min-height: 180px;
5
- max-height: min(70vh, 720px);
6
- padding: var(--sv-space-3);
7
- font-family: var(--sv-font-family-mono);
8
- font-size: var(--sv-font-size-sm);
9
- line-height: 1.6;
10
- color: var(--sv-color-text-primary);
11
- tab-size: 2;
12
- white-space: pre;
13
- overflow: auto;
14
- resize: vertical;
15
- background: var(--sv-color-surface);
16
- border: 1px solid var(--sv-color-border-strong);
17
- border-radius: var(--sv-radius-md);
18
- transition:
19
- border-color 0.15s ease,
20
- box-shadow 0.15s ease;
21
- }
22
-
23
- .textarea::placeholder {
24
- color: var(--sv-color-text-muted);
25
- }
26
-
27
- .textarea:focus-visible {
28
- outline: none;
29
- border-color: var(--sv-color-accent);
30
- box-shadow: 0 0 0 2px var(--sv-color-focus-ring);
31
- }
32
-
33
- .textarea:read-only {
34
- color: var(--sv-color-text-muted);
35
- background: var(--sv-color-surface-sunken);
36
- border-color: var(--sv-color-border);
37
- cursor: default;
38
- }
39
-
40
- .textarea:disabled {
41
- opacity: 0.5;
42
- cursor: not-allowed;
43
- resize: none;
44
- }
45
-
46
- .invalid {
47
- border-color: var(--sv-color-error-border);
48
- }
49
-
50
- .invalid:focus-visible {
51
- border-color: var(--sv-color-error-border);
52
- box-shadow: 0 0 0 2px var(--sv-color-error-border);
53
- }
@@ -1,77 +0,0 @@
1
- import type { Meta, StoryObj } from '@storybook/react-vite';
2
- import { CodeTextarea } from './CodeTextarea';
3
- import { FormField } from '../FormField/FormField';
4
-
5
- const sampleMarkdown = `---
6
- title: Editorial calendar
7
- tags:
8
- - planning
9
- - launch
10
- ---
11
-
12
- # Launch notes
13
-
14
- Draft the announcement and verify links before publishing.`;
15
-
16
- const meta = {
17
- title: 'Components/CodeTextarea',
18
- component: CodeTextarea,
19
- parameters: {
20
- layout: 'padded',
21
- docs: {
22
- description: {
23
- component:
24
- 'Monospace textarea for Markdown, YAML, JSON, and other whitespace-sensitive content.',
25
- },
26
- },
27
- },
28
- args: {
29
- defaultValue: sampleMarkdown,
30
- 'aria-label': 'Markdown source',
31
- },
32
- } satisfies Meta<typeof CodeTextarea>;
33
-
34
- export default meta;
35
- type Story = StoryObj<typeof meta>;
36
-
37
- export const Default: Story = {};
38
-
39
- export const WithFormField: Story = {
40
- render: () => (
41
- <FormField label="Frontmatter" hint="YAML is saved exactly as typed." id="frontmatter-source">
42
- {(field) => <CodeTextarea {...field} defaultValue={sampleMarkdown} />}
43
- </FormField>
44
- ),
45
- };
46
-
47
- export const Error: Story = {
48
- render: () => (
49
- <FormField label="Raw YAML" error="Line 3: expected a value." id="yaml-source">
50
- {(field) => <CodeTextarea {...field} invalid defaultValue={'title:\ntags:\n -'} />}
51
- </FormField>
52
- ),
53
- };
54
-
55
- export const Disabled: Story = {
56
- args: {
57
- disabled: true,
58
- defaultValue: sampleMarkdown,
59
- },
60
- };
61
-
62
- export const LongContent: Story = {
63
- args: {
64
- defaultValue: Array.from({ length: 24 }, (_, index) => `- item-${index + 1}: pending`).join(
65
- '\n',
66
- ),
67
- },
68
- };
69
-
70
- export const Mobile: Story = {
71
- parameters: {
72
- viewport: { defaultViewport: 'mobile1' },
73
- },
74
- args: {
75
- defaultValue: sampleMarkdown,
76
- },
77
- };
@@ -1,36 +0,0 @@
1
- import type { TextareaHTMLAttributes } from 'react';
2
- import styles from './CodeTextarea.module.css';
3
-
4
- export interface CodeTextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {
5
- invalid?: boolean;
6
- }
7
-
8
- /**
9
- * CodeTextarea — monospace textarea for Markdown, YAML, JSON, and other
10
- * whitespace-sensitive content. Pair with FormField for labels, hints, and
11
- * validation text.
12
- */
13
- export function CodeTextarea({
14
- className,
15
- rows = 12,
16
- spellCheck = false,
17
- wrap = 'off',
18
- invalid = false,
19
- 'aria-invalid': ariaInvalid,
20
- ...rest
21
- }: CodeTextareaProps) {
22
- const classes = [styles.textarea, invalid ? styles.invalid : undefined, className]
23
- .filter(Boolean)
24
- .join(' ');
25
-
26
- return (
27
- <textarea
28
- rows={rows}
29
- spellCheck={spellCheck}
30
- wrap={wrap}
31
- className={classes}
32
- aria-invalid={ariaInvalid ?? (invalid || undefined)}
33
- {...rest}
34
- />
35
- );
36
- }
@@ -1,70 +0,0 @@
1
- .root {
2
- border-bottom: 1px solid var(--sv-color-border);
3
- }
4
-
5
- .trigger {
6
- display: flex;
7
- align-items: center;
8
- justify-content: space-between;
9
- gap: var(--sv-space-2);
10
- width: 100%;
11
- padding: var(--sv-space-3) 0;
12
- border: none;
13
- background: transparent;
14
- color: var(--sv-color-text-primary);
15
- font-family: var(--sv-font-family);
16
- font-size: var(--sv-font-size-sm);
17
- font-weight: var(--sv-font-weight-medium);
18
- text-align: left;
19
- cursor: pointer;
20
- }
21
-
22
- .trigger:focus-visible {
23
- outline: 2px solid var(--sv-color-focus-ring);
24
- outline-offset: 2px;
25
- border-radius: var(--sv-radius-sm);
26
- }
27
-
28
- .triggerLabel {
29
- min-width: 0;
30
- }
31
-
32
- .chevron {
33
- flex-shrink: 0;
34
- color: var(--sv-color-text-muted);
35
- transition: transform 0.2s ease;
36
- }
37
-
38
- .chevronOpen {
39
- transform: rotate(180deg);
40
- }
41
-
42
- /* Expand/collapse via grid-template-rows (0fr closed, 1fr open) instead of
43
- animating height, which can't transition to/from auto in CSS. The inner
44
- wrapper clips content during the transition. */
45
- .contentWrapper {
46
- display: grid;
47
- grid-template-rows: 0fr;
48
- transition: grid-template-rows 0.2s ease;
49
- }
50
-
51
- .contentWrapper[data-open='true'] {
52
- grid-template-rows: 1fr;
53
- }
54
-
55
- .contentInner {
56
- overflow: hidden;
57
- font-size: var(--sv-font-size-sm);
58
- color: var(--sv-color-text-primary);
59
- }
60
-
61
- .contentWrapper[data-open='true'] .contentInner {
62
- padding-bottom: var(--sv-space-3);
63
- }
64
-
65
- @media (prefers-reduced-motion: reduce) {
66
- .contentWrapper,
67
- .chevron {
68
- transition: none;
69
- }
70
- }
@@ -1,62 +0,0 @@
1
- import { useState } from 'react';
2
- import type { Meta, StoryObj } from '@storybook/react-vite';
3
- import { Collapsible } from './Collapsible';
4
-
5
- const meta = {
6
- title: 'Components/Collapsible',
7
- component: Collapsible,
8
- parameters: {
9
- layout: 'padded',
10
- docs: {
11
- description: {
12
- component:
13
- 'Single expand/collapse primitive. Independently useful (e.g. a "show more" toggle), and composed internally by Accordion.',
14
- },
15
- },
16
- },
17
- args: { open: false, onOpenChange: () => {}, trigger: 'Trigger', children: 'Content' },
18
- } satisfies Meta<typeof Collapsible>;
19
-
20
- export default meta;
21
- type Story = StoryObj<typeof meta>;
22
-
23
- // ---------------------------------------------------------------------------
24
-
25
- export const Default: Story = {
26
- render: () => {
27
- const [open, setOpen] = useState(false);
28
- return (
29
- <Collapsible open={open} onOpenChange={setOpen} trigger="What plugins are installed?">
30
- Sovereign ships with the platform plugins (Console, Launcher, Account) plus whatever you've
31
- declared in your own sovereign.plugins.json — nothing else is bundled by default.
32
- </Collapsible>
33
- );
34
- },
35
- };
36
-
37
- export const StartsOpen: Story = {
38
- render: () => {
39
- const [open, setOpen] = useState(true);
40
- return (
41
- <Collapsible open={open} onOpenChange={setOpen} trigger="Advanced settings">
42
- These settings are rarely needed — change them only if you know what you're doing.
43
- </Collapsible>
44
- );
45
- },
46
- };
47
-
48
- export const LongContent: Story = {
49
- render: () => {
50
- const [open, setOpen] = useState(true);
51
- return (
52
- <Collapsible open={open} onOpenChange={setOpen} trigger="Full changelog">
53
- <ul style={{ margin: 0, paddingLeft: 20 }}>
54
- <li>Added component sizing alignment across the design system</li>
55
- <li>Added RadioGroup, Slider, Progress, Table, Alert primitives</li>
56
- <li>Added Breadcrumb, Pagination, and Kbd primitives</li>
57
- <li>Added Accordion and Collapsible primitives</li>
58
- </ul>
59
- </Collapsible>
60
- );
61
- },
62
- };
@@ -1,66 +0,0 @@
1
- 'use client';
2
-
3
- import { useId } from 'react';
4
- import type { ReactNode } from 'react';
5
- import { Icon } from '../Icon/Icon';
6
- import styles from './Collapsible.module.css';
7
-
8
- export interface CollapsibleProps {
9
- open: boolean;
10
- onOpenChange: (open: boolean) => void;
11
- trigger: ReactNode;
12
- children: ReactNode;
13
- id?: string;
14
- className?: string;
15
- }
16
-
17
- /**
18
- * Collapsible — single expand/collapse primitive. Independently useful
19
- * (e.g. a "show more" toggle), and composed internally by `Accordion`.
20
- *
21
- * The expand/collapse animation uses `grid-template-rows: 0fr` → `1fr`
22
- * rather than animating `height`, which can't transition to/from `auto`
23
- * in CSS without JS-measuring pixel heights. Collapsed content stays in
24
- * the DOM (so no layout jump on re-open) but is marked `inert` — removed
25
- * from the tab order and the accessibility tree — so it isn't reachable
26
- * while hidden.
27
- */
28
- export function Collapsible({
29
- open,
30
- onOpenChange,
31
- trigger,
32
- children,
33
- id,
34
- className,
35
- }: CollapsibleProps) {
36
- const generatedId = useId();
37
- const contentId = `${id ?? generatedId}-content`;
38
-
39
- return (
40
- <div className={[styles.root, className].filter(Boolean).join(' ')}>
41
- <button
42
- type="button"
43
- className={styles.trigger}
44
- aria-expanded={open}
45
- aria-controls={contentId}
46
- onClick={() => onOpenChange(!open)}
47
- >
48
- <span className={styles.triggerLabel}>{trigger}</span>
49
- <Icon
50
- name="chevron-down"
51
- size="sm"
52
- aria-hidden
53
- className={[styles.chevron, open ? styles.chevronOpen : ''].filter(Boolean).join(' ')}
54
- />
55
- </button>
56
- <div
57
- id={contentId}
58
- className={styles.contentWrapper}
59
- data-open={open}
60
- inert={!open || undefined}
61
- >
62
- <div className={styles.contentInner}>{children}</div>
63
- </div>
64
- </div>
65
- );
66
- }