@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,341 @@
1
+ # Custom Theme Guide
2
+
3
+ This guide shows how to create and use custom themes in your own project repository.
4
+
5
+ ## Project Structure
6
+
7
+ ```
8
+ my-project/
9
+ ├── src/
10
+ │ ├── lib/
11
+ │ │ └── themes/
12
+ │ │ ├── brand.ts # TypeScript theme definition
13
+ │ │ ├── brand.css # CSS override file
14
+ │ │ └── index.ts # Export and registration
15
+ │ ├── routes/
16
+ │ │ └── +layout.svelte # Use your theme
17
+ │ └── app.html # Set data attributes
18
+ ├── static/
19
+ │ └── themes/ # Static CSS files (optional)
20
+ └── package.json
21
+ ```
22
+
23
+ ## Method 1: TypeScript Theme (Recommended)
24
+
25
+ ### 1. Create Theme Definition
26
+
27
+ ```typescript
28
+ // src/lib/themes/brand.ts
29
+ import { createTheme, registerTheme } from '@happyvertical/smrt-ui/themes';
30
+ import type { Theme } from '@happyvertical/smrt-ui/themes';
31
+
32
+ export const brandTheme: Theme = createTheme({
33
+ id: 'brand',
34
+ name: 'My Brand',
35
+
36
+ // Start from Material as a base
37
+ extend: 'material',
38
+
39
+ // Define your brand colors
40
+ light: {
41
+ primary: '#6366f1', // Indigo
42
+ secondary: '#8b5cf6', // Purple
43
+ tertiary: '#ec4899', // Pink
44
+ background: '#fafafa',
45
+ surface: '#ffffff',
46
+ error: '#ef4444',
47
+ success: '#10b981',
48
+ warning: '#f59e0b',
49
+ },
50
+
51
+ // Define dark mode (or let it auto-generate)
52
+ dark: {
53
+ primary: '#818cf8',
54
+ secondary: '#a78bfa',
55
+ tertiary: '#f472b6',
56
+ background: '#0f172a',
57
+ surface: '#1e293b',
58
+ },
59
+
60
+ // Use your brand font
61
+ fontFamily: '"Inter var", "Inter", system-ui, sans-serif',
62
+
63
+ // Optional: Custom border radius
64
+ borderRadius: {
65
+ none: '0',
66
+ sm: '0.25rem',
67
+ md: '0.5rem',
68
+ lg: '0.75rem',
69
+ xl: '1rem',
70
+ '2xl': '1.25rem',
71
+ '3xl': '1.5rem',
72
+ full: '9999px',
73
+ },
74
+ });
75
+
76
+ // Auto-register when imported
77
+ registerTheme(brandTheme);
78
+ ```
79
+
80
+ ### 2. Export Theme
81
+
82
+ ```typescript
83
+ // src/lib/themes/index.ts
84
+ export { brandTheme } from './brand.js';
85
+ ```
86
+
87
+ ### 3. Use in Layout
88
+
89
+ ```svelte
90
+ <!-- src/routes/+layout.svelte -->
91
+ <script>
92
+ // Import to register the theme
93
+ import '$lib/themes';
94
+
95
+ // Import base CSS
96
+ import '@happyvertical/smrt-ui/themes/styles/all.css';
97
+
98
+ // Your custom theme CSS (optional overrides)
99
+ import '$lib/themes/brand.css';
100
+
101
+ import { ThemeProvider } from '@happyvertical/smrt-ui/themes';
102
+ </script>
103
+
104
+ <ThemeProvider preset="brand" colorScheme="system" persist={true}>
105
+ {@render children()}
106
+ </ThemeProvider>
107
+ ```
108
+
109
+ ### 4. Optional CSS Overrides
110
+
111
+ ```css
112
+ /* src/lib/themes/brand.css */
113
+ /* Fine-tune specific components */
114
+
115
+ [data-theme="brand"] {
116
+ /* Custom component styles */
117
+ --my-brand-header-height: 64px;
118
+ --my-brand-sidebar-width: 240px;
119
+ }
120
+
121
+ [data-theme="brand"] .my-brand-button {
122
+ text-transform: uppercase;
123
+ letter-spacing: 0.05em;
124
+ }
125
+ ```
126
+
127
+ ## Method 2: CSS-Only Theme
128
+
129
+ For simpler cases, you can define a theme entirely in CSS:
130
+
131
+ ```css
132
+ /* src/styles/my-theme.css */
133
+
134
+ /* Import base structure */
135
+ @import '@happyvertical/smrt-ui/themes/styles/material.css';
136
+
137
+ /* Define light mode */
138
+ [data-theme="mybrand"][data-color-scheme="light"] {
139
+ /* Primary palette */
140
+ --smrt-color-primary: #0ea5e9;
141
+ --smrt-color-on-primary: #ffffff;
142
+ --smrt-color-primary-container: #e0f2fe;
143
+ --smrt-color-on-primary-container: #075985;
144
+
145
+ /* Secondary palette */
146
+ --smrt-color-secondary: #64748b;
147
+ --smrt-color-on-secondary: #ffffff;
148
+ --smrt-color-secondary-container: #f1f5f9;
149
+ --smrt-color-on-secondary-container: #334155;
150
+
151
+ /* Surfaces */
152
+ --smrt-color-surface: #ffffff;
153
+ --smrt-color-surface-variant: #f8fafc;
154
+ --smrt-color-background: #f1f5f9;
155
+ --smrt-color-on-surface: #0f172a;
156
+
157
+ /* Semantic colors */
158
+ --smrt-color-error: #ef4444;
159
+ --smrt-color-success: #22c55e;
160
+ --smrt-color-warning: #f59e0b;
161
+
162
+ /* Custom typography */
163
+ --smrt-font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
164
+
165
+ /* Custom spacing (optional) */
166
+ --smrt-spacing-1: 0.25rem;
167
+ --smrt-spacing-2: 0.5rem;
168
+ --smrt-spacing-4: 1rem;
169
+ --smrt-spacing-8: 2rem;
170
+ }
171
+
172
+ /* Define dark mode */
173
+ [data-theme="mybrand"][data-color-scheme="dark"] {
174
+ --smrt-color-primary: #38bdf8;
175
+ --smrt-color-on-primary: #0c4a6e;
176
+ --smrt-color-primary-container: #075985;
177
+ --smrt-color-on-primary-container: #e0f2fe;
178
+
179
+ --smrt-color-surface: #0f172a;
180
+ --smrt-color-surface-variant: #1e293b;
181
+ --smrt-color-background: #020617;
182
+ --smrt-color-on-surface: #f1f5f9;
183
+
184
+ --smrt-color-error: #f87171;
185
+ --smrt-color-success: #4ade80;
186
+ --smrt-color-warning: #fbbf24;
187
+ }
188
+ ```
189
+
190
+ ## Method 3: Hybrid Approach
191
+
192
+ Combine TypeScript definition with extensive CSS customization:
193
+
194
+ ```typescript
195
+ // src/lib/themes/hybrid.ts
196
+ import { createTheme, registerTheme } from '@happyvertical/smrt-ui/themes';
197
+
198
+ export const hybridTheme = createTheme({
199
+ id: 'hybrid',
200
+ name: 'Hybrid Brand',
201
+ extend: 'material',
202
+ light: {
203
+ primary: '#8b5cf6',
204
+ background: '#fafafa',
205
+ },
206
+ // Let dark mode auto-generate
207
+ });
208
+
209
+ registerTheme(hybridTheme);
210
+ ```
211
+
212
+ ```css
213
+ /* src/lib/themes/hybrid.css */
214
+ @import '@happyvertical/smrt-ui/themes/styles/material.css';
215
+
216
+ [data-theme="hybrid"] {
217
+ /* All the CSS customizations */
218
+ --smrt-typography-display-large-size: 4rem;
219
+ --smrt-typography-display-large-weight: 800;
220
+
221
+ /* Custom animations */
222
+ --smrt-duration-slow: 400ms;
223
+ --smrt-easing-emphasized: cubic-bezier(0.34, 1.56, 0.64, 1);
224
+ }
225
+
226
+ /* Component-specific overrides */
227
+ [data-theme="hybrid"] .card {
228
+ border: 1px solid var(--smrt-color-outline);
229
+ transition: transform var(--smrt-duration-normal) var(--smrt-easing-standard);
230
+ }
231
+
232
+ [data-theme="hybrid"] .card:hover {
233
+ transform: translateY(-4px);
234
+ }
235
+ ```
236
+
237
+ ## Sharing Themes Between Projects
238
+
239
+ ### As a Local Package
240
+
241
+ ```bash
242
+ # In your theme package
243
+ mkdir packages/my-brand-theme
244
+ cd packages/my-brand-theme
245
+ npm init
246
+ ```
247
+
248
+ ```json
249
+ // packages/my-brand-theme/package.json
250
+ {
251
+ "name": "@mycompany/brand-theme",
252
+ "main": "./index.js",
253
+ "exports": {
254
+ ".": {
255
+ "types": "./index.d.ts",
256
+ "default": "./index.js"
257
+ },
258
+ "./styles": "./styles.css"
259
+ }
260
+ }
261
+ ```
262
+
263
+ ```typescript
264
+ // packages/my-brand-theme/index.ts
265
+ import { createTheme, registerTheme } from '@happyvertical/smrt-ui/themes';
266
+
267
+ export const myBrandTheme = createTheme({
268
+ id: 'mycompany',
269
+ name: 'MyCompany Brand',
270
+ // ... theme definition
271
+ });
272
+
273
+ registerTheme(myBrandTheme);
274
+ export { myBrandTheme as default };
275
+ ```
276
+
277
+ ```css
278
+ /* packages/my-brand-theme/styles.css */
279
+ /* CSS version of the theme */
280
+ ```
281
+
282
+ Then in your main project:
283
+
284
+ ```bash
285
+ npm install ./packages/my-brand-theme
286
+ ```
287
+
288
+ ```svelte
289
+ <script>
290
+ import '@mycompany/brand-theme';
291
+ import '@mycompany/brand-theme/styles';
292
+ </script>
293
+ ```
294
+
295
+ ## Theme Switching with Custom Themes
296
+
297
+ ```svelte
298
+ <script>
299
+ import { getThemeContext, ThemeSwitcher } from '@happyvertical/smrt-ui/themes';
300
+
301
+ // Import your custom themes to register them
302
+ import '$lib/themes/brand';
303
+ import '$lib/themes/corporate';
304
+
305
+ const theme = getThemeContext();
306
+
307
+ // Switch between built-in and custom
308
+ function useBrandTheme() {
309
+ theme.setPreset('brand');
310
+ }
311
+
312
+ function useCorporateTheme() {
313
+ theme.setPreset('corporate');
314
+ }
315
+ </script>
316
+
317
+ <!-- UI shows all available themes including custom ones -->
318
+ <ThemeSwitcher variant="segmented" />
319
+ ```
320
+
321
+ ## Best Practices
322
+
323
+ 1. **Extend a base theme**: Start with `extend: 'material'` or another base to get sensible defaults
324
+ 2. **Define both modes**: Always provide both light and dark colors, or let the system auto-generate dark mode
325
+ 3. **Test contrast**: Ensure your colors meet WCAG contrast requirements
326
+ 4. **Use semantic naming**: Map your brand colors to semantic tokens (primary, secondary, error, etc.)
327
+ 5. **Document your theme**: Create a demo page showing all colors and components
328
+
329
+ ## Troubleshooting
330
+
331
+ ### Theme not appearing in ThemeSwitcher
332
+ Make sure you import the file that calls `registerTheme()` before using the component.
333
+
334
+ ### Colors not applying
335
+ Check that you've imported the base CSS files and your custom CSS.
336
+
337
+ ### TypeScript errors
338
+ Ensure your custom theme implements the full `Theme` type or use `createTheme()` which handles this.
339
+
340
+ ### Flash of unstyled content
341
+ Use server-side rendering or inline critical CSS in your `app.html`.