@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,185 +0,0 @@
1
- 'use client';
2
-
3
- import { useCallback, useEffect, useRef, useState } from 'react';
4
- import type {
5
- CSSProperties,
6
- MouseEvent as ReactMouseEvent,
7
- PointerEvent as ReactPointerEvent,
8
- } from 'react';
9
-
10
- export interface UseLongPressOptions {
11
- /** Called once the press has been held for `delay` without exceeding `moveTolerance`. */
12
- onLongPress: () => void;
13
- /** Hold duration in ms before `onLongPress` fires. Default 500. */
14
- delay?: number;
15
- /** Accumulated pointer movement (px) that cancels a pending press. Default 10 —
16
- * a real finger jitters a couple of px on a still hold; this must be forgiving
17
- * of that or the gesture never fires. */
18
- moveTolerance?: number;
19
- /** How long (ms) after firing to swallow the click that may or may not follow.
20
- * Default 700. Time-boxed rather than "clear on next click" — iOS frequently
21
- * sends no click at all after a long hold, so a flag that only clears on the
22
- * next click stays armed forever and silently eats the user's next real tap. */
23
- suppressClickMs?: number;
24
- /** Fire `navigator.vibrate(10)` when the press triggers, where supported. Default true. */
25
- vibrate?: boolean;
26
- /** Skip entirely (hooks can't be called conditionally, so this is the escape hatch
27
- * for a caller whose long-press action isn't available in the current state). */
28
- disabled?: boolean;
29
- }
30
-
31
- export interface LongPressHandlers {
32
- onPointerDown: (e: ReactPointerEvent) => void;
33
- onPointerMove: (e: ReactPointerEvent) => void;
34
- onPointerUp: (e: ReactPointerEvent) => void;
35
- onPointerCancel: (e: ReactPointerEvent) => void;
36
- onPointerLeave: (e: ReactPointerEvent) => void;
37
- onContextMenu: (e: ReactMouseEvent) => void;
38
- onClick: (e: ReactMouseEvent) => void;
39
- /** Spread onto the target element. Empty on devices whose primary pointer
40
- * isn't coarse (desktop mouse/trackpad) — see the coarse-pointer gate below. */
41
- style: CSSProperties;
42
- }
43
-
44
- const DEFAULT_DELAY_MS = 500;
45
- const DEFAULT_MOVE_TOLERANCE_PX = 10;
46
- const DEFAULT_SUPPRESS_CLICK_MS = 700;
47
-
48
- // SSR-safe, same defer-to-client-mount pattern as useIsMobile: defaults to
49
- // false (no suppression styles) until the client can actually read the
50
- // device's primary pointer, avoiding a hydration mismatch.
51
- function usePrefersCoarsePointer(): boolean {
52
- const [coarse, setCoarse] = useState(false);
53
-
54
- useEffect(() => {
55
- const mql = window.matchMedia('(pointer: coarse)');
56
- setCoarse(mql.matches);
57
- function handleChange(e: MediaQueryListEvent) {
58
- setCoarse(e.matches);
59
- }
60
- mql.addEventListener('change', handleChange);
61
- return () => mql.removeEventListener('change', handleChange);
62
- }, []);
63
-
64
- return coarse;
65
- }
66
-
67
- /**
68
- * useLongPress — touch-and-hold gesture with the full suppression recipe a
69
- * long-press needs to behave, not just a bare timer.
70
- *
71
- * A naive `setTimeout` started on `pointerdown` and cleared on `pointermove`
72
- * fails in three specific ways this hook exists to fix:
73
- * 1. Any movement at all cancels it — but a real finger jitters a few px even
74
- * on a "still" hold, so the gesture misfires constantly. `moveTolerance`
75
- * requires deliberate movement before cancelling.
76
- * 2. `pointercancel` (the browser converting the touch into a scroll) isn't
77
- * handled — the timer survives and fires mid-scroll. Handled here.
78
- * 3. Nothing suppresses the OS's own reaction to a long touch-hold: iOS shows
79
- * its link-preview callout, Android starts text selection or opens a
80
- * context menu, and either can fire *alongside* the gesture this hook
81
- * triggers. `onContextMenu` + the returned `style` (touch-callout,
82
- * user-select, touch-action) close all three, gated to coarse-pointer
83
- * devices only — unconditionally disabling `user-select` would break
84
- * mouse text selection on desktop, which never held this long-press to
85
- * begin with (see `onPointerDown`'s own `pointerType` check).
86
- *
87
- * The click that may or may not follow a fired long-press (iOS often sends
88
- * none at all) is swallowed for `suppressClickMs`, not indefinitely — an
89
- * unbounded suppression flag left armed by a browser that never sends that
90
- * click silently eats the user's *next* unrelated tap on the same element.
91
- */
92
- export function useLongPress({
93
- onLongPress,
94
- delay = DEFAULT_DELAY_MS,
95
- moveTolerance = DEFAULT_MOVE_TOLERANCE_PX,
96
- suppressClickMs = DEFAULT_SUPPRESS_CLICK_MS,
97
- vibrate = true,
98
- disabled = false,
99
- }: UseLongPressOptions): LongPressHandlers {
100
- const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
101
- const startRef = useRef<{ x: number; y: number } | null>(null);
102
- const suppressUntilRef = useRef(0);
103
-
104
- const clearTimer = useCallback(() => {
105
- if (timerRef.current) {
106
- clearTimeout(timerRef.current);
107
- timerRef.current = null;
108
- }
109
- }, []);
110
-
111
- // A press pending when the component unmounts (its target left the view
112
- // mid-hold — e.g. the row it's on was deleted by a sync elsewhere) must not
113
- // fire onLongPress against state that's no longer there.
114
- useEffect(() => clearTimer, [clearTimer]);
115
-
116
- const onPointerDown = useCallback(
117
- (e: ReactPointerEvent) => {
118
- if (disabled || e.pointerType !== 'touch') return;
119
- startRef.current = { x: e.clientX, y: e.clientY };
120
- clearTimer();
121
- timerRef.current = setTimeout(() => {
122
- timerRef.current = null;
123
- suppressUntilRef.current = Date.now() + suppressClickMs;
124
- if (vibrate && typeof navigator !== 'undefined' && navigator.vibrate) {
125
- navigator.vibrate(10);
126
- }
127
- onLongPress();
128
- }, delay);
129
- },
130
- [disabled, delay, suppressClickMs, vibrate, onLongPress, clearTimer],
131
- );
132
-
133
- const onPointerMove = useCallback(
134
- (e: ReactPointerEvent) => {
135
- const start = startRef.current;
136
- if (!start || !timerRef.current) return;
137
- const dx = e.clientX - start.x;
138
- const dy = e.clientY - start.y;
139
- if (Math.hypot(dx, dy) > moveTolerance) clearTimer();
140
- },
141
- [moveTolerance, clearTimer],
142
- );
143
-
144
- const cancelPress = useCallback(() => {
145
- clearTimer();
146
- startRef.current = null;
147
- }, [clearTimer]);
148
-
149
- // Preempts the OS's own long-press menu (Android's link/image context menu)
150
- // whenever our gesture is pending or has just fired — either way, this
151
- // hook's action is the one that should win, not a native menu appearing on
152
- // top of (or instead of) it. iOS's equivalent (the touch-callout link
153
- // preview) isn't a JS event at all — that one is closed by `style` below.
154
- const onContextMenu = useCallback((e: ReactMouseEvent) => {
155
- if (timerRef.current || Date.now() < suppressUntilRef.current) e.preventDefault();
156
- }, []);
157
-
158
- const onClick = useCallback((e: ReactMouseEvent) => {
159
- if (Date.now() < suppressUntilRef.current) {
160
- e.preventDefault();
161
- e.stopPropagation();
162
- }
163
- }, []);
164
-
165
- const isCoarsePointer = usePrefersCoarsePointer();
166
- const style: CSSProperties = isCoarsePointer
167
- ? {
168
- WebkitTouchCallout: 'none',
169
- WebkitUserSelect: 'none',
170
- userSelect: 'none',
171
- touchAction: 'manipulation',
172
- }
173
- : {};
174
-
175
- return {
176
- onPointerDown,
177
- onPointerMove,
178
- onPointerUp: cancelPress,
179
- onPointerCancel: cancelPress,
180
- onPointerLeave: cancelPress,
181
- onContextMenu,
182
- onClick,
183
- style,
184
- };
185
- }
@@ -1,45 +0,0 @@
1
- 'use client';
2
-
3
- import { useIsOffline } from './useIsOffline';
4
-
5
- /**
6
- * The two reasons an app tile can be non-interactive, kept structurally
7
- * distinct because they have different causes and must never read as the same
8
- * thing to a user (research 0012, epic task 2.33):
9
- *
10
- * - `'connectivity-dimmed'` — a no-offline-tier app, dimmed only while the
11
- * device is **actually offline right now**. Reactive and temporary; clears
12
- * the instant connectivity returns.
13
- * - `'capability-restricted'` — a `device-only` app on a surface without the
14
- * durable, encrypted, device-auth-gated store it needs. Static and
15
- * unrelated to connectivity — it stays restricted even when fully online,
16
- * and must never say "offline" to a user who plainly isn't.
17
- */
18
- export type OfflineTileState = 'connectivity-dimmed' | 'capability-restricted' | null;
19
-
20
- /**
21
- * Which of the two states, if any, applies to an app tile given its declared
22
- * offline tier.
23
- *
24
- * `deviceOnlyAvailable` is the caller's own
25
- * `isDeviceOnlyTierAvailable()` result (from
26
- * `@sovereignfs/sdk/device-client`) — deliberately taken as a plain boolean
27
- * parameter rather than computed inside this hook, so `@sovereignfs/ui` never
28
- * depends on `@sovereignfs/sdk` (this package must stay usable standalone,
29
- * outside the plugin runtime — RFC 0073).
30
- *
31
- * An `offline-first` app is never restricted by either state: that tier's
32
- * whole point is working with no network, so it stays fully interactive both
33
- * online and offline. A `device-only` app that *is* available behaves the
34
- * same way — the restriction is about availability, not connectivity.
35
- */
36
- export function useOfflineTileState(
37
- offline: 'offline-first' | 'device-only' | undefined,
38
- deviceOnlyAvailable: boolean,
39
- ): OfflineTileState {
40
- const isOffline = useIsOffline();
41
-
42
- if (offline === 'device-only' && !deviceOnlyAvailable) return 'capability-restricted';
43
- if (offline === undefined && isOffline) return 'connectivity-dimmed';
44
- return null;
45
- }
@@ -1,96 +0,0 @@
1
- 'use client';
2
-
3
- import { useLayoutEffect } from 'react';
4
- import type { RefObject } from 'react';
5
-
6
- /**
7
- * Internal implementation detail of `MobileHeader`/`MobileFooter` — not part
8
- * of the package's public surface (not re-exported from `hooks/index.ts`).
9
- *
10
- * Measures `ref`'s own rendered height and publishes it as an inline
11
- * `var(--sv-shell-header-height|--sv-shell-footer-height)` override on
12
- * `#sv-app-shell` (the runtime shell's stable root id, `runtime/app/
13
- * (platform)/layout.tsx`), removing it on unmount. This is what makes a
14
- * *self-rendered* `MobileHeader`/`MobileFooter` — the sanctioned pattern for
15
- * a plugin that opts out of the platform's own chrome via
16
- * `shellConfig.mobileHeader`/`mobileFooter: false` (RFC 0075/0088) — work
17
- * correctly with `Sheet`/`Drawer`/`Dialog`, which all size themselves against
18
- * these same two variables so they stop above/below the chrome instead of
19
- * sliding underneath it.
20
- *
21
- * Before this existed, only the *platform's own* header/footer had its
22
- * height accounted for (a fixed CSS `calc()` in `shell.module.css`, driven by
23
- * `data-mobile-header-hidden`/`data-mobile-footer-hidden`, which collapses
24
- * the variable to `0px` whenever a plugin hides that chrome) — a plugin
25
- * self-rendering its own via this same component instead had no path to tell
26
- * the shell what its real height was, and silently inherited that `0px`.
27
- * `Sheet`/`Drawer` then extended full-height, and since the header/footer's
28
- * own `z-index` (101) beats an overlay's (100), the chrome visibly covered
29
- * the overlay's last ~60px. First found and fixed ad hoc in `sovereign-tasks`
30
- * (measuring in the plugin itself, `getBoundingClientRect()` in a
31
- * `useLayoutEffect`); moved here so every consumer of these two components —
32
- * present and future, in this repo or externally maintained — gets it for
33
- * free, without having to know the mechanism exists. See
34
- * `docs/architecture-rules.md` for the full rule.
35
- *
36
- * Deliberately **not** `ResizeObserver`: in live testing (both this repo's
37
- * own Chromium-based browser-preview tooling and a real WebKit iOS Simulator
38
- * session) a freshly created `ResizeObserver` never fired its callback even
39
- * once for an already-rendered, stably-sized, non-zero element — cause not
40
- * fully root-caused. A synchronous `getBoundingClientRect()` read in
41
- * `useLayoutEffect`, re-run on `window`'s `resize` event, worked immediately
42
- * and reliably in both environments instead.
43
- *
44
- * No-ops safely wherever `#sv-app-shell` doesn't exist (Storybook, a unit
45
- * test, or any host other than the platform's own runtime shell) — every CSS
46
- * consumer reads these variables with a `60px` fallback, so an absent
47
- * override is harmless.
48
- *
49
- * For `--sv-shell-header-height` specifically, this also mirrors the same
50
- * measured height onto `--sv-dialog-inset-top` on `:root` (`document.
51
- * documentElement`, not `#sv-app-shell`) — `Dialog`'s mobile `.scrim` is
52
- * `position: fixed` and reads that variable for its own `top` offset, and
53
- * per `globals.css`'s own comment, iOS Safari has a documented quirk where a
54
- * `position: fixed` element inherits custom properties from `:root` rather
55
- * than from its DOM ancestors, so a value set only on `#sv-app-shell` (an
56
- * ancestor, not `:root`) silently never reaches it there. The platform's own
57
- * header already keeps `--sv-dialog-inset-top` correct this way, via
58
- * `ClientShell.tsx`'s own `syncViewport()` — but that function is part of
59
- * `(platform)/layout.tsx` and never runs for a `shell: minimal` plugin, so a
60
- * self-rendered `MobileHeader` (this hook's entire reason to exist) had no
61
- * equivalent, and `--sv-dialog-inset-top` silently kept `globals.css`'s
62
- * hardcoded platform-header-height fallback (60px) regardless of this
63
- * header's real height. Found live in `sovereign-plugin-kanban`: its
64
- * self-rendered header measures 69px, so its card-detail `Dialog` opened
65
- * with a real, reproducible ~9px misalignment against that header's own
66
- * bottom edge — confirmed via `getBoundingClientRect()` on both elements,
67
- * not just visually. */
68
- export function usePublishShellChromeHeight(
69
- ref: RefObject<HTMLElement | null>,
70
- cssVariable: '--sv-shell-header-height' | '--sv-shell-footer-height',
71
- ) {
72
- useLayoutEffect(() => {
73
- const el = ref.current;
74
- if (!el) return;
75
-
76
- function publish() {
77
- const shell = document.getElementById('sv-app-shell');
78
- if (!shell || !el) return;
79
- const height = `${el.getBoundingClientRect().height}px`;
80
- shell.style.setProperty(cssVariable, height);
81
- if (cssVariable === '--sv-shell-header-height') {
82
- document.documentElement.style.setProperty('--sv-dialog-inset-top', height);
83
- }
84
- }
85
-
86
- publish();
87
- window.addEventListener('resize', publish);
88
- return () => {
89
- window.removeEventListener('resize', publish);
90
- document.getElementById('sv-app-shell')?.style.removeProperty(cssVariable);
91
- if (cssVariable === '--sv-shell-header-height') {
92
- document.documentElement.style.removeProperty('--sv-dialog-inset-top');
93
- }
94
- };
95
- }, [ref, cssVariable]);
96
- }
@@ -1,88 +0,0 @@
1
- 'use client';
2
-
3
- import {
4
- KeyboardSensor,
5
- MouseSensor as LibMouseSensor,
6
- TouchSensor as LibTouchSensor,
7
- useSensor,
8
- useSensors,
9
- } from '@dnd-kit/core';
10
- import { sortableKeyboardCoordinates } from '@dnd-kit/sortable';
11
- import type { MouseEvent as ReactMouseEvent, TouchEvent as ReactTouchEvent } from 'react';
12
-
13
- /** Plain pointer drag (desktop, handle-initiated). */
14
- const DEFAULT_MOUSE_ACTIVATION_DISTANCE_PX = 8;
15
-
16
- /** Long-press-to-lift on touch. `delay` is how long a still hold takes before
17
- * the row lifts; `tolerance` is how far the finger may drift during that
18
- * hold before it's treated as a scroll instead — a finger that moves further
19
- * than this within the delay window cancels activation and the native
20
- * vertical scroll wins. */
21
- const DEFAULT_TOUCH_ACTIVATION_DELAY_MS = 300;
22
- const DEFAULT_TOUCH_ACTIVATION_TOLERANCE_PX = 8;
23
-
24
- /**
25
- * True when a drag should be allowed to start from `target`. Refused when
26
- * `target` sits inside an element marked `data-no-dnd` — a nested control
27
- * (e.g. a visibility toggle) opts out so tapping it fires its own handler
28
- * instead of lifting the row. Exported standalone so it's unit-testable
29
- * without spinning up dnd-kit.
30
- */
31
- export function shouldHandleDndEvent(target: EventTarget | null): boolean {
32
- if (!(target instanceof Element)) return true;
33
- return target.closest('[data-no-dnd]') === null;
34
- }
35
-
36
- export interface UseReorderSensorsOptions {
37
- mouseActivationDistancePx?: number;
38
- touchActivationDelayMs?: number;
39
- touchActivationTolerancePx?: number;
40
- }
41
-
42
- // dnd-kit's documented pattern for scoping sensor activation to specific
43
- // elements: subclass the built-in sensor and replace its static `activators`
44
- // with a handler that inspects the originating event's target before
45
- // deferring to the base activation logic (distance/delay/tolerance), which
46
- // dnd-kit re-checks internally regardless of what this returns.
47
- class MouseSensor extends LibMouseSensor {
48
- static override activators = [
49
- {
50
- eventName: 'onMouseDown' as const,
51
- handler: ({ nativeEvent: event }: ReactMouseEvent) => shouldHandleDndEvent(event.target),
52
- },
53
- ];
54
- }
55
-
56
- class TouchSensor extends LibTouchSensor {
57
- static override activators = [
58
- {
59
- eventName: 'onTouchStart' as const,
60
- handler: ({ nativeEvent: event }: ReactTouchEvent) => shouldHandleDndEvent(event.target),
61
- },
62
- ];
63
- }
64
-
65
- /**
66
- * Sensor set for a `data-no-dnd`-aware drag-reorder list — MouseSensor for
67
- * desktop's handle-initiated drag, TouchSensor for mobile's long-press lift
68
- * (fixes reordering being unusable on iOS PWA/Safari, which never implements
69
- * the native HTML5 Drag-and-Drop API for touch input), KeyboardSensor
70
- * unchanged. A bare call keeps the historical 8px/300ms/8px defaults.
71
- */
72
- export function useReorderSensors(options: UseReorderSensorsOptions = {}) {
73
- const {
74
- mouseActivationDistancePx = DEFAULT_MOUSE_ACTIVATION_DISTANCE_PX,
75
- touchActivationDelayMs = DEFAULT_TOUCH_ACTIVATION_DELAY_MS,
76
- touchActivationTolerancePx = DEFAULT_TOUCH_ACTIVATION_TOLERANCE_PX,
77
- } = options;
78
- return useSensors(
79
- useSensor(MouseSensor, { activationConstraint: { distance: mouseActivationDistancePx } }),
80
- useSensor(TouchSensor, {
81
- activationConstraint: {
82
- delay: touchActivationDelayMs,
83
- tolerance: touchActivationTolerancePx,
84
- },
85
- }),
86
- useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates }),
87
- );
88
- }
@@ -1,36 +0,0 @@
1
- 'use client';
2
-
3
- import { useIsMobile } from './useIsMobile';
4
-
5
- export interface UseResponsiveLayoutOptions<TWeb, TMobile> {
6
- web: TWeb;
7
- mobile: TMobile;
8
- breakpointPx?: number;
9
- }
10
-
11
- export interface UseResponsiveLayoutResult<TWeb, TMobile> {
12
- isMobile: boolean;
13
- value: TWeb | TMobile;
14
- }
15
-
16
- /**
17
- * useResponsiveLayout — picks between a `web` and `mobile` value for the
18
- * current viewport, built on `useIsMobile` (same breakpoint/SSR-safe-default
19
- * behavior, not reimplemented here). Generic over the value type so it works
20
- * for JSX (the common case — forking an entire component tree, not just a
21
- * class name) or any other per-breakpoint value a plugin wants to pick
22
- * without repeating the isMobile-ternary boilerplate every call site.
23
- *
24
- * This formalizes the `if (isMobile) return <mobile/>; return <web/>;` fork
25
- * plugins have hand-rolled per-plugin (e.g. a `MobileAwareShell` component
26
- * that swaps an entire routed page tree for a client-only mobile one) —
27
- * see `ResponsiveSurface` for the equivalent as a plain JSX component.
28
- */
29
- export function useResponsiveLayout<TWeb, TMobile>({
30
- web,
31
- mobile,
32
- breakpointPx,
33
- }: UseResponsiveLayoutOptions<TWeb, TMobile>): UseResponsiveLayoutResult<TWeb, TMobile> {
34
- const isMobile = useIsMobile(breakpointPx);
35
- return { isMobile, value: isMobile ? mobile : web };
36
- }