@marwes-ui/svelte 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (371) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/LICENSE +21 -0
  3. package/README.md +518 -0
  4. package/dist/components/accordion/Accordion.svelte +56 -0
  5. package/dist/components/accordion/Accordion.svelte.d.ts +4 -0
  6. package/dist/components/accordion/AccordionField.svelte +90 -0
  7. package/dist/components/accordion/AccordionField.svelte.d.ts +4 -0
  8. package/dist/components/accordion/FAQAccordion.svelte +21 -0
  9. package/dist/components/accordion/FAQAccordion.svelte.d.ts +20 -0
  10. package/dist/components/accordion/README.md +19 -0
  11. package/dist/components/accordion/SectionsAccordion.svelte +22 -0
  12. package/dist/components/accordion/SectionsAccordion.svelte.d.ts +21 -0
  13. package/dist/components/accordion/SettingsAccordion.svelte +21 -0
  14. package/dist/components/accordion/SettingsAccordion.svelte.d.ts +20 -0
  15. package/dist/components/accordion/index.d.ts +2 -0
  16. package/dist/components/accordion/index.js +1 -0
  17. package/dist/components/accordion/types.d.ts +28 -0
  18. package/dist/components/accordion/types.js +1 -0
  19. package/dist/components/avatar/Avatar.svelte +45 -0
  20. package/dist/components/avatar/Avatar.svelte.d.ts +4 -0
  21. package/dist/components/avatar/AvatarBadge.svelte +47 -0
  22. package/dist/components/avatar/AvatarBadge.svelte.d.ts +7 -0
  23. package/dist/components/avatar/AvatarGroup.svelte +50 -0
  24. package/dist/components/avatar/AvatarGroup.svelte.d.ts +15 -0
  25. package/dist/components/avatar/PresenceAvatar.svelte +12 -0
  26. package/dist/components/avatar/PresenceAvatar.svelte.d.ts +7 -0
  27. package/dist/components/avatar/ProfileAvatar.svelte +7 -0
  28. package/dist/components/avatar/ProfileAvatar.svelte.d.ts +4 -0
  29. package/dist/components/avatar/README.md +19 -0
  30. package/dist/components/avatar/TeamAvatarGroup.svelte +21 -0
  31. package/dist/components/avatar/TeamAvatarGroup.svelte.d.ts +15 -0
  32. package/dist/components/avatar/index.d.ts +2 -0
  33. package/dist/components/avatar/index.js +1 -0
  34. package/dist/components/avatar/types.d.ts +6 -0
  35. package/dist/components/avatar/types.js +1 -0
  36. package/dist/components/badge/Badge.svelte +26 -0
  37. package/dist/components/badge/Badge.svelte.d.ts +4 -0
  38. package/dist/components/badge/BadgeGroup.svelte +25 -0
  39. package/dist/components/badge/BadgeGroup.svelte.d.ts +4 -0
  40. package/dist/components/badge/NotificationBadge.svelte +7 -0
  41. package/dist/components/badge/NotificationBadge.svelte.d.ts +4 -0
  42. package/dist/components/badge/PriorityBadge.svelte +7 -0
  43. package/dist/components/badge/PriorityBadge.svelte.d.ts +4 -0
  44. package/dist/components/badge/README.md +16 -0
  45. package/dist/components/badge/StatusBadge.svelte +7 -0
  46. package/dist/components/badge/StatusBadge.svelte.d.ts +4 -0
  47. package/dist/components/badge/index.d.ts +3 -0
  48. package/dist/components/badge/index.js +2 -0
  49. package/dist/components/badge/types.d.ts +15 -0
  50. package/dist/components/badge/types.js +1 -0
  51. package/dist/components/button/Button.svelte +92 -0
  52. package/dist/components/button/Button.svelte.d.ts +4 -0
  53. package/dist/components/button/CancelButton.svelte +8 -0
  54. package/dist/components/button/CancelButton.svelte.d.ts +5 -0
  55. package/dist/components/button/CloseButton.svelte +8 -0
  56. package/dist/components/button/CloseButton.svelte.d.ts +5 -0
  57. package/dist/components/button/ConfirmButton.svelte +8 -0
  58. package/dist/components/button/ConfirmButton.svelte.d.ts +5 -0
  59. package/dist/components/button/CopyButton.svelte +8 -0
  60. package/dist/components/button/CopyButton.svelte.d.ts +5 -0
  61. package/dist/components/button/CreateButton.svelte +7 -0
  62. package/dist/components/button/CreateButton.svelte.d.ts +5 -0
  63. package/dist/components/button/DestructiveButton.svelte +8 -0
  64. package/dist/components/button/DestructiveButton.svelte.d.ts +5 -0
  65. package/dist/components/button/DownloadButton.svelte +8 -0
  66. package/dist/components/button/DownloadButton.svelte.d.ts +5 -0
  67. package/dist/components/button/DropdownButton.svelte +8 -0
  68. package/dist/components/button/DropdownButton.svelte.d.ts +5 -0
  69. package/dist/components/button/EditButton.svelte +8 -0
  70. package/dist/components/button/EditButton.svelte.d.ts +5 -0
  71. package/dist/components/button/FilterButton.svelte +8 -0
  72. package/dist/components/button/FilterButton.svelte.d.ts +5 -0
  73. package/dist/components/button/LinkButton.svelte +8 -0
  74. package/dist/components/button/LinkButton.svelte.d.ts +5 -0
  75. package/dist/components/button/PrimaryButton.svelte +7 -0
  76. package/dist/components/button/PrimaryButton.svelte.d.ts +5 -0
  77. package/dist/components/button/README.md +21 -0
  78. package/dist/components/button/RefreshButton.svelte +8 -0
  79. package/dist/components/button/RefreshButton.svelte.d.ts +5 -0
  80. package/dist/components/button/SaveButton.svelte +8 -0
  81. package/dist/components/button/SaveButton.svelte.d.ts +5 -0
  82. package/dist/components/button/SearchButton.svelte +8 -0
  83. package/dist/components/button/SearchButton.svelte.d.ts +5 -0
  84. package/dist/components/button/SecondaryButton.svelte +7 -0
  85. package/dist/components/button/SecondaryButton.svelte.d.ts +5 -0
  86. package/dist/components/button/SortButton.svelte +8 -0
  87. package/dist/components/button/SortButton.svelte.d.ts +5 -0
  88. package/dist/components/button/SubmitButton.svelte +7 -0
  89. package/dist/components/button/SubmitButton.svelte.d.ts +5 -0
  90. package/dist/components/button/SuccessButton.svelte +7 -0
  91. package/dist/components/button/SuccessButton.svelte.d.ts +5 -0
  92. package/dist/components/button/TextButton.svelte +7 -0
  93. package/dist/components/button/TextButton.svelte.d.ts +5 -0
  94. package/dist/components/button/UploadButton.svelte +8 -0
  95. package/dist/components/button/UploadButton.svelte.d.ts +5 -0
  96. package/dist/components/button/VerifyButton.svelte +8 -0
  97. package/dist/components/button/VerifyButton.svelte.d.ts +5 -0
  98. package/dist/components/button/index.d.ts +2 -0
  99. package/dist/components/button/index.js +1 -0
  100. package/dist/components/button/types.d.ts +8 -0
  101. package/dist/components/button/types.js +1 -0
  102. package/dist/components/card/Card.svelte +33 -0
  103. package/dist/components/card/Card.svelte.d.ts +4 -0
  104. package/dist/components/card/ProductCard.svelte +6 -0
  105. package/dist/components/card/ProductCard.svelte.d.ts +4 -0
  106. package/dist/components/card/ProfileCard.svelte +6 -0
  107. package/dist/components/card/ProfileCard.svelte.d.ts +4 -0
  108. package/dist/components/card/README.md +15 -0
  109. package/dist/components/card/StatCard.svelte +6 -0
  110. package/dist/components/card/StatCard.svelte.d.ts +4 -0
  111. package/dist/components/card/index.d.ts +2 -0
  112. package/dist/components/card/index.js +1 -0
  113. package/dist/components/card/types.d.ts +10 -0
  114. package/dist/components/card/types.js +1 -0
  115. package/dist/components/checkbox/Checkbox.svelte +54 -0
  116. package/dist/components/checkbox/Checkbox.svelte.d.ts +4 -0
  117. package/dist/components/checkbox/CheckboxField.svelte +74 -0
  118. package/dist/components/checkbox/CheckboxField.svelte.d.ts +4 -0
  119. package/dist/components/checkbox/CheckboxGroupField.svelte +50 -0
  120. package/dist/components/checkbox/CheckboxGroupField.svelte.d.ts +4 -0
  121. package/dist/components/checkbox/README.md +17 -0
  122. package/dist/components/checkbox/index.d.ts +3 -0
  123. package/dist/components/checkbox/index.js +2 -0
  124. package/dist/components/checkbox/types.d.ts +30 -0
  125. package/dist/components/checkbox/types.js +1 -0
  126. package/dist/components/date-picker/DatePicker.svelte +108 -0
  127. package/dist/components/date-picker/DatePicker.svelte.d.ts +4 -0
  128. package/dist/components/date-picker/README.md +17 -0
  129. package/dist/components/date-picker/index.d.ts +2 -0
  130. package/dist/components/date-picker/index.js +1 -0
  131. package/dist/components/date-picker/types.d.ts +13 -0
  132. package/dist/components/date-picker/types.js +1 -0
  133. package/dist/components/dialog/ConfirmDialog.svelte +28 -0
  134. package/dist/components/dialog/ConfirmDialog.svelte.d.ts +4 -0
  135. package/dist/components/dialog/DestructiveDialog.svelte +28 -0
  136. package/dist/components/dialog/DestructiveDialog.svelte.d.ts +4 -0
  137. package/dist/components/dialog/Dialog.svelte +114 -0
  138. package/dist/components/dialog/Dialog.svelte.d.ts +4 -0
  139. package/dist/components/dialog/DialogModal.svelte +120 -0
  140. package/dist/components/dialog/DialogModal.svelte.d.ts +4 -0
  141. package/dist/components/dialog/InfoDialog.svelte +24 -0
  142. package/dist/components/dialog/InfoDialog.svelte.d.ts +4 -0
  143. package/dist/components/dialog/README.md +23 -0
  144. package/dist/components/dialog/index.d.ts +6 -0
  145. package/dist/components/dialog/index.js +5 -0
  146. package/dist/components/dialog/types.d.ts +42 -0
  147. package/dist/components/dialog/types.js +1 -0
  148. package/dist/components/divider/Divider.svelte +25 -0
  149. package/dist/components/divider/Divider.svelte.d.ts +4 -0
  150. package/dist/components/divider/README.md +15 -0
  151. package/dist/components/divider/index.d.ts +2 -0
  152. package/dist/components/divider/index.js +1 -0
  153. package/dist/components/divider/types.d.ts +5 -0
  154. package/dist/components/divider/types.js +1 -0
  155. package/dist/components/heading/H1.svelte +23 -0
  156. package/dist/components/heading/H1.svelte.d.ts +4 -0
  157. package/dist/components/heading/H2.svelte +23 -0
  158. package/dist/components/heading/H2.svelte.d.ts +4 -0
  159. package/dist/components/heading/H3.svelte +23 -0
  160. package/dist/components/heading/H3.svelte.d.ts +4 -0
  161. package/dist/components/heading/README.md +13 -0
  162. package/dist/components/heading/index.d.ts +4 -0
  163. package/dist/components/heading/index.js +3 -0
  164. package/dist/components/heading/types.d.ts +26 -0
  165. package/dist/components/heading/types.js +1 -0
  166. package/dist/components/icon/Icon.svelte +65 -0
  167. package/dist/components/icon/Icon.svelte.d.ts +4 -0
  168. package/dist/components/icon/README.md +18 -0
  169. package/dist/components/icon/index.d.ts +2 -0
  170. package/dist/components/icon/index.js +1 -0
  171. package/dist/components/icon/types.d.ts +12 -0
  172. package/dist/components/icon/types.js +1 -0
  173. package/dist/components/input/CurrencyField.svelte +12 -0
  174. package/dist/components/input/CurrencyField.svelte.d.ts +7 -0
  175. package/dist/components/input/DateOfBirthField.svelte +21 -0
  176. package/dist/components/input/DateOfBirthField.svelte.d.ts +14 -0
  177. package/dist/components/input/DropdownField.svelte +29 -0
  178. package/dist/components/input/DropdownField.svelte.d.ts +14 -0
  179. package/dist/components/input/EmailField.svelte +9 -0
  180. package/dist/components/input/EmailField.svelte.d.ts +7 -0
  181. package/dist/components/input/Input.svelte +49 -0
  182. package/dist/components/input/Input.svelte.d.ts +4 -0
  183. package/dist/components/input/InputField.svelte +139 -0
  184. package/dist/components/input/InputField.svelte.d.ts +4 -0
  185. package/dist/components/input/InputOtp.svelte +140 -0
  186. package/dist/components/input/InputOtp.svelte.d.ts +4 -0
  187. package/dist/components/input/PasswordField.svelte +9 -0
  188. package/dist/components/input/PasswordField.svelte.d.ts +7 -0
  189. package/dist/components/input/PhoneField.svelte +9 -0
  190. package/dist/components/input/PhoneField.svelte.d.ts +7 -0
  191. package/dist/components/input/README.md +24 -0
  192. package/dist/components/input/RichText.svelte +177 -0
  193. package/dist/components/input/RichText.svelte.d.ts +4 -0
  194. package/dist/components/input/RichTextField.svelte +84 -0
  195. package/dist/components/input/RichTextField.svelte.d.ts +4 -0
  196. package/dist/components/input/SearchField.svelte +9 -0
  197. package/dist/components/input/SearchField.svelte.d.ts +7 -0
  198. package/dist/components/input/Select.svelte +88 -0
  199. package/dist/components/input/Select.svelte.d.ts +4 -0
  200. package/dist/components/input/SelectField.svelte +395 -0
  201. package/dist/components/input/SelectField.svelte.d.ts +4 -0
  202. package/dist/components/input/Textarea.svelte +50 -0
  203. package/dist/components/input/Textarea.svelte.d.ts +4 -0
  204. package/dist/components/input/TextareaField.svelte +57 -0
  205. package/dist/components/input/TextareaField.svelte.d.ts +4 -0
  206. package/dist/components/input/URLField.svelte +9 -0
  207. package/dist/components/input/URLField.svelte.d.ts +7 -0
  208. package/dist/components/input/ZipCodeField.svelte +21 -0
  209. package/dist/components/input/ZipCodeField.svelte.d.ts +14 -0
  210. package/dist/components/input/index.d.ts +7 -0
  211. package/dist/components/input/index.js +6 -0
  212. package/dist/components/input/types.d.ts +104 -0
  213. package/dist/components/input/types.js +1 -0
  214. package/dist/components/paragraph/Paragraph.svelte +23 -0
  215. package/dist/components/paragraph/Paragraph.svelte.d.ts +4 -0
  216. package/dist/components/paragraph/README.md +13 -0
  217. package/dist/components/paragraph/index.d.ts +2 -0
  218. package/dist/components/paragraph/index.js +1 -0
  219. package/dist/components/paragraph/types.d.ts +9 -0
  220. package/dist/components/paragraph/types.js +1 -0
  221. package/dist/components/radio/OptionRadioGroup.svelte +52 -0
  222. package/dist/components/radio/OptionRadioGroup.svelte.d.ts +21 -0
  223. package/dist/components/radio/README.md +16 -0
  224. package/dist/components/radio/Radio.svelte +38 -0
  225. package/dist/components/radio/Radio.svelte.d.ts +4 -0
  226. package/dist/components/radio/RadioGroupField.svelte +75 -0
  227. package/dist/components/radio/RadioGroupField.svelte.d.ts +4 -0
  228. package/dist/components/radio/RatingRadioGroup.svelte +51 -0
  229. package/dist/components/radio/RatingRadioGroup.svelte.d.ts +17 -0
  230. package/dist/components/radio/YesNoRadioGroup.svelte +48 -0
  231. package/dist/components/radio/YesNoRadioGroup.svelte.d.ts +16 -0
  232. package/dist/components/radio/index.d.ts +3 -0
  233. package/dist/components/radio/index.js +2 -0
  234. package/dist/components/radio/types.d.ts +22 -0
  235. package/dist/components/radio/types.js +1 -0
  236. package/dist/components/skeleton/README.md +16 -0
  237. package/dist/components/skeleton/Skeleton.svelte +29 -0
  238. package/dist/components/skeleton/Skeleton.svelte.d.ts +4 -0
  239. package/dist/components/skeleton/index.d.ts +2 -0
  240. package/dist/components/skeleton/index.js +1 -0
  241. package/dist/components/skeleton/types.d.ts +6 -0
  242. package/dist/components/skeleton/types.js +1 -0
  243. package/dist/components/slider/BrightnessSlider.svelte +31 -0
  244. package/dist/components/slider/BrightnessSlider.svelte.d.ts +11 -0
  245. package/dist/components/slider/README.md +20 -0
  246. package/dist/components/slider/RadiusSlider.svelte +31 -0
  247. package/dist/components/slider/RadiusSlider.svelte.d.ts +11 -0
  248. package/dist/components/slider/Slider.svelte +67 -0
  249. package/dist/components/slider/Slider.svelte.d.ts +4 -0
  250. package/dist/components/slider/SliderField.svelte +115 -0
  251. package/dist/components/slider/SliderField.svelte.d.ts +4 -0
  252. package/dist/components/slider/VolumeSlider.svelte +31 -0
  253. package/dist/components/slider/VolumeSlider.svelte.d.ts +11 -0
  254. package/dist/components/slider/index.d.ts +2 -0
  255. package/dist/components/slider/index.js +1 -0
  256. package/dist/components/slider/types.d.ts +28 -0
  257. package/dist/components/slider/types.js +1 -0
  258. package/dist/components/spacing/README.md +15 -0
  259. package/dist/components/spacing/Spacer.svelte +8 -0
  260. package/dist/components/spacing/Spacer.svelte.d.ts +3 -0
  261. package/dist/components/spacing/Spacing.svelte +23 -0
  262. package/dist/components/spacing/Spacing.svelte.d.ts +4 -0
  263. package/dist/components/spacing/index.d.ts +3 -0
  264. package/dist/components/spacing/index.js +2 -0
  265. package/dist/components/spacing/types.d.ts +7 -0
  266. package/dist/components/spacing/types.js +1 -0
  267. package/dist/components/spinner/ButtonSpinner.svelte +35 -0
  268. package/dist/components/spinner/ButtonSpinner.svelte.d.ts +4 -0
  269. package/dist/components/spinner/EmptyStateSpinner.svelte +20 -0
  270. package/dist/components/spinner/EmptyStateSpinner.svelte.d.ts +4 -0
  271. package/dist/components/spinner/README.md +19 -0
  272. package/dist/components/spinner/Spinner.svelte +60 -0
  273. package/dist/components/spinner/Spinner.svelte.d.ts +4 -0
  274. package/dist/components/spinner/index.d.ts +3 -0
  275. package/dist/components/spinner/index.js +2 -0
  276. package/dist/components/spinner/types.d.ts +9 -0
  277. package/dist/components/spinner/types.js +1 -0
  278. package/dist/components/stat-tile/README.md +15 -0
  279. package/dist/components/stat-tile/StatTile.svelte +44 -0
  280. package/dist/components/stat-tile/StatTile.svelte.d.ts +4 -0
  281. package/dist/components/stat-tile/index.d.ts +2 -0
  282. package/dist/components/stat-tile/index.js +1 -0
  283. package/dist/components/stat-tile/types.d.ts +14 -0
  284. package/dist/components/stat-tile/types.js +1 -0
  285. package/dist/components/switch/FeatureToggle.svelte +19 -0
  286. package/dist/components/switch/FeatureToggle.svelte.d.ts +13 -0
  287. package/dist/components/switch/PermissionSwitch.svelte +19 -0
  288. package/dist/components/switch/PermissionSwitch.svelte.d.ts +13 -0
  289. package/dist/components/switch/PreferenceSwitch.svelte +19 -0
  290. package/dist/components/switch/PreferenceSwitch.svelte.d.ts +13 -0
  291. package/dist/components/switch/README.md +17 -0
  292. package/dist/components/switch/Switch.svelte +52 -0
  293. package/dist/components/switch/Switch.svelte.d.ts +4 -0
  294. package/dist/components/switch/SwitchField.svelte +71 -0
  295. package/dist/components/switch/SwitchField.svelte.d.ts +4 -0
  296. package/dist/components/switch/index.d.ts +3 -0
  297. package/dist/components/switch/index.js +2 -0
  298. package/dist/components/switch/types.d.ts +20 -0
  299. package/dist/components/switch/types.js +1 -0
  300. package/dist/components/tab/ContentTabs.svelte +11 -0
  301. package/dist/components/tab/ContentTabs.svelte.d.ts +3 -0
  302. package/dist/components/tab/NavigationTabs.svelte +11 -0
  303. package/dist/components/tab/NavigationTabs.svelte.d.ts +3 -0
  304. package/dist/components/tab/README.md +26 -0
  305. package/dist/components/tab/SettingsTabs.svelte +11 -0
  306. package/dist/components/tab/SettingsTabs.svelte.d.ts +3 -0
  307. package/dist/components/tab/Tab.svelte +32 -0
  308. package/dist/components/tab/Tab.svelte.d.ts +4 -0
  309. package/dist/components/tab/TabGroup.svelte +132 -0
  310. package/dist/components/tab/TabGroup.svelte.d.ts +4 -0
  311. package/dist/components/tab/TabPanel.svelte +25 -0
  312. package/dist/components/tab/TabPanel.svelte.d.ts +4 -0
  313. package/dist/components/tab/index.d.ts +7 -0
  314. package/dist/components/tab/index.js +6 -0
  315. package/dist/components/tab/types.d.ts +36 -0
  316. package/dist/components/tab/types.js +1 -0
  317. package/dist/components/toast/ErrorToast.svelte +24 -0
  318. package/dist/components/toast/ErrorToast.svelte.d.ts +4 -0
  319. package/dist/components/toast/InfoToast.svelte +24 -0
  320. package/dist/components/toast/InfoToast.svelte.d.ts +4 -0
  321. package/dist/components/toast/README.md +35 -0
  322. package/dist/components/toast/SuccessToast.svelte +25 -0
  323. package/dist/components/toast/SuccessToast.svelte.d.ts +4 -0
  324. package/dist/components/toast/Toast.svelte +53 -0
  325. package/dist/components/toast/Toast.svelte.d.ts +4 -0
  326. package/dist/components/toast/ToastContainer.svelte +212 -0
  327. package/dist/components/toast/ToastContainer.svelte.d.ts +4 -0
  328. package/dist/components/toast/ToastProvider.svelte +71 -0
  329. package/dist/components/toast/ToastProvider.svelte.d.ts +7 -0
  330. package/dist/components/toast/WarningToast.svelte +24 -0
  331. package/dist/components/toast/WarningToast.svelte.d.ts +4 -0
  332. package/dist/components/toast/index.d.ts +9 -0
  333. package/dist/components/toast/index.js +8 -0
  334. package/dist/components/toast/types.d.ts +48 -0
  335. package/dist/components/toast/types.js +1 -0
  336. package/dist/components/tooltip/README.md +22 -0
  337. package/dist/components/tooltip/Tooltip.svelte +29 -0
  338. package/dist/components/tooltip/Tooltip.svelte.d.ts +4 -0
  339. package/dist/components/tooltip/TooltipGroup.svelte +100 -0
  340. package/dist/components/tooltip/TooltipGroup.svelte.d.ts +4 -0
  341. package/dist/components/tooltip/index.d.ts +3 -0
  342. package/dist/components/tooltip/index.js +2 -0
  343. package/dist/components/tooltip/types.d.ts +22 -0
  344. package/dist/components/tooltip/types.js +1 -0
  345. package/dist/index.d.ts +149 -0
  346. package/dist/index.js +149 -0
  347. package/dist/internal/attrs.d.ts +2 -0
  348. package/dist/internal/attrs.js +5 -0
  349. package/dist/internal/css-vars.d.ts +5 -0
  350. package/dist/internal/css-vars.js +20 -0
  351. package/dist/internal/merge-class.d.ts +1 -0
  352. package/dist/internal/merge-class.js +4 -0
  353. package/dist/internal/svg-attrs.d.ts +9 -0
  354. package/dist/internal/svg-attrs.js +16 -0
  355. package/dist/provider/MarwesProvider.svelte +186 -0
  356. package/dist/provider/MarwesProvider.svelte.d.ts +4 -0
  357. package/dist/provider/context.d.ts +3 -0
  358. package/dist/provider/context.js +12 -0
  359. package/dist/provider/runtime-theme.d.ts +5 -0
  360. package/dist/provider/runtime-theme.js +63 -0
  361. package/dist/provider/theme-mode-runtime.d.ts +15 -0
  362. package/dist/provider/theme-mode-runtime.js +84 -0
  363. package/dist/provider/types.d.ts +32 -0
  364. package/dist/provider/types.js +1 -0
  365. package/dist/provider/use-theme-mode.d.ts +24 -0
  366. package/dist/provider/use-theme-mode.js +38 -0
  367. package/dist/provider/use-theme.d.ts +15 -0
  368. package/dist/provider/use-theme.js +19 -0
  369. package/dist/ssr.d.ts +2 -0
  370. package/dist/ssr.js +1 -0
  371. package/package.json +59 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,42 @@
