@sovereignfs/ui 0.54.0 → 0.83.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 (277) hide show
  1. package/dist/Accordion.module.css +1 -1
  2. package/dist/Alert.module.css +1 -1
  3. package/dist/AppsLauncher.module.css +96 -0
  4. package/dist/Avatar.module.css +1 -1
  5. package/dist/Badge.module.css +30 -7
  6. package/dist/BalanceChip.module.css +1 -1
  7. package/dist/Button.module.css +18 -2
  8. package/dist/Card.module.css +1 -1
  9. package/dist/CardTile.module.css +181 -0
  10. package/dist/CodeTextarea.module.css +1 -1
  11. package/dist/Collapsible.module.css +1 -1
  12. package/dist/ColorPicker.module.css +132 -0
  13. package/dist/Combobox.module.css +2 -2
  14. package/dist/Command.module.css +1 -1
  15. package/dist/ConfirmDialog.module.css +2 -2
  16. package/dist/ConsentPrompt.module.css +21 -0
  17. package/dist/DatePicker.module.css +1 -1
  18. package/dist/Dialog.module.css +130 -21
  19. package/dist/Drawer.module.css +36 -7
  20. package/dist/Header.module.css +62 -0
  21. package/dist/HeaderFooterLayout.module.css +21 -0
  22. package/dist/IconPicker.module.css +1 -1
  23. package/dist/Input.module.css +1 -1
  24. package/dist/Kbd.module.css +1 -1
  25. package/dist/Markdown.module.css +24 -0
  26. package/dist/Menu.module.css +1 -0
  27. package/dist/Message.module.css +1 -1
  28. package/dist/MessageScroller.module.css +12 -1
  29. package/dist/MobileAppsDrawer.module.css +10 -9
  30. package/dist/MobileFooter.module.css +1 -1
  31. package/dist/MobileHeader.module.css +14 -1
  32. package/dist/NavList.module.css +130 -0
  33. package/dist/NavTabs.module.css +1 -1
  34. package/dist/NotificationsPanel.module.css +258 -0
  35. package/dist/OverlayHeader.module.css +1 -1
  36. package/dist/PageContainer.module.css +62 -0
  37. package/dist/PageHeader.module.css +54 -0
  38. package/dist/PageLayout.module.css +51 -0
  39. package/dist/Popover.module.css +1 -1
  40. package/dist/QuantityStepper.module.css +1 -1
  41. package/dist/Resizable.module.css +3 -3
  42. package/dist/RootLayout.module.css +12 -0
  43. package/dist/SegmentedControl.module.css +1 -1
  44. package/dist/Select.module.css +1 -1
  45. package/dist/Sheet.module.css +4 -1
  46. package/dist/SplitPane.module.css +4 -4
  47. package/dist/StatusBadge.module.css +1 -1
  48. package/dist/StepStrip.module.css +53 -0
  49. package/dist/SuggestionInput.module.css +2 -2
  50. package/dist/SwipableMobileCarousel.module.css +12 -3
  51. package/dist/SwipableMobileCarouselDots.module.css +15 -0
  52. package/dist/SwipeStack.module.css +101 -0
  53. package/dist/SystemBanner.module.css +10 -0
  54. package/dist/Table.module.css +2 -2
  55. package/dist/Tabs.module.css +1 -1
  56. package/dist/TagInput.module.css +2 -2
  57. package/dist/Textarea.module.css +9 -1
  58. package/dist/ThreeColumnLayout.module.css +35 -0
  59. package/dist/Toast.module.css +62 -3
  60. package/dist/Tooltip.module.css +1 -1
  61. package/dist/UserMenu.module.css +90 -0
  62. package/dist/index.d.ts +1047 -45
  63. package/dist/index.js +3908 -1456
  64. package/dist/tokens/primitives.css +11 -0
  65. package/dist/tokens/semantic.css +32 -0
  66. package/dist/tokens/theme-presets.css +33 -0
  67. package/package.json +25 -9
  68. package/src/__tests__/package-json.test.ts +8 -0
  69. package/src/components/Accordion/Accordion.module.css +1 -1
  70. package/src/components/Alert/Alert.module.css +1 -1
  71. package/src/components/AppsLauncher/AppsLauncher.module.css +96 -0
  72. package/src/components/AppsLauncher/AppsLauncher.stories.tsx +58 -0
  73. package/src/components/AppsLauncher/AppsLauncher.tsx +117 -0
  74. package/src/components/AppsLauncher/__tests__/AppsLauncher.test.tsx +52 -0
  75. package/src/components/Avatar/Avatar.module.css +1 -1
  76. package/src/components/Badge/Badge.module.css +30 -7
  77. package/src/components/Badge/Badge.stories.tsx +16 -4
  78. package/src/components/Badge/Badge.tsx +7 -4
  79. package/src/components/Badge/__tests__/Badge.test.tsx +4 -2
  80. package/src/components/BalanceChip/BalanceChip.module.css +1 -1
  81. package/src/components/Button/Button.module.css +18 -2
  82. package/src/components/Card/Card.module.css +1 -1
  83. package/src/components/CardTile/CardTile.module.css +181 -0
  84. package/src/components/CardTile/CardTile.stories.tsx +86 -0
  85. package/src/components/CardTile/CardTile.tsx +128 -0
  86. package/src/components/CardTile/__tests__/CardTile.test.tsx +56 -0
  87. package/src/components/CodeTextarea/CodeTextarea.module.css +1 -1
  88. package/src/components/Collapsible/Collapsible.module.css +1 -1
  89. package/src/components/ColorPicker/ColorPicker.module.css +132 -0
  90. package/src/components/ColorPicker/ColorPicker.stories.tsx +80 -0
  91. package/src/components/ColorPicker/ColorPicker.tsx +157 -0
  92. package/src/components/ColorPicker/__tests__/ColorPicker.test.tsx +117 -0
  93. package/src/components/Combobox/Combobox.module.css +2 -2
  94. package/src/components/Command/Command.module.css +1 -1
  95. package/src/components/ConfirmDialog/ConfirmDialog.module.css +2 -2
  96. package/src/components/ConfirmDialog/ConfirmDialog.tsx +28 -2
  97. package/src/components/ConfirmDialog/__tests__/ConfirmDialog.test.tsx +71 -3
  98. package/src/components/ConsentPrompt/ConsentPrompt.module.css +21 -0
  99. package/src/components/ConsentPrompt/ConsentPrompt.stories.tsx +31 -0
  100. package/src/components/ConsentPrompt/ConsentPrompt.tsx +66 -0
  101. package/src/components/ContextMenu/ContextMenu.tsx +1 -1
  102. package/src/components/DatePicker/DatePicker.module.css +1 -1
  103. package/src/components/Dialog/Dialog.module.css +130 -21
  104. package/src/components/Dialog/Dialog.stories.tsx +179 -2
  105. package/src/components/Dialog/Dialog.tsx +129 -35
  106. package/src/components/Dialog/__tests__/Dialog.test.tsx +190 -9
  107. package/src/components/DragHandleRow/DragHandleRow.tsx +2 -21
  108. package/src/components/Drawer/Drawer.module.css +36 -7
  109. package/src/components/Drawer/Drawer.tsx +9 -10
  110. package/src/components/Drawer/__tests__/Drawer.test.tsx +33 -6
  111. package/src/components/GripIcon/GripIcon.tsx +27 -0
  112. package/src/components/Header/Header.module.css +62 -0
  113. package/src/components/Header/Header.stories.tsx +452 -0
  114. package/src/components/Header/Header.tsx +102 -0
  115. package/src/components/Header/__tests__/Header.test.tsx +104 -0
  116. package/src/components/HeaderFooterLayout/HeaderFooterLayout.module.css +21 -0
  117. package/src/components/HeaderFooterLayout/HeaderFooterLayout.stories.tsx +111 -0
  118. package/src/components/HeaderFooterLayout/HeaderFooterLayout.tsx +54 -0
  119. package/src/components/HeaderFooterLayout/__tests__/HeaderFooterLayout.test.tsx +58 -0
  120. package/src/components/Icon/icons/arrow-left-right.tsx +23 -0
  121. package/src/components/Icon/icons/bold.tsx +20 -0
  122. package/src/components/Icon/icons/calendar.tsx +4 -4
  123. package/src/components/Icon/icons/carrot.tsx +3 -3
  124. package/src/components/Icon/icons/circle-chevron-left.tsx +21 -0
  125. package/src/components/Icon/icons/code.tsx +21 -0
  126. package/src/components/Icon/icons/copy.tsx +21 -0
  127. package/src/components/Icon/icons/credit-card.tsx +21 -0
  128. package/src/components/Icon/icons/database.tsx +22 -0
  129. package/src/components/Icon/icons/download.tsx +22 -0
  130. package/src/components/Icon/icons/file-text.tsx +24 -0
  131. package/src/components/Icon/icons/folder-closed.tsx +21 -0
  132. package/src/components/Icon/icons/folder-open.tsx +20 -0
  133. package/src/components/Icon/icons/folder.tsx +20 -0
  134. package/src/components/Icon/icons/folders.tsx +21 -0
  135. package/src/components/Icon/icons/hat-glasses.tsx +24 -0
  136. package/src/components/Icon/icons/history.tsx +22 -0
  137. package/src/components/Icon/icons/inbox.tsx +21 -0
  138. package/src/components/Icon/icons/index.ts +161 -1
  139. package/src/components/Icon/icons/italic.tsx +22 -0
  140. package/src/components/Icon/icons/layers.tsx +22 -0
  141. package/src/components/Icon/icons/layout-dashboard.tsx +23 -0
  142. package/src/components/Icon/icons/layout-grid.tsx +23 -0
  143. package/src/components/Icon/icons/link.tsx +21 -0
  144. package/src/components/Icon/icons/list-ordered.tsx +25 -0
  145. package/src/components/Icon/icons/list.tsx +25 -0
  146. package/src/components/Icon/icons/luggage.tsx +24 -0
  147. package/src/components/Icon/icons/map-pin.tsx +21 -0
  148. package/src/components/Icon/icons/minus.tsx +20 -0
  149. package/src/components/Icon/icons/paint-bucket.tsx +23 -0
  150. package/src/components/Icon/icons/panel-left.tsx +21 -0
  151. package/src/components/Icon/icons/pin.tsx +21 -0
  152. package/src/components/Icon/icons/rectangle-ellipsis.tsx +23 -0
  153. package/src/components/Icon/icons/refresh-cw.tsx +23 -0
  154. package/src/components/Icon/icons/rotate-cw.tsx +21 -0
  155. package/src/components/Icon/icons/route.tsx +22 -0
  156. package/src/components/Icon/icons/send.tsx +21 -0
  157. package/src/components/Icon/icons/share-2.tsx +24 -0
  158. package/src/components/Icon/icons/sheet.tsx +24 -0
  159. package/src/components/Icon/icons/square-kanban.tsx +23 -0
  160. package/src/components/Icon/icons/table.tsx +23 -0
  161. package/src/components/Icon/icons/user-round-plus.tsx +23 -0
  162. package/src/components/Icon/icons/users.tsx +23 -0
  163. package/src/components/IconPicker/IconPicker.module.css +1 -1
  164. package/src/components/Input/Input.module.css +1 -1
  165. package/src/components/Input/Input.tsx +8 -2
  166. package/src/components/Kbd/Kbd.module.css +1 -1
  167. package/src/components/Markdown/Markdown.module.css +24 -0
  168. package/src/components/Markdown/Markdown.stories.tsx +10 -0
  169. package/src/components/Markdown/Markdown.tsx +166 -29
  170. package/src/components/Markdown/__tests__/Markdown.test.tsx +144 -0
  171. package/src/components/Menu/Menu.module.css +1 -0
  172. package/src/components/Menu/Menu.tsx +72 -22
  173. package/src/components/Menu/__tests__/Menu.test.tsx +30 -0
  174. package/src/components/Menubar/Menubar.tsx +1 -1
  175. package/src/components/Message/Message.module.css +1 -1
  176. package/src/components/MessageScroller/MessageScroller.module.css +12 -1
  177. package/src/components/MessageScroller/MessageScroller.tsx +12 -0
  178. package/src/components/MobileAppsDrawer/MobileAppsDrawer.module.css +10 -9
  179. package/src/components/MobileFooter/MobileFooter.module.css +1 -1
  180. package/src/components/MobileFooter/MobileFooter.tsx +15 -2
  181. package/src/components/MobileFooter/__tests__/MobileFooter.test.tsx +58 -0
  182. package/src/components/MobileHeader/MobileHeader.module.css +14 -1
  183. package/src/components/MobileHeader/MobileHeader.tsx +15 -2
  184. package/src/components/MobileHeader/__tests__/MobileHeader.test.tsx +56 -1
  185. package/src/components/NavList/NavList.module.css +130 -0
  186. package/src/components/NavList/NavList.tsx +136 -0
  187. package/src/components/NavList/__tests__/NavList.test.tsx +109 -0
  188. package/src/components/NavTabs/NavTabs.module.css +1 -1
  189. package/src/components/NotificationsPanel/NotificationsPanel.module.css +258 -0
  190. package/src/components/NotificationsPanel/NotificationsPanel.stories.tsx +61 -0
  191. package/src/components/NotificationsPanel/NotificationsPanel.tsx +187 -0
  192. package/src/components/NotificationsPanel/__tests__/NotificationsPanel.test.tsx +78 -0
  193. package/src/components/OverlayHeader/OverlayHeader.module.css +1 -1
  194. package/src/components/OverlayHeader/OverlayHeader.tsx +19 -4
  195. package/src/components/OverlayHeader/__tests__/OverlayHeader.test.tsx +18 -0
  196. package/src/components/PageContainer/PageContainer.module.css +62 -0
  197. package/src/components/PageContainer/PageContainer.tsx +37 -4
  198. package/src/components/PageContainer/__tests__/PageContainer.test.tsx +41 -8
  199. package/src/components/PageHeader/PageHeader.module.css +54 -0
  200. package/src/components/PageHeader/PageHeader.tsx +146 -5
  201. package/src/components/PageHeader/__tests__/PageHeader.test.tsx +103 -0
  202. package/src/components/PageLayout/PageLayout.module.css +51 -0
  203. package/src/components/PageLayout/PageLayout.stories.tsx +73 -0
  204. package/src/components/PageLayout/PageLayout.tsx +51 -0
  205. package/src/components/PageLayout/__tests__/PageLayout.test.tsx +34 -0
  206. package/src/components/Popover/Popover.module.css +1 -1
  207. package/src/components/Popover/Popover.tsx +86 -4
  208. package/src/components/Popover/__tests__/Popover.test.tsx +165 -0
  209. package/src/components/QuantityStepper/QuantityStepper.module.css +1 -1
  210. package/src/components/Resizable/Resizable.module.css +3 -3
  211. package/src/components/RootLayout/RootLayout.module.css +12 -0
  212. package/src/components/RootLayout/RootLayout.stories.tsx +125 -0
  213. package/src/components/RootLayout/RootLayout.tsx +185 -0
  214. package/src/components/RootLayout/__tests__/RootLayout.test.tsx +161 -0
  215. package/src/components/SegmentedControl/SegmentedControl.module.css +1 -1
  216. package/src/components/Select/Select.module.css +1 -1
  217. package/src/components/Sheet/Sheet.module.css +4 -1
  218. package/src/components/Sheet/Sheet.tsx +5 -5
  219. package/src/components/SplitPane/SplitPane.module.css +4 -4
  220. package/src/components/StatusBadge/StatusBadge.module.css +1 -1
  221. package/src/components/StepStrip/StepStrip.module.css +53 -0
  222. package/src/components/StepStrip/StepStrip.tsx +74 -0
  223. package/src/components/SuggestionInput/SuggestionInput.module.css +2 -2
  224. package/src/components/SwipableMobileCarousel/SwipableMobileCarousel.module.css +12 -3
  225. package/src/components/SwipableMobileCarousel/SwipableMobileCarousel.tsx +25 -9
  226. package/src/components/SwipableMobileCarousel/__tests__/SwipableMobileCarousel.test.tsx +81 -0
  227. package/src/components/SwipableMobileCarouselDots/SwipableMobileCarouselDots.module.css +15 -0
  228. package/src/components/SwipableMobileCarouselDots/SwipableMobileCarouselDots.tsx +12 -1
  229. package/src/components/SwipeStack/SwipeStack.module.css +101 -0
  230. package/src/components/SwipeStack/SwipeStack.tsx +199 -0
  231. package/src/components/SwipeStack/SwipeStackCard.tsx +22 -0
  232. package/src/components/SwipeStack/__tests__/SwipeStack.test.tsx +169 -0
  233. package/src/components/SystemBanner/SystemBanner.module.css +10 -0
  234. package/src/components/Table/Table.module.css +2 -2
  235. package/src/components/Tabs/Tabs.module.css +1 -1
  236. package/src/components/TagInput/TagInput.module.css +2 -2
  237. package/src/components/Textarea/Textarea.module.css +9 -1
  238. package/src/components/Textarea/Textarea.tsx +28 -5
  239. package/src/components/Textarea/__tests__/Textarea.test.tsx +23 -1
  240. package/src/components/ThreeColumnLayout/ThreeColumnLayout.module.css +35 -0
  241. package/src/components/ThreeColumnLayout/ThreeColumnLayout.stories.tsx +152 -0
  242. package/src/components/ThreeColumnLayout/ThreeColumnLayout.tsx +87 -0
  243. package/src/components/ThreeColumnLayout/__tests__/ThreeColumnLayout.test.tsx +78 -0
  244. package/src/components/Toast/Toast.module.css +62 -3
  245. package/src/components/Toast/Toast.stories.tsx +1 -1
  246. package/src/components/Tooltip/Tooltip.module.css +1 -1
  247. package/src/components/UserMenu/UserMenu.module.css +90 -0
  248. package/src/components/UserMenu/UserMenu.stories.tsx +49 -0
  249. package/src/components/UserMenu/UserMenu.tsx +132 -0
  250. package/src/components/UserMenu/__tests__/UserMenu.test.tsx +77 -0
  251. package/src/hooks/__tests__/usePublishShellChromeHeight.test.tsx +118 -0
  252. package/src/hooks/__tests__/useReorderSensors.test.ts +26 -0
  253. package/src/hooks/__tests__/useSnapCarousel.test.tsx +82 -0
  254. package/src/hooks/__tests__/useSwipeStack.test.tsx +155 -0
  255. package/src/hooks/index.ts +9 -0
  256. package/src/hooks/usePublishShellChromeHeight.ts +96 -0
  257. package/src/hooks/useReorderSensors.ts +88 -0
  258. package/src/hooks/useSnapCarousel.ts +211 -6
  259. package/src/hooks/useSwipeStack.ts +235 -0
  260. package/src/index.ts +61 -1
  261. package/src/overlay-shell.ts +65 -0
  262. package/src/stories/DesignSystemOverview.stories.tsx +617 -11
  263. package/src/stories/GripIcon.stories.tsx +29 -0
  264. package/src/stories/LayoutSystem.stories.tsx +639 -0
  265. package/src/stories/MenuEntries.stories.tsx +86 -0
  266. package/src/stories/NavList.stories.tsx +147 -0
  267. package/src/stories/PageContainer.stories.tsx +52 -7
  268. package/src/stories/PageHeader.stories.tsx +54 -1
  269. package/src/stories/StepStrip.stories.tsx +76 -0
  270. package/src/stories/SwipableMobileCarousel.stories.tsx +58 -0
  271. package/src/stories/SwipeStack.stories.tsx +200 -0
  272. package/src/stories/Textarea.stories.tsx +12 -0
  273. package/src/stories/TokenGallery.stories.tsx +50 -0
  274. package/src/tokens/primitives.css +11 -0
  275. package/src/tokens/semantic.css +32 -0
  276. package/src/tokens/theme-presets.css +33 -0
  277. package/src/tokens/theme-presets.ts +72 -0
