@d4gger/design-system 3.0.1 → 4.0.0

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 (450) hide show
  1. package/README.md +19 -0
  2. package/dist/components/accordion.css +9 -2
  3. package/dist/components/alert/Alert.cjs +11 -7
  4. package/dist/components/alert/Alert.cjs.map +2 -2
  5. package/dist/components/alert/Alert.d.cts.map +1 -1
  6. package/dist/components/alert/Alert.d.mts.map +1 -1
  7. package/dist/components/alert/Alert.d.ts.map +1 -1
  8. package/dist/components/alert/Alert.js +12 -8
  9. package/dist/components/alert/Alert.js.map +2 -2
  10. package/dist/components/alert.css +13 -0
  11. package/dist/components/article-nodes.css +16 -1
  12. package/dist/components/articleNodes/ArticleNodes.cjs +46 -5
  13. package/dist/components/articleNodes/ArticleNodes.cjs.map +2 -2
  14. package/dist/components/articleNodes/ArticleNodes.d.cts +7 -3
  15. package/dist/components/articleNodes/ArticleNodes.d.cts.map +1 -1
  16. package/dist/components/articleNodes/ArticleNodes.d.mts +7 -3
  17. package/dist/components/articleNodes/ArticleNodes.d.mts.map +1 -1
  18. package/dist/components/articleNodes/ArticleNodes.d.ts +7 -3
  19. package/dist/components/articleNodes/ArticleNodes.d.ts.map +1 -1
  20. package/dist/components/articleNodes/ArticleNodes.js +46 -5
  21. package/dist/components/articleNodes/ArticleNodes.js.map +2 -2
  22. package/dist/components/articleNodes/articleExtensions.cjs +21 -4
  23. package/dist/components/articleNodes/articleExtensions.cjs.map +2 -2
  24. package/dist/components/articleNodes/articleExtensions.d.cts +8 -2
  25. package/dist/components/articleNodes/articleExtensions.d.cts.map +1 -1
  26. package/dist/components/articleNodes/articleExtensions.d.mts +8 -2
  27. package/dist/components/articleNodes/articleExtensions.d.mts.map +1 -1
  28. package/dist/components/articleNodes/articleExtensions.d.ts +8 -2
  29. package/dist/components/articleNodes/articleExtensions.d.ts.map +1 -1
  30. package/dist/components/articleNodes/articleExtensions.js +21 -4
  31. package/dist/components/articleNodes/articleExtensions.js.map +2 -2
  32. package/dist/components/articleNodes/articleNodeViews.cjs +154 -0
  33. package/dist/components/articleNodes/articleNodeViews.cjs.map +7 -0
  34. package/dist/components/articleNodes/articleNodeViews.d.cts +3 -0
  35. package/dist/components/articleNodes/articleNodeViews.d.cts.map +1 -0
  36. package/dist/components/articleNodes/articleNodeViews.d.mts +3 -0
  37. package/dist/components/articleNodes/articleNodeViews.d.mts.map +1 -0
  38. package/dist/components/articleNodes/articleNodeViews.d.ts +3 -0
  39. package/dist/components/articleNodes/articleNodeViews.d.ts.map +1 -0
  40. package/dist/components/articleNodes/articleNodeViews.js +124 -0
  41. package/dist/components/articleNodes/articleNodeViews.js.map +7 -0
  42. package/dist/components/articleNodes/articleNodes.props.cjs.map +1 -1
  43. package/dist/components/articleNodes/articleNodes.props.d.cts +25 -2
  44. package/dist/components/articleNodes/articleNodes.props.d.cts.map +1 -1
  45. package/dist/components/articleNodes/articleNodes.props.d.mts +25 -2
  46. package/dist/components/articleNodes/articleNodes.props.d.mts.map +1 -1
  47. package/dist/components/articleNodes/articleNodes.props.d.ts +25 -2
  48. package/dist/components/articleNodes/articleNodes.props.d.ts.map +1 -1
  49. package/dist/components/banner.css +5 -4
  50. package/dist/components/blockquote.css +7 -4
  51. package/dist/components/bottom-dock.css +132 -0
  52. package/dist/components/bottomDock/BottomDock.cjs +140 -0
  53. package/dist/components/bottomDock/BottomDock.cjs.map +7 -0
  54. package/dist/components/bottomDock/BottomDock.d.cts +25 -0
  55. package/dist/components/bottomDock/BottomDock.d.cts.map +1 -0
  56. package/dist/components/bottomDock/BottomDock.d.mts +25 -0
  57. package/dist/components/bottomDock/BottomDock.d.mts.map +1 -0
  58. package/dist/components/bottomDock/BottomDock.d.ts +25 -0
  59. package/dist/components/bottomDock/BottomDock.d.ts.map +1 -0
  60. package/dist/components/bottomDock/BottomDock.js +110 -0
  61. package/dist/components/bottomDock/BottomDock.js.map +7 -0
  62. package/dist/components/bottomDock/bottomDock.props.cjs +49 -0
  63. package/dist/components/bottomDock/bottomDock.props.cjs.map +7 -0
  64. package/dist/components/bottomDock/bottomDock.props.d.cts +29 -0
  65. package/dist/components/bottomDock/bottomDock.props.d.cts.map +1 -0
  66. package/dist/components/bottomDock/bottomDock.props.d.mts +29 -0
  67. package/dist/components/bottomDock/bottomDock.props.d.mts.map +1 -0
  68. package/dist/components/bottomDock/bottomDock.props.d.ts +29 -0
  69. package/dist/components/bottomDock/bottomDock.props.d.ts.map +1 -0
  70. package/dist/components/bottomDock/bottomDock.props.js +29 -0
  71. package/dist/components/bottomDock/bottomDock.props.js.map +7 -0
  72. package/dist/components/breadcrumb.css +24 -3
  73. package/dist/components/callout.css +20 -7
  74. package/dist/components/card.css +8 -0
  75. package/dist/components/code.css +29 -13
  76. package/dist/components/collapsible/Collapsible.cjs +4 -0
  77. package/dist/components/collapsible/Collapsible.cjs.map +2 -2
  78. package/dist/components/collapsible/Collapsible.d.cts.map +1 -1
  79. package/dist/components/collapsible/Collapsible.d.mts.map +1 -1
  80. package/dist/components/collapsible/Collapsible.d.ts.map +1 -1
  81. package/dist/components/collapsible/Collapsible.js +4 -0
  82. package/dist/components/collapsible/Collapsible.js.map +2 -2
  83. package/dist/components/collapsible.css +10 -1
  84. package/dist/components/command.css +0 -2
  85. package/dist/components/comment-thread.css +15 -7
  86. package/dist/components/commentThread/CommentThread.cjs +45 -17
  87. package/dist/components/commentThread/CommentThread.cjs.map +2 -2
  88. package/dist/components/commentThread/CommentThread.d.cts +6 -6
  89. package/dist/components/commentThread/CommentThread.d.cts.map +1 -1
  90. package/dist/components/commentThread/CommentThread.d.mts +6 -6
  91. package/dist/components/commentThread/CommentThread.d.mts.map +1 -1
  92. package/dist/components/commentThread/CommentThread.d.ts +6 -6
  93. package/dist/components/commentThread/CommentThread.d.ts.map +1 -1
  94. package/dist/components/commentThread/CommentThread.js +45 -17
  95. package/dist/components/commentThread/CommentThread.js.map +2 -2
  96. package/dist/components/commentThread/commentThread.props.cjs.map +1 -1
  97. package/dist/components/commentThread/commentThread.props.d.cts +24 -0
  98. package/dist/components/commentThread/commentThread.props.d.cts.map +1 -1
  99. package/dist/components/commentThread/commentThread.props.d.mts +24 -0
  100. package/dist/components/commentThread/commentThread.props.d.mts.map +1 -1
  101. package/dist/components/commentThread/commentThread.props.d.ts +24 -0
  102. package/dist/components/commentThread/commentThread.props.d.ts.map +1 -1
  103. package/dist/components/config-drawer.css +7 -3
  104. package/dist/components/configDrawer/ConfigDrawer.cjs +1 -1
  105. package/dist/components/configDrawer/ConfigDrawer.cjs.map +2 -2
  106. package/dist/components/configDrawer/ConfigDrawer.js +1 -1
  107. package/dist/components/configDrawer/ConfigDrawer.js.map +2 -2
  108. package/dist/components/context-menu.css +3 -1
  109. package/dist/components/contextMenu/ContextMenu.cjs +37 -6
  110. package/dist/components/contextMenu/ContextMenu.cjs.map +2 -2
  111. package/dist/components/contextMenu/ContextMenu.d.cts +1 -1
  112. package/dist/components/contextMenu/ContextMenu.d.cts.map +1 -1
  113. package/dist/components/contextMenu/ContextMenu.d.mts +1 -1
  114. package/dist/components/contextMenu/ContextMenu.d.mts.map +1 -1
  115. package/dist/components/contextMenu/ContextMenu.d.ts +1 -1
  116. package/dist/components/contextMenu/ContextMenu.d.ts.map +1 -1
  117. package/dist/components/contextMenu/ContextMenu.js +37 -6
  118. package/dist/components/contextMenu/ContextMenu.js.map +2 -2
  119. package/dist/components/drawer.css +23 -6
  120. package/dist/components/dropdownMenu/DropdownMenu.cjs +10 -5
  121. package/dist/components/dropdownMenu/DropdownMenu.cjs.map +2 -2
  122. package/dist/components/dropdownMenu/DropdownMenu.d.cts.map +1 -1
  123. package/dist/components/dropdownMenu/DropdownMenu.d.mts.map +1 -1
  124. package/dist/components/dropdownMenu/DropdownMenu.d.ts.map +1 -1
  125. package/dist/components/dropdownMenu/DropdownMenu.js +10 -5
  126. package/dist/components/dropdownMenu/DropdownMenu.js.map +2 -2
  127. package/dist/components/file-upload.css +36 -9
  128. package/dist/components/floating-panel.css +49 -18
  129. package/dist/components/floatingPanel/FloatingPanel.cjs +156 -58
  130. package/dist/components/floatingPanel/FloatingPanel.cjs.map +2 -2
  131. package/dist/components/floatingPanel/FloatingPanel.d.cts.map +1 -1
  132. package/dist/components/floatingPanel/FloatingPanel.d.mts.map +1 -1
  133. package/dist/components/floatingPanel/FloatingPanel.d.ts.map +1 -1
  134. package/dist/components/floatingPanel/FloatingPanel.js +156 -58
  135. package/dist/components/floatingPanel/FloatingPanel.js.map +2 -2
  136. package/dist/components/grid/Grid.cjs +24 -35
  137. package/dist/components/grid/Grid.cjs.map +2 -2
  138. package/dist/components/grid/Grid.d.cts.map +1 -1
  139. package/dist/components/grid/Grid.d.mts.map +1 -1
  140. package/dist/components/grid/Grid.d.ts.map +1 -1
  141. package/dist/components/grid/Grid.js +24 -35
  142. package/dist/components/grid/Grid.js.map +2 -2
  143. package/dist/components/heading/Heading.cjs +1 -8
  144. package/dist/components/heading/Heading.cjs.map +2 -2
  145. package/dist/components/heading/Heading.d.cts.map +1 -1
  146. package/dist/components/heading/Heading.d.mts.map +1 -1
  147. package/dist/components/heading/Heading.d.ts.map +1 -1
  148. package/dist/components/heading/Heading.js +1 -8
  149. package/dist/components/heading/Heading.js.map +2 -2
  150. package/dist/components/heading/heading.props.cjs +9 -9
  151. package/dist/components/heading/heading.props.cjs.map +2 -2
  152. package/dist/components/heading/heading.props.d.cts +42 -43
  153. package/dist/components/heading/heading.props.d.cts.map +1 -1
  154. package/dist/components/heading/heading.props.d.mts +42 -43
  155. package/dist/components/heading/heading.props.d.mts.map +1 -1
  156. package/dist/components/heading/heading.props.d.ts +42 -43
  157. package/dist/components/heading/heading.props.d.ts.map +1 -1
  158. package/dist/components/heading/heading.props.js +9 -9
  159. package/dist/components/heading/heading.props.js.map +2 -2
  160. package/dist/components/heading.css +127 -104
  161. package/dist/components/hover-card.css +5 -2
  162. package/dist/components/icon/Icon.cjs +3 -0
  163. package/dist/components/icon/Icon.cjs.map +2 -2
  164. package/dist/components/icon/Icon.d.cts +5 -1
  165. package/dist/components/icon/Icon.d.cts.map +1 -1
  166. package/dist/components/icon/Icon.d.mts +5 -1
  167. package/dist/components/icon/Icon.d.mts.map +1 -1
  168. package/dist/components/icon/Icon.d.ts +5 -1
  169. package/dist/components/icon/Icon.d.ts.map +1 -1
  170. package/dist/components/icon/Icon.js +4 -0
  171. package/dist/components/icon/Icon.js.map +2 -2
  172. package/dist/components/icon/icons.cjs +2 -0
  173. package/dist/components/icon/icons.cjs.map +2 -2
  174. package/dist/components/icon/icons.d.cts +5 -0
  175. package/dist/components/icon/icons.d.cts.map +1 -1
  176. package/dist/components/icon/icons.d.mts +5 -0
  177. package/dist/components/icon/icons.d.mts.map +1 -1
  178. package/dist/components/icon/icons.d.ts +5 -0
  179. package/dist/components/icon/icons.d.ts.map +1 -1
  180. package/dist/components/icon/icons.js +2 -0
  181. package/dist/components/icon/icons.js.map +2 -2
  182. package/dist/components/index.cjs +1 -0
  183. package/dist/components/index.cjs.map +2 -2
  184. package/dist/components/index.d.cts +1 -0
  185. package/dist/components/index.d.cts.map +1 -1
  186. package/dist/components/index.d.mts +1 -0
  187. package/dist/components/index.d.mts.map +1 -1
  188. package/dist/components/index.d.ts +1 -0
  189. package/dist/components/index.d.ts.map +1 -1
  190. package/dist/components/index.js +1 -0
  191. package/dist/components/index.js.map +2 -2
  192. package/dist/components/label.css +3 -0
  193. package/dist/components/link.css +33 -97
  194. package/dist/components/notification-center.css +49 -9
  195. package/dist/components/notificationCenter/NotificationCenter.cjs +21 -16
  196. package/dist/components/notificationCenter/NotificationCenter.cjs.map +2 -2
  197. package/dist/components/notificationCenter/NotificationCenter.d.cts.map +1 -1
  198. package/dist/components/notificationCenter/NotificationCenter.d.mts.map +1 -1
  199. package/dist/components/notificationCenter/NotificationCenter.d.ts.map +1 -1
  200. package/dist/components/notificationCenter/NotificationCenter.js +22 -17
  201. package/dist/components/notificationCenter/NotificationCenter.js.map +2 -2
  202. package/dist/components/pills/Pills.cjs +1 -1
  203. package/dist/components/pills/Pills.cjs.map +2 -2
  204. package/dist/components/pills/Pills.js +2 -2
  205. package/dist/components/pills/Pills.js.map +2 -2
  206. package/dist/components/pills.css +6 -0
  207. package/dist/components/popover.css +45 -6
  208. package/dist/components/prose.css +3 -3
  209. package/dist/components/qr-code.css +5 -2
  210. package/dist/components/qrCode/QrCode.cjs +14 -11
  211. package/dist/components/qrCode/QrCode.cjs.map +2 -2
  212. package/dist/components/qrCode/QrCode.d.cts.map +1 -1
  213. package/dist/components/qrCode/QrCode.d.mts.map +1 -1
  214. package/dist/components/qrCode/QrCode.d.ts.map +1 -1
  215. package/dist/components/qrCode/QrCode.js +14 -11
  216. package/dist/components/qrCode/QrCode.js.map +2 -2
  217. package/dist/components/resizable.css +20 -4
  218. package/dist/components/rich-text-editor.css +50 -14
  219. package/dist/components/richTextEditor/EditorTools.cjs +226 -0
  220. package/dist/components/richTextEditor/EditorTools.cjs.map +7 -0
  221. package/dist/components/richTextEditor/EditorTools.d.cts +22 -0
  222. package/dist/components/richTextEditor/EditorTools.d.cts.map +1 -0
  223. package/dist/components/richTextEditor/EditorTools.d.mts +22 -0
  224. package/dist/components/richTextEditor/EditorTools.d.mts.map +1 -0
  225. package/dist/components/richTextEditor/EditorTools.d.ts +22 -0
  226. package/dist/components/richTextEditor/EditorTools.d.ts.map +1 -0
  227. package/dist/components/richTextEditor/EditorTools.js +196 -0
  228. package/dist/components/richTextEditor/EditorTools.js.map +7 -0
  229. package/dist/components/richTextEditor/MentionSuggestions.cjs +96 -0
  230. package/dist/components/richTextEditor/MentionSuggestions.cjs.map +7 -0
  231. package/dist/components/richTextEditor/MentionSuggestions.d.cts +7 -0
  232. package/dist/components/richTextEditor/MentionSuggestions.d.cts.map +1 -0
  233. package/dist/components/richTextEditor/MentionSuggestions.d.mts +7 -0
  234. package/dist/components/richTextEditor/MentionSuggestions.d.mts.map +1 -0
  235. package/dist/components/richTextEditor/MentionSuggestions.d.ts +7 -0
  236. package/dist/components/richTextEditor/MentionSuggestions.d.ts.map +1 -0
  237. package/dist/components/richTextEditor/MentionSuggestions.js +66 -0
  238. package/dist/components/richTextEditor/MentionSuggestions.js.map +7 -0
  239. package/dist/components/richTextEditor/RichTextEditor.cjs +53 -206
  240. package/dist/components/richTextEditor/RichTextEditor.cjs.map +3 -3
  241. package/dist/components/richTextEditor/RichTextEditor.d.cts +17 -7
  242. package/dist/components/richTextEditor/RichTextEditor.d.cts.map +1 -1
  243. package/dist/components/richTextEditor/RichTextEditor.d.mts +17 -7
  244. package/dist/components/richTextEditor/RichTextEditor.d.mts.map +1 -1
  245. package/dist/components/richTextEditor/RichTextEditor.d.ts +17 -7
  246. package/dist/components/richTextEditor/RichTextEditor.d.ts.map +1 -1
  247. package/dist/components/richTextEditor/RichTextEditor.js +53 -206
  248. package/dist/components/richTextEditor/RichTextEditor.js.map +3 -3
  249. package/dist/components/richTextEditor/editorTokens.cjs +75 -0
  250. package/dist/components/richTextEditor/editorTokens.cjs.map +7 -0
  251. package/dist/components/richTextEditor/editorTokens.d.cts +21 -0
  252. package/dist/components/richTextEditor/editorTokens.d.cts.map +1 -0
  253. package/dist/components/richTextEditor/editorTokens.d.mts +21 -0
  254. package/dist/components/richTextEditor/editorTokens.d.mts.map +1 -0
  255. package/dist/components/richTextEditor/editorTokens.d.ts +21 -0
  256. package/dist/components/richTextEditor/editorTokens.d.ts.map +1 -0
  257. package/dist/components/richTextEditor/editorTokens.js +55 -0
  258. package/dist/components/richTextEditor/editorTokens.js.map +7 -0
  259. package/dist/components/scroll-area.css +12 -0
  260. package/dist/components/scrollArea/ScrollArea.cjs +12 -1
  261. package/dist/components/scrollArea/ScrollArea.cjs.map +2 -2
  262. package/dist/components/scrollArea/ScrollArea.d.cts.map +1 -1
  263. package/dist/components/scrollArea/ScrollArea.d.mts.map +1 -1
  264. package/dist/components/scrollArea/ScrollArea.d.ts.map +1 -1
  265. package/dist/components/scrollArea/ScrollArea.js +12 -1
  266. package/dist/components/scrollArea/ScrollArea.js.map +2 -2
  267. package/dist/components/segmentedControl/SegmentedControl.cjs +2 -2
  268. package/dist/components/segmentedControl/SegmentedControl.cjs.map +2 -2
  269. package/dist/components/segmentedControl/SegmentedControl.d.cts.map +1 -1
  270. package/dist/components/segmentedControl/SegmentedControl.d.mts.map +1 -1
  271. package/dist/components/segmentedControl/SegmentedControl.d.ts.map +1 -1
  272. package/dist/components/segmentedControl/SegmentedControl.js +2 -2
  273. package/dist/components/segmentedControl/SegmentedControl.js.map +2 -2
  274. package/dist/components/separator.css +3 -9
  275. package/dist/components/sidebar/Sidebar.cjs +12 -4
  276. package/dist/components/sidebar/Sidebar.cjs.map +2 -2
  277. package/dist/components/sidebar/Sidebar.d.cts +4 -1
  278. package/dist/components/sidebar/Sidebar.d.cts.map +1 -1
  279. package/dist/components/sidebar/Sidebar.d.mts +4 -1
  280. package/dist/components/sidebar/Sidebar.d.mts.map +1 -1
  281. package/dist/components/sidebar/Sidebar.d.ts +4 -1
  282. package/dist/components/sidebar/Sidebar.d.ts.map +1 -1
  283. package/dist/components/sidebar/Sidebar.js +12 -4
  284. package/dist/components/sidebar/Sidebar.js.map +2 -2
  285. package/dist/components/sidebar/sidebar.props.cjs +8 -1
  286. package/dist/components/sidebar/sidebar.props.cjs.map +2 -2
  287. package/dist/components/sidebar/sidebar.props.d.cts +9 -1
  288. package/dist/components/sidebar/sidebar.props.d.cts.map +1 -1
  289. package/dist/components/sidebar/sidebar.props.d.mts +9 -1
  290. package/dist/components/sidebar/sidebar.props.d.mts.map +1 -1
  291. package/dist/components/sidebar/sidebar.props.d.ts +9 -1
  292. package/dist/components/sidebar/sidebar.props.d.ts.map +1 -1
  293. package/dist/components/sidebar/sidebar.props.js +8 -1
  294. package/dist/components/sidebar/sidebar.props.js.map +2 -2
  295. package/dist/components/sidebar.css +28 -0
  296. package/dist/components/sonner.css +78 -16
  297. package/dist/components/stepper.css +23 -12
  298. package/dist/components/tab-nav.css +25 -13
  299. package/dist/components/tabNav/TabNav.cjs +1 -4
  300. package/dist/components/tabNav/TabNav.cjs.map +2 -2
  301. package/dist/components/tabNav/TabNav.d.cts.map +1 -1
  302. package/dist/components/tabNav/TabNav.d.mts.map +1 -1
  303. package/dist/components/tabNav/TabNav.d.ts.map +1 -1
  304. package/dist/components/tabNav/TabNav.js +1 -4
  305. package/dist/components/tabNav/TabNav.js.map +2 -2
  306. package/dist/components/table-of-contents.css +12 -2
  307. package/dist/components/tableOfContents/TableOfContents.cjs +11 -4
  308. package/dist/components/tableOfContents/TableOfContents.cjs.map +2 -2
  309. package/dist/components/tableOfContents/TableOfContents.d.cts.map +1 -1
  310. package/dist/components/tableOfContents/TableOfContents.d.mts.map +1 -1
  311. package/dist/components/tableOfContents/TableOfContents.d.ts.map +1 -1
  312. package/dist/components/tableOfContents/TableOfContents.js +11 -4
  313. package/dist/components/tableOfContents/TableOfContents.js.map +2 -2
  314. package/dist/components/tabs/Tabs.cjs +39 -54
  315. package/dist/components/tabs/Tabs.cjs.map +2 -2
  316. package/dist/components/tabs/Tabs.d.cts.map +1 -1
  317. package/dist/components/tabs/Tabs.d.mts.map +1 -1
  318. package/dist/components/tabs/Tabs.d.ts.map +1 -1
  319. package/dist/components/tabs/Tabs.js +39 -54
  320. package/dist/components/tabs/Tabs.js.map +2 -2
  321. package/dist/components/tabs.css +52 -7
  322. package/dist/components/text/text.props.cjs +9 -9
  323. package/dist/components/text/text.props.cjs.map +2 -2
  324. package/dist/components/text/text.props.d.cts +42 -43
  325. package/dist/components/text/text.props.d.cts.map +1 -1
  326. package/dist/components/text/text.props.d.mts +42 -43
  327. package/dist/components/text/text.props.d.mts.map +1 -1
  328. package/dist/components/text/text.props.d.ts +42 -43
  329. package/dist/components/text/text.props.d.ts.map +1 -1
  330. package/dist/components/text/text.props.js +9 -9
  331. package/dist/components/text/text.props.js.map +2 -2
  332. package/dist/components/text/typography.props.cjs +32 -0
  333. package/dist/components/text/typography.props.cjs.map +7 -0
  334. package/dist/components/text/typography.props.d.cts +3 -0
  335. package/dist/components/text/typography.props.d.cts.map +1 -0
  336. package/dist/components/text/typography.props.d.mts +3 -0
  337. package/dist/components/text/typography.props.d.mts.map +1 -0
  338. package/dist/components/text/typography.props.d.ts +3 -0
  339. package/dist/components/text/typography.props.d.ts.map +1 -0
  340. package/dist/components/text/typography.props.js +12 -0
  341. package/dist/components/text/typography.props.js.map +7 -0
  342. package/dist/components/text-field.css +1 -0
  343. package/dist/components/text.css +41 -6
  344. package/dist/components/theme-panel.css +6 -0
  345. package/dist/components/toast/Toast.cjs +3 -1
  346. package/dist/components/toast/Toast.cjs.map +2 -2
  347. package/dist/components/toast/Toast.d.cts.map +1 -1
  348. package/dist/components/toast/Toast.d.mts.map +1 -1
  349. package/dist/components/toast/Toast.d.ts.map +1 -1
  350. package/dist/components/toast/Toast.js +3 -1
  351. package/dist/components/toast/Toast.js.map +2 -2
  352. package/dist/components/toast.css +36 -36
  353. package/dist/components/toggle-tip.css +58 -9
  354. package/dist/components/toggleTip/ToggleTip.cjs +9 -5
  355. package/dist/components/toggleTip/ToggleTip.cjs.map +2 -2
  356. package/dist/components/toggleTip/ToggleTip.d.cts.map +1 -1
  357. package/dist/components/toggleTip/ToggleTip.d.mts.map +1 -1
  358. package/dist/components/toggleTip/ToggleTip.d.ts.map +1 -1
  359. package/dist/components/toggleTip/ToggleTip.js +9 -5
  360. package/dist/components/toggleTip/ToggleTip.js.map +2 -2
  361. package/dist/components/toolbar/Toolbar.cjs +10 -7
  362. package/dist/components/toolbar/Toolbar.cjs.map +2 -2
  363. package/dist/components/toolbar/Toolbar.js +10 -7
  364. package/dist/components/toolbar/Toolbar.js.map +2 -2
  365. package/dist/components/toolbar.css +58 -4
  366. package/dist/components/tooltip.css +9 -5
  367. package/dist/components/tree-view.css +17 -3
  368. package/dist/components/treeView/TreeView.cjs +76 -21
  369. package/dist/components/treeView/TreeView.cjs.map +2 -2
  370. package/dist/components/treeView/TreeView.d.cts.map +1 -1
  371. package/dist/components/treeView/TreeView.d.mts.map +1 -1
  372. package/dist/components/treeView/TreeView.d.ts.map +1 -1
  373. package/dist/components/treeView/TreeView.js +76 -21
  374. package/dist/components/treeView/TreeView.js.map +2 -2
  375. package/dist/components.css +1 -0
  376. package/dist/docs/README.md +1 -0
  377. package/dist/docs/component-contract.md +4 -3
  378. package/dist/docs/component-index.json +9 -1
  379. package/dist/docs/components/accordion.md +5 -36
  380. package/dist/docs/components/alert.md +17 -10
  381. package/dist/docs/components/article-nodes.md +59 -2
  382. package/dist/docs/components/aspect-ratio.md +3 -26
  383. package/dist/docs/components/banner.md +7 -7
  384. package/dist/docs/components/blockquote.md +15 -14
  385. package/dist/docs/components/bottom-dock.md +146 -0
  386. package/dist/docs/components/box.md +3 -34
  387. package/dist/docs/components/breadcrumb.md +13 -8
  388. package/dist/docs/components/callout.md +18 -7
  389. package/dist/docs/components/card.md +9 -2
  390. package/dist/docs/components/code.md +33 -220
  391. package/dist/docs/components/collapsible.md +11 -35
  392. package/dist/docs/components/command.md +2 -0
  393. package/dist/docs/components/comment-thread.md +51 -1
  394. package/dist/docs/components/config-drawer.md +72 -171
  395. package/dist/docs/components/container.md +2 -0
  396. package/dist/docs/components/context-menu.md +19 -5
  397. package/dist/docs/components/dialog.md +3 -1
  398. package/dist/docs/components/drawer.md +17 -6
  399. package/dist/docs/components/dropdown-menu.md +11 -2
  400. package/dist/docs/components/em.md +1 -1
  401. package/dist/docs/components/file-upload.md +13 -7
  402. package/dist/docs/components/floating-panel.md +79 -285
  403. package/dist/docs/components/form.md +4 -0
  404. package/dist/docs/components/grid.md +11 -60
  405. package/dist/docs/components/heading.md +35 -32
  406. package/dist/docs/components/hover-card.md +9 -1
  407. package/dist/docs/components/kbd.md +2 -0
  408. package/dist/docs/components/label.md +11 -9
  409. package/dist/docs/components/link.md +31 -209
  410. package/dist/docs/components/notification-center.md +24 -14
  411. package/dist/docs/components/page-header.md +2 -0
  412. package/dist/docs/components/pagination.md +4 -0
  413. package/dist/docs/components/pills.md +13 -4
  414. package/dist/docs/components/popover.md +10 -3
  415. package/dist/docs/components/prose.md +9 -0
  416. package/dist/docs/components/qr-code.md +12 -12
  417. package/dist/docs/components/quote.md +9 -4
  418. package/dist/docs/components/resizable.md +26 -18
  419. package/dist/docs/components/rich-text-editor.md +68 -18
  420. package/dist/docs/components/scroll-area.md +17 -9
  421. package/dist/docs/components/section.md +3 -38
  422. package/dist/docs/components/segmented-control.md +1 -1
  423. package/dist/docs/components/segmented-meter.md +9 -0
  424. package/dist/docs/components/separator.md +10 -46
  425. package/dist/docs/components/sidebar.md +17 -3
  426. package/dist/docs/components/sonner.md +25 -16
  427. package/dist/docs/components/stepper.md +8 -33
  428. package/dist/docs/components/strong.md +1 -1
  429. package/dist/docs/components/tab-nav.md +33 -96
  430. package/dist/docs/components/table-of-contents.md +8 -2
  431. package/dist/docs/components/tabs.md +19 -50
  432. package/dist/docs/components/text-field.md +1 -0
  433. package/dist/docs/components/text.md +34 -28
  434. package/dist/docs/components/theme-panel.md +3 -28
  435. package/dist/docs/components/theme.md +7 -3
  436. package/dist/docs/components/toast.md +27 -13
  437. package/dist/docs/components/toggle-tip.md +58 -241
  438. package/dist/docs/components/toolbar.md +16 -39
  439. package/dist/docs/components/tooltip.md +13 -7
  440. package/dist/docs/components/tree-view.md +22 -55
  441. package/dist/generated/tokens.cjs +1 -0
  442. package/dist/generated/tokens.cjs.map +2 -2
  443. package/dist/generated/tokens.d.cts.map +1 -1
  444. package/dist/generated/tokens.d.mts.map +1 -1
  445. package/dist/generated/tokens.d.ts.map +1 -1
  446. package/dist/generated/tokens.js +1 -0
  447. package/dist/generated/tokens.js.map +2 -2
  448. package/dist/styles.css +1632 -1300
  449. package/dist/tokens.css +344 -362
  450. package/package.json +1 -1
