@happyvertical/smrt-ui 0.30.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 (330) hide show
  1. package/AGENTS.md +50 -0
  2. package/CLAUDE.md +1 -0
  3. package/LICENSE +7 -0
  4. package/dist/actions/__tests__/ripple.test.js +28 -0
  5. package/dist/actions/permission.d.ts +34 -0
  6. package/dist/actions/permission.d.ts.map +1 -0
  7. package/dist/actions/permission.js +70 -0
  8. package/dist/actions/ripple.d.ts +7 -0
  9. package/dist/actions/ripple.d.ts.map +1 -0
  10. package/dist/actions/ripple.js +65 -0
  11. package/dist/components/calendar/Calendar.svelte +520 -0
  12. package/dist/components/calendar/Calendar.svelte.d.ts +17 -0
  13. package/dist/components/calendar/Calendar.svelte.d.ts.map +1 -0
  14. package/dist/components/calendar/DayView.svelte +389 -0
  15. package/dist/components/calendar/DayView.svelte.d.ts +13 -0
  16. package/dist/components/calendar/DayView.svelte.d.ts.map +1 -0
  17. package/dist/components/calendar/index.d.ts +6 -0
  18. package/dist/components/calendar/index.d.ts.map +1 -0
  19. package/dist/components/calendar/index.js +5 -0
  20. package/dist/components/chat/MessageBubble.svelte +126 -0
  21. package/dist/components/chat/MessageBubble.svelte.d.ts +30 -0
  22. package/dist/components/chat/MessageBubble.svelte.d.ts.map +1 -0
  23. package/dist/components/chat/ReactionPicker.svelte +89 -0
  24. package/dist/components/chat/ReactionPicker.svelte.d.ts +19 -0
  25. package/dist/components/chat/ReactionPicker.svelte.d.ts.map +1 -0
  26. package/dist/components/chat/TypingIndicator.svelte +90 -0
  27. package/dist/components/chat/TypingIndicator.svelte.d.ts +17 -0
  28. package/dist/components/chat/TypingIndicator.svelte.d.ts.map +1 -0
  29. package/dist/components/chat/__tests__/chat-primitives.test.js +67 -0
  30. package/dist/components/chat/index.d.ts +10 -0
  31. package/dist/components/chat/index.d.ts.map +1 -0
  32. package/dist/components/chat/index.js +9 -0
  33. package/dist/components/data/DataTable.svelte +519 -0
  34. package/dist/components/data/DataTable.svelte.d.ts +49 -0
  35. package/dist/components/data/DataTable.svelte.d.ts.map +1 -0
  36. package/dist/components/data/__tests__/DataTable.test.js +48 -0
  37. package/dist/components/data/__tests__/data-table-helpers.test.js +36 -0
  38. package/dist/components/data/index.d.ts +6 -0
  39. package/dist/components/data/index.d.ts.map +1 -0
  40. package/dist/components/data/index.js +5 -0
  41. package/dist/components/data/types.d.ts +104 -0
  42. package/dist/components/data/types.d.ts.map +1 -0
  43. package/dist/components/data/types.js +45 -0
  44. package/dist/components/display/ConfidenceBadge.svelte +142 -0
  45. package/dist/components/display/ConfidenceBadge.svelte.d.ts +25 -0
  46. package/dist/components/display/ConfidenceBadge.svelte.d.ts.map +1 -0
  47. package/dist/components/display/CurrencyDisplay.svelte +106 -0
  48. package/dist/components/display/CurrencyDisplay.svelte.d.ts +30 -0
  49. package/dist/components/display/CurrencyDisplay.svelte.d.ts.map +1 -0
  50. package/dist/components/display/DateDisplay.svelte +122 -0
  51. package/dist/components/display/DateDisplay.svelte.d.ts +24 -0
  52. package/dist/components/display/DateDisplay.svelte.d.ts.map +1 -0
  53. package/dist/components/display/Icon.svelte +77 -0
  54. package/dist/components/display/Icon.svelte.d.ts +28 -0
  55. package/dist/components/display/Icon.svelte.d.ts.map +1 -0
  56. package/dist/components/display/StatusBadge.svelte +256 -0
  57. package/dist/components/display/StatusBadge.svelte.d.ts +24 -0
  58. package/dist/components/display/StatusBadge.svelte.d.ts.map +1 -0
  59. package/dist/components/display/__tests__/ConfidenceBadge.test.js +96 -0
  60. package/dist/components/display/__tests__/CurrencyDisplay.test.js +114 -0
  61. package/dist/components/display/__tests__/DateDisplay.test.js +114 -0
  62. package/dist/components/display/__tests__/Icon.test.js +93 -0
  63. package/dist/components/display/__tests__/StatusBadge.test.js +98 -0
  64. package/dist/components/display/index.d.ts +10 -0
  65. package/dist/components/display/index.d.ts.map +1 -0
  66. package/dist/components/display/index.js +9 -0
  67. package/dist/components/display/types.d.ts +5 -0
  68. package/dist/components/display/types.d.ts.map +1 -0
  69. package/dist/components/display/types.js +4 -0
  70. package/dist/components/feedback/ConfirmDialog.svelte +226 -0
  71. package/dist/components/feedback/ConfirmDialog.svelte.d.ts +25 -0
  72. package/dist/components/feedback/ConfirmDialog.svelte.d.ts.map +1 -0
  73. package/dist/components/feedback/LoadingOverlay.svelte +281 -0
  74. package/dist/components/feedback/LoadingOverlay.svelte.d.ts +31 -0
  75. package/dist/components/feedback/LoadingOverlay.svelte.d.ts.map +1 -0
  76. package/dist/components/feedback/Modal.svelte +393 -0
  77. package/dist/components/feedback/Modal.svelte.d.ts +46 -0
  78. package/dist/components/feedback/Modal.svelte.d.ts.map +1 -0
  79. package/dist/components/feedback/ProgressBar.svelte +162 -0
  80. package/dist/components/feedback/ProgressBar.svelte.d.ts +21 -0
  81. package/dist/components/feedback/ProgressBar.svelte.d.ts.map +1 -0
  82. package/dist/components/feedback/__tests__/ConfirmDialog.test.js +111 -0
  83. package/dist/components/feedback/__tests__/LoadingOverlay.test.js +99 -0
  84. package/dist/components/feedback/__tests__/Modal.test.js +72 -0
  85. package/dist/components/feedback/__tests__/ProgressBar.test.js +89 -0
  86. package/dist/components/feedback/index.d.ts +8 -0
  87. package/dist/components/feedback/index.d.ts.map +1 -0
  88. package/dist/components/feedback/index.js +10 -0
  89. package/dist/components/layout/Container.svelte +53 -0
  90. package/dist/components/layout/Container.svelte.d.ts +11 -0
  91. package/dist/components/layout/Container.svelte.d.ts.map +1 -0
  92. package/dist/components/layout/EmptyState.svelte +187 -0
  93. package/dist/components/layout/EmptyState.svelte.d.ts +28 -0
  94. package/dist/components/layout/EmptyState.svelte.d.ts.map +1 -0
  95. package/dist/components/layout/Footer.svelte +63 -0
  96. package/dist/components/layout/Footer.svelte.d.ts +8 -0
  97. package/dist/components/layout/Footer.svelte.d.ts.map +1 -0
  98. package/dist/components/layout/Grid.svelte +241 -0
  99. package/dist/components/layout/Grid.svelte.d.ts +56 -0
  100. package/dist/components/layout/Grid.svelte.d.ts.map +1 -0
  101. package/dist/components/layout/Header.svelte +86 -0
  102. package/dist/components/layout/Header.svelte.d.ts +9 -0
  103. package/dist/components/layout/Header.svelte.d.ts.map +1 -0
  104. package/dist/components/layout/Masthead.svelte +219 -0
  105. package/dist/components/layout/Masthead.svelte.d.ts +13 -0
  106. package/dist/components/layout/Masthead.svelte.d.ts.map +1 -0
  107. package/dist/components/layout/PageHeader.svelte +131 -0
  108. package/dist/components/layout/PageHeader.svelte.d.ts +26 -0
  109. package/dist/components/layout/PageHeader.svelte.d.ts.map +1 -0
  110. package/dist/components/layout/SummaryCard.svelte +203 -0
  111. package/dist/components/layout/SummaryCard.svelte.d.ts +20 -0
  112. package/dist/components/layout/SummaryCard.svelte.d.ts.map +1 -0
  113. package/dist/components/layout/__tests__/Container.test.js +62 -0
  114. package/dist/components/layout/__tests__/EmptyState.test.js +83 -0
  115. package/dist/components/layout/__tests__/Footer.test.js +50 -0
  116. package/dist/components/layout/__tests__/Grid.test.js +121 -0
  117. package/dist/components/layout/__tests__/Header.test.js +48 -0
  118. package/dist/components/layout/__tests__/Masthead.test.js +93 -0
  119. package/dist/components/layout/__tests__/PageHeader.test.js +80 -0
  120. package/dist/components/layout/__tests__/SummaryCard.test.js +82 -0
  121. package/dist/components/layout/index.d.ts +12 -0
  122. package/dist/components/layout/index.d.ts.map +1 -0
  123. package/dist/components/layout/index.js +11 -0
  124. package/dist/components/memberships/MembershipCard.svelte +163 -0
  125. package/dist/components/memberships/MembershipCard.svelte.d.ts +12 -0
  126. package/dist/components/memberships/MembershipCard.svelte.d.ts.map +1 -0
  127. package/dist/components/memberships/MembershipList.svelte +98 -0
  128. package/dist/components/memberships/MembershipList.svelte.d.ts +19 -0
  129. package/dist/components/memberships/MembershipList.svelte.d.ts.map +1 -0
  130. package/dist/components/nav/FilterChips.svelte +152 -0
  131. package/dist/components/nav/FilterChips.svelte.d.ts +19 -0
  132. package/dist/components/nav/FilterChips.svelte.d.ts.map +1 -0
  133. package/dist/components/nav/Tabs.svelte +252 -0
  134. package/dist/components/nav/Tabs.svelte.d.ts +34 -0
  135. package/dist/components/nav/Tabs.svelte.d.ts.map +1 -0
  136. package/dist/components/nav/__tests__/FilterChips.test.js +94 -0
  137. package/dist/components/nav/__tests__/Tabs.test.js +128 -0
  138. package/dist/components/nav/index.d.ts +7 -0
  139. package/dist/components/nav/index.d.ts.map +1 -0
  140. package/dist/components/nav/index.js +6 -0
  141. package/dist/components/nav/types.d.ts +24 -0
  142. package/dist/components/nav/types.d.ts.map +1 -0
  143. package/dist/components/nav/types.js +4 -0
  144. package/dist/components/permissions/PermissionCheck.svelte +45 -0
  145. package/dist/components/permissions/PermissionCheck.svelte.d.ts +19 -0
  146. package/dist/components/permissions/PermissionCheck.svelte.d.ts.map +1 -0
  147. package/dist/components/roles/RoleBadge.svelte +84 -0
  148. package/dist/components/roles/RoleBadge.svelte.d.ts +13 -0
  149. package/dist/components/roles/RoleBadge.svelte.d.ts.map +1 -0
  150. package/dist/components/roles/RoleSelector.svelte +216 -0
  151. package/dist/components/roles/RoleSelector.svelte.d.ts +13 -0
  152. package/dist/components/roles/RoleSelector.svelte.d.ts.map +1 -0
  153. package/dist/components/theme/ThemeProvider.svelte +71 -0
  154. package/dist/components/theme/ThemeProvider.svelte.d.ts +10 -0
  155. package/dist/components/theme/ThemeProvider.svelte.d.ts.map +1 -0
  156. package/dist/components/theme/context.svelte.d.ts +15 -0
  157. package/dist/components/theme/context.svelte.d.ts.map +1 -0
  158. package/dist/components/theme/context.svelte.js +42 -0
  159. package/dist/components/theme/index.d.ts +3 -0
  160. package/dist/components/theme/index.d.ts.map +1 -0
  161. package/dist/components/theme/index.js +2 -0
  162. package/dist/components/ui/Avatar.svelte +167 -0
  163. package/dist/components/ui/Avatar.svelte.d.ts +26 -0
  164. package/dist/components/ui/Avatar.svelte.d.ts.map +1 -0
  165. package/dist/components/ui/Badge.svelte +70 -0
  166. package/dist/components/ui/Badge.svelte.d.ts +12 -0
  167. package/dist/components/ui/Badge.svelte.d.ts.map +1 -0
  168. package/dist/components/ui/Button.svelte +226 -0
  169. package/dist/components/ui/Button.svelte.d.ts +28 -0
  170. package/dist/components/ui/Button.svelte.d.ts.map +1 -0
  171. package/dist/components/ui/Card.svelte +122 -0
  172. package/dist/components/ui/Card.svelte.d.ts +15 -0
  173. package/dist/components/ui/Card.svelte.d.ts.map +1 -0
  174. package/dist/components/ui/Chip.svelte +167 -0
  175. package/dist/components/ui/Chip.svelte.d.ts +33 -0
  176. package/dist/components/ui/Chip.svelte.d.ts.map +1 -0
  177. package/dist/components/ui/Dropdown.svelte +250 -0
  178. package/dist/components/ui/Dropdown.svelte.d.ts +20 -0
  179. package/dist/components/ui/Dropdown.svelte.d.ts.map +1 -0
  180. package/dist/components/ui/Pagination.svelte +294 -0
  181. package/dist/components/ui/Pagination.svelte.d.ts +21 -0
  182. package/dist/components/ui/Pagination.svelte.d.ts.map +1 -0
  183. package/dist/components/ui/Skeleton.svelte +113 -0
  184. package/dist/components/ui/Skeleton.svelte.d.ts +24 -0
  185. package/dist/components/ui/Skeleton.svelte.d.ts.map +1 -0
  186. package/dist/components/ui/Tooltip.svelte +120 -0
  187. package/dist/components/ui/Tooltip.svelte.d.ts +24 -0
  188. package/dist/components/ui/Tooltip.svelte.d.ts.map +1 -0
  189. package/dist/components/ui/Tree.svelte +209 -0
  190. package/dist/components/ui/Tree.svelte.d.ts +17 -0
  191. package/dist/components/ui/Tree.svelte.d.ts.map +1 -0
  192. package/dist/components/ui/__tests__/Badge.test.js +76 -0
  193. package/dist/components/ui/__tests__/Button.test.js +69 -0
  194. package/dist/components/ui/__tests__/Card.test.js +103 -0
  195. package/dist/components/ui/__tests__/Pagination.test.js +99 -0
  196. package/dist/components/ui/__tests__/gap-primitives-interactive.test.js +112 -0
  197. package/dist/components/ui/__tests__/gap-primitives.test.js +84 -0
  198. package/dist/components/ui/index.d.ts +14 -0
  199. package/dist/components/ui/index.d.ts.map +1 -0
  200. package/dist/components/ui/index.js +18 -0
  201. package/dist/i18n/Trans.svelte +29 -0
  202. package/dist/i18n/Trans.svelte.d.ts +24 -0
  203. package/dist/i18n/Trans.svelte.d.ts.map +1 -0
  204. package/dist/i18n/__tests__/i18n.test.js +74 -0
  205. package/dist/i18n/__tests__/render-parity.spec.js +37 -0
  206. package/dist/i18n/context.svelte.d.ts +43 -0
  207. package/dist/i18n/context.svelte.d.ts.map +1 -0
  208. package/dist/i18n/context.svelte.js +69 -0
  209. package/dist/i18n/index.d.ts +17 -0
  210. package/dist/i18n/index.d.ts.map +1 -0
  211. package/dist/i18n/index.js +24 -0
  212. package/dist/i18n/registry.d.ts +44 -0
  213. package/dist/i18n/registry.d.ts.map +1 -0
  214. package/dist/i18n/registry.js +60 -0
  215. package/dist/i18n/render.d.ts +22 -0
  216. package/dist/i18n/render.d.ts.map +1 -0
  217. package/dist/i18n/render.js +44 -0
  218. package/dist/i18n/strings.d.ts +7 -0
  219. package/dist/i18n/strings.d.ts.map +1 -0
  220. package/dist/i18n/strings.js +19 -0
  221. package/dist/i18n/strings.ui.d.ts +34 -0
  222. package/dist/i18n/strings.ui.d.ts.map +1 -0
  223. package/dist/i18n/strings.ui.js +44 -0
  224. package/dist/i18n/use-i18n.d.ts +20 -0
  225. package/dist/i18n/use-i18n.d.ts.map +1 -0
  226. package/dist/i18n/use-i18n.js +21 -0
  227. package/dist/index.d.ts +28 -0
  228. package/dist/index.d.ts.map +1 -0
  229. package/dist/index.js +38 -0
  230. package/dist/registry/index.d.ts +6 -0
  231. package/dist/registry/index.d.ts.map +1 -0
  232. package/dist/registry/index.js +4 -0
  233. package/dist/registry/module-registry.d.ts +58 -0
  234. package/dist/registry/module-registry.d.ts.map +1 -0
  235. package/dist/registry/module-registry.js +94 -0
  236. package/dist/styles/index.d.ts +4 -0
  237. package/dist/styles/index.d.ts.map +1 -0
  238. package/dist/styles/index.js +6 -0
  239. package/dist/styles/tokens.css +76 -0
  240. package/dist/test-support/a11y.d.ts +16 -0
  241. package/dist/test-support/a11y.d.ts.map +1 -0
  242. package/dist/test-support/a11y.js +32 -0
  243. package/dist/test-support/setup.d.ts +11 -0
  244. package/dist/test-support/setup.d.ts.map +1 -0
  245. package/dist/test-support/setup.js +33 -0
  246. package/dist/theme/ThemeProvider.svelte +207 -0
  247. package/dist/theme/ThemeProvider.svelte.d.ts +22 -0
  248. package/dist/theme/ThemeProvider.svelte.d.ts.map +1 -0
  249. package/dist/theme/context.d.ts +49 -0
  250. package/dist/theme/context.d.ts.map +1 -0
  251. package/dist/theme/context.js +32 -0
  252. package/dist/theme/index.d.ts +7 -0
  253. package/dist/theme/index.d.ts.map +1 -0
  254. package/dist/theme/index.js +9 -0
  255. package/dist/theme/tokens.d.ts +309 -0
  256. package/dist/theme/tokens.d.ts.map +1 -0
  257. package/dist/theme/tokens.js +418 -0
  258. package/dist/themes/CUSTOM_THEME_GUIDE.md +341 -0
  259. package/dist/themes/README.md +675 -0
  260. package/dist/themes/ThemeProvider.svelte +275 -0
  261. package/dist/themes/ThemeProvider.svelte.d.ts +24 -0
  262. package/dist/themes/ThemeProvider.svelte.d.ts.map +1 -0
  263. package/dist/themes/__tests__/css-generator.test.js +32 -0
  264. package/dist/themes/__tests__/registry.test.js +43 -0
  265. package/dist/themes/__tests__/token-aliases.test.js +176 -0
  266. package/dist/themes/components/ColorSchemeToggle.svelte +205 -0
  267. package/dist/themes/components/ColorSchemeToggle.svelte.d.ts +14 -0
  268. package/dist/themes/components/ColorSchemeToggle.svelte.d.ts.map +1 -0
  269. package/dist/themes/components/ThemeSwitcher.svelte +188 -0
  270. package/dist/themes/components/ThemeSwitcher.svelte.d.ts +14 -0
  271. package/dist/themes/components/ThemeSwitcher.svelte.d.ts.map +1 -0
  272. package/dist/themes/components/index.d.ts +8 -0
  273. package/dist/themes/components/index.d.ts.map +1 -0
  274. package/dist/themes/components/index.js +7 -0
  275. package/dist/themes/context.svelte.d.ts +30 -0
  276. package/dist/themes/context.svelte.d.ts.map +1 -0
  277. package/dist/themes/context.svelte.js +42 -0
  278. package/dist/themes/create-theme.d.ts +99 -0
  279. package/dist/themes/create-theme.d.ts.map +1 -0
  280. package/dist/themes/create-theme.js +389 -0
  281. package/dist/themes/css-generator.d.ts +44 -0
  282. package/dist/themes/css-generator.d.ts.map +1 -0
  283. package/dist/themes/css-generator.js +226 -0
  284. package/dist/themes/glass/index.d.ts +14 -0
  285. package/dist/themes/glass/index.d.ts.map +1 -0
  286. package/dist/themes/glass/index.js +286 -0
  287. package/dist/themes/index.d.ts +31 -0
  288. package/dist/themes/index.d.ts.map +1 -0
  289. package/dist/themes/index.js +37 -0
  290. package/dist/themes/material/index.d.ts +13 -0
  291. package/dist/themes/material/index.d.ts.map +1 -0
  292. package/dist/themes/material/index.js +269 -0
  293. package/dist/themes/registry.d.ts +64 -0
  294. package/dist/themes/registry.d.ts.map +1 -0
  295. package/dist/themes/registry.js +122 -0
  296. package/dist/themes/shared.d.ts +78 -0
  297. package/dist/themes/shared.d.ts.map +1 -0
  298. package/dist/themes/shared.js +179 -0
  299. package/dist/themes/studio/index.d.ts +14 -0
  300. package/dist/themes/studio/index.d.ts.map +1 -0
  301. package/dist/themes/studio/index.js +270 -0
  302. package/dist/themes/styles/all.css +12 -0
  303. package/dist/themes/styles/glass.css +432 -0
  304. package/dist/themes/styles/index.d.ts +22 -0
  305. package/dist/themes/styles/index.d.ts.map +1 -0
  306. package/dist/themes/styles/index.js +23 -0
  307. package/dist/themes/styles/material.css +364 -0
  308. package/dist/themes/styles/studio.css +416 -0
  309. package/dist/themes/types.d.ts +273 -0
  310. package/dist/themes/types.d.ts.map +1 -0
  311. package/dist/themes/types.js +15 -0
  312. package/dist/types-generic.d.ts +75 -0
  313. package/dist/types-generic.d.ts.map +1 -0
  314. package/dist/types-generic.js +1 -0
  315. package/dist/utils/forms/__tests__/formatters.test.js +27 -0
  316. package/dist/utils/forms/formatters.d.ts +14 -0
  317. package/dist/utils/forms/formatters.d.ts.map +1 -0
  318. package/dist/utils/forms/formatters.js +77 -0
  319. package/dist/utils/import-optional.d.ts +5 -0
  320. package/dist/utils/import-optional.d.ts.map +1 -0
  321. package/dist/utils/import-optional.js +7 -0
  322. package/dist/utils/theme/__tests__/color.test.js +72 -0
  323. package/dist/utils/theme/__tests__/typography.test.js +11 -0
  324. package/dist/utils/theme/color.d.ts +70 -0
  325. package/dist/utils/theme/color.d.ts.map +1 -0
  326. package/dist/utils/theme/color.js +221 -0
  327. package/dist/utils/theme/typography.d.ts +27 -0
  328. package/dist/utils/theme/typography.d.ts.map +1 -0
  329. package/dist/utils/theme/typography.js +30 -0
  330. package/package.json +143 -0
