@sovereignfs/ui 0.83.1 → 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 (556) hide show
  1. package/LICENSE +373 -661
  2. package/NOTICE +8 -0
  3. package/README.md +4 -6
  4. package/dist/AppsLauncher.module.css +6 -0
  5. package/dist/Button.module.css +5 -0
  6. package/dist/Card.module.css +6 -0
  7. package/dist/CardTile.module.css +6 -0
  8. package/dist/CheckableListRow.module.css +8 -0
  9. package/dist/Checkbox.module.css +8 -0
  10. package/dist/CodeTextarea.module.css +6 -0
  11. package/dist/ColorPicker.module.css +6 -0
  12. package/dist/Combobox.module.css +6 -0
  13. package/dist/Command.module.css +6 -0
  14. package/dist/ConfirmDialog.module.css +6 -0
  15. package/dist/DatePicker.module.css +6 -0
  16. package/dist/Dialog.module.css +1 -1
  17. package/dist/DragHandleRow.module.css +6 -0
  18. package/dist/FileDropzone.module.css +25 -1
  19. package/dist/Header.module.css +6 -0
  20. package/dist/IconPicker.module.css +14 -4
  21. package/dist/Input.module.css +6 -0
  22. package/dist/LegalLinks.module.css +9 -2
  23. package/dist/Markdown.module.css +5 -0
  24. package/dist/Message.module.css +9 -0
  25. package/dist/MobileAppsDrawer.module.css +9 -5
  26. package/dist/MobileFooter.module.css +6 -0
  27. package/dist/NavList.module.css +11 -2
  28. package/dist/NavTabs.module.css +7 -1
  29. package/dist/NotificationsPanel.module.css +10 -0
  30. package/dist/QrCode.module.css +17 -0
  31. package/dist/QuantityStepper.module.css +4 -2
  32. package/dist/RadioGroup.module.css +6 -0
  33. package/dist/SegmentedControl.module.css +6 -0
  34. package/dist/Select.module.css +6 -0
  35. package/dist/Sheet.module.css +16 -1
  36. package/dist/SplitPane.module.css +1 -1
  37. package/dist/StepStrip.module.css +5 -3
  38. package/dist/SuggestionInput.module.css +12 -1
  39. package/dist/SwipableMobileCarouselDots.module.css +6 -0
  40. package/dist/SystemBanner.module.css +6 -0
  41. package/dist/Tabs.module.css +6 -0
  42. package/dist/TagInput.module.css +6 -0
  43. package/dist/Textarea.module.css +6 -0
  44. package/dist/Toast.module.css +5 -0
  45. package/dist/Toggle.module.css +7 -0
  46. package/dist/Tooltip.module.css +6 -0
  47. package/dist/UserMenu.module.css +5 -0
  48. package/dist/fonts/OFL.txt +93 -0
  49. package/dist/fonts/hanken-grotesk-cyrillic-ext-wght-normal.woff2 +0 -0
  50. package/dist/fonts/hanken-grotesk-latin-ext-wght-normal.woff2 +0 -0
  51. package/dist/fonts/hanken-grotesk-latin-wght-normal.woff2 +0 -0
  52. package/dist/fonts/hanken-grotesk-vietnamese-wght-normal.woff2 +0 -0
  53. package/dist/index.d.ts +121 -43
  54. package/dist/index.js +1410 -1152
  55. package/dist/tokens/fonts.css +53 -0
  56. package/dist/tokens/primitives.css +12 -12
  57. package/dist/tokens.css +2 -1
  58. package/package.json +24 -13
  59. package/src/__tests__/motion.test.tsx +0 -105
  60. package/src/__tests__/package-json.test.ts +0 -8
  61. package/src/components/Accordion/Accordion.module.css +0 -3
  62. package/src/components/Accordion/Accordion.stories.tsx +0 -110
  63. package/src/components/Accordion/Accordion.tsx +0 -53
  64. package/src/components/Accordion/__tests__/Accordion.test.tsx +0 -61
  65. package/src/components/Alert/Alert.module.css +0 -62
  66. package/src/components/Alert/Alert.stories.tsx +0 -96
  67. package/src/components/Alert/Alert.tsx +0 -58
  68. package/src/components/Alert/__tests__/Alert.test.tsx +0 -75
  69. package/src/components/AppsLauncher/AppsLauncher.module.css +0 -96
  70. package/src/components/AppsLauncher/AppsLauncher.stories.tsx +0 -58
  71. package/src/components/AppsLauncher/AppsLauncher.tsx +0 -117
  72. package/src/components/AppsLauncher/__tests__/AppsLauncher.test.tsx +0 -52
  73. package/src/components/AspectRatio/AspectRatio.module.css +0 -15
  74. package/src/components/AspectRatio/AspectRatio.stories.tsx +0 -78
  75. package/src/components/AspectRatio/AspectRatio.tsx +0 -21
  76. package/src/components/AspectRatio/__tests__/AspectRatio.test.tsx +0 -27
  77. package/src/components/Avatar/Avatar.module.css +0 -38
  78. package/src/components/Avatar/Avatar.tsx +0 -42
  79. package/src/components/Badge/Badge.module.css +0 -177
  80. package/src/components/Badge/Badge.stories.tsx +0 -238
  81. package/src/components/Badge/Badge.tsx +0 -84
  82. package/src/components/Badge/__tests__/Badge.test.tsx +0 -90
  83. package/src/components/BalanceChip/BalanceChip.module.css +0 -32
  84. package/src/components/BalanceChip/BalanceChip.stories.tsx +0 -45
  85. package/src/components/BalanceChip/BalanceChip.tsx +0 -33
  86. package/src/components/Breadcrumb/Breadcrumb.module.css +0 -49
  87. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +0 -47
  88. package/src/components/Breadcrumb/Breadcrumb.tsx +0 -57
  89. package/src/components/Breadcrumb/__tests__/Breadcrumb.test.tsx +0 -52
  90. package/src/components/Button/Button.module.css +0 -169
  91. package/src/components/Button/Button.stories.tsx +0 -83
  92. package/src/components/Button/Button.tsx +0 -52
  93. package/src/components/Button/__tests__/Button.test.tsx +0 -66
  94. package/src/components/ButtonGroup/ButtonGroup.module.css +0 -29
  95. package/src/components/ButtonGroup/ButtonGroup.stories.tsx +0 -57
  96. package/src/components/ButtonGroup/ButtonGroup.tsx +0 -27
  97. package/src/components/ButtonGroup/__tests__/ButtonGroup.test.tsx +0 -29
  98. package/src/components/Calendar/Calendar.module.css +0 -126
  99. package/src/components/Calendar/Calendar.tsx +0 -213
  100. package/src/components/Calendar/__tests__/Calendar.test.tsx +0 -98
  101. package/src/components/Calendar/dateUtils.ts +0 -97
  102. package/src/components/Card/Card.module.css +0 -42
  103. package/src/components/Card/Card.tsx +0 -34
  104. package/src/components/CardTile/CardTile.module.css +0 -181
  105. package/src/components/CardTile/CardTile.stories.tsx +0 -86
  106. package/src/components/CardTile/CardTile.tsx +0 -128
  107. package/src/components/CardTile/__tests__/CardTile.test.tsx +0 -56
  108. package/src/components/CheckableListRow/CheckableListRow.module.css +0 -95
  109. package/src/components/CheckableListRow/CheckableListRow.stories.tsx +0 -99
  110. package/src/components/CheckableListRow/CheckableListRow.tsx +0 -89
  111. package/src/components/Checkbox/Checkbox.module.css +0 -111
  112. package/src/components/Checkbox/Checkbox.tsx +0 -78
  113. package/src/components/CodeTextarea/CodeTextarea.module.css +0 -53
  114. package/src/components/CodeTextarea/CodeTextarea.stories.tsx +0 -77
  115. package/src/components/CodeTextarea/CodeTextarea.tsx +0 -36
  116. package/src/components/Collapsible/Collapsible.module.css +0 -70
  117. package/src/components/Collapsible/Collapsible.stories.tsx +0 -62
  118. package/src/components/Collapsible/Collapsible.tsx +0 -66
  119. package/src/components/Collapsible/__tests__/Collapsible.test.tsx +0 -71
  120. package/src/components/ColorPicker/ColorPicker.module.css +0 -132
  121. package/src/components/ColorPicker/ColorPicker.stories.tsx +0 -80
  122. package/src/components/ColorPicker/ColorPicker.tsx +0 -157
  123. package/src/components/ColorPicker/__tests__/ColorPicker.test.tsx +0 -117
  124. package/src/components/Combobox/Combobox.module.css +0 -122
  125. package/src/components/Combobox/Combobox.stories.tsx +0 -79
  126. package/src/components/Combobox/Combobox.tsx +0 -186
  127. package/src/components/Combobox/__tests__/Combobox.test.tsx +0 -158
  128. package/src/components/Command/Command.module.css +0 -80
  129. package/src/components/Command/Command.stories.tsx +0 -104
  130. package/src/components/Command/Command.tsx +0 -168
  131. package/src/components/Command/__tests__/Command.test.tsx +0 -162
  132. package/src/components/ConfirmDialog/ConfirmDialog.module.css +0 -113
  133. package/src/components/ConfirmDialog/ConfirmDialog.tsx +0 -150
  134. package/src/components/ConfirmDialog/__tests__/ConfirmDialog.test.tsx +0 -214
  135. package/src/components/ConsentPrompt/ConsentPrompt.module.css +0 -21
  136. package/src/components/ConsentPrompt/ConsentPrompt.stories.tsx +0 -31
  137. package/src/components/ConsentPrompt/ConsentPrompt.tsx +0 -66
  138. package/src/components/ContextMenu/ContextMenu.stories.tsx +0 -81
  139. package/src/components/ContextMenu/ContextMenu.tsx +0 -100
  140. package/src/components/ContextMenu/__tests__/ContextMenu.test.tsx +0 -87
  141. package/src/components/CurrencyInput/CurrencyInput.stories.tsx +0 -50
  142. package/src/components/CurrencyInput/CurrencyInput.tsx +0 -60
  143. package/src/components/DataTable/DataTable.module.css +0 -28
  144. package/src/components/DataTable/DataTable.stories.tsx +0 -74
  145. package/src/components/DataTable/DataTable.tsx +0 -154
  146. package/src/components/DataTable/__tests__/DataTable.test.tsx +0 -123
  147. package/src/components/DatePicker/DatePicker.module.css +0 -61
  148. package/src/components/DatePicker/DatePicker.tsx +0 -103
  149. package/src/components/DatePicker/__tests__/DatePicker.test.tsx +0 -89
  150. package/src/components/DeviceOnlyGate/DeviceOnlyGate.tsx +0 -58
  151. package/src/components/DeviceOnlyGate/__tests__/DeviceOnlyGate.test.tsx +0 -45
  152. package/src/components/DeviceStorageKeyGate/DeviceStorageKeyGate.tsx +0 -100
  153. package/src/components/DeviceStorageKeyGate/__tests__/DeviceStorageKeyGate.test.tsx +0 -119
  154. package/src/components/Dialog/Dialog.module.css +0 -335
  155. package/src/components/Dialog/Dialog.stories.tsx +0 -324
  156. package/src/components/Dialog/Dialog.tsx +0 -254
  157. package/src/components/Dialog/__tests__/Dialog.test.tsx +0 -318
  158. package/src/components/DragHandleRow/DragHandleRow.module.css +0 -57
  159. package/src/components/DragHandleRow/DragHandleRow.tsx +0 -42
  160. package/src/components/Drawer/Drawer.module.css +0 -121
  161. package/src/components/Drawer/Drawer.stories.tsx +0 -132
  162. package/src/components/Drawer/Drawer.tsx +0 -175
  163. package/src/components/Drawer/__tests__/Drawer.test.tsx +0 -226
  164. package/src/components/EmptyState/EmptyState.module.css +0 -27
  165. package/src/components/EmptyState/EmptyState.tsx +0 -27
  166. package/src/components/FileDropzone/FileDropzone.module.css +0 -63
  167. package/src/components/FileDropzone/FileDropzone.tsx +0 -109
  168. package/src/components/FileDropzone/__tests__/FileDropzone.test.tsx +0 -67
  169. package/src/components/FormField/FormField.module.css +0 -33
  170. package/src/components/FormField/FormField.tsx +0 -78
  171. package/src/components/FormField/__tests__/FormField.test.tsx +0 -83
  172. package/src/components/GripIcon/GripIcon.tsx +0 -27
  173. package/src/components/Header/Header.module.css +0 -62
  174. package/src/components/Header/Header.stories.tsx +0 -452
  175. package/src/components/Header/Header.tsx +0 -102
  176. package/src/components/Header/__tests__/Header.test.tsx +0 -104
  177. package/src/components/HeaderFooterLayout/HeaderFooterLayout.module.css +0 -21
  178. package/src/components/HeaderFooterLayout/HeaderFooterLayout.stories.tsx +0 -111
  179. package/src/components/HeaderFooterLayout/HeaderFooterLayout.tsx +0 -54
  180. package/src/components/HeaderFooterLayout/__tests__/HeaderFooterLayout.test.tsx +0 -58
  181. package/src/components/HoverCard/HoverCard.module.css +0 -3
  182. package/src/components/HoverCard/HoverCard.stories.tsx +0 -66
  183. package/src/components/HoverCard/HoverCard.tsx +0 -111
  184. package/src/components/HoverCard/__tests__/HoverCard.test.tsx +0 -99
  185. package/src/components/Icon/Icon.module.css +0 -27
  186. package/src/components/Icon/Icon.stories.tsx +0 -95
  187. package/src/components/Icon/Icon.tsx +0 -43
  188. package/src/components/Icon/__tests__/Icon.test.tsx +0 -40
  189. package/src/components/Icon/icons/activity.tsx +0 -20
  190. package/src/components/Icon/icons/alert-triangle.tsx +0 -22
  191. package/src/components/Icon/icons/apple.tsx +0 -21
  192. package/src/components/Icon/icons/arrow-left-right.tsx +0 -23
  193. package/src/components/Icon/icons/banana.tsx +0 -21
  194. package/src/components/Icon/icons/beef.tsx +0 -22
  195. package/src/components/Icon/icons/beer.tsx +0 -24
  196. package/src/components/Icon/icons/bell.tsx +0 -21
  197. package/src/components/Icon/icons/bold.tsx +0 -20
  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-chevron-left.tsx +0 -21
  208. package/src/components/Icon/icons/circle-x.tsx +0 -22
  209. package/src/components/Icon/icons/code.tsx +0 -21
  210. package/src/components/Icon/icons/coffee.tsx +0 -23
  211. package/src/components/Icon/icons/cookie.tsx +0 -25
  212. package/src/components/Icon/icons/copy.tsx +0 -21
  213. package/src/components/Icon/icons/credit-card.tsx +0 -21
  214. package/src/components/Icon/icons/croissant.tsx +0 -24
  215. package/src/components/Icon/icons/cup-soda.tsx +0 -23
  216. package/src/components/Icon/icons/database.tsx +0 -22
  217. package/src/components/Icon/icons/download.tsx +0 -22
  218. package/src/components/Icon/icons/drumstick.tsx +0 -21
  219. package/src/components/Icon/icons/egg.tsx +0 -20
  220. package/src/components/Icon/icons/ellipsis-vertical.tsx +0 -22
  221. package/src/components/Icon/icons/external-link.tsx +0 -22
  222. package/src/components/Icon/icons/eye-off.tsx +0 -23
  223. package/src/components/Icon/icons/eye.tsx +0 -21
  224. package/src/components/Icon/icons/file-text.tsx +0 -24
  225. package/src/components/Icon/icons/file.tsx +0 -21
  226. package/src/components/Icon/icons/fish.tsx +0 -25
  227. package/src/components/Icon/icons/folder-closed.tsx +0 -21
  228. package/src/components/Icon/icons/folder-open.tsx +0 -20
  229. package/src/components/Icon/icons/folder.tsx +0 -20
  230. package/src/components/Icon/icons/folders.tsx +0 -21
  231. package/src/components/Icon/icons/grid-2x2.tsx +0 -22
  232. package/src/components/Icon/icons/hat-glasses.tsx +0 -24
  233. package/src/components/Icon/icons/history.tsx +0 -22
  234. package/src/components/Icon/icons/house.tsx +0 -21
  235. package/src/components/Icon/icons/inbox.tsx +0 -21
  236. package/src/components/Icon/icons/index.ts +0 -394
  237. package/src/components/Icon/icons/info.tsx +0 -22
  238. package/src/components/Icon/icons/italic.tsx +0 -22
  239. package/src/components/Icon/icons/layers.tsx +0 -22
  240. package/src/components/Icon/icons/layout-dashboard.tsx +0 -23
  241. package/src/components/Icon/icons/layout-grid.tsx +0 -23
  242. package/src/components/Icon/icons/link.tsx +0 -21
  243. package/src/components/Icon/icons/list-ordered.tsx +0 -25
  244. package/src/components/Icon/icons/list.tsx +0 -25
  245. package/src/components/Icon/icons/lock.tsx +0 -21
  246. package/src/components/Icon/icons/log-out.tsx +0 -22
  247. package/src/components/Icon/icons/luggage.tsx +0 -24
  248. package/src/components/Icon/icons/mail.tsx +0 -21
  249. package/src/components/Icon/icons/map-pin.tsx +0 -21
  250. package/src/components/Icon/icons/menu.tsx +0 -22
  251. package/src/components/Icon/icons/milk.tsx +0 -22
  252. package/src/components/Icon/icons/minus.tsx +0 -20
  253. package/src/components/Icon/icons/package.tsx +0 -23
  254. package/src/components/Icon/icons/paint-bucket.tsx +0 -23
  255. package/src/components/Icon/icons/panel-left.tsx +0 -21
  256. package/src/components/Icon/icons/pencil.tsx +0 -21
  257. package/src/components/Icon/icons/pin.tsx +0 -21
  258. package/src/components/Icon/icons/pizza.tsx +0 -24
  259. package/src/components/Icon/icons/plus.tsx +0 -21
  260. package/src/components/Icon/icons/rectangle-ellipsis.tsx +0 -23
  261. package/src/components/Icon/icons/refresh-cw.tsx +0 -23
  262. package/src/components/Icon/icons/rotate-ccw.tsx +0 -21
  263. package/src/components/Icon/icons/rotate-cw.tsx +0 -21
  264. package/src/components/Icon/icons/route.tsx +0 -22
  265. package/src/components/Icon/icons/salad.tsx +0 -24
  266. package/src/components/Icon/icons/search.tsx +0 -21
  267. package/src/components/Icon/icons/send.tsx +0 -21
  268. package/src/components/Icon/icons/settings.tsx +0 -21
  269. package/src/components/Icon/icons/share-2.tsx +0 -24
  270. package/src/components/Icon/icons/sheet.tsx +0 -24
  271. package/src/components/Icon/icons/shield.tsx +0 -20
  272. package/src/components/Icon/icons/shopping-basket.tsx +0 -26
  273. package/src/components/Icon/icons/sliders-horizontal.tsx +0 -28
  274. package/src/components/Icon/icons/smartphone.tsx +0 -21
  275. package/src/components/Icon/icons/snowflake.tsx +0 -31
  276. package/src/components/Icon/icons/spray-can.tsx +0 -29
  277. package/src/components/Icon/icons/square-kanban.tsx +0 -23
  278. package/src/components/Icon/icons/table.tsx +0 -23
  279. package/src/components/Icon/icons/trash-2.tsx +0 -24
  280. package/src/components/Icon/icons/upload.tsx +0 -22
  281. package/src/components/Icon/icons/user-round-plus.tsx +0 -23
  282. package/src/components/Icon/icons/user.tsx +0 -21
  283. package/src/components/Icon/icons/users.tsx +0 -23
  284. package/src/components/Icon/icons/wine.tsx +0 -23
  285. package/src/components/Icon/icons/x.tsx +0 -21
  286. package/src/components/IconPicker/IconPicker.module.css +0 -63
  287. package/src/components/IconPicker/IconPicker.stories.tsx +0 -84
  288. package/src/components/IconPicker/IconPicker.tsx +0 -90
  289. package/src/components/Input/Input.module.css +0 -52
  290. package/src/components/Input/Input.stories.tsx +0 -86
  291. package/src/components/Input/Input.tsx +0 -20
  292. package/src/components/Input/__tests__/Input.test.tsx +0 -22
  293. package/src/components/Item/Item.module.css +0 -70
  294. package/src/components/Item/Item.stories.tsx +0 -62
  295. package/src/components/Item/Item.tsx +0 -54
  296. package/src/components/Item/__tests__/Item.test.tsx +0 -39
  297. package/src/components/Kbd/Kbd.module.css +0 -14
  298. package/src/components/Kbd/Kbd.stories.tsx +0 -32
  299. package/src/components/Kbd/Kbd.tsx +0 -12
  300. package/src/components/Kbd/__tests__/Kbd.test.tsx +0 -14
  301. package/src/components/Label/Label.module.css +0 -11
  302. package/src/components/Label/Label.stories.tsx +0 -40
  303. package/src/components/Label/Label.tsx +0 -24
  304. package/src/components/Label/__tests__/Label.test.tsx +0 -32
  305. package/src/components/LegalLinks/LegalLinks.module.css +0 -24
  306. package/src/components/LegalLinks/LegalLinks.stories.tsx +0 -22
  307. package/src/components/LegalLinks/LegalLinks.tsx +0 -40
  308. package/src/components/Markdown/Markdown.module.css +0 -73
  309. package/src/components/Markdown/Markdown.stories.tsx +0 -40
  310. package/src/components/Markdown/Markdown.tsx +0 -305
  311. package/src/components/Markdown/__tests__/Markdown.test.tsx +0 -144
  312. package/src/components/Marker/Marker.module.css +0 -33
  313. package/src/components/Marker/Marker.stories.tsx +0 -39
  314. package/src/components/Marker/Marker.tsx +0 -34
  315. package/src/components/Marker/__tests__/Marker.test.tsx +0 -23
  316. package/src/components/MemberMultiSelect/MemberMultiSelect.module.css +0 -27
  317. package/src/components/MemberMultiSelect/MemberMultiSelect.stories.tsx +0 -74
  318. package/src/components/MemberMultiSelect/MemberMultiSelect.tsx +0 -67
  319. package/src/components/Menu/Menu.module.css +0 -90
  320. package/src/components/Menu/Menu.tsx +0 -209
  321. package/src/components/Menu/__tests__/Menu.test.tsx +0 -227
  322. package/src/components/Menubar/Menubar.stories.tsx +0 -52
  323. package/src/components/Menubar/Menubar.tsx +0 -42
  324. package/src/components/Menubar/__tests__/Menubar.test.tsx +0 -45
  325. package/src/components/Message/Message.module.css +0 -99
  326. package/src/components/Message/Message.stories.tsx +0 -79
  327. package/src/components/Message/Message.tsx +0 -41
  328. package/src/components/Message/__tests__/Message.test.tsx +0 -46
  329. package/src/components/MessageScroller/MessageScroller.module.css +0 -65
  330. package/src/components/MessageScroller/MessageScroller.stories.tsx +0 -84
  331. package/src/components/MessageScroller/MessageScroller.tsx +0 -84
  332. package/src/components/MessageScroller/__tests__/MessageScroller.test.tsx +0 -105
  333. package/src/components/MobileAppsDrawer/MobileAppsDrawer.module.css +0 -82
  334. package/src/components/MobileAppsDrawer/MobileAppsDrawer.tsx +0 -78
  335. package/src/components/MobileAppsDrawer/__tests__/MobileAppsDrawer.test.tsx +0 -80
  336. package/src/components/MobileFooter/MobileFooter.module.css +0 -73
  337. package/src/components/MobileFooter/MobileFooter.stories.tsx +0 -47
  338. package/src/components/MobileFooter/MobileFooter.tsx +0 -122
  339. package/src/components/MobileFooter/__tests__/MobileFooter.test.tsx +0 -129
  340. package/src/components/MobileHeader/MobileHeader.module.css +0 -76
  341. package/src/components/MobileHeader/MobileHeader.stories.tsx +0 -57
  342. package/src/components/MobileHeader/MobileHeader.tsx +0 -90
  343. package/src/components/MobileHeader/__tests__/MobileHeader.test.tsx +0 -113
  344. package/src/components/NavList/NavList.module.css +0 -130
  345. package/src/components/NavList/NavList.tsx +0 -136
  346. package/src/components/NavList/__tests__/NavList.test.tsx +0 -109
  347. package/src/components/NavTabs/NavTabs.module.css +0 -50
  348. package/src/components/NavTabs/NavTabs.tsx +0 -61
  349. package/src/components/NavigationMenu/NavigationMenu.module.css +0 -53
  350. package/src/components/NavigationMenu/NavigationMenu.stories.tsx +0 -58
  351. package/src/components/NavigationMenu/NavigationMenu.tsx +0 -125
  352. package/src/components/NavigationMenu/__tests__/NavigationMenu.test.tsx +0 -93
  353. package/src/components/NotificationsPanel/NotificationsPanel.module.css +0 -258
  354. package/src/components/NotificationsPanel/NotificationsPanel.stories.tsx +0 -61
  355. package/src/components/NotificationsPanel/NotificationsPanel.tsx +0 -187
  356. package/src/components/NotificationsPanel/__tests__/NotificationsPanel.test.tsx +0 -78
  357. package/src/components/OfflineGate/OfflineGate.tsx +0 -44
  358. package/src/components/OfflineGate/__tests__/OfflineGate.test.tsx +0 -66
  359. package/src/components/OverlayHeader/OverlayHeader.module.css +0 -98
  360. package/src/components/OverlayHeader/OverlayHeader.tsx +0 -77
  361. package/src/components/OverlayHeader/__tests__/OverlayHeader.test.tsx +0 -69
  362. package/src/components/PageContainer/PageContainer.module.css +0 -82
  363. package/src/components/PageContainer/PageContainer.tsx +0 -64
  364. package/src/components/PageContainer/__tests__/PageContainer.test.tsx +0 -70
  365. package/src/components/PageHeader/PageHeader.module.css +0 -86
  366. package/src/components/PageHeader/PageHeader.tsx +0 -176
  367. package/src/components/PageHeader/__tests__/PageHeader.test.tsx +0 -103
  368. package/src/components/PageLayout/PageLayout.module.css +0 -51
  369. package/src/components/PageLayout/PageLayout.stories.tsx +0 -73
  370. package/src/components/PageLayout/PageLayout.tsx +0 -51
  371. package/src/components/PageLayout/__tests__/PageLayout.test.tsx +0 -34
  372. package/src/components/Pagination/Pagination.module.css +0 -98
  373. package/src/components/Pagination/Pagination.stories.tsx +0 -49
  374. package/src/components/Pagination/Pagination.tsx +0 -87
  375. package/src/components/Pagination/__tests__/Pagination.test.tsx +0 -56
  376. package/src/components/Popover/Popover.module.css +0 -74
  377. package/src/components/Popover/Popover.stories.tsx +0 -357
  378. package/src/components/Popover/Popover.tsx +0 -290
  379. package/src/components/Popover/__tests__/Popover.test.tsx +0 -263
  380. package/src/components/Progress/Progress.module.css +0 -20
  381. package/src/components/Progress/Progress.stories.tsx +0 -40
  382. package/src/components/Progress/Progress.tsx +0 -35
  383. package/src/components/Progress/__tests__/Progress.test.tsx +0 -31
  384. package/src/components/QuantityStepper/QuantityStepper.module.css +0 -67
  385. package/src/components/QuantityStepper/QuantityStepper.stories.tsx +0 -79
  386. package/src/components/QuantityStepper/QuantityStepper.tsx +0 -107
  387. package/src/components/RadioGroup/RadioGroup.module.css +0 -88
  388. package/src/components/RadioGroup/RadioGroup.stories.tsx +0 -69
  389. package/src/components/RadioGroup/RadioGroup.tsx +0 -99
  390. package/src/components/RadioGroup/__tests__/RadioGroup.test.tsx +0 -59
  391. package/src/components/Resizable/Resizable.module.css +0 -70
  392. package/src/components/Resizable/Resizable.stories.tsx +0 -82
  393. package/src/components/Resizable/Resizable.tsx +0 -313
  394. package/src/components/Resizable/__tests__/Resizable.test.tsx +0 -128
  395. package/src/components/ResponsiveSurface/ResponsiveSurface.tsx +0 -24
  396. package/src/components/ResponsiveSurface/__tests__/ResponsiveSurface.test.tsx +0 -73
  397. package/src/components/RootLayout/RootLayout.module.css +0 -12
  398. package/src/components/RootLayout/RootLayout.stories.tsx +0 -125
  399. package/src/components/RootLayout/RootLayout.tsx +0 -185
  400. package/src/components/RootLayout/__tests__/RootLayout.test.tsx +0 -161
  401. package/src/components/ScrollArea/ScrollArea.module.css +0 -20
  402. package/src/components/ScrollArea/ScrollArea.stories.tsx +0 -57
  403. package/src/components/ScrollArea/ScrollArea.tsx +0 -27
  404. package/src/components/ScrollArea/__tests__/ScrollArea.test.tsx +0 -39
  405. package/src/components/SegmentedControl/SegmentedControl.module.css +0 -55
  406. package/src/components/SegmentedControl/SegmentedControl.stories.tsx +0 -118
  407. package/src/components/SegmentedControl/SegmentedControl.tsx +0 -56
  408. package/src/components/SegmentedControl/__tests__/SegmentedControl.test.tsx +0 -63
  409. package/src/components/Select/Select.module.css +0 -82
  410. package/src/components/Select/Select.stories.tsx +0 -115
  411. package/src/components/Select/Select.tsx +0 -48
  412. package/src/components/Select/__tests__/Select.test.tsx +0 -59
  413. package/src/components/Sheet/Sheet.module.css +0 -58
  414. package/src/components/Sheet/Sheet.tsx +0 -109
  415. package/src/components/Sheet/__tests__/Sheet.test.tsx +0 -99
  416. package/src/components/Slider/Slider.module.css +0 -95
  417. package/src/components/Slider/Slider.stories.tsx +0 -64
  418. package/src/components/Slider/Slider.tsx +0 -77
  419. package/src/components/Slider/__tests__/Slider.test.tsx +0 -45
  420. package/src/components/Spinner/Spinner.module.css +0 -39
  421. package/src/components/Spinner/Spinner.tsx +0 -23
  422. package/src/components/SplitMethodSelector/SplitMethodSelector.stories.tsx +0 -33
  423. package/src/components/SplitMethodSelector/SplitMethodSelector.tsx +0 -43
  424. package/src/components/SplitPane/SplitPane.module.css +0 -85
  425. package/src/components/SplitPane/SplitPane.stories.tsx +0 -160
  426. package/src/components/SplitPane/SplitPane.tsx +0 -149
  427. package/src/components/SplitPane/__tests__/SplitPane.test.tsx +0 -51
  428. package/src/components/StatusBadge/StatusBadge.module.css +0 -59
  429. package/src/components/StatusBadge/StatusBadge.stories.tsx +0 -74
  430. package/src/components/StatusBadge/StatusBadge.tsx +0 -65
  431. package/src/components/StepStrip/StepStrip.module.css +0 -53
  432. package/src/components/StepStrip/StepStrip.tsx +0 -74
  433. package/src/components/SuggestionInput/SuggestionInput.module.css +0 -103
  434. package/src/components/SuggestionInput/SuggestionInput.stories.tsx +0 -144
  435. package/src/components/SuggestionInput/SuggestionInput.tsx +0 -207
  436. package/src/components/SwipableMobileCarousel/SwipableMobileCarousel.module.css +0 -64
  437. package/src/components/SwipableMobileCarousel/SwipableMobileCarousel.tsx +0 -243
  438. package/src/components/SwipableMobileCarousel/SwipableMobileCarouselSlide.tsx +0 -35
  439. package/src/components/SwipableMobileCarousel/SwipableMobileCarouselSlideBody.tsx +0 -42
  440. package/src/components/SwipableMobileCarousel/SwipableMobileCarouselSlideFooter.tsx +0 -18
  441. package/src/components/SwipableMobileCarousel/SwipableMobileCarouselSlideHeader.tsx +0 -21
  442. package/src/components/SwipableMobileCarousel/SwipableMobileCarouselSlideParts.module.css +0 -29
  443. package/src/components/SwipableMobileCarousel/__tests__/SwipableMobileCarousel.test.tsx +0 -214
  444. package/src/components/SwipableMobileCarousel/__tests__/SwipableMobileCarouselDevGuard.test.tsx +0 -61
  445. package/src/components/SwipableMobileCarousel/context.ts +0 -13
  446. package/src/components/SwipableMobileCarouselDots/SwipableMobileCarouselDots.module.css +0 -64
  447. package/src/components/SwipableMobileCarouselDots/SwipableMobileCarouselDots.tsx +0 -73
  448. package/src/components/SwipableMobileCarouselDots/__tests__/SwipableMobileCarouselDots.test.tsx +0 -63
  449. package/src/components/SwipeStack/SwipeStack.module.css +0 -101
  450. package/src/components/SwipeStack/SwipeStack.tsx +0 -199
  451. package/src/components/SwipeStack/SwipeStackCard.tsx +0 -22
  452. package/src/components/SwipeStack/__tests__/SwipeStack.test.tsx +0 -169
  453. package/src/components/SystemBanner/SystemBanner.module.css +0 -79
  454. package/src/components/SystemBanner/SystemBanner.stories.tsx +0 -86
  455. package/src/components/SystemBanner/SystemBanner.tsx +0 -50
  456. package/src/components/SystemBanner/__tests__/SystemBanner.test.tsx +0 -50
  457. package/src/components/Table/Table.module.css +0 -45
  458. package/src/components/Table/Table.stories.tsx +0 -125
  459. package/src/components/Table/Table.tsx +0 -51
  460. package/src/components/Table/__tests__/Table.test.tsx +0 -50
  461. package/src/components/Tabs/Tabs.module.css +0 -56
  462. package/src/components/Tabs/Tabs.stories.tsx +0 -100
  463. package/src/components/Tabs/Tabs.tsx +0 -46
  464. package/src/components/Tabs/__tests__/Tabs.test.tsx +0 -45
  465. package/src/components/TagInput/TagInput.module.css +0 -141
  466. package/src/components/TagInput/TagInput.stories.tsx +0 -109
  467. package/src/components/TagInput/TagInput.tsx +0 -174
  468. package/src/components/TagInput/__tests__/TagInput.test.tsx +0 -69
  469. package/src/components/Textarea/Textarea.module.css +0 -47
  470. package/src/components/Textarea/Textarea.tsx +0 -38
  471. package/src/components/Textarea/__tests__/Textarea.test.tsx +0 -51
  472. package/src/components/ThreeColumnLayout/ThreeColumnLayout.module.css +0 -35
  473. package/src/components/ThreeColumnLayout/ThreeColumnLayout.stories.tsx +0 -152
  474. package/src/components/ThreeColumnLayout/ThreeColumnLayout.tsx +0 -87
  475. package/src/components/ThreeColumnLayout/__tests__/ThreeColumnLayout.test.tsx +0 -78
  476. package/src/components/Toast/Toast.module.css +0 -191
  477. package/src/components/Toast/Toast.stories.tsx +0 -191
  478. package/src/components/Toast/Toast.tsx +0 -139
  479. package/src/components/Toggle/Toggle.module.css +0 -57
  480. package/src/components/Toggle/Toggle.stories.tsx +0 -95
  481. package/src/components/Toggle/Toggle.tsx +0 -39
  482. package/src/components/Toggle/__tests__/Toggle.test.tsx +0 -47
  483. package/src/components/Tooltip/Tooltip.module.css +0 -56
  484. package/src/components/Tooltip/Tooltip.tsx +0 -30
  485. package/src/components/Typography/Typography.module.css +0 -47
  486. package/src/components/Typography/Typography.stories.tsx +0 -62
  487. package/src/components/Typography/Typography.tsx +0 -30
  488. package/src/components/Typography/__tests__/Typography.test.tsx +0 -34
  489. package/src/components/UserMenu/UserMenu.module.css +0 -90
  490. package/src/components/UserMenu/UserMenu.stories.tsx +0 -49
  491. package/src/components/UserMenu/UserMenu.tsx +0 -132
  492. package/src/components/UserMenu/__tests__/UserMenu.test.tsx +0 -77
  493. package/src/css-modules.d.ts +0 -4
  494. package/src/hooks/__tests__/useCarouselRouteSync.test.tsx +0 -126
  495. package/src/hooks/__tests__/useDoubleTap.test.tsx +0 -117
  496. package/src/hooks/__tests__/useIsMobile.test.tsx +0 -80
  497. package/src/hooks/__tests__/useIsOffline.test.tsx +0 -53
  498. package/src/hooks/__tests__/useLongPress.test.tsx +0 -158
  499. package/src/hooks/__tests__/useOfflineTileState.test.tsx +0 -69
  500. package/src/hooks/__tests__/usePublishShellChromeHeight.test.tsx +0 -118
  501. package/src/hooks/__tests__/useReorderSensors.test.ts +0 -26
  502. package/src/hooks/__tests__/useResponsiveLayout.test.tsx +0 -87
  503. package/src/hooks/__tests__/useSnapCarousel.test.tsx +0 -175
  504. package/src/hooks/__tests__/useSwipeReveal.test.tsx +0 -110
  505. package/src/hooks/__tests__/useSwipeStack.test.tsx +0 -155
  506. package/src/hooks/index.ts +0 -33
  507. package/src/hooks/useCarouselRouteSync.ts +0 -92
  508. package/src/hooks/useCommitOnEnterOrBlur.ts +0 -39
  509. package/src/hooks/useDoubleTap.ts +0 -91
  510. package/src/hooks/useIsMobile.ts +0 -33
  511. package/src/hooks/useIsOffline.ts +0 -41
  512. package/src/hooks/useLongPress.ts +0 -185
  513. package/src/hooks/useOfflineTileState.ts +0 -45
  514. package/src/hooks/usePublishShellChromeHeight.ts +0 -96
  515. package/src/hooks/useReorderSensors.ts +0 -88
  516. package/src/hooks/useResponsiveLayout.ts +0 -36
  517. package/src/hooks/useSnapCarousel.ts +0 -284
  518. package/src/hooks/useSwipeReveal.ts +0 -107
  519. package/src/hooks/useSwipeStack.ts +0 -235
  520. package/src/index.ts +0 -311
  521. package/src/motion.ts +0 -78
  522. package/src/overlay-shell.ts +0 -159
  523. package/src/scroll-lock.ts +0 -22
  524. package/src/stories/Avatar.stories.tsx +0 -44
  525. package/src/stories/Card.stories.tsx +0 -35
  526. package/src/stories/Checkbox.stories.tsx +0 -45
  527. package/src/stories/DesignSystemOverview.stories.tsx +0 -3793
  528. package/src/stories/DeviceOnlyGate.stories.tsx +0 -35
  529. package/src/stories/DeviceStorageKeyGate.stories.tsx +0 -57
  530. package/src/stories/DragHandleRow.stories.tsx +0 -41
  531. package/src/stories/EmptyState.stories.tsx +0 -33
  532. package/src/stories/FileDropzone.stories.tsx +0 -69
  533. package/src/stories/FormField.stories.tsx +0 -47
  534. package/src/stories/GripIcon.stories.tsx +0 -29
  535. package/src/stories/InteractionHooks.stories.tsx +0 -925
  536. package/src/stories/LayoutSystem.stories.tsx +0 -639
  537. package/src/stories/MenuEntries.stories.tsx +0 -86
  538. package/src/stories/MobilePatterns.stories.tsx +0 -1536
  539. package/src/stories/NavList.stories.tsx +0 -147
  540. package/src/stories/NavTabs.stories.tsx +0 -53
  541. package/src/stories/OfflineGate.stories.tsx +0 -42
  542. package/src/stories/PageContainer.stories.tsx +0 -82
  543. package/src/stories/PageHeader.stories.tsx +0 -95
  544. package/src/stories/ResponsiveSurface.stories.tsx +0 -47
  545. package/src/stories/Spinner.stories.tsx +0 -25
  546. package/src/stories/StepStrip.stories.tsx +0 -76
  547. package/src/stories/SwipableMobileCarousel.stories.tsx +0 -362
  548. package/src/stories/SwipeStack.stories.tsx +0 -200
  549. package/src/stories/Textarea.stories.tsx +0 -63
  550. package/src/stories/TokenGallery.stories.tsx +0 -652
  551. package/src/stories/Tooltip.stories.tsx +0 -59
  552. package/src/tokens/primitives.css +0 -168
  553. package/src/tokens/semantic.css +0 -162
  554. package/src/tokens/theme-presets.css +0 -33
  555. package/src/tokens/theme-presets.ts +0 -72
  556. package/src/tokens.css +0 -5