@@ -29,15 +29,15 @@ An inbox-style notification surface that groups header, list, and footer regions
29
29
  | `NotificationCenter.List` | `<div>` (or `Slot` host) | `dsx-notification-center__list` | Vertical list of items. Capped at `max-height: 400px` with `overflow-y: auto`. |
30
30
  | `NotificationCenter.Footer` | `<div>` (or `Slot` host) | `dsx-notification-center__footer` | Footer row (typically a "View all" link or button). |
31
31
  | `NotificationCenter.Item` | `<div>` (or `Slot` host) | `dsx-notification-center__item` (with `--unread` modifier when `unread` is true) | A single notification row. The CSS file ships helper classes `dsx-notification-center__item-title`, `dsx-notification-center__item-description`, and `dsx-notification-center__item-time` for the typical layout. |
32
- | `NotificationCenter.Trigger` | `IconButton` + `Badge` fragment | `dsx-notification-center__trigger` and `dsx-notification-center__badge` | Bell-style trigger. Wraps an `IconButton` (size `sm`, variant `ghost`, default `aria-label="Notifications"`) and conditionally renders a `Badge` with the unread count (capped at `'99+'`). The trigger is rendered as a React fragment so it can be placed anywhere. |
32
+ | `NotificationCenter.Trigger` | `IconButton` containing Icon + Badge | `dsx-notification-center__trigger` and `dsx-notification-center__badge` | Bell-style trigger (size `sm`, variant `ghost`) with an accessible unread-count name. The badge sits at the bell's upper trailing corner (capped at `'99+'`); the host reserves the count's width and asChild preserves child/ref composition. |
33
33
 
