@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
@@ -4,7 +4,6 @@ status: canonical
4
4
  category: Components
5
5
  archetype: composite
6
6
  depends_on:
7
- - Card
8
7
  - Icon
9
8
  - Button
10
9
  ---
@@ -19,13 +18,13 @@ An inline status, warning, or info banner that lives in the page flow. Use Alert
19
18
 
20
19
  ## Anatomy & slots
21
20
 
22
- **Parent:** `Alert` (alias of `AlertRoot`). The root is a thin wrapper around `CardRoot`; it composes the card surface and adds the alert-specific layout, icon, and content slots.
21
+ **Parent:** `Alert` (alias of `AlertRoot`). The root owns a static status surface, using the existing shared card surface tokens without a clickable Card host. Icon, content and actions retain their named slots. With `asChild`, one consumer element becomes the host and its children are wrapped in the content slot; icon and forwarded ref remain on that same host.
23
22
 
24
23
  **Slots:**
25
24
 
26
25
  | Slot | Element | Renders | Notes |
27
26
  |---|---|---|---|
28
- | `Alert` (root) | `<div>` (or `Slot` host) | `CardRoot` + class | Renders the surface as a Card and overlays the alert-specific class. Writes `dsx-alert`, `data-variant`, `data-size`, `data-high-contrast`, `data-accent-color`. Defaults `role` to `"alert"`; consumers can override with a custom `role` prop. |
27
+ | `Alert` (root) | `<div>` (or `Slot` host) | Static surface + class | Writes `dsx-alert`, `data-variant`, `data-size`, `data-high-contrast`, `data-accent-color`. Defaults `role` to `"alert"`; consumers can override with a custom `role` prop. Hovering the status surface does not change its semantic color or elevation. |
29
28
  | `Alert.Title` | `<h5>` (or `Slot` host) | Slot class | Title text. Writes `dsx-alert__title`. |
30
29
  | `Alert.Description` | `<p>` (or `Slot` host) | Slot class | Description text. Writes `dsx-alert__description`. |
31
30
  | `Alert.Action` | `<div>` | Slot class | Trailing action container (typically a Button or IconButton). Writes `dsx-alert__action`. |
@@ -46,7 +45,7 @@ The `Alert.Action` slot is independent of the rest of the layout; the consumer c
46
45
 
47
46
  | Prop | Type | Default | Required | Description | Responsive |
48
47
  |---|---|---|---|---|---|
49
- | `variant` | `'default' \| 'destructive' \| 'success' \| 'warning'` | `'default'` | no | Visual tone; writes `data-variant`. The base CSS sets a color per variant; `default` and `warning` use the primary palette, `destructive` uses the error palette, and `success` uses the success palette. | no |
48
+ | `variant` | `'default' \| 'destructive' \| 'success' \| 'warning'` | `'default'` | no | Visual tone; writes `data-variant`. The base CSS sets a color per variant; `default` uses the primary palette and `warning` uses the warning palette, `destructive` uses the error palette, and `success` uses the success palette. | no |
50
49
  | `size` | `'sm' \| 'md' \| 'lg'` | `'md'` | no | Padding scale; writes `data-size`. | no |
51
50
  | `color` | `string` | `undefined` | no | Free-form accent override; writes `data-accent-color` when provided. | no |
52
51
  | `highContrast` | `boolean` | `false` | no | When `true`, swaps the surface and border to `var(--dsx-color-high-contrast-container)` and `var(--dsx-color-high-contrast-border)`; writes `data-high-contrast="true"`. | no |
