@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,675 @@
1
+ # SMRT Svelte Themes
2
+
3
+ A comprehensive, multi-theme system for SMRT Svelte with support for Material Design, Apple Glass, and Google AI Studio aesthetics. All themes include both light and dark modes.
4
+
5
+ ## Features
6
+
7
+ - **3 Theme Presets**: Material (improved M3), Glass (Apple-style), Studio (Google AI Studio flat)
8
+ - **Light & Dark Modes**: Automatic system detection with manual override
9
+ - **Runtime Theme Switching**: Change themes without page reload
10
+ - **CSS Custom Properties**: Full theming via CSS variables
11
+ - **Persistence**: Theme preferences saved to localStorage
12
+ - **Type-Safe**: Full TypeScript support
13
+
14
+ ## Installation
15
+
16
+ ```bash
17
+ npm install @happyvertical/smrt-ui
18
+ ```
19
+
20
+ ## Creating Custom Themes
21
+
22
+ You can create your own themes and use them alongside or instead of the built-in themes.
23
+
24
+ ### Simple Custom Theme (Recommended)
25
+
26
+ ```typescript
27
+ // src/lib/themes/brand.ts
28
+ import { createTheme, registerTheme } from '@happyvertical/smrt-ui/themes';
29
+
30
+ const brandTheme = createTheme({
31
+ id: 'brand',
32
+ name: 'Brand Theme',
33
+ light: {
34
+ primary: '#ff6b35',
35
+ background: '#fafafa',
36
+ surface: '#ffffff',
37
+ // ... other colors (auto-generated if not specified)
38
+ },
39
+ dark: {
40
+ primary: '#ff8c5a',
41
+ background: '#0a0a0a',
42
+ surface: '#1a1a1a',
43
+ // ... other colors
44
+ },
45
+ fontFamily: 'Inter, system-ui, sans-serif',
46
+ });
47
+
48
+ // Register for use with ThemeProvider
49
+ registerTheme(brandTheme);
50
+
51
+ export { brandTheme };
52
+ ```
53
+
54
+ ```svelte
55
+ <!-- +layout.svelte -->
56
+ <script>
57
+ import { ThemeProvider } from '@happyvertical/smrt-ui/themes';
58
+ import '@happyvertical/smrt-ui/themes/styles/all.css';
59
+ import '$lib/themes/brand'; // Import to register
60
+ </script>
61
+
62
+ <ThemeProvider preset="brand" colorScheme="system">
63
+ {@render children()}
64
+ </ThemeProvider>
65
+ ```
66
+
67
+ ### Theme from a Single Color
68
+
69
+ ```typescript
70
+ import { createThemeFromColor, registerTheme } from '@happyvertical/smrt-ui/themes';
71
+
72
+ const autoTheme = createThemeFromColor('#6366f1', 'indigo', 'Indigo Theme');
73
+ registerTheme(autoTheme);
74
+ ```
75
+
76
+ ### Full Custom Theme with All Options
77
+
78
+ ```typescript
79
+ import { createTheme, registerTheme } from '@happyvertical/smrt-ui/themes';
80
+
81
+ const completeTheme = createTheme({
82
+ id: 'fintech',
83
+ name: 'Fintech Pro',
84
+
85
+ // Extend an existing theme as a base
86
+ extend: 'material',
87
+
88
+ // Light mode colors (required)
89
+ light: {
90
+ primary: '#0066ff',
91
+ onPrimary: '#ffffff',
92
+ primaryContainer: '#e6f0ff',
93
+ onPrimaryContainer: '#001a4d',
94
+ secondary: '#00c853',
95
+ onSecondary: '#000000',
96
+ background: '#f8fafc',
97
+ surface: '#ffffff',
98
+ surfaceVariant: '#f1f5f9',
99
+ error: '#dc2626',
100
+ success: '#22c55e',
101
+ warning: '#f59e0b',
102
+ outline: '#e2e8f0',
103
+ },
104
+
105
+ // Dark mode colors (optional, auto-generated if not provided)
106
+ dark: {
107
+ primary: '#4d94ff',
108
+ onPrimary: '#001a4d',
109
+ primaryContainer: '#0047b3',
110
+ onPrimaryContainer: '#e6f0ff',
111
+ background: '#0f172a',
112
+ surface: '#1e293b',
113
+ // ... etc
114
+ },
115
+
116
+ // Custom typography (optional)
117
+ typography: {
118
+ displayLarge: {
119
+ size: '4rem',
120
+ lineHeight: '1.1',
121
+ weight: '700',
122
+ tracking: '-0.02em',
123
+ },
124
+ // ... other type scales
125
+ },
126
+
127
+ // Custom elevation (optional)
128
+ elevation: {
129
+ 1: '0 2px 4px rgba(0,0,0,0.05)',
130
+ 2: '0 4px 8px rgba(0,0,0,0.08)',
131
+ // ... etc
132
+ },
133
+
134
+ // Custom font
135
+ fontFamily: '"SF Pro Display", Inter, system-ui, sans-serif',
136
+
137
+ // Glass effects (optional)
138
+ glass: {
139
+ blur: '24px',
140
+ saturation: '200%',
141
+ borderOpacity: '0.2',
142
+ backgroundOpacity: '0.8',
143
+ },
144
+ });
145
+
146
+ registerTheme(completeTheme);
147
+ ```
148
+
149
+ ### Using Custom Themes Without Registration
150
+
151
+ If you don't want to register a theme globally, you can pass it directly to ThemeProvider:
152
+
153
+ ```svelte
154
+ <script>
155
+ import { ThemeProvider } from '@happyvertical/smrt-ui/themes';
156
+ import { materialTheme } from '@happyvertical/smrt-ui/themes';
157
+
158
+ // Create a one-off theme by extending
159
+ const myOneOffTheme = {
160
+ ...materialTheme,
161
+ id: 'custom',
162
+ name: 'Custom',
163
+ light: {
164
+ ...materialTheme.light,
165
+ primary: '#custom-color',
166
+ },
167
+ };
168
+ </script>
169
+
170
+ <!-- Note: This requires the theme CSS to be loaded manually -->
171
+ <ThemeProvider preset="material" overrides={{
172
+ '--smrt-color-primary': '#custom-color'
173
+ }}>
174
+ {@render children()}
175
+ </ThemeProvider>
176
+ ```
177
+
178
+ ### CSS-Only Custom Themes
179
+
180
+ For projects that don't use JavaScript theming, create a CSS file:
181
+
182
+ ```css
183
+ /* src/styles/my-theme.css */
184
+
185
+ /* Import base tokens */
186
+ @import '@happyvertical/smrt-ui/themes/styles/material.css';
187
+
188
+ /* Override with custom values */
189
+ [data-theme="custom"] {
190
+ --smrt-color-primary: #ff6b35;
191
+ --smrt-color-on-primary: #ffffff;
192
+ --smrt-color-primary-container: #fff0e6;
193
+ --smrt-color-on-primary-container: #cc4a1d;
194
+
195
+ /* Custom typography */
196
+ --smrt-font-family: 'Inter', system-ui, sans-serif;
197
+
198
+ /* Custom border radius */
199
+ --smrt-radius-md: 0.75rem;
200
+ --smrt-radius-lg: 1rem;
201
+ }
202
+
203
+ [data-theme="custom"][data-color-scheme="dark"] {
204
+ --smrt-color-primary: #ff8c5a;
205
+ --smrt-color-background: #0a0a0a;
206
+ --smrt-color-surface: #1a1a1a;
207
+ }
208
+ ```
209
+
210
+ ```svelte
211
+ <!-- +layout.svelte -->
212
+ <script>
213
+ import '../styles/my-theme.css';
214
+ </script>
215
+
216
+ <div data-theme="custom" data-color-scheme="light">
217
+ {@render children()}
218
+ </div>
219
+ ```
220
+
221
+ ## Quick Start
222
+
223
+ ### Option 1: Full Runtime Theming (Recommended)
224
+
225
+ Best for apps that need theme switching and dynamic color schemes.
226
+
227
+ ```svelte
228
+ <!-- +layout.svelte -->
229
+ <script>
230
+ import { ThemeProvider } from '@happyvertical/smrt-ui/themes';
231
+ import '@happyvertical/smrt-ui/themes/styles/all.css';
232
+ </script>
233
+
234
+ <ThemeProvider preset="material" colorScheme="system">
235
+ {@render children()}
236
+ </ThemeProvider>
237
+ ```
238
+
239
+ ### Option 2: Build-Time Theming
240
+
241
+ Best for static sites or when you want minimal JavaScript overhead.
242
+
243
+ ```svelte
244
+ <!-- +layout.svelte -->
245
+ <script>
246
+ // Import only the theme you need
247
+ import '@happyvertical/smrt-ui/themes/styles/material.css';
248
+ </script>
249
+
250
+ <!-- Set data attributes for the theme -->
251
+ <div data-theme="material" data-color-scheme="light">
252
+ {@render children()}
253
+ </div>
254
+ ```
255
+
256
+ ### Option 3: System-Only (No Runtime JS)
257
+
258
+ For maximum performance, use CSS only with media queries:
259
+
260
+ ```css
261
+ /* In your global CSS */
262
+ @import '@happyvertical/smrt-ui/themes/styles/material.css';
263
+
264
+ /* Override to respect system preference */
265
+ @media (prefers-color-scheme: dark) {
266
+ :root {
267
+ --smrt-color-background: #0e0e0e;
268
+ --smrt-color-on-background: #e3e3e3;
269
+ /* ... other dark mode colors */
270
+ }
271
+ }
272
+ ```
273
+
274
+ ## Import CSS
275
+
276
+ Import the theme styles in your app entry point:
277
+
278
+ ```ts
279
+ // Import all themes (for runtime switching)
280
+ import '@smrt/svelte/themes/styles/all.css';
281
+
282
+ // Or import specific theme only
283
+ import '@smrt/svelte/themes/styles/material.css';
284
+ import '@smrt/svelte/themes/styles/glass.css';
285
+ import '@smrt/svelte/themes/styles/studio.css';
286
+ ```
287
+
288
+ ## ThemeProvider Props
289
+
290
+ | Prop | Type | Default | Description |
291
+ |------|------|---------|-------------|
292
+ | `preset` | `'material' \| 'glass' \| 'studio'` | `'material'` | Theme preset |
293
+ | `colorScheme` | `'light' \| 'dark' \| 'system'` | `'system'` | Color scheme preference |
294
+ | `primaryColor` | `string` | - | Override primary accent color |
295
+ | `borderRadius` | `'none' \| 'sm' \| 'md' \| 'lg' \| 'xl' \| 'full'` | `'md'` | Border radius scale |
296
+ | `overrides` | `Record<string, string>` | `{}` | Custom CSS variable overrides |
297
+ | `persist` | `boolean` | `true` | Persist to localStorage |
298
+ | `storageKey` | `string` | `'smrt-theme'` | localStorage key |
299
+
300
+ ## Theme Switching
301
+
302
+ Use the context to switch themes programmatically:
303
+
304
+ ```svelte
305
+ <script>
306
+ import { getThemeContext, ThemeSwitcher } from '@smrt/svelte/themes';
307
+
308
+ const theme = getThemeContext();
309
+
310
+ // Switch to glass theme
311
+ function goGlass() {
312
+ theme.setPreset('glass');
313
+ }
314
+
315
+ // Toggle dark mode
316
+ function toggleDark() {
317
+ theme.toggleColorScheme();
318
+ }
319
+ </script>
320
+
321
+ <!-- Or use the built-in UI components -->
322
+ <ThemeSwitcher variant="segmented" />
323
+ <ColorSchemeToggle variant="buttons" />
324
+ ```
325
+
326
+ ## Theme Characteristics
327
+
328
+ ### Material (Default)
329
+
330
+ Modern Google Material Design 3 with refined colors and typography.
331
+
332
+ - **Colors**: Vibrant blues, clean neutrals, OLED-friendly dark mode
333
+ - **Elevation**: Multi-layer shadows with good depth perception
334
+ - **Typography**: Google Sans / Roboto style metrics
335
+ - **Use for**: General purpose, Google ecosystem alignment
336
+
337
+ ### Glass
338
+
339
+ Apple-inspired glass morphism with backdrop blur effects.
340
+
341
+ - **Colors**: Translucent surfaces, system colors, layered depth
342
+ - **Effects**: Backdrop blur, saturation boost, frosted glass
343
+ - **Typography**: SF Pro style metrics, tighter tracking
344
+ - **Use for**: Premium feel, iOS/macOS alignment, visual depth
345
+
346
+ **Glass Utility Classes:**
347
+
348
+ ```html
349
+ <div class="smrt-glass">Default glass effect</div>
350
+ <div class="smrt-glass-thick">Thicker blur</div>
351
+ <div class="smrt-glass-thin">Subtle blur</div>
352
+ ```
353
+
354
+ ### Studio
355
+
356
+ Google AI Studio-inspired flat design with minimal aesthetics.
357
+
358
+ - **Colors**: Monochromatic base, vibrant accent colors
359
+ - **Elevation**: Minimal shadows, inset borders, clean lines
360
+ - **Typography**: Clean sans-serif, larger body text for readability
361
+ - **Use for**: Developer tools, content-heavy apps, minimal aesthetic
362
+
363
+ **Studio Utility Classes:**
364
+
365
+ ```html
366
+ <div class="smrt-flat">Flat bordered surface</div>
367
+ <div class="smrt-flat-inset">Inset border effect</div>
368
+ <div class="smrt-flat-subtle">Subtle elevation</div>
369
+ ```
370
+
371
+ ## Project Integration Patterns
372
+
373
+ ### SvelteKit App
374
+
375
+ ```svelte
376
+ <!-- src/routes/+layout.svelte -->
377
+ <script>
378
+ import { ThemeProvider, ThemeSwitcher, ColorSchemeToggle } from '@happyvertical/smrt-ui/themes';
379
+ import '@happyvertical/smrt-ui/themes/styles/all.css';
380
+ </script>
381
+
382
+ <ThemeProvider preset="glass" colorScheme="system" persist={true}>
383
+ <header>
384
+ <nav>
385
+ <ThemeSwitcher variant="segmented" />
386
+ <ColorSchemeToggle variant="buttons" />
387
+ </nav>
388
+ </header>
389
+
390
+ <main>
391
+ {@render children()}
392
+ </main>
393
+ </ThemeProvider>
394
+ ```
395
+
396
+ ### SvelteKit with Server-Side Theme
397
+
398
+ ```typescript
399
+ // src/routes/+layout.server.ts
400
+ export const load = async ({ cookies }) => {
401
+ return {
402
+ theme: {
403
+ preset: cookies.get('theme-preset') || 'material',
404
+ colorScheme: cookies.get('theme-mode') || 'system',
405
+ }
406
+ };
407
+ };
408
+ ```
409
+
410
+ ```svelte
411
+ <!-- src/routes/+layout.svelte -->
412
+ <script>
413
+ import { ThemeProvider } from '@happyvertical/smrt-ui/themes';
414
+ import '@happyvertical/smrt-ui/themes/styles/all.css';
415
+
416
+ let { data, children } = $props();
417
+ </script>
418
+
419
+ <ThemeProvider
420
+ preset={data.theme.preset}
421
+ colorScheme={data.theme.colorScheme}
422
+ persist={false}
423
+ >
424
+ {@render children()}
425
+ </ThemeProvider>
426
+ ```
427
+
428
+ ### Vite/Vanilla JS Project
429
+
430
+ ```javascript
431
+ // main.js
432
+ import '@happyvertical/smrt-ui/themes/styles/all.css';
433
+ import { generateThemeVariables, getTheme } from '@happyvertical/smrt-ui/themes';
434
+
435
+ // Apply theme
436
+ const theme = getTheme('studio');
437
+ const isDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
438
+ const vars = generateThemeVariables(theme, isDark);
439
+
440
+ // Set CSS variables
441
+ Object.entries(vars).forEach(([key, value]) => {
442
+ document.documentElement.style.setProperty(key, value);
443
+ });
444
+ ```
445
+
446
+ ### Tailwind CSS Integration
447
+
448
+ ```javascript
449
+ // tailwind.config.js
450
+ module.exports = {
451
+ theme: {
452
+ extend: {
453
+ colors: {
454
+ primary: 'var(--smrt-color-primary)',
455
+ secondary: 'var(--smrt-color-secondary)',
456
+ surface: 'var(--smrt-color-surface)',
457
+ background: 'var(--smrt-color-background)',
458
+ // ... map other tokens
459
+ },
460
+ borderRadius: {
461
+ sm: 'var(--smrt-radius-sm)',
462
+ md: 'var(--smrt-radius-md)',
463
+ lg: 'var(--smrt-radius-lg)',
464
+ },
465
+ boxShadow: {
466
+ 1: 'var(--smrt-elevation-1)',
467
+ 2: 'var(--smrt-elevation-2)',
468
+ 3: 'var(--smrt-elevation-3)',
469
+ },
470
+ },
471
+ },
472
+ };
473
+ ```
474
+
475
+ ```html
476
+ <!-- Use with Tailwind -->
477
+ <button class="bg-primary text-on-primary rounded-md shadow-2">
478
+ Click me
479
+ </button>
480
+ ```
481
+
482
+ ## CSS Custom Properties
483
+
484
+ All themes expose CSS custom properties:
485
+
486
+ ```css
487
+ /* Colors */
488
+ --smrt-color-primary
489
+ --smrt-color-surface
490
+ --smrt-color-background
491
+ /* ... and 60+ more color tokens */
492
+
493
+ /* Typography */
494
+ --smrt-typography-body-large-size
495
+ --smrt-typography-body-large-line-height
496
+ --smrt-typography-body-large-weight
497
+ /* ... for all type scales */
498
+
499
+ /* Spacing */
500
+ --smrt-spacing-1 /* 0.25rem */
501
+ --smrt-spacing-2 /* 0.5rem */
502
+ /* ... 0-24 scale */
503
+
504
+ /* Border Radius */
505
+ --smrt-radius-md /* 0.5rem */
506
+ --smrt-radius-lg /* 0.75rem */
507
+ /* ... sm, md, lg, xl, full */
508
+
509
+ /* Elevation */
510
+ --smrt-elevation-1
511
+ --smrt-elevation-2
512
+ /* ... 0-5 scale */
513
+
514
+ /* Animation */
515
+ --smrt-duration-normal
516
+ --smrt-easing-standard
517
+ ```
518
+
519
+ ## Advanced Usage
520
+
521
+ ### Build-Time Theming
522
+
523
+ For SSR or static sites, import CSS directly and set data attributes:
524
+
525
+ ```html
526
+ <html data-theme="material" data-color-scheme="light">
527
+ ```
528
+
529
+ ### Custom Theme Overrides
530
+
531
+ ```svelte
532
+ <ThemeProvider
533
+ preset="material"
534
+ overrides={{
535
+ '--smrt-color-primary': '#ff5722',
536
+ '--smrt-radius-md': '1rem'
537
+ }}
538
+ >
539
+ <YourApp />
540
+ </ThemeProvider>
541
+ ```
542
+
543
+ ### Programmatic Configuration
544
+
545
+ ```svelte
546
+ <script>
547
+ import { getThemeContext } from '@smrt/svelte/themes';
548
+
549
+ const theme = getThemeContext();
550
+
551
+ // Update multiple settings at once
552
+ theme.updateConfig({
553
+ preset: 'studio',
554
+ colorScheme: 'dark',
555
+ borderRadius: 'lg'
556
+ });
557
+ </script>
558
+ ```
559
+
560
+ ### Access Theme State
561
+
562
+ ```svelte
563
+ <script>
564
+ import { getThemeContext } from '@smrt/svelte/themes';
565
+
566
+ const theme = getThemeContext();
567
+
568
+ // Reactive state
569
+ $: currentPreset = theme.state.preset;
570
+ $: isDark = theme.state.isDark;
571
+ $: themeConfig = theme.state.config;
572
+ </script>
573
+
574
+ <p>Current theme: {currentPreset}</p>
575
+ <p>Dark mode: {isDark ? 'On' : 'Off'}</p>
576
+ ```
577
+
578
+ ## Migration from Legacy Theme
579
+
580
+ The legacy theme system (`@smrt/svelte/theme`) is still available but deprecated. To migrate:
581
+
582
+ 1. Import from `@smrt/svelte/themes` instead
583
+ 2. Wrap app with new `<ThemeProvider>` from themes
584
+ 3. Import theme CSS files
585
+ 4. Update any theme context usage to new API
586
+
587
+ ```diff
588
+ - import { ThemeProvider } from '@smrt/svelte/theme';
589
+ + import { ThemeProvider } from '@smrt/svelte/themes';
590
+ + import '@smrt/svelte/themes/styles/all.css';
591
+ ```
592
+
593
+ ## Troubleshooting
594
+
595
+ ### CSS variables not applying
596
+
597
+ Make sure you've imported the CSS files:
598
+
599
+ ```typescript
600
+ // In your main entry file (+layout.svelte, main.ts, etc.)
601
+ import '@happyvertical/smrt-ui/themes/styles/all.css';
602
+ // or specific theme
603
+ import '@happyvertical/smrt-ui/themes/styles/material.css';
604
+ ```
605
+
606
+ ### Theme flashes on load (FOUC)
607
+
608
+ For SSR apps, set the theme on the server and inline critical CSS:
609
+
610
+ ```svelte
611
+ <!-- +layout.svelte -->
612
+ <svelte:head>
613
+ {@html `<style>
614
+ :root {
615
+ --smrt-color-background: ${data.theme.isDark ? '#0e0e0e' : '#ffffff'};
616
+ /* ... other critical vars */
617
+ }
618
+ </style>`}
619
+ </svelte:head>
620
+ ```
621
+
622
+ ### Glass theme not showing blur
623
+
624
+ The glass theme requires `backdrop-filter` support. For browsers that don't support it, the theme gracefully degrades to solid colors. To check support:
625
+
626
+ ```css
627
+ @supports not (backdrop-filter: blur(20px)) {
628
+ .glass-card {
629
+ background: rgba(255, 255, 255, 0.95) !important;
630
+ }
631
+ }
632
+ ```
633
+
634
+ ### TypeScript errors with CSS imports
635
+
636
+ If you get TypeScript errors importing CSS files, add a type declaration:
637
+
638
+ ```typescript
639
+ // src/app.d.ts or types/css.d.ts
640
+ declare module '*.css' {
641
+ const content: string;
642
+ export default content;
643
+ }
644
+ ```
645
+
646
+ ### Customizing a theme
647
+
648
+ You can extend any theme by overriding CSS variables after import:
649
+
650
+ ```css
651
+ /* In your global CSS, AFTER theme import */
652
+ @import '@happyvertical/smrt-ui/themes/styles/material.css';
653
+
654
+ [data-theme="material"] {
655
+ --smrt-color-primary: #your-brand-color;
656
+ --smrt-radius-md: 0.75rem;
657
+ }
658
+ ```
659
+
660
+ ## Browser Support
661
+
662
+ - **Material & Studio**: All modern browsers (Chrome 80+, Firefox 75+, Safari 13+, Edge 80+)
663
+ - **Glass**: Requires browsers with `backdrop-filter` support
664
+ - Chrome 76+
665
+ - Firefox 103+
666
+ - Safari 9+
667
+ - Edge 79+
668
+
669
+ ## Contributing
670
+
671
+ Contributions are welcome! Please read the [Contributing Guide](../../CONTRIBUTING.md) for details.
672
+
673
+ ## License
674
+
675
+ MIT