@svelte-atoms/core 1.0.0-alpha.25 → 1.0.0-alpha.27

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 (354) hide show
  1. package/README.md +645 -645
  2. package/dist/components/accordion/accordion-root.svelte +61 -79
  3. package/dist/components/accordion/accordion-root.svelte.d.ts +2 -15
  4. package/dist/components/accordion/index.d.ts +2 -1
  5. package/dist/components/accordion/index.js +2 -1
  6. package/dist/components/accordion/item/accordion-item-body.svelte +42 -52
  7. package/dist/components/accordion/item/accordion-item-body.svelte.d.ts +2 -8
  8. package/dist/components/accordion/item/accordion-item-header.svelte +50 -56
  9. package/dist/components/accordion/item/accordion-item-header.svelte.d.ts +3 -20
  10. package/dist/components/accordion/item/accordion-item-indicator.svelte +50 -59
  11. package/dist/components/accordion/item/accordion-item-indicator.svelte.d.ts +2 -8
  12. package/dist/components/accordion/item/accordion-item-root.svelte +65 -79
  13. package/dist/components/accordion/item/accordion-item-root.svelte.d.ts +2 -12
  14. package/dist/components/accordion/item/index.d.ts +1 -0
  15. package/dist/components/accordion/item/types.d.ts +52 -0
  16. package/dist/components/accordion/item/types.js +1 -0
  17. package/dist/components/accordion/types.d.ts +21 -0
  18. package/dist/components/accordion/types.js +1 -0
  19. package/dist/components/alert/alert-actions.svelte +42 -52
  20. package/dist/components/alert/alert-actions.svelte.d.ts +3 -30
  21. package/dist/components/alert/alert-close-button.svelte +72 -79
  22. package/dist/components/alert/alert-close-button.svelte.d.ts +8 -35
  23. package/dist/components/alert/alert-content.svelte +42 -52
  24. package/dist/components/alert/alert-content.svelte.d.ts +3 -30
  25. package/dist/components/alert/alert-description.svelte +41 -51
  26. package/dist/components/alert/alert-description.svelte.d.ts +7 -10
  27. package/dist/components/alert/alert-icon.svelte +46 -56
  28. package/dist/components/alert/alert-icon.svelte.d.ts +2 -8
  29. package/dist/components/alert/alert-root.svelte +102 -118
  30. package/dist/components/alert/alert-root.svelte.d.ts +2 -13
  31. package/dist/components/alert/alert-title.svelte +41 -51
  32. package/dist/components/alert/alert-title.svelte.d.ts +2 -8
  33. package/dist/components/alert/index.d.ts +1 -0
  34. package/dist/components/alert/index.js +1 -0
  35. package/dist/components/alert/types.d.ts +85 -0
  36. package/dist/components/alert/types.js +1 -0
  37. package/dist/components/atom/html-atom.svelte +201 -217
  38. package/dist/components/atom/html-atom.svelte.d.ts +2 -22
  39. package/dist/components/atom/types.d.ts +7 -2
  40. package/dist/components/avatar/types.d.ts +7 -2
  41. package/dist/components/badge/badge.svelte +1 -1
  42. package/dist/components/badge/types.d.ts +7 -2
  43. package/dist/components/breadcrumb/breadcrumb-item.svelte +1 -1
  44. package/dist/components/breadcrumb/breadcrumb-root.svelte +1 -1
  45. package/dist/components/breadcrumb/breadcrumb-separator.svelte +1 -1
  46. package/dist/components/button/button.stories.svelte +57 -57
  47. package/dist/components/button/button.svelte +1 -1
  48. package/dist/components/button/button.svelte.d.ts +4 -1
  49. package/dist/components/button/index.d.ts +1 -0
  50. package/dist/components/button/index.js +1 -0
  51. package/dist/components/button/types.d.ts +8 -3
  52. package/dist/components/card/card-body.svelte +39 -45
  53. package/dist/components/card/card-body.svelte.d.ts +7 -4
  54. package/dist/components/card/card-description.svelte +41 -48
  55. package/dist/components/card/card-description.svelte.d.ts +7 -7
  56. package/dist/components/card/card-footer.svelte +41 -48
  57. package/dist/components/card/card-footer.svelte.d.ts +7 -4
  58. package/dist/components/card/card-header.svelte +41 -48
  59. package/dist/components/card/card-header.svelte.d.ts +7 -4
  60. package/dist/components/card/card-media.svelte +41 -48
  61. package/dist/components/card/card-media.svelte.d.ts +7 -4
  62. package/dist/components/card/card-root.svelte +91 -91
  63. package/dist/components/card/card-root.svelte.d.ts +1 -1
  64. package/dist/components/card/card-subtitle.svelte +41 -48
  65. package/dist/components/card/card-subtitle.svelte.d.ts +12 -9
  66. package/dist/components/card/card-title.svelte +45 -48
  67. package/dist/components/card/card-title.svelte.d.ts +12 -9
  68. package/dist/components/card/index.d.ts +1 -0
  69. package/dist/components/card/index.js +1 -0
  70. package/dist/components/card/types.d.ts +57 -2
  71. package/dist/components/checkbox/checkbox.svelte +39 -28
  72. package/dist/components/checkbox/types.d.ts +7 -2
  73. package/dist/components/collapsible/collapsible-body.svelte +39 -52
  74. package/dist/components/collapsible/collapsible-body.svelte.d.ts +2 -9
  75. package/dist/components/collapsible/collapsible-header.svelte +39 -52
  76. package/dist/components/collapsible/collapsible-header.svelte.d.ts +2 -9
  77. package/dist/components/collapsible/collapsible-indicator.svelte +50 -65
  78. package/dist/components/collapsible/collapsible-indicator.svelte.d.ts +3 -10
  79. package/dist/components/collapsible/collapsible-root.svelte +66 -85
  80. package/dist/components/collapsible/collapsible-root.svelte.d.ts +2 -14
  81. package/dist/components/collapsible/index.d.ts +1 -0
  82. package/dist/components/collapsible/index.js +1 -0
  83. package/dist/components/collapsible/types.d.ts +54 -0
  84. package/dist/components/collapsible/types.js +1 -0
  85. package/dist/components/combobox/atoms.d.ts +5 -1
  86. package/dist/components/combobox/atoms.js +5 -1
  87. package/dist/components/combobox/{combobox-input.svelte → combobox-control.svelte} +3 -3
  88. package/dist/components/combobox/{combobox-input.svelte.d.ts → combobox-control.svelte.d.ts} +3 -3
  89. package/dist/components/combobox/combobox-root.svelte +65 -68
  90. package/dist/components/combobox/combobox-root.svelte.d.ts +5 -18
  91. package/dist/components/combobox/combobox-trigger.svelte +1 -1
  92. package/dist/components/combobox/compobox-item.svelte +1 -1
  93. package/dist/components/combobox/index.d.ts +1 -0
  94. package/dist/components/combobox/index.js +1 -0
  95. package/dist/components/combobox/types.d.ts +25 -0
  96. package/dist/components/combobox/types.js +1 -0
  97. package/dist/components/container/container.svelte +1 -1
  98. package/dist/components/container/types.d.ts +7 -2
  99. package/dist/components/contextmenu/types.d.ts +8 -0
  100. package/dist/components/contextmenu/types.js +1 -0
  101. package/dist/components/datagrid/datagrid-body.svelte +37 -44
  102. package/dist/components/datagrid/datagrid-body.svelte.d.ts +17 -20
  103. package/dist/components/datagrid/datagrid-checkbox.svelte +101 -108
  104. package/dist/components/datagrid/datagrid-checkbox.svelte.d.ts +4 -6
  105. package/dist/components/datagrid/datagrid-footer.svelte +34 -34
  106. package/dist/components/datagrid/datagrid-footer.svelte.d.ts +1 -1
  107. package/dist/components/datagrid/datagrid-header.svelte +49 -49
  108. package/dist/components/datagrid/datagrid-header.svelte.d.ts +1 -1
  109. package/dist/components/datagrid/datagrid-root.svelte +59 -59
  110. package/dist/components/datagrid/datagrid-root.svelte.d.ts +1 -1
  111. package/dist/components/datagrid/datagrid.stories.svelte +75 -75
  112. package/dist/components/datagrid/td/datagrid-td.svelte +66 -80
  113. package/dist/components/datagrid/td/datagrid-td.svelte.d.ts +7 -16
  114. package/dist/components/datagrid/th/datagrid-th-sort-icon.svelte +1 -1
  115. package/dist/components/datagrid/th/datagrid-th.svelte +106 -127
  116. package/dist/components/datagrid/th/datagrid-th.svelte.d.ts +2 -20
  117. package/dist/components/datagrid/tr/bond.svelte.d.ts +3 -1
  118. package/dist/components/datagrid/tr/bond.svelte.js +4 -2
  119. package/dist/components/datagrid/tr/datagrid-tr.svelte +88 -103
  120. package/dist/components/datagrid/tr/datagrid-tr.svelte.d.ts +2 -18
  121. package/dist/components/datagrid/types.d.ts +85 -37
  122. package/dist/components/dialog/dialog-body.svelte +39 -45
  123. package/dist/components/dialog/dialog-body.svelte.d.ts +2 -2
  124. package/dist/components/dialog/dialog-close-button.svelte +58 -61
  125. package/dist/components/dialog/dialog-close-button.svelte.d.ts +7 -7
  126. package/dist/components/dialog/dialog-content.svelte +62 -71
  127. package/dist/components/dialog/dialog-content.svelte.d.ts +2 -2
  128. package/dist/components/dialog/dialog-description.svelte +40 -46
  129. package/dist/components/dialog/dialog-description.svelte.d.ts +2 -2
  130. package/dist/components/dialog/dialog-footer.svelte +39 -45
  131. package/dist/components/dialog/dialog-footer.svelte.d.ts +2 -2
  132. package/dist/components/dialog/dialog-header.svelte +39 -45
  133. package/dist/components/dialog/dialog-header.svelte.d.ts +2 -2
  134. package/dist/components/dialog/dialog-root.svelte +110 -120
  135. package/dist/components/dialog/dialog-root.svelte.d.ts +2 -10
  136. package/dist/components/dialog/dialog-title.svelte +41 -47
  137. package/dist/components/dialog/dialog-title.svelte.d.ts +7 -7
  138. package/dist/components/dialog/index.d.ts +1 -0
  139. package/dist/components/dialog/index.js +1 -0
  140. package/dist/components/dialog/types.d.ts +67 -0
  141. package/dist/components/dialog/types.js +1 -0
  142. package/dist/components/divider/types.d.ts +10 -0
  143. package/dist/components/divider/types.js +1 -0
  144. package/dist/components/drawer/drawer-backdrop.svelte +38 -47
  145. package/dist/components/drawer/drawer-backdrop.svelte.d.ts +3 -26
  146. package/dist/components/drawer/drawer-body.svelte +42 -56
  147. package/dist/components/drawer/drawer-body.svelte.d.ts +3 -16
  148. package/dist/components/drawer/drawer-content.svelte +42 -55
  149. package/dist/components/drawer/drawer-content.svelte.d.ts +3 -14
  150. package/dist/components/drawer/drawer-description.svelte +44 -57
  151. package/dist/components/drawer/drawer-description.svelte.d.ts +3 -14
  152. package/dist/components/drawer/drawer-footer.svelte +41 -54
  153. package/dist/components/drawer/drawer-footer.svelte.d.ts +3 -14
  154. package/dist/components/drawer/drawer-header.svelte +43 -56
  155. package/dist/components/drawer/drawer-header.svelte.d.ts +3 -14
  156. package/dist/components/drawer/drawer-root.svelte +93 -113
  157. package/dist/components/drawer/drawer-root.svelte.d.ts +3 -31
  158. package/dist/components/drawer/drawer-title.svelte +44 -57
  159. package/dist/components/drawer/drawer-title.svelte.d.ts +3 -14
  160. package/dist/components/drawer/index.d.ts +1 -0
  161. package/dist/components/drawer/index.js +1 -0
  162. package/dist/components/drawer/types.d.ts +86 -0
  163. package/dist/components/drawer/types.js +1 -0
  164. package/dist/components/dropdown/dropdown-placeholder.svelte +1 -1
  165. package/dist/components/dropdown/dropdown-query.svelte +54 -53
  166. package/dist/components/dropdown/dropdown-query.svelte.d.ts +11 -10
  167. package/dist/components/dropdown/dropdown-root.svelte +59 -59
  168. package/dist/components/dropdown/dropdown-trigger.svelte +41 -52
  169. package/dist/components/dropdown/dropdown-trigger.svelte.d.ts +1 -8
  170. package/dist/components/dropdown/dropdown-value.svelte +60 -62
  171. package/dist/components/dropdown/index.d.ts +1 -0
  172. package/dist/components/dropdown/index.js +1 -0
  173. package/dist/components/dropdown/item/bond.svelte.d.ts +4 -0
  174. package/dist/components/dropdown/item/bond.svelte.js +9 -0
  175. package/dist/components/dropdown/item/dropdown-item.svelte +10 -6
  176. package/dist/components/dropdown/types.d.ts +37 -0
  177. package/dist/components/dropdown/types.js +1 -0
  178. package/dist/components/element/html-element.svelte.d.ts +2 -14
  179. package/dist/components/element/svg-element.svelte.d.ts +2 -14
  180. package/dist/components/element/types.d.ts +14 -7
  181. package/dist/components/form/field/bond.svelte.d.ts +8 -0
  182. package/dist/components/form/field/bond.svelte.js +13 -1
  183. package/dist/components/form/field/field-control.svelte +48 -58
  184. package/dist/components/form/field/field-control.svelte.d.ts +5 -19
  185. package/dist/components/form/field/field-label.svelte +24 -31
  186. package/dist/components/form/field/field-label.svelte.d.ts +1 -2
  187. package/dist/components/form/field/field-root.svelte +59 -88
  188. package/dist/components/form/field/field-root.svelte.d.ts +5 -20
  189. package/dist/components/form/form.stories.svelte +3 -3
  190. package/dist/components/form/index.d.ts +1 -0
  191. package/dist/components/form/index.js +1 -0
  192. package/dist/components/form/types.d.ts +76 -0
  193. package/dist/components/form/types.js +1 -0
  194. package/dist/components/icon/icon.svelte +44 -55
  195. package/dist/components/icon/icon.svelte.d.ts +4 -29
  196. package/dist/components/icon/types.d.ts +11 -7
  197. package/dist/components/input/atoms.d.ts +5 -1
  198. package/dist/components/input/atoms.js +5 -1
  199. package/dist/components/input/index.d.ts +1 -0
  200. package/dist/components/input/index.js +1 -0
  201. package/dist/components/input/{input-value.svelte → input-control.svelte} +14 -24
  202. package/dist/components/input/input-control.svelte.d.ts +26 -0
  203. package/dist/components/input/input-icon.svelte +1 -1
  204. package/dist/components/input/input-icon.svelte.d.ts +1 -1
  205. package/dist/components/input/input-placeholder.svelte +54 -56
  206. package/dist/components/input/input-placeholder.svelte.d.ts +2 -19
  207. package/dist/components/input/input-root.svelte +5 -12
  208. package/dist/components/input/input-root.svelte.d.ts +3 -20
  209. package/dist/components/input/input.stories.svelte +2 -2
  210. package/dist/components/input/types.d.ts +33 -0
  211. package/dist/components/input/types.js +1 -0
  212. package/dist/components/label/index.d.ts +1 -0
  213. package/dist/components/label/index.js +1 -0
  214. package/dist/components/label/label.svelte +25 -41
  215. package/dist/components/label/label.svelte.d.ts +3 -27
  216. package/dist/components/label/types.d.ts +11 -0
  217. package/dist/components/label/types.js +1 -0
  218. package/dist/components/layer/layer-inner.svelte.d.ts +2 -19
  219. package/dist/components/layer/layer-root.svelte.d.ts +2 -19
  220. package/dist/components/layer/types.d.ts +11 -0
  221. package/dist/components/layer/types.js +1 -0
  222. package/dist/components/link/types.d.ts +8 -0
  223. package/dist/components/link/types.js +1 -0
  224. package/dist/components/list/list-group.svelte +1 -1
  225. package/dist/components/list/list-item.svelte +1 -1
  226. package/dist/components/list/list-root.svelte +6 -1
  227. package/dist/components/list/list-title.svelte +1 -1
  228. package/dist/components/list/types.d.ts +8 -0
  229. package/dist/components/list/types.js +1 -0
  230. package/dist/components/menu/index.d.ts +1 -0
  231. package/dist/components/menu/index.js +1 -0
  232. package/dist/components/menu/menu-list.svelte +1 -1
  233. package/dist/components/menu/types.d.ts +15 -0
  234. package/dist/components/menu/types.js +1 -0
  235. package/dist/components/popover/bond.svelte.d.ts +2 -0
  236. package/dist/components/popover/bond.svelte.js +1 -1
  237. package/dist/components/popover/index.d.ts +1 -0
  238. package/dist/components/popover/index.js +1 -0
  239. package/dist/components/popover/popover-arrow.svelte +111 -117
  240. package/dist/components/popover/popover-arrow.svelte.d.ts +3 -20
  241. package/dist/components/popover/popover-content.svelte +139 -147
  242. package/dist/components/popover/popover-content.svelte.d.ts +3 -17
  243. package/dist/components/popover/popover-indicator.svelte +1 -1
  244. package/dist/components/popover/popover-root.svelte +4 -18
  245. package/dist/components/popover/popover-root.svelte.d.ts +1 -15
  246. package/dist/components/popover/popover-trigger.svelte +3 -12
  247. package/dist/components/popover/popover-trigger.svelte.d.ts +2 -8
  248. package/dist/components/popover/types.d.ts +61 -0
  249. package/dist/components/popover/types.js +1 -0
  250. package/dist/components/portal/active-portal.svelte +8 -2
  251. package/dist/components/portal/active-portal.svelte.d.ts +2 -2
  252. package/dist/components/portal/index.d.ts +1 -0
  253. package/dist/components/portal/index.js +1 -0
  254. package/dist/components/portal/portal-inner.svelte +1 -1
  255. package/dist/components/portal/portal-inner.svelte.d.ts +2 -19
  256. package/dist/components/portal/portal-root.svelte +83 -88
  257. package/dist/components/portal/portal-root.svelte.d.ts +2 -22
  258. package/dist/components/portal/teleport.svelte +50 -49
  259. package/dist/components/portal/teleport.svelte.d.ts +5 -23
  260. package/dist/components/portal/types.d.ts +39 -0
  261. package/dist/components/portal/types.js +1 -0
  262. package/dist/components/radio/radio-group.stories.svelte +4 -4
  263. package/dist/components/radio/radio.svelte +109 -109
  264. package/dist/components/radio/radio.svelte.d.ts +14 -36
  265. package/dist/components/root/root.css +24 -66
  266. package/dist/components/root/root.svelte +121 -121
  267. package/dist/components/root/types.d.ts +8 -0
  268. package/dist/components/root/types.js +1 -0
  269. package/dist/components/scrollable/index.d.ts +1 -0
  270. package/dist/components/scrollable/index.js +1 -0
  271. package/dist/components/scrollable/scrollable-container.svelte +82 -89
  272. package/dist/components/scrollable/scrollable-container.svelte.d.ts +2 -6
  273. package/dist/components/scrollable/scrollable-content.svelte +41 -51
  274. package/dist/components/scrollable/scrollable-content.svelte.d.ts +1 -6
  275. package/dist/components/scrollable/scrollable-root.svelte +100 -120
  276. package/dist/components/scrollable/scrollable-root.svelte.d.ts +3 -19
  277. package/dist/components/scrollable/scrollable-thumb.svelte +75 -86
  278. package/dist/components/scrollable/scrollable-thumb.svelte.d.ts +1 -7
  279. package/dist/components/scrollable/scrollable-track.svelte +59 -70
  280. package/dist/components/scrollable/scrollable-track.svelte.d.ts +1 -7
  281. package/dist/components/scrollable/types.d.ts +62 -0
  282. package/dist/components/scrollable/types.js +1 -0
  283. package/dist/components/sidebar/index.d.ts +1 -0
  284. package/dist/components/sidebar/index.js +1 -0
  285. package/dist/components/sidebar/sidebar-content.svelte +2 -16
  286. package/dist/components/sidebar/sidebar-content.svelte.d.ts +2 -9
  287. package/dist/components/sidebar/sidebar-root.svelte +4 -23
  288. package/dist/components/sidebar/sidebar-root.svelte.d.ts +2 -13
  289. package/dist/components/sidebar/types.d.ts +30 -0
  290. package/dist/components/sidebar/types.js +1 -0
  291. package/dist/components/stack/stack-item.svelte +5 -1
  292. package/dist/components/stack/stack-root.svelte +5 -1
  293. package/dist/components/stack/stack-root.svelte.d.ts +2 -19
  294. package/dist/components/stack/types.d.ts +12 -0
  295. package/dist/components/stack/types.js +1 -0
  296. package/dist/components/tabs/index.d.ts +1 -0
  297. package/dist/components/tabs/index.js +1 -0
  298. package/dist/components/tabs/tab/tab-body.svelte +52 -61
  299. package/dist/components/tabs/tab/tab-body.svelte.d.ts +2 -8
  300. package/dist/components/tabs/tab/tab-description.svelte +41 -50
  301. package/dist/components/tabs/tab/tab-description.svelte.d.ts +2 -8
  302. package/dist/components/tabs/tab/tab-header.svelte +71 -81
  303. package/dist/components/tabs/tab/tab-header.svelte.d.ts +2 -11
  304. package/dist/components/tabs/tab/tab-root.svelte +86 -81
  305. package/dist/components/tabs/tabs-body.svelte +1 -1
  306. package/dist/components/tabs/tabs-header.svelte +1 -1
  307. package/dist/components/tabs/tabs-root.svelte +1 -1
  308. package/dist/components/tabs/types.d.ts +55 -0
  309. package/dist/components/tabs/types.js +1 -0
  310. package/dist/components/textarea/index.d.ts +1 -0
  311. package/dist/components/textarea/index.js +1 -0
  312. package/dist/components/textarea/textarea-input.svelte +2 -1
  313. package/dist/components/textarea/types.d.ts +28 -0
  314. package/dist/components/textarea/types.js +1 -0
  315. package/dist/components/toast/index.d.ts +1 -0
  316. package/dist/components/toast/index.js +1 -0
  317. package/dist/components/toast/toast-description.svelte +38 -44
  318. package/dist/components/toast/toast-description.svelte.d.ts +8 -34
  319. package/dist/components/toast/toast-root.svelte +61 -74
  320. package/dist/components/toast/toast-root.svelte.d.ts +4 -43
  321. package/dist/components/toast/toast-title.svelte +35 -43
  322. package/dist/components/toast/toast-title.svelte.d.ts +2 -34
  323. package/dist/components/toast/types.d.ts +40 -0
  324. package/dist/components/toast/types.js +1 -0
  325. package/dist/components/tooltip/types.d.ts +13 -0
  326. package/dist/components/tooltip/types.js +1 -0
  327. package/dist/components/tree/index.d.ts +1 -0
  328. package/dist/components/tree/index.js +1 -0
  329. package/dist/components/tree/tree-body.svelte +39 -50
  330. package/dist/components/tree/tree-body.svelte.d.ts +2 -10
  331. package/dist/components/tree/tree-header.svelte +54 -66
  332. package/dist/components/tree/tree-header.svelte.d.ts +3 -29
  333. package/dist/components/tree/tree-indicator.svelte +40 -50
  334. package/dist/components/tree/tree-indicator.svelte.d.ts +3 -9
  335. package/dist/components/tree/tree-root.svelte +65 -80
  336. package/dist/components/tree/tree-root.svelte.d.ts +2 -12
  337. package/dist/components/tree/types.d.ts +59 -0
  338. package/dist/components/tree/types.js +1 -0
  339. package/dist/components/virtual/types.d.ts +23 -0
  340. package/dist/components/virtual/types.js +1 -0
  341. package/dist/components/virtual/virtual-root.svelte +239 -258
  342. package/dist/components/virtual/virtual-root.svelte.d.ts +1 -18
  343. package/dist/context/preset.svelte.d.ts +1 -1
  344. package/llm/composition.md +395 -395
  345. package/llm/crafting.md +838 -838
  346. package/llm/motion.md +970 -970
  347. package/llm/philosophy.md +23 -23
  348. package/llm/preset-variant-integration.md +516 -516
  349. package/llm/preset.md +383 -383
  350. package/llm/styling.md +216 -216
  351. package/llm/usage.md +46 -46
  352. package/llm/variants.md +712 -712
  353. package/package.json +437 -437
  354. package/dist/components/input/input-value.svelte.d.ts +0 -19
