@fragments-sdk/ui 0.13.0 → 0.14.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 (656) hide show
  1. package/dist/assets/ui.css +1642 -1679
  2. package/dist/chart.cjs.map +1 -1
  3. package/dist/chart.js.map +1 -1
  4. package/dist/codeblock.cjs +26 -18
  5. package/dist/codeblock.cjs.map +1 -1
  6. package/dist/codeblock.js +26 -18
  7. package/dist/codeblock.js.map +1 -1
  8. package/dist/components/Accordion/Accordion.module.scss.cjs +8 -8
  9. package/dist/components/Accordion/Accordion.module.scss.js +8 -8
  10. package/dist/components/Accordion/index.cjs +7 -3
  11. package/dist/components/Accordion/index.cjs.map +1 -1
  12. package/dist/components/Accordion/index.d.ts +24 -11
  13. package/dist/components/Accordion/index.d.ts.map +1 -1
  14. package/dist/components/Accordion/index.js +7 -3
  15. package/dist/components/Accordion/index.js.map +1 -1
  16. package/dist/components/Alert/Alert.module.scss.cjs +12 -12
  17. package/dist/components/Alert/Alert.module.scss.js +12 -12
  18. package/dist/components/Alert/index.cjs +37 -15
  19. package/dist/components/Alert/index.cjs.map +1 -1
  20. package/dist/components/Alert/index.d.ts +15 -22
  21. package/dist/components/Alert/index.d.ts.map +1 -1
  22. package/dist/components/Alert/index.js +37 -15
  23. package/dist/components/Alert/index.js.map +1 -1
  24. package/dist/components/AppShell/AppShell.module.scss.cjs +14 -14
  25. package/dist/components/AppShell/AppShell.module.scss.js +14 -14
  26. package/dist/components/AppShell/index.cjs +3 -1
  27. package/dist/components/AppShell/index.cjs.map +1 -1
  28. package/dist/components/AppShell/index.d.ts.map +1 -1
  29. package/dist/components/AppShell/index.js +3 -1
  30. package/dist/components/AppShell/index.js.map +1 -1
  31. package/dist/components/Avatar/index.cjs +9 -1
  32. package/dist/components/Avatar/index.cjs.map +1 -1
  33. package/dist/components/Avatar/index.d.ts +2 -0
  34. package/dist/components/Avatar/index.d.ts.map +1 -1
  35. package/dist/components/Avatar/index.js +9 -1
  36. package/dist/components/Avatar/index.js.map +1 -1
  37. package/dist/components/Badge/index.cjs +4 -2
  38. package/dist/components/Badge/index.cjs.map +1 -1
  39. package/dist/components/Badge/index.d.ts +3 -0
  40. package/dist/components/Badge/index.d.ts.map +1 -1
  41. package/dist/components/Badge/index.js +4 -2
  42. package/dist/components/Badge/index.js.map +1 -1
  43. package/dist/components/BentoGrid/BentoGrid.module.scss.cjs +11 -11
  44. package/dist/components/BentoGrid/BentoGrid.module.scss.js +11 -11
  45. package/dist/components/BentoGrid/index.cjs +8 -5
  46. package/dist/components/BentoGrid/index.cjs.map +1 -1
  47. package/dist/components/BentoGrid/index.d.ts +2 -8
  48. package/dist/components/BentoGrid/index.d.ts.map +1 -1
  49. package/dist/components/BentoGrid/index.js +8 -5
  50. package/dist/components/BentoGrid/index.js.map +1 -1
  51. package/dist/components/Box/index.cjs +12 -2
  52. package/dist/components/Box/index.cjs.map +1 -1
  53. package/dist/components/Box/index.d.ts +1 -1
  54. package/dist/components/Box/index.d.ts.map +1 -1
  55. package/dist/components/Box/index.js +12 -2
  56. package/dist/components/Box/index.js.map +1 -1
  57. package/dist/components/Breadcrumbs/index.cjs +3 -1
  58. package/dist/components/Breadcrumbs/index.cjs.map +1 -1
  59. package/dist/components/Breadcrumbs/index.d.ts +3 -1
  60. package/dist/components/Breadcrumbs/index.d.ts.map +1 -1
  61. package/dist/components/Breadcrumbs/index.js +3 -1
  62. package/dist/components/Breadcrumbs/index.js.map +1 -1
  63. package/dist/components/Button/Button.module.scss.cjs +11 -11
  64. package/dist/components/Button/Button.module.scss.js +11 -11
  65. package/dist/components/Button/index.cjs +5 -2
  66. package/dist/components/Button/index.cjs.map +1 -1
  67. package/dist/components/Button/index.d.ts +3 -3
  68. package/dist/components/Button/index.d.ts.map +1 -1
  69. package/dist/components/Button/index.js +5 -2
  70. package/dist/components/Button/index.js.map +1 -1
  71. package/dist/components/ButtonGroup/index.cjs +3 -2
  72. package/dist/components/ButtonGroup/index.cjs.map +1 -1
  73. package/dist/components/ButtonGroup/index.d.ts +1 -2
  74. package/dist/components/ButtonGroup/index.d.ts.map +1 -1
  75. package/dist/components/ButtonGroup/index.js +3 -2
  76. package/dist/components/ButtonGroup/index.js.map +1 -1
  77. package/dist/components/Card/Card.module.scss.cjs +14 -14
  78. package/dist/components/Card/Card.module.scss.js +14 -14
  79. package/dist/components/Card/index.cjs +3 -22
  80. package/dist/components/Card/index.cjs.map +1 -1
  81. package/dist/components/Card/index.d.ts +6 -11
  82. package/dist/components/Card/index.d.ts.map +1 -1
  83. package/dist/components/Card/index.js +3 -22
  84. package/dist/components/Card/index.js.map +1 -1
  85. package/dist/components/Chart/Chart.module.scss.cjs +15 -15
  86. package/dist/components/Chart/Chart.module.scss.js +15 -15
  87. package/dist/components/Chart/index.d.ts +3 -3
  88. package/dist/components/Chart/index.d.ts.map +1 -1
  89. package/dist/components/Checkbox/Checkbox.module.scss.cjs +10 -10
  90. package/dist/components/Checkbox/Checkbox.module.scss.js +10 -10
  91. package/dist/components/Checkbox/index.cjs +11 -4
  92. package/dist/components/Checkbox/index.cjs.map +1 -1
  93. package/dist/components/Checkbox/index.d.ts +6 -0
  94. package/dist/components/Checkbox/index.d.ts.map +1 -1
  95. package/dist/components/Checkbox/index.js +11 -4
  96. package/dist/components/Checkbox/index.js.map +1 -1
  97. package/dist/components/Chip/index.cjs +11 -3
  98. package/dist/components/Chip/index.cjs.map +1 -1
  99. package/dist/components/Chip/index.d.ts +1 -2
  100. package/dist/components/Chip/index.d.ts.map +1 -1
  101. package/dist/components/Chip/index.js +11 -3
  102. package/dist/components/Chip/index.js.map +1 -1
  103. package/dist/components/CodeBlock/CodeBlock.module.scss.cjs +20 -20
  104. package/dist/components/CodeBlock/CodeBlock.module.scss.js +20 -20
  105. package/dist/components/CodeBlock/index.d.ts +8 -2
  106. package/dist/components/CodeBlock/index.d.ts.map +1 -1
  107. package/dist/components/Collapsible/Collapsible.module.scss.cjs +10 -10
  108. package/dist/components/Collapsible/Collapsible.module.scss.js +10 -10
  109. package/dist/components/Combobox/Combobox.module.scss.cjs +15 -15
  110. package/dist/components/Combobox/Combobox.module.scss.js +15 -15
  111. package/dist/components/Combobox/index.cjs +68 -18
  112. package/dist/components/Combobox/index.cjs.map +1 -1
  113. package/dist/components/Combobox/index.d.ts +32 -11
  114. package/dist/components/Combobox/index.d.ts.map +1 -1
  115. package/dist/components/Combobox/index.js +68 -18
  116. package/dist/components/Combobox/index.js.map +1 -1
  117. package/dist/components/Command/Command.module.scss.cjs +11 -11
  118. package/dist/components/Command/Command.module.scss.js +11 -11
  119. package/dist/components/Command/index.cjs +4 -4
  120. package/dist/components/Command/index.cjs.map +1 -1
  121. package/dist/components/Command/index.d.ts +1 -1
  122. package/dist/components/Command/index.d.ts.map +1 -1
  123. package/dist/components/Command/index.js +4 -4
  124. package/dist/components/Command/index.js.map +1 -1
  125. package/dist/components/ConversationList/ConversationList.module.scss.cjs +10 -10
  126. package/dist/components/ConversationList/ConversationList.module.scss.js +10 -10
  127. package/dist/components/ConversationList/index.cjs +6 -3
  128. package/dist/components/ConversationList/index.cjs.map +1 -1
  129. package/dist/components/ConversationList/index.d.ts +1 -1
  130. package/dist/components/ConversationList/index.d.ts.map +1 -1
  131. package/dist/components/ConversationList/index.js +6 -3
  132. package/dist/components/ConversationList/index.js.map +1 -1
  133. package/dist/components/DataTable/DataTable.module.scss.cjs +26 -26
  134. package/dist/components/DataTable/DataTable.module.scss.js +26 -26
  135. package/dist/components/DataTable/index.cjs +13 -4
  136. package/dist/components/DataTable/index.cjs.map +1 -1
  137. package/dist/components/DataTable/index.d.ts +7 -2
  138. package/dist/components/DataTable/index.d.ts.map +1 -1
  139. package/dist/components/DataTable/index.js +13 -4
  140. package/dist/components/DataTable/index.js.map +1 -1
  141. package/dist/components/DatePicker/DatePicker.module.scss.cjs +26 -26
  142. package/dist/components/DatePicker/DatePicker.module.scss.js +26 -26
  143. package/dist/components/DatePicker/index.d.ts +2 -2
  144. package/dist/components/DatePicker/index.d.ts.map +1 -1
  145. package/dist/components/Dialog/Dialog.module.scss.cjs +14 -14
  146. package/dist/components/Dialog/Dialog.module.scss.js +14 -14
  147. package/dist/components/Dialog/index.cjs +2 -1
  148. package/dist/components/Dialog/index.cjs.map +1 -1
  149. package/dist/components/Dialog/index.d.ts +20 -7
  150. package/dist/components/Dialog/index.d.ts.map +1 -1
  151. package/dist/components/Dialog/index.js +2 -1
  152. package/dist/components/Dialog/index.js.map +1 -1
  153. package/dist/components/Drawer/Drawer.module.scss.cjs +26 -26
  154. package/dist/components/Drawer/Drawer.module.scss.js +26 -26
  155. package/dist/components/Drawer/index.cjs +30 -3
  156. package/dist/components/Drawer/index.cjs.map +1 -1
  157. package/dist/components/Drawer/index.d.ts +3 -1
  158. package/dist/components/Drawer/index.d.ts.map +1 -1
  159. package/dist/components/Drawer/index.js +13 -3
  160. package/dist/components/Drawer/index.js.map +1 -1
  161. package/dist/components/Editor/Editor.module.scss.cjs +17 -17
  162. package/dist/components/Editor/Editor.module.scss.js +17 -17
  163. package/dist/components/Editor/index.cjs +32 -7
  164. package/dist/components/Editor/index.cjs.map +1 -1
  165. package/dist/components/Editor/index.d.ts +16 -3
  166. package/dist/components/Editor/index.d.ts.map +1 -1
  167. package/dist/components/Editor/index.js +32 -7
  168. package/dist/components/Editor/index.js.map +1 -1
  169. package/dist/components/EmptyState/EmptyState.module.scss.cjs +8 -8
  170. package/dist/components/EmptyState/EmptyState.module.scss.js +8 -8
  171. package/dist/components/EmptyState/index.cjs +12 -8
  172. package/dist/components/EmptyState/index.cjs.map +1 -1
  173. package/dist/components/EmptyState/index.d.ts +8 -12
  174. package/dist/components/EmptyState/index.d.ts.map +1 -1
  175. package/dist/components/EmptyState/index.js +12 -8
  176. package/dist/components/EmptyState/index.js.map +1 -1
  177. package/dist/components/Fieldset/index.cjs +2 -2
  178. package/dist/components/Fieldset/index.cjs.map +1 -1
  179. package/dist/components/Fieldset/index.d.ts +2 -3
  180. package/dist/components/Fieldset/index.d.ts.map +1 -1
  181. package/dist/components/Fieldset/index.js +2 -2
  182. package/dist/components/Fieldset/index.js.map +1 -1
  183. package/dist/components/Form/index.cjs +13 -13
  184. package/dist/components/Form/index.cjs.map +1 -1
  185. package/dist/components/Form/index.d.ts +5 -2
  186. package/dist/components/Form/index.d.ts.map +1 -1
  187. package/dist/components/Form/index.js +13 -13
  188. package/dist/components/Form/index.js.map +1 -1
  189. package/dist/components/Grid/Grid.module.scss.cjs +57 -57
  190. package/dist/components/Grid/Grid.module.scss.js +57 -57
  191. package/dist/components/Grid/index.cjs +7 -4
  192. package/dist/components/Grid/index.cjs.map +1 -1
  193. package/dist/components/Grid/index.d.ts +5 -3
  194. package/dist/components/Grid/index.d.ts.map +1 -1
  195. package/dist/components/Grid/index.js +7 -4
  196. package/dist/components/Grid/index.js.map +1 -1
  197. package/dist/components/Header/Header.module.scss.cjs +21 -21
  198. package/dist/components/Header/Header.module.scss.js +21 -21
  199. package/dist/components/Header/index.cjs +61 -23
  200. package/dist/components/Header/index.cjs.map +1 -1
  201. package/dist/components/Header/index.d.ts +27 -34
  202. package/dist/components/Header/index.d.ts.map +1 -1
  203. package/dist/components/Header/index.js +61 -23
  204. package/dist/components/Header/index.js.map +1 -1
  205. package/dist/components/Icon/index.cjs +11 -1
  206. package/dist/components/Icon/index.cjs.map +1 -1
  207. package/dist/components/Icon/index.d.ts +28 -9
  208. package/dist/components/Icon/index.d.ts.map +1 -1
  209. package/dist/components/Icon/index.js +11 -1
  210. package/dist/components/Icon/index.js.map +1 -1
  211. package/dist/components/Image/index.cjs +15 -4
  212. package/dist/components/Image/index.cjs.map +1 -1
  213. package/dist/components/Image/index.d.ts +7 -1
  214. package/dist/components/Image/index.d.ts.map +1 -1
  215. package/dist/components/Image/index.js +15 -4
  216. package/dist/components/Image/index.js.map +1 -1
  217. package/dist/components/Input/Input.module.scss.cjs +13 -13
  218. package/dist/components/Input/Input.module.scss.js +13 -13
  219. package/dist/components/Input/index.cjs +79 -31
  220. package/dist/components/Input/index.cjs.map +1 -1
  221. package/dist/components/Input/index.d.ts +17 -3
  222. package/dist/components/Input/index.d.ts.map +1 -1
  223. package/dist/components/Input/index.js +79 -31
  224. package/dist/components/Input/index.js.map +1 -1
  225. package/dist/components/Link/index.cjs +17 -0
  226. package/dist/components/Link/index.cjs.map +1 -1
  227. package/dist/components/Link/index.d.ts.map +1 -1
  228. package/dist/components/Link/index.js +17 -0
  229. package/dist/components/Link/index.js.map +1 -1
  230. package/dist/components/Listbox/Listbox.module.scss.cjs +8 -8
  231. package/dist/components/Listbox/Listbox.module.scss.js +8 -8
  232. package/dist/components/Listbox/index.cjs +10 -6
  233. package/dist/components/Listbox/index.cjs.map +1 -1
  234. package/dist/components/Listbox/index.d.ts +2 -2
  235. package/dist/components/Listbox/index.d.ts.map +1 -1
  236. package/dist/components/Listbox/index.js +10 -6
  237. package/dist/components/Listbox/index.js.map +1 -1
  238. package/dist/components/Markdown/Markdown.module.scss.cjs +1 -1
  239. package/dist/components/Markdown/Markdown.module.scss.js +1 -1
  240. package/dist/components/Markdown/index.d.ts +4 -2
  241. package/dist/components/Markdown/index.d.ts.map +1 -1
  242. package/dist/components/Menu/Menu.module.scss.cjs +13 -13
  243. package/dist/components/Menu/Menu.module.scss.js +13 -13
  244. package/dist/components/Menu/index.cjs +12 -1
  245. package/dist/components/Menu/index.cjs.map +1 -1
  246. package/dist/components/Menu/index.d.ts +9 -4
  247. package/dist/components/Menu/index.d.ts.map +1 -1
  248. package/dist/components/Menu/index.js +12 -1
  249. package/dist/components/Menu/index.js.map +1 -1
  250. package/dist/components/Message/Message.module.scss.cjs +18 -18
  251. package/dist/components/Message/Message.module.scss.js +18 -18
  252. package/dist/components/NavigationMenu/NavigationMenu.module.scss.cjs +28 -28
  253. package/dist/components/NavigationMenu/NavigationMenu.module.scss.js +28 -28
  254. package/dist/components/NavigationMenu/NavigationMenuContext.cjs.map +1 -1
  255. package/dist/components/NavigationMenu/NavigationMenuContext.d.ts +8 -0
  256. package/dist/components/NavigationMenu/NavigationMenuContext.d.ts.map +1 -1
  257. package/dist/components/NavigationMenu/NavigationMenuContext.js.map +1 -1
  258. package/dist/components/NavigationMenu/index.cjs +49 -10
  259. package/dist/components/NavigationMenu/index.cjs.map +1 -1
  260. package/dist/components/NavigationMenu/index.d.ts +5 -1
  261. package/dist/components/NavigationMenu/index.d.ts.map +1 -1
  262. package/dist/components/NavigationMenu/index.js +49 -10
  263. package/dist/components/NavigationMenu/index.js.map +1 -1
  264. package/dist/components/Pagination/index.cjs +37 -9
  265. package/dist/components/Pagination/index.cjs.map +1 -1
  266. package/dist/components/Pagination/index.d.ts +2 -3
  267. package/dist/components/Pagination/index.d.ts.map +1 -1
  268. package/dist/components/Pagination/index.js +37 -9
  269. package/dist/components/Pagination/index.js.map +1 -1
  270. package/dist/components/Popover/Popover.module.scss.cjs +10 -10
  271. package/dist/components/Popover/Popover.module.scss.js +10 -10
  272. package/dist/components/Popover/index.cjs +43 -2
  273. package/dist/components/Popover/index.cjs.map +1 -1
  274. package/dist/components/Popover/index.d.ts +16 -6
  275. package/dist/components/Popover/index.d.ts.map +1 -1
  276. package/dist/components/Popover/index.js +26 -2
  277. package/dist/components/Popover/index.js.map +1 -1
  278. package/dist/components/Progress/index.cjs +3 -1
  279. package/dist/components/Progress/index.cjs.map +1 -1
  280. package/dist/components/Progress/index.d.ts.map +1 -1
  281. package/dist/components/Progress/index.js +3 -1
  282. package/dist/components/Progress/index.js.map +1 -1
  283. package/dist/components/Prompt/Prompt.module.scss.cjs +14 -14
  284. package/dist/components/Prompt/Prompt.module.scss.js +14 -14
  285. package/dist/components/Prompt/index.cjs +14 -2
  286. package/dist/components/Prompt/index.cjs.map +1 -1
  287. package/dist/components/Prompt/index.d.ts +8 -5
  288. package/dist/components/Prompt/index.d.ts.map +1 -1
  289. package/dist/components/Prompt/index.js +14 -2
  290. package/dist/components/Prompt/index.js.map +1 -1
  291. package/dist/components/RadioGroup/index.cjs +14 -6
  292. package/dist/components/RadioGroup/index.cjs.map +1 -1
  293. package/dist/components/RadioGroup/index.d.ts +12 -2
  294. package/dist/components/RadioGroup/index.d.ts.map +1 -1
  295. package/dist/components/RadioGroup/index.js +14 -6
  296. package/dist/components/RadioGroup/index.js.map +1 -1
  297. package/dist/components/Select/Select.module.scss.cjs +10 -10
  298. package/dist/components/Select/Select.module.scss.js +10 -10
  299. package/dist/components/Select/index.cjs +37 -24
  300. package/dist/components/Select/index.cjs.map +1 -1
  301. package/dist/components/Select/index.d.ts +6 -2
  302. package/dist/components/Select/index.d.ts.map +1 -1
  303. package/dist/components/Select/index.js +37 -24
  304. package/dist/components/Select/index.js.map +1 -1
  305. package/dist/components/Sidebar/Sidebar.module.scss.cjs +42 -42
  306. package/dist/components/Sidebar/Sidebar.module.scss.js +42 -42
  307. package/dist/components/Sidebar/index.cjs +2 -2
  308. package/dist/components/Sidebar/index.cjs.map +1 -1
  309. package/dist/components/Sidebar/index.d.ts +3 -3
  310. package/dist/components/Sidebar/index.d.ts.map +1 -1
  311. package/dist/components/Sidebar/index.js +2 -2
  312. package/dist/components/Sidebar/index.js.map +1 -1
  313. package/dist/components/Skeleton/index.cjs +6 -3
  314. package/dist/components/Skeleton/index.cjs.map +1 -1
  315. package/dist/components/Skeleton/index.d.ts +3 -7
  316. package/dist/components/Skeleton/index.d.ts.map +1 -1
  317. package/dist/components/Skeleton/index.js +6 -3
  318. package/dist/components/Skeleton/index.js.map +1 -1
  319. package/dist/components/Slider/Slider.module.scss.cjs +13 -10
  320. package/dist/components/Slider/Slider.module.scss.cjs.map +1 -1
  321. package/dist/components/Slider/Slider.module.scss.js +13 -10
  322. package/dist/components/Slider/Slider.module.scss.js.map +1 -1
  323. package/dist/components/Slider/index.cjs +33 -1
  324. package/dist/components/Slider/index.cjs.map +1 -1
  325. package/dist/components/Slider/index.d.ts +2 -0
  326. package/dist/components/Slider/index.d.ts.map +1 -1
  327. package/dist/components/Slider/index.js +33 -1
  328. package/dist/components/Slider/index.js.map +1 -1
  329. package/dist/components/Stack/index.cjs +12 -2
  330. package/dist/components/Stack/index.cjs.map +1 -1
  331. package/dist/components/Stack/index.d.ts +3 -2
  332. package/dist/components/Stack/index.d.ts.map +1 -1
  333. package/dist/components/Stack/index.js +12 -2
  334. package/dist/components/Stack/index.js.map +1 -1
  335. package/dist/components/Table/Table.module.scss.cjs +16 -16
  336. package/dist/components/Table/Table.module.scss.js +16 -16
  337. package/dist/components/Table/index.d.ts +10 -4
  338. package/dist/components/Table/index.d.ts.map +1 -1
  339. package/dist/components/TableOfContents/index.cjs +8 -5
  340. package/dist/components/TableOfContents/index.cjs.map +1 -1
  341. package/dist/components/TableOfContents/index.d.ts +2 -2
  342. package/dist/components/TableOfContents/index.d.ts.map +1 -1
  343. package/dist/components/TableOfContents/index.js +8 -5
  344. package/dist/components/TableOfContents/index.js.map +1 -1
  345. package/dist/components/Tabs/Tabs.module.scss.cjs +9 -9
  346. package/dist/components/Tabs/Tabs.module.scss.js +9 -9
  347. package/dist/components/Tabs/index.cjs +9 -6
  348. package/dist/components/Tabs/index.cjs.map +1 -1
  349. package/dist/components/Tabs/index.d.ts +4 -1
  350. package/dist/components/Tabs/index.d.ts.map +1 -1
  351. package/dist/components/Tabs/index.js +9 -6
  352. package/dist/components/Tabs/index.js.map +1 -1
  353. package/dist/components/Textarea/index.cjs +61 -43
  354. package/dist/components/Textarea/index.cjs.map +1 -1
  355. package/dist/components/Textarea/index.d.ts +9 -1
  356. package/dist/components/Textarea/index.d.ts.map +1 -1
  357. package/dist/components/Textarea/index.js +61 -43
  358. package/dist/components/Textarea/index.js.map +1 -1
  359. package/dist/components/Theme/index.cjs +3 -1
  360. package/dist/components/Theme/index.cjs.map +1 -1
  361. package/dist/components/Theme/index.d.ts +2 -4
  362. package/dist/components/Theme/index.d.ts.map +1 -1
  363. package/dist/components/Theme/index.js +3 -1
  364. package/dist/components/Theme/index.js.map +1 -1
  365. package/dist/components/ThinkingIndicator/ThinkingIndicator.module.scss.cjs +22 -22
  366. package/dist/components/ThinkingIndicator/ThinkingIndicator.module.scss.js +22 -22
  367. package/dist/components/Toast/Toast.module.scss.cjs +20 -20
  368. package/dist/components/Toast/Toast.module.scss.js +20 -20
  369. package/dist/components/Toast/index.cjs +15 -14
  370. package/dist/components/Toast/index.cjs.map +1 -1
  371. package/dist/components/Toast/index.d.ts +9 -5
  372. package/dist/components/Toast/index.d.ts.map +1 -1
  373. package/dist/components/Toast/index.js +15 -14
  374. package/dist/components/Toast/index.js.map +1 -1
  375. package/dist/components/Toggle/Toggle.module.scss.cjs +11 -11
  376. package/dist/components/Toggle/Toggle.module.scss.js +11 -11
  377. package/dist/components/Toggle/index.cjs +1 -1
  378. package/dist/components/Toggle/index.cjs.map +1 -1
  379. package/dist/components/Toggle/index.js +1 -1
  380. package/dist/components/Toggle/index.js.map +1 -1
  381. package/dist/components/ToggleGroup/ToggleGroup.module.scss.cjs +17 -17
  382. package/dist/components/ToggleGroup/ToggleGroup.module.scss.js +17 -17
  383. package/dist/components/ToggleGroup/index.cjs +27 -8
  384. package/dist/components/ToggleGroup/index.cjs.map +1 -1
  385. package/dist/components/ToggleGroup/index.d.ts +8 -3
  386. package/dist/components/ToggleGroup/index.d.ts.map +1 -1
  387. package/dist/components/ToggleGroup/index.js +27 -8
  388. package/dist/components/ToggleGroup/index.js.map +1 -1
  389. package/dist/components/Tooltip/Tooltip.module.scss.cjs +3 -3
  390. package/dist/components/Tooltip/Tooltip.module.scss.js +3 -3
  391. package/dist/components/Tooltip/index.cjs +20 -4
  392. package/dist/components/Tooltip/index.cjs.map +1 -1
  393. package/dist/components/Tooltip/index.d.ts +3 -1
  394. package/dist/components/Tooltip/index.d.ts.map +1 -1
  395. package/dist/components/Tooltip/index.js +20 -4
  396. package/dist/components/Tooltip/index.js.map +1 -1
  397. package/dist/components/VisuallyHidden/index.cjs +10 -2
  398. package/dist/components/VisuallyHidden/index.cjs.map +1 -1
  399. package/dist/components/VisuallyHidden/index.d.ts +1 -1
  400. package/dist/components/VisuallyHidden/index.d.ts.map +1 -1
  401. package/dist/components/VisuallyHidden/index.js +10 -2
  402. package/dist/components/VisuallyHidden/index.js.map +1 -1
  403. package/dist/datepicker.cjs +8 -1
  404. package/dist/datepicker.cjs.map +1 -1
  405. package/dist/datepicker.js +8 -1
  406. package/dist/datepicker.js.map +1 -1
  407. package/dist/index.cjs.map +1 -1
  408. package/dist/index.d.ts +2 -1
  409. package/dist/index.d.ts.map +1 -1
  410. package/dist/index.js.map +1 -1
  411. package/dist/markdown.cjs +5 -5
  412. package/dist/markdown.cjs.map +1 -1
  413. package/dist/markdown.js +5 -5
  414. package/dist/markdown.js.map +1 -1
  415. package/dist/table.cjs +19 -3
  416. package/dist/table.cjs.map +1 -1
  417. package/dist/table.js +19 -3
  418. package/dist/table.js.map +1 -1
  419. package/fragments.json +1 -1
  420. package/package.json +2 -2
  421. package/src/blocks/AccountSettings.block.ts +1 -1
  422. package/src/blocks/ActivityFeed.block.ts +1 -1
  423. package/src/blocks/ActivityFeedSkeleton.block.ts +1 -1
  424. package/src/blocks/BlogEditor.block.ts +1 -1
  425. package/src/blocks/ChatInterface.block.ts +1 -1
  426. package/src/blocks/ChatMessages.block.ts +1 -1
  427. package/src/blocks/CheckoutForm.block.ts +1 -1
  428. package/src/blocks/CommandPalette.block.ts +1 -1
  429. package/src/blocks/ContactForm.block.ts +1 -1
  430. package/src/blocks/DashboardLayout.block.ts +1 -1
  431. package/src/blocks/DashboardPage.block.ts +1 -1
  432. package/src/blocks/DashboardSkeleton.block.ts +1 -1
  433. package/src/blocks/DataTable.block.ts +1 -1
  434. package/src/blocks/EmptyState.block.ts +1 -1
  435. package/src/blocks/FAQSection.block.ts +1 -1
  436. package/src/blocks/FeatureGrid.block.ts +1 -1
  437. package/src/blocks/HeroSection.block.ts +1 -1
  438. package/src/blocks/LoginForm.block.ts +1 -1
  439. package/src/blocks/NavigationHeader.block.ts +1 -1
  440. package/src/blocks/PaginatedTable.block.ts +1 -1
  441. package/src/blocks/PricingComparison.block.ts +1 -1
  442. package/src/blocks/ProductCard.block.ts +1 -1
  443. package/src/blocks/RegistrationForm.block.ts +1 -1
  444. package/src/blocks/SettingsDrawer.block.ts +1 -1
  445. package/src/blocks/SettingsPanel.block.ts +1 -1
  446. package/src/blocks/ShoppingCart.block.ts +1 -1
  447. package/src/blocks/StatsCard.block.ts +1 -1
  448. package/src/blocks/StatsCardSkeleton.block.ts +1 -1
  449. package/src/blocks/TableSkeleton.block.ts +1 -1
  450. package/src/blocks/ThinkingStates.block.ts +1 -1
  451. package/src/components/Accordion/Accordion.fragment.tsx +7 -7
  452. package/src/components/Accordion/Accordion.module.scss +2 -2
  453. package/src/components/Accordion/Accordion.test.tsx +8 -5
  454. package/src/components/Accordion/index.tsx +33 -13
  455. package/src/components/Alert/Alert.fragment.tsx +5 -1
  456. package/src/components/Alert/Alert.module.scss +1 -1
  457. package/src/components/Alert/Alert.test.tsx +25 -0
  458. package/src/components/Alert/index.tsx +49 -30
  459. package/src/components/AppShell/AppShell.fragment.tsx +1 -1
  460. package/src/components/AppShell/AppShell.module.scss +5 -5
  461. package/src/components/AppShell/AppShell.test.tsx +12 -0
  462. package/src/components/AppShell/index.tsx +2 -0
  463. package/src/components/Avatar/Avatar.fragment.tsx +7 -1
  464. package/src/components/Avatar/Avatar.test.tsx +24 -2
  465. package/src/components/Avatar/index.tsx +13 -1
  466. package/src/components/Badge/Badge.fragment.tsx +16 -1
  467. package/src/components/Badge/Badge.test.tsx +8 -1
  468. package/src/components/Badge/index.tsx +7 -2
  469. package/src/components/BentoGrid/BentoGrid.fragment.tsx +3 -1
  470. package/src/components/BentoGrid/BentoGrid.module.scss +52 -16
  471. package/src/components/BentoGrid/BentoGrid.test.tsx +20 -0
  472. package/src/components/BentoGrid/index.tsx +9 -12
  473. package/src/components/Box/Box.fragment.tsx +3 -1
  474. package/src/components/Box/Box.test.tsx +14 -0
  475. package/src/components/Box/index.tsx +8 -2
  476. package/src/components/Breadcrumbs/Breadcrumbs.fragment.tsx +19 -1
  477. package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +13 -0
  478. package/src/components/Breadcrumbs/index.tsx +5 -1
  479. package/src/components/Button/Button.fragment.tsx +28 -6
  480. package/src/components/Button/Button.module.scss +3 -3
  481. package/src/components/Button/Button.test.tsx +11 -0
  482. package/src/components/Button/index.tsx +16 -6
  483. package/src/components/ButtonGroup/ButtonGroup.fragment.tsx +4 -2
  484. package/src/components/ButtonGroup/ButtonGroup.test.tsx +10 -0
  485. package/src/components/ButtonGroup/index.tsx +3 -3
  486. package/src/components/Card/Card.fragment.tsx +24 -9
  487. package/src/components/Card/Card.module.scss +8 -8
  488. package/src/components/Card/Card.test.tsx +4 -5
  489. package/src/components/Card/index.tsx +8 -38
  490. package/src/components/Chart/Chart.fragment.tsx +5 -3
  491. package/src/components/Chart/Chart.module.scss +1 -1
  492. package/src/components/Chart/index.tsx +12 -10
  493. package/src/components/Checkbox/Checkbox.fragment.tsx +27 -1
  494. package/src/components/Checkbox/Checkbox.module.scss +3 -3
  495. package/src/components/Checkbox/index.tsx +16 -3
  496. package/src/components/Chip/Chip.fragment.tsx +20 -3
  497. package/src/components/Chip/Chip.test.tsx +28 -0
  498. package/src/components/Chip/index.tsx +14 -6
  499. package/src/components/CodeBlock/CodeBlock.fragment.tsx +3 -1
  500. package/src/components/CodeBlock/CodeBlock.module.scss +9 -9
  501. package/src/components/CodeBlock/CodeBlock.test.tsx +21 -0
  502. package/src/components/CodeBlock/index.tsx +23 -9
  503. package/src/components/Collapsible/Collapsible.fragment.tsx +1 -1
  504. package/src/components/Collapsible/Collapsible.module.scss +1 -1
  505. package/src/components/ColorPicker/ColorPicker.fragment.tsx +1 -1
  506. package/src/components/Combobox/Combobox.fragment.tsx +63 -9
  507. package/src/components/Combobox/Combobox.module.scss +4 -7
  508. package/src/components/Combobox/Combobox.test.tsx +24 -3
  509. package/src/components/Combobox/index.tsx +117 -34
  510. package/src/components/Command/Command.fragment.tsx +3 -3
  511. package/src/components/Command/Command.module.scss +5 -5
  512. package/src/components/Command/Command.test.tsx +17 -0
  513. package/src/components/Command/index.tsx +8 -5
  514. package/src/components/ConversationList/ConversationList.fragment.tsx +4 -3
  515. package/src/components/ConversationList/ConversationList.module.scss +5 -5
  516. package/src/components/ConversationList/ConversationList.test.tsx +21 -0
  517. package/src/components/ConversationList/index.tsx +8 -4
  518. package/src/components/DataTable/DataTable.fragment.tsx +12 -2
  519. package/src/components/DataTable/DataTable.module.scss +3 -3
  520. package/src/components/DataTable/DataTable.test.tsx +23 -2
  521. package/src/components/DataTable/index.tsx +23 -5
  522. package/src/components/DatePicker/DatePicker.fragment.tsx +3 -1
  523. package/src/components/DatePicker/DatePicker.module.scss +1 -1
  524. package/src/components/DatePicker/DatePicker.test.tsx +17 -0
  525. package/src/components/DatePicker/index.tsx +9 -2
  526. package/src/components/Dialog/Dialog.fragment.tsx +28 -1
  527. package/src/components/Dialog/Dialog.module.scss +6 -6
  528. package/src/components/Dialog/index.tsx +25 -7
  529. package/src/components/Drawer/Drawer.fragment.tsx +4 -1
  530. package/src/components/Drawer/Drawer.module.scss +3 -3
  531. package/src/components/Drawer/Drawer.test.tsx +8 -0
  532. package/src/components/Drawer/index.tsx +15 -3
  533. package/src/components/Editor/Editor.fragment.tsx +10 -3
  534. package/src/components/Editor/Editor.module.scss +4 -4
  535. package/src/components/Editor/Editor.test.tsx +68 -1
  536. package/src/components/Editor/index.tsx +60 -9
  537. package/src/components/EmptyState/EmptyState.fragment.tsx +3 -1
  538. package/src/components/EmptyState/EmptyState.module.scss +3 -3
  539. package/src/components/EmptyState/EmptyState.test.tsx +18 -0
  540. package/src/components/EmptyState/index.tsx +16 -16
  541. package/src/components/Field/Field.fragment.tsx +1 -1
  542. package/src/components/Fieldset/Fieldset.fragment.tsx +3 -1
  543. package/src/components/Fieldset/Fieldset.test.tsx +14 -0
  544. package/src/components/Fieldset/index.tsx +3 -4
  545. package/src/components/Form/Form.fragment.tsx +12 -7
  546. package/src/components/Form/index.tsx +13 -17
  547. package/src/components/Grid/Grid.fragment.tsx +4 -3
  548. package/src/components/Grid/Grid.module.scss +3 -3
  549. package/src/components/Grid/index.tsx +11 -6
  550. package/src/components/Header/Header.fragment.tsx +31 -1
  551. package/src/components/Header/Header.module.scss +6 -6
  552. package/src/components/Header/Header.test.tsx +95 -1
  553. package/src/components/Header/index.tsx +95 -46
  554. package/src/components/Icon/Icon.fragment.tsx +21 -8
  555. package/src/components/Icon/Icon.test.tsx +27 -3
  556. package/src/components/Icon/index.tsx +39 -15
  557. package/src/components/Image/Image.fragment.tsx +15 -1
  558. package/src/components/Image/Image.test.tsx +32 -1
  559. package/src/components/Image/index.tsx +24 -4
  560. package/src/components/Input/Input.fragment.tsx +49 -1
  561. package/src/components/Input/Input.module.scss +4 -2
  562. package/src/components/Input/Input.test.tsx +3 -3
  563. package/src/components/Input/index.tsx +103 -37
  564. package/src/components/Link/Link.fragment.tsx +7 -6
  565. package/src/components/Link/Link.test.tsx +17 -1
  566. package/src/components/Link/index.tsx +22 -0
  567. package/src/components/List/List.fragment.tsx +1 -1
  568. package/src/components/Listbox/Listbox.fragment.tsx +3 -3
  569. package/src/components/Listbox/Listbox.module.scss +4 -4
  570. package/src/components/Listbox/Listbox.test.tsx +14 -0
  571. package/src/components/Listbox/index.tsx +12 -2
  572. package/src/components/Loading/Loading.fragment.tsx +1 -1
  573. package/src/components/Markdown/Markdown.fragment.tsx +5 -3
  574. package/src/components/Markdown/Markdown.module.scss +5 -5
  575. package/src/components/Markdown/Markdown.test.tsx +6 -0
  576. package/src/components/Markdown/index.tsx +12 -9
  577. package/src/components/Menu/Menu.fragment.tsx +19 -1
  578. package/src/components/Menu/Menu.module.scss +11 -11
  579. package/src/components/Menu/index.tsx +19 -7
  580. package/src/components/Message/Message.fragment.tsx +1 -1
  581. package/src/components/Message/Message.module.scss +3 -3
  582. package/src/components/NavigationMenu/NavigationMenu.fragment.tsx +9 -1
  583. package/src/components/NavigationMenu/NavigationMenu.module.scss +7 -7
  584. package/src/components/NavigationMenu/NavigationMenu.test.tsx +48 -0
  585. package/src/components/NavigationMenu/NavigationMenuContext.ts +14 -0
  586. package/src/components/NavigationMenu/index.tsx +70 -7
  587. package/src/components/Pagination/Pagination.fragment.tsx +4 -1
  588. package/src/components/Pagination/Pagination.test.tsx +39 -0
  589. package/src/components/Pagination/index.tsx +36 -10
  590. package/src/components/Popover/Popover.fragment.tsx +18 -1
  591. package/src/components/Popover/Popover.module.scss +13 -13
  592. package/src/components/Popover/index.tsx +33 -8
  593. package/src/components/Progress/Progress.fragment.tsx +3 -1
  594. package/src/components/Progress/Progress.test.tsx +8 -0
  595. package/src/components/Progress/index.tsx +9 -1
  596. package/src/components/Prompt/Prompt.fragment.tsx +4 -1
  597. package/src/components/Prompt/Prompt.module.scss +3 -3
  598. package/src/components/Prompt/Prompt.test.tsx +19 -0
  599. package/src/components/Prompt/index.tsx +24 -6
  600. package/src/components/RadioGroup/RadioGroup.fragment.tsx +31 -1
  601. package/src/components/RadioGroup/index.tsx +22 -3
  602. package/src/components/ScrollArea/ScrollArea.fragment.tsx +1 -1
  603. package/src/components/Select/Select.fragment.tsx +30 -3
  604. package/src/components/Select/Select.module.scss +3 -3
  605. package/src/components/Select/index.tsx +46 -33
  606. package/src/components/Separator/Separator.fragment.tsx +1 -1
  607. package/src/components/Sidebar/Sidebar.fragment.tsx +3 -1
  608. package/src/components/Sidebar/Sidebar.module.scss +20 -20
  609. package/src/components/Sidebar/Sidebar.test.tsx +25 -0
  610. package/src/components/Sidebar/index.tsx +7 -7
  611. package/src/components/Skeleton/Skeleton.fragment.tsx +3 -1
  612. package/src/components/Skeleton/Skeleton.test.tsx +12 -0
  613. package/src/components/Skeleton/index.tsx +6 -7
  614. package/src/components/Slider/Slider.fragment.tsx +21 -1
  615. package/src/components/Slider/Slider.module.scss +31 -0
  616. package/src/components/Slider/Slider.test.tsx +16 -0
  617. package/src/components/Slider/index.tsx +40 -1
  618. package/src/components/Stack/Stack.fragment.tsx +3 -1
  619. package/src/components/Stack/index.tsx +13 -6
  620. package/src/components/Table/Table.fragment.tsx +43 -2
  621. package/src/components/Table/Table.module.scss +2 -2
  622. package/src/components/Table/index.tsx +23 -5
  623. package/src/components/TableOfContents/TableOfContents.fragment.tsx +4 -2
  624. package/src/components/TableOfContents/TableOfContents.test.tsx +34 -9
  625. package/src/components/TableOfContents/index.tsx +9 -5
  626. package/src/components/Tabs/Tabs.fragment.tsx +33 -8
  627. package/src/components/Tabs/Tabs.module.scss +8 -8
  628. package/src/components/Tabs/index.tsx +22 -14
  629. package/src/components/Text/Text.fragment.tsx +1 -1
  630. package/src/components/Textarea/Textarea.fragment.tsx +27 -1
  631. package/src/components/Textarea/index.tsx +39 -14
  632. package/src/components/Theme/Theme.fragment.tsx +3 -1
  633. package/src/components/Theme/Theme.test.tsx +11 -0
  634. package/src/components/Theme/index.tsx +3 -3
  635. package/src/components/ThinkingIndicator/ThinkingIndicator.fragment.tsx +1 -1
  636. package/src/components/ThinkingIndicator/ThinkingIndicator.module.scss +1 -1
  637. package/src/components/Toast/Toast.fragment.tsx +6 -3
  638. package/src/components/Toast/Toast.module.scss +8 -6
  639. package/src/components/Toast/index.tsx +24 -20
  640. package/src/components/Toggle/Toggle.fragment.tsx +1 -1
  641. package/src/components/Toggle/Toggle.module.scss +61 -21
  642. package/src/components/Toggle/index.tsx +3 -3
  643. package/src/components/ToggleGroup/ToggleGroup.fragment.tsx +33 -8
  644. package/src/components/ToggleGroup/ToggleGroup.module.scss +3 -3
  645. package/src/components/ToggleGroup/index.tsx +29 -9
  646. package/src/components/Tooltip/Tooltip.fragment.tsx +16 -1
  647. package/src/components/Tooltip/Tooltip.module.scss +1 -1
  648. package/src/components/Tooltip/index.tsx +16 -1
  649. package/src/components/VisuallyHidden/VisuallyHidden.fragment.tsx +3 -1
  650. package/src/components/VisuallyHidden/VisuallyHidden.test.tsx +12 -0
  651. package/src/components/VisuallyHidden/index.tsx +7 -3
  652. package/src/index.ts +3 -2
  653. package/src/tokens/_computed.scss +1 -19
  654. package/src/tokens/_density.scss +0 -42
  655. package/src/tokens/_mixins.scss +4 -0
  656. package/src/tokens/_variables.scss +12 -114