@@ -1,82 +0,0 @@
1
- .container {
2
- width: 100%;
3
- margin-inline: auto;
4
- /* Declared explicitly rather than inherited from a host reset: `maxWidth`
5
- and `padding` land on this same element, so whether the max-width bound
6
- includes the padding must not depend on whether the consuming app ships
7
- a global `box-sizing` reset. @sovereignfs/ui is usable standalone
8
- (task 9.17), where no such reset is guaranteed. Same reason Input,
9
- Select, Combobox, DatePicker, and FileDropzone each set it locally. */
10
- box-sizing: border-box;
11
- }
12
-
13
- /* ── Max width ──────────────────────────────────────────────────────────── */
14
-
15
- /* Outer bound, padding included (see box-sizing above): `md` + `padding="md"`
16
- yields a 960px box with 896px of content, not 1024px. */
17
-
18
- .sm {
19
- max-width: 640px;
20
- }
21
-
22
- .md {
23
- max-width: 960px;
24
- }
25
-
26
- .lg {
27
- max-width: 1200px;
28
- }
29
-
30
- .full {
31
- max-width: none;
32
- }
33
-
34
- /* ── Padding ────────────────────────────────────────────────────────────── */
35
-
36
- /* The page gutter, owned by the plugin rather than the runtime shell
37
- (task 9.25). `md` reproduces the exact values the shell used to apply
38
- (--sv-space-8 desktop / --sv-space-4 mobile), so a bare <PageContainer>
39
- renders identically to a pre-9.25 plugin that relied on the shell.
40
-
41
- A fixed four-step scale, deliberately: the review behind task 9.18 found
42
- four different ad-hoc padding combinations across plugins, and a free-form
43
- value would relocate that inconsistency from CSS modules into JSX.
44
-
45
- --sv-page-gutter is the stand-down hook for an ancestor that *already*
46
- supplies the gutter: Dialog sets it to 0 on its content region, so an
47
- overlay plugin whose page is one tree rendered into two hosts — the
48
- Dialog on soft navigation, the runtime shell on a hard load — is padded
49
- exactly once in both, with no prop threading and no knowledge of which
50
- host it is in. Setting it to anything other than 0 defeats the fixed
51
- scale above and is not a supported use. */
52
-
53
- .padNone {
54
- padding: 0;
55
- }
56
-
57
- .padSm {
58
- padding: var(--sv-page-gutter, var(--sv-space-4));
59
- }
60
-
61
- .padMd {
62
- padding: var(--sv-page-gutter, var(--sv-space-8));
63
- }
64
-
65
- .padLg {
66
- padding: var(--sv-page-gutter, var(--sv-space-12));
67
- }
68
-
69
- /* Matches the breakpoint Dialog, MobileHeader, and MobileFooter already use. */
70
- @media (max-width: 768px) {
71
- .padSm {
72
- padding: var(--sv-page-gutter, var(--sv-space-3));
73
- }
74
-
75
- .padMd {
76
- padding: var(--sv-page-gutter, var(--sv-space-4));
77
- }
78
-
79
- .padLg {
80
- padding: var(--sv-page-gutter, var(--sv-space-6));
81
- }
82
- }
@@ -1,64 +0,0 @@
1
- import type { HTMLAttributes, ReactNode } from 'react';
2
- import styles from './PageContainer.module.css';
3
-
4
- export interface PageContainerProps extends HTMLAttributes<HTMLDivElement> {
5
- /**
6
- * Constrains and centers content width. The bound includes `padding`
7
- * (the container is `border-box`). Defaults to `'full'` — narrowing is
8
- * opt-in, so wrapping a page in `PageContainer` never silently clamps it.
9
- */
10
- maxWidth?: 'sm' | 'md' | 'lg' | 'full';
11
- /**
12
- * The page gutter. Responsive — each step is tighter at ≤768px. Defaults
13
- * to `'md'`, which is exactly what the runtime shell used to apply
14
- * (`--sv-space-8` desktop / `--sv-space-4` mobile), so a bare
15
- * `<PageContainer>` is the correct wrapper for a plugin that previously
16
- * relied on the shell for its padding.
17
- *
18
- * Use `'none'` when an ancestor already supplies the gutter — inside a
19
- * `Dialog`, whose own content region is padded.
20
- */
21
- padding?: 'none' | 'sm' | 'md' | 'lg';
22
- children: ReactNode;
23
- }
24
-
25
- const maxWidthClass: Record<NonNullable<PageContainerProps['maxWidth']>, string> = {
26
- sm: styles.sm as string,
27
- md: styles.md as string,
28
- lg: styles.lg as string,
29
- full: styles.full as string,
30
- };
31
-
32
- const paddingClass: Record<NonNullable<PageContainerProps['padding']>, string> = {
33
- none: styles.padNone as string,
34
- sm: styles.padSm as string,
35
- md: styles.padMd as string,
36
- lg: styles.padLg as string,
37
- };
38
-
39
- /**
40
- * The shared page wrapper every plugin's own layout or page renders through.
41
- *
42
- * A plugin owns its page gutter; the runtime shell does not impose one
43
- * (task 9.25). The shell still reserves space for chrome a plugin cannot
44
- * know about — the offline banner's height and the mobile footer's — but it
45
- * contributes no inset of its own, so this component is the single place a
46
- * plugin's four-sided padding comes from.
47
- */
48
- export function PageContainer({
49
- maxWidth = 'full',
50
- padding = 'md',
51
- className,
52
- children,
53
- ...rest
54
- }: PageContainerProps) {
55
- const cls = [styles.container, maxWidthClass[maxWidth], paddingClass[padding], className]
56
- .filter(Boolean)
57
- .join(' ');
58
-
59
- return (
60
- <div className={cls} {...rest}>
61
- {children}
62
- </div>
63
- );
64
- }
@@ -1,70 +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 { PageContainer } from '../PageContainer';
5
-
6
- afterEach(cleanup);
7
-
8
- /** Classes are unhashed under Vitest's CSS-module transform, so compare token
9
- * membership rather than substrings — `toContain('md')` would also match
10
- * `padMd`, which is exactly the confusion these two prop scales invite. */
11
- function classes(el: Element): string[] {
12
- return el.className.split(/\s+/).filter(Boolean);
13
- }
14
-
15
- describe('PageContainer', () => {
16
- it('renders its children', () => {
17
- render(<PageContainer>content</PageContainer>);
18
- expect(screen.getByText('content')).toBeDefined();
19
- });
20
-
21
- it('defaults to full max-width, so wrapping a page never silently clamps it', () => {
22
- render(<PageContainer>content</PageContainer>);
23
- expect(classes(screen.getByText('content'))).toContain('full');
24
- });
25
-
26
- it('defaults to md padding — the gutter the runtime shell used to apply', () => {
27
- render(<PageContainer>content</PageContainer>);
28
- expect(classes(screen.getByText('content'))).toContain('padMd');
29
- });
30
-
31
- it('applies sm, md, and lg max-width classes', () => {
32
- const { rerender } = render(<PageContainer maxWidth="sm">content</PageContainer>);
33
- expect(classes(screen.getByText('content'))).toContain('sm');
34
- rerender(<PageContainer maxWidth="md">content</PageContainer>);
35
- expect(classes(screen.getByText('content'))).toContain('md');
36
- rerender(<PageContainer maxWidth="lg">content</PageContainer>);
37
- expect(classes(screen.getByText('content'))).toContain('lg');
38
- });
39
-
40
- it('applies none, sm, and lg padding classes', () => {
41
- const { rerender } = render(<PageContainer padding="none">content</PageContainer>);
42
- expect(classes(screen.getByText('content'))).toContain('padNone');
43
- rerender(<PageContainer padding="sm">content</PageContainer>);
44
- expect(classes(screen.getByText('content'))).toContain('padSm');
45
- rerender(<PageContainer padding="lg">content</PageContainer>);
46
- expect(classes(screen.getByText('content'))).toContain('padLg');
47
- });
48
-
49
- it('composes max-width and padding independently', () => {
50
- render(
51
- <PageContainer maxWidth="sm" padding="none">
52
- content
53
- </PageContainer>,
54
- );
55
- const cls = classes(screen.getByText('content'));
56
- expect(cls).toContain('sm');
57
- expect(cls).toContain('padNone');
58
- expect(cls).not.toContain('padSm');
59
- });
60
-
61
- it('forwards className and other div props', () => {
62
- render(
63
- <PageContainer className="custom" data-testid="container">
64
- content
65
- </PageContainer>,
66
- );
67
- const el = screen.getByTestId('container');
68
- expect(classes(el)).toContain('custom');
69
- });
70
- });
@@ -1,86 +0,0 @@
1
- .header {
2
- display: flex;
3
- align-items: flex-start;
4
- justify-content: space-between;
5
- gap: var(--sv-space-4);
6
- margin-bottom: var(--sv-space-6);
7
- }
8
-
9
- .text {
10
- display: flex;
11
- flex-direction: column;
12
- gap: var(--sv-space-1);
13
- min-width: 0;
14
- }
15
-
16
- /* Wraps the optional icon + `.title` so the icon sizes/aligns itself
17
- without touching `.title`'s own rules — every existing icon-less usage
18
- renders identically, since a single flex child behaves the same as a
19
- non-flex one. */
20
- .titleRow {
21
- display: flex;
22
- align-items: center;
23
- gap: var(--sv-space-2);
24
- color: var(--sv-color-text-primary);
25
- }
26
-
27
- .title {
28
- margin: 0;
29
- font-size: var(--sv-font-size-2xl);
30
- font-weight: var(--sv-font-weight-semibold);
31
- color: var(--sv-color-text-primary);
32
- line-height: 1.2;
33
- }
34
-
35
- .description {
36
- margin: 0;
37
- font-size: var(--sv-font-size-sm);
38
- color: var(--sv-color-text-muted);
39
- }
40
-
41
- .action {
42
- flex-shrink: 0;
43
- }
44
-
45
- /* ── Mobile ─────────────────────────────────────────────────────────────── */
46
- /* A compact single row — back (optional) + title + action (optional) —
47
- generalized from Kanban's own hand-rolled MobileBoardHeader. Deliberately
48
- no description handling and no border; stays consistent with .header's
49
- own minimal, borderless treatment, just tighter. */
50
-
51
- .mobileHeader {
52
- display: flex;
53
- align-items: center;
54
- gap: var(--sv-space-2);
55
- margin-bottom: var(--sv-space-3);
56
- }
57
-
58
- .mobileBack {
59
- flex-shrink: 0;
60
- }
61
-
62
- .mobileTitleIcon {
63
- flex-shrink: 0;
64
- color: var(--sv-color-text-primary);
65
- }
66
-
67
- .mobileTitle {
68
- flex: 1;
69
- min-width: 0;
70
- margin: 0;
71
- overflow: hidden;
72
- text-overflow: ellipsis;
73
- white-space: nowrap;
74
- font-size: var(--sv-font-size-md);
75
- font-weight: var(--sv-font-weight-semibold);
76
- color: var(--sv-color-text-primary);
77
- line-height: 1.2;
78
- }
79
-
80
- .mobileAction {
81
- flex-shrink: 0;
82
- }
83
-
84
- .mobileMenu {
85
- flex-shrink: 0;
86
- }
@@ -1,176 +0,0 @@
1
- 'use client';
2
-
3
- import type { ReactNode } from 'react';
4
- import { Button } from '../Button/Button';
5
- import { Icon } from '../Icon/Icon';
6
- import type { IconName } from '../Icon/Icon';
7
- import { ResponsiveSurface } from '../ResponsiveSurface/ResponsiveSurface';
8
- import styles from './PageHeader.module.css';
9
-
10
- export interface PageHeaderProps {
11
- title: string;
12
- description?: string;
13
- /** Optional icon rendered inline before the title text, on both breakpoints — e.g. `folder-open` next to a folder's name. */
14
- icon?: IconName;
15
- /**
16
- * Page-level controls — anywhere from one button to a whole toolbar.
17
- * Renders on both breakpoints unchanged; if it needs to look different on
18
- * mobile (e.g. collapsing into its own "⋮" trigger), that's the action
19
- * content's own responsibility — same pattern Shopper's `ListHeaderActions`
20
- * already follows (it calls `useIsMobile()` internally). `PageHeader`
21
- * itself has no opinion on what's inside this slot.
22
- */
23
- action?: ReactNode;
24
- className?: string;
25
- /** Heading level for the title. Defaults to `1` for standalone use; pass
26
- * `2` or `3` when the page already sits under a shell/plugin `<h1>`, to
27
- * avoid a duplicate top-level heading. Visual style is unchanged at every
28
- * level — only the rendered tag changes. Applies on both breakpoints. */
29
- headingLevel?: 1 | 2 | 3;
30
- /** Mobile only — shows a back button (calling this) to the left of the
31
- * title when provided. Omit it to render without one. */
32
- onBack?: () => void;
33
- /** Mobile only — shows a vertical-ellipsis icon button (calling this) at
34
- * the far right when provided, typically to open a drawer/menu. PageHeader
35
- * has no opinion on what that menu contains — it only renders the trigger
36
- * and calls back. Separate from `action`, which renders identically on
37
- * both breakpoints; this is a mobile-only affordance with no web
38
- * equivalent. */
39
- onMenuClick?: () => void;
40
- }
41
-
42
- const HEADING_TAG = { 1: 'h1', 2: 'h2', 3: 'h3' } as const;
43
-
44
- interface PageHeaderWebProps {
45
- title: string;
46
- description?: string;
47
- icon?: IconName;
48
- action?: ReactNode;
49
- headingLevel: 1 | 2 | 3;
50
- className?: string;
51
- }
52
-
53
- // internal — not exported
54
- function PageHeaderWeb({
55
- title,
56
- description,
57
- icon,
58
- action,
59
- headingLevel,
60
- className,
61
- }: PageHeaderWebProps) {
62
- const Heading = HEADING_TAG[headingLevel];
63
- return (
64
- <header className={[styles.header, className].filter(Boolean).join(' ')}>
65
- <div className={styles.text}>
66
- <div className={styles.titleRow}>
67
- {icon && <Icon name={icon} size="lg" aria-hidden={true} />}
68
- <Heading className={styles.title}>{title}</Heading>
69
- </div>
70
- {description && <p className={styles.description}>{description}</p>}
71
- </div>
72
- {action && <div className={styles.action}>{action}</div>}
73
- </header>
74
- );
75
- }
76
-
77
- interface PageHeaderMobileProps {
78
- title: string;
79
- icon?: IconName;
80
- action?: ReactNode;
81
- headingLevel: 1 | 2 | 3;
82
- onBack?: () => void;
83
- onMenuClick?: () => void;
84
- className?: string;
85
- }
86
-
87
- // internal — not exported
88
- // No `description` here, deliberately — matches the one real mobile
89
- // page-header precedent this was generalized from (Kanban's own
90
- // MobileBoardHeader), which has no subtitle handling either. A single
91
- // fixed-shape row, consistent with every other mobile chrome bar in this
92
- // design system rather than a variable-height two-line header.
93
- function PageHeaderMobile({
94
- title,
95
- icon,
96
- action,
97
- headingLevel,
98
- onBack,
99
- onMenuClick,
100
- className,
101
- }: PageHeaderMobileProps) {
102
- const Heading = HEADING_TAG[headingLevel];
103
- return (
104
- <header className={[styles.mobileHeader, className].filter(Boolean).join(' ')}>
105
- {onBack && (
106
- <Button
107
- variant="ghost"
108
- size="sm"
109
- aria-label="Back"
110
- onClick={onBack}
111
- className={styles.mobileBack}
112
- >
113
- <Icon name="circle-chevron-left" size="md" aria-hidden />
114
- </Button>
115
- )}
116
- {icon && <Icon name={icon} size="md" aria-hidden={true} className={styles.mobileTitleIcon} />}
117
- <Heading className={styles.mobileTitle}>{title}</Heading>
118
- {action && <div className={styles.mobileAction}>{action}</div>}
119
- {onMenuClick && (
120
- <Button
121
- variant="ghost"
122
- size="sm"
123
- aria-label="Menu"
124
- onClick={onMenuClick}
125
- className={styles.mobileMenu}
126
- >
127
- <Icon name="ellipsis-vertical" size="md" aria-hidden />
128
- </Button>
129
- )}
130
- </header>
131
- );
132
- }
133
-
134
- /**
135
- * PageHeader — a page's title section. Web: title + description on the
136
- * left, action on the right. Mobile: an optional back button, a single-line
137
- * title, and the same action slot — a compact single row, matching Kanban's
138
- * own hand-rolled MobileBoardHeader this was generalized from. The
139
- * web/mobile fork is `ResponsiveSurface` — only one tree is ever mounted.
140
- */
141
- export function PageHeader({
142
- title,
143
- description,
144
- icon,
145
- action,
146
- className,
147
- headingLevel = 1,
148
- onBack,
149
- onMenuClick,
150
- }: PageHeaderProps) {
151
- return (
152
- <ResponsiveSurface
153
- web={
154
- <PageHeaderWeb
155
- title={title}
156
- description={description}
157
- icon={icon}
158
- action={action}
159
- headingLevel={headingLevel}
160
- className={className}
161
- />
162
- }
163
- mobile={
164
- <PageHeaderMobile
165
- title={title}
166
- icon={icon}
167
- action={action}
168
- headingLevel={headingLevel}
169
- onBack={onBack}
170
- onMenuClick={onMenuClick}
171
- className={className}
172
- />
173
- }
174
- />
175
- );
176
- }
@@ -1,103 +0,0 @@
1
- // @vitest-environment jsdom
2
- import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
3
- import { cleanup, fireEvent, render, screen } from '@testing-library/react';
4
- import { PageHeader } from '../PageHeader';
5
-
6
- let matches = false;
7
-
8
- function installMatchMedia() {
9
- vi.stubGlobal(
10
- 'matchMedia',
11
- vi.fn().mockImplementation((query: string) => ({
12
- matches,
13
- media: query,
14
- addEventListener: vi.fn(),
15
- removeEventListener: vi.fn(),
16
- addListener: vi.fn(),
17
- removeListener: vi.fn(),
18
- dispatchEvent: vi.fn(),
19
- })),
20
- );
21
- }
22
-
23
- describe('PageHeader', () => {
24
- beforeEach(() => {
25
- matches = false;
26
- installMatchMedia();
27
- });
28
- afterEach(() => {
29
- vi.unstubAllGlobals();
30
- cleanup();
31
- });
32
-
33
- it('web: renders title, description, and action', () => {
34
- render(
35
- <PageHeader
36
- title="Users"
37
- description="Manage who has access to this instance."
38
- action={<button type="button">Invite user</button>}
39
- />,
40
- );
41
-
42
- expect(screen.getByRole('heading', { name: 'Users' })).toBeDefined();
43
- expect(screen.getByText('Manage who has access to this instance.')).toBeDefined();
44
- expect(screen.getByRole('button', { name: 'Invite user' })).toBeDefined();
45
- });
46
-
47
- it('web: renders no back button even when onBack is given', () => {
48
- render(<PageHeader title="Users" onBack={() => undefined} />);
49
-
50
- expect(screen.queryByRole('button', { name: 'Back' })).toBeNull();
51
- });
52
-
53
- it('mobile: renders no description, no back button, no menu button by default', () => {
54
- matches = true;
55
- installMatchMedia();
56
-
57
- render(<PageHeader title="Users" description="Manage who has access to this instance." />);
58
-
59
- expect(screen.getByRole('heading', { name: 'Users' })).toBeDefined();
60
- expect(screen.queryByText('Manage who has access to this instance.')).toBeNull();
61
- expect(screen.queryByRole('button', { name: 'Back' })).toBeNull();
62
- expect(screen.queryByRole('button', { name: 'Menu' })).toBeNull();
63
- });
64
-
65
- it('mobile: renders a back button that calls onBack when given', () => {
66
- matches = true;
67
- installMatchMedia();
68
- const onBack = vi.fn();
69
-
70
- render(<PageHeader title="Users" onBack={onBack} />);
71
-
72
- const back = screen.getByRole('button', { name: 'Back' });
73
- fireEvent.click(back);
74
- expect(onBack).toHaveBeenCalledOnce();
75
- });
76
-
77
- it('mobile: renders a menu button that calls onMenuClick when given', () => {
78
- matches = true;
79
- installMatchMedia();
80
- const onMenuClick = vi.fn();
81
-
82
- render(<PageHeader title="Users" onMenuClick={onMenuClick} />);
83
-
84
- const menu = screen.getByRole('button', { name: 'Menu' });
85
- fireEvent.click(menu);
86
- expect(onMenuClick).toHaveBeenCalledOnce();
87
- });
88
-
89
- it('web: renders no menu button even when onMenuClick is given', () => {
90
- render(<PageHeader title="Users" onMenuClick={() => undefined} />);
91
-
92
- expect(screen.queryByRole('button', { name: 'Menu' })).toBeNull();
93
- });
94
-
95
- it('mobile: renders the same action content as web', () => {
96
- matches = true;
97
- installMatchMedia();
98
-
99
- render(<PageHeader title="Users" action={<button type="button">Invite user</button>} />);
100
-
101
- expect(screen.getByRole('button', { name: 'Invite user' })).toBeDefined();
102
- });
103
- });
@@ -1,51 +0,0 @@
1
- .root {
2
- display: flex;
3
- flex-direction: column;
4
- min-width: 100%;
5
- min-height: 100%;
6
- }
7
-
8
- .header {
9
- flex-shrink: 0;
10
- }
11
-
12
- .content {
13
- flex: 1;
14
- }
15
-
16
- /* ── Padding ────────────────────────────────────────────────────────────── */
17
- /* Same four-step scale and --sv-page-gutter stand-down hook as
18
- PageContainer (see that component's own CSS comment for the full
19
- rationale) — kept identical so this can absorb PageContainer's role
20
- later without a behavior change for existing consumers. */
21
-
22
- .padNone {
23
- padding: 0;
24
- }
25
-
26
- .padSm {
27
- padding: var(--sv-page-gutter, var(--sv-space-4));
28
- }
29
-
30
- .padMd {
31
- padding: var(--sv-page-gutter, var(--sv-space-8));
32
- }
33
-
34
- .padLg {
35
- padding: var(--sv-page-gutter, var(--sv-space-12));
36
- }
37
-
38
- /* Matches the breakpoint Dialog, MobileHeader, and MobileFooter already use. */
39
- @media (max-width: 768px) {
40
- .padSm {
41
- padding: var(--sv-page-gutter, var(--sv-space-3));
42
- }
43
-
44
- .padMd {
45
- padding: var(--sv-page-gutter, var(--sv-space-4));
46
- }
47
-
48
- .padLg {
49
- padding: var(--sv-page-gutter, var(--sv-space-6));
50
- }
51
- }