@@ -1,395 +1,395 @@
1
- # Component Composition in @svelte-atoms/core
2
-
3
- ## Overview
4
-
5
- @svelte-atoms/core components are designed to be **composable** — you can combine them to extend both behavior and UI, creating powerful component combinations. This is achieved through three main patterns:
6
-
7
- 1. **Base Prop Composition** - Replace a component's root element with another component
8
- 2. **Bond Pattern** - Access and share component state across nested components
9
- 3. **Nested Children** - Compose components as siblings/parents for complex UIs
10
-
11
- ## 1. Base Prop Composition
12
-
13
- The `base=` prop allows you to replace a component's root element with another component, **inheriting all the base component's behavior** while adding new functionality.
14
-
15
- ### Basic Pattern
16
-
17
- ```svelte
18
- <Tooltip.Trigger base={Button}>Open Tooltip</Tooltip.Trigger>
19
- ```
20
-
21
- The `Tooltip.Trigger` now **behaves as both** a Tooltip trigger AND a Button:
22
-
23
- - Gets Button's styling, hover states, click handling
24
- - Gets Tooltip.Trigger's `aria-*` attributes, open/close logic, positioning
25
-
26
- ### Form Field Composition
27
-
28
- The most powerful example is `Field.Control`, which adapts to any input component:
29
-
30
- ```svelte
31
- <!-- Text Input -->
32
- <Field.Control base={Input.Value} placeholder="Enter name" />
33
-
34
- <!-- Checkbox -->
35
- <Field.Control base={Checkbox} />
36
-
37
- <!-- Radio Group -->
38
- <Field.Control base={RadioGroup}>
39
- <Radio value="yes" />
40
- <Radio value="no" />
41
- </Field.Control>
42
- ```
43
-
44
- `Field.Control` automatically:
45
-
46
- - Connects the base component to form validation
47
- - Syncs the input value with field state
48
- - Handles validation on blur/change
49
- - Links labels via `aria-labelledby`
50
-
51
- ### DataGrid Cell Composition
52
-
53
- Compose table cells with interactive components:
54
-
55
- ```svelte
56
- <DataGrid.Td base={Dropdown.Root} placement="bottom-end">
57
- <Dropdown.Trigger>
58
- <Icon src={MoreVerticalIcon} />
59
- </Dropdown.Trigger>
60
- <Dropdown.List>
61
- <Dropdown.Item value="edit">Edit</Dropdown.Item>
62
- <Dropdown.Item value="delete">Delete</Dropdown.Item>
63
- </Dropdown.List>
64
- </DataGrid.Td>
65
- ```
66
-
67
- The `DataGrid.Td` now:
68
-
69
- - Maintains table cell semantics and styling
70
- - Adds Dropdown positioning, open/close state
71
- - Handles keyboard navigation and focus management
72
-
73
- ### Menu & Dropdown Triggers
74
-
75
- ```svelte
76
- <Menu.Root>
77
- <Menu.Trigger base={Button}>Select Language</Menu.Trigger>
78
- <Menu.List>
79
- <Menu.Item>English</Menu.Item>
80
- <Menu.Item>Spanish</Menu.Item>
81
- </Menu.List>
82
- </Menu.Root>
83
- ```
84
-
85
- `Menu.Trigger` with `base={Button}`:
86
-
87
- - Button appearance and interaction
88
- - Menu trigger accessibility (`aria-haspopup`, `aria-expanded`)
89
- - Menu open/close toggle on click
90
-
91
- ### How Base Prop Works
92
-
93
- When you write:
94
-
95
- ```svelte
96
- <Component base={BaseComponent} {...props}>
97
- {children}
98
- </Component>
99
- ```
100
-
101
- Internally, the component renders:
102
-
103
- ```svelte
104
- <BaseComponent {...props} {...componentSpecificProps}>
105
- {children}
106
- </BaseComponent>
107
- ```
108
-
109
- All props are forwarded, and the component adds its own behavior (event handlers, ARIA attributes, state bindings) to the base component.
110
-
111
- ## 2. Bond Pattern (State Sharing)
112
-
113
- Components expose their internal state via a **bond** object through the `{#snippet children({ bond })}` pattern. This allows parent components to access and control child component state.
114
-
115
- ### Accessing Component State
116
-
117
- ```svelte
118
- <Popover.Root>
119
- {#snippet children({ popover })}
120
- <Popover.Trigger base={Button}>
121
- <div>Open Popover</div>
122
- <!-- Access popover state to show indicator -->
123
- <Popover.Indicator />
124
- </Popover.Trigger>
125
-
126
- <Popover.Content>
127
- <!-- Can access popover.state.isOpen, popover.state.close(), etc. -->
128
- </Popover.Content>
129
- {/snippet}
130
- </Popover.Root>
131
- ```
132
-
133
- The `popover` bond provides:
134
-
135
- - `popover.state.isOpen` - Current open state
136
- - `popover.state.close()` - Close the popover programmatically
137
- - `popover.state.toggle()` - Toggle open/close state
138
-
139
- ### Field Validation Access
140
-
141
- ```svelte
142
- <Field.Root name="firstName" schema={nameSchema}>
143
- {#snippet children({ field })}
144
- <Field.Label>First Name</Field.Label>
145
-
146
- <Input.Root>
147
- <Field.Control
148
- base={Input.Value}
149
- onblur={() => {
150
- const results = field?.state.validate();
151
- console.log(results);
152
- }}
153
- />
154
- </Input.Root>
155
-
156
- <!-- Access validation errors -->
157
- {#if field?.state?.errors?.length > 0}
158
- <div class="text-xs text-red-600">
159
- {#each field.state.errors as error}
160
- <div>{error.message}</div>
161
- {/each}
162
- </div>
163
- {/if}
164
- {/snippet}
165
- </Field.Root>
166
- ```
167
-
168
- The `field` bond provides:
169
-
170
- - `field.state.validate()` - Trigger validation manually
171
- - `field.state.errors` - Array of validation errors
172
- - `field.state.value` - Current field value
173
-
174
- ### Collapsible State Control
175
-
176
- ```svelte
177
- <Collapsible.Root>
178
- {#snippet children({ collapsible })}
179
- <Collapsible.Trigger base={Button}>Toggle Content</Collapsible.Trigger>
180
-
181
- <Collapsible.Content>
182
- <div>Collapsible content here</div>
183
-
184
- <!-- Nested button that can control parent collapsible -->
185
- <Button onclick={() => collapsible.state.close()}>Close from inside</Button>
186
- </Collapsible.Content>
187
- {/snippet}
188
- </Collapsible.Root>
189
- ```
190
-
191
- ### Dropdown State Inspection
192
-
193
- ```svelte
194
- <Dropdown.Root>
195
- {#snippet children({ dropdown })}
196
- <Dropdown.Trigger base={Button}>Select Option</Dropdown.Trigger>
197
-
198
- <Dropdown.List>
199
- <Dropdown.Item value="option1">Option 1</Dropdown.Item>
200
- <Dropdown.Item value="option2">Option 2</Dropdown.Item>
201
- </Dropdown.List>
202
-
203
- <!-- Display selected value outside dropdown -->
204
- <div>Selected: {dropdown.state.value || 'None'}</div>
205
- {/snippet}
206
- </Dropdown.Root>
207
- ```
208
-
209
- ### How Bond Pattern Works
210
-
211
- Components create a **Bond** instance that holds state and methods:
212
-
213
- ```typescript
214
- // Inside component implementation
215
- const bond = new PopoverBond();
216
- bond.state.isOpen = $state(false);
217
- bond.state.close = () => {
218
- bond.state.isOpen = false;
219
- };
220
- ```
221
-
222
- The bond is passed to children via snippet props, allowing descendants to access and modify component state.
223
-
224
- ## 3. Nested Component Composition
225
-
226
- Components can be nested as siblings or parent-child to create complex interactions.
227
-
228
- ### Dialog with Nested Dropdown
229
-
230
- ```svelte
231
- <Dialog.Root>
232
- {#snippet children({ dialog })}
233
- <Dialog.Trigger base={Button}>Open Dialog</Dialog.Trigger>
234
-
235
- <Dialog.Content>
236
- <Dialog.Header>
237
- <Dialog.Title>Select an option</Dialog.Title>
238
- </Dialog.Header>
239
-
240
- <!-- Dropdown inside Dialog -->
241
- <Dropdown.Root>
242
- {#snippet children({ dropdown })}
243
- <Dropdown.Trigger base={Button}>Choose Language</Dropdown.Trigger>
244
- <Dropdown.List>
245
- <Dropdown.Item value="en">English</Dropdown.Item>
246
- <Dropdown.Item value="es">Spanish</Dropdown.Item>
247
- </Dropdown.List>
248
- {/snippet}
249
- </Dropdown.Root>
250
-
251
- <Dialog.Footer>
252
- <Button onclick={() => dialog.state.close()}>Close</Button>
253
- </Dialog.Footer>
254
- </Dialog.Content>
255
- {/snippet}
256
- </Dialog.Root>
257
- ```
258
-
259
- Each component manages its own state independently, but both bonds are accessible for coordination.
260
-
261
- ### Scrollable with Nested Content
262
-
263
- ```svelte
264
- <Scrollable.Root>
265
- {#snippet children({ scrollable })}
266
- <Scrollable.Content>
267
- <!-- Access scroll position -->
268
- <div>Scroll Y: {scrollable.state.scrollTop}</div>
269
-
270
- <!-- Nested interactive components -->
271
- <Accordion.Root>
272
- <Accordion.Item value="item1">
273
- <Accordion.Trigger>Section 1</Accordion.Trigger>
274
- <Accordion.Content>Content 1</Accordion.Content>
275
- </Accordion.Item>
276
- </Accordion.Root>
277
- </Scrollable.Content>
278
- {/snippet}
279
- </Scrollable.Root>
280
- ```
281
-
282
- ### Combobox with Custom Trigger
283
-
284
- ```svelte
285
- <Combobox.Root>
286
- {#snippet children({ combobox })}
287
- <Combobox.Trigger base={Input.Root}>
288
- <Input.Value placeholder="Search..." />
289
- <Input.Icon src={SearchIcon} />
290
- </Combobox.Trigger>
291
-
292
- <Combobox.List>
293
- <Combobox.Item value="option1">Option 1</Combobox.Item>
294
- <Combobox.Item value="option2">Option 2</Combobox.Item>
295
- </Combobox.List>
296
- {/snippet}
297
- </Combobox.Root>
298
- ```
299
-
300
- The `Input.Root` is composed into the trigger, bringing input styling and icon support to the combobox.
301
-
302
- ## Key Principles
303
-
304
- 1. **Base Prop = Behavior Inheritance**: Use `base=` to layer component behaviors (Button + Menu.Trigger = clickable menu opener)
305
-
306
- 2. **Bond = State Access**: Use `{#snippet children({ bond })}` to access component state and methods for coordination
307
-
308
- 3. **Nesting = UI Composition**: Nest components as needed; each maintains independent state while bonds allow communication
309
-
310
- 4. **Forward Everything**: Components forward all props and classes to their base, enabling full customization
311
-
312
- 5. **Type Safety**: TypeScript infers correct props when using `base=`, providing autocompletion for both the component and the base
313
-
314
- ## Common Patterns
315
-
316
- ### Interactive Table Cell
317
-
318
- ```svelte
319
- <DataGrid.Td base={Dropdown.Root}>
320
- <Dropdown.Trigger base={Button} variant="ghost" size="sm">Actions</Dropdown.Trigger>
321
- <Dropdown.List>
322
- <Dropdown.Item>Edit</Dropdown.Item>
323
- <Dropdown.Item>Delete</Dropdown.Item>
324
- </Dropdown.List>
325
- </DataGrid.Td>
326
- ```
327
-
328
- **Combines**: Table cell + Dropdown + Button
329
-
330
- ### Validated Form Field
331
-
332
- ```svelte
333
- <Field.Root name="email" schema={emailSchema}>
334
- {#snippet children({ field })}
335
- <Field.Label>Email</Field.Label>
336
- <Field.Control
337
- base={Input.Value}
338
- type="email"
339
- placeholder="you@example.com"
340
- onblur={() => field?.state.validate()}
341
- />
342
- {#if field?.state?.errors}
343
- <Field.Error />
344
- {/if}
345
- {/snippet}
346
- </Field.Root>
347
- ```
348
-
349
- **Combines**: Form validation + Input + Label + Error display
350
-
351
- ### Tooltip Button
352
-
353
- ```svelte
354
- <Tooltip.Root>
355
- <Tooltip.Trigger base={Button} variant="outline">Delete</Tooltip.Trigger>
356
- <Tooltip.Content>This action cannot be undone</Tooltip.Content>
357
- </Tooltip.Root>
358
- ```
359
-
360
- **Combines**: Tooltip positioning + Button interaction
361
-
362
- ### Controlled Popover with Custom Content
363
-
364
- ```svelte
365
- <Popover.Root bind:open>
366
- {#snippet children({ popover })}
367
- <Popover.Trigger base={Button}>
368
- Open {popover.state.isOpen ? '(Open)' : '(Closed)'}
369
- </Popover.Trigger>
370
-
371
- <Popover.Content class="w-80">
372
- <Card>
373
- <Card.Header>
374
- <Card.Title>Settings</Card.Title>
375
- </Card.Header>
376
- <Card.Content>
377
- <!-- Form fields here -->
378
- </Card.Content>
379
- <Card.Footer>
380
- <Button onclick={() => popover.state.close()}>Close</Button>
381
- </Card.Footer>
382
- </Card>
383
- </Popover.Content>
384
- {/snippet}
385
- </Popover.Root>
386
- ```
387
-
388
- **Combines**: Popover positioning + Button trigger + Card layout + Form
389
-
390
- ## Summary
391
-
392
- - **`base=` prop**: Inherit behavior from another component (Trigger + Button = clickable trigger)
393
- - **`{#snippet children({ bond })}`**: Access component state for coordination
394
- - **Nesting**: Compose complex UIs by nesting components as needed
395
- - **Composition > Configuration**: Combine simple components instead of creating complex ones with many props
1
+ # Component Composition in @svelte-atoms/core
2
+
3
+ ## Overview
4
+
5
+ @svelte-atoms/core components are designed to be **composable** — you can combine them to extend both behavior and UI, creating powerful component combinations. This is achieved through three main patterns:
6
+
7
+ 1. **Base Prop Composition** - Replace a component's root element with another component
8
+ 2. **Bond Pattern** - Access and share component state across nested components
9
+ 3. **Nested Children** - Compose components as siblings/parents for complex UIs
10
+
11
+ ## 1. Base Prop Composition
12
+
13
+ The `base=` prop allows you to replace a component's root element with another component, **inheriting all the base component's behavior** while adding new functionality.
14
+
15
+ ### Basic Pattern
16
+
17
+ ```svelte
18
+ <Tooltip.Trigger base={Button}>Open Tooltip</Tooltip.Trigger>
19
+ ```
20
+
21
+ The `Tooltip.Trigger` now **behaves as both** a Tooltip trigger AND a Button:
22
+
23
+ - Gets Button's styling, hover states, click handling
24
+ - Gets Tooltip.Trigger's `aria-*` attributes, open/close logic, positioning
25
+
26
+ ### Form Field Composition
27
+
28
+ The most powerful example is `Field.Control`, which adapts to any input component:
29
+
30
+ ```svelte
31
+ <!-- Text Input -->
32
+ <Field.Control base={Input.Value} placeholder="Enter name" />
33
+
34
+ <!-- Checkbox -->
35
+ <Field.Control base={Checkbox} />
36
+
37
+ <!-- Radio Group -->
38
+ <Field.Control base={RadioGroup}>
39
+ <Radio value="yes" />
40
+ <Radio value="no" />
41
+ </Field.Control>
42
+ ```
43
+
44
+ `Field.Control` automatically:
45
+
46
+ - Connects the base component to form validation
47
+ - Syncs the input value with field state
48
+ - Handles validation on blur/change
49
+ - Links labels via `aria-labelledby`
50
+
51
+ ### DataGrid Cell Composition
52
+
53
+ Compose table cells with interactive components:
54
+
55
+ ```svelte
56
+ <DataGrid.Td base={Dropdown.Root} placement="bottom-end">
57
+ <Dropdown.Trigger>
58
+ <Icon src={MoreVerticalIcon} />
59
+ </Dropdown.Trigger>
60
+ <Dropdown.List>
61
+ <Dropdown.Item value="edit">Edit</Dropdown.Item>
62
+ <Dropdown.Item value="delete">Delete</Dropdown.Item>
63
+ </Dropdown.List>
64
+ </DataGrid.Td>
65
+ ```
66
+
67
+ The `DataGrid.Td` now:
68
+
69
+ - Maintains table cell semantics and styling
70
+ - Adds Dropdown positioning, open/close state
71
+ - Handles keyboard navigation and focus management
72
+
73
+ ### Menu & Dropdown Triggers
74
+
75
+ ```svelte
76
+ <Menu.Root>
77
+ <Menu.Trigger base={Button}>Select Language</Menu.Trigger>
78
+ <Menu.List>
79
+ <Menu.Item>English</Menu.Item>
80
+ <Menu.Item>Spanish</Menu.Item>
81
+ </Menu.List>
82
+ </Menu.Root>
83
+ ```
84
+
85
+ `Menu.Trigger` with `base={Button}`:
86
+
87
+ - Button appearance and interaction
88
+ - Menu trigger accessibility (`aria-haspopup`, `aria-expanded`)
89
+ - Menu open/close toggle on click
90
+
91
+ ### How Base Prop Works
92
+
93
+ When you write:
94
+
95
+ ```svelte
96
+ <Component base={BaseComponent} {...props}>
97
+ {children}
98
+ </Component>
99
+ ```
100
+
101
+ Internally, the component renders:
102
+
103
+ ```svelte
104
+ <BaseComponent {...props} {...componentSpecificProps}>
105
+ {children}
106
+ </BaseComponent>
107
+ ```
108
+
109
+ All props are forwarded, and the component adds its own behavior (event handlers, ARIA attributes, state bindings) to the base component.
110
+
111
+ ## 2. Bond Pattern (State Sharing)
112
+
113
+ Components expose their internal state via a **bond** object through the `{#snippet children({ bond })}` pattern. This allows parent components to access and control child component state.
114
+
115
+ ### Accessing Component State
116
+
117
+ ```svelte
118
+ <Popover.Root>
119
+ {#snippet children({ popover })}
120
+ <Popover.Trigger base={Button}>
121
+ <div>Open Popover</div>
122
+ <!-- Access popover state to show indicator -->
123
+ <Popover.Indicator />
124
+ </Popover.Trigger>
125
+
126
+ <Popover.Content>
127
+ <!-- Can access popover.state.isOpen, popover.state.close(), etc. -->
128
+ </Popover.Content>
129
+ {/snippet}
130
+ </Popover.Root>
131
+ ```
132
+
133
+ The `popover` bond provides:
134
+
135
+ - `popover.state.isOpen` - Current open state
136
+ - `popover.state.close()` - Close the popover programmatically
137
+ - `popover.state.toggle()` - Toggle open/close state
138
+
139
+ ### Field Validation Access
140
+
141
+ ```svelte
142
+ <Field.Root name="firstName" schema={nameSchema}>
143
+ {#snippet children({ field })}
144
+ <Field.Label>First Name</Field.Label>
145
+
146
+ <Input.Root>
147
+ <Field.Control
148
+ base={Input.Value}
149
+ onblur={() => {
150
+ const results = field?.state.validate();
151
+ console.log(results);
152
+ }}
153
+ />
154
+ </Input.Root>
155
+
156
+ <!-- Access validation errors -->
157
+ {#if field?.state?.errors?.length > 0}
158
+ <div class="text-xs text-red-600">
159
+ {#each field.state.errors as error}
160
+ <div>{error.message}</div>
161
+ {/each}
162
+ </div>
163
+ {/if}
164
+ {/snippet}
165
+ </Field.Root>
166
+ ```
167
+
168
+ The `field` bond provides:
169
+
170
+ - `field.state.validate()` - Trigger validation manually
171
+ - `field.state.errors` - Array of validation errors
172
+ - `field.state.value` - Current field value
173
+
174
+ ### Collapsible State Control
175
+
176
+ ```svelte
177
+ <Collapsible.Root>
178
+ {#snippet children({ collapsible })}
179
+ <Collapsible.Trigger base={Button}>Toggle Content</Collapsible.Trigger>
180
+
181
+ <Collapsible.Content>
182
+ <div>Collapsible content here</div>
183
+
184
+ <!-- Nested button that can control parent collapsible -->
185
+ <Button onclick={() => collapsible.state.close()}>Close from inside</Button>
186
+ </Collapsible.Content>
187
+ {/snippet}
188
+ </Collapsible.Root>
189
+ ```
190
+
191
+ ### Dropdown State Inspection
192
+
193
+ ```svelte
194
+ <Dropdown.Root>
195
+ {#snippet children({ dropdown })}
196
+ <Dropdown.Trigger base={Button}>Select Option</Dropdown.Trigger>
197
+
198
+ <Dropdown.List>
199
+ <Dropdown.Item value="option1">Option 1</Dropdown.Item>
200
+ <Dropdown.Item value="option2">Option 2</Dropdown.Item>
201
+ </Dropdown.List>
202
+
203
+ <!-- Display selected value outside dropdown -->
204
+ <div>Selected: {dropdown.state.value || 'None'}</div>
205
+ {/snippet}
206
+ </Dropdown.Root>
207
+ ```
208
+
209
+ ### How Bond Pattern Works
210
+
211
+ Components create a **Bond** instance that holds state and methods:
212
+
213
+ ```typescript
214
+ // Inside component implementation
215
+ const bond = new PopoverBond();
216
+ bond.state.isOpen = $state(false);
217
+ bond.state.close = () => {
218
+ bond.state.isOpen = false;
219
+ };
220
+ ```
221
+
222
+ The bond is passed to children via snippet props, allowing descendants to access and modify component state.
223
+
224
+ ## 3. Nested Component Composition
225
+
226
+ Components can be nested as siblings or parent-child to create complex interactions.
227
+
228
+ ### Dialog with Nested Dropdown
229
+
230
+ ```svelte
231
+ <Dialog.Root>
232
+ {#snippet children({ dialog })}
233
+ <Dialog.Trigger base={Button}>Open Dialog</Dialog.Trigger>
234
+
235
+ <Dialog.Content>
236
+ <Dialog.Header>
237
+ <Dialog.Title>Select an option</Dialog.Title>
238
+ </Dialog.Header>
239
+
240
+ <!-- Dropdown inside Dialog -->
241
+ <Dropdown.Root>
242
+ {#snippet children({ dropdown })}
243
+ <Dropdown.Trigger base={Button}>Choose Language</Dropdown.Trigger>
244
+ <Dropdown.List>
245
+ <Dropdown.Item value="en">English</Dropdown.Item>
246
+ <Dropdown.Item value="es">Spanish</Dropdown.Item>
247
+ </Dropdown.List>
248
+ {/snippet}
249
+ </Dropdown.Root>
250
+
251
+ <Dialog.Footer>
252
+ <Button onclick={() => dialog.state.close()}>Close</Button>
253
+ </Dialog.Footer>
254
+ </Dialog.Content>
255
+ {/snippet}
256
+ </Dialog.Root>
257
+ ```
258
+
259
+ Each component manages its own state independently, but both bonds are accessible for coordination.
260
+
261
+ ### Scrollable with Nested Content
262
+
263
+ ```svelte
264
+ <Scrollable.Root>
265
+ {#snippet children({ scrollable })}
266
+ <Scrollable.Content>
267
+ <!-- Access scroll position -->
268
+ <div>Scroll Y: {scrollable.state.scrollTop}</div>
269
+
270
+ <!-- Nested interactive components -->
271
+ <Accordion.Root>
272
+ <Accordion.Item value="item1">
273
+ <Accordion.Trigger>Section 1</Accordion.Trigger>
274
+ <Accordion.Content>Content 1</Accordion.Content>
275
+ </Accordion.Item>
276
+ </Accordion.Root>
277
+ </Scrollable.Content>
278
+ {/snippet}
279
+ </Scrollable.Root>
280
+ ```
281
+
282
+ ### Combobox with Custom Trigger
283
+
284
+ ```svelte
285
+ <Combobox.Root>
286
+ {#snippet children({ combobox })}
287
+ <Combobox.Trigger base={Input.Root}>
288
+ <Input.Value placeholder="Search..." />
289
+ <Input.Icon src={SearchIcon} />
290
+ </Combobox.Trigger>
291
+
292
+ <Combobox.List>
293
+ <Combobox.Item value="option1">Option 1</Combobox.Item>
294
+ <Combobox.Item value="option2">Option 2</Combobox.Item>
295
+ </Combobox.List>
296
+ {/snippet}
297
+ </Combobox.Root>
298
+ ```
299
+
300
+ The `Input.Root` is composed into the trigger, bringing input styling and icon support to the combobox.
301
+
302
+ ## Key Principles
303
+
304
+ 1. **Base Prop = Behavior Inheritance**: Use `base=` to layer component behaviors (Button + Menu.Trigger = clickable menu opener)
305
+
306
+ 2. **Bond = State Access**: Use `{#snippet children({ bond })}` to access component state and methods for coordination
307
+
308
+ 3. **Nesting = UI Composition**: Nest components as needed; each maintains independent state while bonds allow communication
309
+
310
+ 4. **Forward Everything**: Components forward all props and classes to their base, enabling full customization
311
+
312
+ 5. **Type Safety**: TypeScript infers correct props when using `base=`, providing autocompletion for both the component and the base
313
+
314
+ ## Common Patterns
315
+
316
+ ### Interactive Table Cell
317
+
318
+ ```svelte
319
+ <DataGrid.Td base={Dropdown.Root}>
320
+ <Dropdown.Trigger base={Button} variant="ghost" size="sm">Actions</Dropdown.Trigger>
321
+ <Dropdown.List>
322
+ <Dropdown.Item>Edit</Dropdown.Item>
323
+ <Dropdown.Item>Delete</Dropdown.Item>
324
+ </Dropdown.List>
325
+ </DataGrid.Td>
326
+ ```
327
+
328
+ **Combines**: Table cell + Dropdown + Button
329
+
330
+ ### Validated Form Field
331
+
332
+ ```svelte
333
+ <Field.Root name="email" schema={emailSchema}>
334
+ {#snippet children({ field })}
335
+ <Field.Label>Email</Field.Label>
336
+ <Field.Control
337
+ base={Input.Value}
338
+ type="email"
339
+ placeholder="you@example.com"
340
+ onblur={() => field?.state.validate()}
341
+ />
342
+ {#if field?.state?.errors}
343
+ <Field.Error />
344
+ {/if}
345
+ {/snippet}
346
+ </Field.Root>
347
+ ```
348
+
349
+ **Combines**: Form validation + Input + Label + Error display
350
+
351
+ ### Tooltip Button
352
+
353
+ ```svelte
354
+ <Tooltip.Root>
355
+ <Tooltip.Trigger base={Button} variant="outline">Delete</Tooltip.Trigger>
356
+ <Tooltip.Content>This action cannot be undone</Tooltip.Content>
357
+ </Tooltip.Root>
358
+ ```
359
+
360
+ **Combines**: Tooltip positioning + Button interaction
361
+
362
+ ### Controlled Popover with Custom Content
363
+
364
+ ```svelte
365
+ <Popover.Root bind:open>
366
+ {#snippet children({ popover })}
367
+ <Popover.Trigger base={Button}>
368
+ Open {popover.state.isOpen ? '(Open)' : '(Closed)'}
369
+ </Popover.Trigger>
370
+
371
+ <Popover.Content class="w-80">
372
+ <Card>
373
+ <Card.Header>
374
+ <Card.Title>Settings</Card.Title>
375
+ </Card.Header>
376
+ <Card.Content>
377
+ <!-- Form fields here -->
378
+ </Card.Content>
379
+ <Card.Footer>
380
+ <Button onclick={() => popover.state.close()}>Close</Button>
381
+ </Card.Footer>
382
+ </Card>
383
+ </Popover.Content>
384
+ {/snippet}
385
+ </Popover.Root>
386
+ ```
387
+
388
+ **Combines**: Popover positioning + Button trigger + Card layout + Form
389
+
390
+ ## Summary
391
+
392
+ - **`base=` prop**: Inherit behavior from another component (Trigger + Button = clickable trigger)
393
+ - **`{#snippet children({ bond })}`**: Access component state for coordination
394
+ - **Nesting**: Compose complex UIs by nesting components as needed
395
+ - **Composition > Configuration**: Combine simple components instead of creating complex ones with many props