@@ -28,6 +28,9 @@ export type SortingState = Array<{ id: string; desc: boolean }>;
28
28
  export type RowSelectionState = Record<string, boolean>;
29
29
  export type ExpandedState = true | Record<string, boolean>;
30
30
  type OnChangeFn<T> = ((updaterOrValue: T | ((prev: T) => T)) => void);
31
+ export type DataTableRowClickEvent =
32
+ | React.MouseEvent<HTMLTableRowElement>
33
+ | React.KeyboardEvent<HTMLTableRowElement>;
31
34
 
32
35
  export type DataTableColumn<T> = ColumnDef<T, unknown>;
33
36
 
@@ -81,7 +84,7 @@ export interface DataTableProps<T> extends Omit<React.HTMLAttributes<HTMLTableEl
81
84
  /** Selection change handler */
82
85
  onRowSelectionChange?: OnChangeFn<RowSelectionState>;
83
86
  /** Row click handler */
84
- onRowClick?: (row: T) => void;
87
+ onRowClick?: (row: T, event: DataTableRowClickEvent) => void;
85
88
  /** Extract sub-rows from a row for expandable tree tables */
86
89
  getSubRows?: (row: T) => T[] | undefined;
87
90
  /** Controlled expanded state */
@@ -100,6 +103,10 @@ export interface DataTableProps<T> extends Omit<React.HTMLAttributes<HTMLTableEl
100
103
  striped?: boolean;