@@ -5,7 +5,7 @@
5
5
  minmax(0, calc(100% - var(--split-pane-primary-size, 50%)));
6
6
  width: 100%;
7
7
  min-height: 320px;
8
- border: 1px solid var(--sv-color-border);
8
+ border: var(--sv-border-width-hairline) solid var(--sv-color-border);
9
9
  border-radius: var(--sv-radius-lg);
10
10
  overflow: hidden;
11
11
  background: var(--sv-color-surface);
@@ -25,7 +25,7 @@
25
25
  }
26
26
 
27
27
  .pane + .pane {
28
- border-left: 1px solid var(--sv-color-border);
28
+ border-left: var(--sv-border-width-hairline) solid var(--sv-color-border);
29
29
  }
30
30
 
31
31
  .handle {
@@ -34,7 +34,7 @@
34
34
  min-width: 12px;
35
35
  padding: 0;
36
36
  border: 0;
37
- border-inline: 1px solid var(--sv-color-border);
37
+ border-inline: var(--sv-border-width-hairline) solid var(--sv-color-border);
38
38
  cursor: col-resize;
39
39
  background: var(--sv-color-surface-sunken);
40
40
  }
@@ -79,7 +79,7 @@
79
79
  }
80
80
 
81
81
  .pane + .pane {
82
- border-top: 1px solid var(--sv-color-border);
82
+ border-top: var(--sv-border-width-hairline) solid var(--sv-color-border);
83
83
  border-left: 0;
84
84
  }