@@ -0,0 +1,76 @@
1
+ /**
2
+ * SMRT Svelte Design Tokens
3
+ * CSS custom properties for consistent theming across components
4
+ */
5
+
6
+ :root {
7
+ /* Colors - Primary */
8
+ --color-primary-main: #1976d2;
9
+ --color-primary-light: #e3f2fd;
10
+ --color-primary-dark: #1565c0;
11
+
12
+ /* Colors - Neutral */
13
+ --color-neutral-white: #ffffff;
14
+ --color-neutral-gray100: #f5f5f5;
15
+ --color-neutral-gray200: #eeeeee;
16
+ --color-neutral-gray300: #e0e0e0;
17
+ --color-neutral-gray400: #9ca3af;
18
+ --color-neutral-black: #000000;
19
+
20
+ /* Colors - Text */
21
+ --color-text-primary: #212121;
22
+ --color-text-secondary: #757575;
23
+ --color-text-inverse: #ffffff;
24
+
25
+ /* Colors - Semantic */
26
+ --color-semantic-error: #f44336;
27
+ --color-semantic-success: #4caf50;
28
+ --color-semantic-warning: #ff9800;
29
+ --color-semantic-info: #2196f3;
30
+
31
+ /* Spacing */
32
+ --spacing-xs: 0.25rem;
33
+ --spacing-sm: 0.5rem;
34
+ --spacing-md: 1rem;
35
+ --spacing-lg: 1.5rem;
36
+ --spacing-xl: 2rem;
37
+ --spacing-2xl: 3rem;
38
+ --spacing-3xl: 4rem;
39
+
40
+ /* Font Sizes */
41
+ --font-size-xs: 0.75rem;
42
+ --font-size-sm: 0.875rem;
43
+ --font-size-base: 1rem;
44
+ --font-size-md: 1rem;
45
+ --font-size-lg: 1.125rem;
46
+ --font-size-xl: 1.25rem;
47
+ --font-size-2xl: 1.5rem;
48
+ --font-size-3xl: 2rem;
49
+
50
+ /* Font Weights */
51
+ --font-weight-normal: 400;
52
+ --font-weight-medium: 500;
53
+ --font-weight-semibold: 600;
54
+ --font-weight-bold: 700;
55
+
56
+ /* Border Radius */
57
+ --radius-sm: 0.25rem;
58
+ --radius-md: 0.5rem;
59
+ --radius-lg: 0.75rem;
60
+ --radius-xl: 1rem;
61
+ --radius-full: 9999px;
62
+ --border-radius-sm: 0.25rem;
63
+ --border-radius-md: 0.5rem;
64
+ --border-radius-lg: 0.75rem;
65
+
66
+ /* Shadows */
67
+ --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);
68
+ --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1);
69
+ --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1);
70
+ --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1);
71
+
72
+ /* Transitions */
73
+ --transition-base: 150ms cubic-bezier(0.4, 0, 0.2, 1);
74
+ --transition-fast: 150ms;
75
+ --transition-slow: 300ms cubic-bezier(0.4, 0, 0.2, 1);
76
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Accessibility assertion helper for component golden tests (Sweep L4, #1423).
3
+ *
4
+ * Runs axe-core against a rendered container and fails the test with a readable
5
+ * report if any violations are found. Use after a Testing Library `render()`:
6
+ *
7
+ * const { container } = render(MyComponent, { props });
8
+ * await expectNoA11yViolations(container);
9
+ *
10
+ * `color-contrast` is disabled by default: jsdom has no layout/paint engine, so
11
+ * contrast can't be computed and the rule produces non-deterministic noise.
12
+ * Pass `{ rules: { 'color-contrast': { enabled: true } } }` to override.
13
+ */
14
+ import axe from 'axe-core';
15
+ export declare function expectNoA11yViolations(container: HTMLElement, options?: axe.RunOptions): Promise<void>;
16
+ //# sourceMappingURL=a11y.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a11y.d.ts","sourceRoot":"","sources":["../../src/test-support/a11y.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,GAAG,MAAM,UAAU,CAAC;AAG3B,wBAAsB,sBAAsB,CAC1C,SAAS,EAAE,WAAW,EACtB,OAAO,GAAE,GAAG,CAAC,UAAe,GAC3B,OAAO,CAAC,IAAI,CAAC,CAmBf"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Accessibility assertion helper for component golden tests (Sweep L4, #1423).
3
+ *
4
+ * Runs axe-core against a rendered container and fails the test with a readable
5
+ * report if any violations are found. Use after a Testing Library `render()`:
6
+ *
7
+ * const { container } = render(MyComponent, { props });
8
+ * await expectNoA11yViolations(container);
9
+ *
10
+ * `color-contrast` is disabled by default: jsdom has no layout/paint engine, so
11
+ * contrast can't be computed and the rule produces non-deterministic noise.
12
+ * Pass `{ rules: { 'color-contrast': { enabled: true } } }` to override.
13
+ */
14
+ import axe from 'axe-core';
15
+ import { expect } from 'vitest';
16
+ export async function expectNoA11yViolations(container, options = {}) {
17
+ const results = await axe.run(container, {
18
+ rules: { 'color-contrast': { enabled: false } },
19
+ ...options,
20
+ });
21
+ if (results.violations.length > 0) {
22
+ const report = results.violations
23
+ .map((v) => {
24
+ const targets = v.nodes
25
+ .map((n) => ` - ${n.target.join(' ')}`)
26
+ .join('\n');
27
+ return ` [${v.id}] ${v.help}\n ${v.helpUrl}\n${targets}`;
28
+ })
29
+ .join('\n');
30
+ expect.fail(`axe found ${results.violations.length} accessibility violation(s):\n${report}`);
31
+ }
32
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Vitest setup for smrt-svelte component tests (Sweep L4, #1423).
3
+ *
4
+ * Registered via `setupFiles` in vitest.config.ts (the smrt-vitest plugin
5
+ * appends its own setup alongside this one). Provides:
6
+ * - jest-dom matchers (`toBeInTheDocument`, `toHaveAttribute`, `toBeDisabled`, …)
7
+ * - Testing Library auto-cleanup after each test (unmounts mounted components
8
+ * so the jsdom document doesn't leak between tests).
9
+ */
10
+ import '@testing-library/jest-dom/vitest';
11
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/test-support/setup.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,kCAAkC,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Vitest setup for smrt-svelte component tests (Sweep L4, #1423).
3
+ *
4
+ * Registered via `setupFiles` in vitest.config.ts (the smrt-vitest plugin
5
+ * appends its own setup alongside this one). Provides:
6
+ * - jest-dom matchers (`toBeInTheDocument`, `toHaveAttribute`, `toBeDisabled`, …)
7
+ * - Testing Library auto-cleanup after each test (unmounts mounted components
8
+ * so the jsdom document doesn't leak between tests).
9
+ */
10
+ import '@testing-library/jest-dom/vitest';
11
+ import { cleanup } from '@testing-library/svelte';
12
+ import { afterEach } from 'vitest';
13
+ afterEach(() => {
14
+ cleanup();
15
+ });
16
+ // jsdom does not implement the native <dialog> modal methods, so components
17
+ // that drive a dialog via showModal()/close() (e.g. Modal, ConfirmDialog) throw
18
+ // on mount. Polyfill the minimum: toggle the `open` property (which jsdom
19
+ // reflects to the attribute, giving the element its `dialog` role) and emit the
20
+ // matching events.
21
+ if (typeof HTMLDialogElement !== 'undefined') {
22
+ if (!HTMLDialogElement.prototype.showModal) {
23
+ HTMLDialogElement.prototype.showModal = function showModal() {
24
+ this.open = true;
25
+ };
26
+ }
27
+ if (!HTMLDialogElement.prototype.close) {
28
+ HTMLDialogElement.prototype.close = function close() {
29
+ this.open = false;
30
+ this.dispatchEvent(new Event('close'));
31
+ };
32
+ }
33
+ }
@@ -0,0 +1,207 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+ import { onMount } from 'svelte';
4
+ import {
5
+ setThemeContext,
6
+ type ThemeContext,
7
+ type ThemeState,
8
+ } from './context.js';
9
+ import {
10
+ type ColorScheme,
11
+ defaultThemeConfig,
12
+ generateThemeVariables,
13
+ type ThemeConfig,
14
+ } from './tokens.js';
15
+
16
+ interface Props {
17
+ /** Initial color scheme */
18
+ colorScheme?: ColorScheme;
19
+ /** Primary color override */
20
+ primaryColor?: string;
21
+ /** Border radius scale */
22
+ borderRadius?: ThemeConfig['borderRadius'];
23
+ /** Custom CSS variable overrides */
24
+ overrides?: Record<string, string>;
25
+ /** Persist preference to localStorage */
26
+ persist?: boolean;
27
+ /** Storage key for persistence */
28
+ storageKey?: string;
29
+ /** Content */
30
+ children: Snippet;
31
+ }
32
+
33
+ let {
34
+ colorScheme = 'system',
35
+ primaryColor,
36
+ borderRadius = 'md',
37
+ overrides = {},
38
+ persist = true,
39
+ storageKey = 'smrt-theme',
40
+ children,
41
+ }: Props = $props();
42
+
43
+ // Internal state
44
+ let config = $state<ThemeConfig>({
45
+ colorScheme: 'system',
46
+ primaryColor: defaultThemeConfig.primaryColor,
47
+ borderRadius: 'md',
48
+ overrides: {},
49
+ });
50
+ let appliedColorScheme: ColorScheme | undefined;
51
+ let appliedPrimaryColor: string | undefined;
52
+ let appliedBorderRadius: ThemeConfig['borderRadius'] | undefined;
53
+ let appliedOverrides: Record<string, string> | undefined;
54
+
55
+ $effect(() => {
56
+ if (
57
+ appliedColorScheme === colorScheme &&
58
+ appliedPrimaryColor === primaryColor &&
59
+ appliedBorderRadius === borderRadius &&
60
+ appliedOverrides === overrides
61
+ ) {
62
+ return;
63
+ }
64
+
65
+ appliedColorScheme = colorScheme;
66
+ appliedPrimaryColor = primaryColor;
67
+ appliedBorderRadius = borderRadius;
68
+ appliedOverrides = overrides;
69
+
70
+ config = {
71
+ colorScheme,
72
+ primaryColor: primaryColor ?? defaultThemeConfig.primaryColor,
73
+ borderRadius,
74
+ overrides,
75
+ };
76
+ });
77
+
78
+ let systemPrefersDark = $state(false);
79
+ let mounted = $state(false);
80
+
81
+ // Resolved scheme (never 'system')
82
+ const resolvedScheme = $derived<'light' | 'dark'>(
83
+ config.colorScheme === 'system'
84
+ ? systemPrefersDark
85
+ ? 'dark'
86
+ : 'light'
87
+ : config.colorScheme,
88
+ );
89
+
90
+ const isDark = $derived(resolvedScheme === 'dark');
91
+
92
+ // Generate CSS variables
93
+ const cssVariables = $derived(() => {
94
+ const vars = generateThemeVariables(isDark);
95
+
96
+ // Override primary color if specified
97
+ if (
98
+ config.primaryColor &&
99
+ config.primaryColor !== defaultThemeConfig.primaryColor
100
+ ) {
101
+ vars['--smrt-color-primary'] = config.primaryColor;
102
+ }
103
+
104
+ // Apply custom overrides
105
+ return { ...vars, ...config.overrides };
106
+ });
107
+
108
+ // Create style string
109
+ const styleString = $derived(() => {
110
+ const vars = cssVariables();
111
+ return Object.entries(vars)
112
+ .map(([key, value]) => `${key}: ${value}`)
113
+ .join('; ');
114
+ });
115
+
116
+ // Theme state for context
117
+ const themeState = $derived<ThemeState>({
118
+ colorScheme: config.colorScheme,
119
+ resolvedScheme,
120
+ isDark,
121
+ config,
122
+ });
123
+
124
+ // Context methods
125
+ function setColorScheme(scheme: ColorScheme): void {
126
+ config.colorScheme = scheme;
127
+ if (persist && typeof localStorage !== 'undefined') {
128
+ try {
129
+ localStorage.setItem(storageKey, scheme);
130
+ } catch {
131
+ // Ignore storage errors (e.g. quota exceeded, access denied in private browsing)
132
+ }
133
+ }
134
+ }
135
+
136
+ function toggleColorScheme(): void {
137
+ const newScheme = isDark ? 'light' : 'dark';
138
+ setColorScheme(newScheme);
139
+ }
140
+
141
+ function updateConfig(updates: Partial<ThemeConfig>): void {
142
+ config = { ...config, ...updates };
143
+ }
144
+
145
+ // Create context
146
+ const context: ThemeContext = {
147
+ get state() {
148
+ return themeState;
149
+ },
150
+ setColorScheme,
151
+ toggleColorScheme,
152
+ updateConfig,
153
+ };
154
+
155
+ setThemeContext(context);
156
+
157
+ onMount(() => {
158
+ // Check system preference
159
+ if (typeof window !== 'undefined') {
160
+ const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
161
+ systemPrefersDark = mediaQuery.matches;
162
+
163
+ // Listen for system preference changes
164
+ const handler = (e: MediaQueryListEvent) => {
165
+ systemPrefersDark = e.matches;
166
+ };
167
+ mediaQuery.addEventListener('change', handler);
168
+
169
+ // Load persisted preference
170
+ if (persist) {
171
+ try {
172
+ const stored = localStorage.getItem(storageKey);
173
+ if (stored && ['light', 'dark', 'system'].includes(stored)) {
174
+ config.colorScheme = stored as ColorScheme;
175
+ }
176
+ } catch {
177
+ // Ignore storage errors (e.g. access denied in private browsing)
178
+ }
179
+ }
180
+
181
+ mounted = true;
182
+
183
+ return () => {
184
+ mediaQuery.removeEventListener('change', handler);
185
+ };
186
+ }
187
+ });
188
+
189
+ // Update document class for global dark mode styling
190
+ $effect(() => {
191
+ if (typeof document !== 'undefined' && mounted) {
192
+ document.documentElement.classList.toggle('dark', isDark);
193
+ document.documentElement.setAttribute('data-theme', resolvedScheme);
194
+ }
195
+ });
196
+ </script>
197
+
198
+ <div class="smrt-theme-root" class:dark={isDark} style={styleString()} data-theme={resolvedScheme}>
199
+ {@render children()}
200
+ </div>
201
+
202
+ <style>
203
+ .smrt-theme-root {
204
+ /* Ensure theme variables cascade to all children */
205
+ display: contents;
206
+ }
207
+ </style>
@@ -0,0 +1,22 @@
1
+ import type { Snippet } from 'svelte';
2
+ import { type ColorScheme, type ThemeConfig } from './tokens.js';
3
+ interface Props {
4
+ /** Initial color scheme */
5
+ colorScheme?: ColorScheme;
6
+ /** Primary color override */
7
+ primaryColor?: string;
8
+ /** Border radius scale */
9
+ borderRadius?: ThemeConfig['borderRadius'];
10
+ /** Custom CSS variable overrides */
11
+ overrides?: Record<string, string>;
12
+ /** Persist preference to localStorage */
13
+ persist?: boolean;
14
+ /** Storage key for persistence */
15
+ storageKey?: string;
16
+ /** Content */
17
+ children: Snippet;
18
+ }
19
+ declare const ThemeProvider: import("svelte").Component<Props, {}, "">;
20
+ type ThemeProvider = ReturnType<typeof ThemeProvider>;
21
+ export default ThemeProvider;
22
+ //# sourceMappingURL=ThemeProvider.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ThemeProvider.svelte.d.ts","sourceRoot":"","sources":["../../src/theme/ThemeProvider.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAOtC,OAAO,EACL,KAAK,WAAW,EAGhB,KAAK,WAAW,EACjB,MAAM,aAAa,CAAC;AAGrB,UAAU,KAAK;IACb,2BAA2B;IAC3B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,6BAA6B;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0BAA0B;IAC1B,YAAY,CAAC,EAAE,WAAW,CAAC,cAAc,CAAC,CAAC;IAC3C,oCAAoC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,yCAAyC;IACzC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kCAAkC;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc;IACd,QAAQ,EAAE,OAAO,CAAC;CACnB;AAqLD,QAAA,MAAM,aAAa,2CAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Theme context for sharing theme state across components
3
+ */
4
+ import type { ColorScheme, ThemeConfig } from './tokens.js';
5
+ /**
6
+ * Theme context key
7
+ */
8
+ export declare const THEME_KEY: unique symbol;
9
+ /**
10
+ * Theme state interface
11
+ */
12
+ export interface ThemeState {
13
+ /** Current color scheme */
14
+ colorScheme: ColorScheme;
15
+ /** Resolved color scheme (never 'system') */
16
+ resolvedScheme: 'light' | 'dark';
17
+ /** Whether dark mode is active */
18
+ isDark: boolean;
19
+ /** Full theme configuration */
20
+ config: ThemeConfig;
21
+ }
22
+ /**
23
+ * Theme context interface with methods
24
+ */
25
+ export interface ThemeContext {
26
+ /** Current theme state */
27
+ state: ThemeState;
28
+ /** Set color scheme preference */
29
+ setColorScheme: (scheme: ColorScheme) => void;
30
+ /** Toggle between light and dark */
31
+ toggleColorScheme: () => void;
32
+ /** Update theme configuration */
33
+ updateConfig: (config: Partial<ThemeConfig>) => void;
34
+ }
35
+ /**
36
+ * Set theme context (used by ThemeProvider)
37
+ */
38
+ export declare function setThemeContext(context: ThemeContext): void;
39
+ /**
40
+ * Get theme context
41
+ * @throws If called outside of ThemeProvider
42
+ */
43
+ export declare function getThemeContext(): ThemeContext;
44
+ /**
45
+ * Try to get theme context
46
+ * Returns null if not available (doesn't throw)
47
+ */
48
+ export declare function tryGetThemeContext(): ThemeContext | null;
49
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/theme/context.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE5D;;GAEG;AACH,eAAO,MAAM,SAAS,eAAuB,CAAC;AAE9C;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,2BAA2B;IAC3B,WAAW,EAAE,WAAW,CAAC;IACzB,6CAA6C;IAC7C,cAAc,EAAE,OAAO,GAAG,MAAM,CAAC;IACjC,kCAAkC;IAClC,MAAM,EAAE,OAAO,CAAC;IAChB,+BAA+B;IAC/B,MAAM,EAAE,WAAW,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,0BAA0B;IAC1B,KAAK,EAAE,UAAU,CAAC;IAClB,kCAAkC;IAClC,cAAc,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;IAC9C,oCAAoC;IACpC,iBAAiB,EAAE,MAAM,IAAI,CAAC;IAC9B,iCAAiC;IACjC,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;CACtD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAE3D;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,YAAY,CAU9C;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,YAAY,GAAG,IAAI,CAExD"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Theme context for sharing theme state across components
3
+ */
4
+ import { getContext, setContext } from 'svelte';
5
+ /**
6
+ * Theme context key
7
+ */
8
+ export const THEME_KEY = Symbol('smrt-theme');
9
+ /**
10
+ * Set theme context (used by ThemeProvider)
11
+ */
12
+ export function setThemeContext(context) {
13
+ setContext(THEME_KEY, context);
14
+ }
15
+ /**
16
+ * Get theme context
17
+ * @throws If called outside of ThemeProvider
18
+ */
19
+ export function getThemeContext() {
20
+ const context = getContext(THEME_KEY);
21
+ if (!context) {
22
+ throw new Error('Theme context not found. Make sure to wrap your app with <ThemeProvider>');
23
+ }
24
+ return context;
25
+ }
26
+ /**
27
+ * Try to get theme context
28
+ * Returns null if not available (doesn't throw)
29
+ */
30
+ export function tryGetThemeContext() {
31
+ return getContext(THEME_KEY) ?? null;
32
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Theme system exports
3
+ */
4
+ export { getThemeContext, setThemeContext, THEME_KEY, type ThemeContext, type ThemeState, tryGetThemeContext, } from './context.js';
5
+ export { default as ThemeProvider } from './ThemeProvider.svelte';
6
+ export { borderRadius, type ColorScheme, darkColors, defaultThemeConfig, duration, easing, elevation, generateColorVariables, generateThemeVariables, lightColors, spacing, type ThemeConfig, typography, } from './tokens.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/theme/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,eAAe,EACf,eAAe,EACf,SAAS,EACT,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,kBAAkB,GACnB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAGlE,OAAO,EACL,YAAY,EACZ,KAAK,WAAW,EAChB,UAAU,EACV,kBAAkB,EAClB,QAAQ,EACR,MAAM,EACN,SAAS,EACT,sBAAsB,EACtB,sBAAsB,EACtB,WAAW,EACX,OAAO,EACP,KAAK,WAAW,EAChB,UAAU,GACX,MAAM,aAAa,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Theme system exports
3
+ */
4
+ // Context
5
+ export { getThemeContext, setThemeContext, THEME_KEY, tryGetThemeContext, } from './context.js';
6
+ // Components
7
+ export { default as ThemeProvider } from './ThemeProvider.svelte';
8
+ // Tokens
9
+ export { borderRadius, darkColors, defaultThemeConfig, duration, easing, elevation, generateColorVariables, generateThemeVariables, lightColors, spacing, typography, } from './tokens.js';