34
34
  **Internal layout:**
35
35
 
36
36
  - The root is a flex column. The header sits at the top, the list fills the middle, the footer sits at the bottom.
37
- - In the `popover` variant (the default), the root is sized `width: 320px`, has a `var(--dsx-rounded-lg)` radius, a 1px outline, an `var(--dsx-color-panel-translucent)` background, and a `var(--dsx-shadow-card-md)` shadow.
37
+ - In the `popover` variant (the default), the root is sized `width: var(--dsx-sheet-width-sm), max-width: 100%`, has a `var(--dsx-rounded-lg)` radius, a 1px outline, an `var(--dsx-color-panel-translucent)` background, and a `var(--dsx-shadow-card-md)` shadow.
38
38
  - In the `sidebar` variant, the root is full-width / full-height with a flat `var(--dsx-color-surface)` background and no border or shadow.
39
39
  - `NotificationCenter.Item` rows have a `var(--dsx-space-md)` padding and a 1px bottom border. The last item drops the bottom border. The item background switches to `var(--dsx-color-surface-raised)` with a 1px primary left border when `unread` is true.
40
- - `NotificationCenter.Trigger` is a positioned `inline-flex` container. The badge is absolutely positioned in the top-right corner with a `-var(--dsx-space-xs)` offset, a `var(--dsx-rounded-full)` radius, and label-small typography.
40
+ - `NotificationCenter.Trigger` is an `inline-flex` button with intrinsic width and a 44px minimum width/height (`size-xl + space-xs`). The 16px badge is raised by 8px at the bell's trailing corner, with a 4px horizontal overlap and 8px host padding. Normal flow reserves the badge width; increasing counts grow toward the trailing edge rather than covering the bell. The badge uses rounded-full and label-small typography.
41
41
 