@@ -77,14 +76,14 @@ The icon is rendered with `size="md"` and `strokeWidth="var(--dsx-icon-stroke-wi
77
76
 
78
77
  ## CSS class contract
79
78
 
80
- **Root class:** `dsx-alert` (composed on top of the Card root class)
79
+ **Root class:** `dsx-alert` (static native or Slot host; no interactive Card class)
81
80
 
82
81
  **Modifier classes** (driven by `data-*` attributes written by the component):
83
82
 
84
83
  | Attribute | Allowed values | Class | CSS file |
85
84
  |---|---|---|---|
86
85
  | `data-variant` | `default`, `destructive`, `success`, `warning` | `.dsx-alert[data-variant='destructive']`, `.dsx-alert[data-variant='error']`, `.dsx-alert[data-variant='success']`, `.dsx-alert[data-variant='warning']` | `baseCard.css` |
87
- | `data-size` | `sm`, `md`, `lg` | (inherits Card size) | `baseCard.css` |
86
+ | `data-size` | `sm`, `md`, `lg` | `.dsx-alert[data-size=…]` | `alert.css` |
88
87
  | `data-accent-color` | any string | (no rule in `alert.css`; attribute is forwarded) | n/a |
89
88
  | `data-high-contrast` | `true` | `.dsx-alert[data-high-contrast='true']` | `baseCard.css` |
90
89
 
@@ -126,7 +125,7 @@ Every CSS value the component paints is a `var(--dsx-*)` token.
126
125
  | Description opacity | `var(--dsx-opacity-subtle, 0.85)` | Subtle fade for description text |
127
126
  | Destructive surface | `var(--dsx-color-error-container)`, `var(--dsx-color-on-error-container)`, `var(--dsx-color-error)` (border) | Destructive palette |
128
127
  | Success surface | `var(--dsx-color-success-container)`, `var(--dsx-color-on-success-container)`, `var(--dsx-color-success)` (border) | Success palette |
129
- | Warning surface | `var(--dsx-color-primary-container)`, `var(--dsx-color-on-primary-container)`, `var(--dsx-color-primary)` (border) | Warning palette (primary palette) |
128
+ | Warning surface | `var(--dsx-color-warning-container)`, `var(--dsx-color-on-warning-container)`, `var(--dsx-color-warning)` (border) | Warning palette |
130
129
  | High-contrast surface | `var(--dsx-color-high-contrast-container)`, `var(--dsx-color-high-contrast-border)`, `var(--dsx-color-high-contrast)` (text) | High-contrast palette |
131
130
 
132
131
  ## Motion contract
@@ -159,7 +158,7 @@ The component has no motion. It is a static inline surface.
159
158
 
160
159
  **Color and meaning:**
161
160
 
162
- - Variant tone is communicated by both color and icon: `success` uses the success palette and a `check-circle` icon, `destructive` uses the error palette and an `alert-triangle` icon, `warning` uses the primary palette and an `alert-triangle` icon, and `default` uses the base palette and an `info` icon.
161
+ - Variant tone is communicated by both color and icon: `success` uses the success palette and a `check-circle` icon, `destructive` uses the error palette and an `alert-triangle` icon, `warning` uses the warning palette and an `alert-triangle` icon, and `default` uses the base palette and an `info` icon.
163
162
 
164
163
  **Naming:**
165
164
 
@@ -191,7 +190,7 @@ The component has no motion. It is a static inline surface.
191
190
 
192
191
  **Token story:**
193
192
 
194
- - Renders inside a `Theme` wrapper with `accentColor="silver"` and `accentColor="bronze"`. Asserts the destructive and success surfaces are unchanged because they read from the error and success palettes, not the accent palette.
193
+ - Renders inside a `Theme` wrapper with `accentColor="astral"` and `accentColor="spark"`. Asserts the destructive and success surfaces are unchanged because they read from the error and success palettes, not the accent palette.
195
194
 
196
195
  **A11y story:**
197
196
 
@@ -210,7 +209,7 @@ The component has no motion. It is a static inline surface.
210
209
 
211
210
  **Composes from:**
212
211
 
213
- - `Card` (`CardRoot`): the alert root is a `CardRoot asChild` wrapper. The alert inherits the card surface treatment and the Card size, variant, and high-contrast data attributes.
212
+ - `baseCard.css`: supplies the existing static Alert surface, semantic status palettes and high-contrast treatment. The root does not participate in interactive Card hover styling.
214
213
  - `Icon`: renders the variant default icon and any consumer-supplied icon node.
215
214
  - `@radix-ui/react-slot`: enables `asChild` on the root and on `Alert.Title` / `Alert.Description`.
216
215
 
@@ -227,3 +226,11 @@ The component has no motion. It is a static inline surface.
227
226
 
228
227
  - App-owned data: the alert message text, the action, the dismiss/timeout behavior, and the analytics events.
229
228
  - DS-owned visuals: token bindings, slot classes, icon name resolution, and the surface palette per variant.
229
+
230
+ ## Overlay review composition
231
+
232
+ Content has min-width=0 and wraps long copy; the optional icon does not shrink.
233
+ Actions wrap and align to the content start. Light-mode semantic borders retain
234
+ warning/success/error roles after the shared card base rules. Default accent
235
+ styling and highContrast remain token-driven. `/docs/alert` demonstrates all
236
+ four tones, reconnect feedback and dismiss/restore through real actions.
@@ -3,7 +3,7 @@ title: ArticleNodes
3
3
  status: canonical
4
4
  category: Components
5
5
  archetype: adapter-backed
6
- depends_on: ["@tiptap/core", "@tiptap/extension-image", "@tiptap/extension-table", "@tiptap/extension-code-block-lowlight", "lowlight"]
6
+ depends_on: ["@tiptap/core", "@tiptap/react", "@tiptap/extension-image", "@tiptap/extension-table", "@tiptap/extension-code-block-lowlight", "lowlight"]
7
7
  ---
8
8
 
9
9
  # ArticleNodes
@@ -22,6 +22,63 @@ The package exports `ArticleImage`, `ArticleEmbed`, `BeforeAfterComparison`, and
22
22
 
23
23
  Read-side renderers are available from the root and `components` barrels and from the dedicated `@d4gger/design-system/article-nodes` subpath. Tiptap-backed authoring extensions are isolated at `@d4gger/design-system/article-extensions`, so importing the root package never requires the optional Tiptap peers.
24
24
 
25
+ ## Read renderer contracts
26
+
27
+ - `ArticleImage` accepts native image attributes and optional React-node `caption`.
28
+ Its root is a figure; `className` and native attributes belong to the image.
29
+ Alt defaults to an empty string. A supplied caption renders as figcaption.
30
+ - `ArticleEmbed` accepts `url`, optional `isAllowed(canonicalUrl)` and optional
31
+ `render(canonicalUrl)`, plus native div attributes. Only absolute HTTP(S) URLs
32
+ survive canonicalization. Rejected URLs render `Embed unavailable` with role
33
+ alert; no render callback or link is emitted. Without a render callback an
34
+ allowed URL is a native anchor. The allowed root carries `data-dsx-url`.
35
+ - `BeforeAfterComparison` accepts both sources and alt values, optional React-node
36
+ labels (defaults `Before`/`After`) and native figure attributes. It is a two-column
37
+ comparison, not an interactive slider. Images scale within zero-minimum tracks;
38
+ the minimum child width and scroll container preserve reachability in very tight hosts.
39
+ - `ArticlePoll` accepts a persistent `pollId`, optional question/options and
40
+ controlled `state` (`loading`, `ready`, `error`, `voted`, `closed`; default `ready`).
41
+ `onLoad(pollId)` runs on mount and when the ID or callback changes.
42
+ `onVote(pollId, optionId)` runs only through enabled ready-state options.
43
+ Vote totals are optional display metadata, not package-owned tally state.
44
+ Loading sets `aria-busy`; error renders an alert; loading/closed options are disabled; legacy voted options are disabled. Controlled selection permits vote changes.
45
+
46
+ ## Paint and accessibility
47
+
48
+ Media retain figure/caption semantics and consumer-supplied alt text. Embed/poll
49
+ shells use raised surface, semantic outline, medium radius/padding and small gaps.
50
+ Long labels and URLs wrap. Poll options compose the existing outline Button at
51
+ large size through `dsx-article-poll__option`; Button owns keyboard activation,
52
+ focus, disabled paint and target dimensions (44px at comfortable density).
53
+ No renderer introduces component breakpoints, portal behavior or motion.
54
+
25
55
  ## Playground demo spec
26
56
 
27
- Show each renderer, missing media, invalid embed, comparison at mobile width, and poll loading, error, ready, and voted states.
57
+ `/docs/article-nodes` composes `blocks-examples.tsx` through the display registry:
58
+ local loaded image/caption, distinct extra-relay/direct-route comparison, a
59
+ consumer-rendered link preview, invalid/disallowed embeds, an app-owned unavailable
60
+ media Callout and poll loading/error/ready/voted states. The ready poll updates its
61
+ results and can reset. The app fallback example does not add a package image-error API.
62
+
63
+ ## Authoring enhancement — approved 2026-10-04
64
+
65
+ The optional article extension bundle supplies editable React node views for
66
+ image/caption, embed, comparison, callout and poll, plus video, material reference
67
+ and platform tabs. Block controls are visible on touch: edit, move up/down and
68
+ remove; inline fields update node attributes. Block mutation controls track editor editability, and mutation callbacks guard
69
+ read-only state. Node-view UI is absent from saved HTML. `createArticleExtensions({ editable: false })` disables authoring node views.
70
+ Inline variables/mentions remain opt-in editor extensions, outside article policy.
71
+
72
+ Media retain optional `mediaId` alongside consumer-resolved `src`. Apps own URL
73
+ refresh, uploads, allowlists and conversion into versioned backend documents.
74
+ Poll nodes retain `pollId`, `question`, stable option `id`/`label` records and
75
+ `multiple`. Apps supply IDs at insertion. Platform tabs contain editable block
76
+ content and a `platform` key, and preserve that structure in HTML/JSON.
77
+
78
+ Read exports add `ArticleVideo`, `ArticlePlatformTabs` and `ArticleMaterialLink`.
79
+ Video uses native controls and optional caption; tabs accept keyed content and
80
+ controlled selection; references expose an explicit unavailable state without a
81
+ resolved href. `ArticlePoll` adds controlled `selection`, `multiple`,
82
+ `onSelectionChange`, `onSubmit`, `onRetract`, optional `totalVotes` and closed state.
83
+ It displays supplied results before/after voting and supports change/retract. The
84
+ existing `onVote` immediate single-choice path remains the default.
@@ -103,34 +103,11 @@ Rules:
103
103
 
104
104
  - No accessible name is required by default. Consumers that constrain focusable media (video, iframe) should supply an `aria-label` on the inner element or a labelled wrapper.
105
105
 
106
- ## Playground demo spec
107
-
108
- **Default story:**
109
-
110
- - Renders `AspectRatio` with `ratio={16 / 9}` and a fixed width, so the height is computed automatically. Asserts the root class is `dsx-aspect-ratio`.
111
-
112
- **Composition story** (for `asChild`):
113
-
114
- - Renders AspectRatio with `asChild` wrapping a `<div>` element. Asserts the host element is `DIV` and the `dsx-aspect-ratio` class is preserved.
115
-
116
- **State story:**
117
-
118
- - Renders AspectRatio with `ratio={1}`, `ratio={4 / 3}`, and `ratio={16 / 9}`. Asserts the rendered height matches the width divided by the supplied ratio.
106
+ The live example shows the same inline SVG landscape cropped at 16:9, 1:1 and 4:3. All three frames have equal widths within the same row; the gallery stacks on narrow screens.
119
107
 
120
- **Token story:**
121
-
122
- - N/A. AspectRatio does not consume `data-accent-color`; the story documents that the rounded corner is token-driven and visually unchanged across accents.
123
-
124
- **A11y story:**
125
-
126
- - Uses `vitest-axe` against the rendered default aspect ratio. Asserts there are no axe violations.
127
-
128
- **Props exposed in the playground controls:**
108
+ ## Playground demo spec
129
109
 
130
- | Prop | Control | Default |
131
- |---|---|---|
132
- | `asChild` | boolean | `false` |
133
- | `ratio` | number | `1` |
110
+ The ratio matrix and live example use the same SVG landscape with cover cropping. The live gallery uses equal track widths for 16:9, 1:1 and 4:3, stacks at narrow widths, and labels each media use. Width is owned by the parent frame, never the inner Radix height box.
134
111
 
135
112
  ## Wiring notes
136
113
 
@@ -26,9 +26,9 @@ A hero mass: one label, one headline value, and an optional footnote over an acc
26
26
  | Slot | Element | Renders | Notes |
27
27
  |---|---|---|---|
28
28
  | `Banner.Root` | `<section>` | Hero surface + class | `role="group"`, consumer `aria-label`. Writes `dsx-banner`. Supports `asChild`. |
29
- | `Banner.Label` | `<span>` | Uppercase muted label + class | Renders `Text` label-small. Writes `dsx-banner__label`. |
29
+ | `Banner.Label` | `<span>` | Compact normal-case label + class | Renders `Text` label-small; the Banner slot owns the paired container ink. Writes `dsx-banner__label`. |
30
30
  | `Banner.Value` | `<span>` | Headline value + class | Uses a span with the display-medium token ramp. Writes `dsx-banner__value`. |
31
- | `Banner.Footnote` | `<span>` | Muted footnote + class | Renders `Text` body-small. Writes `dsx-banner__footnote`. Optional. |
31
+ | `Banner.Footnote` | `<span>` | Compact footnote + class | Renders `Text` body-small with paired container ink. Writes `dsx-banner__footnote`. Optional. |
32
32
 
33
33
  ## Props contract
34
34
 
@@ -69,18 +69,18 @@ Every CSS value the component paints is a `var(--dsx-*)` token.
69
69
 
70
70
  | Property | Token | Role |
71
71
  |---|---|---|
72
- | Root background | `var(--dsx-color-accent-surface)` | Hero wash (wash variant) |
72
+ | Root background | `var(--dsx-color-primary-container)` | Opaque soft accent container (wash variant); no additional alpha dilution. |
73
73
  | Fill background | `var(--dsx-color-accent-track)` | Solid accent mass (fill variant) |
74
74
  | Fill text | `var(--dsx-color-accent-contrast)` | Compliant text on fill (near-black on spark, white elsewhere) |
75
75
  | Root radius | `var(--dsx-rounded-lg)` | Hero corner roundness |
76
76
  | Root padding | `var(--dsx-space-lg)` | Hero internal spacing |
77
77
  | Root gap | `var(--dsx-space-xs)` | Stack rhythm label/value/footnote |
78
78
  | Label typography | `var(--dsx-typography-label-small-*)` | Label type scale |
79
- | Label color | `var(--dsx-color-on-surface-variant)` | Muted label on wash |
79
+ | Label color | `var(--dsx-color-on-primary-container)` | Paired label ink on wash |
80
80
  | Value typography | `var(--dsx-typography-display-medium-*)` | Headline value type scale |
81
- | Value color | `var(--dsx-color-on-surface)` | Value ink on wash |
81
+ | Value color | `var(--dsx-color-on-primary-container)` | Paired value ink on wash |
82
82
  | Footnote typography | `var(--dsx-typography-body-small-*)` | Footnote type scale |
83
- | Footnote color | `var(--dsx-color-on-surface-variant)` | Muted footnote on wash |
83
+ | Footnote color | `var(--dsx-color-on-primary-container)` | Paired footnote ink on wash |
84
84
 
85
85
  ## Motion contract
86
86
 
@@ -98,7 +98,7 @@ None — no transitions, no animation. Pressed/`focus-visible` states do not app
98
98
 
99
99
  **Color and meaning:**
100
100
 
101
- - The wash is decorative; label/value text carries all meaning with `on-surface` contrast.
101
+ - The wash is decorative; label/value text carries all meaning with the paired `on-primary-container` contrast. Typography distinguishes label, value and footnote without reducing their color contrast.
102
102
 
103
103
  ## Playground demo spec
104
104
 
@@ -12,7 +12,7 @@ depends_on: []
12
12
 
13
13
  ## Purpose
14
14
 
15
- A styled block quotation surface that renders a `<blockquote>` element with token-aligned typography, a left accent rule, and three tone variants for default, muted, and inverse contexts.
15
+ A styled block quotation surface that renders a `<blockquote>` element with token-aligned typography, a 1px logical-start accent rule, and three tone variants for default, muted, and inverse contexts.
16
16
 
17
17
  ## Anatomy & slots
18
18
 
@@ -65,10 +65,10 @@ Every CSS value the component paints is a `var(--dsx-*)` token.
65
65
 
66
66
  | Property | Token | Role |
67
67
  |---|---|---|
68
- | Padding (left) | `var(--dsx-space-lg)` | Inset gutter for the accent rule. |
69
- | Border (left, default) | `var(--dsx-border-width-xl)` + `var(--dsx-color-primary)` | Default accent rule. |
70
- | Border (left, muted) | `var(--dsx-color-outline-variant)` | Muted accent rule. |
71
- | Border (left, inverse) | `var(--dsx-color-on-inverse-background)` | Inverse-context accent rule. |
68
+ | Padding (inline start) | `var(--dsx-space-lg)` | Inset gutter for the accent rule. |
69
+ | Border (inline start, default) | `var(--dsx-boundary-divider-width)` + `var(--dsx-color-accent-border)` | Default accent rule. |
70
+ | Border (inline start, muted) | `var(--dsx-color-outline-variant)` | Muted accent rule. |
71
+ | Border (inline start, inverse) | `var(--dsx-color-on-inverse-background)` | Inverse-context accent rule. |
72
72
  | Font family | `var(--dsx-typography-body-large-font-family)`, sans-serif fallback | Body type ramp. |
73
73
  | Font size | `var(--dsx-typography-body-large-font-size)` | Body type ramp. |
74
74
  | Line height | `var(--dsx-typography-body-large-line-height)` | Body type ramp. |
@@ -79,6 +79,7 @@ Every CSS value the component paints is a `var(--dsx-*)` token.
79
79
  Rules:
80
80
 
81
81
  - The accent rule and the text color are the only painted values; both come from tokens.
82
+ - The default rule consumes the decorative accent-border role: step 8 in light appearance and step 11 in dark appearance. It is a 1px border on Blockquote itself, not a nested Separator. The muted rule remains a neutral outline-variant.
82
83
  - Tokens come from `DESIGN.md` and the generated `tokens.css`. The `body-large` typography token set is the only ramp Blockquote consumes.
83
84
  - Font style is hard-coded to `italic` in CSS; this is a visual convention, not a token, and is not overridable through a prop.
84
85
 
@@ -142,7 +143,7 @@ Rules:
142
143
 
143
144
  **Token story:**
144
145
 
145
- - Renders inside a `Theme` wrapper with `accentColor="rift"`, `accentColor="warp"`, and `accentColor="ray"`. Asserts the default accent rule color tracks `data-accent-color` (it should resolve to the current `primary` token at runtime).
146
+ - Renders inside a `Theme` wrapper with all five accents (rift, warp, ray, astral and spark). Asserts the default accent rule color tracks `data-accent-color` (it should resolve to the current `accent-border` token at runtime).
146
147
 
147
148
  **A11y story:**
148
149
 
@@ -169,13 +170,13 @@ Rules:
169
170
 
170
171
  **State boundaries:**
171
172
 
172
- - Owned by Blockquote: the root class, the tone modifier class, the typography and color tokens, and the left accent rule.
173
+ - Owned by Blockquote: the root class, the tone modifier class, the typography and color tokens, and the 1px logical-start accent rule.
173
174
  - Owned by the consumer: the quotation body, the optional `cite` URL, and the host element when `asChild` is set.
174
175
 
175
176
  **Boundary rules:**
176
177
 
177
178
  - App-owned data: the source attribution, the optional author display name, the surrounding prose context, and the host element when `asChild` is set.
178
- - DS-owned visuals: token bindings (`--dsx-space-lg`, `--dsx-border-width-xl`, `--dsx-color-primary`, `--dsx-color-outline-variant`, `--dsx-color-on-inverse-background`, `--dsx-color-on-surface-variant`, `--dsx-typography-body-large-*`), the `dsx-blockquote` root class, and the `dsx-blockquote--{tone}` modifier classes.
179
+ - DS-owned visuals: token bindings (`--dsx-space-lg`, `--dsx-boundary-divider-width`, `--dsx-color-accent-border`, `--dsx-color-outline-variant`, `--dsx-color-on-inverse-background`, `--dsx-color-on-surface-variant`, `--dsx-typography-body-large-*`), the `dsx-blockquote` root class, and the `dsx-blockquote--{tone}` modifier classes.
179
180
 
180
181
  ## Penpot build recipe
181
182
 
@@ -201,20 +202,20 @@ The package does not yet publish a Penpot asset for Blockquote. Recipe is visual
201
202
 
202
203
  | Shape | Property | Token | Token type | Penpot property name |
203
204
  |---|---|---|---|---|
204
- | Root | stroke (left) | `--dsx-color-primary` | Color | `strokes` |
205
+ | Root | stroke (logical start) | `--dsx-color-accent-border` | Color | `strokes` |
205
206
  | Root | padding (start) | `--dsx-space-lg` | Spacing | `padding` |
206
207
  | Root | typography | `--dsx-typography-body-large-*` | Typography | `typography` |
207
- | Root (muted) | stroke (left) | `--dsx-color-outline-variant` | Color | `strokes` (state) |
208
- | Root (inverse) | stroke (left) | `--dsx-color-on-inverse-background` | Color | `strokes` (state) |
208
+ | Root (muted) | stroke (logical start) | `--dsx-color-outline-variant` | Color | `strokes` (state) |
209
+ | Root (inverse) | stroke (logical start) | `--dsx-color-on-inverse-background` | Color | `strokes` (state) |
209
210
  | Root (inverse) | text fill | `--dsx-color-on-inverse-background` | Color | `fills` (state) |
210
211
 
211
212
  ### State transformations
212
213
 
213
214
  | State | Root stroke | Text fill | Border width |
214
215
  |---|---|---|---|
215
- | `default` | `--dsx-color-primary` | `--dsx-color-on-surface-variant` | `--dsx-border-width-xl` |
216
- | `muted` | `--dsx-color-outline-variant` | `--dsx-color-on-surface-variant` | `--dsx-border-width-xl` |
217
- | `inverse` | `--dsx-color-on-inverse-background` | `--dsx-color-on-inverse-background` | `--dsx-border-width-xl` |
216
+ | `default` | `--dsx-color-accent-border` | `--dsx-color-on-surface-variant` | `--dsx-boundary-divider-width` |
217
+ | `muted` | `--dsx-color-outline-variant` | `--dsx-color-on-surface-variant` | `--dsx-boundary-divider-width` |
218
+ | `inverse` | `--dsx-color-on-inverse-background` | `--dsx-color-on-inverse-background` | `--dsx-boundary-divider-width` |
218
219
 
219
220
  ### Variant model
220
221
 
@@ -0,0 +1,146 @@
1
+ ---
2
+ title: BottomDock
3
+ status: canonical
4
+ category: Components
5
+ archetype: composite
6
+ depends_on:
7
+ - "@radix-ui/react-slot (powers `asChild` on `BottomDock` and `BottomDock.Item`)"
8
+ - VisuallyHidden (keeps an inactive item's label in the accessible name while it is not drawn)
9
+ ---
10
+
11
+ # BottomDock
12
+
13
+ > Consumer note: this document describes public intent and contracts; the package TypeScript declarations are the exact API.
14
+
15
+ ## Purpose
16
+
17
+ A floating pill of primary destinations for phone widths — the phone counterpart of the `Sidebar`
18
+ panel. It holds a handful of navigation items (four destinations plus a "More" item is the norm), marks
19
+ the current one, and sits above the page bottom edge with the safe-area inset respected. It is
20
+ navigation-agnostic: the app owns the routes, the active-page detection and what "More" does (usually
21
+ opening the mobile `Sidebar` drawer through `useSidebar().setMobileSheetOpen(true)`).
22
+
23
+ It is **not** a full-width tab bar (`TabNav`, `Tabs`) and not a toolbar. Use it only for primary
24
+ navigation at phone widths; render it conditionally (the component writes no breakpoints).
25
+
26
+ Wild references (decisions in `docs/feature/design-system/shell-chrome-c/decisions.md`): Material 3
27
+ navigation bar (2–5 destinations; the selected destination always shows its label), Apple HIG tab bar
28
+ (at most five tabs; labels recommended; badges), MUI `BottomNavigation` (`showLabels`).
29
+
30
+ ## Anatomy & slots
31
+
32
+ **Parent:** `BottomDock`. The root is `<nav aria-label="Bottom navigation">`. Items are direct children.
33
+
34
+ | Slot | Element | Renders | Notes |
35
+ |---|---|---|---|
36
+ | `BottomDock` | `<nav>` (or `Slot` child when `asChild`) | `dsx-bottom-dock` + `data-slot="bottom-dock"` + `data-placement` + `data-labels` | The floating pill and landmark. |
37
+ | `BottomDock.Item` | `<button type="button">` (or `Slot` child when `asChild`, e.g. a router link) | `dsx-bottom-dock__item` + `data-slot="bottom-dock-item"` + `data-active` + `data-label` + `aria-current="page"` when active | One destination or action. |
38
+ | `BottomDock.Icon` | `<span aria-hidden="true">` | `dsx-bottom-dock__icon` + `data-slot="bottom-dock-icon"` | Wraps the glyph (an `Icon`); decorative. |
39
+ | `BottomDock.Label` | `<span>` | `dsx-bottom-dock__label` + `data-slot="bottom-dock-label"` | The destination name. When the item's label is hidden by the `labels` mode it renders through `VisuallyHidden`, so it stays in the accessible name. |
40
+ | `BottomDock.Badge` | `<span>` | `dsx-bottom-dock__badge` + `data-slot="bottom-dock-badge"` | A count; with no children it renders as a dot. Position-only — the badge text, if any, is the consumer's. |
41
+
42
+ ## Props contract
43
+
44
+ ### `BottomDock`
45
+
46
+ | Prop | Type | Default | Required | Description | Responsive |
47
+ |---|---|---|---|---|---|
48
+ | `placement` | `'fixed' \| 'contained'` | `'fixed'` | no | `fixed` pins the dock to the viewport bottom and adds `--dsx-safe-area-inset-bottom`; `contained` positions it absolutely inside the nearest positioned ancestor (demos, framed compositions). | no |
49
+ | `labels` | `'active' \| 'always'` | `'active'` | no | `active`: only the current item draws its label (Material 3); `always`: every item draws its label (HIG-style). Hidden labels stay in the accessible name. | no |
50
+ | `asChild` | `boolean` | `false` | no | Renders the host through `Slot`. | no |
51
+ | `aria-label` | `string` | `'Bottom navigation'` | no | The landmark name; override with product copy. | no |
52
+ | `className` | `string` | `undefined` | no | Extra classes appended to `dsx-bottom-dock`. | no |
53
+ | `children` | `React.ReactNode` | `undefined` | no | `BottomDock.Item` rows. | no |
54
+
55
+ ### `BottomDock.Item`
56
+
57
+ | Prop | Type | Default | Required | Description | Responsive |
58
+ |---|---|---|---|---|---|
59
+ | `isActive` | `boolean` | `false` | no | Marks the current destination. Writes `aria-current="page"` and `data-active="true"`. | no |
60
+ | `asChild` | `boolean` | `false` | no | Renders the host through `Slot`. When set, `type` is omitted. | no |
61
+ | `type` | `'button' \| 'submit' \| 'reset'` | `'button'` | no | Forwarded to the host `<button>`. Omitted when `asChild` is set. | no |
62
+ | `className` | `string` | `undefined` | no | Extra classes appended to `dsx-bottom-dock__item`. | no |
63
+ | `children` | `React.ReactNode` | (required) | yes | `BottomDock.Icon`, `BottomDock.Label`, optionally `BottomDock.Badge`. | no |
64
+
65
+ `BottomDock.Icon`, `BottomDock.Label` and `BottomDock.Badge` accept standard `<span>` attributes plus `className` and `children`.
66
+
67
+ Rules:
68
+
69
+ - Guidance, not enforcement: up to five items; in practice four destinations plus "More".
70
+ - An item without a `BottomDock.Label` must carry its own `aria-label`.
71
+ - `BottomDock.Item` reads the dock's `labels` mode and its own `isActive` to write `data-label="visible" | "hidden"`; `BottomDock.Label` reads that to decide whether to render through `VisuallyHidden`.
72
+
73
+ ## CSS class contract
74
+
75
+ **Root class:** `dsx-bottom-dock`
76
+
77
+ | Attribute | Allowed values | Hook | CSS file |
78
+ |---|---|---|---|
79
+ | `data-placement` | `fixed`, `contained` | `.dsx-bottom-dock:where([data-placement='contained'])` switches to absolute positioning | `bottom-dock.css` |
80
+ | `data-labels` | `active`, `always` | recorded for consumers and tests; the visible/hidden decision is per item through `data-label` | `bottom-dock.css` |
81
+ | `data-active` | `true` | `.dsx-bottom-dock__item:where([data-active='true'])` — the opaque accent container | `bottom-dock.css` |
82
+ | `data-label` | `visible`, `hidden` | recorded on the item for consumers and tests; the hidden label is removed from the layout through `VisuallyHidden` | `bottom-dock.css` |
83
+ | `data-slot` | `bottom-dock-*` | hooks | `bottom-dock.css` |
84
+
85
+ **Slot classes:** `dsx-bottom-dock`, `dsx-bottom-dock__item`, `dsx-bottom-dock__icon`,
86
+ `dsx-bottom-dock__label`, `dsx-bottom-dock__badge`.
87
+
88
+ No `data-variant`, `data-size`, `data-accent-color`, `data-radius` or `data-high-contrast` is written
89
+ (contract profile: none). `data-radius` in particular is never used as a local attribute name (see
90
+ `component-contract.md`).
91
+
92
+ **Responsive behavior:** none in CSS — the app renders the dock only at phone widths.
93
+
94
+ **Reduced motion:** the item's colour/background transition is removed under `prefers-reduced-motion: reduce`.
95
+
96
+ ## Token mapping
97
+
98
+ | Property | Token | Role |
99
+ |---|---|---|
100
+ | Position (fixed) | `inset-inline: var(--dsx-space-3)`; `inset-block-end: calc(var(--dsx-space-3) + var(--dsx-safe-area-inset-bottom, 0px))` | floating gap + safe area |
101
+ | Stacking | `var(--dsx-z-index-fixed)` | above sticky chrome, below overlays and modals |
102
+ | Surface | `var(--dsx-color-panel-translucent)` + `var(--dsx-effect-panel-glass-backdrop-filter)` | the glass panel precedent (dropdown-menu, command) |
103
+ | Border | `var(--dsx-border-width-sm) solid var(--dsx-panel-border-color)` | structural edge |
104
+ | Shadow | `var(--dsx-panel-shadow)` | floating elevation |
105
+ | Radius | `var(--dsx-rounded-xl)` | pill |
106
+ | Padding / gap | `var(--dsx-space-xs)` | inner rhythm |
107
+ | Item min size | `calc(var(--dsx-size-xl) + var(--dsx-space-xs))` (44px at default density) | touch target |
108
+ | Item radius | `var(--dsx-rounded-lg)` | follows the global radius setting |
109
+ | Item colour | `var(--dsx-color-on-surface-variant)` | inactive |
110
+ | Item hover | `var(--dsx-effect-hover-ghost)` | hover surface |
111
+ | Item active | `var(--dsx-color-primary-container)` / `var(--dsx-color-on-primary-container)` | opaque accent container (DESIGN.md) |
112
+ | Label type | `var(--dsx-typography-label-small-*)` | compact label; a label wider than its item truncates with an ellipsis (the full text stays in the accessible name) rather than overflowing the pill |
113
+ | Badge | `var(--dsx-color-primary)` / `var(--dsx-color-on-primary)` | count or dot |
114
+ | Focus ring | `var(--dsx-shadow-focus-ring)` | `:focus-visible` |
115
+ | Motion | `var(--dsx-motion-duration-fast) var(--dsx-motion-easing-standard)` | colour transition |
116
+
117
+ Rules: no raw colour, spacing, radius or motion values in `bottom-dock.css`.
118
+
119
+ ## Accessibility
120
+
121
+ - `BottomDock` is a named `nav` landmark.
122
+ - The current item has `aria-current="page"`; the active state is also carried by the container fill and the visible label (not colour alone).
123
+ - Every item has an accessible name: its `BottomDock.Label` (kept in the DOM through `VisuallyHidden` when not drawn) or its own `aria-label`.
124
+ - Touch targets are at least 44px; focus is a visible ring; the whole dock is reachable in normal tab order.
125
+ - A badge with text is part of the item's accessible name ("Devices 3"); an empty dot badge adds nothing. Place the badge inside `BottomDock.Icon` to sit on the glyph (the icon wrapper is `aria-hidden`, so a count placed there is not announced).
126
+
127
+ ## Playground demo spec
128
+
129
+ **Default story:** four `BottomDock.Item`s (icon + label) in a `contained` dock, the first active.
130
+ **Variant stories:** `labels="always"` beside the default `active`; `placement="contained"` is the demo default.
131
+ **State stories:** an active item; an item with a count badge; an item with a dot badge; keyboard focus.
132
+ **Composition story:** the dock with a "More" item that opens a `Sidebar` drawer (mobile) — documented, driven by `useSidebar()`.
133
+ **Token story:** inside `Theme` with each of the five accents (the active container and the badge vary by accent).
134
+ **A11y story:** `BottomDock.test.tsx` runs `vitest-axe`.
135
+
136
+ | Prop | Control | Default |
137
+ |---|---|---|
138
+ | `placement` | select | `contained` (demo) |
139
+ | `labels` | select | `active` |
140
+
141
+ ## Wiring notes
142
+
143
+ **Composes from:** `@radix-ui/react-slot`, `VisuallyHidden`.
144
+
145
+ **State boundaries:** owned by `BottomDock`: nothing persistent — only the derived `data-label`.
146
+ Owned by the consumer: routes, the active item, the badge counts, the "More" action, when the dock is shown.
@@ -179,42 +179,11 @@ Box has no motion. The motion section is intentionally empty.
179
179
 
180
180
  - Box is not interactive and does not require an accessible name on its own. When Box wraps an interactive element, the interactive element's accessible name is the source.
181
181
 
182
- ## Playground demo spec
183
-
184
- **Default story:**
185
-
186
- - Renders `Box` with no extra props and a child node. Asserts the root class is `dsx-box` and the host element is a `div`.
187
-
188
- **Padding story:**
189
-
190
- - Renders `Box padding="md"` and `Box p="md"` side by side. Asserts the matching `dsx-r-p-md` class and that `--dsx-box-padding` plus `--dsx-r-p` resolve to `var(--dsx-space-md)`.
191
-
192
- **Surface story:**
193
-
194
- - Renders `Box surface="surface-raised" border borderTone="strong" radius="md" shadow="2"`. Asserts that the `dsx-box` root class is present and the inline style carries the resolved CSS variables for surface, border, and shadow.
195
-
196
- **Responsive story:**
182
+ The padding matrix uses outlined content bounds and the surface matrix uses actual Box surface props. The live example offers sm/md/lg padding controls (8/16/24px) around a fixed inner surface.
197
183
 
198
- - Renders `Box padding={{ initial: 'sm', md: 'lg' }} display={{ initial: 'flex', lg: 'grid' }}`. Asserts the `dsx-r-p-sm`, `md:dsx-r-p-lg`, and breakpoint variants for `display` resolve.
199
-
200
- **Token story:**
201
-
202
- - Box does not honor `data-accent-color`; surface tones come from `var(--dsx-color-*)` and respond to the active `Theme` wrapper automatically. Render `Box` inside a `Theme` with `accentColor="silver"` and `accentColor="bronze"`. The story asserts the surface variables come from the theme, not the brand color.
203
-
204
- **A11y story:**
205
-
206
- - Use `vitest-axe` against the rendered `Box`. The default story is a non-semantic `div` with no axe-critical content; tests assert no violations on the default render.
207
-
208
- **Props exposed in the playground controls:**
184
+ ## Playground demo spec
209
185
 
210
- | Prop | Control | Default |
211
- |---|---|---|
212
- | `display` | select | `block` |
213
- | `padding` | select | `md` |
214
- | `radius` | select | `md` |
215
- | `surface` | select | `surface` |
216
- | `border` | boolean | `false` |
217
- | `shadow` | select | `none` |
186
+ The matrix exposes padding sm/md/lg and three neutral surfaces. Every cell outlines the content bounds inside a Box with an actual padding/surface prop. The live example changes padding between 8/16/24px around an unchanged inner project surface. It uses native Buttons with aria-pressed and remains bounded at 320px.
218
187
 
219
188
  ## Wiring notes
220
189
 
@@ -112,7 +112,7 @@ Rules:
112
112
 
113
113
  **Responsive behavior:**
114
114
 
115
- - The component does not write `@media` rules. `size` is single-value only; the prop def is not `responsive: true`.
115
+ - The component does not use width breakpoints. `size` is single-value only; the prop def is not `responsive: true`.
116
116
 
117
117
  **Reduced motion:**
118
118
 
@@ -127,17 +127,18 @@ Rules:
127
127
  | Link radius | `var(--dsx-rounded-md)` | Rounded tap area. |
128
128
  | Link color | `var(--dsx-color-on-surface)` | Default link. |
129
129
  | Link hover background | `var(--dsx-effect-hover-ghost)` | Hover. |
130
- | Link hover color | `var(--dsx-color-primary)` | Hover. |
130
+ | Link hover color | `var(--dsx-color-accent-indicator)` | Hover. |
131
131
  | Link focus ring | `var(--dsx-shadow-focus-ring)` | Visible focus. |
132
132
  | Link disabled opacity | `var(--dsx-opacity-disabled)` | Disabled state. |
133
- | Page color | `var(--dsx-color-high-contrast)` | Current page text. |
133
+ | Page background | `var(--dsx-color-accent-surface)` | Subtle current-page fill. |
134
+ | Page color | `var(--dsx-color-accent-indicator)` | Current page text. |
134
135
  | Separator color | `var(--dsx-color-on-surface-variant)` | Divider. |
135
136
  | Typography (link and page) | `var(--dsx-typography-body-medium-*)` | Body copy. |
136
137
 
137
138
  Rules:
138
139
 
139
140
  - No raw color, spacing, radius, or motion values in `breadcrumb.css`.
140
- - The breadcrumb does not honor `data-accent-color`; the hover color uses `var(--dsx-color-primary)` directly because the active page is the only state the consumer needs to see in the accent color.
141
+ - Breadcrumb inherits the active theme accent roles: hover/current-page foreground uses accent-indicator and the current-page fill uses accent-surface.
141
142
 
142
143
  ## Motion contract
143
144
 
@@ -176,7 +177,7 @@ Rules:
176
177
 
177
178
  **Color and meaning:**
178
179
 
179
- - The current page is communicated by `aria-current` and the high-contrast text color. The color is not the only signal.
180
+ - The current page is communicated by `aria-current` and the accent foreground and current-page label. The color is not the only signal.
180
181
 
181
182
  **Naming:**
182
183
 
@@ -185,6 +186,8 @@ Rules:
185
186
 
186
187
  ## Playground demo spec
187
188
 
189
+ Size scales the link/page typography and padding: sm uses body-small and space-xs; md retains body-medium with space-xs/space-sm; lg uses body-large and space-sm/space-md. Link targets have a minimum 24px height, and long labels wrap within the available container.
190
+
188
191
  **Default story:**
189
192
 
190
193
  - Renders a `Breadcrumb` with three items: Home (link), Products (link), Keyboard (page). Asserts the root has `dsx-breadcrumb` and `data-size="md"`. Asserts the page has `aria-current="page"`.
@@ -273,7 +276,7 @@ Rules:
273
276
  | `<Link text>` | typography | `var(--dsx-typography-body-medium-*)` | Typography | `typography` |
274
277
  | `<Link text>` | color | `var(--dsx-color-on-surface)` | Color | `fills` |
275
278
  | `<Page text>` | typography | `var(--dsx-typography-body-medium-*)` | Typography | `typography` |
276
- | `<Page text>` | color | `var(--dsx-color-high-contrast)` | Color | `fills` |
279
+ | `<Page text>` | color | `var(--dsx-color-accent-indicator)` | Color | `fills` |
277
280
  | `<Separator icon>` | color | `var(--dsx-color-on-surface-variant)` | Color | `fills` |
278
281
 
279
282
  ### State transformations
@@ -281,8 +284,8 @@ Rules:
281
284
  | State | Link fill | Link background |
282
285
  |---|---|---|
283
286
  | `default` | `var(--dsx-color-on-surface)` | `transparent` |
284
- | `hover` | `var(--dsx-color-primary)` | `var(--dsx-effect-hover-ghost)` |
285
- | `focus-visible` | `var(--dsx-color-primary)` | `var(--dsx-shadow-focus-ring)` |
287
+ | `hover` | `var(--dsx-color-accent-indicator)` | `var(--dsx-effect-hover-ghost)` |
288
+ | `focus-visible` | `var(--dsx-color-accent-indicator)` | `var(--dsx-shadow-focus-ring)` |
286
289
  | `disabled` | `var(--dsx-color-on-surface)` with `var(--dsx-opacity-disabled)` | `transparent` |
287
290
 
288
291
  ### Variant model
@@ -295,3 +298,5 @@ Rules:
295
298
  - [ ] Token bindings resolve at the values `DESIGN.md` describes.
296
299
  - [ ] Component is promoted to Main Component under `Components`.
297
300
  - [ ] `penpotUtils.shapeStructure(board, 3)` matches the expected hierarchy.
301
+
302
+ Current-page text pairs accent-indicator with accent-surface, retaining readable foreground contrast in both appearances.