85
85
  }
@@ -5,7 +5,7 @@
5
5
  min-height: 24px;
6
6
  gap: var(--sv-space-1);
7
7
  padding: 2px var(--sv-space-2);
8
- border: 1px solid var(--sv-color-border);
8
+ border: var(--sv-border-width-hairline) solid var(--sv-color-border);
9
9
  border-radius: var(--sv-radius-full);
10
10
  font-family: var(--sv-font-family);
11
11
  font-size: var(--sv-font-size-xs);
@@ -0,0 +1,53 @@
1
+ .strip {
2
+ display: flex;
3
+ align-items: stretch;
4
+ overflow-x: auto;
5
+ }
6
+
7
+ .step {
8
+ display: flex;
9
+ align-items: center;
10
+ flex-shrink: 0;
11
+ }
12
+
13
+ .connector {
14
+ width: var(--sv-space-4);
15
+ height: 2px;
16
+ flex-shrink: 0;
17
+ background: var(--sv-color-border);
18
+ }
19
+
20
+ .connectorDashed {
21
+ background-image: repeating-linear-gradient(
22
+ to right,
23
+ var(--sv-color-border) 0,
24
+ var(--sv-color-border) 4px,
25
+ transparent 4px,
26
+ transparent 7px
27
+ );
28
+ }
29
+
30
+ .addChip {
31
+ all: unset;
32
+ box-sizing: border-box;
33
+ flex-shrink: 0;
34
+ display: flex;
35
+ align-items: center;
36
+ gap: var(--sv-space-1);
37
+ padding: var(--sv-space-3) var(--sv-space-4);
38
+ border: var(--sv-border-width-hairline) dashed var(--sv-color-border);
39
+ border-radius: var(--sv-radius-lg);
40
+ color: var(--sv-color-text-muted);
41
+ font-size: var(--sv-font-size-sm);
42
+ cursor: pointer;
43
+ }
44
+
45
+ .addChip:hover {
46
+ background: var(--sv-color-surface-sunken);
47
+ color: var(--sv-color-text-primary);
48
+ }
49
+
50
+ .addChip:focus-visible {
51
+ outline: 2px solid var(--sv-color-focus-ring);
52
+ outline-offset: 2px;
53
+ }
@@ -7,7 +7,7 @@
7
7
  line-height: 1.5;