42
42
  ## Props contract
43
43
 
@@ -101,7 +101,7 @@ The trigger is a thin wrapper around `IconButton`; it forwards all of `IconButto
101
101
 
102
102
  **Responsive behavior:**
103
103
 
104
- - The component does not write `@media` rules. The `popover` variant uses a fixed 320px width; on small screens the consumer is expected to swap in a different layout (e.g. a full-screen Sheet) and render the same items in `NotificationCenter` with the `sidebar` variant.
104
+ - The component does not write width media queries. The popover variant prefers `--dsx-sheet-width-sm` (320px) and caps to its parent width. Header actions wrap intrinsically; the list shrinks and scrolls. Use sidebar to fill a containing panel.
105
105
 
106
106
  **Reduced motion:**
107
107
 
@@ -113,7 +113,7 @@ Every CSS value the component paints is a `var(--dsx-*)` token.
113
113
 
114
114
  | Property | Token | Role |
115
115
  |---|---|---|
116
- | Popover width | `320px` | Popover variant width |
116
+ | Popover width | `var(--dsx-sheet-width-sm)` with max-width=100% | Preferred width, parent-contained |
117
117
  | Popover border-radius | `var(--dsx-rounded-lg)` | Popover roundness |
118
118
  | Popover border | `var(--dsx-border-width-sm) solid var(--dsx-color-outline)` | Popover edge |
119
119
  | Popover background | `var(--dsx-color-panel-translucent)` | Popover surface |
@@ -138,10 +138,11 @@ Every CSS value the component paints is a `var(--dsx-*)` token.
138
138
  | Item time type ramp | `var(--dsx-typography-label-small-*)` | Item time text |
139
139
  | Footer padding | `var(--dsx-space-sm)` | Footer gutter |
140
140
  | Footer border-top | `var(--dsx-border-width-sm) solid var(--dsx-color-outline-variant)` | Footer separator |
141
- | Trigger position | `relative` | Anchors the badge |
142
- | Badge position | `absolute` with `-var(--dsx-space-xs)` offsets | Badge placement |
143
- | Badge min-width | `var(--dsx-size-xs)` | Badge min width |
144
- | Badge height | `var(--dsx-size-xs)` | Badge height |
141
+ | Trigger width / minimum dimensions | `auto` / `calc(var(--dsx-size-xl) + var(--dsx-space-xs))` | Count expands the 44px button |
142
+ | Trigger gap / inline padding | `0` / `var(--dsx-space-sm)` | Count corner containment |
143
+ | Badge placement | relative, raised by space-sm, negative space-xs inline margin | Upper trailing corner; reserves count width |
144
+ | Badge min-width | `var(--dsx-size-sm)` | Badge min width |
145
+ | Badge height | `var(--dsx-size-sm)` | Badge height |
145
146
  | Badge radius | `var(--dsx-rounded-full)` | Badge roundness |
146
147
  | Badge type ramp | `var(--dsx-typography-label-small-*)` | Badge text |
147
148
 
@@ -159,7 +160,7 @@ The component has no motion. The panel itself is static; transitions on open / c
159
160
 
160
161
  - The root renders as a `<div>` without an explicit `role`. The canonical pattern is to wrap the panel in a `Popover` or `Sheet`; the wrapping surface is responsible for the modal / non-modal role and focus management.
161
162
  - `NotificationCenter.List` is a plain `<div>`. If the consumer wants to expose the list as an `aria-live` region (e.g. for incoming notifications), they can add the `aria-live` and `aria-relevant` attributes manually.
162
- - `NotificationCenter.Trigger` renders an `IconButton` with `role="button"` and a default `aria-label` of `'Notifications'`. The accompanying badge is announced through the `aria-label` (`Notifications: 5 unread`, or similar — the consumer is responsible for composing the full accessible name when the count is non-zero).
163
+ - `NotificationCenter.Trigger` renders an IconButton named “Notifications” at zero, or “Notifications, N unread” when positive. An explicit aria-label overrides this fallback. The visual badge is aria-hidden; it stays at the bell's upper trailing corner inside the trigger host.
163
164
 
164
165
  **Keyboard:**
165
166
 
@@ -171,7 +172,7 @@ The component has no motion. The panel itself is static; transitions on open / c
171
172
  **Focus:**
172
173
 
173
174
  - The component does not render a focus ring on items or panels. Interactive content provides its own ring.
174
- - The trigger button gets the standard `IconButton` focus ring.
175
+ - The trigger button gets the standard `IconButton` focus ring and a minimum 44px target containing both the bell and count.
175
176
 
176
177
  **Reduced motion:**
177
178
 
@@ -180,7 +181,7 @@ The component has no motion. The panel itself is static; transitions on open / c
180
181
  **Color and meaning:**
181
182
 
182
183
  - Unread state is communicated by both the left border accent and the background lift. The text is unchanged; consumers can add an `aria-label="Unread"` to make the state screen-reader-accessible.
183
- - The trigger badge is a red `Badge` (`variant="error"`). The label is the numeric count.
184
+ - The trigger badge is an accent `Badge` (`variant="primary"`), using accent-track and accent-contrast from the inherited Theme. The label is the numeric count.
184
185
 
185
186
  **Naming:**
186
187
 
@@ -210,7 +211,7 @@ The component has no motion. The panel itself is static; transitions on open / c
210
211
 
211
212
  **Token story:**
212
213
 
213
- - Renders the default panel inside a `Theme` wrapper with `accentColor="silver"` and `accentColor="bronze"`. Asserts the unread item border tracks `--dsx-color-primary` and is not affected by the accent token.
214
+ - Renders the default panel inside a `Theme` wrapper with `accentColor="astral"` and `accentColor="spark"`. Asserts the unread item border tracks `--dsx-color-primary` and is not affected by the accent token.
214
215
 
215
216
  **A11y story:**
216
217
 
@@ -228,7 +229,7 @@ The component has no motion. The panel itself is static; transitions on open / c
228
229
  **Composes from:**
229
230
 
230
231
  - `IconButton` (`src/components/iconButton`): the trigger renders a small ghost `IconButton`. The trigger forwards all `IconButton` props and defaults `aria-label="Notifications"`.
231
- - `Badge` (`src/components/badge`): the trigger badge is a `Badge` with `variant="error"`, `size="sm"`. The count is rendered as plain text and is capped at `'99+'` for counts greater than 99.
232
+ - `Badge` (`src/components/badge`): the trigger badge is a `Badge` with `variant="primary"`, `size="sm"`. The count is rendered as plain text and is capped at `'99+'` for counts greater than 99.
232
233
  - `@radix-ui/react-slot`: enables `asChild` on the root and on the named slots.
233
234
 
234
235
  **Used by:**
@@ -244,3 +245,12 @@ The component has no motion. The panel itself is static; transitions on open / c
244
245
 
245
246
  - App-owned data: notification text, timestamps, action handlers, and the unread count source.
246
247
  - DS-owned visuals: token bindings, slot classes, unread state styling, and the trigger badge geometry.
248
+
249
+ ## Overlay review fixture
250
+
251
+ `/docs/notification-center` shows native button rows that mark themselves read,
252
+ Mark all read, Reset inbox, a real Popover and trigger counts 0/1/5/150. Item
253
+ button hosts have width=100%, inherited typography, start-aligned wrapping text,
254
+ and hover/focus/pressed feedback. The list is min-height=0 and flexes; header
255
+ and footer remain nonshrinking. Payload, routing and read persistence are
256
+ consumer-owned. Trigger asChild preserves host/ref/click composition.
@@ -119,6 +119,8 @@ Rules:
119
119
 
120
120
  ## Playground demo spec
121
121
 
122
+ The live example uses a compact named icon action so the title remains readable in a 320px review frame, plus a title-only header. Header height and title ellipsis behavior remain canonical.
123
+
122
124
  `PageHeader` is registered in `apps/playground/lib/registry/display.tsx` under the `page-header` key.
123
125
 
124
126
  **Default story:**
@@ -363,3 +363,7 @@ Rules:
363
363
 
364
364
  - App-owned data: the pagination strategy (offset / limit vs cursor), the page-size policy, the link generation, and the total count.
365
365
  - DS-owned visuals: the `dsx-pagination` root class, the slot classes, the token bindings, and the `data-*` and ARIA attribute contract.
366
+
367
+ ## Reconciliation stories
368
+
369
+ The live PaginationBar owns page and limit state, commits first/last/previous/next and page input, resets to page 1 when the limit changes, and shows a dense single-page boundary reference. Controls remain visible and wrap within narrow hosts.
@@ -15,7 +15,7 @@ depends_on:
15
15
 
16
16
  ## Purpose
17
17
 
18
- A compact cluster of selectable pills rendered as a horizontal flex list. Use Pills for filter chips, multi-select chip rows, and segmented status indicators. For a single label surface, use `Badge`. For a lone removable label, use `Tag`. For mutually exclusive options rendered as a segmented control, use `SegmentedControl` or `ToggleGroup`. Cardinality rule (F6 brief): a row of chips with selection state is Pills; one chip with a remove action is a Tag. Pills claims selection, never lone dismissal.
18
+ A compact cluster of selectable pills rendered as a horizontal flex list. Use Pills for filter chips, multi-select chip rows, and segmented status indicators. For a single label surface, use `Badge`. For a lone removable label, use `Tag`. For mutually exclusive options rendered as a segmented control, use `SegmentedControl` or `ToggleGroup`. Cardinality rule (F6 brief): a row of chips with selection state is Pills; one chip with a remove action is a Tag. Selection is consumer-owned: a plain `Pill` is a list item, not an interactive selection control. Compose a button with `aria-pressed` or an existing Toggle inside the item when selection is required.
19
19
 
20
20
  ## Anatomy & slots
21
21
 
@@ -97,7 +97,7 @@ Each pill also accepts the standard HTML attributes for its host element. The `c
97
97
 