101
104
  /** Wrap table in a bordered container */
102
105
  bordered?: boolean;
106
+ /** Additional class name for the outer wrapper div */
107
+ wrapperClassName?: string;
108
+ /** Props forwarded to the outer wrapper div */
109
+ wrapperProps?: React.HTMLAttributes<HTMLDivElement>;
103
110
  }
104
111
 
105
112
  function getColumnSizeStyle(
@@ -159,6 +166,8 @@ function DataTableRoot<T>({
159
166
  captionHidden = false,
160
167
  striped = false,
161
168
  bordered = false,
169
+ wrapperClassName,
170
+ wrapperProps,
162
171
  'aria-label': ariaLabel,
163
172
  'aria-describedby': ariaDescribedBy,
164
173
  ...htmlProps
@@ -267,10 +276,19 @@ function DataTableRoot<T>({
267
276
  ]
268
277
  .filter(Boolean)
269
278
  .join(' ');
279
+ const { className: wrapperPropsClassName, ...restWrapperProps } = wrapperProps ?? {};
280
+ const wrapperClasses = [
281
+ styles.wrapper,
282
+ bordered && styles.bordered,
283
+ wrapperClassName,
284
+ wrapperPropsClassName,
285
+ ]
286
+ .filter(Boolean)
287
+ .join(' ');
270
288
 
271
289
  if (isEmpty) {
272
290
  return (
273
- <div className={[styles.wrapper, bordered && styles.bordered].filter(Boolean).join(' ')}>
291
+ <div {...restWrapperProps} className={wrapperClasses}>
274
292
  <table
275
293
  {...htmlProps}
276
294
  className={rootClasses}
@@ -297,7 +315,7 @@ function DataTableRoot<T>({
297
315
  }
298
316
 
299
317
  return (
300
- <div className={[styles.wrapper, bordered && styles.bordered].filter(Boolean).join(' ')}>
318
+ <div {...restWrapperProps} className={wrapperClasses}>
301
319
  <table
302
320
  {...htmlProps}
303
321
  className={rootClasses}
@@ -382,7 +400,7 @@ function DataTableRoot<T>({
382
400
  const handleRowClick = (event: React.MouseEvent<HTMLTableRowElement>) => {
383
401
  if (!onRowClick) return;
384
402
  if (isInteractiveTarget(event.target, event.currentTarget)) return;
385
- onRowClick(row.original);
403
+ onRowClick(row.original, event);
386
404
  };
387
405
 
388
406
  const handleRowKeyDown = (event: React.KeyboardEvent<HTMLTableRowElement>) => {
@@ -390,7 +408,7 @@ function DataTableRoot<T>({
390
408
  if (isInteractiveTarget(event.target, event.currentTarget)) return;
391
409
  if (event.key === 'Enter' || event.key === ' ') {
392
410
  event.preventDefault();
393
- onRowClick(row.original);
411
+ onRowClick(row.original, event);
394
412
  }
395
413
  };
396
414
 
@@ -1,5 +1,5 @@
1
1
  import React, { useState } from 'react';
2
- import { defineFragment } from '@fragments-sdk/cli/core';
2
+ import { defineFragment } from '@fragments-sdk/core';
3
3
  import { DatePicker } from '.';
4
4
  import type { DateRange } from '.';
5
5
  import { subDays } from 'date-fns';
@@ -71,6 +71,7 @@ export default defineFragment({
71
71
  'Add presets for common ranges (Today, Last 7 days, Last 30 days)',
72
72
  'Use disabledDates to prevent selecting past dates or unavailable dates',
73
73
  'Provide a meaningful placeholder',
74
+ 'DatePicker.Trigger forwards button props and defaults to type="button" (safe inside forms)',
74
75
  ],
75
76
  accessibility: [
76
77
  'Full keyboard navigation within the calendar grid',
@@ -144,6 +145,7 @@ export default defineFragment({
144
145
  'numberOfMonths: number - months visible (default 1)',
145
146
  'disabled: boolean - disable picker',
146
147
  'disabledDates: Matcher - dates to disable',
148
+ 'DatePicker.Trigger: button props supported (type defaults to "button")',
147
149
  ],
148
150
  scenarioTags: [
149
151
  'form.date',
@@ -359,7 +359,7 @@
359
359
  display: flex;
360
360
  align-items: center;
361
361
  width: 100%;
362
- padding: var(--fui-padding-item-xs, $fui-padding-item-xs) var(--fui-padding-item-md, $fui-padding-item-md);
362
+ padding: var(--fui-space-1, $fui-space-1) var(--fui-space-3, $fui-space-3);
363
363
  border-radius: var(--fui-radius-sm, $fui-radius-sm);
364
364
  font-size: var(--fui-font-size-sm, $fui-font-size-sm);
365
365
  color: var(--fui-text-primary, $fui-text-primary);
@@ -53,6 +53,23 @@ describe('DatePicker', () => {
53
53
  expect(screen.getByRole('button')).toBeInTheDocument();
54
54
  });
55
55
 
56
+ it('uses button semantics and forwards button props on Trigger', () => {
57
+ render(
58
+ <form>
59
+ <DatePicker>
60
+ <DatePicker.Trigger data-testid="trigger" type="button" name="date-trigger" />
61
+ <DatePicker.Content>
62
+ <DatePicker.Calendar />
63
+ </DatePicker.Content>
64
+ </DatePicker>
65
+ </form>
66
+ );
67
+
68
+ const trigger = screen.getByTestId('trigger');
69
+ expect(trigger).toHaveAttribute('type', 'button');
70
+ expect(trigger).toHaveAttribute('name', 'date-trigger');
71
+ });
72
+
56
73
  it('shows placeholder text when no value selected', () => {
57
74
  renderDatePicker({ placeholder: 'Choose date' });
58
75
  expect(screen.getByText('Choose date')).toBeInTheDocument();
@@ -50,7 +50,7 @@ export interface DatePickerProps {
50
50
  name?: string;
51
51
  }
52
52
 
53
- export interface DatePickerTriggerProps extends React.HTMLAttributes<HTMLButtonElement> {
53
+ export interface DatePickerTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
54
54
  children?: React.ReactNode;
55
55
  placeholder?: string;
56
56
  }
@@ -430,7 +430,13 @@ function DatePickerRoot({
430
430
  );
431
431
  }
432
432
 
433
- function DatePickerTrigger({ children, placeholder, className, ...htmlProps }: DatePickerTriggerProps) {
433
+ function DatePickerTrigger({
434
+ children,
435
+ placeholder,
436
+ className,
437
+ type = 'button',
438
+ ...htmlProps
439
+ }: DatePickerTriggerProps) {
434
440
  const ctx = useDatePickerContext();
435
441
  const placeholderText = placeholder ?? ctx.placeholder;
436
442
 
@@ -446,6 +452,7 @@ function DatePickerTrigger({ children, placeholder, className, ...htmlProps }: D
446
452
  return (
447
453
  <BasePopover.Trigger
448
454
  {...htmlProps}
455
+ type={type}
449
456
  className={classes}
450
457
  disabled={ctx.disabled}
451
458
  >
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { defineFragment } from '@fragments-sdk/cli/core';
2
+ import { defineFragment } from '@fragments-sdk/core';
3
3
  import { Dialog } from '.';
4
4
  import { Button } from '../Button';
5
5
 
@@ -34,6 +34,7 @@ export default defineFragment({
34
34
  'Use descriptive title that explains the purpose',
35
35
  'Allow dismissal via backdrop click or close button for non-critical dialogs',
36
36
  'Trap focus within the dialog for accessibility',
37
+ 'Dialog.Trigger and Dialog.Close support asChild for buttons, links, and router link components',
37
38
  ],
38
39
  accessibility: [
39
40
  'Automatically traps focus within the dialog',
@@ -80,6 +81,7 @@ export default defineFragment({
80
81
  'open: boolean - controlled open state',
81
82
  'onOpenChange: (open) => void - open state handler',
82
83
  'modal: boolean - blocks page interaction (default: true)',
84
+ 'Dialog.Content initialFocus?: boolean - control auto-focus on open (default: true)',
83
85
  'Dialog.Content size: sm|md|lg|xl|full - dialog width',
84
86
  ],
85
87
  scenarioTags: [
@@ -97,6 +99,7 @@ export default defineFragment({
97
99
  requiredChildren: ['Content'],
98
100
  commonPatterns: [
99
101
  '<Dialog><Dialog.Trigger><Button>Open</Button></Dialog.Trigger><Dialog.Content><Dialog.Header><Dialog.Title>{title}</Dialog.Title></Dialog.Header><Dialog.Body>{content}</Dialog.Body><Dialog.Footer><Dialog.Close><Button variant="secondary">Cancel</Button></Dialog.Close><Button>Confirm</Button></Dialog.Footer></Dialog.Content></Dialog>',
102
+ '<Dialog><Dialog.Trigger asChild><a href="/settings">Open settings</a></Dialog.Trigger><Dialog.Content initialFocus={false}>...</Dialog.Content></Dialog>',
100
103
  ],
101
104
  },
102
105
 
@@ -184,5 +187,29 @@ export default defineFragment({
184
187
  </Dialog>
185
188
  ),
186
189
  },
190
+ {
191
+ name: 'Link Trigger + No Initial Focus',
192
+ description: 'Use asChild with a link trigger and disable automatic initial focus when needed',
193
+ render: () => (
194
+ <Dialog>
195
+ <Dialog.Trigger asChild>
196
+ <a href="#dialog-demo">Open via link</a>
197
+ </Dialog.Trigger>
198
+ <Dialog.Content size="sm" initialFocus={false}>
199
+ <Dialog.Header>
200
+ <Dialog.Title>Linked Trigger</Dialog.Title>
201
+ <Dialog.Description>
202
+ Example using asChild with an anchor element and manual focus behavior.
203
+ </Dialog.Description>
204
+ </Dialog.Header>
205
+ <Dialog.Footer>
206
+ <Dialog.Close asChild>
207
+ <Button variant="secondary">Close</Button>
208
+ </Dialog.Close>
209
+ </Dialog.Footer>
210
+ </Dialog.Content>
211
+ </Dialog>
212
+ ),
213
+ },
187
214
  ],
188
215
  });
@@ -1,5 +1,5 @@
1
- @use '../../tokens/variables' as *;
2
- @use '../../tokens/mixins' as *;
1
+ @use "../../tokens/variables" as *;
2
+ @use "../../tokens/mixins" as *;
3
3
 
4
4
  // Backdrop overlay
5
5
  .backdrop {
@@ -30,7 +30,7 @@
30
30
  display: flex;
31
31
  align-items: center;
32
32
  justify-content: center;
33
- padding: var(--fui-space-4, $fui-space-4);
33
+ padding: var(--fui-space-2, $fui-space-2);
34
34
  overflow-y: auto;
35
35
  }
36
36
 
@@ -92,7 +92,7 @@
92
92
 
93
93
  // Header area
94
94
  .header {
95
- padding: var(--fui-padding-container-sm, $fui-padding-container-sm) var(--fui-padding-container-md, $fui-padding-container-md);
95
+ padding: var(--fui-space-3, $fui-space-3) var(--fui-space-4, $fui-space-4);
96
96
  }
97
97
 
98
98
  // Title
@@ -114,7 +114,7 @@
114
114
 
115
115
  // Body content
116
116
  .body {
117
- padding: 0 var(--fui-padding-container-md, $fui-padding-container-md) var(--fui-padding-container-sm, $fui-padding-container-sm);
117
+ padding: 0 var(--fui-space-4, $fui-space-4) var(--fui-space-3, $fui-space-3);
118
118
  }
119
119
 
120
120
  // Footer for actions
@@ -123,7 +123,7 @@
123
123
  align-items: center;
124
124
  justify-content: flex-end;
125
125
  gap: var(--fui-space-1, $fui-space-1);
126
- padding: var(--fui-padding-inline-sm, $fui-padding-inline-sm) var(--fui-padding-container-md, $fui-padding-container-md);
126
+ padding: var(--fui-space-2, $fui-space-2) var(--fui-space-4, $fui-space-4);
127
127
  border-top: 1px solid var(--fui-border, $fui-border);
128
128
  background-color: var(--fui-bg-secondary, $fui-bg-secondary);
129
129
  border-radius: 0 0 var(--fui-radius-lg, $fui-radius-lg) var(--fui-radius-lg, $fui-radius-lg);
@@ -31,6 +31,9 @@ export interface DialogContentProps extends React.HTMLAttributes<HTMLDivElement>
31
31
  * @default "md"
32
32
  * @see https://usefragments.com/components/dialog#sizes */
33
33
  size?: 'sm' | 'md' | 'lg' | 'xl' | 'full';
34
+ /** Whether the dialog should autofocus content on open.
35
+ * @default true */
36
+ initialFocus?: boolean;
34
37
  }
35
38
 
36
39
  export interface DialogTitleProps extends Omit<React.HTMLAttributes<HTMLElement>, 'children'> {
@@ -53,15 +56,29 @@ export interface DialogFooterProps extends React.HTMLAttributes<HTMLDivElement>
53
56
  children: React.ReactNode;
54
57
  }
55
58
 
56
- export interface DialogTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
59
+ type DialogTriggerAsButtonProps = React.ButtonHTMLAttributes<HTMLButtonElement> & {
57
60
  children: React.ReactNode;
58
- asChild?: boolean;
59
- }
61
+ asChild?: false;
62
+ };
63
+
64
+ type DialogTriggerAsChildProps = Omit<React.HTMLAttributes<HTMLElement>, 'children'> & {
65
+ children: React.ReactElement;
66
+ asChild: true;
67
+ };
68
+
69
+ export type DialogTriggerProps = DialogTriggerAsButtonProps | DialogTriggerAsChildProps;
60
70
 
61
- export interface DialogCloseProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
71
+ type DialogCloseAsButtonProps = React.ButtonHTMLAttributes<HTMLButtonElement> & {
62
72
  children?: React.ReactNode;
63
- asChild?: boolean;
64
- }
73
+ asChild?: false;
74
+ };
75
+
76
+ type DialogCloseAsChildProps = Omit<React.HTMLAttributes<HTMLElement>, 'children'> & {
77
+ children: React.ReactElement;
78
+ asChild: true;
79
+ };
80
+
81
+ export type DialogCloseProps = DialogCloseAsButtonProps | DialogCloseAsChildProps;
65
82
 
66
83
  // ============================================
67
84
  // Close Icon
@@ -134,6 +151,7 @@ function DialogTrigger({
134
151
  function DialogContent({
135
152
  children,
136
153
  size = 'md',
154
+ initialFocus = true,
137
155
  className,
138
156
  ...htmlProps
139
157
  }: DialogContentProps) {
@@ -145,7 +163,7 @@ function DialogContent({
145
163
  <BaseDialog.Portal>
146
164
  <BaseDialog.Backdrop className={styles.backdrop} />
147
165
  <BaseDialog.Viewport className={styles.positioner}>
148
- <BaseDialog.Popup initialFocus {...htmlProps} className={popupClasses}>
166
+ <BaseDialog.Popup initialFocus={initialFocus} {...htmlProps} className={popupClasses}>
149
167
  {children}
150
168
  </BaseDialog.Popup>
151
169
  </BaseDialog.Viewport>
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { defineFragment } from '@fragments-sdk/cli/core';
2
+ import { defineFragment } from '@fragments-sdk/core';
3
3
  import { Drawer } from '.';
4
4
  import { Button } from '../Button';
5
5
  import { Stack } from '../Stack';
@@ -36,6 +36,8 @@ export default defineFragment({
36
36
  'Use bottom for mobile-style action sheets',
37
37
  'Provide clear close affordance (X button or cancel)',
38
38
  'Keep drawer content focused on a single task',
39
+ 'Drawer.Trigger and Drawer.Close with asChild require a single valid React element child',
40
+ 'Set Drawer.Content initialFocus={false} when custom focus management is needed',
39
41
  ],
40
42
  accessibility: [
41
43
  'Automatically traps focus within the drawer',
@@ -84,6 +86,7 @@ export default defineFragment({
84
86
  'modal: boolean - blocks page interaction (default: true)',
85
87
  'Drawer.Content side: left|right|top|bottom - slide direction (default: right)',
86
88
  'Drawer.Content size: sm|md|lg|xl|full - panel size',
89
+ 'Drawer.Content initialFocus: boolean - auto-focus popup on open (default: true)',
87
90
  ],
88
91
  scenarioTags: [
89
92
  'overlay.drawer',
@@ -128,7 +128,7 @@
128
128
 
129
129
  // Header area
130
130
  .header {
131
- padding: var(--fui-padding-container-sm, $fui-padding-container-sm) var(--fui-padding-container-md, $fui-padding-container-md);
131
+ padding: var(--fui-space-3, $fui-space-3) var(--fui-space-4, $fui-space-4);
132
132
  }
133
133
 
134
134
  // Title
@@ -151,7 +151,7 @@
151
151
  // Body content
152
152
  .body {
153
153
  flex: 1;
154
- padding: 0 var(--fui-padding-container-md, $fui-padding-container-md) var(--fui-padding-container-sm, $fui-padding-container-sm);
154
+ padding: 0 var(--fui-space-4, $fui-space-4) var(--fui-space-3, $fui-space-3);
155
155
  overflow-y: auto;
156
156
  }
157
157
 
@@ -161,7 +161,7 @@
161
161
  align-items: center;
162
162
  justify-content: flex-end;
163
163
  gap: var(--fui-space-1, $fui-space-1);
164
- padding: var(--fui-padding-inline-sm, $fui-padding-inline-sm) var(--fui-padding-container-md, $fui-padding-container-md);
164
+ padding: var(--fui-space-2, $fui-space-2) var(--fui-space-4, $fui-space-4);
165
165
  border-top: 1px solid var(--fui-border, $fui-border);
166
166
  background-color: var(--fui-bg-secondary, $fui-bg-secondary);
167
167
  }
@@ -118,6 +118,14 @@ describe('Drawer', () => {
118
118
  });
119
119
  });
120
120
 
121
+ it('accepts Drawer.Content initialFocus prop', async () => {
122
+ renderDrawer({ defaultOpen: true }, { initialFocus: false });
123
+
124
+ await waitFor(() => {
125
+ expect(screen.getByText('Drawer Title')).toBeInTheDocument();
126
+ });
127
+ });
128
+
121
129
  it('has no accessibility violations when open', async () => {
122
130
  const { container } = renderDrawer({ defaultOpen: true });
123
131
 
@@ -36,6 +36,8 @@ export interface DrawerContentProps extends React.HTMLAttributes<HTMLDivElement>
36
36
  size?: 'sm' | 'md' | 'lg' | 'xl' | 'full';
37
37
  /** Whether to show the backdrop overlay (default: true). Set to false for non-modal bottom panels. */
38
38
  backdrop?: boolean;
39
+ /** Whether to autofocus an element on open (default: true) */
40
+ initialFocus?: boolean;
39
41
  }
40
42
 
41
43
  export interface DrawerTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
@@ -68,6 +70,13 @@ export interface DrawerCloseProps extends React.ButtonHTMLAttributes<HTMLButtonE
68
70
  asChild?: boolean;
69
71
  }
70
72
 
73
+ function getAsChildElement(children: React.ReactNode, componentName: string): React.ReactElement {
74
+ if (!React.isValidElement(children)) {
75
+ throw new Error(`${componentName} with asChild requires a single valid React element child.`);
76
+ }
77
+ return children;
78
+ }
79
+
71
80
  // ============================================
72
81
  // Close Icon
73
82
  // ============================================
@@ -122,8 +131,9 @@ function DrawerTrigger({
122
131
  ...htmlProps
123
132
  }: DrawerTriggerProps) {
124
133
  if (asChild) {
134
+ const child = getAsChildElement(children, 'Drawer.Trigger');
125
135
  return (
126
- <BaseDialog.Trigger {...htmlProps} className={className} render={children as React.ReactElement}>
136
+ <BaseDialog.Trigger {...htmlProps} className={className} render={child}>
127
137
  {null}
128
138
  </BaseDialog.Trigger>
129
139
  );
@@ -141,6 +151,7 @@ function DrawerContent({
141
151
  side = 'right',
142
152
  size = 'md',
143
153
  backdrop = true,
154
+ initialFocus = true,
144
155
  className,
145
156
  ...htmlProps
146
157
  }: DrawerContentProps) {
@@ -156,7 +167,7 @@ function DrawerContent({
156
167
  return (
157
168
  <BaseDialog.Portal>
158
169
  {backdrop && <BaseDialog.Backdrop className={styles.backdrop} />}
159
- <BaseDialog.Popup initialFocus {...htmlProps} data-side={side} className={popupClasses}>
170
+ <BaseDialog.Popup initialFocus={initialFocus} {...htmlProps} data-side={side} className={popupClasses}>
160
171
  {children}
161
172
  </BaseDialog.Popup>
162
173
  </BaseDialog.Portal>
@@ -207,12 +218,13 @@ function DrawerClose({ children, asChild, className, ...htmlProps }: DrawerClose
207
218
  }
208
219
 
209
220
  if (asChild) {
221
+ const child = getAsChildElement(children, 'Drawer.Close');
210
222
  return (
211
223
  <BaseDialog.Close
212
224
  {...htmlProps}
213
225
  data-drawer-close
214
226
  className={className}
215
- render={children as React.ReactElement}
227
+ render={child}
216
228
  >
217
229
  {null}
218
230
  </BaseDialog.Close>
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { defineFragment } from '@fragments-sdk/cli/core';
2
+ import { defineFragment } from '@fragments-sdk/core';
3
3
  import { Editor } from '.';
4
4
  import { Button } from '../Button';
5
5
 
@@ -37,9 +37,11 @@ export default defineFragment({
37
37
  'Install @tiptap/react, @tiptap/starter-kit, and @tiptap/extension-link for rich text mode',
38
38
  'Falls back to a markdown-aware textarea when TipTap is not installed',
39
39
  'Use onAutoSave for periodic content persistence',
40
+ 'onAutoSave may return a Promise; save status updates after the async save resolves/rejects',
40
41
  'Use size prop (sm/md/lg) to control editor height',
41
42
  'Use maxLength to show character limit with visual warning states',
42
43
  'New formats (headings, blockquote, orderedList, undo, redo) are opt-in via the formats prop',
44
+ 'Use toolbarIcons to swap in icons from any icon package without changing toolbar button labels or accessibility behavior',
43
45
  ],
44
46
  accessibility: [
45
47
  'Toolbar has role="toolbar" with aria-label',
@@ -97,7 +99,7 @@ export default defineFragment({
97
99
  },
98
100
  onAutoSave: {
99
101
  type: 'function',
100
- description: 'Auto-save callback, called at autoSaveInterval',
102
+ description: 'Auto-save callback, called at autoSaveInterval (may be async)',
101
103
  },
102
104
  autoSaveInterval: {
103
105
  type: 'number',
@@ -113,6 +115,10 @@ export default defineFragment({
113
115
  type: 'number',
114
116
  description: 'Maximum character count. Shows counter in status bar with warning (90%) and error (over limit) states',
115
117
  },
118
+ toolbarIcons: {
119
+ type: 'object',
120
+ description: 'Optional toolbar icon overrides keyed by format/action (e.g. bold, italic, undo). Values can be React nodes or render functions.',
121
+ },
116
122
  },
117
123
 
118
124
  relations: [
@@ -143,9 +149,10 @@ export default defineFragment({
143
149
  'formats: EditorFormat[] - toolbar buttons (default: all 6)',
144
150
  'toolbar: boolean - show default toolbar (default: true)',
145
151
  'statusBar: boolean - show word/char counts (default: true)',
146
- 'onAutoSave: (value: string) => void - auto-save handler',
152
+ 'onAutoSave: (value: string) => void | Promise<void> - auto-save handler',
147
153
  'size: "sm" | "md" | "lg" - editor height preset (default: "md")',
148
154
  'maxLength: number - character limit with visual indicator',
155
+ 'toolbarIcons: Partial<Record<EditorFormat, ReactNode | (state) => ReactNode>> - custom toolbar icons',
149
156
  ],
150
157
  scenarioTags: [
151
158
  'form.editor',
@@ -64,7 +64,7 @@
64
64
  justify-content: space-between;
65
65
  flex-wrap: wrap;
66
66
  gap: var(--fui-space-2, $fui-space-2);
67
- padding: var(--fui-padding-item-xs, $fui-padding-item-xs) var(--fui-padding-item-sm, $fui-padding-item-sm);
67
+ padding: var(--fui-space-1, $fui-space-1) var(--fui-space-2, $fui-space-2);
68
68
  border-bottom: 1px solid var(--fui-border, $fui-border);
69
69
  background-color: var(--fui-bg-secondary, $fui-bg-secondary);
70
70
  }
@@ -161,7 +161,7 @@
161
161
  .contentRich {
162
162
  // TipTap editor styling
163
163
  :global(.tiptap) {
164
- padding: var(--fui-padding-inline-md, $fui-padding-inline-md);
164
+ padding: var(--fui-space-3, $fui-space-3);
165
165
  min-height: 200px;
166
166
  outline: none;
167
167
  @include text-base;
@@ -268,7 +268,7 @@
268
268
  width: 100%;
269
269
  height: 100%;
270
270
  min-height: 200px;
271
- padding: var(--fui-padding-inline-md, $fui-padding-inline-md);
271
+ padding: var(--fui-space-3, $fui-space-3);
272
272
  background: transparent;
273
273
  border: none;
274
274
  resize: none;
@@ -298,7 +298,7 @@
298
298
  align-items: center;
299
299
  justify-content: space-between;
300
300
  gap: var(--fui-space-2, $fui-space-2);
301
- padding: var(--fui-padding-item-xs, $fui-padding-item-xs) var(--fui-padding-item-sm, $fui-padding-item-sm);
301
+ padding: var(--fui-space-1, $fui-space-1) var(--fui-space-2, $fui-space-2);
302
302
  border-top: 1px solid var(--fui-border, $fui-border);
303
303
  background-color: var(--fui-bg-secondary, $fui-bg-secondary);
304
304
  }
@@ -1,5 +1,6 @@
1
+ import type { ReactNode } from 'react';
1
2
  import { describe, it, expect, vi } from 'vitest';
2
- import { render, screen, userEvent, expectNoA11yViolations } from '../../test/utils';
3
+ import { render, screen, userEvent, expectNoA11yViolations, act } from '../../test/utils';
3
4
  import { Editor } from './index';
4
5
  import { Button } from '../Button';
5
6
 
@@ -11,6 +12,7 @@ function renderEditor(
11
12
  defaultValue?: string;
12
13
  onValueChange?: (v: string) => void;
13
14
  formats?: ('bold' | 'italic' | 'strikethrough' | 'link' | 'code' | 'bulletList')[];
15
+ toolbarIcons?: Partial<Record<'bold' | 'italic' | 'strikethrough' | 'link' | 'code' | 'bulletList', ReactNode>>;
14
16
  } = {},
15
17
  ) {
16
18
  return render(
@@ -21,6 +23,7 @@ function renderEditor(
21
23
  readOnly={props.readOnly}
22
24
  defaultValue={props.defaultValue}
23
25
  formats={props.formats}
26
+ toolbarIcons={props.toolbarIcons}
24
27
  >
25
28
  <Editor.Toolbar>
26
29
  <Editor.ToolbarGroup aria-label="Text formatting">
@@ -71,6 +74,17 @@ describe('Editor', () => {
71
74
  expect(screen.getByRole('button', { name: /code/i })).toBeInTheDocument();
72
75
  });
73
76
 
77
+ it('renders custom toolbar icons from toolbarIcons', () => {
78
+ renderEditor({
79
+ formats: ['bold'],
80
+ toolbarIcons: {
81
+ bold: <span data-testid="custom-bold-icon" aria-hidden="true">B*</span>,
82
+ },
83
+ });
84
+ expect(screen.getByRole('button', { name: /bold/i })).toBeInTheDocument();
85
+ expect(screen.getByTestId('custom-bold-icon')).toBeInTheDocument();
86
+ });
87
+
74
88
  it('renders toolbar with proper ARIA role', () => {
75
89
  renderEditor();
76
90
  expect(screen.getByRole('toolbar')).toBeInTheDocument();
@@ -122,6 +136,28 @@ describe('Editor', () => {
122
136
  expect(boldBtn).toHaveAttribute('aria-pressed', 'false');
123
137
  });
124
138
 
139
+ it('supports state-aware toolbar icon render functions', () => {
140
+ render(
141
+ <Editor
142
+ formats={['bold']}
143
+ toolbarIcons={{
144
+ bold: ({ active, isDisabled }) => (
145
+ <span
146
+ data-testid="bold-icon-state"
147
+ data-active={String(active)}
148
+ data-disabled={String(isDisabled)}
149
+ aria-hidden="true"
150
+ />
151
+ ),
152
+ }}
153
+ />
154
+ );
155
+
156
+ const icon = screen.getByTestId('bold-icon-state');
157
+ expect(icon).toHaveAttribute('data-active', 'false');
158
+ expect(icon).toHaveAttribute('data-disabled', 'false');
159
+ });
160
+
125
161
  it('disables toolbar buttons when editor is disabled', () => {
126
162
  renderEditor({ disabled: true, formats: ['bold', 'italic'] });
127
163
  expect(screen.getByRole('button', { name: /bold/i })).toBeDisabled();
@@ -167,6 +203,37 @@ describe('Editor', () => {
167
203
  expect(screen.getByText('0 Words')).toBeInTheDocument();
168
204
  });
169
205
 
206
+ it('supports async onAutoSave callbacks and updates status after resolution', async () => {
207
+ vi.useFakeTimers();
208
+ let resolveSave: (() => void) | undefined;
209
+ const onAutoSave = vi.fn(
210
+ () =>
211
+ new Promise<void>((resolve) => {
212
+ resolveSave = resolve;
213
+ })
214
+ );
215
+
216
+ render(
217
+ <Editor defaultValue="Hello world" onAutoSave={onAutoSave} autoSaveInterval={25}>
218
+ <Editor.Content />
219
+ <Editor.StatusIndicator />
220
+ </Editor>
221
+ );
222
+
223
+ await vi.advanceTimersByTimeAsync(25);
224
+ expect(onAutoSave).toHaveBeenCalledTimes(1);
225
+ expect(String(onAutoSave.mock.calls[0][0])).toContain('Hello world');
226
+ expect(screen.getByText('SAVING...')).toBeInTheDocument();
227
+
228
+ await act(async () => {
229
+ resolveSave?.();
230
+ await Promise.resolve();
231
+ });
232
+ expect(screen.getByText('AUTO-SAVED')).toBeInTheDocument();
233
+
234
+ vi.useRealTimers();
235
+ });
236
+
170
237
  it('has no accessibility violations', async () => {
171
238
  const { container } = renderEditor();
172
239
  await expectNoA11yViolations(container);