@svelte-atoms/core 1.0.0-alpha.26 β†’ 1.0.0-alpha.28

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 (362) hide show
  1. package/README.md +856 -645
  2. package/dist/components/accordion/accordion-root.svelte +2 -20
  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 +2 -12
  7. package/dist/components/accordion/item/accordion-item-body.svelte.d.ts +2 -8
  8. package/dist/components/accordion/item/accordion-item-header.svelte +3 -13
  9. package/dist/components/accordion/item/accordion-item-header.svelte.d.ts +3 -20
  10. package/dist/components/accordion/item/accordion-item-indicator.svelte +3 -12
  11. package/dist/components/accordion/item/accordion-item-indicator.svelte.d.ts +2 -8
  12. package/dist/components/accordion/item/accordion-item-root.svelte +3 -17
  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 +43 -52
  20. package/dist/components/alert/alert-actions.svelte.d.ts +3 -30
  21. package/dist/components/alert/alert-close-button.svelte +70 -79
  22. package/dist/components/alert/alert-close-button.svelte.d.ts +8 -35
  23. package/dist/components/alert/alert-content.svelte +43 -52
  24. package/dist/components/alert/alert-content.svelte.d.ts +3 -30
  25. package/dist/components/alert/alert-description.svelte +42 -51
  26. package/dist/components/alert/alert-description.svelte.d.ts +7 -10
  27. package/dist/components/alert/alert-icon.svelte +47 -56
  28. package/dist/components/alert/alert-icon.svelte.d.ts +2 -8
  29. package/dist/components/alert/alert-root.svelte +103 -118
  30. package/dist/components/alert/alert-root.svelte.d.ts +2 -13
  31. package/dist/components/alert/alert-title.svelte +42 -51
  32. package/dist/components/alert/alert-title.svelte.d.ts +2 -8
  33. package/dist/components/alert/alert.stories.svelte +401 -40
  34. package/dist/components/alert/alert.stories.svelte.d.ts +2 -5
  35. package/dist/components/alert/index.d.ts +1 -0
  36. package/dist/components/alert/index.js +1 -0
  37. package/dist/components/alert/types.d.ts +85 -0
  38. package/dist/components/alert/types.js +1 -0
  39. package/dist/components/atom/html-atom.svelte +205 -201
  40. package/dist/components/atom/html-atom.svelte.d.ts +2 -22
  41. package/dist/components/atom/snippet-renderer.svelte +5 -0
  42. package/dist/components/atom/snippet-renderer.svelte.d.ts +5 -0
  43. package/dist/components/atom/types.d.ts +7 -2
  44. package/dist/components/avatar/avatar.stories.svelte.d.ts +1 -1
  45. package/dist/components/avatar/types.d.ts +7 -2
  46. package/dist/components/badge/badge.stories.svelte.d.ts +1 -1
  47. package/dist/components/badge/types.d.ts +7 -2
  48. package/dist/components/breadcrumb/breadcrumb.stories.svelte.d.ts +1 -1
  49. package/dist/components/button/button.stories.svelte +60 -57
  50. package/dist/components/button/index.d.ts +1 -0
  51. package/dist/components/button/index.js +1 -0
  52. package/dist/components/button/types.d.ts +7 -2
  53. package/dist/components/calendar/atoms.d.ts +5 -0
  54. package/dist/components/calendar/atoms.js +5 -0
  55. package/dist/components/calendar/bond.svelte.d.ts +72 -0
  56. package/dist/components/calendar/bond.svelte.js +132 -0
  57. package/dist/components/calendar/calendar-body.svelte +107 -0
  58. package/dist/components/calendar/calendar-body.svelte.d.ts +8 -0
  59. package/dist/components/calendar/calendar-day.svelte +97 -0
  60. package/dist/components/calendar/calendar-day.svelte.d.ts +4 -0
  61. package/dist/components/calendar/calendar-header.svelte +33 -0
  62. package/dist/components/calendar/calendar-header.svelte.d.ts +7 -0
  63. package/dist/components/calendar/calendar-root.svelte +208 -0
  64. package/dist/components/calendar/calendar-root.svelte.d.ts +8 -0
  65. package/dist/components/calendar/calendar-week-day.svelte +34 -0
  66. package/dist/components/calendar/calendar-week-day.svelte.d.ts +9 -0
  67. package/dist/components/calendar/calendar.css +26 -0
  68. package/dist/components/calendar/calendar.stories.svelte +36 -0
  69. package/dist/components/calendar/calendar.stories.svelte.d.ts +6 -0
  70. package/dist/components/calendar/index.d.ts +4 -0
  71. package/dist/components/calendar/index.js +4 -0
  72. package/dist/components/calendar/runes.svelte.d.ts +3 -0
  73. package/dist/components/calendar/runes.svelte.js +25 -0
  74. package/dist/components/calendar/types.d.ts +62 -0
  75. package/dist/components/calendar/types.js +1 -0
  76. package/dist/components/card/card-body.svelte +2 -8
  77. package/dist/components/card/card-body.svelte.d.ts +7 -4
  78. package/dist/components/card/card-description.svelte +3 -10
  79. package/dist/components/card/card-description.svelte.d.ts +7 -7
  80. package/dist/components/card/card-footer.svelte +2 -9
  81. package/dist/components/card/card-footer.svelte.d.ts +7 -4
  82. package/dist/components/card/card-header.svelte +2 -9
  83. package/dist/components/card/card-header.svelte.d.ts +7 -4
  84. package/dist/components/card/card-media.svelte +2 -9
  85. package/dist/components/card/card-media.svelte.d.ts +7 -4
  86. package/dist/components/card/card-root.svelte +2 -2
  87. package/dist/components/card/card-root.svelte.d.ts +1 -1
  88. package/dist/components/card/card-subtitle.svelte +3 -10
  89. package/dist/components/card/card-subtitle.svelte.d.ts +12 -9
  90. package/dist/components/card/card-title.svelte +3 -10
  91. package/dist/components/card/card-title.svelte.d.ts +12 -9
  92. package/dist/components/card/index.d.ts +1 -0
  93. package/dist/components/card/index.js +1 -0
  94. package/dist/components/card/types.d.ts +57 -2
  95. package/dist/components/checkbox/types.d.ts +7 -2
  96. package/dist/components/collapsible/collapsible-body.svelte +2 -15
  97. package/dist/components/collapsible/collapsible-body.svelte.d.ts +2 -9
  98. package/dist/components/collapsible/collapsible-header.svelte +2 -15
  99. package/dist/components/collapsible/collapsible-header.svelte.d.ts +2 -9
  100. package/dist/components/collapsible/collapsible-indicator.svelte +4 -19
  101. package/dist/components/collapsible/collapsible-indicator.svelte.d.ts +3 -10
  102. package/dist/components/collapsible/collapsible-root.svelte +2 -21
  103. package/dist/components/collapsible/collapsible-root.svelte.d.ts +2 -14
  104. package/dist/components/collapsible/index.d.ts +1 -0
  105. package/dist/components/collapsible/index.js +1 -0
  106. package/dist/components/collapsible/types.d.ts +54 -0
  107. package/dist/components/collapsible/types.js +1 -0
  108. package/dist/components/combobox/combobox-root.svelte +2 -5
  109. package/dist/components/combobox/combobox-root.svelte.d.ts +5 -18
  110. package/dist/components/combobox/index.d.ts +1 -0
  111. package/dist/components/combobox/index.js +1 -0
  112. package/dist/components/combobox/types.d.ts +25 -0
  113. package/dist/components/combobox/types.js +1 -0
  114. package/dist/components/container/container.stories.svelte.d.ts +1 -1
  115. package/dist/components/container/types.d.ts +7 -2
  116. package/dist/components/contextmenu/contextmenu-trigger.svelte.d.ts +1 -1
  117. package/dist/components/contextmenu/types.d.ts +8 -0
  118. package/dist/components/contextmenu/types.js +1 -0
  119. package/dist/components/datagrid/bond.svelte.d.ts +2 -2
  120. package/dist/components/datagrid/datagrid-body.svelte +6 -13
  121. package/dist/components/datagrid/datagrid-body.svelte.d.ts +17 -20
  122. package/dist/components/datagrid/datagrid-checkbox.svelte +3 -10
  123. package/dist/components/datagrid/datagrid-checkbox.svelte.d.ts +4 -6
  124. package/dist/components/datagrid/datagrid-footer.svelte +1 -1
  125. package/dist/components/datagrid/datagrid-footer.svelte.d.ts +1 -1
  126. package/dist/components/datagrid/datagrid-header.svelte +2 -2
  127. package/dist/components/datagrid/datagrid-header.svelte.d.ts +1 -1
  128. package/dist/components/datagrid/datagrid-root.svelte +2 -2
  129. package/dist/components/datagrid/datagrid-root.svelte.d.ts +1 -1
  130. package/dist/components/datagrid/td/datagrid-td.svelte +3 -17
  131. package/dist/components/datagrid/td/datagrid-td.svelte.d.ts +7 -16
  132. package/dist/components/datagrid/th/datagrid-th.svelte +3 -24
  133. package/dist/components/datagrid/th/datagrid-th.svelte.d.ts +2 -20
  134. package/dist/components/datagrid/tr/bond.svelte.d.ts +3 -1
  135. package/dist/components/datagrid/tr/bond.svelte.js +4 -2
  136. package/dist/components/datagrid/tr/datagrid-tr.svelte +7 -22
  137. package/dist/components/datagrid/tr/datagrid-tr.svelte.d.ts +2 -18
  138. package/dist/components/datagrid/types.d.ts +85 -37
  139. package/dist/components/date-picker/atoms.d.ts +7 -0
  140. package/dist/components/date-picker/atoms.js +7 -0
  141. package/dist/components/date-picker/bond.svelte.d.ts +67 -0
  142. package/dist/components/date-picker/bond.svelte.js +174 -0
  143. package/dist/components/date-picker/date-picker-calendar.svelte +42 -0
  144. package/dist/components/date-picker/date-picker-calendar.svelte.d.ts +7 -0
  145. package/dist/components/date-picker/date-picker-header.svelte +105 -0
  146. package/dist/components/date-picker/date-picker-header.svelte.d.ts +7 -0
  147. package/dist/components/date-picker/date-picker-months.svelte +150 -0
  148. package/dist/components/date-picker/date-picker-months.svelte.d.ts +7 -0
  149. package/dist/components/date-picker/date-picker-root.svelte +94 -0
  150. package/dist/components/date-picker/date-picker-root.svelte.d.ts +17 -0
  151. package/dist/components/date-picker/date-picker-years.svelte +214 -0
  152. package/dist/components/date-picker/date-picker-years.svelte.d.ts +7 -0
  153. package/dist/components/date-picker/date-picker.stories.svelte +51 -0
  154. package/dist/components/date-picker/date-picker.stories.svelte.d.ts +3 -0
  155. package/dist/components/date-picker/index.d.ts +3 -0
  156. package/dist/components/date-picker/index.js +3 -0
  157. package/dist/components/date-picker/types.d.ts +1 -0
  158. package/dist/components/date-picker/types.js +1 -0
  159. package/dist/components/dialog/dialog-body.svelte +2 -8
  160. package/dist/components/dialog/dialog-body.svelte.d.ts +2 -2
  161. package/dist/components/dialog/dialog-close-button.svelte +7 -10
  162. package/dist/components/dialog/dialog-close-button.svelte.d.ts +7 -7
  163. package/dist/components/dialog/dialog-content.svelte +2 -8
  164. package/dist/components/dialog/dialog-content.svelte.d.ts +2 -2
  165. package/dist/components/dialog/dialog-description.svelte +2 -8
  166. package/dist/components/dialog/dialog-description.svelte.d.ts +2 -2
  167. package/dist/components/dialog/dialog-footer.svelte +2 -8
  168. package/dist/components/dialog/dialog-footer.svelte.d.ts +2 -2
  169. package/dist/components/dialog/dialog-header.svelte +2 -8
  170. package/dist/components/dialog/dialog-header.svelte.d.ts +2 -2
  171. package/dist/components/dialog/dialog-root.svelte +110 -123
  172. package/dist/components/dialog/dialog-root.svelte.d.ts +2 -12
  173. package/dist/components/dialog/dialog-title.svelte +3 -9
  174. package/dist/components/dialog/dialog-title.svelte.d.ts +7 -7
  175. package/dist/components/dialog/index.d.ts +1 -0
  176. package/dist/components/dialog/index.js +1 -0
  177. package/dist/components/dialog/types.d.ts +67 -0
  178. package/dist/components/dialog/types.js +1 -0
  179. package/dist/components/divider/types.d.ts +10 -0
  180. package/dist/components/divider/types.js +1 -0
  181. package/dist/components/drawer/drawer-backdrop.svelte +2 -11
  182. package/dist/components/drawer/drawer-backdrop.svelte.d.ts +3 -26
  183. package/dist/components/drawer/drawer-body.svelte +2 -16
  184. package/dist/components/drawer/drawer-body.svelte.d.ts +3 -16
  185. package/dist/components/drawer/drawer-content.svelte +2 -15
  186. package/dist/components/drawer/drawer-content.svelte.d.ts +3 -14
  187. package/dist/components/drawer/drawer-description.svelte +2 -15
  188. package/dist/components/drawer/drawer-description.svelte.d.ts +3 -14
  189. package/dist/components/drawer/drawer-footer.svelte +2 -15
  190. package/dist/components/drawer/drawer-footer.svelte.d.ts +3 -14
  191. package/dist/components/drawer/drawer-header.svelte +3 -16
  192. package/dist/components/drawer/drawer-header.svelte.d.ts +3 -14
  193. package/dist/components/drawer/drawer-root.svelte +93 -118
  194. package/dist/components/drawer/drawer-root.svelte.d.ts +3 -34
  195. package/dist/components/drawer/drawer-title.svelte +2 -15
  196. package/dist/components/drawer/drawer-title.svelte.d.ts +3 -14
  197. package/dist/components/drawer/index.d.ts +1 -0
  198. package/dist/components/drawer/index.js +1 -0
  199. package/dist/components/drawer/types.d.ts +86 -0
  200. package/dist/components/drawer/types.js +1 -0
  201. package/dist/components/dropdown/dropdown-query.svelte +2 -1
  202. package/dist/components/dropdown/dropdown-query.svelte.d.ts +11 -10
  203. package/dist/components/dropdown/dropdown-root.svelte +1 -1
  204. package/dist/components/dropdown/dropdown-trigger.svelte +2 -13
  205. package/dist/components/dropdown/dropdown-trigger.svelte.d.ts +1 -8
  206. package/dist/components/dropdown/dropdown-value.svelte +1 -1
  207. package/dist/components/dropdown/index.d.ts +1 -0
  208. package/dist/components/dropdown/index.js +1 -0
  209. package/dist/components/dropdown/types.d.ts +37 -0
  210. package/dist/components/dropdown/types.js +1 -0
  211. package/dist/components/element/html-element.svelte +85 -85
  212. package/dist/components/element/html-element.svelte.d.ts +2 -14
  213. package/dist/components/element/svg-element.svelte.d.ts +2 -14
  214. package/dist/components/element/types.d.ts +14 -7
  215. package/dist/components/form/bond.svelte.d.ts +1 -1
  216. package/dist/components/form/field/field-control.svelte +3 -20
  217. package/dist/components/form/field/field-control.svelte.d.ts +5 -19
  218. package/dist/components/form/field/field-label.svelte +1 -8
  219. package/dist/components/form/field/field-label.svelte.d.ts +1 -2
  220. package/dist/components/form/field/field-root.svelte +5 -34
  221. package/dist/components/form/field/field-root.svelte.d.ts +5 -20
  222. package/dist/components/form/index.d.ts +1 -0
  223. package/dist/components/form/index.js +1 -0
  224. package/dist/components/form/types.d.ts +76 -0
  225. package/dist/components/form/types.js +1 -0
  226. package/dist/components/icon/icon.svelte +3 -14
  227. package/dist/components/icon/icon.svelte.d.ts +4 -29
  228. package/dist/components/icon/types.d.ts +11 -7
  229. package/dist/components/image/image.stories.svelte.d.ts +1 -1
  230. package/dist/components/index.d.ts +3 -0
  231. package/dist/components/index.js +3 -0
  232. package/dist/components/input/index.d.ts +1 -0
  233. package/dist/components/input/index.js +1 -0
  234. package/dist/components/input/input-control.svelte +0 -4
  235. package/dist/components/input/input-control.svelte.d.ts +2 -3
  236. package/dist/components/input/input-icon.svelte.d.ts +1 -1
  237. package/dist/components/input/input-placeholder.svelte.d.ts +2 -19
  238. package/dist/components/input/types.d.ts +18 -7
  239. package/dist/components/label/index.d.ts +1 -0
  240. package/dist/components/label/index.js +1 -0
  241. package/dist/components/label/label.svelte +2 -18
  242. package/dist/components/label/label.svelte.d.ts +3 -27
  243. package/dist/components/label/types.d.ts +11 -0
  244. package/dist/components/label/types.js +1 -0
  245. package/dist/components/layer/layer-inner.svelte.d.ts +2 -19
  246. package/dist/components/layer/layer-root.svelte.d.ts +2 -19
  247. package/dist/components/layer/types.d.ts +11 -0
  248. package/dist/components/layer/types.js +1 -0
  249. package/dist/components/link/types.d.ts +8 -0
  250. package/dist/components/link/types.js +1 -0
  251. package/dist/components/list/types.d.ts +8 -0
  252. package/dist/components/list/types.js +1 -0
  253. package/dist/components/menu/index.d.ts +1 -0
  254. package/dist/components/menu/index.js +1 -0
  255. package/dist/components/menu/types.d.ts +15 -0
  256. package/dist/components/menu/types.js +1 -0
  257. package/dist/components/popover/index.d.ts +1 -0
  258. package/dist/components/popover/index.js +1 -0
  259. package/dist/components/popover/popover-arrow.svelte +111 -111
  260. package/dist/components/popover/popover-arrow.svelte.d.ts +2 -18
  261. package/dist/components/popover/popover-content.svelte +47 -8
  262. package/dist/components/popover/popover-root.svelte +16 -17
  263. package/dist/components/popover/popover-trigger.svelte +47 -47
  264. package/dist/components/popover/popover.stories.svelte +52 -67
  265. package/dist/components/popover/types.d.ts +32 -10
  266. package/dist/components/portal/active-portal.svelte +22 -22
  267. package/dist/components/portal/index.d.ts +1 -0
  268. package/dist/components/portal/index.js +1 -0
  269. package/dist/components/portal/portal-inner.svelte.d.ts +2 -19
  270. package/dist/components/portal/portal-root.svelte +2 -7
  271. package/dist/components/portal/portal-root.svelte.d.ts +2 -22
  272. package/dist/components/portal/teleport.svelte +50 -55
  273. package/dist/components/portal/teleport.svelte.d.ts +3 -22
  274. package/dist/components/portal/types.d.ts +39 -0
  275. package/dist/components/portal/types.js +1 -0
  276. package/dist/components/qr-code/index.d.ts +1 -0
  277. package/dist/components/qr-code/index.js +1 -0
  278. package/dist/components/qr-code/qr-code.stories.svelte +24 -0
  279. package/dist/components/qr-code/qr-code.stories.svelte.d.ts +26 -0
  280. package/dist/components/qr-code/qr-code.svelte +25 -0
  281. package/dist/components/qr-code/qr-code.svelte.d.ts +6 -0
  282. package/dist/components/radio/radio.svelte +1 -1
  283. package/dist/components/radio/radio.svelte.d.ts +14 -36
  284. package/dist/components/radio/types.svelte.d.ts +1 -1
  285. package/dist/components/root/root.svelte +121 -121
  286. package/dist/components/root/types.d.ts +8 -0
  287. package/dist/components/root/types.js +1 -0
  288. package/dist/components/scrollable/index.d.ts +1 -0
  289. package/dist/components/scrollable/index.js +1 -0
  290. package/dist/components/scrollable/scrollable-container.svelte +3 -10
  291. package/dist/components/scrollable/scrollable-container.svelte.d.ts +2 -6
  292. package/dist/components/scrollable/scrollable-content.svelte +2 -12
  293. package/dist/components/scrollable/scrollable-content.svelte.d.ts +1 -6
  294. package/dist/components/scrollable/scrollable-root.svelte +3 -23
  295. package/dist/components/scrollable/scrollable-root.svelte.d.ts +3 -19
  296. package/dist/components/scrollable/scrollable-thumb.svelte +2 -13
  297. package/dist/components/scrollable/scrollable-thumb.svelte.d.ts +1 -7
  298. package/dist/components/scrollable/scrollable-track.svelte +2 -13
  299. package/dist/components/scrollable/scrollable-track.svelte.d.ts +1 -7
  300. package/dist/components/scrollable/scrollable.stories.svelte.d.ts +1 -1
  301. package/dist/components/scrollable/types.d.ts +62 -0
  302. package/dist/components/scrollable/types.js +1 -0
  303. package/dist/components/sidebar/index.d.ts +1 -0
  304. package/dist/components/sidebar/index.js +1 -0
  305. package/dist/components/sidebar/types.d.ts +16 -5
  306. package/dist/components/stack/stack-root.svelte.d.ts +2 -19
  307. package/dist/components/stack/types.d.ts +12 -0
  308. package/dist/components/stack/types.js +1 -0
  309. package/dist/components/tabs/index.d.ts +1 -0
  310. package/dist/components/tabs/index.js +1 -0
  311. package/dist/components/tabs/tab/tab-body.svelte +2 -11
  312. package/dist/components/tabs/tab/tab-body.svelte.d.ts +2 -8
  313. package/dist/components/tabs/tab/tab-description.svelte +2 -11
  314. package/dist/components/tabs/tab/tab-description.svelte.d.ts +2 -8
  315. package/dist/components/tabs/tab/tab-header.svelte +2 -12
  316. package/dist/components/tabs/tab/tab-header.svelte.d.ts +2 -11
  317. package/dist/components/tabs/tab/tab-root.svelte +1 -1
  318. package/dist/components/tabs/types.d.ts +55 -0
  319. package/dist/components/tabs/types.js +1 -0
  320. package/dist/components/textarea/index.d.ts +1 -0
  321. package/dist/components/textarea/index.js +1 -0
  322. package/dist/components/textarea/types.d.ts +28 -0
  323. package/dist/components/textarea/types.js +1 -0
  324. package/dist/components/toast/index.d.ts +1 -0
  325. package/dist/components/toast/index.js +1 -0
  326. package/dist/components/toast/toast-description.svelte +3 -9
  327. package/dist/components/toast/toast-description.svelte.d.ts +8 -34
  328. package/dist/components/toast/toast-root.svelte +3 -16
  329. package/dist/components/toast/toast-root.svelte.d.ts +4 -43
  330. package/dist/components/toast/toast-title.svelte +2 -10
  331. package/dist/components/toast/toast-title.svelte.d.ts +2 -34
  332. package/dist/components/toast/types.d.ts +40 -0
  333. package/dist/components/toast/types.js +1 -0
  334. package/dist/components/tooltip/types.d.ts +13 -0
  335. package/dist/components/tooltip/types.js +1 -0
  336. package/dist/components/tree/index.d.ts +1 -0
  337. package/dist/components/tree/index.js +1 -0
  338. package/dist/components/tree/tree-body.svelte +2 -13
  339. package/dist/components/tree/tree-body.svelte.d.ts +2 -10
  340. package/dist/components/tree/tree-header.svelte +2 -14
  341. package/dist/components/tree/tree-header.svelte.d.ts +3 -29
  342. package/dist/components/tree/tree-indicator.svelte +4 -14
  343. package/dist/components/tree/tree-indicator.svelte.d.ts +3 -9
  344. package/dist/components/tree/tree-root.svelte +3 -18
  345. package/dist/components/tree/tree-root.svelte.d.ts +2 -12
  346. package/dist/components/tree/types.d.ts +59 -0
  347. package/dist/components/tree/types.js +1 -0
  348. package/dist/components/virtual/types.d.ts +23 -0
  349. package/dist/components/virtual/types.js +1 -0
  350. package/dist/components/virtual/virtual-root.svelte +2 -21
  351. package/dist/components/virtual/virtual-root.svelte.d.ts +1 -18
  352. package/dist/context/preset.svelte.d.ts +1 -1
  353. package/dist/icons/icon-arrow-down.svelte.d.ts +1 -1
  354. package/dist/icons/icon-checkmark.svelte.d.ts +1 -1
  355. package/dist/icons/icon-close.svelte.d.ts +1 -1
  356. package/dist/icons/icon-more-vert.svelte.d.ts +1 -1
  357. package/dist/runes/container.svelte.d.ts +2 -2
  358. package/dist/shared/bond.svelte.d.ts +1 -1
  359. package/dist/utils/state.d.ts +1 -1
  360. package/dist/utils/state.js +2 -1
  361. package/llm/variants.md +1261 -712
  362. package/package.json +464 -437