98
98
  **Responsive behavior:**
99
99
 
100
- - The component does not write `@media` rules. `size`, `variant`, `color`, and `radius` are single-value only.
100
+ - The component does not write `@media` rules. `size`, `variant`, `color`, and `radius` are single-value only. The cluster always wraps; each item is capped to the available width and breaks long labels. The remove button reserves a non-shrinking 24px square (`size-md`).
101
101
 
102
102
  **Reduced motion:**
103
103
 
@@ -179,7 +179,7 @@ The component is static. Hover and focus states are instant.
179
179
 
180
180
  **Naming:**
181
181
 
182
- - The pill's `children` are the accessible name. The remove button has a hard-coded `aria-label="Remove"`; consumers that need a contextual label should override the `aria-label` via the standard HTML attribute spread.
182
+ - The pill's `children` are the accessible name. The built-in remove button has a fixed `aria-label="Remove"`. Attributes on the `Pill` host do not override this child button. A consumer needing a contextual action name can compose its own labelled button inside `Pill` instead of using `removable`.
183
183
 
184
184
  ## Playground demo spec
185
185
 
@@ -205,7 +205,7 @@ The component is static. Hover and focus states are instant.
205
205
 
206
206
  **Token story:**
207
207
 
208
- - Renders inside a `Theme` wrapper with `accentColor="silver"` and `accentColor="bronze"`. Pills with a `color` prop track `data-accent-color`; the story asserts the destructive and link pills do not flip color because they read from the error and primary palettes.
208
+ - Renders inside a `Theme` wrapper with `accentColor="warp"` and `accentColor="ray"`. Pills with a `color` prop track `data-accent-color`; the story asserts the destructive and link pills do not flip color because they read from the error and primary palettes.
209
209
 
210
210
  **A11y story:**
211
211
 
@@ -244,3 +244,12 @@ The component is static. Hover and focus states are instant.
244
244
 
245
245
  - App-owned data: the cluster items, the per-pill labels, the selection state (for filter chips), and the dismiss callbacks.
246
246
  - DS-owned visuals: token bindings, the modifier classes, the per-pill surface palette, and the remove button.
247
+
248
+ ## Reconciliation stories
249
+
250
+ `Pill asChild` slots a single consumer host and appends its built-in removal
251
+ button inside that host. The host remains responsible for valid list semantics;
252
+ use a list item when placing it directly in `Pills`. Slotted selection controls
253
+ and removable slotted items must mount without a multiple-child Slot error.
254
+
255
+ The live example removes and resets actual filter labels, includes a long wrapping label, and demonstrates consumer-owned selection with labelled aria-pressed buttons inside list items. Static variants are labelled as visual references.
@@ -82,7 +82,7 @@ An interactive floating surface anchored to a trigger. `Popover` is more interac
82
82
 
83
83
  **Close props:**
84
84
 
85
- `Popover.Close` accepts the standard Radix `Close` props.
85
+ `Popover.Close` accepts the standard Radix `Close` props. It is an inline dismissal action, normally composed with `asChild` over a Button. It has no fixed corner position or icon-only dimensions; consumers own the label and placement. When composed over Button, its rest palette and border are preserved; Button state selectors own hover, pressed, disabled and high-contrast behavior.
86
86
 
87
87
  Rules:
88
88
 
