@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
@@ -0,0 +1,114 @@
1
+ <script lang="ts">
2
+ import { IconName, createDialogRecipe } from "@marwes-ui/core";
3
+ import type { DialogOptions } from "@marwes-ui/core";
4
+ import { mergeClass } from "../../internal/merge-class.js";
5
+ import Icon from "../icon/Icon.svelte";
6
+ import type { DialogProps } from "./types.js";
7
+
8
+ let {
9
+ id: userProvidedId,
10
+ title,
11
+ description,
12
+ children,
13
+ footer,
14
+ onclose,
15
+ class: className,
16
+ dataAttributes,
17
+ size,
18
+ showFooter,
19
+ dismissible,
20
+ modal,
21
+ ariaLabel,
22
+ ariaLabelledBy,
23
+ ariaDescribedBy,
24
+ }: DialogProps = $props();
25
+
26
+ const uniqueId = $props.id();
27
+ const dialogId = $derived(userProvidedId ?? `mw-dialog-${uniqueId}`);
28
+ const titleId = $derived(`${dialogId}-title`);
29
+ const descriptionId = $derived(`${dialogId}-description`);
30
+
31
+ const hasTitle = $derived(title !== undefined && title.trim().length > 0);
32
+ const hasDescription = $derived(description !== undefined && description.trim().length > 0);
33
+ const hasFooter = $derived((showFooter ?? true) && footer !== undefined);
34
+ const isDismissible = $derived((dismissible ?? true) && onclose !== undefined);
35
+
36
+ const dialogOptions = $derived.by((): DialogOptions => {
37
+ const opts: DialogOptions = {
38
+ showFooter: hasFooter,
39
+ dismissible: isDismissible,
40
+ };
41
+ if (modal !== undefined) opts.modal = modal;
42
+ if (dataAttributes !== undefined) opts.dataAttributes = dataAttributes;
43
+ if (size !== undefined) opts.size = size;
44
+ if (ariaLabel !== undefined) opts.ariaLabel = ariaLabel;
45
+ if (ariaLabelledBy !== undefined) {
46
+ opts.ariaLabelledBy = ariaLabelledBy;
47
+ } else if (ariaLabel === undefined && hasTitle) {
48
+ opts.ariaLabelledBy = titleId;
49
+ }
50
+ if (ariaDescribedBy !== undefined) {
51
+ opts.ariaDescribedBy = ariaDescribedBy;
52
+ } else if (hasDescription) {
53
+ opts.ariaDescribedBy = descriptionId;
54
+ }
55
+ return opts;
56
+ });
57
+
58
+ const kit = $derived(createDialogRecipe(dialogOptions));
59
+ const mergedClass = $derived(mergeClass(kit.className, className));
60
+
61
+ function handleClose(): void {
62
+ onclose?.();
63
+ }
64
+ </script>
65
+
66
+ <section
67
+ id={dialogId}
68
+ class={mergedClass}
69
+ role={kit.a11y.role}
70
+ aria-modal={kit.a11y.ariaModal ? "true" : undefined}
71
+ aria-label={kit.a11y.ariaLabel}
72
+ aria-labelledby={kit.a11y.ariaLabelledBy}
73
+ aria-describedby={kit.a11y.ariaDescribedBy}
74
+ tabindex={-1}
75
+ {...kit.dataAttributes}
76
+ >
77
+ {#if hasTitle || kit.showCloseButton}
78
+ <header class="mw-dialog__header">
79
+ {#if hasTitle}
80
+ <div class="mw-dialog__heading-group">
81
+ <h2 class="mw-dialog__title" id={titleId}>{title}</h2>
82
+ </div>
83
+ {:else}
84
+ <span class="mw-dialog__spacer" aria-hidden="true"></span>
85
+ {/if}
86
+
87
+ {#if kit.showCloseButton && onclose}
88
+ <button
89
+ type="button"
90
+ class="mw-dialog__close"
91
+ aria-label="Close dialog"
92
+ onclick={handleClose}
93
+ >
94
+ <Icon name={IconName.X} decorative />
95
+ </button>
96
+ {/if}
97
+ </header>
98
+ <div class="mw-dialog__header-divider" aria-hidden="true"></div>
99
+ {/if}
100
+
101
+ <div class="mw-dialog__content">
102
+ {#if hasDescription}
103
+ <p class="mw-dialog__description" id={descriptionId}>{description}</p>
104
+ {/if}
105
+ {@render children?.()}
106
+ </div>
107
+
108
+ {#if hasFooter}
109
+ <div class="mw-dialog__footer-divider" aria-hidden="true"></div>
110
+ <footer class="mw-dialog__footer">
111
+ {@render footer?.({ close: handleClose })}
112
+ </footer>
113
+ {/if}
114
+ </section>
@@ -0,0 +1,4 @@
1
+ import type { DialogProps } from "./types.js";
2
+ declare const Dialog: import("svelte").Component<DialogProps, {}, "">;
3
+ type Dialog = ReturnType<typeof Dialog>;
4
+ export default Dialog;
@@ -0,0 +1,120 @@
1
+ <script lang="ts">
2
+ import { mergeClass } from "../../internal/merge-class.js";
3
+ import Dialog from "./Dialog.svelte";
4
+ import type { DialogModalProps } from "./types.js";
5
+
6
+ let {
7
+ open = $bindable(false),
8
+ closeOnEscape = true,
9
+ closeOnScrimClick = true,
10
+ restoreFocus = true,
11
+ onopenchange,
12
+ overlayClass,
13
+ footer,
14
+ ...dialogProps
15
+ }: DialogModalProps = $props();
16
+
17
+ let overlayElement: HTMLDivElement | undefined = $state(undefined);
18
+ let surfaceElement: HTMLDivElement | undefined = $state(undefined);
19
+ let previouslyFocused: HTMLElement | null = $state(null);
20
+
21
+ const mergedOverlayClass = $derived(mergeClass("mw-dialog-modal", overlayClass));
22
+
23
+ function close(): void {
24
+ if (!open) return;
25
+ onopenchange?.(false);
26
+ if (!onopenchange) {
27
+ open = false;
28
+ }
29
+ }
30
+
31
+ function getFocusableElements(container: HTMLElement | null): HTMLElement[] {
32
+ if (!container) return [];
33
+ return Array.from(
34
+ container.querySelectorAll<HTMLElement>(
35
+ "button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex='-1'])"
36
+ )
37
+ ).filter(el => !el.hasAttribute("hidden") && el.getAttribute("aria-hidden") !== "true");
38
+ }
39
+
40
+ $effect(() => {
41
+ if (open && typeof document !== "undefined") {
42
+ const previousOverflow = document.body.style.overflow;
43
+ previouslyFocused = document.activeElement instanceof HTMLElement ? document.activeElement : null;
44
+ document.body.style.overflow = "hidden";
45
+
46
+ // Focus first focusable element
47
+ requestAnimationFrame(() => {
48
+ const dialogEl = overlayElement?.querySelector<HTMLElement>(".mw-dialog") ?? null;
49
+ const focusable = getFocusableElements(dialogEl);
50
+ const firstEl = focusable[0];
51
+ if (firstEl) {
52
+ firstEl.focus();
53
+ } else {
54
+ dialogEl?.focus();
55
+ }
56
+ });
57
+
58
+ return () => {
59
+ document.body.style.overflow = previousOverflow;
60
+ if (restoreFocus && previouslyFocused) {
61
+ previouslyFocused.focus();
62
+ }
63
+ };
64
+ }
65
+ });
66
+
67
+ function handleKeyDown(e: KeyboardEvent): void {
68
+ if (e.key === "Escape" && closeOnEscape) {
69
+ e.preventDefault();
70
+ e.stopPropagation();
71
+ close();
72
+ return;
73
+ }
74
+
75
+ if (e.key !== "Tab") return;
76
+
77
+ const dialogEl = overlayElement?.querySelector<HTMLElement>(".mw-dialog") ?? null;
78
+ const focusable = getFocusableElements(dialogEl);
79
+ if (focusable.length === 0) {
80
+ e.preventDefault();
81
+ dialogEl?.focus();
82
+ return;
83
+ }
84
+
85
+ const first = focusable[0];
86
+ const last = focusable[focusable.length - 1];
87
+ const active = document.activeElement;
88
+
89
+ if (e.shiftKey && active === first) {
90
+ e.preventDefault();
91
+ last?.focus();
92
+ } else if (!e.shiftKey && active === last) {
93
+ e.preventDefault();
94
+ first?.focus();
95
+ }
96
+ }
97
+
98
+ function handleScrimClick(e: MouseEvent): void {
99
+ if (!closeOnScrimClick) return;
100
+ const target = e.target;
101
+ if (!(target instanceof Node)) return;
102
+ if (surfaceElement?.contains(target)) return;
103
+ close();
104
+ }
105
+ </script>
106
+
107
+ {#if open}
108
+ <div
109
+ bind:this={overlayElement}
110
+ class={mergedOverlayClass}
111
+ onclick={handleScrimClick}
112
+ onkeydown={handleKeyDown}
113
+ role="presentation"
114
+ >
115
+ <div class="mw-dialog-modal__scrim" aria-hidden="true"></div>
116
+ <div bind:this={surfaceElement} class="mw-dialog-modal__surface">
117
+ <Dialog {...dialogProps} modal onclose={close} {...(footer ? { footer } : {})} />
118
+ </div>
119
+ </div>
120
+ {/if}
@@ -0,0 +1,4 @@
1
+ import type { DialogModalProps } from "./types.js";
2
+ declare const DialogModal: import("svelte").Component<DialogModalProps, {}, "open">;
3
+ type DialogModal = ReturnType<typeof DialogModal>;
4
+ export default DialogModal;
@@ -0,0 +1,24 @@
1
+ <script lang="ts">
2
+ import { createPurposeSemanticAttributes } from "@marwes-ui/core";
3
+ import ConfirmButton from "../button/ConfirmButton.svelte";
4
+ import DialogModal from "./DialogModal.svelte";
5
+ import type { InfoDialogProps } from "./types.js";
6
+
7
+ let {
8
+ acknowledgeLabel = "Okay",
9
+ onacknowledge,
10
+ dataAttributes,
11
+ ...dialogProps
12
+ }: InfoDialogProps = $props();
13
+
14
+ const mergedDataAttrs = $derived({
15
+ ...dataAttributes,
16
+ ...createPurposeSemanticAttributes("info-dialog"),
17
+ });
18
+ </script>
19
+
20
+ <DialogModal {...dialogProps} dataAttributes={mergedDataAttrs}>
21
+ {#snippet footer({ close })}
22
+ <ConfirmButton onclick={() => { onacknowledge?.(); close(); }}>{acknowledgeLabel}</ConfirmButton>
23
+ {/snippet}
24
+ </DialogModal>
@@ -0,0 +1,4 @@
1
+ import type { InfoDialogProps } from "./types.js";
2
+ declare const InfoDialog: import("svelte").Component<InfoDialogProps, {}, "">;
3
+ type InfoDialog = ReturnType<typeof InfoDialog>;
4
+ export default InfoDialog;
@@ -0,0 +1,23 @@
1
+ # Dialog — Parity Findings
2
+
3
+ ## Svelte vs React/Vue
4
+
5
+ ### Aligned ✅
6
+ - `Dialog` atom with `createDialogRecipe`
7
+ - Header with title, close button (via `IconName.X`)
8
+ - Content area with optional description
9
+ - Footer via Svelte snippet: `{#snippet footer({ close })}...{/snippet}`
10
+ - `aria-labelledby` wired to title, `aria-describedby` wired to description
11
+ - `aria-label` fallback when no visible title
12
+ - `aria-modal` only when `modal` is explicitly true
13
+ - `DialogModal` molecule with scrim, focus trap, escape/scrim-click dismiss, focus restoration
14
+ - `ConfirmDialog`, `DestructiveDialog`, `InfoDialog` purpose wrappers with `createPurposeSemanticAttributes`
15
+ - `bind:open` two-way binding on modal components
16
+
17
+ ### Svelte-specific
18
+ - Footer uses Svelte snippets instead of React render props: `{#snippet footer({ close })}` vs `footer={({ close }) => ...}`
19
+ - No `portalTarget` prop — Svelte renders modals in-place (no React portal equivalent needed)
20
+
21
+ ### Notes
22
+ - All purpose dialogs set correct `data-purpose` attributes.
23
+ - Focus management follows the same algorithm: first focusable element, or dialog surface as fallback.
@@ -0,0 +1,6 @@
1
+ export { default as Dialog } from "./Dialog.svelte";
2
+ export { default as DialogModal } from "./DialogModal.svelte";
3
+ export { default as ConfirmDialog } from "./ConfirmDialog.svelte";
4
+ export { default as DestructiveDialog } from "./DestructiveDialog.svelte";
5
+ export { default as InfoDialog } from "./InfoDialog.svelte";
6
+ export type { ConfirmDialogProps, DestructiveDialogProps, DialogModalProps, DialogProps, InfoDialogProps, } from "./types.js";
@@ -0,0 +1,5 @@
1
+ export { default as Dialog } from "./Dialog.svelte";
2
+ export { default as DialogModal } from "./DialogModal.svelte";
3
+ export { default as ConfirmDialog } from "./ConfirmDialog.svelte";
4
+ export { default as DestructiveDialog } from "./DestructiveDialog.svelte";
5
+ export { default as InfoDialog } from "./InfoDialog.svelte";
@@ -0,0 +1,42 @@
1
+ import type { DialogOptions } from "@marwes-ui/core";
2
+ import type { Snippet } from "svelte";
3
+ export interface DialogProps extends DialogOptions {
4
+ id?: string;
5
+ title?: string;
6
+ description?: string;
7
+ children?: Snippet;
8
+ footer?: Snippet<[{
9
+ close: () => void;
10
+ }]>;
11
+ onclose?: () => void;
12
+ class?: string;
13
+ dataAttributes?: Record<string, string>;
14
+ }
15
+ export interface DialogModalProps extends Omit<DialogProps, "footer" | "onclose"> {
16
+ open?: boolean;
17
+ closeOnEscape?: boolean;
18
+ closeOnScrimClick?: boolean;
19
+ restoreFocus?: boolean;
20
+ footer?: Snippet<[{
21
+ close: () => void;
22
+ }]>;
23
+ onopenchange?: (open: boolean) => void;
24
+ class?: string;
25
+ overlayClass?: string;
26
+ }
27
+ export interface ConfirmDialogProps extends Omit<DialogModalProps, "footer"> {
28
+ confirmLabel?: string;
29
+ cancelLabel?: string;
30
+ onconfirm?: () => void;
31
+ oncancel?: () => void;
32
+ }
33
+ export interface DestructiveDialogProps extends Omit<DialogModalProps, "footer"> {
34
+ confirmLabel?: string;
35
+ cancelLabel?: string;
36
+ onconfirm?: () => void;
37
+ oncancel?: () => void;
38
+ }
39
+ export interface InfoDialogProps extends Omit<DialogModalProps, "footer"> {
40
+ acknowledgeLabel?: string;
41
+ onacknowledge?: () => void;
42
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,25 @@
1
+ <script lang="ts">
2
+ import { createDividerRecipe } from "@marwes-ui/core";
3
+ import { cssVarsToStyle, mergeStyle } from "../../internal/css-vars.js";
4
+ import { mergeClass } from "../../internal/merge-class.js";
5
+ import type { DividerProps } from "./types.js";
6
+
7
+ let {
8
+ class: className,
9
+ style,
10
+ ...options
11
+ }: DividerProps = $props();
12
+
13
+ const kit = $derived(createDividerRecipe(options));
14
+ const mergedClass = $derived(mergeClass(kit.className, className));
15
+ const mergedStyle = $derived(mergeStyle(cssVarsToStyle(kit.vars), style));
16
+ </script>
17
+
18
+ <hr
19
+ class={mergedClass}
20
+ style={mergedStyle}
21
+ id={kit.a11y.id}
22
+ role={kit.a11y.role}
23
+ aria-orientation={kit.a11y["aria-orientation"]}
24
+ {...kit.dataAttributes}
25
+ />
@@ -0,0 +1,4 @@
1
+ import type { DividerProps } from "./types.js";
2
+ declare const Divider: import("svelte").Component<DividerProps, {}, "">;
3
+ type Divider = ReturnType<typeof Divider>;
4
+ export default Divider;
@@ -0,0 +1,15 @@
1
+ # Divider — Parity Findings
2
+
3
+ ## Svelte vs React/Vue
4
+
5
+ ### Aligned ✅
6
+ - Full parity with React/Vue
7
+ - `createDividerRecipe` integration
8
+ - All sizes: xxs, xs, sm, md, lg, xl, xxl
9
+ - Orientation: horizontal, vertical
10
+ - Semantic `<hr>` with role="separator" and aria-orientation
11
+ - CSS vars for line thickness and spacing
12
+ - Data attributes, class/style merging
13
+
14
+ ### Missing ❌
15
+ - None — full parity.
@@ -0,0 +1,2 @@
1
+ export { default as Divider } from "./Divider.svelte";
2
+ export type { DividerProps } from "./types.js";
@@ -0,0 +1 @@
1
+ export { default as Divider } from "./Divider.svelte";
@@ -0,0 +1,5 @@
1
+ import type { DividerOptions } from "@marwes-ui/core";
2
+ export interface DividerProps extends DividerOptions {
3
+ class?: string;
4
+ style?: string | undefined;
5
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,23 @@
1
+ <script lang="ts">
2
+ import { headingRecipe } from "@marwes-ui/core";
3
+ import { cssVarsToStyle, mergeStyle } from "../../internal/css-vars.js";
4
+ import { mergeClass } from "../../internal/merge-class.js";
5
+ import { useTheme } from "../../provider/use-theme.js";
6
+ import type { H1Props } from "./types.js";
7
+
8
+ let {
9
+ children,
10
+ class: className,
11
+ style,
12
+ ...opts
13
+ }: H1Props = $props();
14
+
15
+ const { theme } = useTheme();
16
+ const kit = $derived(headingRecipe({ ...opts, level: 1 }, theme));
17
+ const mergedClass = $derived(mergeClass(kit.className, className));
18
+ const mergedStyle = $derived(mergeStyle(cssVarsToStyle(kit.vars), style));
19
+ </script>
20
+
21
+ <h1 id={kit.a11y.id} aria-label={kit.a11y.ariaLabel} class={mergedClass} style={mergedStyle}>
22
+ {@render children?.()}
23
+ </h1>
@@ -0,0 +1,4 @@
1
+ import type { H1Props } from "./types.js";
2
+ declare const H1: import("svelte").Component<H1Props, {}, "">;
3
+ type H1 = ReturnType<typeof H1>;
4
+ export default H1;
@@ -0,0 +1,23 @@
1
+ <script lang="ts">
2
+ import { headingRecipe } from "@marwes-ui/core";
3
+ import { cssVarsToStyle, mergeStyle } from "../../internal/css-vars.js";
4
+ import { mergeClass } from "../../internal/merge-class.js";
5
+ import { useTheme } from "../../provider/use-theme.js";
6
+ import type { H2Props } from "./types.js";
7
+
8
+ let {
9
+ children,
10
+ class: className,
11
+ style,
12
+ ...opts
13
+ }: H2Props = $props();
14
+
15
+ const { theme } = useTheme();
16
+ const kit = $derived(headingRecipe({ ...opts, level: 2 }, theme));
17
+ const mergedClass = $derived(mergeClass(kit.className, className));
18
+ const mergedStyle = $derived(mergeStyle(cssVarsToStyle(kit.vars), style));
19
+ </script>
20
+
21
+ <h2 id={kit.a11y.id} aria-label={kit.a11y.ariaLabel} class={mergedClass} style={mergedStyle}>
22
+ {@render children?.()}
23
+ </h2>
@@ -0,0 +1,4 @@
1
+ import type { H2Props } from "./types.js";
2
+ declare const H2: import("svelte").Component<H2Props, {}, "">;
3
+ type H2 = ReturnType<typeof H2>;
4
+ export default H2;
@@ -0,0 +1,23 @@
1
+ <script lang="ts">
2
+ import { headingRecipe } from "@marwes-ui/core";
3
+ import { cssVarsToStyle, mergeStyle } from "../../internal/css-vars.js";
4
+ import { mergeClass } from "../../internal/merge-class.js";
5
+ import { useTheme } from "../../provider/use-theme.js";
6
+ import type { H3Props } from "./types.js";
7
+
8
+ let {
9
+ children,
10
+ class: className,
11
+ style,
12
+ ...opts
13
+ }: H3Props = $props();
14
+
15
+ const { theme } = useTheme();
16
+ const kit = $derived(headingRecipe({ ...opts, level: 3 }, theme));
17
+ const mergedClass = $derived(mergeClass(kit.className, className));
18
+ const mergedStyle = $derived(mergeStyle(cssVarsToStyle(kit.vars), style));
19
+ </script>
20
+
21
+ <h3 id={kit.a11y.id} aria-label={kit.a11y.ariaLabel} class={mergedClass} style={mergedStyle}>
22
+ {@render children?.()}
23
+ </h3>
@@ -0,0 +1,4 @@
1
+ import type { H3Props } from "./types.js";
2
+ declare const H3: import("svelte").Component<H3Props, {}, "">;
3
+ type H3 = ReturnType<typeof H3>;
4
+ export default H3;
@@ -0,0 +1,13 @@
1
+ # Heading — Parity Findings
2
+
3
+ ## Svelte vs React/Vue
4
+
5
+ ### Aligned ✅
6
+ - `H1`, `H2`, `H3` components with `headingRecipe`
7
+ - `mw-heading` class with size modifiers (`mw-heading--h1`, etc.)
8
+ - CSS vars for font family, size, weight, line height from resolved theme
9
+ - Optional `id`, `ariaLabel`, `size` override, custom `class`, `style`
10
+ - Requires `MarwesProvider` context for theme access
11
+
12
+ ### Notes
13
+ - Heading recipe requires the resolved theme to compute font variables.
@@ -0,0 +1,4 @@
1
+ export { default as H1 } from "./H1.svelte";
2
+ export { default as H2 } from "./H2.svelte";
3
+ export { default as H3 } from "./H3.svelte";
4
+ export type { H1Props, H2Props, H3Props } from "./types.js";
@@ -0,0 +1,3 @@
1
+ export { default as H1 } from "./H1.svelte";
2
+ export { default as H2 } from "./H2.svelte";
3
+ export { default as H3 } from "./H3.svelte";
@@ -0,0 +1,26 @@
1
+ import type { HeadingSize } from "@marwes-ui/core";
2
+ import type { Snippet } from "svelte";
3
+ export interface H1Props {
4
+ size?: HeadingSize;
5
+ id?: string;
6
+ ariaLabel?: string;
7
+ children?: Snippet;
8
+ class?: string;
9
+ style?: string | undefined;
10
+ }
11
+ export interface H2Props {
12
+ size?: HeadingSize;
13
+ id?: string;
14
+ ariaLabel?: string;
15
+ children?: Snippet;
16
+ class?: string;
17
+ style?: string | undefined;
18
+ }
19
+ export interface H3Props {
20
+ size?: HeadingSize;
21
+ id?: string;
22
+ ariaLabel?: string;
23
+ children?: Snippet;
24
+ class?: string;
25
+ style?: string | undefined;
26
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,65 @@
1
+ <script lang="ts">
2
+ import {
3
+ iconRegistry,
4
+ resolveIconA11y,
5
+ resolveIconSize,
6
+ resolveIconStrokeWidth,
7
+ } from "@marwes-ui/core";
8
+ import { svgAttrsToKebab } from "../../internal/svg-attrs.js";
9
+ import type { IconProps } from "./types.js";
10
+
11
+ let {
12
+ name,
13
+ size,
14
+ strokeWidth,
15
+ class: className,
16
+ "aria-label": ariaLabel,
17
+ decorative,
18
+ }: IconProps = $props();
19
+
20
+ const px = $derived(resolveIconSize(size ?? "sm"));
21
+ const sw = $derived(resolveIconStrokeWidth(strokeWidth ?? "md"));
22
+ const def = $derived(iconRegistry[name]);
23
+ const a11y = $derived(
24
+ resolveIconA11y({
25
+ ...(ariaLabel !== undefined ? { ariaLabel } : {}),
26
+ ...(decorative !== undefined ? { decorative } : {}),
27
+ })
28
+ );
29
+ </script>
30
+
31
+ {#if def}
32
+ <svg
33
+ width={px}
34
+ height={px}
35
+ viewBox={def.viewBox}
36
+ fill="none"
37
+ stroke="currentColor"
38
+ stroke-width={sw}
39
+ stroke-linecap="round"
40
+ stroke-linejoin="round"
41
+ class={className}
42
+ aria-hidden={a11y.ariaHidden ? "true" : undefined}
43
+ aria-label={a11y.ariaLabel}
44
+ role={a11y.role}
45
+ focusable="false"
46
+ >
47
+ {#each def.nodes as node}
48
+ {#if node.tag === "path"}
49
+ <path {...svgAttrsToKebab(node.attrs)} />
50
+ {:else if node.tag === "circle"}
51
+ <circle {...svgAttrsToKebab(node.attrs)} />
52
+ {:else if node.tag === "line"}
53
+ <line {...svgAttrsToKebab(node.attrs)} />
54
+ {:else if node.tag === "polygon"}
55
+ <polygon {...svgAttrsToKebab(node.attrs)} />
56
+ {:else if node.tag === "polyline"}
57
+ <polyline {...svgAttrsToKebab(node.attrs)} />
58
+ {:else if node.tag === "rect"}
59
+ <rect {...svgAttrsToKebab(node.attrs)} />
60
+ {:else if node.tag === "ellipse"}
61
+ <ellipse {...svgAttrsToKebab(node.attrs)} />
62
+ {/if}
63
+ {/each}
64
+ </svg>
65
+ {/if}
@@ -0,0 +1,4 @@
1
+ import type { IconProps } from "./types.js";
2
+ declare const Icon: import("svelte").Component<IconProps, {}, "">;
3
+ type Icon = ReturnType<typeof Icon>;
4
+ export default Icon;
@@ -0,0 +1,18 @@
1
+ # Icon — Parity Findings
2
+
3
+ ## Svelte vs React/Vue
4
+
5
+ ### Aligned ✅
6
+ - Full `iconRegistry` integration
7
+ - All props: name, size, strokeWidth, decorative, aria-label
8
+ - SVG rendering from core registry nodes
9
+ - Proper kebab-case attribute conversion via `svgAttrsToKebab`
10
+ - All SVG element types handled (path, circle, line, polygon, polyline, rect, ellipse)
11
+ - Accessibility: role="img", aria-hidden, aria-label from `resolveIconA11y`
12
+ - `class` prop merging
13
+
14
+ ### Missing ❌
15
+ - None — full parity with React/Vue atom.
16
+
17
+ ### Notes
18
+ - The `color` prop from core (`IconColor`) is accepted in types but visual application relies on preset CSS (`mw-icon--currentColor` etc.)