@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,62 +0,0 @@
1
- 'use client';
2
-
3
- import styles from './SwipableMobileCarouselDots.module.css';
4
-
5
- export interface SwipableMobileCarouselDotsProps {
6
- count: number;
7
- activeIndex: number;
8
- onJump: (index: number) => void;
9
- /** Per-dot accessible names, e.g. ["Lists", "Starred", "Groceries"]. Falls
10
- * back to "Slide N of count" for any index without one. */
11
- labels?: (string | undefined)[];
12
- /** Labels the whole group — required, no generic fallback (mirrors
13
- * SwipableMobileCarousel's own required aria-label). */
14
- 'aria-label': string;
15
- className?: string;
16
- }
17
-
18
- /**
19
- * SwipableMobileCarouselDots — a real, tappable, labeled slide indicator.
20
- * Standalone (not carousel-only): reusable anywhere a set of positions needs
21
- * a dot indicator (e.g. an image gallery, an onboarding stepper), and is also
22
- * SwipableMobileCarousel's default `renderIndicator`.
23
- *
24
- * Replaces the `aria-hidden`, non-interactive dots pattern both
25
- * sovereign-tasks and sovereign-shopper currently hand-roll — every dot here
26
- * is a real `role="tab"` button with its own accessible name, reachable by
27
- * keyboard. No roving tabIndex/arrow-key handling: `Tabs` (this library's
28
- * other `role="tablist"` component) has none either, so this stays
29
- * consistent with it rather than gold-plating past its sibling.
30
- */
31
- export function SwipableMobileCarouselDots({
32
- count,
33
- activeIndex,
34
- onJump,
35
- labels,
36
- 'aria-label': ariaLabel,
37
- className,
38
- }: SwipableMobileCarouselDotsProps) {
39
- return (
40
- <div
41
- role="tablist"
42
- aria-label={ariaLabel}
43
- className={[styles.dots, className].filter(Boolean).join(' ')}
44
- >
45
- {Array.from({ length: count }, (_, i) => {
46
- const active = i === activeIndex;
47
- const label = labels?.[i] ?? `Slide ${i + 1} of ${count}`;
48
- return (
49
- <button
50
- key={i}
51
- type="button"
52
- role="tab"
53
- aria-selected={active}
54
- aria-label={label}
55
- className={[styles.dot, active ? styles.dotActive : ''].filter(Boolean).join(' ')}
56
- onClick={() => onJump(i)}
57
- />
58
- );
59
- })}
60
- </div>
61
- );
62
- }
@@ -1,63 +0,0 @@
1
- // @vitest-environment jsdom
2
- import { afterEach, describe, expect, it, vi } from 'vitest';
3
- import { cleanup, fireEvent, render, screen } from '@testing-library/react';
4
- import { SwipableMobileCarouselDots } from '../SwipableMobileCarouselDots';
5
-
6
- afterEach(cleanup);
7
-
8
- describe('SwipableMobileCarouselDots', () => {
9
- it('renders a tablist with one tab per count, none aria-hidden', () => {
10
- render(
11
- <SwipableMobileCarouselDots count={3} activeIndex={0} onJump={() => {}} aria-label="Lists" />,
12
- );
13
- const list = screen.getByRole('tablist', { name: 'Lists' });
14
- expect(list.getAttribute('aria-hidden')).toBeNull();
15
- const tabs = screen.getAllByRole('tab');
16
- expect(tabs).toHaveLength(3);
17
- tabs.forEach((tab) => expect(tab.getAttribute('aria-hidden')).toBeNull());
18
- });
19
-
20
- it('marks only the active dot as aria-selected', () => {
21
- render(
22
- <SwipableMobileCarouselDots count={3} activeIndex={1} onJump={() => {}} aria-label="Lists" />,
23
- );
24
- const tabs = screen.getAllByRole('tab');
25
- expect(tabs[0]?.getAttribute('aria-selected')).toBe('false');
26
- expect(tabs[1]?.getAttribute('aria-selected')).toBe('true');
27
- expect(tabs[2]?.getAttribute('aria-selected')).toBe('false');
28
- });
29
-
30
- it('uses the provided per-dot labels, falling back to "Slide N of count"', () => {
31
- render(
32
- <SwipableMobileCarouselDots
33
- count={3}
34
- activeIndex={0}
35
- onJump={() => {}}
36
- labels={['Lists', undefined, 'Groceries']}
37
- aria-label="Lists"
38
- />,
39
- );
40
- expect(screen.getByRole('tab', { name: 'Lists' })).toBeDefined();
41
- expect(screen.getByRole('tab', { name: 'Slide 2 of 3' })).toBeDefined();
42
- expect(screen.getByRole('tab', { name: 'Groceries' })).toBeDefined();
43
- });
44
-
45
- it('clicking a dot calls onJump with its index', () => {
46
- const onJump = vi.fn();
47
- render(
48
- <SwipableMobileCarouselDots count={3} activeIndex={0} onJump={onJump} aria-label="Lists" />,
49
- );
50
- const thirdTab = screen.getAllByRole('tab')[2];
51
- if (!thirdTab) throw new Error('expected a 3rd tab');
52
- fireEvent.click(thirdTab);
53
- expect(onJump).toHaveBeenCalledWith(2);
54
- });
55
-
56
- it('every dot is a real, focusable button (not a decorative element)', () => {
57
- render(
58
- <SwipableMobileCarouselDots count={2} activeIndex={0} onJump={() => {}} aria-label="Lists" />,
59
- );
60
- const tabs = screen.getAllByRole('tab');
61
- tabs.forEach((tab) => expect(tab.tagName).toBe('BUTTON'));
62
- });
63
- });
@@ -1,69 +0,0 @@
1
- .banner {
2
- position: sticky;
3
- top: 0;
4
- /* Sits above sidebar rail (z-index ~10) but below dialogs/overlays (z-index 100) */
5
- z-index: 50;
6
- display: flex;
7
- align-items: center;
8
- justify-content: center;
9
- gap: var(--sv-space-3);
10
- padding: var(--sv-space-2) var(--sv-space-4);
11
- border-bottom-width: 1px;
12
- border-bottom-style: solid;
13
- font-family: var(--sv-font-family);
14
- font-size: var(--sv-font-size-sm);
15
- line-height: 1.4;
16
- }
17
-
18
- .content {
19
- flex: 1;
20
- text-align: center;
21
- }
22
-
23
- /* Dismiss button — inherits the variant text colour */
24
- .dismiss {
25
- display: inline-flex;
26
- align-items: center;
27
- justify-content: center;
28
- flex-shrink: 0;
29
- width: 24px;
30
- height: 24px;
31
- padding: 0;
32
- border: none;
33
- border-radius: var(--sv-radius-sm);
34
- background: transparent;
35
- color: inherit;
36
- cursor: pointer;
37
- opacity: 0.7;
38
- transition: opacity 0.12s ease;
39
- }
40
-
41
- @media (hover: hover) {
42
- .dismiss:hover {
43
- opacity: 1;
44
- }
45
- }
46
-
47
- .dismiss:focus-visible {
48
- outline: 2px solid currentColor;
49
- outline-offset: 1px;
50
- }
51
-
52
- /* Variants */
53
- .info {
54
- background: var(--sv-color-info-surface);
55
- color: var(--sv-color-info-text);
56
- border-bottom-color: var(--sv-color-info-border);
57
- }
58
-
59
- .warning {
60
- background: var(--sv-color-warning-surface);
61
- color: var(--sv-color-warning-text);
62
- border-bottom-color: var(--sv-color-warning-border);
63
- }
64
-
65
- .error {
66
- background: var(--sv-color-error-surface);
67
- color: var(--sv-color-error-text);
68
- border-bottom-color: var(--sv-color-error-border);
69
- }
@@ -1,86 +0,0 @@
1
- import { useState } from 'react';
2
- import type { Meta, StoryObj } from '@storybook/react-vite';
3
- import { SystemBanner } from './SystemBanner';
4
-
5
- const meta = {
6
- title: 'Components/SystemBanner',
7
- component: SystemBanner,
8
- parameters: {
9
- layout: 'fullscreen',
10
- docs: {
11
- description: {
12
- component:
13
- 'Full-width `position: sticky` strip for platform-level notices. Stack multiple banners by rendering multiple `<SystemBanner>` elements. Dismiss button only appears when `onDismiss` is provided.',
14
- },
15
- },
16
- },
17
- argTypes: {
18
- variant: { control: 'select', options: ['info', 'warning', 'error'] },
19
- },
20
- args: {
21
- children: 'Notice',
22
- },
23
- } satisfies Meta<typeof SystemBanner>;
24
-
25
- export default meta;
26
- type Story = StoryObj<typeof meta>;
27
-
28
- // ---------------------------------------------------------------------------
29
-
30
- export const Info: Story = {
31
- args: {
32
- variant: 'info',
33
- children: 'Platform is in read-only mode during migration.',
34
- },
35
- };
36
-
37
- export const Warning: Story = {
38
- args: {
39
- variant: 'warning',
40
- children: 'License for Example: Monetized expires in 7 days.',
41
- },
42
- };
43
-
44
- export const Error: Story = {
45
- args: {
46
- variant: 'error',
47
- children: 'Maintenance mode is active — only admins can sign in.',
48
- },
49
- };
50
-
51
- export const Dismissible: Story = {
52
- render: (_args) => {
53
- const [visible, setVisible] = useState(true);
54
- return visible ? (
55
- <SystemBanner variant="warning" onDismiss={() => setVisible(false)}>
56
- License for Example: Monetized expires in 7 days.
57
- </SystemBanner>
58
- ) : (
59
- <div
60
- style={{
61
- padding: 16,
62
- fontFamily: 'var(--sv-font-family)',
63
- fontSize: 'var(--sv-font-size-sm)',
64
- color: 'var(--sv-color-text-muted)',
65
- }}
66
- >
67
- Banner dismissed.
68
- </div>
69
- );
70
- },
71
- };
72
-
73
- /** All three variants stacked — as they appear when multiple notices are active. */
74
- export const Stacked: Story = {
75
- render: (_args) => (
76
- <div>
77
- <SystemBanner variant="error">
78
- Maintenance mode is active — only admins can sign in.
79
- </SystemBanner>
80
- <SystemBanner variant="warning">
81
- License for Example: Monetized expires in 7 days.
82
- </SystemBanner>
83
- <SystemBanner variant="info">Platform is in read-only mode during migration.</SystemBanner>
84
- </div>
85
- ),
86
- };
@@ -1,50 +0,0 @@
1
- import type { ReactNode } from 'react';
2
- import styles from './SystemBanner.module.css';
3
-
4
- export type BannerVariant = 'info' | 'warning' | 'error';
5
-
6
- export interface SystemBannerProps {
7
- variant?: BannerVariant;
8
- /** Called when the user clicks ×. If omitted, no dismiss button is shown. */
9
- onDismiss?: () => void;
10
- children: ReactNode;
11
- }
12
-
13
- /**
14
- * SystemBanner — full-width sticky strip that shifts page content down.
15
- *
16
- * Used for platform-level notices: maintenance mode, license warnings, broadcast
17
- * messages. Stack multiple banners by rendering multiple `<SystemBanner>` elements.
18
- * The dismiss button is only rendered when `onDismiss` is provided.
19
- */
20
- export function SystemBanner({ variant = 'info', onDismiss, children }: SystemBannerProps) {
21
- return (
22
- <div role="status" aria-live="polite" className={[styles.banner, styles[variant]].join(' ')}>
23
- <span className={styles.content}>{children}</span>
24
- {onDismiss && (
25
- <button
26
- type="button"
27
- className={styles.dismiss}
28
- onClick={onDismiss}
29
- aria-label="Dismiss banner"
30
- >
31
- <svg
32
- width="14"
33
- height="14"
34
- viewBox="0 0 14 14"
35
- fill="none"
36
- xmlns="http://www.w3.org/2000/svg"
37
- aria-hidden
38
- >
39
- <path
40
- d="M1 1L13 13M13 1L1 13"
41
- stroke="currentColor"
42
- strokeWidth="1.5"
43
- strokeLinecap="round"
44
- />
45
- </svg>
46
- </button>
47
- )}
48
- </div>
49
- );
50
- }
@@ -1,50 +0,0 @@
1
- // @vitest-environment jsdom
2
- import { afterEach, describe, expect, it, vi } from 'vitest';
3
- import { cleanup, render, screen, fireEvent } from '@testing-library/react';
4
- import { SystemBanner } from '../SystemBanner';
5
-
6
- afterEach(cleanup);
7
-
8
- describe('SystemBanner', () => {
9
- it('renders children as content', () => {
10
- render(<SystemBanner>Maintenance mode is active.</SystemBanner>);
11
- expect(screen.getByText('Maintenance mode is active.')).toBeDefined();
12
- });
13
-
14
- it('defaults to the info variant', () => {
15
- const { container } = render(<SystemBanner>Notice</SystemBanner>);
16
- expect((container.firstChild as HTMLElement).className).toContain('info');
17
- });
18
-
19
- it('applies the warning variant class', () => {
20
- const { container } = render(<SystemBanner variant="warning">Warning</SystemBanner>);
21
- expect((container.firstChild as HTMLElement).className).toContain('warning');
22
- });
23
-
24
- it('applies the error variant class', () => {
25
- const { container } = render(<SystemBanner variant="error">Error</SystemBanner>);
26
- expect((container.firstChild as HTMLElement).className).toContain('error');
27
- });
28
-
29
- it('does not render a dismiss button when onDismiss is omitted', () => {
30
- render(<SystemBanner>Notice</SystemBanner>);
31
- expect(screen.queryByRole('button', { name: 'Dismiss banner' })).toBeNull();
32
- });
33
-
34
- it('renders a dismiss button when onDismiss is provided', () => {
35
- render(<SystemBanner onDismiss={() => {}}>Notice</SystemBanner>);
36
- expect(screen.getByRole('button', { name: 'Dismiss banner' })).toBeDefined();
37
- });
38
-
39
- it('calls onDismiss when the dismiss button is clicked', () => {
40
- const onDismiss = vi.fn();
41
- render(<SystemBanner onDismiss={onDismiss}>Notice</SystemBanner>);
42
- fireEvent.click(screen.getByRole('button', { name: 'Dismiss banner' }));
43
- expect(onDismiss).toHaveBeenCalledOnce();
44
- });
45
-
46
- it('exposes a status live region', () => {
47
- render(<SystemBanner>Notice</SystemBanner>);
48
- expect(screen.getByRole('status')).toBeDefined();
49
- });
50
- });
@@ -1,45 +0,0 @@
1
- /* Horizontal scroll container — masked-edge fade + hidden scrollbar, same
2
- technique as NavTabs. Always active (not gated to a narrow viewport):
3
- unlike NavTabs' item count, a table's column count is content-driven and
4
- can overflow at any screen size. */
5
- .scrollContainer {
6
- overflow-x: auto;
7
- scrollbar-width: none;
8
- -webkit-overflow-scrolling: touch;
9
- mask-image: linear-gradient(to right, black calc(100% - 32px), transparent 100%);
10
- }
11
-
12
- .scrollContainer::-webkit-scrollbar {
13
- display: none;
14
- }
15
-
16
- .table {
17
- width: 100%;
18
- border-collapse: collapse;
19
- font-size: var(--sv-font-size-sm);
20
- }
21
-
22
- .head .row {
23
- border-bottom: 1px solid var(--sv-color-border-strong);
24
- }
25
-
26
- .body .row {
27
- border-bottom: 1px solid var(--sv-color-border);
28
- }
29
-
30
- .body .row:last-child {
31
- border-bottom: none;
32
- }
33
-
34
- .th {
35
- padding: var(--sv-space-2) var(--sv-space-3);
36
- text-align: left;
37
- font-weight: var(--sv-font-weight-semibold);
38
- color: var(--sv-color-text-muted);
39
- white-space: nowrap;
40
- }
41
-
42
- .td {
43
- padding: var(--sv-space-2) var(--sv-space-3);
44
- color: var(--sv-color-text-primary);
45
- }
@@ -1,125 +0,0 @@
1
- import type { Meta, StoryObj } from '@storybook/react-vite';
2
- import { Table, TableBody, TableCell, TableHead, TableHeaderCell, TableRow } from './Table';
3
-
4
- const meta = {
5
- title: 'Components/Table',
6
- component: Table,
7
- parameters: {
8
- layout: 'padded',
9
- docs: {
10
- description: {
11
- component:
12
- 'Thin, styled wrappers around the native table elements. Not a data grid — no sort/filter/virtualization. Horizontal scroll (masked-edge fade, hidden scrollbar) at any viewport size.',
13
- },
14
- },
15
- },
16
- args: { children: null },
17
- } satisfies Meta<typeof Table>;
18
-
19
- export default meta;
20
- type Story = StoryObj<typeof meta>;
21
-
22
- // ---------------------------------------------------------------------------
23
-
24
- const ROWS = [
25
- { name: 'sovereign-tasks', status: 'Active', version: '1.4.2' },
26
- { name: 'sovereign-ledger', status: 'Active', version: '2.0.0' },
27
- { name: 'sovereign-shopper', status: 'Disabled', version: '0.9.1' },
28
- ];
29
-
30
- export const Default: Story = {
31
- render: () => (
32
- <Table>
33
- <TableHead>
34
- <TableRow>
35
- <TableHeaderCell>Plugin</TableHeaderCell>
36
- <TableHeaderCell>Status</TableHeaderCell>
37
- <TableHeaderCell>Version</TableHeaderCell>
38
- </TableRow>
39
- </TableHead>
40
- <TableBody>
41
- {ROWS.map((row) => (
42
- <TableRow key={row.name}>
43
- <TableCell>{row.name}</TableCell>
44
- <TableCell>{row.status}</TableCell>
45
- <TableCell>{row.version}</TableCell>
46
- </TableRow>
47
- ))}
48
- </TableBody>
49
- </Table>
50
- ),
51
- };
52
-
53
- export const WithoutHeader: Story = {
54
- render: () => (
55
- <Table>
56
- <TableBody>
57
- {ROWS.map((row) => (
58
- <TableRow key={row.name}>
59
- <TableCell>{row.name}</TableCell>
60
- <TableCell>{row.status}</TableCell>
61
- </TableRow>
62
- ))}
63
- </TableBody>
64
- </Table>
65
- ),
66
- };
67
-
68
- export const LongContent: Story = {
69
- render: () => (
70
- <Table>
71
- <TableHead>
72
- <TableRow>
73
- <TableHeaderCell>Plugin</TableHeaderCell>
74
- <TableHeaderCell>Description</TableHeaderCell>
75
- <TableHeaderCell>Author</TableHeaderCell>
76
- <TableHeaderCell>Repository</TableHeaderCell>
77
- <TableHeaderCell>Status</TableHeaderCell>
78
- <TableHeaderCell>Version</TableHeaderCell>
79
- </TableRow>
80
- </TableHead>
81
- <TableBody>
82
- {ROWS.map((row) => (
83
- <TableRow key={row.name}>
84
- <TableCell>{row.name}</TableCell>
85
- <TableCell>A longer description column to force horizontal overflow</TableCell>
86
- <TableCell>sovereign-community</TableCell>
87
- <TableCell>github.com/sovereignfs/{row.name}</TableCell>
88
- <TableCell>{row.status}</TableCell>
89
- <TableCell>{row.version}</TableCell>
90
- </TableRow>
91
- ))}
92
- </TableBody>
93
- </Table>
94
- ),
95
- };
96
-
97
- export const NarrowViewport: Story = {
98
- parameters: { viewport: { defaultViewport: 'mobile1' } },
99
- render: () => (
100
- <Table>
101
- <TableHead>
102
- <TableRow>
103
- <TableHeaderCell>Plugin</TableHeaderCell>
104
- <TableHeaderCell>Description</TableHeaderCell>
105
- <TableHeaderCell>Author</TableHeaderCell>
106
- <TableHeaderCell>Repository</TableHeaderCell>
107
- <TableHeaderCell>Status</TableHeaderCell>
108
- <TableHeaderCell>Version</TableHeaderCell>
109
- </TableRow>
110
- </TableHead>
111
- <TableBody>
112
- {ROWS.map((row) => (
113
- <TableRow key={row.name}>
114
- <TableCell>{row.name}</TableCell>
115
- <TableCell>A longer description column to force horizontal overflow</TableCell>
116
- <TableCell>sovereign-community</TableCell>
117
- <TableCell>github.com/sovereignfs/{row.name}</TableCell>
118
- <TableCell>{row.status}</TableCell>
119
- <TableCell>{row.version}</TableCell>
120
- </TableRow>
121
- ))}
122
- </TableBody>
123
- </Table>
124
- ),
125
- };
@@ -1,51 +0,0 @@
1
- import type { ReactNode, ThHTMLAttributes, TdHTMLAttributes } from 'react';
2
- import styles from './Table.module.css';
3
-
4
- export interface TableProps {
5
- children: ReactNode;
6
- className?: string;
7
- }
8
-
9
- /**
10
- * Table — thin, styled wrappers around the native table elements.
11
- *
12
- * Not a data grid: no sort, filter, or virtualization. `Table` wraps its
13
- * content in a horizontally-scrolling container (masked-edge fade, hidden
14
- * scrollbar — same technique as `NavTabs`) so a table wider than its
15
- * container scrolls instead of overflowing the page, at any viewport size.
16
- */
17
- export function Table({ children, className }: TableProps) {
18
- return (
19
- <div className={styles.scrollContainer}>
20
- <table className={[styles.table, className].filter(Boolean).join(' ')}>{children}</table>
21
- </div>
22
- );
23
- }
24
-
25
- export function TableHead({ children }: { children: ReactNode }) {
26
- return <thead className={styles.head}>{children}</thead>;
27
- }
28
-
29
- export function TableBody({ children }: { children: ReactNode }) {
30
- return <tbody className={styles.body}>{children}</tbody>;
31
- }
32
-
33
- export function TableRow({ children }: { children: ReactNode }) {
34
- return <tr className={styles.row}>{children}</tr>;
35
- }
36
-
37
- export function TableHeaderCell({ children, ...rest }: ThHTMLAttributes<HTMLTableCellElement>) {
38
- return (
39
- <th className={styles.th} {...rest}>
40
- {children}
41
- </th>
42
- );
43
- }
44
-
45
- export function TableCell({ children, ...rest }: TdHTMLAttributes<HTMLTableCellElement>) {
46
- return (
47
- <td className={styles.td} {...rest}>
48
- {children}
49
- </td>
50
- );
51
- }
@@ -1,50 +0,0 @@
1
- // @vitest-environment jsdom
2
- import { afterEach, describe, expect, it } from 'vitest';
3
- import { cleanup, render, screen } from '@testing-library/react';
4
- import { Table, TableBody, TableCell, TableHead, TableHeaderCell, TableRow } from '../Table';
5
-
6
- afterEach(cleanup);
7
-
8
- function Demo() {
9
- return (
10
- <Table>
11
- <TableHead>
12
- <TableRow>
13
- <TableHeaderCell>Name</TableHeaderCell>
14
- <TableHeaderCell>Status</TableHeaderCell>
15
- </TableRow>
16
- </TableHead>
17
- <TableBody>
18
- <TableRow>
19
- <TableCell>Alpha</TableCell>
20
- <TableCell>Active</TableCell>
21
- </TableRow>
22
- <TableRow>
23
- <TableCell>Beta</TableCell>
24
- <TableCell>Disabled</TableCell>
25
- </TableRow>
26
- </TableBody>
27
- </Table>
28
- );
29
- }
30
-
31
- describe('Table', () => {
32
- it('renders a real table element', () => {
33
- render(<Demo />);
34
- expect(screen.getByRole('table')).toBeDefined();
35
- });
36
-
37
- it('renders header cells with columnheader role', () => {
38
- render(<Demo />);
39
- expect(screen.getAllByRole('columnheader').map((el) => el.textContent)).toEqual([
40
- 'Name',
41
- 'Status',
42
- ]);
43
- });
44
-
45
- it('renders the correct number of body rows and cells', () => {
46
- render(<Demo />);
47
- expect(screen.getAllByRole('row').length).toBe(3); // 1 header + 2 body
48
- expect(screen.getAllByRole('cell').length).toBe(4);
49
- });
50
- });