@@ -137,8 +137,7 @@ Rules:
137
137
  | Description color | `var(--dsx-color-on-surface-variant)` | Body copy. |
138
138
  | Content z-index | `calc(var(--dsx-z-index-modal, 90) + 1)` | Keeps portaled content above both sticky chrome and a modal-tier surface that owns its trigger. |
139
139
  | Positioner z-index | `var(--dsx-z-index-popover, 60)` | Stacking for an explicitly composed positioner. |
140
- | Close button size | `var(--dsx-size-lg)` | Square tap target. |
141
- | Close button radius | `var(--dsx-rounded-full)` | Round close. |
140
+ | Close minimum dimensions | `var(--dsx-size-md)` | 24px floor; composed Button supplies its own dimensions and radius. |
142
141
  | Motion duration | `var(--dsx-motion-duration-*)` | Mount and exit. |
143
142
  | Motion easing | `var(--dsx-motion-easing-*)` | Mount and exit. |
144
143
 
@@ -306,3 +305,11 @@ Rules:
306
305
  - [ ] Token bindings resolve at the values `DESIGN.md` describes.
307
306
  - [ ] Component is promoted to Main Component under `Components`.
308
307
  - [ ] `penpotUtils.shapeStructure(board, 3)` matches the expected hierarchy.
308
+
309
+ ## Overlay review containment
310
+
311
+ Content has one minmax(0, 1fr) grid track and wraps long words. This prevents
312
+ a child panel’s preferred width from enlarging an implicit track beyond the
313
+ viewport-capped surface and being clipped by overflow=hidden. The live example
314
+ sets and applies a real density preference; NotificationCenter also composes
315
+ inside this surface with proper Title and Description.
@@ -21,6 +21,15 @@ Consumers preserve heading order, stable IDs, meaningful image alt text, caption
21
21
 
22
22
  The root can shrink within its parent. Long words, URLs, and identifiers wrap inside the reading measure; preformatted code and tables retain their explicit horizontal scrolling.
23
23
 
24
+ ## Color roles
25
+
26
+ Inline code and preformatted blocks use `--dsx-code-soft-background`, the
27
+ same contextual neutral wash as soft Code (existing gray-alpha-3 effect).
28
+ A `pre > code` child stays transparent to avoid painting the wash twice.
29
+ Blockquotes use the 1px boundary-divider width with decorative accent-border
30
+ (light step 8 / dark step 11). Links retain readable accent-indicator ink.
31
+ Local Theme and gray changes recompute these paint aliases.
32
+
24
33
  ## Playground demo spec
25
34
 
26
35
  Render all supported semantic elements, sanitized HTML, a wide table at mobile width, and authored blocks in the separate ArticleNodes stream.
@@ -13,7 +13,7 @@ depends_on:
13
13
 
14
14
  ## Purpose
15
15
 
16
- A token-aligned QR code surface that renders a scannable `QRCodeSVG` from `qrcode.react` inside a styled container, with a size scale and high-contrast mode for accessibility. The component owns the shell and token binding; the app owns the encoded payload, error-correction level, and any persistence.
16
+ A token-aligned QR code surface that renders a scannable `QRCodeSVG` from `qrcode.react` inside a styled container, with a fixed matrix size scale and a legacy CSS high-contrast hook. The component owns the shell and token binding; the app owns the encoded payload, error-correction level, and any persistence.
17
17
 
18
18
  ## Anatomy & slots
19
19
 
