@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,313 +0,0 @@
1
- 'use client';
2
-
3
- import { Children, isValidElement, useEffect, useRef, useState } from 'react';
4
- import type {
5
- CSSProperties,
6
- KeyboardEvent as ReactKeyboardEvent,
7
- PointerEvent as ReactPointerEvent,
8
- ReactElement,
9
- ReactNode,
10
- } from 'react';
11
- import styles from './Resizable.module.css';
12
-
13
- export type ResizableDirection = 'horizontal' | 'vertical';
14
-
15
- export interface ResizablePanelProps {
16
- /** Initial size as a percentage of the group's main axis. Defaults to an
17
- * equal split across all panels in the group. */
18
- defaultSize?: number;
19
- /** Minimum size as a percentage. Defaults to 10. */
20
- minSize?: number;
21
- /** Maximum size as a percentage. Defaults to 90. */
22
- maxSize?: number;
23
- children?: ReactNode;
24
- className?: string;
25
- /** Injected by ResizablePanelGroup — not part of the public API. */
26
- style?: CSSProperties;
27
- }
28
-
29
- /** One pane of a ResizablePanelGroup. Sizing is computed and injected by the
30
- * group (via defaultSize/minSize/maxSize read off this element's props) —
31
- * this component only renders the scrollable content box. */
32
- export function ResizablePanel({ children, className, style }: ResizablePanelProps) {
33
- return (
34
- <div className={[styles.panel, className].filter(Boolean).join(' ')} style={style}>
35
- {children}
36
- </div>
37
- );
38
- }
39
-
40
- export interface ResizableHandleProps {
41
- 'aria-label'?: string;
42
- /** Injected by ResizablePanelGroup — not part of the public API. */
43
- direction?: ResizableDirection;
44
- onPointerDown?: (e: ReactPointerEvent<HTMLDivElement>) => void;
45
- onKeyDown?: (e: ReactKeyboardEvent<HTMLDivElement>) => void;
46
- 'aria-valuenow'?: number;
47
- 'aria-valuemin'?: number;
48
- 'aria-valuemax'?: number;
49
- }
50
-
51
- /** The draggable divider between two ResizablePanels. Placed directly
52
- * between the two ResizablePanel elements it resizes — the group pairs each
53
- * handle with its preceding and following panel by position.
54
- *
55
- * A `div` with `role="separator"` and `tabIndex=0` (the WAI-ARIA "window
56
- * splitter" pattern), not a `<button>` — `separator` is a non-interactive
57
- * role, and a native button's implicit role can't be overridden to it. */
58
- export function ResizableHandle({
59
- 'aria-label': ariaLabel = 'Resize panels',
60
- direction = 'horizontal',
61
- onPointerDown,
62
- onKeyDown,
63
- 'aria-valuenow': valueNow,
64
- 'aria-valuemin': valueMin,
65
- 'aria-valuemax': valueMax,
66
- }: ResizableHandleProps) {
67
- return (
68
- /* eslint-disable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/no-noninteractive-tabindex -- WAI-ARIA "window splitter" pattern: a focusable, keyboard-operable separator is the documented exception to role="separator" being non-interactive (https://www.w3.org/WAI/ARIA/apg/patterns/windowsplitter/). */
69
- <div
70
- className={[styles.handle, direction === 'vertical' ? styles.handleVertical : '']
71
- .filter(Boolean)
72
- .join(' ')}
73
- role="separator"
74
- tabIndex={0}
75
- aria-orientation={direction === 'horizontal' ? 'vertical' : 'horizontal'}
76
- aria-label={ariaLabel}
77
- aria-valuenow={valueNow !== undefined ? Math.round(valueNow) : undefined}
78
- aria-valuemin={valueMin}
79
- aria-valuemax={valueMax}
80
- onPointerDown={onPointerDown}
81
- onKeyDown={onKeyDown}
82
- />
83
- /* eslint-enable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/no-noninteractive-tabindex */
84
- );
85
- }
86
-
87
- export interface ResizablePanelGroupProps {
88
- direction: ResizableDirection;
89
- /** Alternating ResizablePanel / ResizableHandle elements — N panels
90
- * separated by N-1 handles. */
91
- children: ReactNode;
92
- className?: string;
93
- }
94
-
95
- interface PanelConstraint {
96
- defaultSize: number;
97
- minSize: number;
98
- maxSize: number;
99
- }
100
-
101
- const clamp = (value: number, min: number, max: number) => Math.min(Math.max(value, min), max);
102
-
103
- /**
104
- * ResizablePanelGroup — a row or column of resizable panes (editor layouts,
105
- * multi-pane inspectors). Each handle resizes only its two immediate
106
- * neighbor panels (drag redistributes size between them, clamped to both
107
- * panels' own min/max, so their combined size is a fixed invariant for the
108
- * duration of one drag) — the same handle-local model most resizable-panel
109
- * implementations use, rather than redistributing across the whole group.
110
- *
111
- * Desktop-oriented, like NavigationMenu — a drag handle has no direct touch
112
- * equivalent; panels render at their default sizes on touch rather than
113
- * attempting a redesign no consumer has asked for yet. For a two-pane
114
- * layout that also needs a mobile single-column fallback, use SplitPane
115
- * instead.
116
- *
117
- * `direction="vertical"` needs a definite-height ancestor — percentage
118
- * flex-basis on a column's children only resolves against one.
119
- */
120
- export function ResizablePanelGroup({ direction, children, className }: ResizablePanelGroupProps) {
121
- const elements = Children.toArray(children).filter(isValidElement) as ReactElement<
122
- ResizablePanelProps | ResizableHandleProps
123
- >[];
124
- const panelCount = elements.filter((el) => el.type === ResizablePanel).length;
125
-
126
- const constraints: PanelConstraint[] = elements
127
- .filter((el) => el.type === ResizablePanel)
128
- .map((el) => {
129
- const props = el.props as ResizablePanelProps;
130
- return {
131
- defaultSize: props.defaultSize ?? 100 / panelCount,
132
- minSize: props.minSize ?? 10,
133
- maxSize: props.maxSize ?? 90,
134
- };
135
- });
136
-
137
- const [sizes, setSizes] = useState<number[]>(() => constraints.map((c) => c.defaultSize));
138
-
139
- // A different set of panels rendered (count changed) — re-derive rather
140
- // than keep stale entries. Legal "adjust state during render" pattern;
141
- // sizes.length matches constraints.length again on the next render, so
142
- // this cannot loop.
143
- if (sizes.length !== constraints.length) {
144
- setSizes(constraints.map((c) => c.defaultSize));
145
- }
146
-
147
- const containerRef = useRef<HTMLDivElement>(null);
148
- // Always-latest refs so the window-level pointer listeners (registered
149
- // once, see below) never read stale values without needing to be
150
- // re-registered on every render.
151
- const constraintsRef = useRef(constraints);
152
- constraintsRef.current = constraints;
153
- const directionRef = useRef(direction);
154
- directionRef.current = direction;
155
-
156
- const dragState = useRef<{
157
- handleIndex: number;
158
- pointerId: number;
159
- startPos: number;
160
- startA: number;
161
- combined: number;
162
- } | null>(null);
163
-
164
- function applyResize(handleIndex: number, nextA: number, combined: number) {
165
- const a = constraintsRef.current[handleIndex];
166
- const b = constraintsRef.current[handleIndex + 1];
167
- if (!a || !b) return;
168
- const clampedA = clamp(
169
- nextA,
170
- Math.max(a.minSize, combined - b.maxSize),
171
- Math.min(a.maxSize, combined - b.minSize),
172
- );
173
- setSizes((prev) => {
174
- const next = [...prev];
175
- next[handleIndex] = clampedA;
176
- next[handleIndex + 1] = combined - clampedA;
177
- return next;
178
- });
179
- }
180
-
181
- useEffect(() => {
182
- function handlePointerMove(event: globalThis.PointerEvent) {
183
- const drag = dragState.current;
184
- const rect = containerRef.current?.getBoundingClientRect();
185
- if (!drag || !rect || event.pointerId !== drag.pointerId) return;
186
- const size = directionRef.current === 'horizontal' ? rect.width : rect.height;
187
- if (size === 0) return;
188
- const pos = directionRef.current === 'horizontal' ? event.clientX : event.clientY;
189
- const deltaPercent = ((pos - drag.startPos) / size) * 100;
190
- applyResize(drag.handleIndex, drag.startA + deltaPercent, drag.combined);
191
- }
192
-
193
- function stopDragging(event: globalThis.PointerEvent) {
194
- if (!dragState.current || event.pointerId !== dragState.current.pointerId) return;
195
- dragState.current = null;
196
- document.body.style.cursor = '';
197
- document.body.style.userSelect = '';
198
- }
199
-
200
- window.addEventListener('pointermove', handlePointerMove);
201
- window.addEventListener('pointerup', stopDragging);
202
- window.addEventListener('pointercancel', stopDragging);
203
- return () => {
204
- window.removeEventListener('pointermove', handlePointerMove);
205
- window.removeEventListener('pointerup', stopDragging);
206
- window.removeEventListener('pointercancel', stopDragging);
207
- document.body.style.cursor = '';
208
- document.body.style.userSelect = '';
209
- };
210
- // Registered once — handlePointerMove reads live state via refs instead
211
- // of closing over props/state that would otherwise need to be deps.
212
- }, []);
213
-
214
- function startDragging(handleIndex: number, event: ReactPointerEvent<HTMLDivElement>) {
215
- const startA = sizes[handleIndex] ?? 0;
216
- const startB = sizes[handleIndex + 1] ?? 0;
217
- dragState.current = {
218
- handleIndex,
219
- pointerId: event.pointerId,
220
- startPos: direction === 'horizontal' ? event.clientX : event.clientY,
221
- startA,
222
- combined: startA + startB,
223
- };
224
- document.body.style.cursor = direction === 'horizontal' ? 'col-resize' : 'row-resize';
225
- document.body.style.userSelect = 'none';
226
- event.currentTarget.setPointerCapture(event.pointerId);
227
- }
228
-
229
- function resizeWithKeyboard(handleIndex: number, event: ReactKeyboardEvent<HTMLDivElement>) {
230
- const step = event.shiftKey ? 10 : 5;
231
- const forwardKey = direction === 'horizontal' ? 'ArrowRight' : 'ArrowDown';
232
- const backwardKey = direction === 'horizontal' ? 'ArrowLeft' : 'ArrowUp';
233
- const sizeA = sizes[handleIndex] ?? 0;
234
- const sizeB = sizes[handleIndex + 1] ?? 0;
235
- const combined = sizeA + sizeB;
236
- if (event.key === forwardKey) {
237
- event.preventDefault();
238
- applyResize(handleIndex, sizeA + step, combined);
239
- } else if (event.key === backwardKey) {
240
- event.preventDefault();
241
- applyResize(handleIndex, sizeA - step, combined);
242
- }
243
- }
244
-
245
- let panelIndex = -1;
246
- let handleIndex = -1;
247
-
248
- return (
249
- <div
250
- ref={containerRef}
251
- className={[styles.group, direction === 'vertical' ? styles.groupVertical : '', className]
252
- .filter(Boolean)
253
- .join(' ')}
254
- >
255
- {elements.map((element, key) => {
256
- if (element.type === ResizablePanel) {
257
- panelIndex += 1;
258
- const size = sizes[panelIndex] ?? constraints[panelIndex]?.defaultSize ?? 0;
259
- return (
260
- <ResizablePanelClone
261
- key={key}
262
- element={element as ReactElement<ResizablePanelProps>}
263
- flexBasis={size}
264
- />
265
- );
266
- }
267
- if (element.type === ResizableHandle) {
268
- handleIndex += 1;
269
- const index = handleIndex;
270
- const constraint = constraints[index];
271
- return (
272
- <ResizableHandleClone
273
- key={key}
274
- element={element as ReactElement<ResizableHandleProps>}
275
- direction={direction}
276
- aria-valuenow={sizes[index]}
277
- aria-valuemin={constraint?.minSize}
278
- aria-valuemax={constraint?.maxSize}
279
- onPointerDown={(e) => startDragging(index, e)}
280
- onKeyDown={(e) => resizeWithKeyboard(index, e)}
281
- />
282
- );
283
- }
284
- return element;
285
- })}
286
- </div>
287
- );
288
- }
289
-
290
- function ResizablePanelClone({
291
- element,
292
- flexBasis,
293
- }: {
294
- element: ReactElement<ResizablePanelProps>;
295
- flexBasis: number;
296
- }) {
297
- const style: CSSProperties = {
298
- ...element.props.style,
299
- flexBasis: `${flexBasis}%`,
300
- flexGrow: 0,
301
- flexShrink: 0,
302
- };
303
- return <ResizablePanel {...element.props} style={style} />;
304
- }
305
-
306
- function ResizableHandleClone({
307
- element,
308
- ...injected
309
- }: {
310
- element: ReactElement<ResizableHandleProps>;
311
- } & ResizableHandleProps) {
312
- return <ResizableHandle {...element.props} {...injected} />;
313
- }
@@ -1,128 +0,0 @@
1
- // @vitest-environment jsdom
2
- import { afterEach, describe, expect, it } from 'vitest';
3
- import { cleanup, fireEvent, render, screen } from '@testing-library/react';
4
- import { ResizableHandle, ResizablePanel, ResizablePanelGroup } from '../Resizable';
5
-
6
- afterEach(cleanup);
7
-
8
- describe('ResizablePanelGroup', () => {
9
- it('renders each panel and a separator between them', () => {
10
- render(
11
- <ResizablePanelGroup direction="horizontal">
12
- <ResizablePanel>
13
- <p>Left</p>
14
- </ResizablePanel>
15
- <ResizableHandle aria-label="Resize sidebar" />
16
- <ResizablePanel>
17
- <p>Right</p>
18
- </ResizablePanel>
19
- </ResizablePanelGroup>,
20
- );
21
-
22
- expect(screen.getByText('Left')).toBeDefined();
23
- expect(screen.getByText('Right')).toBeDefined();
24
- expect(screen.getByRole('separator', { name: 'Resize sidebar' })).toBeDefined();
25
- });
26
-
27
- it('splits panels evenly by default', () => {
28
- render(
29
- <ResizablePanelGroup direction="horizontal">
30
- <ResizablePanel>
31
- <p>Left</p>
32
- </ResizablePanel>
33
- <ResizableHandle aria-label="Resize" />
34
- <ResizablePanel>
35
- <p>Right</p>
36
- </ResizablePanel>
37
- </ResizablePanelGroup>,
38
- );
39
-
40
- const separator = screen.getByRole('separator', { name: 'Resize' });
41
- expect(separator.getAttribute('aria-valuenow')).toBe('50');
42
- });
43
-
44
- it('resizes the pair of neighboring panels with the keyboard, redistributing their combined size', () => {
45
- render(
46
- <ResizablePanelGroup direction="horizontal">
47
- <ResizablePanel defaultSize={50} minSize={20} maxSize={80}>
48
- <p>Left</p>
49
- </ResizablePanel>
50
- <ResizableHandle aria-label="Resize" />
51
- <ResizablePanel defaultSize={50} minSize={20} maxSize={80}>
52
- <p>Right</p>
53
- </ResizablePanel>
54
- </ResizablePanelGroup>,
55
- );
56
-
57
- const separator = screen.getByRole('separator', { name: 'Resize' });
58
- fireEvent.keyDown(separator, { key: 'ArrowRight' });
59
- expect(separator.getAttribute('aria-valuenow')).toBe('55');
60
-
61
- fireEvent.keyDown(separator, { key: 'ArrowLeft', shiftKey: true });
62
- expect(separator.getAttribute('aria-valuenow')).toBe('45');
63
- });
64
-
65
- it('clamps keyboard resizing to minSize/maxSize', () => {
66
- render(
67
- <ResizablePanelGroup direction="horizontal">
68
- <ResizablePanel defaultSize={50} minSize={45} maxSize={55}>
69
- <p>Left</p>
70
- </ResizablePanel>
71
- <ResizableHandle aria-label="Resize" />
72
- <ResizablePanel defaultSize={50} minSize={45} maxSize={55}>
73
- <p>Right</p>
74
- </ResizablePanel>
75
- </ResizablePanelGroup>,
76
- );
77
-
78
- const separator = screen.getByRole('separator', { name: 'Resize' });
79
- fireEvent.keyDown(separator, { key: 'ArrowRight', shiftKey: true });
80
- fireEvent.keyDown(separator, { key: 'ArrowRight', shiftKey: true });
81
- fireEvent.keyDown(separator, { key: 'ArrowRight', shiftKey: true });
82
- expect(separator.getAttribute('aria-valuenow')).toBe('55');
83
- });
84
-
85
- it('only affects the pair of panels adjacent to the handle that moved', () => {
86
- render(
87
- <ResizablePanelGroup direction="horizontal">
88
- <ResizablePanel defaultSize={34}>
89
- <p>A</p>
90
- </ResizablePanel>
91
- <ResizableHandle aria-label="Resize A-B" />
92
- <ResizablePanel defaultSize={33}>
93
- <p>B</p>
94
- </ResizablePanel>
95
- <ResizableHandle aria-label="Resize B-C" />
96
- <ResizablePanel defaultSize={33}>
97
- <p>C</p>
98
- </ResizablePanel>
99
- </ResizablePanelGroup>,
100
- );
101
-
102
- const first = screen.getByRole('separator', { name: 'Resize A-B' });
103
- const second = screen.getByRole('separator', { name: 'Resize B-C' });
104
- fireEvent.keyDown(first, { key: 'ArrowRight' });
105
- expect(second.getAttribute('aria-valuenow')).toBe('28');
106
- });
107
-
108
- it('uses ArrowDown/ArrowUp for vertical groups instead of ArrowRight/ArrowLeft', () => {
109
- render(
110
- <ResizablePanelGroup direction="vertical">
111
- <ResizablePanel defaultSize={50}>
112
- <p>Top</p>
113
- </ResizablePanel>
114
- <ResizableHandle aria-label="Resize" />
115
- <ResizablePanel defaultSize={50}>
116
- <p>Bottom</p>
117
- </ResizablePanel>
118
- </ResizablePanelGroup>,
119
- );
120
-
121
- const separator = screen.getByRole('separator', { name: 'Resize' });
122
- expect(separator.getAttribute('aria-orientation')).toBe('horizontal');
123
- fireEvent.keyDown(separator, { key: 'ArrowRight' });
124
- expect(separator.getAttribute('aria-valuenow')).toBe('50');
125
- fireEvent.keyDown(separator, { key: 'ArrowDown' });
126
- expect(separator.getAttribute('aria-valuenow')).toBe('55');
127
- });
128
- });
@@ -1,24 +0,0 @@
1
- import type { ReactNode } from 'react';
2
- import { useResponsiveLayout } from '../../hooks/useResponsiveLayout';
3
-
4
- export interface ResponsiveSurfaceProps {
5
- web: ReactNode;
6
- mobile: ReactNode;
7
- breakpointPx?: number;
8
- }
9
-
10
- /**
11
- * ResponsiveSurface — thin JSX convenience wrapper around
12
- * `useResponsiveLayout` for the common two-tree case: render an entirely
13
- * different component tree below the breakpoint, not a CSS squeeze of the
14
- * same one. Renders only whichever side is active — the other tree is never
15
- * mounted.
16
- *
17
- * This does not replace a plugin's own shell component (e.g. a
18
- * `MobileAwareShell` that also threads plugin-specific props like a refresh
19
- * signal) — those stay a thin per-plugin wrapper around this.
20
- */
21
- export function ResponsiveSurface({ web, mobile, breakpointPx }: ResponsiveSurfaceProps) {
22
- const { value } = useResponsiveLayout({ web, mobile, breakpointPx });
23
- return <>{value}</>;
24
- }
@@ -1,73 +0,0 @@
1
- // @vitest-environment jsdom
2
- import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
3
- import { act, cleanup, render, screen } from '@testing-library/react';
4
- import { ResponsiveSurface } from '../ResponsiveSurface';
5
-
6
- let changeHandler: ((e: MediaQueryListEvent) => void) | null = null;
7
- let matches = false;
8
-
9
- function installMatchMedia() {
10
- changeHandler = null;
11
- vi.stubGlobal(
12
- 'matchMedia',
13
- vi.fn().mockImplementation((query: string) => ({
14
- matches,
15
- media: query,
16
- addEventListener: (_: string, cb: (e: MediaQueryListEvent) => void) => {
17
- changeHandler = cb;
18
- },
19
- removeEventListener: vi.fn(),
20
- addListener: vi.fn(),
21
- removeListener: vi.fn(),
22
- dispatchEvent: vi.fn(),
23
- })),
24
- );
25
- }
26
-
27
- describe('ResponsiveSurface', () => {
28
- beforeEach(() => {
29
- matches = false;
30
- installMatchMedia();
31
- });
32
- afterEach(() => {
33
- vi.unstubAllGlobals();
34
- cleanup();
35
- });
36
-
37
- it('renders the web tree by default and never mounts the mobile tree', () => {
38
- render(
39
- <ResponsiveSurface
40
- web={<div data-testid="web">web</div>}
41
- mobile={<div data-testid="mobile">mobile</div>}
42
- />,
43
- );
44
- expect(screen.getByTestId('web')).toBeDefined();
45
- expect(screen.queryByTestId('mobile')).toBeNull();
46
- });
47
-
48
- it('renders only the mobile tree below the breakpoint', () => {
49
- matches = true;
50
- installMatchMedia();
51
- render(
52
- <ResponsiveSurface
53
- web={<div data-testid="web">web</div>}
54
- mobile={<div data-testid="mobile">mobile</div>}
55
- />,
56
- );
57
- expect(screen.getByTestId('mobile')).toBeDefined();
58
- expect(screen.queryByTestId('web')).toBeNull();
59
- });
60
-
61
- it('swaps trees live when the viewport crosses the breakpoint', () => {
62
- render(
63
- <ResponsiveSurface
64
- web={<div data-testid="web">web</div>}
65
- mobile={<div data-testid="mobile">mobile</div>}
66
- />,
67
- );
68
- expect(screen.getByTestId('web')).toBeDefined();
69
- act(() => changeHandler?.({ matches: true } as MediaQueryListEvent));
70
- expect(screen.getByTestId('mobile')).toBeDefined();
71
- expect(screen.queryByTestId('web')).toBeNull();
72
- });
73
- });
@@ -1,12 +0,0 @@
1
- /* A definite height, not min-height: ThreeColumnLayout/HeaderFooterLayout's
2
- own .shell use height: 100% internally (fixed box, independently-
3
- scrolling children via overflow-y: auto) — a percentage height only
4
- resolves against an ancestor with a definite (not min-constrained)
5
- height, so min-height here would leave their .shell unable to resolve
6
- and collapse to content size. This doesn't clip taller content on its
7
- own — nothing here sets overflow: hidden, so content taller than the
8
- box simply overflows past it rather than being cut off. */
9
- .root {
10
- width: 100%;
11
- height: 100%;
12
- }
@@ -1,125 +0,0 @@
1
- import type { Meta, StoryObj } from '@storybook/react-vite';
2
- import { RootLayout } from './RootLayout';
3
-
4
- function Block({ label }: { label: string }) {
5
- return (
6
- <div
7
- style={{
8
- display: 'flex',
9
- alignItems: 'center',
10
- justifyContent: 'center',
11
- height: '100%',
12
- padding: 'var(--sv-space-4)',
13
- fontFamily: 'var(--sv-font-family)',
14
- fontSize: 'var(--sv-font-size-sm)',
15
- fontWeight: 600,
16
- color: 'var(--sv-color-text-primary)',
17
- background: 'var(--sv-color-surface-raised)',
18
- }}
19
- >
20
- {label}
21
- </div>
22
- );
23
- }
24
-
25
- const meta = {
26
- title: 'Components/RootLayout',
27
- component: RootLayout,
28
- parameters: {
29
- layout: 'fullscreen',
30
- docs: {
31
- description: {
32
- component:
33
- "The root-level layout a plugin's page tree sits in. Enforces only structure and dimensions — content always comes from children. Each variant is a fixed web+mobile pairing, not two independent axes; resize the viewport (or check the Mobile story) to see the fork. 'header' keeps the same header+main structure on both breakpoints, but headerHeight (48px, web) and mobileHeaderHeight (60px, mobile) are deliberately different — matching how real shell: minimal plugins do this in production.",
34
- },
35
- },
36
- },
37
- args: {
38
- children: <Block label="Main" />,
39
- },
40
- } satisfies Meta<typeof RootLayout>;
41
-
42
- export default meta;
43
- type Story = StoryObj<typeof meta>;
44
-
45
- /** variant="plain" is the prop's own default — a single child, no chrome. */
46
- export const Default: Story = {
47
- render: () => (
48
- <div style={{ height: '100vh' }}>
49
- <RootLayout variant="plain">
50
- <Block label="Main" />
51
- </RootLayout>
52
- </div>
53
- ),
54
- };
55
-
56
- export const Sidebar: Story = {
57
- render: () => (
58
- <div style={{ height: '100vh' }}>
59
- <RootLayout variant="sidebar">
60
- <Block label="Sidebar" />
61
- <Block label="Main" />
62
- </RootLayout>
63
- </div>
64
- ),
65
- };
66
-
67
- export const SidebarMobile: Story = {
68
- parameters: { viewport: { defaultViewport: 'mobile1' } },
69
- render: () => (
70
- <div style={{ height: '100vh' }}>
71
- <RootLayout variant="sidebar">
72
- <Block label="Sidebar (hidden on mobile)" />
73
- <Block label="Main" />
74
- </RootLayout>
75
- </div>
76
- ),
77
- };
78
-
79
- export const Header: Story = {
80
- render: () => (
81
- <div style={{ height: '100vh' }}>
82
- <RootLayout variant="header">
83
- <Block label="Header (48px)" />
84
- <Block label="Main" />
85
- </RootLayout>
86
- </div>
87
- ),
88
- };
89
-
90
- export const HeaderMobile: Story = {
91
- parameters: { viewport: { defaultViewport: 'mobile1' } },
92
- render: () => (
93
- <div style={{ height: '100vh' }}>
94
- <RootLayout variant="header">
95
- <Block label="Header (60px)" />
96
- <Block label="Main" />
97
- </RootLayout>
98
- </div>
99
- ),
100
- };
101
-
102
- export const Shell: Story = {
103
- render: () => (
104
- <div style={{ height: '100vh' }}>
105
- <RootLayout variant="shell">
106
- <Block label="Header (mobile only)" />
107
- <Block label="Main" />
108
- <Block label="Footer (mobile only)" />
109
- </RootLayout>
110
- </div>
111
- ),
112
- };
113
-
114
- export const ShellMobile: Story = {
115
- parameters: { viewport: { defaultViewport: 'mobile1' } },
116
- render: () => (
117
- <div style={{ height: '100vh' }}>
118
- <RootLayout variant="shell">
119
- <Block label="Header" />
120
- <Block label="Main" />
121
- <Block label="Footer" />
122
- </RootLayout>
123
- </div>
124
- ),
125
- };