8
8
  color: var(--sv-color-text-primary);
9
9
  background-color: var(--sv-color-surface);
10
- border: 1px solid var(--sv-color-border-strong);
10
+ border: var(--sv-border-width-hairline) solid var(--sv-color-border-strong);
11
11
  border-radius: var(--sv-radius-md);
12
12
  transition:
13
13
  border-color 0.15s ease,
@@ -99,5 +99,5 @@
99
99
 
100
100
  .divider {
101
101
  margin: var(--sv-space-1) var(--sv-space-2);
102
- border-top: 1px solid var(--sv-color-border);
102
+ border-top: var(--sv-border-width-hairline) solid var(--sv-color-border);
103
103
  }
@@ -39,10 +39,19 @@
39
39
  flex-direction: column;
40
40
  }
41
41
 
42
- .dots {
42
+ .indicatorSlot {
43
43
  /* Overlays the bottom of .wrap rather than taking its own layout row —
44
44
  matches both sovereign-tasks' and sovereign-shopper's existing dots
45
- placement. */
45
+ placement. Applied by the carousel itself around WHATEVER
46
+ renderIndicator returns (the default SwipableMobileCarouselDots or a
47
+ caller-supplied override) — a custom renderIndicator has no way to
48
+ import this module's locally-scoped class itself (CSS Modules classnames
49
+ aren't cross-file importable), so positioning must live here, not be
50
+ something each indicator implementation opts into. Previously this class
51
+ was only ever applied to the *default* indicator branch, which silently
52
+ left any custom renderIndicator unpositioned — a static, in-flow sibling
53
+ pushed below the full-height .scroller and clipped out of view instead
54
+ of overlaid on top of it. */
46
55
  position: absolute;
47
56
  left: 0;
48
57
  right: 0;
@@ -50,6 +59,6 @@
50
59
  pointer-events: none;
51
60
  }
52
61
 
53
- .dots > * {
62
+ .indicatorSlot > * {
54
63
  pointer-events: auto;
55
64
  }
@@ -5,6 +5,21 @@
5
5
  gap: var(--sv-space-2);
6
6
  }
7
7
 
8
+ /* Opt-in — see the `density` prop doc comment. Shrinks both the gap and each
9
+ dot's own hit target (20px -> 16px) — for a carousel with enough slides
10
+ that even the space-1 gap alone still read as too wide. The visible 6px
11
+ dot is unchanged; only the surrounding tap-target box shrinks, via the
12
+ descendant override below rather than a second dot variant, so this stays
13
+ a pure CSS opt-in with no JS/prop plumbing beyond `density` itself. */
14
+ .dotsCompact {
15
+ gap: var(--sv-space-1);
16
+ }
17
+
18
+ .dotsCompact .dot {
19
+ width: 16px;
20
+ height: 16px;
21
+ }
22
+
8
23
  .dot {
9
24
  /* A 6px visible dot is too small a hit target on its own — the button's
10
25
  real box is larger (20px) with the dot itself painted by ::before and
@@ -0,0 +1,101 @@
1
+ .wrap {
2
+ display: flex;
3
+ flex-direction: column;
4
+ gap: var(--sv-space-3);
5
+ height: 100%;
6
+ width: 100%;
7
+ }
8
+
9
+ .stack {
10
+ position: relative;
11
+ flex: 1 1 auto;
12
+ min-height: 0;
13
+ }
14
+
15
+ .peek {
16
+ position: absolute;
17
+ inset: 0;
18
+ transform: scale(0.94) translateY(var(--sv-space-3));
19
+ opacity: 0.6;
20
+ pointer-events: none;
21
+ }
22
+
23
+ .cardSlot {
24
+ position: absolute;
25
+ inset: 0;
26
+ }
27
+
28
+ /* Styled directly rather than wrapping the Card component: Card doesn't
29
+ forward a ref, and this element must be the exact node useSwipeStack
30
+ translates/rotates as one unit — a Card wrapping an inner dragged div
31
+ would leave its own border/shadow visually static while only the inner
32
+ div moved. */
33
+ .card {
34
+ position: relative;
35
+ height: 100%;
36
+ width: 100%;
37
+ overflow: hidden;
38
+ background: var(--sv-color-surface-raised);
39
+ border: var(--sv-border-width-hairline) solid var(--sv-color-border);
40
+ border-radius: var(--sv-radius-lg);
41
+ box-shadow: var(--sv-shadow-card);
42
+ touch-action: none; /* always overridden inline with useSwipeStack's computed value */
43
+ user-select: none;
44
+ cursor: grab;
45
+ }
46
+
47
+ .card:active {
48
+ cursor: grabbing;
49
+ }
50
+
51
+ .stamp {
52
+ position: absolute;
53
+ z-index: 1;
54
+ display: flex;
55
+ align-items: center;
56
+ gap: var(--sv-space-1);
57
+ padding: var(--sv-space-1) var(--sv-space-3);
58
+ border: 2px solid var(--sv-color-text-primary);
59
+ border-radius: var(--sv-radius-md);
60
+ background: var(--sv-color-surface-raised);
61
+ color: var(--sv-color-text-primary);
62
+ font-family: var(--sv-font-family);
63
+ font-size: var(--sv-font-size-sm);
64
+ font-weight: var(--sv-font-weight-semibold);
65
+ pointer-events: none;
66
+ }
67
+
68
+ .stampUp {
69
+ top: var(--sv-space-4);
70
+ left: 50%;
71
+ transform: translateX(-50%);
72
+ opacity: var(--sv-stack-progress-up, 0);
73
+ }
74
+
75
+ .stampDown {
76
+ bottom: var(--sv-space-4);
77
+ left: 50%;
78
+ transform: translateX(-50%);
79
+ opacity: var(--sv-stack-progress-down, 0);
80
+ }
81
+
82
+ .stampLeft {
83
+ top: var(--sv-space-4);
84
+ left: var(--sv-space-4);
85
+ transform: rotate(-8deg);
86
+ opacity: var(--sv-stack-progress-left, 0);
87
+ }
88
+
89
+ .stampRight {
90
+ top: var(--sv-space-4);
91
+ right: var(--sv-space-4);
92
+ transform: rotate(8deg);
93
+ opacity: var(--sv-stack-progress-right, 0);
94
+ }
95
+
96
+ .actions {
97
+ display: flex;
98
+ justify-content: center;
99
+ gap: var(--sv-space-2);
100
+ flex: 0 0 auto;
101
+ }
@@ -3,6 +3,16 @@
3
3
  top: 0;
4
4
  /* Sits above sidebar rail (z-index ~10) but below dialogs/overlays (z-index 100) */
5
5
  z-index: 50;
6
+ /* WebKit momentum-scroll re-tiling quirk: a position: sticky element with
7
+ no compositing layer of its own can go stale/blank for a stretch of
8
+ frames during a fast scroll on iOS Safari instead of repainting at its
9
+ stuck position. translateZ(0) promotes it to its own layer, rasterized
10
+ independently of the scroller's tile grid. See
11
+ docs/architecture-rules.md — found and fixed across three sticky
12
+ elements in sovereign-tasks, applied here proactively since this
13
+ component is exactly the same pattern (sticky, inside scrolling
14
+ content). */
15
+ transform: translateZ(0);
6
16
  display: flex;
7
17
  align-items: center;
8
18
  justify-content: center;
@@ -20,11 +20,11 @@
20
20
  }
21
21
 
22
22
  .head .row {
23
- border-bottom: 1px solid var(--sv-color-border-strong);
23
+ border-bottom: var(--sv-border-width-hairline) solid var(--sv-color-border-strong);
24
24
  }
25
25
 
26
26
  .body .row {
27
- border-bottom: 1px solid var(--sv-color-border);
27
+ border-bottom: var(--sv-border-width-hairline) solid var(--sv-color-border);
28
28
  }
29
29
 
30
30
  .body .row:last-child {
@@ -1,6 +1,6 @@
1
1
  .tablist {
2
2
  display: flex;
3
- border-bottom: 1px solid var(--sv-color-border);
3
+ border-bottom: var(--sv-border-width-hairline) solid var(--sv-color-border);
4
4
  /* Horizontal scroll on mobile — scrollbar hidden for clean appearance */
5
5
  overflow-x: auto;
6
6
  scrollbar-width: none;
@@ -15,7 +15,7 @@
15
15
  padding: 5px var(--sv-space-2);
16
16
  color: var(--sv-color-text-primary);
17
17
  background: var(--sv-color-surface);
18
- border: 1px solid var(--sv-color-border-strong);
18
+ border: var(--sv-border-width-hairline) solid var(--sv-color-border-strong);
19
19
  border-radius: var(--sv-radius-md);
20
20
  transition:
21
21
  border-color 0.15s ease,
@@ -50,7 +50,7 @@
50
50
  padding-inline: var(--sv-space-2) 2px;
51
51
  color: var(--sv-color-text-primary);
52
52
  background: var(--sv-color-surface-sunken);
53
- border: 1px solid var(--sv-color-border);
53
+ border: var(--sv-border-width-hairline) solid var(--sv-color-border);
54
54
  border-radius: var(--sv-radius-full);
55
55
  font-family: var(--sv-font-family);
56
56
  font-size: var(--sv-font-size-xs);
@@ -7,7 +7,7 @@
7
7
  line-height: 1.5;
8
8
  color: var(--sv-color-text-primary);
9
9
  background-color: var(--sv-color-surface);
10
- border: 1px solid var(--sv-color-border-strong);
10
+ border: var(--sv-border-width-hairline) solid var(--sv-color-border-strong);
11
11
  border-radius: var(--sv-radius-md);
12
12
  resize: vertical;
13
13
  transition:
@@ -37,3 +37,11 @@
37
37
  cursor: not-allowed;
38
38
  resize: none;
39
39
  }
40
+
41
+ /* Height is driven by the `autoGrow` layout effect (Textarea.tsx), not the
42
+ user — resize: none avoids a drag handle that would fight it; overflow
43
+ hidden avoids a scrollbar flashing on between the old and new height. */
44
+ .textareaAutoGrow {
45
+ overflow: hidden;
46
+ resize: none;
47
+ }
@@ -0,0 +1,35 @@
1
+ .shell {
2
+ display: flex;
3
+ height: 100%;
4
+ overflow: hidden;
5
+ }
6
+
7
+ .sidebar {
8
+ flex-shrink: 0;
9
+ overflow-y: auto;
10
+ background: var(--sv-color-surface-raised);
11
+ border-right: var(--sv-border-width-hairline) solid var(--sv-color-border);
12
+ }
13
+
14
+ /*
15
+ * `display: none`, not `width: 0` — a zero-width flex item still paints its
16
+ * own `border-right` as a 1px hairline down the edge of the viewport, which
17
+ * reads as a stray line rather than a hidden column.
18
+ */
19
+ .sidebarHidden {
20
+ display: none;
21
+ }
22
+
23
+ .main {
24
+ flex: 1;
25
+ min-width: 0;
26
+ overflow-y: auto;
27
+ background: var(--sv-color-surface);
28
+ }
29
+
30
+ .detail {
31
+ flex-shrink: 0;
32
+ overflow-y: auto;
33
+ background: var(--sv-color-surface-raised);
34
+ border-left: var(--sv-border-width-hairline) solid var(--sv-color-border);
35
+ }
@@ -1,7 +1,9 @@
1
1
  /* Toast — transient notification snackbar.
2
2
  *
3
- * Fixed top-right, 320px. Slides in from above. Each toast auto-dismisses
4
- * after `duration` ms. Leading status icon reinforces category at a glance.
3
+ * Desktop: fixed top-right, 320px, slides in from above. Mobile floats
4
+ * bottom-center instead (see the media query near the bottom of this file
5
+ * for why). Each toast auto-dismisses after `duration` ms. Leading status
6
+ * icon reinforces category at a glance.
5
7
  *
6
8
  * Category variants map to the semantic status tokens (info/success/warning/
7
9
  * error) so the visual language is consistent with banners and badges.
@@ -28,7 +30,7 @@
28
30
  padding: var(--sv-space-3) var(--sv-space-4);
29
31
  background: var(--sv-color-surface-raised);
30
32
  color: var(--sv-color-text-primary);
31
- border: 1px solid var(--sv-color-border);
33
+ border: var(--sv-border-width-hairline) solid var(--sv-color-border);
32
34
  border-radius: var(--sv-radius-md);
33
35
  box-shadow: var(--sv-shadow-overlay);
34
36
  pointer-events: all;
@@ -124,6 +126,63 @@
124
126
  }
125
127
  }
126
128
 
129
+ /* Mobile (<=768px, the design system's canonical breakpoint): float
130
+ * bottom-center instead of top-right. Clears any mobile footer/tab bar
131
+ * (--sv-shell-footer-height) and the home-indicator safe area, plus extra
132
+ * breathing room so it visibly floats above the edge rather than sitting
133
+ * flush against it — matches the platform convention (Android Toast,
134
+ * Material 3's "floating" Snackbar). Deliberately not threaded through
135
+ * --sv-shell-header-height instead: a toast can appear on a page with or
136
+ * without a self-rendered mobile header, and bottom-anchoring sidesteps that
137
+ * entirely rather than requiring every call site to account for it.
138
+ * Each toast is centered and content-sized (capped at 360px) rather than
139
+ * stretched to the region's full width, and slides up from below instead of
140
+ * down from above to match its new anchor. */
141
+ @media (max-width: 768px) {
142
+ .region {
143
+ top: auto;
144
+ left: var(--sv-space-4);
145
+ right: var(--sv-space-4);
146
+ bottom: calc(
147
+ var(--sv-shell-footer-height, 0px) + env(safe-area-inset-bottom, 0px) + var(--sv-space-4)
148
+ );
149
+ width: auto;
150
+ align-items: center;
151
+ }
152
+
153
+ .toast {
154
+ width: 100%;
155
+ max-width: 360px;
156
+ animation-name: toastInMobile;
157
+ }
158
+
159
+ .toast.exiting {
160
+ animation-name: toastOutMobile;
161
+ }
162
+ }
163
+
164
+ @keyframes toastInMobile {
165
+ from {
166
+ opacity: 0;
167
+ transform: translateY(8px);
168
+ }
169
+ to {
170
+ opacity: 1;
171
+ transform: translateY(0);
172
+ }
173
+ }
174
+
175
+ @keyframes toastOutMobile {
176
+ from {
177
+ opacity: 1;
178
+ transform: translateY(0);
179
+ }
180
+ to {
181
+ opacity: 0;
182
+ transform: translateY(8px);
183
+ }
184
+ }
185
+
127
186
  @media (prefers-reduced-motion: reduce) {
128
187
  .toast,
129
188
  .toast.exiting {
@@ -9,7 +9,7 @@
9
9
  white-space: nowrap;
10
10
  padding: var(--sv-space-1) var(--sv-space-2);
11
11
  background: var(--sv-color-surface-raised);
12
- border: 1px solid var(--sv-color-border);
12
+ border: var(--sv-border-width-hairline) solid var(--sv-color-border);
13
13
  border-radius: var(--sv-radius-md);
14
14
  box-shadow: var(--sv-shadow-popover);
15
15
  font-size: var(--sv-font-size-xs);
@@ -0,0 +1,90 @@
1
+ .trigger {
2
+ display: inline-flex;
3
+ align-items: center;
4
+ justify-content: center;
5
+ flex-shrink: 0;
6
+ width: 36px;
7
+ height: 36px;
8
+ padding: 0;
9
+ border: var(--sv-border-width-hairline) solid var(--sv-color-accent);
10
+ border-radius: var(--sv-radius-full);
11
+ background-color: var(--sv-color-accent);
12
+ color: var(--sv-color-text-on-accent);
13
+ font-size: var(--sv-font-size-xs);
14
+ font-weight: var(--sv-font-weight-semibold);
15
+ overflow: hidden;
16
+ cursor: pointer;
17
+ }
18
+
19
+ /* The compact `Header` top-bar context's own avatar size. */
20
+ .triggerSm {
21
+ width: 32px;
22
+ height: 32px;
23
+ }
24
+
25
+ .triggerImg {
26
+ width: 100%;
27
+ height: 100%;
28
+ object-fit: cover;
29
+ }
30
+
31
+ .panelHeader {
32
+ padding: var(--sv-space-1) var(--sv-space-1) 0;
33
+ }
34
+
35
+ .userHeader {
36
+ display: flex;
37
+ align-items: center;
38
+ gap: var(--sv-space-3);
39
+ padding: var(--sv-space-2) var(--sv-space-3);
40
+ }
41
+
42
+ .menuAvatar {
43
+ display: flex;
44
+ align-items: center;
45
+ justify-content: center;
46
+ flex-shrink: 0;
47
+ width: 38px;
48
+ height: 38px;
49
+ border-radius: var(--sv-radius-full);
50
+ background-color: var(--sv-color-accent);
51
+ color: var(--sv-color-text-on-accent);
52
+ font-size: var(--sv-font-size-sm);
53
+ font-weight: var(--sv-font-weight-semibold);
54
+ overflow: hidden;
55
+ }
56
+
57
+ .menuAvatarImg {
58
+ width: 100%;
59
+ height: 100%;
60
+ object-fit: cover;
61
+ }
62
+
63
+ .userInfo {
64
+ display: flex;
65
+ flex-direction: column;
66
+ min-width: 0;
67
+ }
68
+
69
+ .userName {
70
+ font-size: var(--sv-font-size-sm);
71
+ font-weight: var(--sv-font-weight-semibold);
72
+ color: var(--sv-color-text-primary);
73
+ white-space: nowrap;
74
+ overflow: hidden;
75
+ text-overflow: ellipsis;
76
+ }
77
+
78
+ .userEmail {
79
+ font-size: var(--sv-font-size-caption);
80
+ color: var(--sv-color-text-muted);
81
+ white-space: nowrap;
82
+ overflow: hidden;
83
+ text-overflow: ellipsis;
84
+ }
85
+
86
+ .divider {
87
+ margin: var(--sv-space-1) 0 0;
88
+ border: none;
89
+ border-top: var(--sv-border-width-hairline) solid var(--sv-color-border);
90
+ }