@@ -21,7 +21,7 @@ A token-aligned QR code surface that renders a scannable `QRCodeSVG` from `qrcod
21
21
 
22
22
  **Slots:**
23
23
 
24
- No slots: flat export. The component renders a single `<div>` host element (or a slotted child when `asChild` is set) that wraps the `QRCodeSVG` adapter output. The encoded value, the error-correction level, the margin, and the module colors are all props on the host. The component does not own a label, caption, or download action; consumers compose those around the surface.
24
+ No slots: flat export. The component renders a single role=img `<div>` host element (or a consumer-supplied slotted child when `asChild` is set) that wraps the `QRCodeSVG` adapter output. The encoded value, the error-correction level, the margin, and the module colors are all props on the host. The component does not own a label, caption, or download action; consumers compose those around the surface.
25
25
 
26
26
  **Adapter host:** `QRCodeSVG` from `qrcode.react`. The adapter is wrapped in a styled container; the adapter is a `peerDependency` and the package does not own the rendered SVG paths.
27
27
 
@@ -30,9 +30,9 @@ No slots: flat export. The component renders a single `<div>` host element (or a
30
30
  | Prop | Type | Default | Required | Description | Responsive |
31
31
  |---|---|---|---|---|---|
32
32
  | `value` | `string` | `undefined` | yes | String payload encoded into the QR modules. Required by `QRCodeSVG`; the host element also omits the native `value` attribute. | no |
33
- | `size` | `'sm' \| 'md' \| 'lg'` | `'md'` | no | Painted size; selects one of the internal `sizeMap` values (`sm: 128`, `md: 192`, `lg: 256` px) and writes `data-size` plus the matching `dsx-qr-code-size-*` class. The SVG paints at exactly the `sizeMap` dimensions — the CSS never constrains it, so every size is scannable. | no |
33
+ | `size` | `'sm' \| 'md' \| 'lg'` | `'md'` | no | Painted size; selects one of the internal `sizeMap` values (`sm: 128`, `md: 192`, `lg: 256` px) and writes `data-size` plus the matching `dsx-qr-code-size-*` class. The SVG retains sizeMap dimensions, never flex-shrinks and overrides generic SVG max-width rules. Hosts narrower than the matrix must supply scrolling. | no |
34
34
  | `level` | `'L' \| 'M' \| 'Q' \| 'H'` | `'M'` | no | Error-correction level passed through to `QRCodeSVG`. `L` is ~7%, `M` is ~15%, `Q` is ~25%, `H` is ~30% recovery. | no |
35
- | `marginSize` | `number` | `0` | no | Quiet-zone margin passed through to `QRCodeSVG`. Default `0` matches the adapter default and is the spec baseline. | no |
35
+ | `marginSize` | `number` | `0` | no | Quiet-zone margin passed through to `QRCodeSVG`. Default 0 matches the adapter baseline; scan/share examples explicitly set 4 modules of quiet zone. | no |
36
36
  | `fgColor` | `string` | `var(--dsx-color-on-surface)` | no | Module (foreground) color. Default falls back to the token CSS variable; pass an explicit value to override. | no |
37
37
  | `bgColor` | `string` | `var(--dsx-color-surface-raised)` | no | Quiet-zone (background) color. Default falls back to the token CSS variable; pass an explicit value to override. | no |
38
38
  | `asChild` | `boolean` | `false` | no | Renders the QR code container through `Slot` from `@radix-ui/react-slot`; consumer supplies the host element. | no |
@@ -60,7 +60,7 @@ Rules that apply to this row:
60
60
  | `data-slot` | `qr-code` | (CSS hook only) | n/a |
61
61
  | `data-high-contrast` | `true` | `.dsx-qr-code[data-high-contrast='true']` (hook only; runtime does not currently emit) | `qr-code.css` |
62
62
 
63
- **Slot classes:** none. The inner `svg` is targeted by `.dsx-qr-code svg` and the `rect[fill]` modules by `.dsx-qr-code svg rect[fill]`. These are CSS hooks, not public slots.
63
+ **Slot classes:** none. The inner svg is targeted by .dsx-qr-code svg; the legacy high-contrast hook targets first/last paths from qrcode.react 4.2. These are CSS hooks, not public slots.
64
64
 
65
65
  **Responsive behavior:**
66
66
 
@@ -95,8 +95,8 @@ Every CSS value the component paints is a `var(--dsx-*)` token, with runtime fal
95
95
  Rules:
96
96
 
97
97
  - The runtime SVG dimensions (`128`, `192`, `256`) are NOT tokens; they are the adapter's own pixel size used to compute the QR matrix, painted verbatim. The CSS must never override the visible width and height with sizing tokens — that revision shipped 16/24/40px unscannable codes.
98
- - The `fgColor` and `bgColor` props are passed as CSS variable references (`'var(--dsx-color-on-surface)'`, `'var(--dsx-color-surface-raised)'`) when the consumer does not pass explicit values. The adapter forwards these into SVG attributes; token-driven theming therefore requires the `qr-code.css` rules to win on the modules, which is what the high-contrast block does.
99
- - The high-contrast block uses `svg rect[fill]:first-of-type` to recolor the background module; this relies on the adapter emitting the background as a single `<rect>`. If the adapter's output changes, the high-contrast fallback breaks.
98
+ - The `fgColor` and `bgColor` props are passed as CSS variable references (`'var(--dsx-color-on-surface)'`, `'var(--dsx-color-surface-raised)'`) when the consumer does not pass explicit values. The adapter forwards CSS variable references into SVG fill attributes; ordinary theme inheritance resolves them. The legacy high-contrast CSS hook overrides paths when an app explicitly supplies its attribute.
99
+ - The high-contrast hook colors the first path as background and last path as modules, matching the installed adapter output. Adapter output changes require a fresh paint check.
100
100
 
101
101
  ## Motion contract
102
102
 
@@ -113,7 +113,7 @@ Rules:
113
113
 
114
114
  **Roles:**
115
115
 
116
- - `img` (QR code). The component renders a non-text graphic; consumers must supply an accessible name via `aria-label`, an `aria-labelledby` reference, or a sibling label. The runtime does not currently set `role` or `aria-label` (see Anomalies).
116
+ - `img` (QR code). The component renders a non-text graphic; consumers must supply an accessible name via `aria-label`, an `aria-labelledby` reference, or a sibling label. The runtime sets role=img and forwards the consumer accessible name.
117
117
 
118
118
  **Keyboard:**
119
119
 
@@ -129,7 +129,7 @@ Rules:
129
129
 
130
130
  **Color and meaning:**
131
131
 
132
- - The QR modules carry the data; the rendered colors are decorative. A high-contrast CSS hook is available for accessible contexts, but the runtime does not currently expose a `data-high-contrast` prop. Apps that need high-contrast mode should toggle the attribute on the host element directly or fork the component.
132
+ - The QR modules carry the data; the rendered colors are decorative. A legacy high-contrast CSS hook is available through a native data-high-contrast attribute; there is no highContrast prop. Apps own scanner compatibility and may explicitly select positive dark-on-light fgColor/bgColor for physical scan contexts.
133
133
 
134
134
  **Naming:**
135
135
 
@@ -137,7 +137,7 @@ Rules:
137
137
 
138
138
  ## Playground demo spec
139
139
 
140
- The demo file at `demo_path` exposes the component to the playground. The playground lives at `apps/playground/app/` (Next.js app router, no per-component routes today). The `demo_path` recorded here is the current playground root; the spec assumes a single shared page that renders all components. Per-component routes are an aspirational target and not yet present in the repo.
140
+ The /docs/qr-code registry supplies wrapped comparisons and a scrollable host for matrices wider than their container. It never shrinks the SVG to fit.
141
141
 
142
142
  **Default story:**
143
143
 
@@ -157,11 +157,11 @@ The demo file at `demo_path` exposes the component to the playground. The playgr
157
157
 
158
158
  **Token story:**
159
159
 
160
- - Renders inside a `Theme` wrapper with `accentColor="amber"`, `accentColor="silver"`, and `accentColor="bronze"`. The QR module color is token-driven via the `fgColor` runtime default; the story asserts the modules track the `on-surface` token across the three accents.
160
+ - Renders inside a `Theme` wrapper with the five supported accents (Rift, Warp, Ray, Astral, Spark). The QR module color is token-driven via the `fgColor` runtime default; the story asserts the modules track the `on-surface` token across all five accents.
161
161
 
162
162
  **A11y story:**
163
163
 
164
- - Uses `vitest-axe` against the rendered default QR code wrapped in a labelled element. Asserts there are no axe violations only when the host carries an accessible name. The default story alone is expected to flag a missing accessible name and is documented in the playground as a known issue.
164
+ - Uses `vitest-axe` against the rendered default QR code wrapped in a labelled element. Asserts there are no axe violations only when the host carries an accessible name. Unlabelled caller output does not satisfy the naming contract.
165
165
 
166
166
  **Props exposed in the playground controls:**
167
167
 
@@ -56,18 +56,23 @@ Rules that apply to this row:
56
56
 
57
57
  ## Token mapping
58
58
 
59
- Every CSS value the component paints is a CSS keyword or hard-code; there are no `var(--dsx-*)` tokens in `quote.css`. The italic style matches the HTML `<q>` element's expected visual treatment.
59
+ Every CSS value the component paints is a CSS keyword or hard-code; there are no `var(--dsx-*)` tokens in `quote.css`. Italics are this package's visual choice; HTML quotation semantics come from `<q>` and its generated quotation marks.
60
60
 
61
61
  | Property | Token | Role |
62
62
  |---|---|---|
63
63
  | `quotes` | `auto` (CSS keyword) | Lets the browser pick the right opening and closing quote glyphs from the document language. |
64
- | Font style | `italic` (hard-coded) | Visual convention for inline quotation; matches the HTML `<q>` default and is not overridable through a prop. |
64
+ | Font style | `italic` (hard-coded) | Package convention for inline quotation, not an HTML requirement; consumer style can override it. |
65
65
 
66
66
  Rules:
67
67
 
68
- - `DESIGN.md` and the generated `tokens.css` do not define a `quotes` or italic typography token. Both are CSS hard-codes, consistent with the HTML `<q>` element's default behavior.
68
+ - `DESIGN.md` and the generated `tokens.css` do not define a `quotes` or italic typography token. Language-aware quotation marks follow native `<q>` behavior; the italic treatment is authored by this package.
69
69
  - No raw color, spacing, or motion values are introduced by this component.
70
70
 
71
+ Large opening/closing quotation glyphs, icons and source captions belong to a
72
+ consumer's block quotation composition using `Blockquote`, not an inline
73
+ Quote variant. Em marks stress emphasis; Quote marks words quoted from a
74
+ source even though both share an italic treatment.
75
+
71
76
  ## Motion contract
72
77
 
73
78
  | Region | Token | Default | Reduced |
@@ -108,7 +113,7 @@ Rules:
108
113
 
109
114
  ## Playground demo spec
110
115
 
111
- `Quote` is registered in `apps/playground/lib/registry/typography.tsx` under the `quote` key. The registry entry imports `quotePropDefs` and renders the component with a sample inline quotation. Per-component route: `/docs/quote`.
116
+ `Quote` is registered in `apps/playground/lib/registry/typography.tsx` under the `quote` key. The registry entry imports `quotePropDefs` and renders the component with a sample inline quotation. Per-component route: `/docs/quote`. The live example uses English and Russian quotations, a nested quote and a slotted span.
112
117
 
113
118
  **Default story:**
114
119
 
@@ -17,25 +17,25 @@ A resizable panel group with draggable handles. The package owns the shell, the
17
17
 
18
18
  ## Anatomy & slots
19
19
 
20
- **Parent:** `Resizable` (alias of `Resizable.PanelGroup`).
20
+ **Parent:** `Resizable` (alias of `ResizablePanelGroup`).
21
21
 
22
22
  **Slots:**
23
23
 
24
24
  | Slot | Element | Renders | Notes |
25
25
  |---|---|---|---|
26
- | `Resizable.PanelGroup` (alias `Resizable`) | `<div>` (the `Group` from `react-resizable-panels`) | `dsx-resizable-group` | Hosts the orientation attribute and the panel layout. Carries `data-orientation` and `data-slot="resizable-group"`. |
26
+ | `ResizablePanelGroup` (alias `Resizable`) | `<div>` (the `Group` from `react-resizable-panels`) | `dsx-resizable-group` | Hosts the orientation attribute and the panel layout. Carries `data-orientation` and `data-slot="resizable-group"`. |
27
27
  | `Resizable.Panel` | `<div>` (the `Panel` from `react-resizable-panels`) | `dsx-resizable-panel` | One resizable child. Carries `data-slot="resizable-panel"`. |
28
28
  | `Resizable.Handle` | `<div>` (the `Separator` from `react-resizable-panels`) | `dsx-resizable-handle` | The draggable separator between two panels. Carries `data-slot="resizable-handle"` and `data-grip="true"` when `withGrip` is set. When `withGrip` is set, a child `<div>` with `dsx-resizable-handle__grip` is rendered. |
29
29
 
30
30
  **Adapter host:**
31
31
 
32
- `Resizable.PanelGroup` wraps the `Group` from `react-resizable-panels`. The package translates the DS `direction` prop (`'horizontal'` or `'vertical'`) into the adapter's `orientation` prop. The package also passes `elementRef` through `composeRefs` so the `forwardRef` and any app-supplied ref both see the host element.
32
+ `ResizablePanelGroup` wraps the `Group` from `react-resizable-panels`. The package translates the DS `direction` prop (`'horizontal'` or `'vertical'`) into the adapter's `orientation` prop. The package also passes `elementRef` through `composeRefs` so the `forwardRef` and any app-supplied ref both see the host element.
33
33
 
34
34
  `Resizable.Handle` wraps the `Separator` from `react-resizable-panels`. `withGrip` adds a visual grip indicator inside the handle; the adapter still owns the drag interaction and the keyboard arrow support.
35
35
 
36
36
  ## Props contract
37
37
 
38
- ### `Resizable.PanelGroup` props
38
+ ### `ResizablePanelGroup` props
39
39
 
40
40
  | Prop | Type | Default | Required | Description | Responsive |
41
41
  |---|---|---|---|---|---|
@@ -43,7 +43,7 @@ A resizable panel group with draggable handles. The package owns the shell, the
43
43
  | `direction` | `'horizontal' \| 'vertical'` | `'horizontal'` | no | Drives `data-orientation` on the group. Mapped to the adapter's `orientation` prop. The CSS file uses the inline `[data-orientation='…']` selectors and the modifier `dsx-resizable-group-direction-horizontal` / `dsx-resizable-group-direction-vertical` class. | no |
44
44
  | `className` | `string` | `undefined` | no | Extra classes appended to `dsx-resizable-group`. | no |
45
45
 
46
- The group also accepts the full `GroupProps` from `react-resizable-panels` minus `orientation` (which is replaced by the DS `direction` prop) and `elementRef` (which the package routes through `composeRefs`). `autoSaveId`, `id`, `onLayout`, `storage`, `defaultLayout`, and `keyboardResizeBy` are forwarded verbatim.
46
+ The group also accepts the full `GroupProps` from `react-resizable-panels` minus `orientation` (which is replaced by the DS `direction` prop) and `elementRef` (which the package routes through `composeRefs`). `id`, `defaultLayout`, `onLayoutChange`, `onLayoutChanged`, `disabled`, `groupRef` and `resizeTargetMinimumSize` follow the installed v4 adapter contract. Persistence belongs to the app; v3-only props are not promised.
47
47
 
48
48
  ### `Resizable.Panel` props
49
49
 
@@ -52,7 +52,7 @@ The group also accepts the full `GroupProps` from `react-resizable-panels` minus
52
52
  | `asChild` | `boolean` | `false` | no | Extracted from prop defs but the `Panel` host always renders a `<div>`. The prop is reserved for future use. | no |
53
53
  | `className` | `string` | `undefined` | no | Extra classes appended to `dsx-resizable-panel`. | no |
54
54
 
55
- The panel also accepts the full `PanelProps` from `react-resizable-panels` minus `elementRef`. `defaultSize`, `minSize`, `maxSize`, `collapsible`, `collapsedSize`, `onCollapse`, `onExpand`, `onResize`, `id`, `order`, and `ref` are forwarded verbatim.
55
+ The panel also accepts the full `PanelProps` from `react-resizable-panels` minus `elementRef`. `defaultSize`, `minSize`, `maxSize`, `collapsible`, `collapsedSize`, `onResize`, `id`, `panelRef` and `groupResizeBehavior` follow the installed v4 adapter contract. Use explicit percentage strings such as "50%"; numeric sizes represent pixels.
56
56
 
57
57
  ### `Resizable.Handle` props
58
58
 
@@ -62,7 +62,7 @@ The panel also accepts the full `PanelProps` from `react-resizable-panels` minus
62
62
  | `withGrip` | `boolean` | `false` | no | When `true`, renders a `dsx-resizable-handle__grip` indicator inside the handle and sets `data-grip="true"`. The CSS file uses the `data-grip` attribute and the `dsx-resizable-handle-grip` modifier class to color the indicator. | no |
63
63
  | `className` | `string` | `undefined` | no | Extra classes appended to `dsx-resizable-handle`. | no |
64
64
 
65
- The handle also accepts the full `SeparatorProps` from `react-resizable-panels` minus `elementRef` and `withGrip`. `id`, `disabled`, `hitAreaMargins`, and the adapter drag attributes are forwarded verbatim.
65
+ The handle also accepts the full `SeparatorProps` from `react-resizable-panels` minus `elementRef` and `withGrip`. `id`, `disabled` and native attributes follow SeparatorProps. Group resizeTargetMinimumSize controls adapter hit geometry; v3 hitAreaMargins is not promised.
66
66
 
67
67
  ## CSS class contract
68
68
 
@@ -96,12 +96,12 @@ The handle also accepts the full `SeparatorProps` from `react-resizable-panels`
96
96
 
97
97
  **Responsive behavior:**
98
98
 
99
- - The component does not write `@media` rules. None of its prop defs are `responsive: true`.
99
+ - The component has no viewport-width media rules. None of its prop defs are `responsive: true`.
100
100
  - The component's CSS file is breakpoint-agnostic.
101
101
 
102
102
  **Reduced motion:**
103
103
 
104
- - The handle background and the grip indicator transitions use `var(--dsx-motion-duration-fast)` and `var(--dsx-motion-easing-standard)`. The CSS file does not include a `prefers-reduced-motion` gate; the global stylesheet is expected to honor the media query. The adapter's drag interaction is layout-only and does not animate.
104
+ - The handle background and the grip indicator transitions use `var(--dsx-motion-duration-fast)` and `var(--dsx-motion-easing-standard)`. Its own `prefers-reduced-motion` gate disables handle and track transitions. The adapter's drag interaction is layout-only and does not animate.
105
105
 
106
106
  ## Token mapping
107
107
 
@@ -119,7 +119,7 @@ Every CSS value the component paints is a `var(--dsx-*)` token.
119
119
  | Handle active background | `var(--dsx-color-high-contrast-container)` | Active affordance. |
120
120
  | Handle cursor | `col-resize` (horizontal), `row-resize` (vertical) | Cursor. |
121
121
  | Handle touch action | `none` | Prevent browser scroll on touch. |
122
- | Handle thickness | `var(--dsx-resizable-handle-thickness-active)` | Visible thickness. |
122
+ | Handle thickness | `max(var(--dsx-size-md), var(--dsx-resizable-handle-thickness-active))` | Actual hit box, at least 24px; the painted line stays thin. |
123
123
  | Handle track | `var(--dsx-border-width-md, var(--dsx-resizable-handle-thickness))` | Inactive track thickness. |
124
124
  | Handle track color | `var(--dsx-control-separator-color-strong)` | Track color. |
125
125
  | Handle track hover color | `var(--dsx-color-high-contrast)` | Hover color. |
@@ -127,6 +127,7 @@ Every CSS value the component paints is a `var(--dsx-*)` token.
127
127
  | Grip width | `var(--dsx-resizable-grip-width)` | Grip indicator width. |
128
128
  | Grip height | `var(--dsx-resizable-grip-height)` | Grip indicator height. |
129
129
  | Grip radius | `var(--dsx-resizable-grip-radius)` | Grip indicator roundness. |
130
+ | Handle z-index | `var(--dsx-z-index-elevated)` | Preserve the entire target above pane content. |
130
131
  | Grip z-index | `var(--dsx-z-index-elevated)` | Grip stack order. |
131
132
  | Grip horizontal size | `var(--dsx-space-xs)` × `var(--dsx-size-xs)` | Horizontal handle grip dimensions. |
132
133
  | Grip vertical size | `var(--dsx-size-xs)` × `var(--dsx-space-xs)` | Vertical handle grip dimensions. |
@@ -136,8 +137,8 @@ Every CSS value the component paints is a `var(--dsx-*)` token.
136
137
 
137
138
  | Region | Token | Default | Reduced |
138
139
  |---|---|---|---|
139
- | Handle background | `var(--dsx-motion-duration-fast)` + `var(--dsx-motion-easing-standard)` | Hover and active background transition. | Relies on the global `prefers-reduced-motion` stylesheet. |
140
- | Handle track and grip | `var(--dsx-motion-duration-fast)` + `var(--dsx-motion-easing-standard)` | Track color, grip background, and transform transition. | Relies on the global `prefers-reduced-motion` stylesheet. |
140
+ | Handle background | `var(--dsx-motion-duration-fast)` + `var(--dsx-motion-easing-standard)` | Hover and active background transition. | Own CSS disables handle transitions under prefers-reduced-motion. |
141
+ | Handle track and grip | `var(--dsx-motion-duration-fast)` + `var(--dsx-motion-easing-standard)` | Track color, grip background, and transform transition. | Own CSS disables handle transitions under prefers-reduced-motion. |
141
142
 
142
143
  ## Accessibility
143
144
 
@@ -152,20 +153,20 @@ Every CSS value the component paints is a `var(--dsx-*)` token.
152
153
  |---|---|
153
154
  | `Tab` | Moves focus to the next focusable element. The handle is focusable by default. |
154
155
  | `Enter`, `Space` | Toggles the panel state when the handle supports collapsing. |
155
- | `Arrow keys` | The adapter handles arrow-key resize by the `keyboardResizeBy` step. |
156
+ | `Arrow keys` | The installed v4 adapter handles arrow-key resizing. |
156
157
  | `Home`, `End` | The adapter collapses or expands the panel to its minimum or maximum size when supported. |
157
158
 
158
159
  **Focus:**
159
160
 
160
- - The handle receives a visible focus ring via the browser default for `[role="separator"]` plus the global focus stylesheet. The DS does not add a custom ring; apps that need a custom ring can target `[role="separator"]:focus-visible` from the host.
161
+ - The DS paints `var(--dsx-shadow-focus-ring)` on `.dsx-resizable-handle:focus-visible`. The handle stays above adjacent pane content so its full target receives input.
161
162
 
162
163
  **Reduced motion:**
163
164
 
164
- - The handle transitions collapse under the global `prefers-reduced-motion` stylesheet. The drag interaction is layout-only and does not animate.
165
+ - The handle and track transitions are disabled by their own `prefers-reduced-motion` rules. The drag interaction is layout-only and does not animate.
165
166
 
166
167
  **Color and meaning:**
167
168
 
168
- - The handle and the grip use semantic tokens (`var(--dsx-color-high-contrast-container)` and `var(--dsx-color-on-surface-variant)`) so light and dark themes are covered. The track thickness increases from `var(--dsx-resizable-handle-thickness)` to `var(--dsx-resizable-handle-thickness-active)` on hover to communicate the drag affordance.
169
+ - The handle and the grip use semantic tokens (`var(--dsx-color-high-contrast-container)` and `var(--dsx-color-on-surface-variant)`) so light and dark themes are covered. The thin track keeps its thickness on hover; semantic color changes communicate the drag affordance.
169
170
 
170
171
  **Naming:**
171
172
 
@@ -198,6 +199,13 @@ Every CSS value the component paints is a `var(--dsx-*)` token.
198
199
 
199
200
  `withGrip` is wired through the composition story rather than the prop table.
200
201
 
202
+ ## Review examples
203
+
204
+ The horizontal workspace preserves scrollable outline and draft panes, minimum
205
+ 20% panel sizes and a live proportions summary. The vertical example exercises
206
+ its own resize axis. Handles have visible keyboard focus; both directions
207
+ retain a 24px minimum box while the visual divider remains thin.
208
+
201
209
  ## Wiring notes
202
210
 
203
211
  **Composes from:**
@@ -212,8 +220,8 @@ Every CSS value the component paints is a `var(--dsx-*)` token.
212
220
  **State boundaries:**
213
221
 
214
222
  - Owned by this component: the DS shell class wiring, the `direction` to `orientation` translation, the `withGrip` rendering, the `data-orientation` and `data-slot` attributes, and the `composeRefs` helper.
215
- - Owned by the adapter: panel math, drag interaction, keyboard arrow resize, the `autoSaveId` persistence, the percentage bookkeeping, and the `role="separator"` semantics.
216
- - Owned by the consumer: the number of panels, the `defaultSize`, `minSize`, `maxSize`, and `collapsible` configuration, the content of each panel, the `onLayout` callback, and any business policy that wraps the layout state.
223
+ - Owned by the adapter: panel math, drag interaction, keyboard arrow resize, the percentage bookkeeping, and the `role="separator"` semantics.
224
+ - Owned by the consumer: the number of panels, the `defaultSize`, `minSize`, `maxSize`, and `collapsible` configuration, the content of each panel, the adapter layout callbacks, and any business policy that wraps the layout state.
217
225
 
218
226
  **Boundary rules:**
219
227