@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.
- package/AGENTS.md +50 -0
- package/CLAUDE.md +1 -0
- package/LICENSE +7 -0
- package/dist/actions/__tests__/ripple.test.js +28 -0
- package/dist/actions/permission.d.ts +34 -0
- package/dist/actions/permission.d.ts.map +1 -0
- package/dist/actions/permission.js +70 -0
- package/dist/actions/ripple.d.ts +7 -0
- package/dist/actions/ripple.d.ts.map +1 -0
- package/dist/actions/ripple.js +65 -0
- package/dist/components/calendar/Calendar.svelte +520 -0
- package/dist/components/calendar/Calendar.svelte.d.ts +17 -0
- package/dist/components/calendar/Calendar.svelte.d.ts.map +1 -0
- package/dist/components/calendar/DayView.svelte +389 -0
- package/dist/components/calendar/DayView.svelte.d.ts +13 -0
- package/dist/components/calendar/DayView.svelte.d.ts.map +1 -0
- package/dist/components/calendar/index.d.ts +6 -0
- package/dist/components/calendar/index.d.ts.map +1 -0
- package/dist/components/calendar/index.js +5 -0
- package/dist/components/chat/MessageBubble.svelte +126 -0
- package/dist/components/chat/MessageBubble.svelte.d.ts +30 -0
- package/dist/components/chat/MessageBubble.svelte.d.ts.map +1 -0
- package/dist/components/chat/ReactionPicker.svelte +89 -0
- package/dist/components/chat/ReactionPicker.svelte.d.ts +19 -0
- package/dist/components/chat/ReactionPicker.svelte.d.ts.map +1 -0
- package/dist/components/chat/TypingIndicator.svelte +90 -0
- package/dist/components/chat/TypingIndicator.svelte.d.ts +17 -0
- package/dist/components/chat/TypingIndicator.svelte.d.ts.map +1 -0
- package/dist/components/chat/__tests__/chat-primitives.test.js +67 -0
- package/dist/components/chat/index.d.ts +10 -0
- package/dist/components/chat/index.d.ts.map +1 -0
- package/dist/components/chat/index.js +9 -0
- package/dist/components/data/DataTable.svelte +519 -0
- package/dist/components/data/DataTable.svelte.d.ts +49 -0
- package/dist/components/data/DataTable.svelte.d.ts.map +1 -0
- package/dist/components/data/__tests__/DataTable.test.js +48 -0
- package/dist/components/data/__tests__/data-table-helpers.test.js +36 -0
- package/dist/components/data/index.d.ts +6 -0
- package/dist/components/data/index.d.ts.map +1 -0
- package/dist/components/data/index.js +5 -0
- package/dist/components/data/types.d.ts +104 -0
- package/dist/components/data/types.d.ts.map +1 -0
- package/dist/components/data/types.js +45 -0
- package/dist/components/display/ConfidenceBadge.svelte +142 -0
- package/dist/components/display/ConfidenceBadge.svelte.d.ts +25 -0
- package/dist/components/display/ConfidenceBadge.svelte.d.ts.map +1 -0
- package/dist/components/display/CurrencyDisplay.svelte +106 -0
- package/dist/components/display/CurrencyDisplay.svelte.d.ts +30 -0
- package/dist/components/display/CurrencyDisplay.svelte.d.ts.map +1 -0
- package/dist/components/display/DateDisplay.svelte +122 -0
- package/dist/components/display/DateDisplay.svelte.d.ts +24 -0
- package/dist/components/display/DateDisplay.svelte.d.ts.map +1 -0
- package/dist/components/display/Icon.svelte +77 -0
- package/dist/components/display/Icon.svelte.d.ts +28 -0
- package/dist/components/display/Icon.svelte.d.ts.map +1 -0
- package/dist/components/display/StatusBadge.svelte +256 -0
- package/dist/components/display/StatusBadge.svelte.d.ts +24 -0
- package/dist/components/display/StatusBadge.svelte.d.ts.map +1 -0
- package/dist/components/display/__tests__/ConfidenceBadge.test.js +96 -0
- package/dist/components/display/__tests__/CurrencyDisplay.test.js +114 -0
- package/dist/components/display/__tests__/DateDisplay.test.js +114 -0
- package/dist/components/display/__tests__/Icon.test.js +93 -0
- package/dist/components/display/__tests__/StatusBadge.test.js +98 -0
- package/dist/components/display/index.d.ts +10 -0
- package/dist/components/display/index.d.ts.map +1 -0
- package/dist/components/display/index.js +9 -0
- package/dist/components/display/types.d.ts +5 -0
- package/dist/components/display/types.d.ts.map +1 -0
- package/dist/components/display/types.js +4 -0
- package/dist/components/feedback/ConfirmDialog.svelte +226 -0
- package/dist/components/feedback/ConfirmDialog.svelte.d.ts +25 -0
- package/dist/components/feedback/ConfirmDialog.svelte.d.ts.map +1 -0
- package/dist/components/feedback/LoadingOverlay.svelte +281 -0
- package/dist/components/feedback/LoadingOverlay.svelte.d.ts +31 -0
- package/dist/components/feedback/LoadingOverlay.svelte.d.ts.map +1 -0
- package/dist/components/feedback/Modal.svelte +393 -0
- package/dist/components/feedback/Modal.svelte.d.ts +46 -0
- package/dist/components/feedback/Modal.svelte.d.ts.map +1 -0
- package/dist/components/feedback/ProgressBar.svelte +162 -0
- package/dist/components/feedback/ProgressBar.svelte.d.ts +21 -0
- package/dist/components/feedback/ProgressBar.svelte.d.ts.map +1 -0
- package/dist/components/feedback/__tests__/ConfirmDialog.test.js +111 -0
- package/dist/components/feedback/__tests__/LoadingOverlay.test.js +99 -0
- package/dist/components/feedback/__tests__/Modal.test.js +72 -0
- package/dist/components/feedback/__tests__/ProgressBar.test.js +89 -0
- package/dist/components/feedback/index.d.ts +8 -0
- package/dist/components/feedback/index.d.ts.map +1 -0
- package/dist/components/feedback/index.js +10 -0
- package/dist/components/layout/Container.svelte +53 -0
- package/dist/components/layout/Container.svelte.d.ts +11 -0
- package/dist/components/layout/Container.svelte.d.ts.map +1 -0
- package/dist/components/layout/EmptyState.svelte +187 -0
- package/dist/components/layout/EmptyState.svelte.d.ts +28 -0
- package/dist/components/layout/EmptyState.svelte.d.ts.map +1 -0
- package/dist/components/layout/Footer.svelte +63 -0
- package/dist/components/layout/Footer.svelte.d.ts +8 -0
- package/dist/components/layout/Footer.svelte.d.ts.map +1 -0
- package/dist/components/layout/Grid.svelte +241 -0
- package/dist/components/layout/Grid.svelte.d.ts +56 -0
- package/dist/components/layout/Grid.svelte.d.ts.map +1 -0
- package/dist/components/layout/Header.svelte +86 -0
- package/dist/components/layout/Header.svelte.d.ts +9 -0
- package/dist/components/layout/Header.svelte.d.ts.map +1 -0
- package/dist/components/layout/Masthead.svelte +219 -0
- package/dist/components/layout/Masthead.svelte.d.ts +13 -0
- package/dist/components/layout/Masthead.svelte.d.ts.map +1 -0
- package/dist/components/layout/PageHeader.svelte +131 -0
- package/dist/components/layout/PageHeader.svelte.d.ts +26 -0
- package/dist/components/layout/PageHeader.svelte.d.ts.map +1 -0
- package/dist/components/layout/SummaryCard.svelte +203 -0
- package/dist/components/layout/SummaryCard.svelte.d.ts +20 -0
- package/dist/components/layout/SummaryCard.svelte.d.ts.map +1 -0
- package/dist/components/layout/__tests__/Container.test.js +62 -0
- package/dist/components/layout/__tests__/EmptyState.test.js +83 -0
- package/dist/components/layout/__tests__/Footer.test.js +50 -0
- package/dist/components/layout/__tests__/Grid.test.js +121 -0
- package/dist/components/layout/__tests__/Header.test.js +48 -0
- package/dist/components/layout/__tests__/Masthead.test.js +93 -0
- package/dist/components/layout/__tests__/PageHeader.test.js +80 -0
- package/dist/components/layout/__tests__/SummaryCard.test.js +82 -0
- package/dist/components/layout/index.d.ts +12 -0
- package/dist/components/layout/index.d.ts.map +1 -0
- package/dist/components/layout/index.js +11 -0
- package/dist/components/memberships/MembershipCard.svelte +163 -0
- package/dist/components/memberships/MembershipCard.svelte.d.ts +12 -0
- package/dist/components/memberships/MembershipCard.svelte.d.ts.map +1 -0
- package/dist/components/memberships/MembershipList.svelte +98 -0
- package/dist/components/memberships/MembershipList.svelte.d.ts +19 -0
- package/dist/components/memberships/MembershipList.svelte.d.ts.map +1 -0
- package/dist/components/nav/FilterChips.svelte +152 -0
- package/dist/components/nav/FilterChips.svelte.d.ts +19 -0
- package/dist/components/nav/FilterChips.svelte.d.ts.map +1 -0
- package/dist/components/nav/Tabs.svelte +252 -0
- package/dist/components/nav/Tabs.svelte.d.ts +34 -0
- package/dist/components/nav/Tabs.svelte.d.ts.map +1 -0
- package/dist/components/nav/__tests__/FilterChips.test.js +94 -0
- package/dist/components/nav/__tests__/Tabs.test.js +128 -0
- package/dist/components/nav/index.d.ts +7 -0
- package/dist/components/nav/index.d.ts.map +1 -0
- package/dist/components/nav/index.js +6 -0
- package/dist/components/nav/types.d.ts +24 -0
- package/dist/components/nav/types.d.ts.map +1 -0
- package/dist/components/nav/types.js +4 -0
- package/dist/components/permissions/PermissionCheck.svelte +45 -0
- package/dist/components/permissions/PermissionCheck.svelte.d.ts +19 -0
- package/dist/components/permissions/PermissionCheck.svelte.d.ts.map +1 -0
- package/dist/components/roles/RoleBadge.svelte +84 -0
- package/dist/components/roles/RoleBadge.svelte.d.ts +13 -0
- package/dist/components/roles/RoleBadge.svelte.d.ts.map +1 -0
- package/dist/components/roles/RoleSelector.svelte +216 -0
- package/dist/components/roles/RoleSelector.svelte.d.ts +13 -0
- package/dist/components/roles/RoleSelector.svelte.d.ts.map +1 -0
- package/dist/components/theme/ThemeProvider.svelte +71 -0
- package/dist/components/theme/ThemeProvider.svelte.d.ts +10 -0
- package/dist/components/theme/ThemeProvider.svelte.d.ts.map +1 -0
- package/dist/components/theme/context.svelte.d.ts +15 -0
- package/dist/components/theme/context.svelte.d.ts.map +1 -0
- package/dist/components/theme/context.svelte.js +42 -0
- package/dist/components/theme/index.d.ts +3 -0
- package/dist/components/theme/index.d.ts.map +1 -0
- package/dist/components/theme/index.js +2 -0
- package/dist/components/ui/Avatar.svelte +167 -0
- package/dist/components/ui/Avatar.svelte.d.ts +26 -0
- package/dist/components/ui/Avatar.svelte.d.ts.map +1 -0
- package/dist/components/ui/Badge.svelte +70 -0
- package/dist/components/ui/Badge.svelte.d.ts +12 -0
- package/dist/components/ui/Badge.svelte.d.ts.map +1 -0
- package/dist/components/ui/Button.svelte +226 -0
- package/dist/components/ui/Button.svelte.d.ts +28 -0
- package/dist/components/ui/Button.svelte.d.ts.map +1 -0
- package/dist/components/ui/Card.svelte +122 -0
- package/dist/components/ui/Card.svelte.d.ts +15 -0
- package/dist/components/ui/Card.svelte.d.ts.map +1 -0
- package/dist/components/ui/Chip.svelte +167 -0
- package/dist/components/ui/Chip.svelte.d.ts +33 -0
- package/dist/components/ui/Chip.svelte.d.ts.map +1 -0
- package/dist/components/ui/Dropdown.svelte +250 -0
- package/dist/components/ui/Dropdown.svelte.d.ts +20 -0
- package/dist/components/ui/Dropdown.svelte.d.ts.map +1 -0
- package/dist/components/ui/Pagination.svelte +294 -0
- package/dist/components/ui/Pagination.svelte.d.ts +21 -0
- package/dist/components/ui/Pagination.svelte.d.ts.map +1 -0
- package/dist/components/ui/Skeleton.svelte +113 -0
- package/dist/components/ui/Skeleton.svelte.d.ts +24 -0
- package/dist/components/ui/Skeleton.svelte.d.ts.map +1 -0
- package/dist/components/ui/Tooltip.svelte +120 -0
- package/dist/components/ui/Tooltip.svelte.d.ts +24 -0
- package/dist/components/ui/Tooltip.svelte.d.ts.map +1 -0
- package/dist/components/ui/Tree.svelte +209 -0
- package/dist/components/ui/Tree.svelte.d.ts +17 -0
- package/dist/components/ui/Tree.svelte.d.ts.map +1 -0
- package/dist/components/ui/__tests__/Badge.test.js +76 -0
- package/dist/components/ui/__tests__/Button.test.js +69 -0
- package/dist/components/ui/__tests__/Card.test.js +103 -0
- package/dist/components/ui/__tests__/Pagination.test.js +99 -0
- package/dist/components/ui/__tests__/gap-primitives-interactive.test.js +112 -0
- package/dist/components/ui/__tests__/gap-primitives.test.js +84 -0
- package/dist/components/ui/index.d.ts +14 -0
- package/dist/components/ui/index.d.ts.map +1 -0
- package/dist/components/ui/index.js +18 -0
- package/dist/i18n/Trans.svelte +29 -0
- package/dist/i18n/Trans.svelte.d.ts +24 -0
- package/dist/i18n/Trans.svelte.d.ts.map +1 -0
- package/dist/i18n/__tests__/i18n.test.js +74 -0
- package/dist/i18n/__tests__/render-parity.spec.js +37 -0
- package/dist/i18n/context.svelte.d.ts +43 -0
- package/dist/i18n/context.svelte.d.ts.map +1 -0
- package/dist/i18n/context.svelte.js +69 -0
- package/dist/i18n/index.d.ts +17 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +24 -0
- package/dist/i18n/registry.d.ts +44 -0
- package/dist/i18n/registry.d.ts.map +1 -0
- package/dist/i18n/registry.js +60 -0
- package/dist/i18n/render.d.ts +22 -0
- package/dist/i18n/render.d.ts.map +1 -0
- package/dist/i18n/render.js +44 -0
- package/dist/i18n/strings.d.ts +7 -0
- package/dist/i18n/strings.d.ts.map +1 -0
- package/dist/i18n/strings.js +19 -0
- package/dist/i18n/strings.ui.d.ts +34 -0
- package/dist/i18n/strings.ui.d.ts.map +1 -0
- package/dist/i18n/strings.ui.js +44 -0
- package/dist/i18n/use-i18n.d.ts +20 -0
- package/dist/i18n/use-i18n.d.ts.map +1 -0
- package/dist/i18n/use-i18n.js +21 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +38 -0
- package/dist/registry/index.d.ts +6 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +4 -0
- package/dist/registry/module-registry.d.ts +58 -0
- package/dist/registry/module-registry.d.ts.map +1 -0
- package/dist/registry/module-registry.js +94 -0
- package/dist/styles/index.d.ts +4 -0
- package/dist/styles/index.d.ts.map +1 -0
- package/dist/styles/index.js +6 -0
- package/dist/styles/tokens.css +76 -0
- package/dist/test-support/a11y.d.ts +16 -0
- package/dist/test-support/a11y.d.ts.map +1 -0
- package/dist/test-support/a11y.js +32 -0
- package/dist/test-support/setup.d.ts +11 -0
- package/dist/test-support/setup.d.ts.map +1 -0
- package/dist/test-support/setup.js +33 -0
- package/dist/theme/ThemeProvider.svelte +207 -0
- package/dist/theme/ThemeProvider.svelte.d.ts +22 -0
- package/dist/theme/ThemeProvider.svelte.d.ts.map +1 -0
- package/dist/theme/context.d.ts +49 -0
- package/dist/theme/context.d.ts.map +1 -0
- package/dist/theme/context.js +32 -0
- package/dist/theme/index.d.ts +7 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +9 -0
- package/dist/theme/tokens.d.ts +309 -0
- package/dist/theme/tokens.d.ts.map +1 -0
- package/dist/theme/tokens.js +418 -0
- package/dist/themes/CUSTOM_THEME_GUIDE.md +341 -0
- package/dist/themes/README.md +675 -0
- package/dist/themes/ThemeProvider.svelte +275 -0
- package/dist/themes/ThemeProvider.svelte.d.ts +24 -0
- package/dist/themes/ThemeProvider.svelte.d.ts.map +1 -0
- package/dist/themes/__tests__/css-generator.test.js +32 -0
- package/dist/themes/__tests__/registry.test.js +43 -0
- package/dist/themes/__tests__/token-aliases.test.js +176 -0
- package/dist/themes/components/ColorSchemeToggle.svelte +205 -0
- package/dist/themes/components/ColorSchemeToggle.svelte.d.ts +14 -0
- package/dist/themes/components/ColorSchemeToggle.svelte.d.ts.map +1 -0
- package/dist/themes/components/ThemeSwitcher.svelte +188 -0
- package/dist/themes/components/ThemeSwitcher.svelte.d.ts +14 -0
- package/dist/themes/components/ThemeSwitcher.svelte.d.ts.map +1 -0
- package/dist/themes/components/index.d.ts +8 -0
- package/dist/themes/components/index.d.ts.map +1 -0
- package/dist/themes/components/index.js +7 -0
- package/dist/themes/context.svelte.d.ts +30 -0
- package/dist/themes/context.svelte.d.ts.map +1 -0
- package/dist/themes/context.svelte.js +42 -0
- package/dist/themes/create-theme.d.ts +99 -0
- package/dist/themes/create-theme.d.ts.map +1 -0
- package/dist/themes/create-theme.js +389 -0
- package/dist/themes/css-generator.d.ts +44 -0
- package/dist/themes/css-generator.d.ts.map +1 -0
- package/dist/themes/css-generator.js +226 -0
- package/dist/themes/glass/index.d.ts +14 -0
- package/dist/themes/glass/index.d.ts.map +1 -0
- package/dist/themes/glass/index.js +286 -0
- package/dist/themes/index.d.ts +31 -0
- package/dist/themes/index.d.ts.map +1 -0
- package/dist/themes/index.js +37 -0
- package/dist/themes/material/index.d.ts +13 -0
- package/dist/themes/material/index.d.ts.map +1 -0
- package/dist/themes/material/index.js +269 -0
- package/dist/themes/registry.d.ts +64 -0
- package/dist/themes/registry.d.ts.map +1 -0
- package/dist/themes/registry.js +122 -0
- package/dist/themes/shared.d.ts +78 -0
- package/dist/themes/shared.d.ts.map +1 -0
- package/dist/themes/shared.js +179 -0
- package/dist/themes/studio/index.d.ts +14 -0
- package/dist/themes/studio/index.d.ts.map +1 -0
- package/dist/themes/studio/index.js +270 -0
- package/dist/themes/styles/all.css +12 -0
- package/dist/themes/styles/glass.css +432 -0
- package/dist/themes/styles/index.d.ts +22 -0
- package/dist/themes/styles/index.d.ts.map +1 -0
- package/dist/themes/styles/index.js +23 -0
- package/dist/themes/styles/material.css +364 -0
- package/dist/themes/styles/studio.css +416 -0
- package/dist/themes/types.d.ts +273 -0
- package/dist/themes/types.d.ts.map +1 -0
- package/dist/themes/types.js +15 -0
- package/dist/types-generic.d.ts +75 -0
- package/dist/types-generic.d.ts.map +1 -0
- package/dist/types-generic.js +1 -0
- package/dist/utils/forms/__tests__/formatters.test.js +27 -0
- package/dist/utils/forms/formatters.d.ts +14 -0
- package/dist/utils/forms/formatters.d.ts.map +1 -0
- package/dist/utils/forms/formatters.js +77 -0
- package/dist/utils/import-optional.d.ts +5 -0
- package/dist/utils/import-optional.d.ts.map +1 -0
- package/dist/utils/import-optional.js +7 -0
- package/dist/utils/theme/__tests__/color.test.js +72 -0
- package/dist/utils/theme/__tests__/typography.test.js +11 -0
- package/dist/utils/theme/color.d.ts +70 -0
- package/dist/utils/theme/color.d.ts.map +1 -0
- package/dist/utils/theme/color.js +221 -0
- package/dist/utils/theme/typography.d.ts +27 -0
- package/dist/utils/theme/typography.d.ts.map +1 -0
- package/dist/utils/theme/typography.js +30 -0
- 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
|