1
+ # @marwes-ui/svelte
2
+
3
+ ## 1.3.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#37](https://github.com/niklas-westman/marwes/pull/37) [`cc771ca`](https://github.com/niklas-westman/marwes/commit/cc771cac66b833a7b7e40f6402d406982119275d) Thanks [@niklas-westman](https://github.com/niklas-westman)! - Release 1.3.0 — Svelte adapter and cross-framework alignment.
8
+
9
+ **@marwes-ui/svelte (new)**
10
+ New public Svelte 5 adapter with 112 component exports across 24 component families.
11
+ Full parity with React and Vue adapters. Ships MarwesProvider, useTheme, useThemeMode,
12
+ useToast, and SSR helpers.
13
+
14
+ **@marwes-ui/presets**
15
+
16
+ - Badge: neutral label uses text/secondary (#595959), warning label uses direct Amber/700 (#B45309)
17
+ - Tab: transparent background, text/primary label, opacity-based hover (5% text color)
18
+ - Toast: subtle icon fallbacks (#595959 light / #A3A3A3 dark), warning text aligned with badge/stat-tile, dark mode intent colors show through in text/action
19
+ - Toast/StatTile: small action and trend text now use readable status text tokens so Storybook a11y smoke passes color contrast in light and dark mode
20
+ - Spinner: dots-round, dots-square, lines use per-segment opacity cycling (no SVG rotation)
21
+ - Accordion/Toast: dark mode surface set to #0F0F0F
22
+
23
+ **@marwes-ui/react / @marwes-ui/vue**
24
+
25
+ - Storybook theme toggle synced with iframe background
26
+ - All stories aligned across React, Svelte, and Vue
27
+ - Added storybook alignment audit script
28
+
29
+ **@marwes-ui/core**
30
+
31
+ - EditButton, VerifyButton, RefreshButton default icons added to Svelte adapter
32
+
33
+ ### Patch Changes
34
+
35
+ - Updated dependencies [[`cc771ca`](https://github.com/niklas-westman/marwes/commit/cc771cac66b833a7b7e40f6402d406982119275d)]:
36
+ - @marwes-ui/core@1.3.0
37
+
38
+ ## 1.2.0
39
+
40
+ ### Minor Changes
41
+
42
+ - Initial release of `@marwes-ui/svelte` — native Svelte 5 adapter over `@marwes-ui/core`.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Niklas Westman, Martino Ognissanti and contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,518 @@
1
+ Svelte 5 components for the Marwes design system with default styling, typed theme tokens, accessibility contracts, and AI-readable semantics.
2
+
3
+ <div align="center">
4
+
5
+ <img alt="Marwes Design System" src="https://raw.githubusercontent.com/niklas-westman/marwes/main/.github/assets/cover-v3.png" width="100%" style="border-radius: 40px;">
6
+
7
+ <br>
8
+ <br>
9
+
10
+ # Marwes Design System - Svelte
11
+
12
+ **Svelte 5 components with default Marwes styling, typed theme tokens, accessibility contracts, and AI-readable semantics built in.**
13
+
14
+ Svelte 5 • TypeScript-first • Default CSS included • ThemeInput • Google Fonts DX • Purpose components
15
+
16
+ [Documentation](https://github.com/niklas-westman/marwes/tree/main/docs) • [Svelte Storybook](https://storybook-svelte.marwes.io/latest/) • [GitHub](https://github.com/niklas-westman/marwes)
17
+
18
+ </div>
19
+
20
+ ---
21
+
22
+ ## Why Use It
23
+
24
+ Marwes gives Svelte apps a ready design-system base without requiring custom CSS setup or local component forks.
25
+
26
+ - **One package for Svelte apps**: components, provider, default preset CSS, theme helpers, and typed props.
27
+ - **Svelte-native binding**: common controls support `bind:value` and `bind:checked` while preserving Marwes semantic contracts.
28
+ - **Runes-first**: built entirely on Svelte 5 runes (`$props`, `$state`, `$derived`, `$effect`, `$bindable`) — no legacy stores or lifecycle hooks.
29
+ - **Consequential theming**: a `ThemeInput` object changes colors, fonts, radius, density, typography, and component visuals through shared CSS variables.
30
+ - **Purpose components**: `SubmitButton`, `CancelButton`, and `DestructiveButton` make intent machine-readable so tests, audits, and AI agents can handle actions safely.
31
+ - **Shared core contracts**: every Svelte component is backed by the same framework-agnostic recipes, a11y mapping, and theme shape used by React and Vue.
32
+
33
+ ## Package Map
34
+
35
+ For a Svelte app, install this package first. It includes the Svelte adapter, loads the default preset CSS, and re-exports the core theme helpers you normally need.
36
+
37
+ | Package | Use it when |
38
+ | --- | --- |
39
+ | `@marwes-ui/svelte` | You are building a Svelte app. |
40
+ | `@marwes-ui/react` | You are building a React app instead. |
41
+ | `@marwes-ui/vue` | You are building a Vue app instead. |
42
+ | `@marwes-ui/core` | You are building adapters, tests, tooling, or framework-agnostic integrations. |
43
+ | `@marwes-ui/presets` | You need standalone preset CSS or preset theme exports. |
44
+
45
+ This split keeps installation simple for app teams while giving humans and AI agents clear package boundaries: adapters render, core defines contracts, presets style.
46
+
47
+ ## Install
48
+
49
+ ```bash
50
+ pnpm add @marwes-ui/svelte
51
+ ```
52
+
53
+ No preset CSS import is needed. `@marwes-ui/svelte` depends on `@marwes-ui/presets` and loads the default Marwes CSS automatically.
54
+
55
+ ## Quick Start
56
+
57
+ ```svelte
58
+ <script lang="ts">
59
+ import {
60
+ Button,
61
+ ButtonVariant,
62
+ Checkbox,
63
+ Input,
64
+ MarwesProvider,
65
+ SubmitButton,
66
+ } from "@marwes-ui/svelte"
67
+
68
+ let email = $state("")
69
+ let subscribed = $state(false)
70
+ </script>
71
+
72
+ <MarwesProvider>
73
+ <Input bind:value={email} placeholder="Email" ariaLabel="Email" />
74
+ <Checkbox bind:checked={subscribed} ariaLabel="Subscribe" />
75
+ <Button variant={ButtonVariant.secondary}>Preview</Button>
76
+ <SubmitButton>Save</SubmitButton>
77
+ </MarwesProvider>
78
+ ```
79
+
80
+ ## Style App-Owned UI
81
+
82
+ Marwes components pick up provider tokens automatically. Your own Svelte styling can use the same tokens through scoped styles, global CSS, or `mwThemeVars` in script-driven style objects.
83
+
84
+ ```svelte
85
+ <script lang="ts">
86
+ import { Button, ButtonVariant, MarwesProvider, mwThemeVars } from "@marwes-ui/svelte"
87
+
88
+ const panelStyle = `
89
+ padding: ${mwThemeVars.spacing.sp24};
90
+ background: ${mwThemeVars.color.surface};
91
+ color: ${mwThemeVars.color.text};
92
+ border: 1px solid ${mwThemeVars.color.border};
93
+ border-radius: ${mwThemeVars.ui.radius};
94
+ `
95
+ </script>
96
+
97
+ <MarwesProvider>
98
+ <main class="app-shell">
99
+ <aside class="primary-callout">Launch workspace</aside>
100
+ <section style={panelStyle}>
101
+ <Button variant={ButtonVariant.primary}>Save</Button>
102
+ </section>
103
+ </main>
104
+ </MarwesProvider>
105
+
106
+ <style>
107
+ .app-shell {
108
+ min-height: 100dvh;
109
+ padding: var(--mw-spacing-sp-24);
110
+ color: var(--mw-color-text);
111
+ background: var(--mw-color-background);
112
+ }
113
+
114
+ .primary-callout {
115
+ background: var(--mw-color-primary-base);
116
+ color: var(--mw-color-primary-label);
117
+ }
118
+ </style>
119
+ ```
120
+
121
+ ## Use Typed Components
122
+
123
+ Import components, enums, and prop types from the same package. The values line up with the same core recipes and preset CSS.
124
+
125
+ ```svelte
126
+ <script lang="ts">
127
+ import {
128
+ BadgeVariant,
129
+ Button,
130
+ ButtonSize,
131
+ ButtonVariant,
132
+ Card,
133
+ H1,
134
+ InputField,
135
+ Paragraph,
136
+ Spacer,
137
+ Spacings,
138
+ StatusBadge,
139
+ SubmitButton,
140
+ type ButtonProps,
141
+ type H1Props,
142
+ type InputFieldProps,
143
+ type ParagraphProps,
144
+ } from "@marwes-ui/svelte"
145
+ </script>
146
+
147
+ <Card title="Project setup">
148
+ <StatusBadge variant={BadgeVariant.success}>Ready</StatusBadge>
149
+ <Spacer spacing={Spacings.sp16} />
150
+ <H1 size="h2">Launch workspace</H1>
151
+ <Paragraph size="md">
152
+ Components share theme tokens, typed variants, spacing, and semantic metadata.
153
+ </Paragraph>
154
+ <InputField
155
+ label="Email"
156
+ helperText="Used for project notifications."
157
+ input={{ type: "email", placeholder: "you@example.com" }}
158
+ />
159
+ <Spacer spacing={Spacings.sp24} />
160
+ <Button variant={ButtonVariant.primary} size={ButtonSize.md}>Create project</Button>
161
+ <SubmitButton>Save changes</SubmitButton>
162
+ </Card>
163
+ ```
164
+
165
+ ## Available Components
166
+
167
+ Provider and hooks:
168
+ - `MarwesProvider`
169
+ - `useTheme`
170
+ - `useToast`
171
+
172
+ Actions and buttons:
173
+ - `Button`
174
+ - `PrimaryButton`, `SecondaryButton`, `TextButton`, `SuccessButton`
175
+ - `SubmitButton`, `CancelButton`, `CreateButton`, `DestructiveButton`
176
+ - `LinkButton`, `SaveButton`, `ConfirmButton`, `VerifyButton`
177
+ - `EditButton`, `CloseButton`, `RefreshButton`
178
+ - `UploadButton`, `DownloadButton`, `CopyButton`
179
+ - `SearchButton`, `FilterButton`, `SortButton`, `DropdownButton`
180
+
181
+ Forms and inputs:
182
+ - `Input`, `Textarea`, `Select`, `RichText`, `InputOtp`
183
+ - `InputField`, `TextareaField`, `SelectField`, `RichTextField`
184
+ - `DropdownField`, `SearchField`, `PasswordField`, `EmailField`
185
+ - `DateOfBirthField`, `ZipCodeField`, `PhoneField`, `URLField`, `CurrencyField`
186
+ - `Checkbox`, `CheckboxField`, `CheckboxGroupField`
187
+ - `Radio`, `RadioGroupField`, `YesNoRadioGroup`, `RatingRadioGroup`, `OptionRadioGroup`
188
+ - `Switch`, `SwitchField`, `FeatureToggle`, `PreferenceSwitch`, `PermissionSwitch`
189
+ - `Slider`, `SliderField`, `VolumeSlider`, `BrightnessSlider`, `RadiusSlider`
190
+
191
+ Content and layout:
192
+ - `Card`, `ProductCard`, `ProfileCard`, `StatCard`
193
+ - `H1`, `H2`, `H3`, `Paragraph`
194
+ - `Spacer`, `Spacing`, `Divider`
195
+ - `Icon`
196
+ - `Avatar`, `AvatarBadge`, `AvatarGroup`, `ProfileAvatar`, `PresenceAvatar`, `TeamAvatarGroup`
197
+
198
+ Feedback and overlays:
199
+ - `Badge`, `BadgeGroup`, `StatusBadge`, `PriorityBadge`, `NotificationBadge`
200
+ - `Spinner`, `ButtonSpinner`, `EmptyStateSpinner`
201
+ - `Toast`, `ToastContainer`, `ToastProvider`
202
+ - `SuccessToast`, `ErrorToast`, `WarningToast`, `InfoToast`
203
+ - `Tooltip`, `TooltipGroup`
204
+ - `Dialog`, `DialogModal`, `ConfirmDialog`, `DestructiveDialog`, `InfoDialog`
205
+ - `Accordion`, `AccordionField`, `FAQAccordion`, `SettingsAccordion`, `SectionsAccordion`
206
+ - `Tab`, `TabGroup`, `TabPanel`, `NavigationTabs`, `ContentTabs`, `SettingsTabs`
207
+
208
+ Typed tokens and helpers:
209
+ - `ThemeInput`, `ThemeMode`, `Density`, `ToneName`
210
+ - `mwAvailableFonts`, `mwGoogleFontFamilies`, `mwFontFallbacks`, `createFontStack`
211
+ - `mwThemeVars`, `mwThemeVarNames`, `mwStyledTheme`, `mwVar`
212
+ - `ButtonVariant`, `ButtonSize`, `ButtonAction`
213
+ - `BadgeVariant`, `AvatarSize`, `AvatarType`, `SwitchSize`, `IconName`, `Spacings`
214
+
215
+ ## Theme In Seconds
216
+
217
+ The default Marwes theme is already active. If you already have a good-looking design library or brand system, pass a small typed `ThemeInput` override instead of rebuilding component CSS.
218
+
219
+ ```svelte
220
+ <script lang="ts">
221
+ import { MarwesProvider, mwAvailableFonts, type ThemeInput } from "@marwes-ui/svelte"
222
+
223
+ const brandTheme = {
224
+ color: {
225
+ primary: "#2457FF",
226
+ danger: "#D90429",
227
+ success: "#15803D",
228
+ warning: "#D97706",
229
+ background: "#F8FAFC",
230
+ surface: "#FFFFFF",
231
+ surfaceElevated: "#FFFFFF",
232
+ text: "#111827",
233
+ textMuted: "#4B5563",
234
+ border: "#D1D5DB",
235
+ focus: "#2457FF",
236
+ },
237
+ font: {
238
+ primary: mwAvailableFonts.Poppins,
239
+ secondary: mwAvailableFonts.Lora,
240
+ },
241
+ ui: {
242
+ radius: 10,
243
+ density: "comfortable",
244
+ },
245
+ } satisfies ThemeInput
246
+ </script>
247
+
248
+ <MarwesProvider theme={brandTheme}>
249
+ <slot />
250
+ </MarwesProvider>
251
+ ```
252
+
253
+ The provider resolves `ThemeInput` into `--mw-*` CSS variables. Preset CSS consumes those variables across the full component system.
254
+
255
+ Marwes is designed to look great from the beginning. Start with the default preset, then override only the colors, fonts, radius, or density that belong to your product. Unspecified values keep the polished Marwes defaults.
256
+
257
+ ## Light And Dark Mode
258
+
259
+ MarwesProvider can own the active mode for the app. Use `ThemeMode.light` and `ThemeMode.dark` instead of string literals, then read or change the active mode with `useThemeMode()` anywhere under the provider. Every component under the provider receives the matching `--mw-*` variables and `mw-theme--light` / `mw-theme--dark` class.
260
+
261
+ ```svelte
262
+ <script lang="ts">
263
+ import { Button, ButtonVariant, ThemeMode, useThemeMode } from "@marwes-ui/svelte"
264
+
265
+ const { mode, toggleMode } = useThemeMode()
266
+ </script>
267
+
268
+ <Button variant={ButtonVariant.secondary} onclick={toggleMode}>
269
+ Use {mode === ThemeMode.dark ? ThemeMode.light : ThemeMode.dark} mode
270
+ </Button>
271
+ ```
272
+
273
+ ```svelte
274
+ <script lang="ts">
275
+ import { MarwesProvider, ThemeMode } from "@marwes-ui/svelte"
276
+ </script>
277
+
278
+ <MarwesProvider defaultMode={ThemeMode.light}>
279
+ <slot />
280
+ </MarwesProvider>
281
+ ```
282
+
283
+ `defaultMode` sets the initial uncontrolled mode. `toggleMode()` updates the provider, so Marwes components, preset CSS, and custom app styles that use `--mw-*` variables all move together without duplicating local theme state.
284
+
285
+ ### System And Persisted Preference
286
+
287
+ `mode` is always the rendered visual mode: `ThemeMode.light` or `ThemeMode.dark`. `preference` is the app or user choice: `ThemeMode.light`, `ThemeMode.dark`, or `"system"`. Use `preference` and `defaultPreference` when your UI needs a system option; keep using `mode`, `defaultMode`, and `onModeChange` when you only need concrete light/dark compatibility.
288
+
289
+ ```svelte
290
+ <script lang="ts">
291
+ import { Button, ButtonVariant, ThemeMode, useThemeMode } from "@marwes-ui/svelte"
292
+
293
+ const { mode, preference, systemMode, isSystem, setPreference, setMode } = useThemeMode()
294
+ </script>
295
+
296
+ <p>Rendering {mode}; preference is {preference}; system is {systemMode}.</p>
297
+ <Button variant={ButtonVariant.secondary} onclick={() => setPreference("system")}>
298
+ Use system
299
+ </Button>
300
+ <Button variant={ButtonVariant.secondary} onclick={() => setMode(ThemeMode.dark)}>
301
+ Use dark
302
+ </Button>
303
+ {#if isSystem}
304
+ <span>Following system</span>
305
+ {/if}
306
+ ```
307
+
308
+ ```svelte
309
+ <script lang="ts">
310
+ import { MarwesProvider } from "@marwes-ui/svelte"
311
+ </script>
312
+
313
+ <MarwesProvider defaultPreference="system" storageKey="marwes-theme" enableSystem>
314
+ <slot />
315
+ </MarwesProvider>
316
+ ```
317
+
318
+ `useThemeMode().mode` never returns `"system"`; it is always the concrete mode Marwes rendered. `useThemeMode().preference` returns the active app/user preference, and `setPreference("system")` is the system-capable setter. `setMode(mode)` remains a concrete light/dark convenience.
319
+
320
+ `storageKey` is opt-in and defaults to `false`. Storage reads and writes are failure-safe, so private browsing or unavailable storage will fall back to normal provider state. `enableSystem` defaults to `true`; set it to `false` to avoid `matchMedia` detection and resolve `"system"` through the light fallback.
321
+
322
+ ### Root Target Sync
323
+
324
+ By default Marwes keeps theme state scoped to the provider element. If your app shell also needs the resolved mode on `html` or `body`, set `target` and `attribute`:
325
+
326
+ ```svelte
327
+ <MarwesProvider
328
+ defaultPreference="system"
329
+ storageKey="marwes-theme"
330
+ target="html"
331
+ attribute="class"
332
+ disableTransitionOnChange
333
+ >
334
+ <slot />
335
+ </MarwesProvider>
336
+ ```
337
+
338
+ `target` can be `"provider"`, `"html"`, or `"body"`. `attribute` can be `"class"`, `"data-theme"`, or `"data-mode"`. Class mode only adds the active `light` / `dark` class and removes the opposite one; unrelated classes are preserved.
339
+
340
+ ### SvelteKit SSR
341
+
342
+ Use `createMarwesThemeStyle()` and `createMarwesThemeScript()` when a server-rendered app needs the correct light or dark variables before hydration. Import from the `/ssr` subpath:
343
+
344
+ ```ts
345
+ import { createMarwesThemeScript, createMarwesThemeStyle } from "@marwes-ui/svelte/ssr"
346
+ ```
347
+
348
+ Read the [theme SSR no-flash guide](https://github.com/niklas-westman/marwes/blob/main/docs/guides/theme-ssr-no-flash.md) for SvelteKit setup, CSP nonces, custom light/dark themes, and stored/system preference behavior.
349
+
350
+ ## Custom Styling Tokens
351
+
352
+ `MarwesProvider` resolves `ThemeInput` into `--mw-*` CSS variables. Marwes components and preset CSS consume those variables automatically. The custom styling token helpers let app-owned Svelte styles use the same provider-scoped values.
353
+
354
+ Svelte style blocks can consume provider variables directly:
355
+
356
+ ```svelte
357
+ <style>
358
+ .panel {
359
+ padding: var(--mw-spacing-sp-24);
360
+ color: var(--mw-color-text);
361
+ background: var(--mw-color-surface);
362
+ border-radius: var(--mw-ui-radius);
363
+ }
364
+ </style>
365
+ ```
366
+
367
+ For script-driven style objects, import the core helpers:
368
+
369
+ - `mwThemeVars` returns CSS `var(...)` references for inline styles and config files.
370
+ - `mwThemeVarNames` returns raw custom property names for assigning provider-scoped overrides.
371
+ - `mwVar()` wraps custom `--mw-*` names when the named token object does not cover a case.
372
+
373
+ ```ts
374
+ import { mwThemeVarNames, mwThemeVars, mwVar } from "@marwes-ui/svelte"
375
+
376
+ const panelStyle = `
377
+ padding: ${mwThemeVars.spacing.sp24};
378
+ color: ${mwThemeVars.color.text};
379
+ outline-color: ${mwVar("--mw-color-focus", "#2457FF")};
380
+ `
381
+ ```
382
+
383
+ Keep the APIs separate:
384
+ - Use `Spacings.sp24` for Marwes spacing props such as `<Spacer spacing={Spacings.sp24} />`.
385
+ - Use `mwThemeVars.spacing.sp24` for custom CSS values.
386
+ - Use `mwThemeVarNames.spacing.sp24` when assigning or inspecting a CSS custom property name.
387
+ - Use `useTheme()` when Svelte logic needs resolved runtime values such as `"#2457FF"`.
388
+
389
+ ## Svelte Binding Conventions
390
+
391
+ - Text-like controls support `bind:value` through `$bindable()`.
392
+ - Checkboxes support `bind:checked` and `oncheckedchange`.
393
+ - Switches fire `oncheckedchange` callbacks.
394
+ - Dialog modals support `bind:open` for two-way open state.
395
+ - Snippets replace React render props — use `{#snippet footer({ close })}...{/snippet}` for dialog footers and similar patterns.
396
+
397
+ Prefer `bind:` in normal Svelte app code unless you specifically need callback-style wiring.
398
+
399
+ ## Google Fonts DX
400
+
401
+ Most Google Font use cases only need `mwAvailableFonts`; no `fontLoading` prop is needed.
402
+
403
+ ```svelte
404
+ <script lang="ts">
405
+ import { MarwesProvider, mwAvailableFonts, type ThemeInput } from "@marwes-ui/svelte"
406
+
407
+ const fontTheme = {
408
+ font: {
409
+ primary: mwAvailableFonts.Poppins,
410
+ secondary: mwAvailableFonts.Lora,
411
+ },
412
+ } satisfies ThemeInput
413
+ </script>
414
+
415
+ <MarwesProvider theme={fontTheme}>
416
+ <slot />
417
+ </MarwesProvider>
418
+ ```
419
+
420
+ For self-hosted or licensed fonts, use `BrandSans`, `BrandSerif`, `BrandMono`, or `createFontStack()`.
421
+
422
+ ## Purpose Components
423
+
424
+ Prefer purpose components for common actions. They lock UX intent and emit AI-readable metadata, so the component is not just "a button with red styling" but a known action with known risk.
425
+
426
+ ```svelte
427
+ <script lang="ts">
428
+ import {
429
+ CancelButton,
430
+ CreateButton,
431
+ DestructiveButton,
432
+ SubmitButton,
433
+ } from "@marwes-ui/svelte"
434
+ </script>
435
+
436
+ <CancelButton>Cancel</CancelButton>
437
+ <CreateButton>Create</CreateButton>
438
+ <SubmitButton>Save</SubmitButton>
439
+ <DestructiveButton>Delete</DestructiveButton>
440
+ ```
441
+
442
+ That matters for agentic workflows. A human, test, or AI agent can inspect the DOM and see that a destructive button requires confirmation before activation:
443
+
444
+ ```html
445
+ <button
446
+ data-component="button"
447
+ data-purpose="destructive"
448
+ data-action="delete"
449
+ data-destructive="true"
450
+ data-confirmation-required="true"
451
+ >
452
+ Delete
453
+ </button>
454
+ ```
455
+
456
+ An agent can then follow a safer rule: if `data-confirmation-required="true"`, ask the user before clicking. A test can assert the same behavior without guessing from the label "Delete" or from a red color.
457
+
458
+ ## Why It Is Accessible
459
+
460
+ Marwes Svelte components are accessible because the adapter renders a shared core contract, not because each component hand-rolls ARIA in isolation.
461
+
462
+ - Core recipes produce typed `a11y` output for roles, labels, described-by wiring, invalid state, disabled state, and semantic metadata.
463
+ - Svelte components prefer native DOM controls first: `button`, `input`, `select`, `textarea`, `hr`, and standard form wiring.
464
+ - Field components connect visible labels, helper text, and errors through `id`, `for`, `aria-describedby`, `aria-invalid`, and polite error announcements.
465
+ - Coordinated widgets carry explicit contracts: tabs wire `tablist`/`tab`/`tabpanel`, dialogs own dialog semantics, toasts expose live-region behavior, and purpose buttons expose risk metadata.
466
+ - Storybook accessibility smoke checks run through the Storybook a11y addon for the promoted Svelte families, and shared contract tests keep Svelte aligned with React and Vue.
467
+
468
+ Example:
469
+
470
+ ```svelte
471
+ <script lang="ts">
472
+ import { InputField } from "@marwes-ui/svelte"
473
+ </script>
474
+
475
+ <InputField
476
+ label="Email"
477
+ helperText="Used for receipts."
478
+ error="Enter a valid email."
479
+ input={{ type: "email", placeholder: "you@example.com" }}
480
+ />
481
+ ```
482
+
483
+ That contract resolves to DOM wiring like:
484
+
485
+ ```html
486
+ <label for="email">Email</label>
487
+ <input
488
+ id="email"
489
+ type="email"
490
+ aria-describedby="email-helper email-error"
491
+ aria-invalid="true"
492
+ >
493
+ <p id="email-helper">Used for receipts.</p>
494
+ <p id="email-error" aria-live="polite">Enter a valid email.</p>
495
+ ```
496
+
497
+ The important part is that the same label, helper, error, and invalid contract is tested at the shared contract layer and then applied by the Svelte adapter.
498
+
499
+ ## Package Boundaries
500
+
501
+ - `@marwes-ui/core` owns recipes, theme resolution, a11y mapping, and semantic metadata.
502
+ - `@marwes-ui/presets` owns default preset CSS.
503
+ - `@marwes-ui/svelte` owns Svelte rendering and provider behavior.
504
+
505
+ ## Scripts
506
+
507
+ ```bash
508
+ pnpm --filter @marwes-ui/svelte build
509
+ pnpm --filter @marwes-ui/svelte test:typecheck
510
+ pnpm --filter @marwes-ui/svelte test
511
+ ```
512
+
513
+ ## Related Docs
514
+
515
+ - [Docs index](https://github.com/niklas-westman/marwes/tree/main/docs)
516
+ - [Svelte adapter guide](https://github.com/niklas-westman/marwes/blob/main/docs/guides/svelte-adapter.md)
517
+ - [Architecture](https://github.com/niklas-westman/marwes/blob/main/docs/reference/architecture.md)
518
+ - [Figma to Marwes](https://github.com/niklas-westman/marwes/blob/main/docs/guides/figma-to-marwes.md)
@@ -0,0 +1,56 @@
1
+ <script lang="ts">
2
+ import { createAccordionRecipe } from "@marwes-ui/core";
3
+ import { mergeClass } from "../../internal/merge-class.js";
4
+ import type { AccordionProps } from "./types.js";
5
+
6
+ let {
7
+ id: idProp,
8
+ open = false,
9
+ disabled = false,
10
+ title,
11
+ children,
12
+ class: className,
13
+ ontoggle,
14
+ }: AccordionProps = $props();
15
+
16
+ const uniqueId = $props.id();
17
+ const resolvedId = $derived(idProp ?? `mw-accordion-${uniqueId}`);
18
+
19
+ const kit = $derived(createAccordionRecipe({
20
+ id: resolvedId,
21
+ ...(open ? { open } : {}),
22
+ ...(disabled ? { disabled } : {}),
23
+ }));
24
+ const mergedClass = $derived(mergeClass(kit.className, className));
25
+
26
+ function handleTriggerClick(): void {
27
+ if (disabled) return;
28
+ ontoggle?.();
29
+ }
30
+ </script>
31
+
32
+ <div class={mergedClass}>
33
+ <button
34
+ id={kit.a11y.triggerId}
35
+ type="button"
36
+ class="mw-accordion__trigger"
37
+ aria-expanded={kit.a11y.ariaExpanded}
38
+ aria-controls={kit.a11y.panelId}
39
+ aria-disabled={kit.a11y.ariaDisabled}
40
+ {disabled}
41
+ onclick={handleTriggerClick}
42
+ >
43
+ <span class="mw-accordion__title">{title}</span>
44
+ <span class="mw-accordion__icon" aria-hidden="true"></span>
45
+ </button>
46
+ <section
47
+ id={kit.a11y.panelId}
48
+ aria-labelledby={kit.a11y.triggerId}
49
+ class="mw-accordion__panel"
50
+ hidden={!open}
51
+ >
52
+ <div class="mw-accordion__content">
53
+ {@render children?.()}
54
+ </div>
55
+ </section>
56
+ </div>
@@ -0,0 +1,4 @@
1
+ import type { AccordionProps } from "./types.js";
2
+ declare const Accordion: import("svelte").Component<AccordionProps, {}, "">;
3
+ type Accordion = ReturnType<typeof Accordion>;
4
+ export default Accordion;