@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
- /* Matches the runtime shell's own Apps drawer grid exactly
2
- (runtime/app/(platform)/_components/MobileNav.module.css's .drawerGrid/
3
- .drawerGridItem/.drawerGridIcon/.drawerGridName) — this component is
4
- meant to replace that hand-rolled markup for any consumer building its
5
- own Apps-style launcher. No header row — see the component's own doc
6
- comment for why. */
7
-
8
- .grid {
9
- list-style: none;
10
- margin: 0;
11
- /* Matches the reference `.drawerGrid`'s own padding exactly — its
12
- surrounding `Drawer` also has no header row (no `title` passed either),
13
- so "no header row" can't actually explain padding this component used
14
- to carry well past the reference's own (`--sv-space-1`/`--sv-space-10`
15
- vs the reference's `--sv-space-2`/`--sv-space-6`) — found live, this
16
- component's grid visibly read as more tightly hugging the handle and
17
- noticeably more padded at the bottom than the reference's side by side.
18
- Drawer's own panel already adds env(safe-area-inset-bottom) below
19
- everything, so this is on top of that, not instead of it. */
20
- padding: var(--sv-space-2) var(--sv-space-4) var(--sv-space-6);
21
- display: grid;
22
- grid-template-columns: repeat(3, 1fr);
23
- row-gap: var(--sv-space-5);
24
- }
25
-
26
- .gridItem {
27
- display: flex;
28
- flex-direction: column;
29
- align-items: center;
30
- gap: var(--sv-space-2);
31
- padding: var(--sv-space-1);
32
- border: none;
33
- background: none;
34
- text-decoration: none;
35
- color: var(--sv-color-text-primary);
36
- font: inherit;
37
- cursor: pointer;
38
- width: 100%;
39
- }
40
-
41
- @media (hover: hover) {
42
- .gridItem:hover .gridIcon {
43
- background: var(--sv-color-border);
44
- }
45
- }
46
-
47
- .gridItem:focus-visible {
48
- outline: 2px solid var(--sv-color-focus-ring);
49
- outline-offset: 2px;
50
- border-radius: var(--sv-radius-md);
51
- }
52
-
53
- /* color: text-primary, not text-muted — the reference's own drawerGridIcon
54
- uses text-muted only as its monogram-fallback text color for <img>-less
55
- plugin icons (raster <img> icons don't inherit CSS color at all, so that
56
- value never actually painted a real icon). Every tile here renders a real
57
- stroke icon via the Icon component (currentColor), which does inherit —
58
- matching the reference's own explicit override for that exact case
59
- (.drawerGridIconSettings, used by its Console tile) rather than the
60
- fallback default. */
61
- .gridIcon {
62
- display: flex;
63
- align-items: center;
64
- justify-content: center;
65
- width: 56px;
66
- height: 56px;
67
- border-radius: 14px;
68
- background: var(--sv-color-surface-sunken);
69
- font-size: var(--sv-font-size-sm);
70
- font-weight: var(--sv-font-weight-semibold);
71
- color: var(--sv-color-text-primary);
72
- transition: background 0.1s;
73
- }
74
-
75
- .gridName {
76
- font-size: var(--sv-font-size-sm);
77
- text-align: center;
78
- color: var(--sv-color-text-primary);
79
- line-height: 1.3;
80
- word-break: break-word;
81
- max-width: 80px;
82
- }
@@ -1,78 +0,0 @@
1
- import type { ReactNode } from 'react';
2
- import { Drawer } from '../Drawer/Drawer';
3
- import styles from './MobileAppsDrawer.module.css';
4
-
5
- export interface MobileAppsDrawerItem {
6
- /** Stable identity for this tile — used as the React key. */
7
- key: string;
8
- icon: ReactNode;
9
- label: string;
10
- /** Renders an `<a>` when set; otherwise a `<button>` calling `onClick`. */
11
- href?: string;
12
- onClick?: () => void;
13
- }
14
-
15
- export interface MobileAppsDrawerProps {
16
- open: boolean;
17
- onClose: () => void;
18
- /** Accessible name for the drawer panel — required since there's no
19
- * visible title to fall back to (Drawer's grab handle plus swipe-down /
20
- * scrim-tap already cover dismissal, so no header row is rendered). */
21
- 'aria-label': string;
22
- /** The grid tiles — supplied by the consumer (e.g. installed plugins,
23
- * a plugin's own sections). MobileAppsDrawer owns only the drawer
24
- * chrome/grid layout, never the item list itself. */
25
- items: MobileAppsDrawerItem[];
26
- }
27
-
28
- function DrawerGridTile({ icon, label, href, onClick }: Omit<MobileAppsDrawerItem, 'key'>) {
29
- const content = (
30
- <>
31
- <span className={styles.gridIcon} aria-hidden="true">
32
- {icon}
33
- </span>
34
- <span className={styles.gridName}>{label}</span>
35
- </>
36
- );
37
- if (href) {
38
- return (
39
- <a href={href} className={styles.gridItem} onClick={onClick}>
40
- {content}
41
- </a>
42
- );
43
- }
44
- return (
45
- <button type="button" className={styles.gridItem} onClick={onClick}>
46
- {content}
47
- </button>
48
- );
49
- }
50
-
51
- /**
52
- * The mobile "Apps" drawer: a bottom sheet with a 3-column grid of icon
53
- * tiles — same tile size (56px, radius 14px) and grid layout as the runtime
54
- * shell's own Apps drawer (MobileNav's Drawer content), generalized so the
55
- * tile list comes from the consumer (the shell passes installed plugins; a
56
- * plugin composing its own MobileFooter launcher passes whatever its own
57
- * "apps" are, e.g. a section index) rather than being hardcoded to plugins
58
- * specifically. No header row (title/close button) — Drawer's own grab
59
- * handle plus swipe-down/scrim-tap dismissal are enough, and a header ate
60
- * into the limited vertical space a launcher grid needs most.
61
- */
62
- export function MobileAppsDrawer({ open, onClose, items, ...rest }: MobileAppsDrawerProps) {
63
- const ariaLabel = rest['aria-label'];
64
-
65
- return (
66
- <Drawer open={open} onClose={onClose} aria-label={ariaLabel}>
67
- <nav aria-label={ariaLabel}>
68
- <ul className={styles.grid}>
69
- {items.map(({ key, ...item }) => (
70
- <li key={key}>
71
- <DrawerGridTile key={key} {...item} />
72
- </li>
73
- ))}
74
- </ul>
75
- </nav>
76
- </Drawer>
77
- );
78
- }
@@ -1,80 +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 { MobileAppsDrawer } from '../MobileAppsDrawer';
5
-
6
- // Drawer's exit animation reads prefers-reduced-motion via matchMedia, which
7
- // jsdom does not implement — see Drawer's own test for the full rationale.
8
- function installMatchMedia() {
9
- vi.stubGlobal(
10
- 'matchMedia',
11
- vi.fn().mockImplementation((query: string) => ({
12
- matches: false,
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
- function installPointerCapture() {
24
- if (!Element.prototype.setPointerCapture) {
25
- Element.prototype.setPointerCapture = () => {};
26
- }
27
- if (!Element.prototype.releasePointerCapture) {
28
- Element.prototype.releasePointerCapture = () => {};
29
- }
30
- }
31
-
32
- const items = [
33
- { key: 'home', icon: <span>icon</span>, label: 'Home', href: '/home' },
34
- { key: 'notes', icon: <span>icon</span>, label: 'Notes', onClick: vi.fn() },
35
- ];
36
-
37
- describe('MobileAppsDrawer', () => {
38
- beforeEach(() => {
39
- installMatchMedia();
40
- installPointerCapture();
41
- });
42
- afterEach(() => {
43
- vi.unstubAllGlobals();
44
- cleanup();
45
- });
46
-
47
- it('renders nothing when closed', () => {
48
- render(
49
- <MobileAppsDrawer open={false} onClose={() => {}} aria-label="Sections" items={items} />,
50
- );
51
- expect(screen.queryByRole('dialog')).toBeNull();
52
- });
53
-
54
- it('renders every item when open, with no header title or close button', () => {
55
- render(<MobileAppsDrawer open onClose={() => {}} aria-label="Sections" items={items} />);
56
-
57
- expect(screen.getByRole('dialog', { name: 'Sections' })).toBeDefined();
58
- expect(screen.getByText('Home')).toBeDefined();
59
- expect(screen.getByText('Notes')).toBeDefined();
60
- expect(screen.queryByRole('button', { name: 'Close' })).toBeNull();
61
- });
62
-
63
- it('renders an href item as a link and an onClick item as a button', () => {
64
- render(<MobileAppsDrawer open onClose={() => {}} aria-label="Sections" items={items} />);
65
-
66
- const link = screen.getByText('Home').closest('a');
67
- expect(link).not.toBeNull();
68
- expect(link?.getAttribute('href')).toBe('/home');
69
-
70
- const button = screen.getByText('Notes').closest('button');
71
- expect(button).not.toBeNull();
72
- });
73
-
74
- it('calls the item onClick handler when pressed', () => {
75
- render(<MobileAppsDrawer open onClose={() => {}} aria-label="Sections" items={items} />);
76
-
77
- fireEvent.click(screen.getByText('Notes'));
78
- expect(items[1]?.onClick).toHaveBeenCalledTimes(1);
79
- });
80
- });
@@ -1,73 +0,0 @@
1
- .footer {
2
- display: flex;
3
- align-items: center;
4
- width: 100%;
5
- /* Mobile-only component — never render wider than the platform's own
6
- mobile breakpoint, even if a consumer accidentally mounts it in a wider
7
- container (e.g. an un-gated preview). At real mobile widths this is a
8
- no-op since the viewport itself is already narrower. */
9
- max-width: 768px;
10
- margin-inline: auto;
11
- min-height: var(--sv-shell-footer-height, 60px);
12
- padding: 0 var(--sv-space-4);
13
- padding-bottom: max(var(--sv-space-2), env(safe-area-inset-bottom));
14
- background-color: var(--sv-color-surface);
15
- border-top: var(--sv-border-width-hairline) solid var(--sv-color-border);
16
- position: relative;
17
- z-index: 101;
18
- }
19
-
20
- .navItem {
21
- display: flex;
22
- align-items: center;
23
- justify-content: center;
24
- flex: 1;
25
- min-height: 52px;
26
- border: none;
27
- background: transparent;
28
- color: var(--sv-color-text-muted);
29
- font: inherit;
30
- cursor: pointer;
31
- text-decoration: none;
32
- border-radius: var(--sv-radius-md);
33
- transition: color 0.1s;
34
- outline: none;
35
- }
36
-
37
- @media (hover: hover) {
38
- .navItem:hover {
39
- color: var(--sv-color-text-primary);
40
- }
41
- }
42
-
43
- .navItem:focus-visible {
44
- outline: 2px solid var(--sv-color-focus-ring);
45
- outline-offset: -2px;
46
- }
47
-
48
- .navItemActive {
49
- color: var(--sv-color-text-primary);
50
- }
51
-
52
- .navItemApps {
53
- position: relative;
54
- }
55
-
56
- .navItemAppsOpen {
57
- color: var(--sv-color-text-primary);
58
- }
59
-
60
- .navItemAppsOpen::before {
61
- content: '';
62
- position: absolute;
63
- width: 48px;
64
- height: 48px;
65
- border-radius: var(--sv-radius-full);
66
- background: var(--sv-color-surface-sunken);
67
- }
68
-
69
- .navItemAppsOpen svg,
70
- .navItemAppsOpen img {
71
- position: relative;
72
- z-index: 1;
73
- }
@@ -1,47 +0,0 @@
1
- import { useState } from 'react';
2
- import type { Meta, StoryObj } from '@storybook/react-vite';
3
- import { MobileFooter } from './MobileFooter';
4
- import { Icon } from '../Icon/Icon';
5
-
6
- const homeIcon = { icon: <Icon name="house" size="md" aria-hidden />, label: 'Home', active: true };
7
- const searchIcon = { icon: <Icon name="search" size="md" aria-hidden />, label: 'Search' };
8
- const calendarIcon = { icon: <Icon name="calendar" size="md" aria-hidden />, label: 'Calendar' };
9
- const activityIcon = { icon: <Icon name="activity" size="md" aria-hidden />, label: 'Activity' };
10
-
11
- const meta = {
12
- title: 'Components/MobileFooter',
13
- component: MobileFooter,
14
- parameters: {
15
- layout: 'padded',
16
- docs: {
17
- description: {
18
- component:
19
- 'Mobile shell footer nav row (RFC 0088). The centered launcher (onOpenApps) is always rendered; leftIcons/rightIcons take 1 or 2 items each, symmetric so the launcher stays centered. Presentational only, no data fetching.',
20
- },
21
- },
22
- },
23
- args: {
24
- onOpenApps: () => {},
25
- leftIcons: [homeIcon],
26
- rightIcons: [searchIcon],
27
- },
28
- } satisfies Meta<typeof MobileFooter>;
29
-
30
- export default meta;
31
- type Story = StoryObj<typeof meta>;
32
-
33
- export const Default: Story = {};
34
-
35
- export const FiveIcons: Story = {
36
- args: {
37
- leftIcons: [homeIcon, calendarIcon],
38
- rightIcons: [searchIcon, activityIcon],
39
- },
40
- };
41
-
42
- export const LauncherOpen: Story = {
43
- render: function Render(args) {
44
- const [open, setOpen] = useState(true);
45
- return <MobileFooter {...args} launcherOpen={open} onOpenApps={() => setOpen((v) => !v)} />;
46
- },
47
- };
@@ -1,122 +0,0 @@
1
- 'use client';
2
-
3
- import { useRef, type HTMLAttributes, type ReactNode } from 'react';
4
- import { Icon } from '../Icon/Icon';
5
- import { usePublishShellChromeHeight } from '../../hooks/usePublishShellChromeHeight';
6
- import styles from './MobileFooter.module.css';
7
-
8
- export interface FooterIcon {
9
- icon: ReactNode;
10
- label: string;
11
- href?: string;
12
- onClick?: () => void;
13
- active?: boolean;
14
- }
15
-
16
- export interface MobileFooterProps extends HTMLAttributes<HTMLElement> {
17
- /** Opens the app drawer/launcher. Always rendered as the centered slot;
18
- * not overridable. */
19
- onOpenApps: () => void;
20
- /** Custom launcher icon (e.g. a plugin-supplied image). Defaults to a
21
- * generic grid icon. */
22
- launcherIcon?: ReactNode;
23
- /** Whether the launcher's own drawer is currently open (applies the
24
- * pressed/active visual state). */
25
- launcherOpen?: boolean;
26
- /** 1 or 2 icons rendered to the left of the centered launcher. */
27
- leftIcons: FooterIcon[];
28
- /** 1 or 2 icons rendered to the right of the centered launcher. Must match
29
- * `leftIcons.length` — the launcher stays visually centered, so a mismatch
30
- * is flagged (dev-mode only, never thrown) rather than silently allowed. */
31
- rightIcons: FooterIcon[];
32
- }
33
-
34
- function FooterNavItem({ icon, label, href, onClick, active }: FooterIcon) {
35
- const className = [styles.navItem, active ? styles.navItemActive : ''].filter(Boolean).join(' ');
36
- if (href) {
37
- return (
38
- <a
39
- href={href}
40
- className={className}
41
- aria-label={label}
42
- aria-current={active ? 'page' : undefined}
43
- >
44
- {icon}
45
- </a>
46
- );
47
- }
48
- return (
49
- <button type="button" className={className} aria-label={label} onClick={onClick}>
50
- {icon}
51
- </button>
52
- );
53
- }
54
-
55
- /**
56
- * The mobile footer bar: a centered, fixed "Apps" launcher flanked by 1 or 2
57
- * overridable icons on each side (3 or 5 total, matching standard
58
- * iOS/Android bottom-nav conventions). Owns its own chrome — background,
59
- * border-top, safe-area-aware bottom padding, and a 768px max-width (so it
60
- * never stretches full-bleed if mounted outside an actual mobile viewport)
61
- * — matching the runtime shell's own mobile footer (MobileNav) exactly,
62
- * since this component is meant to replace that hand-rolled markup.
63
- * Presentational only — no data fetching; the consumer owns the
64
- * drawer/overlay `onOpenApps` opens. See RFC 0088 for the
65
- * immutable/overridable boundary this enforces.
66
- *
67
- * Self-measures its own rendered height and publishes it as
68
- * `--sv-shell-footer-height` on the shell root — see
69
- * `usePublishShellChromeHeight`'s own doc comment for why this exists (it's
70
- * what makes a self-rendered footer, the `shellConfig.mobileFooter: false`
71
- * pattern, correctly clear `Sheet`/`Drawer`/`Dialog` instead of being
72
- * overlapped by them).
73
- */
74
- export function MobileFooter({
75
- onOpenApps,
76
- launcherIcon,
77
- launcherOpen,
78
- leftIcons,
79
- rightIcons,
80
- className,
81
- ...rest
82
- }: MobileFooterProps) {
83
- if (process.env.NODE_ENV !== 'production' && leftIcons.length !== rightIcons.length) {
84
- console.error(
85
- `MobileFooter: leftIcons (${leftIcons.length}) and rightIcons (${rightIcons.length}) ` +
86
- 'must have the same length so the launcher stays visually centered.',
87
- );
88
- }
89
-
90
- const navRef = useRef<HTMLElement>(null);
91
- usePublishShellChromeHeight(navRef, '--sv-shell-footer-height');
92
-
93
- const cls = [styles.footer, className].filter(Boolean).join(' ');
94
- const launcherClassName = [
95
- styles.navItem,
96
- styles.navItemApps,
97
- launcherOpen ? styles.navItemAppsOpen : '',
98
- ]
99
- .filter(Boolean)
100
- .join(' ');
101
-
102
- return (
103
- <nav {...rest} ref={navRef} className={cls} aria-label="App navigation">
104
- {leftIcons.map((item) => (
105
- <FooterNavItem key={item.label} {...item} />
106
- ))}
107
- <button
108
- type="button"
109
- className={launcherClassName}
110
- aria-label="Apps"
111
- aria-expanded={launcherOpen}
112
- aria-haspopup="dialog"
113
- onClick={onOpenApps}
114
- >
115
- {launcherIcon ?? <Icon name="grid-2x2" size="md" aria-hidden />}
116
- </button>
117
- {rightIcons.map((item) => (
118
- <FooterNavItem key={item.label} {...item} />
119
- ))}
120
- </nav>
121
- );
122
- }
@@ -1,129 +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 { MobileFooter } from '../MobileFooter';
5
-
6
- afterEach(() => {
7
- cleanup();
8
- vi.unstubAllEnvs();
9
- vi.restoreAllMocks();
10
- });
11
-
12
- const oneIcon = [{ icon: <span>icon</span>, label: 'Home' }];
13
- const twoIcons = [
14
- { icon: <span>icon</span>, label: 'Home' },
15
- { icon: <span>icon</span>, label: 'Calendar' },
16
- ];
17
- const leftTwo = [
18
- { icon: <span>icon</span>, label: 'Home' },
19
- { icon: <span>icon</span>, label: 'Calendar' },
20
- ];
21
- const rightTwo = [
22
- { icon: <span>icon</span>, label: 'Search' },
23
- { icon: <span>icon</span>, label: 'Activity' },
24
- ];
25
-
26
- describe('MobileFooter self-measured height', () => {
27
- afterEach(() => {
28
- document.getElementById('sv-app-shell')?.remove();
29
- });
30
-
31
- it('publishes its rendered height as --sv-shell-footer-height on #sv-app-shell', () => {
32
- const shell = document.createElement('div');
33
- shell.id = 'sv-app-shell';
34
- document.body.appendChild(shell);
35
- vi.spyOn(Element.prototype, 'getBoundingClientRect').mockReturnValue({
36
- height: 64,
37
- width: 0,
38
- top: 0,
39
- left: 0,
40
- right: 0,
41
- bottom: 0,
42
- x: 0,
43
- y: 0,
44
- toJSON() {},
45
- } as DOMRect);
46
-
47
- render(<MobileFooter onOpenApps={() => {}} leftIcons={oneIcon} rightIcons={oneIcon} />);
48
-
49
- expect(shell.style.getPropertyValue('--sv-shell-footer-height')).toBe('64px');
50
- });
51
-
52
- it('removes the override on unmount', () => {
53
- const shell = document.createElement('div');
54
- shell.id = 'sv-app-shell';
55
- document.body.appendChild(shell);
56
- vi.spyOn(Element.prototype, 'getBoundingClientRect').mockReturnValue({
57
- height: 64,
58
- width: 0,
59
- top: 0,
60
- left: 0,
61
- right: 0,
62
- bottom: 0,
63
- x: 0,
64
- y: 0,
65
- toJSON() {},
66
- } as DOMRect);
67
-
68
- const { unmount } = render(
69
- <MobileFooter onOpenApps={() => {}} leftIcons={oneIcon} rightIcons={oneIcon} />,
70
- );
71
- expect(shell.style.getPropertyValue('--sv-shell-footer-height')).toBe('64px');
72
-
73
- unmount();
74
- expect(shell.style.getPropertyValue('--sv-shell-footer-height')).toBe('');
75
- });
76
-
77
- it('never throws when #sv-app-shell is absent (Storybook, unit tests, other hosts)', () => {
78
- expect(() =>
79
- render(<MobileFooter onOpenApps={() => {}} leftIcons={oneIcon} rightIcons={oneIcon} />),
80
- ).not.toThrow();
81
- });
82
- });
83
-
84
- describe('MobileFooter', () => {
85
- it('always renders the centered launcher button', () => {
86
- render(<MobileFooter onOpenApps={() => {}} leftIcons={oneIcon} rightIcons={oneIcon} />);
87
-
88
- expect(screen.getByRole('button', { name: 'Apps' })).toBeDefined();
89
- });
90
-
91
- it('calls onOpenApps when the launcher is pressed', () => {
92
- const onOpenApps = vi.fn();
93
- render(<MobileFooter onOpenApps={onOpenApps} leftIcons={oneIcon} rightIcons={oneIcon} />);
94
-
95
- fireEvent.click(screen.getByRole('button', { name: 'Apps' }));
96
- expect(onOpenApps).toHaveBeenCalledTimes(1);
97
- });
98
-
99
- it('renders 1+1 and 2+2 icon layouts', () => {
100
- const { rerender } = render(
101
- <MobileFooter onOpenApps={() => {}} leftIcons={oneIcon} rightIcons={oneIcon} />,
102
- );
103
- expect(screen.getAllByRole('button').length).toBe(3);
104
-
105
- rerender(<MobileFooter onOpenApps={() => {}} leftIcons={leftTwo} rightIcons={rightTwo} />);
106
- expect(screen.getByLabelText('Calendar')).toBeDefined();
107
- expect(screen.getByLabelText('Activity')).toBeDefined();
108
- });
109
-
110
- it('logs a dev-mode console.error when left/right icon counts mismatch, but never throws', () => {
111
- vi.stubEnv('NODE_ENV', 'development');
112
- const errorSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
113
-
114
- expect(() =>
115
- render(<MobileFooter onOpenApps={() => {}} leftIcons={oneIcon} rightIcons={twoIcons} />),
116
- ).not.toThrow();
117
-
118
- expect(errorSpy).toHaveBeenCalledWith(expect.stringContaining('leftIcons'));
119
- });
120
-
121
- it('does not call console.error in production even with mismatched counts', () => {
122
- vi.stubEnv('NODE_ENV', 'production');
123
- const errorSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
124
-
125
- render(<MobileFooter onOpenApps={() => {}} leftIcons={oneIcon} rightIcons={twoIcons} />);
126
-
127
- expect(errorSpy).not.toHaveBeenCalled();
128
- });
129
- });
@@ -1,76 +0,0 @@
1
- .header {
2
- display: flex;
3
- align-items: center;
4
- justify-content: space-between;
5
- gap: var(--sv-space-3);
6
- width: 100%;
7
- /* Mobile-only component — never render wider than the platform's own
8
- mobile breakpoint, even if a consumer accidentally mounts it in a wider
9
- container (e.g. an un-gated preview). At real mobile widths this is a
10
- no-op since the viewport itself is already narrower. */
11
- max-width: 768px;
12
- margin-inline: auto;
13
- min-height: var(--sv-shell-header-height, 60px);
14
- padding: var(--sv-space-3) var(--sv-space-4);
15
- padding-top: max(var(--sv-space-3), env(safe-area-inset-top));
16
- padding-right: max(var(--sv-space-4), env(safe-area-inset-right));
17
- padding-left: max(var(--sv-space-4), env(safe-area-inset-left));
18
- background-color: var(--sv-color-surface);
19
- border-bottom: var(--sv-border-width-hairline) solid var(--sv-color-border);
20
- position: sticky;
21
- top: 0;
22
- z-index: 101;
23
- /* WebKit momentum-scroll re-tiling quirk: a position: sticky element with
24
- no compositing layer of its own can go stale/blank for a stretch of
25
- frames during a fast scroll on iOS Safari instead of repainting at its
26
- stuck position — only reachable when a consumer mounts this component
27
- inside its own scrolling container (the platform shell's own mobile
28
- header sits in a separate, non-scrolling grid row, so this is a no-op
29
- there; a plugin self-rendering this via shellConfig.mobileHeader: false
30
- inside a scrollable page is exactly the case this protects). Found and
31
- fixed across three sticky elements in sovereign-tasks before being
32
- applied here proactively — see docs/architecture-rules.md.
33
- translateZ(0) promotes it to its own layer, rasterized independently of
34
- the scroller's tile grid. */
35
- transform: translateZ(0);
36
- }
37
-
38
- .brandGroup {
39
- display: flex;
40
- align-items: center;
41
- gap: var(--sv-space-3);
42
- min-width: 0;
43
- }
44
-
45
- /* Matches the runtime shell's own .mobileBrandIcon (shell.module.css) — the
46
- default logo shown when the consumer doesn't supply one. */
47
- .defaultLogo {
48
- display: flex;
49
- align-items: center;
50
- justify-content: center;
51
- flex-shrink: 0;
52
- width: 36px;
53
- height: 36px;
54
- border-radius: var(--sv-radius-md);
55
- background-color: var(--sv-color-accent);
56
- color: var(--sv-color-text-on-accent);
57
- font-weight: var(--sv-font-weight-semibold);
58
- overflow: hidden;
59
- }
60
-
61
- .title {
62
- font-size: var(--sv-font-size-md);
63
- font-weight: var(--sv-font-weight-semibold);
64
- color: var(--sv-color-text-primary);
65
- overflow: hidden;
66
- text-overflow: ellipsis;
67
- white-space: nowrap;
68
- }
69
-
70
- .right {
71
- display: flex;
72
- align-items: center;
73
- gap: var(--sv-space-2);
74
- margin-left: auto;
75
- flex-shrink: 0;
76
- }