package/README.md CHANGED
@@ -1,645 +1,856 @@
1
- # βš›οΈ @svelte-atoms/core
2
-
3
- > A modern, modular, and accessible Svelte 5 UI component library built with composability at its core.
4
-
5
- **@svelte-atoms/core** is a comprehensive Svelte component library that provides fundamental building blocks ("atoms") for creating sophisticated, interactive design systems. Each component is designed with accessibility, type safety, and developer experience in mind. Built with Svelte 5 runes for optimal reactivity and performance.
6
-
7
- [![npm version](https://img.shields.io/npm/v/@svelte-atoms/core.svg)](https://www.npmjs.com/package/@svelte-atoms/core)
8
- [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/svelte-atoms/core)
9
- [![license](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
10
-
11
- ---
12
-
13
- ## ✨ Features
14
-
15
- ### 🧱 **Bond Architecture**
16
-
17
- Built around the concept of "Bonds" - self-contained, reusable state management classes that encapsulate component state and DOM interactions. Each component uses the Bond pattern for consistent, predictable behavior across complex interactions. Simple components like Button don't require the Bond pattern as they have minimal state management needs.
18
-
19
- ### πŸ”— **Context-Driven Communication**
20
-
21
- Components seamlessly communicate through Svelte's context API using standardized static methods (`Bond.get()` / `Bond.set()`) of the Bond class, enabling powerful parent-child relationships without prop drilling.
22
-
23
- ### β™Ώ **Accessibility First**
24
-
25
- Every component includes proper ARIA attributes, keyboard navigation, and focus management out of the box.
26
-
27
- ### πŸ”§ **Highly Extensible**
28
-
29
- Easily extend components with custom behaviors, animations, and styling while maintaining the core functionality.
30
-
31
- ### 🎯 **Type Safety**
32
-
33
- Fully written in TypeScript with comprehensive type definitions for a robust development experience.
34
-
35
- ### ⚑ **Reactive by Design**
36
-
37
- Leverages Svelte's fine-grained reactivity system for optimal performance and smooth user interactions.
38
-
39
- ### 🎨 **Headless & Stylable**
40
-
41
- Components are headless by default, giving you complete control over styling while providing sensible defaults.
42
-
43
- ### 🧩 **Composable**
44
-
45
- Build complex UIs by combining simple, reusable components. Each component is designed to work seamlessly with others through the Bond pattern and context API. Create sophisticated features like multi-level dropdowns, nested accordions, or custom form controls by composing atomic components together.
46
-
47
- ---
48
-
49
- ## πŸ“¦ Available Components
50
-
51
- Our comprehensive collection of UI components with implementation status:
52
-
53
- ### Layout & Navigation
54
-
55
- | Component | Description | Status |
56
- | ----------------------------------------------- | ---------------------------- | ------ |
57
- | [**Accordion**](docs/components/accordion.md) | Collapsible content sections | βœ… |
58
- | [**Breadcrumb**](docs/components/breadcrumb.md) | Navigation hierarchy | βœ… |
59
- | [**Sidebar**](docs/components/sidebar.md) | Collapsible side navigation | βœ… |
60
- | [**Tabs**](docs/components/tabs.md) | Tabbed interfaces | βœ… |
61
- | [**Tree**](docs/components/tree.md) | Hierarchical data structures | βœ… |
62
- | **Stepper** | Multi-step process indicator | ❌ |
63
- | **Pagination** | Page navigation controls | ❌ |
64
-
65
- ### Forms & Input
66
-
67
- | Component | Description | Status |
68
- | ------------------------------------------- | ------------------------------------ | ------ |
69
- | [**Button**](docs/components/button.md) | Interactive buttons with variants | βœ… |
70
- | [**Checkbox**](docs/components/checkbox.md) | Multi-select inputs | βœ… |
71
- | [**Combobox**](docs/components/combobox.md) | Searchable select inputs | βœ… |
72
- | [**Input**](docs/components/input.md) | Text input fields | βœ… |
73
- | [**Radio**](docs/components/radio.md) | Single-select inputs | βœ… |
74
- | **Slider** | Range input controls | ❌ |
75
- | **Switch** | Toggle controls | ❌ |
76
- | [**Textarea**](docs/components/textarea.md) | Multi-line text inputs | βœ… |
77
- | [**Form**](docs/components/form.md) | Form validation and state management | βœ… |
78
- | **DatePicker** | Date selection component | ❌ |
79
- | **TimePicker** | Time selection component | ❌ |
80
- | **FileUpload** | File upload component | ❌ |
81
- | **ColorPicker** | Color selection component | ❌ |
82
- | **Rating** | Star rating component | ❌ |
83
-
84
- ### Data Display
85
-
86
- | Component | Description | Status |
87
- | ------------------------------------------- | --------------------------- | ------ |
88
- | [**Avatar**](docs/components/avatar.md) | User profile images | βœ… |
89
- | [**Badge**](docs/components/badge.md) | Status indicators | βœ… |
90
- | [**DataGrid**](docs/components/datagrid.md) | Advanced data tables | βœ… |
91
- | [**Divider**](docs/components/divider.md) | Content separators | βœ… |
92
- | [**Icon**](docs/components/icon.md) | Scalable icons | βœ… |
93
- | [**Label**](docs/components/label.md) | Form labels | βœ… |
94
- | [**Link**](docs/components/link.md) | Navigation links | βœ… |
95
- | [**List**](docs/components/list.md) | Structured lists | βœ… |
96
- | [**Card**](docs/components/card.md) | Content containers | βœ… |
97
- | **Table** | Simple data tables | ❌ |
98
- | **Chip** | Compact information display | ❌ |
99
- | **Progress** | Progress indicators | ❌ |
100
- | **Skeleton** | Loading placeholders | ❌ |
101
- | **Timeline** | Event timeline display | ❌ |
102
- | **Calendar** | Date display component | ❌ |
103
-
104
- ### Overlays & Feedback
105
-
106
- | Component | Description | Status |
107
- | ------------------------------------------------- | ------------------------ | ------ |
108
- | [**Dialog**](docs/components/dialog.md) | Modal dialogs | βœ… |
109
- | [**Dropdown**](docs/components/dropdown.md) | Contextual menus | βœ… |
110
- | [**Popover**](docs/components/popover.md) | Contextual information | βœ… |
111
- | [**Toast**](docs/components/toast.md) | Notification messages | βœ… |
112
- | [**Tooltip**](docs/components/tooltip.md) | Contextual hints | βœ… |
113
- | [**ContextMenu**](docs/components/contextmenu.md) | Right-click menus | βœ… |
114
- | [**Drawer**](docs/components/drawer.md) | Slide-out panels | βœ… |
115
- | [**Alert**](docs/components/alert.md) | Alert messages | βœ… |
116
- | **Banner** | Full-width notifications | ❌ |
117
- | **Spotlight** | Feature highlighting | ❌ |
118
-
119
- ### Utilities & Layout
120
-
121
- | Component | Description | Status |
122
- | ------------------------------------------------- | ----------------------------------- | ------ |
123
- | [**Portal**](docs/components/portal.md) | Declare a portal anywhere in DOM | βœ… |
124
- | **Teleport** | Render content in a specific portal | βœ… |
125
- | **Root** | Application root container | βœ… |
126
- | [**Layer**](docs/components/layer.md) | Layer management utility | βœ… |
127
- | [**Collapsible**](docs/components/collapsible.md) | Generic collapsible wrapper | βœ… |
128
- | **Container** | Layout container | βœ… |
129
- | [**Scrollable**](docs/components/scrollable.md) | Custom scrollbar component | βœ… |
130
- | [**Stack**](docs/components/stack.md) | Flexible layout stacking component | βœ… |
131
- | **Spacer** | Space management utility | ❌ |
132
- | **VirtualList** | Virtual scrolling list | ❌ |
133
-
134
- ---
135
-
136
- ## πŸ—οΈ Architecture
137
-
138
- The library is organized into distinct layers for maximum maintainability and extensibility:
139
-
140
- ```
141
- src/lib/
142
- β”œβ”€β”€ components/ # 30+ Core UI components
143
- β”œβ”€β”€ shared/ # Base classes (Bond, BondState) and utilities
144
- β”œβ”€β”€ helpers/ # Helper functions and components
145
- β”œβ”€β”€ attachments/ # DOM attachment utilities
146
- β”œβ”€β”€ runes/ # Reactive utilities (Svelte 5 runes)
147
- β”œβ”€β”€ types/ # TypeScript type definitions
148
- └── utils/ # General utility functions
149
- ```
150
-
151
- ### Bond Pattern
152
-
153
- Each component follows a consistent Bond pattern:
154
-
155
- - **Bond Class**: Manages component state and DOM interactions
156
- - **BondState Class**: Holds reactive component state using Svelte 5 runes
157
- - **Context Methods**: Static `CONTEXT_KEY`, `get()`, and `set()` methods for component communication
158
- - **Component Files**: Svelte components that use the Bond for behavior
159
-
160
- ```typescript
161
- class MyComponentBond extends Bond<MyComponentBondState> {
162
- static CONTEXT_KEY = '@atoms/context/my-component';
163
-
164
- static get(): MyComponentBond | undefined {
165
- return getContext(MyComponentBond.CONTEXT_KEY);
166
- }
167
-
168
- static set(bond: MyComponentBond): MyComponentBond {
169
- return setContext(MyComponentBond.CONTEXT_KEY, bond);
170
- }
171
- }
172
- ```
173
-
174
- ---
175
-
176
- ## πŸš€ Quick Start
177
-
178
- ### Installation
179
-
180
- ```bash
181
- # npm
182
- npm install @svelte-atoms/core
183
-
184
- # yarn
185
- yarn install @svelte-atoms/core
186
-
187
- # pnpm
188
- pnpm add @svelte-atoms/core
189
-
190
- # bun
191
- bun add @svelte-atoms/core
192
- ```
193
-
194
- ### Basic Usage
195
-
196
- ```svelte
197
- <script lang="ts">
198
- import { Button, Dialog, Input } from '@svelte-atoms/core';
199
-
200
- let dialogOpen = $state(false);
201
- let inputValue = '';
202
- </script>
203
-
204
- <!-- Simple Button -->
205
- <Button onclick={() => (dialogOpen = true)}>Open Dialog</Button>
206
-
207
- <!-- Dialog with Input -->
208
- <Dialog.Root bind:open={dialogOpen}>
209
- <Dialog.Content>
210
- <Dialog.Header>
211
- <Dialog.Title>Enter your name</Dialog.Title>
212
- </Dialog.Header>
213
- <Dialog.Body>
214
- <Input.Root>
215
- <Input.Value bind:value={inputValue} placeholder="Your name...">
216
- </Input.Root>
217
- </Dialog.Body>
218
- <Dialog.Footer>
219
- <Button.Root onclick={() => (dialogOpen = false)}>Cancel</Button.Root>
220
- <Button.Root variant="primary" onclick={() => (dialogOpen = false)}>Confirm</Button.Root>
221
- </Dialog.Footer>
222
- </Dialog.Content>
223
- </Dialog.Root>
224
- ```
225
-
226
- ### Advanced Usage with Bonds
227
-
228
- For more control, you can use the Bond system directly:
229
-
230
- ```svelte
231
- <script lang="ts">
232
- import { DialogBond, DialogBondState } from '@svelte-atoms/core/dialog';
233
-
234
- const { open = false, disable = false } = $props();
235
-
236
- const bondProps = defineState(
237
- [
238
- defineProperty(
239
- 'open',
240
- () => open,
241
- (v) => (open = v)
242
- ),
243
- defineProperty('disable', () => disable)
244
- ],
245
- {
246
- // Other props
247
- }
248
- );
249
-
250
- // Create dialog state
251
- const dialogState = new DialogBondState(() => bondProps);
252
-
253
- // Create dialog bond
254
- // Make available via context
255
- const dialogBond = new DialogBond(dialogState).share();
256
- </script>
257
-
258
- <div {...dialogBond.root()}>
259
- <button {...dialogBond.trigger()} onclick={() => dialogBond.state.toggle()}>
260
- Toggle Dialog
261
- </button>
262
-
263
- {#if open}
264
- <div {...dialogBond.overlay()}>
265
- <div {...dialogBond.content()}>
266
- <h2 {...dialogBond.title()}>Dialog Title</h2>
267
- <p>Dialog content goes here...</p>
268
- <button onclick={() => dialogBond.state.close()}>Close</button>
269
- </div>
270
- </div>
271
- {/if}
272
- </div>
273
- ```
274
-
275
- ### Advanced Usage With Composition
276
-
277
- This example demonstrates the power of component composition by combining `Dropdown`, `Input`, and animation capabilities to create a searchable multi-select dropdown with smooth transitions:
278
-
279
- ```svelte
280
- <script lang="ts">
281
- import { Dropdown, Input, Root, filter } from '@svelte-atoms/core';
282
- import { flip } from 'svelte/animate';
283
-
284
- // Sample data
285
- let data = [
286
- { id: 1, value: 'apple', text: 'Apple' },
287
- { id: 2, value: 'banana', text: 'Banana' },
288
- { id: 3, value: 'cherry', text: 'Cherry' },
289
- { id: 4, value: 'date', text: 'Date' },
290
- { id: 5, value: 'elderberry', text: 'Elderberry' }
291
- ];
292
-
293
- let open = $state(false);
294
- // Filter items based on search query
295
- const dd = filter(
296
- () => data,
297
- (query, item) => item.text.toLowerCase().includes(query.toLowerCase())
298
- );
299
- </script>
300
-
301
- <Root class="items-center justify-center p-4">
302
- <!-- Multi-select dropdown with search functionality -->
303
- <Dropdown.Root
304
- bind:open
305
- multiple
306
- keys={data.map((item) => item.value)}
307
- onquerychange={(q) => (dd.query = q)}
308
- >
309
- {#snippet children({ dropdown })}
310
- <!-- Compose Dropdown.Trigger with Input.Root for a custom trigger -->
311
- <Dropdown.Trigger
312
- base={Input.Root}
313
- class="h-auto min-h-12 max-w-sm min-w-sm items-center gap-2 rounded-sm px-4 transition-colors duration-200"
314
- onclick={(ev) => {
315
- ev.preventDefault();
316
-
317
- dropdown.state.open();
318
- }}
319
- >
320
- <!-- Display selected values with animation -->
321
- {#each dropdown?.state?.selectedItems ?? [] as item (item.id)}
322
- <div animate:flip={{ duration: 200 }}>
323
- <ADropdown.Value value={item.value} class="text-foreground/80">
324
- {item.text}
325
- </ADropdown.Value>
326
- </div>
327
- {/each}
328
-
329
- <!-- Inline search input within the trigger -->
330
- <Dropdown.Query class="flex-1 px-1" placeholder="Search for fruits..." />
331
- </Dropdown.Trigger>
332
-
333
- <!-- Dropdown list with filtered items -->
334
- <Dropdown.List>
335
- {#each dd.current as item (item.id)}
336
- <div animate:flip={{ duration: 200 }}>
337
- <Dropdown.Item value={item.value}>{item.text}</Dropdown.Item>
338
- </div>
339
- {/each}
340
- </Dropdown.List>
341
- {/snippet}
342
- </Dropdown.Root>
343
- </Root>
344
- ```
345
-
346
- **Key composition features demonstrated:**
347
-
348
- - **Component Fusion**: Using `base={Input.Root}` to compose Dropdown.Trigger with Input styling and behavior
349
- - **Snippet Patterns**: Accessing internal state through snippets for custom rendering
350
- - **Reactive Filtering**: Combining search query state with reactive effects for real-time filtering
351
- - **Smooth Animations**: Using Svelte's `flip` animation for seamless list transitions
352
- - **Multi-Select State**: Managing complex selection state through the Bond pattern
353
-
354
- ---
355
-
356
- ## πŸ“– Documentation
357
-
358
- ### Component Examples
359
-
360
- #### Dropdown with Multiple Selection
361
-
362
- ```svelte
363
- <script lang="ts">
364
- import { Dropdown } from '@svelte-atoms/core';
365
-
366
- let selectedValues = ['option1'];
367
- const options = [
368
- { value: 'option1', label: 'Option 1' },
369
- { value: 'option2', label: 'Option 2' },
370
- { value: 'option3', label: 'Option 3' }
371
- ];
372
- </script>
373
-
374
- <Dropdown.Root multiple bind:values={selectedValues}>
375
- <!-- Access internal bond -->
376
- {#snippet children({ dropdown })}
377
- <Dropdown.Trigger>
378
- Select options ({selectedValues.length} selected)
379
- </Dropdown.Trigger>
380
-
381
- <Dropdown.Content>
382
- {#each options as option}
383
- <Dropdown.Item value={option.value}>
384
- {option.label}
385
- </Dropdown.Item>
386
- {/each}
387
- </Dropdown.Content>
388
- {/snippet}
389
- </Dropdown.Root>
390
- ```
391
-
392
- #### Form with Validation
393
-
394
- ```svelte
395
- <script lang="ts">
396
- import { Form, Input, Button } from '@svelte-atoms/core';
397
- import { z } from 'zod';
398
-
399
- const schema = z.object({
400
- email: z.string().email('Invalid email address'),
401
- password: z.string().min(8, 'Password must be at least 8 characters')
402
- });
403
-
404
- let formData = { email: '', password: '' };
405
- let errors = {};
406
- </script>
407
-
408
- <Form {schema} bind:value={formData} bind:errors>
409
- <Field name="email">
410
- <Field.Label>Email</Field.Label>
411
- <Field.Control>
412
- <Input.Root type="email" placeholder="Enter your email" bind:value={formData.email} />
413
- </Field.Control>
414
- {#if errors.email}
415
- <Form.Error>{errors.email}</Form.Error>
416
- {/if}
417
- </.Field>
418
-
419
- <Field name="password">
420
- <Field.Label>Password</Field.Label>
421
- <Field.Control>
422
- <Input.Root
423
- type="password"
424
- placeholder="Enter your password"
425
- bind:value={formData.password}
426
- />
427
- </Field.Control>
428
- {#if errors.password}
429
- <Field.Error>{errors.password}</Field.Error>
430
- {/if}
431
- </.Field>
432
-
433
- <Button type="submit">Submit</Button>
434
- </Form>
435
- ```
436
-
437
- #### Data Grid with Sorting and Selection
438
-
439
- ```svelte
440
- <script lang="ts">
441
- import { DataGrid, Checkbox } from '@svelte-atoms/core';
442
-
443
- let data = [
444
- { id: 1, name: 'John Doe', email: 'john@example.com', role: 'Admin' },
445
- { id: 2, name: 'Jane Smith', email: 'jane@example.com', role: 'User' },
446
- { id: 3, name: 'Bob Johnson', email: 'bob@example.com', role: 'Editor' }
447
- ];
448
-
449
- let selectedRows = [];
450
- </script>
451
-
452
- <DataGrid.Root {data} bind:selectedRows multiple>
453
- <DataGrid.Header>
454
- <DataGrid.Tr>
455
- <DataGrid.Th>
456
- <Checkbox />
457
- </DataGrid.Th>
458
- <DataGrid.Th sortable="name">Name</DataGrid.Th>
459
- <DataGrid.Th sortable="email">Email</DataGrid.Th>
460
- <DataGrid.Th>Role</DataGrid.Th>
461
- </DataGrid.Tr>
462
- </DataGrid.Header>
463
-
464
- <DataGrid.Body>
465
- {#each data as row}
466
- <DataGrid.Tr value={row.id}>
467
- <DataGrid.Td>
468
- <Checkbox.Root value={row.id} />
469
- </DataGrid.Td>
470
- <DataGrid.Td>{row.name}</DataGrid.Td>
471
- <DataGrid.Td>{row.email}</DataGrid.Td>
472
- <DataGrid.Td>{row.role}</DataGrid.Td>
473
- </DataGrid.Tr>
474
- {/each}
475
- </DataGrid.Body>
476
- </DataGrid.Root>
477
- ```
478
-
479
- ---
480
-
481
- ## 🎨 Styling
482
-
483
- @svelte-atoms/core is completely headless, giving you full control over styling. Here are some approaches:
484
-
485
- ### Using Vanilla CSS
486
-
487
- ```css
488
- /* Default button styles */
489
- .btn {
490
- @apply rounded-md px-4 py-2 font-medium transition-colors;
491
- }
492
-
493
- .btn-primary {
494
- @apply bg-blue-600 text-white hover:bg-blue-700;
495
- }
496
-
497
- .btn-secondary {
498
- @apply bg-gray-200 text-gray-900 hover:bg-gray-300;
499
- }
500
- ```
501
-
502
- ### Using Tailwind CSS
503
-
504
- ```svelte
505
- <Button class="rounded-md bg-blue-600 px-4 py-2 text-white hover:bg-blue-700">Styled Button</Button>
506
- ```
507
-
508
- ---
509
-
510
- ## πŸ§ͺ Development
511
-
512
- ### Setup
513
-
514
- 1. **Clone the repository:**
515
-
516
- ```bash
517
- git clone https://github.com/ryu-man/svelte-atoms.git
518
- cd svelte-atoms
519
- ```
520
-
521
- 2. **Install dependencies:**
522
-
523
- ```bash
524
- bun install
525
- ```
526
-
527
- 3. **Start development server:**
528
-
529
- ```bash
530
- bun dev
531
- ```
532
-
533
- 4. **Run Storybook:**
534
- ```bash
535
- bun run storybook:dev
536
- ```
537
-
538
- ### Building
539
-
540
- ```bash
541
- # Build library
542
- bun run build
543
-
544
- # Build Storybook
545
- bun run storybook:build
546
- ```
547
-
548
- ---
549
-
550
- <!-- ## 🀝 Contributing
551
-
552
- We welcome contributions! Please see our [Contributing Guide](CONTRIBUTING.md) for details. -->
553
-
554
- <!-- ### Development Workflow
555
-
556
- 1. Fork the repository
557
- 2. Create a feature branch: `git checkout -b feature/amazing-feature`
558
- 3. Make your changes and add tests
559
- 4. Run the test suite: `bun test`
560
- 5. Commit your changes: `git commit -m 'Add amazing feature'`
561
- 6. Push to the branch: `git push origin feature/amazing-feature`
562
- 7. Open a Pull Request -->
563
-
564
- ### Creating New Components
565
-
566
- When adding new components, follow these guidelines:
567
-
568
- 1. **Create the bond structure:**
569
-
570
- ```
571
- src/lib/atoms/my-component/
572
- β”œβ”€β”€ bond.svelte.ts # Core bond logic (Bond + BondState classes)
573
- β”œβ”€β”€ index.ts # Public exports
574
- β”œβ”€β”€ atoms.ts # Component exports
575
- β”œβ”€β”€ my-component-root.svelte # Use namespace pattern when building complex component
576
- β”œβ”€β”€ my-component-content.svelte
577
- └── README.md # Component documentation
578
- ```
579
-
580
- 2. **Implement accessibility features:**
581
- - ARIA attributes
582
- - Keyboard navigation
583
- - Focus management
584
- - Screen reader support
585
-
586
- 3. **Add comprehensive tests:**
587
- - Unit tests for bond logic
588
- - Component integration tests
589
- - Accessibility tests
590
-
591
- 4. **Create Storybook stories:**
592
- - Basic usage examples
593
- - Advanced configurations
594
- - Interactive demos
595
-
596
- ---
597
-
598
- ## πŸ“š Resources
599
-
600
- - **[Documentation](https://svelte-atoms.dev)** - Comprehensive documentation
601
- - **[Storybook](https://storybook.svelte-atoms.dev/)** - Interactive component documentation
602
- - **[GitHub](https://github.com/ryu-man/svelte-atoms)** - Source code and issues
603
- - **[@svelte-atoms/alchemist](../alchimist)** - Data visualization companion library
604
-
605
- ---
606
-
607
- ## πŸ—ΊοΈ Roadmap
608
-
609
- ### v1.0.0 (Current - Alpha)
610
-
611
- - βœ… Bond architecture with Svelte 5 runes
612
- - βœ… 35+ essential components
613
- - βœ… TypeScript support
614
- - βœ… Accessibility features
615
- - βœ… Storybook documentation
616
- - βœ… Standardized context pattern
617
-
618
- ---
619
-
620
- ## πŸ“„ License
621
-
622
- MIT License - see the [LICENSE](LICENSE) file for details.
623
-
624
- ---
625
-
626
- ## πŸ™ Acknowledgements
627
-
628
- - [Svelte](https://svelte.dev/) - The amazing framework that powers this library
629
- - [Motion](https://motion.dev/) - For handling internal default animations
630
- - [Floating UI](https://floating-ui.com/) - For advanced positioning logic
631
- - [Tailwind CSS](https://tailwindcss.com/) - For styling
632
- - [Storybook](https://storybook.js.org/) - For component documentation and testing
633
- - [Vitest](https://vitest.dev/) - For fast and reliable testing
634
- - [Playwright](https://playwright.dev/) - For end-to-end testing
635
-
636
- ---
637
-
638
- <div align="center">
639
- <p>Built with ❀️ by the Svelte Atoms team</p>
640
- <!-- <p>
641
- <a href="https://github.com/ryu-man/svelte-atoms">GitHub</a> β€’
642
- <a href="https://svelte-atoms.dev">Documentation</a> β€’
643
- <a href="https://storybook.svelte-atoms.dev">Storybook</a>
644
- </p> -->
645
- </div>
1
+ # βš›οΈ @svelte-atoms/core
2
+
3
+ > A modern, modular, and accessible Svelte 5 UI component library built with composability at its core.
4
+
5
+ **@svelte-atoms/core** is a comprehensive Svelte component library that provides fundamental building blocks ("atoms") for creating sophisticated, interactive design systems. Each component is designed with accessibility, type safety, and developer experience in mind. Built with Svelte 5 runes for optimal reactivity and performance.
6
+
7
+ [![npm version](https://img.shields.io/npm/v/@svelte-atoms/core.svg)](https://www.npmjs.com/package/@svelte-atoms/core)
8
+ [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/svelte-atoms/core)
9
+ [![license](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
10
+
11
+ ---
12
+
13
+ ## ✨ Features
14
+
15
+ ### 🧱 **Bond Architecture**
16
+
17
+ Built around the concept of "Bonds" - self-contained, reusable state management classes that encapsulate component state and DOM interactions. Each component uses the Bond pattern for consistent, predictable behavior across complex interactions. Simple components like Button don't require the Bond pattern as they have minimal state management needs.
18
+
19
+ ### πŸ”— **Context-Driven Communication**
20
+
21
+ Components seamlessly communicate through Svelte's context API using standardized static methods (`Bond.get()` / `Bond.set()`) of the Bond class, enabling powerful parent-child relationships without prop drilling.
22
+
23
+ ### β™Ώ **Accessibility First**
24
+
25
+ Every component includes proper ARIA attributes, keyboard navigation, and focus management out of the box.
26
+
27
+ ### πŸ”§ **Highly Extensible**
28
+
29
+ Easily extend components with custom behaviors, animations, and styling while maintaining the core functionality.
30
+
31
+ ### 🎯 **Type Safety**
32
+
33
+ Fully written in TypeScript with comprehensive type definitions for a robust development experience.
34
+
35
+ ### ⚑ **Reactive by Design**
36
+
37
+ Leverages Svelte's fine-grained reactivity system for optimal performance and smooth user interactions.
38
+
39
+ ### 🎨 **Headless & Stylable**
40
+
41
+ Components are headless by default, giving you complete control over styling while providing sensible defaults.
42
+
43
+ ### 🧩 **Composable**
44
+
45
+ Build complex UIs by combining simple, reusable components. Each component is designed to work seamlessly with others through the Bond pattern and context API. Create sophisticated features like multi-level dropdowns, nested accordions, or custom form controls by composing atomic components together.
46
+
47
+ ---
48
+
49
+ ## πŸ“¦ Available Components
50
+
51
+ Our comprehensive collection of UI components with implementation status:
52
+
53
+ ### Layout & Navigation
54
+
55
+ | Component | Description | Status |
56
+ | ----------------------------------------------- | ---------------------------- | ------ |
57
+ | [**Accordion**](docs/components/accordion.md) | Collapsible content sections | βœ… |
58
+ | [**Breadcrumb**](docs/components/breadcrumb.md) | Navigation hierarchy | βœ… |
59
+ | [**Sidebar**](docs/components/sidebar.md) | Collapsible side navigation | βœ… |
60
+ | [**Tabs**](docs/components/tabs.md) | Tabbed interfaces | βœ… |
61
+ | [**Tree**](docs/components/tree.md) | Hierarchical data structures | βœ… |
62
+ | **Stepper** | Multi-step process indicator | ❌ |
63
+ | **Pagination** | Page navigation controls | ❌ |
64
+
65
+ ### Forms & Input
66
+
67
+ | Component | Description | Status |
68
+ | ------------------------------------------- | ------------------------------------ | ------ |
69
+ | [**Button**](docs/components/button.md) | Interactive buttons with variants | βœ… |
70
+ | [**Checkbox**](docs/components/checkbox.md) | Multi-select inputs | βœ… |
71
+ | [**Combobox**](docs/components/combobox.md) | Searchable select inputs | βœ… |
72
+ | [**Input**](docs/components/input.md) | Text input fields | βœ… |
73
+ | [**Radio**](docs/components/radio.md) | Single-select inputs | βœ… |
74
+ | **Slider** | Range input controls | ❌ |
75
+ | **Switch** | Toggle controls | ❌ |
76
+ | [**Textarea**](docs/components/textarea.md) | Multi-line text inputs | βœ… |
77
+ | [**Form**](docs/components/form.md) | Form validation and state management | βœ… |
78
+ | **DatePicker** | Date selection component | βœ… |
79
+ | **TimePicker** | Time selection component | ❌ |
80
+ | **FileUpload** | File upload component | ❌ |
81
+ | **ColorPicker** | Color selection component | ❌ |
82
+ | **Rating** | Star rating component | ❌ |
83
+
84
+ ### Data Display
85
+
86
+ | Component | Description | Status |
87
+ | ------------------------------------------- | --------------------------- | ------ |
88
+ | [**Avatar**](docs/components/avatar.md) | User profile images | βœ… |
89
+ | [**Badge**](docs/components/badge.md) | Status indicators | βœ… |
90
+ | [**DataGrid**](docs/components/datagrid.md) | Advanced data tables | βœ… |
91
+ | [**Divider**](docs/components/divider.md) | Content separators | βœ… |
92
+ | [**Icon**](docs/components/icon.md) | Scalable icons | βœ… |
93
+ | [**Label**](docs/components/label.md) | Form labels | βœ… |
94
+ | [**Link**](docs/components/link.md) | Navigation links | βœ… |
95
+ | [**List**](docs/components/list.md) | Structured lists | βœ… |
96
+ | [**Card**](docs/components/card.md) | Content containers | βœ… |
97
+ | **Table** | Simple data tables | ❌ |
98
+ | **Chip** | Compact information display | ❌ |
99
+ | **Progress** | Progress indicators | ❌ |
100
+ | **Skeleton** | Loading placeholders | ❌ |
101
+ | **Timeline** | Event timeline display | ❌ |
102
+ | **Calendar** | Date display component | βœ… |
103
+ | **QRCode** | QR code generator | βœ… |
104
+
105
+ ### Overlays & Feedback
106
+
107
+ | Component | Description | Status |
108
+ | ------------------------------------------------- | ------------------------ | ------ |
109
+ | [**Dialog**](docs/components/dialog.md) | Modal dialogs | βœ… |
110
+ | [**Dropdown**](docs/components/dropdown.md) | Contextual menus | βœ… |
111
+ | [**Popover**](docs/components/popover.md) | Contextual information | βœ… |
112
+ | [**Toast**](docs/components/toast.md) | Notification messages | βœ… |
113
+ | [**Tooltip**](docs/components/tooltip.md) | Contextual hints | βœ… |
114
+ | [**ContextMenu**](docs/components/contextmenu.md) | Right-click menus | βœ… |
115
+ | [**Drawer**](docs/components/drawer.md) | Slide-out panels | βœ… |
116
+ | [**Alert**](docs/components/alert.md) | Alert messages | βœ… |
117
+ | **Banner** | Full-width notifications | ❌ |
118
+ | **Spotlight** | Feature highlighting | ❌ |
119
+
120
+ ### Utilities & Layout
121
+
122
+ | Component | Description | Status |
123
+ | ------------------------------------------------- | ----------------------------------- | ------ |
124
+ | [**Portal**](docs/components/portal.md) | Declare a portal anywhere in DOM | βœ… |
125
+ | **Teleport** | Render content in a specific portal | βœ… |
126
+ | **Root** | Application root container | βœ… |
127
+ | [**Layer**](docs/components/layer.md) | Layer management utility | βœ… |
128
+ | [**Collapsible**](docs/components/collapsible.md) | Generic collapsible wrapper | βœ… |
129
+ | **Container** | Layout container | βœ… |
130
+ | [**Scrollable**](docs/components/scrollable.md) | Custom scrollbar component | βœ… |
131
+ | [**Stack**](docs/components/stack.md) | Flexible layout stacking component | βœ… |
132
+ | **Spacer** | Space management utility | ❌ |
133
+ | **VirtualList** | Virtual scrolling list | ❌ |
134
+
135
+ ---
136
+
137
+ ## πŸ—οΈ Architecture
138
+
139
+ The library is organized into distinct layers for maximum maintainability and extensibility:
140
+
141
+ ```
142
+ src/lib/
143
+ β”œβ”€β”€ components/ # 30+ Core UI components
144
+ β”œβ”€β”€ shared/ # Base classes (Bond, BondState) and utilities
145
+ β”œβ”€β”€ helpers/ # Helper functions and components
146
+ β”œβ”€β”€ attachments/ # DOM attachment utilities
147
+ β”œβ”€β”€ runes/ # Reactive utilities (Svelte 5 runes)
148
+ β”œβ”€β”€ types/ # TypeScript type definitions
149
+ └── utils/ # General utility functions
150
+ ```
151
+
152
+ ### Bond Pattern
153
+
154
+ Each component follows a consistent Bond pattern:
155
+
156
+ - **Bond Class**: Manages component state and DOM interactions
157
+ - **BondState Class**: Holds reactive component state using Svelte 5 runes
158
+ - **Context Methods**: Static `CONTEXT_KEY`, `get()`, and `set()` methods for component communication
159
+ - **Component Files**: Svelte components that use the Bond for behavior
160
+
161
+ ```typescript
162
+ class MyComponentBond extends Bond<MyComponentBondState> {
163
+ static CONTEXT_KEY = '@atoms/context/my-component';
164
+
165
+ static get(): MyComponentBond | undefined {
166
+ return getContext(MyComponentBond.CONTEXT_KEY);
167
+ }
168
+
169
+ static set(bond: MyComponentBond): MyComponentBond {
170
+ return setContext(MyComponentBond.CONTEXT_KEY, bond);
171
+ }
172
+ }
173
+ ```
174
+
175
+ ---
176
+
177
+ ## πŸš€ Quick Start
178
+
179
+ ### Installation
180
+
181
+ ```bash
182
+ # npm
183
+ npm install @svelte-atoms/core
184
+
185
+ # yarn
186
+ yarn install @svelte-atoms/core
187
+
188
+ # pnpm
189
+ pnpm add @svelte-atoms/core
190
+
191
+ # bun
192
+ bun add @svelte-atoms/core
193
+ ```
194
+
195
+ ### Basic Usage
196
+
197
+ ```svelte
198
+ <script lang="ts">
199
+ import { Button, Dialog, Input } from '@svelte-atoms/core';
200
+
201
+ let dialogOpen = $state(false);
202
+ let inputValue = '';
203
+ </script>
204
+
205
+ <!-- Simple Button -->
206
+ <Button onclick={() => (dialogOpen = true)}>Open Dialog</Button>
207
+
208
+ <!-- Dialog with Input -->
209
+ <Dialog.Root bind:open={dialogOpen}>
210
+ <Dialog.Content>
211
+ <Dialog.Header>
212
+ <Dialog.Title>Enter your name</Dialog.Title>
213
+ </Dialog.Header>
214
+ <Dialog.Body>
215
+ <Input.Root>
216
+ <Input.Value bind:value={inputValue} placeholder="Your name...">
217
+ </Input.Root>
218
+ </Dialog.Body>
219
+ <Dialog.Footer>
220
+ <Button.Root onclick={() => (dialogOpen = false)}>Cancel</Button.Root>
221
+ <Button.Root variant="primary" onclick={() => (dialogOpen = false)}>Confirm</Button.Root>
222
+ </Dialog.Footer>
223
+ </Dialog.Content>
224
+ </Dialog.Root>
225
+ ```
226
+
227
+ ### Advanced Usage with Bonds
228
+
229
+ For more control, you can use the Bond system directly:
230
+
231
+ ```svelte
232
+ <script lang="ts">
233
+ import { DialogBond, DialogBondState } from '@svelte-atoms/core/dialog';
234
+
235
+ const { open = false, disable = false } = $props();
236
+
237
+ const bondProps = defineState(
238
+ [
239
+ defineProperty(
240
+ 'open',
241
+ () => open,
242
+ (v) => (open = v)
243
+ ),
244
+ defineProperty('disable', () => disable)
245
+ ],
246
+ {
247
+ // Other props
248
+ }
249
+ );
250
+
251
+ // Create dialog state
252
+ const dialogState = new DialogBondState(() => bondProps);
253
+
254
+ // Create dialog bond
255
+ // Make available via context
256
+ const dialogBond = new DialogBond(dialogState).share();
257
+ </script>
258
+
259
+ <div {...dialogBond.root()}>
260
+ <button {...dialogBond.trigger()} onclick={() => dialogBond.state.toggle()}>
261
+ Toggle Dialog
262
+ </button>
263
+
264
+ {#if open}
265
+ <div {...dialogBond.overlay()}>
266
+ <div {...dialogBond.content()}>
267
+ <h2 {...dialogBond.title()}>Dialog Title</h2>
268
+ <p>Dialog content goes here...</p>
269
+ <button onclick={() => dialogBond.state.close()}>Close</button>
270
+ </div>
271
+ </div>
272
+ {/if}
273
+ </div>
274
+ ```
275
+
276
+ ### Advanced Usage With Composition
277
+
278
+ This example demonstrates the power of component composition by combining `Dropdown`, `Input`, and animation capabilities to create a searchable multi-select dropdown with smooth transitions:
279
+
280
+ ```svelte
281
+ <script lang="ts">
282
+ import { Dropdown, Input, Root, filter } from '@svelte-atoms/core';
283
+ import { flip } from 'svelte/animate';
284
+
285
+ // Sample data
286
+ let data = [
287
+ { id: 1, value: 'apple', text: 'Apple' },
288
+ { id: 2, value: 'banana', text: 'Banana' },
289
+ { id: 3, value: 'cherry', text: 'Cherry' },
290
+ { id: 4, value: 'date', text: 'Date' },
291
+ { id: 5, value: 'elderberry', text: 'Elderberry' }
292
+ ];
293
+
294
+ let open = $state(false);
295
+ // Filter items based on search query
296
+ const dd = filter(
297
+ () => data,
298
+ (query, item) => item.text.toLowerCase().includes(query.toLowerCase())
299
+ );
300
+ </script>
301
+
302
+ <Root class="items-center justify-center p-4">
303
+ <!-- Multi-select dropdown with search functionality -->
304
+ <Dropdown.Root
305
+ bind:open
306
+ multiple
307
+ keys={data.map((item) => item.value)}
308
+ onquerychange={(q) => (dd.query = q)}
309
+ >
310
+ {#snippet children({ dropdown })}
311
+ <!-- Compose Dropdown.Trigger with Input.Root for a custom trigger -->
312
+ <Dropdown.Trigger
313
+ base={Input.Root}
314
+ class="h-auto min-h-12 max-w-sm min-w-sm items-center gap-2 rounded-sm px-4 transition-colors duration-200"
315
+ onclick={(ev) => {
316
+ ev.preventDefault();
317
+
318
+ dropdown.state.open();
319
+ }}
320
+ >
321
+ <!-- Display selected values with animation -->
322
+ {#each dropdown?.state?.selectedItems ?? [] as item (item.id)}
323
+ <div animate:flip={{ duration: 200 }}>
324
+ <ADropdown.Value value={item.value} class="text-foreground/80">
325
+ {item.text}
326
+ </ADropdown.Value>
327
+ </div>
328
+ {/each}
329
+
330
+ <!-- Inline search input within the trigger -->
331
+ <Dropdown.Query class="flex-1 px-1" placeholder="Search for fruits..." />
332
+ </Dropdown.Trigger>
333
+
334
+ <!-- Dropdown list with filtered items -->
335
+ <Dropdown.List>
336
+ {#each dd.current as item (item.id)}
337
+ <div animate:flip={{ duration: 200 }}>
338
+ <Dropdown.Item value={item.value}>{item.text}</Dropdown.Item>
339
+ </div>
340
+ {/each}
341
+ </Dropdown.List>
342
+ {/snippet}
343
+ </Dropdown.Root>
344
+ </Root>
345
+ ```
346
+
347
+ **Key composition features demonstrated:**
348
+
349
+ - **Component Fusion**: Using `base={Input.Root}` to compose Dropdown.Trigger with Input styling and behavior
350
+ - **Snippet Patterns**: Accessing internal state through snippets for custom rendering
351
+ - **Reactive Filtering**: Combining search query state with reactive effects for real-time filtering
352
+ - **Smooth Animations**: Using Svelte's `flip` animation for seamless list transitions
353
+ - **Multi-Select State**: Managing complex selection state through the Bond pattern
354
+
355
+ ### Creating Custom Variants
356
+
357
+ @svelte-atoms/core provides a powerful variant system using `defineVariants()` that allows you to create type-safe, reusable component variations with support for compound variants, defaults, and bond state integration.
358
+
359
+ #### Basic Variant Definition
360
+
361
+ ```typescript
362
+ import { defineVariants, type VariantPropsType } from '@svelte-atoms/core/utils';
363
+
364
+ const buttonVariants = defineVariants({
365
+ class: 'inline-flex items-center justify-center rounded-md font-medium transition-colors',
366
+ variants: {
367
+ variant: {
368
+ primary: 'bg-blue-500 text-white hover:bg-blue-600',
369
+ secondary: 'bg-gray-200 text-gray-900 hover:bg-gray-300',
370
+ ghost: 'hover:bg-gray-100'
371
+ },
372
+ size: {
373
+ sm: 'h-8 px-3 text-sm',
374
+ md: 'h-10 px-4',
375
+ lg: 'h-12 px-6 text-lg'
376
+ }
377
+ },
378
+ compounds: [
379
+ {
380
+ variant: 'primary',
381
+ size: 'lg',
382
+ class: 'shadow-md font-semibold'
383
+ }
384
+ ],
385
+ defaults: {
386
+ variant: 'primary',
387
+ size: 'md'
388
+ }
389
+ });
390
+
391
+ // Extract type-safe props
392
+ type ButtonVariantProps = VariantPropsType<typeof buttonVariants>;
393
+ ```
394
+
395
+ #### Local vs Global Variants
396
+
397
+ **Local Variants** - Define variants directly in your component:
398
+
399
+ ```svelte
400
+ <script lang="ts">
401
+ import { HtmlAtom } from '@svelte-atoms/core';
402
+ import { defineVariants, type VariantPropsType } from '@svelte-atoms/core/utils';
403
+
404
+ const buttonVariants = defineVariants({
405
+ class: 'rounded-md font-medium',
406
+ variants: {
407
+ variant: {
408
+ primary: 'bg-blue-500 text-white',
409
+ secondary: 'bg-gray-500 text-white'
410
+ },
411
+ size: {
412
+ sm: 'px-2 py-1 text-sm',
413
+ md: 'px-4 py-2 text-base'
414
+ }
415
+ },
416
+ defaults: {
417
+ variant: 'primary',
418
+ size: 'md'
419
+ }
420
+ });
421
+
422
+ type ButtonProps = VariantPropsType<typeof buttonVariants> & {
423
+ disabled?: boolean;
424
+ class?: string;
425
+ };
426
+
427
+ let { variant, size, disabled = false, class: klass = '', ...props }: ButtonProps = $props();
428
+
429
+ const variantProps = $derived(buttonVariants(null, { variant, size }));
430
+ </script>
431
+
432
+ <HtmlAtom
433
+ as="button"
434
+ variants={variantProps}
435
+ {disabled}
436
+ class={[variantProps.class, klass]}
437
+ {...props}
438
+ >
439
+ {@render children?.()}
440
+ </HtmlAtom>
441
+ ```
442
+
443
+ **Global Variants** - Define variants in your theme/preset configuration:
444
+
445
+ ```typescript
446
+ // +layout.svelte or theme configuration
447
+ import { setPreset } from '@svelte-atoms/core/context';
448
+
449
+ setPreset({
450
+ button: () => ({
451
+ class: 'inline-flex items-center justify-center rounded-md font-medium transition-colors',
452
+ variants: {
453
+ variant: {
454
+ default: {
455
+ class: 'bg-primary text-primary-foreground hover:bg-primary/90'
456
+ },
457
+ destructive: {
458
+ class: 'bg-destructive text-destructive-foreground hover:bg-destructive/90'
459
+ },
460
+ outline: {
461
+ class: 'border border-input bg-background hover:bg-accent'
462
+ }
463
+ },
464
+ size: {
465
+ default: 'h-10 px-4 py-2',
466
+ sm: 'h-9 px-3',
467
+ lg: 'h-11 px-8'
468
+ }
469
+ },
470
+ compounds: [
471
+ {
472
+ variant: 'default',
473
+ size: 'lg',
474
+ class: 'text-base font-semibold'
475
+ }
476
+ ],
477
+ defaults: {
478
+ variant: 'default',
479
+ size: 'default'
480
+ }
481
+ })
482
+ });
483
+ ```
484
+
485
+ #### Extending Global Variants
486
+
487
+ Combine global presets with local extensions:
488
+
489
+ ```svelte
490
+ <script lang="ts">
491
+ import { HtmlAtom } from '@svelte-atoms/core';
492
+ import { defineVariants } from '@svelte-atoms/core/utils';
493
+
494
+ // Extend preset variants with local additions
495
+ const extendedVariants = defineVariants({
496
+ variants: {
497
+ variant: {
498
+ // Add new variants not in preset
499
+ gradient: {
500
+ class: 'bg-gradient-to-r from-purple-500 to-pink-500 text-white'
501
+ },
502
+ neon: {
503
+ class: 'bg-black text-green-400 border-2 border-green-400'
504
+ }
505
+ },
506
+ // Add new variant dimension
507
+ animated: {
508
+ true: 'animate-pulse',
509
+ false: ''
510
+ }
511
+ },
512
+ defaults: {
513
+ animated: false
514
+ }
515
+ });
516
+
517
+ let { variant, size, animated, ...props } = $props();
518
+ </script>
519
+
520
+ <HtmlAtom
521
+ preset="button"
522
+ variants={extendedVariants}
523
+ as="button"
524
+ {variant}
525
+ {size}
526
+ {animated}
527
+ {...props}
528
+ >
529
+ {@render children?.()}
530
+ </HtmlAtom>
531
+ ```
532
+
533
+ #### Bond-Reactive Variants
534
+
535
+ Variants can react to component state through the Bond pattern:
536
+
537
+ ```typescript
538
+ const accordionVariants = defineVariants({
539
+ class: 'border rounded-md transition-all',
540
+ variants: {
541
+ state: {
542
+ open: (bond) => ({
543
+ class: bond?.state?.isOpen ? 'bg-blue-50 border-blue-200' : 'bg-white',
544
+ 'aria-expanded': bond?.state?.isOpen,
545
+ 'data-state': bond?.state?.isOpen ? 'open' : 'closed'
546
+ })
547
+ }
548
+ }
549
+ });
550
+
551
+ // Usage with bond
552
+ const bond = AccordionBond.get();
553
+ const variantProps = $derived(accordionVariants(bond, { state: 'open' }));
554
+ ```
555
+
556
+ **Variant Features:**
557
+
558
+ - βœ… **Type Safety** - Automatic TypeScript inference
559
+ - βœ… **Compound Variants** - Apply styles when multiple conditions match
560
+ - βœ… **Default Values** - Specify fallback variant values
561
+ - βœ… **Bond Integration** - Access component state for reactive styling
562
+ - βœ… **Return Attributes** - Not just classes, any HTML attributes
563
+ - βœ… **Extensible** - Combine global presets with local variants
564
+
565
+ ---
566
+
567
+ ## πŸ“– Documentation
568
+
569
+ ### Component Examples
570
+
571
+ #### Dropdown with Multiple Selection
572
+
573
+ ```svelte
574
+ <script lang="ts">
575
+ import { Dropdown } from '@svelte-atoms/core';
576
+
577
+ let selectedValues = ['option1'];
578
+ const options = [
579
+ { value: 'option1', label: 'Option 1' },
580
+ { value: 'option2', label: 'Option 2' },
581
+ { value: 'option3', label: 'Option 3' }
582
+ ];
583
+ </script>
584
+
585
+ <Dropdown.Root multiple bind:values={selectedValues}>
586
+ <!-- Access internal bond -->
587
+ {#snippet children({ dropdown })}
588
+ <Dropdown.Trigger>
589
+ Select options ({selectedValues.length} selected)
590
+ </Dropdown.Trigger>
591
+
592
+ <Dropdown.Content>
593
+ {#each options as option}
594
+ <Dropdown.Item value={option.value}>
595
+ {option.label}
596
+ </Dropdown.Item>
597
+ {/each}
598
+ </Dropdown.Content>
599
+ {/snippet}
600
+ </Dropdown.Root>
601
+ ```
602
+
603
+ #### Form with Validation
604
+
605
+ ```svelte
606
+ <script lang="ts">
607
+ import { Form, Input, Button } from '@svelte-atoms/core';
608
+ import { z } from 'zod';
609
+
610
+ const schema = z.object({
611
+ email: z.string().email('Invalid email address'),
612
+ password: z.string().min(8, 'Password must be at least 8 characters')
613
+ });
614
+
615
+ let formData = { email: '', password: '' };
616
+ let errors = {};
617
+ </script>
618
+
619
+ <Form {schema} bind:value={formData} bind:errors>
620
+ <Field name="email">
621
+ <Field.Label>Email</Field.Label>
622
+ <Field.Control>
623
+ <Input.Root type="email" placeholder="Enter your email" bind:value={formData.email} />
624
+ </Field.Control>
625
+ {#if errors.email}
626
+ <Form.Error>{errors.email}</Form.Error>
627
+ {/if}
628
+ </.Field>
629
+
630
+ <Field name="password">
631
+ <Field.Label>Password</Field.Label>
632
+ <Field.Control>
633
+ <Input.Root
634
+ type="password"
635
+ placeholder="Enter your password"
636
+ bind:value={formData.password}
637
+ />
638
+ </Field.Control>
639
+ {#if errors.password}
640
+ <Field.Error>{errors.password}</Field.Error>
641
+ {/if}
642
+ </.Field>
643
+
644
+ <Button type="submit">Submit</Button>
645
+ </Form>
646
+ ```
647
+
648
+ #### Data Grid with Sorting and Selection
649
+
650
+ ```svelte
651
+ <script lang="ts">
652
+ import { DataGrid, Checkbox } from '@svelte-atoms/core';
653
+
654
+ let data = [
655
+ { id: 1, name: 'John Doe', email: 'john@example.com', role: 'Admin' },
656
+ { id: 2, name: 'Jane Smith', email: 'jane@example.com', role: 'User' },
657
+ { id: 3, name: 'Bob Johnson', email: 'bob@example.com', role: 'Editor' }
658
+ ];
659
+
660
+ let selectedRows = [];
661
+ </script>
662
+
663
+ <DataGrid.Root {data} bind:selectedRows multiple>
664
+ <DataGrid.Header>
665
+ <DataGrid.Tr>
666
+ <DataGrid.Th>
667
+ <Checkbox />
668
+ </DataGrid.Th>
669
+ <DataGrid.Th sortable="name">Name</DataGrid.Th>
670
+ <DataGrid.Th sortable="email">Email</DataGrid.Th>
671
+ <DataGrid.Th>Role</DataGrid.Th>
672
+ </DataGrid.Tr>
673
+ </DataGrid.Header>
674
+
675
+ <DataGrid.Body>
676
+ {#each data as row}
677
+ <DataGrid.Tr value={row.id}>
678
+ <DataGrid.Td>
679
+ <Checkbox.Root value={row.id} />
680
+ </DataGrid.Td>
681
+ <DataGrid.Td>{row.name}</DataGrid.Td>
682
+ <DataGrid.Td>{row.email}</DataGrid.Td>
683
+ <DataGrid.Td>{row.role}</DataGrid.Td>
684
+ </DataGrid.Tr>
685
+ {/each}
686
+ </DataGrid.Body>
687
+ </DataGrid.Root>
688
+ ```
689
+
690
+ ---
691
+
692
+ ## 🎨 Styling
693
+
694
+ @svelte-atoms/core is completely headless, giving you full control over styling. Here are some approaches:
695
+
696
+ ### Using Vanilla CSS
697
+
698
+ ```css
699
+ /* Default button styles */
700
+ .btn {
701
+ @apply rounded-md px-4 py-2 font-medium transition-colors;
702
+ }
703
+
704
+ .btn-primary {
705
+ @apply bg-blue-600 text-white hover:bg-blue-700;
706
+ }
707
+
708
+ .btn-secondary {
709
+ @apply bg-gray-200 text-gray-900 hover:bg-gray-300;
710
+ }
711
+ ```
712
+
713
+ ### Using Tailwind CSS
714
+
715
+ ```svelte
716
+ <Button class="rounded-md bg-blue-600 px-4 py-2 text-white hover:bg-blue-700">Styled Button</Button>
717
+ ```
718
+
719
+ ---
720
+
721
+ ## πŸ§ͺ Development
722
+
723
+ ### Setup
724
+
725
+ 1. **Clone the repository:**
726
+
727
+ ```bash
728
+ git clone https://github.com/ryu-man/svelte-atoms.git
729
+ cd svelte-atoms
730
+ ```
731
+
732
+ 2. **Install dependencies:**
733
+
734
+ ```bash
735
+ bun install
736
+ ```
737
+
738
+ 3. **Start development server:**
739
+
740
+ ```bash
741
+ bun dev
742
+ ```
743
+
744
+ 4. **Run Storybook:**
745
+ ```bash
746
+ bun run storybook:dev
747
+ ```
748
+
749
+ ### Building
750
+
751
+ ```bash
752
+ # Build library
753
+ bun run build
754
+
755
+ # Build Storybook
756
+ bun run storybook:build
757
+ ```
758
+
759
+ ---
760
+
761
+ <!-- ## 🀝 Contributing
762
+
763
+ We welcome contributions! Please see our [Contributing Guide](CONTRIBUTING.md) for details. -->
764
+
765
+ <!-- ### Development Workflow
766
+
767
+ 1. Fork the repository
768
+ 2. Create a feature branch: `git checkout -b feature/amazing-feature`
769
+ 3. Make your changes and add tests
770
+ 4. Run the test suite: `bun test`
771
+ 5. Commit your changes: `git commit -m 'Add amazing feature'`
772
+ 6. Push to the branch: `git push origin feature/amazing-feature`
773
+ 7. Open a Pull Request -->
774
+
775
+ ### Creating New Components
776
+
777
+ When adding new components, follow these guidelines:
778
+
779
+ 1. **Create the bond structure:**
780
+
781
+ ```
782
+ src/lib/atoms/my-component/
783
+ β”œβ”€β”€ bond.svelte.ts # Core bond logic (Bond + BondState classes)
784
+ β”œβ”€β”€ index.ts # Public exports
785
+ β”œβ”€β”€ atoms.ts # Component exports
786
+ β”œβ”€β”€ my-component-root.svelte # Use namespace pattern when building complex component
787
+ β”œβ”€β”€ my-component-content.svelte
788
+ └── README.md # Component documentation
789
+ ```
790
+
791
+ 2. **Implement accessibility features:**
792
+ - ARIA attributes
793
+ - Keyboard navigation
794
+ - Focus management
795
+ - Screen reader support
796
+
797
+ 3. **Add comprehensive tests:**
798
+ - Unit tests for bond logic
799
+ - Component integration tests
800
+ - Accessibility tests
801
+
802
+ 4. **Create Storybook stories:**
803
+ - Basic usage examples
804
+ - Advanced configurations
805
+ - Interactive demos
806
+
807
+ ---
808
+
809
+ ## πŸ“š Resources
810
+
811
+ - **[Documentation](https://svelte-atoms.dev)** - Comprehensive documentation
812
+ - **[Storybook](https://storybook.svelte-atoms.dev/)** - Interactive component documentation
813
+ - **[GitHub](https://github.com/ryu-man/svelte-atoms)** - Source code and issues
814
+ - **[@svelte-atoms/alchemist](../alchimist)** - Data visualization companion library
815
+
816
+ ---
817
+
818
+ ## πŸ—ΊοΈ Roadmap
819
+
820
+ ### v1.0.0 (Current - Alpha)
821
+
822
+ - βœ… Bond architecture with Svelte 5 runes
823
+ - βœ… 35+ essential components
824
+ - βœ… TypeScript support
825
+ - βœ… Accessibility features
826
+ - βœ… Storybook documentation
827
+ - βœ… Standardized context pattern
828
+
829
+ ---
830
+
831
+ ## πŸ“„ License
832
+
833
+ MIT License - see the [LICENSE](LICENSE) file for details.
834
+
835
+ ---
836
+
837
+ ## πŸ™ Acknowledgements
838
+
839
+ - [Svelte](https://svelte.dev/) - The amazing framework that powers this library
840
+ - [Motion](https://motion.dev/) - For handling internal default animations
841
+ - [Floating UI](https://floating-ui.com/) - For advanced positioning logic
842
+ - [Tailwind CSS](https://tailwindcss.com/) - For styling
843
+ - [Storybook](https://storybook.js.org/) - For component documentation and testing
844
+ - [Vitest](https://vitest.dev/) - For fast and reliable testing
845
+ - [Playwright](https://playwright.dev/) - For end-to-end testing
846
+
847
+ ---
848
+
849
+ <div align="center">
850
+ <p>Built with ❀️ by the Svelte Atoms team</p>
851
+ <!-- <p>
852
+ <a href="https://github.com/ryu-man/svelte-atoms">GitHub</a> β€’
853
+ <a href="https://svelte-atoms.dev">Documentation</a> β€’
854
+ <a href="https://storybook.svelte-atoms.dev">Storybook</a>
855
+ </p> -->
856
+ </div>