@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,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMRT Svelte Design Tokens
|
|
3
|
+
* CSS custom properties for consistent theming across components
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
:root {
|
|
7
|
+
/* Colors - Primary */
|
|
8
|
+
--color-primary-main: #1976d2;
|
|
9
|
+
--color-primary-light: #e3f2fd;
|
|
10
|
+
--color-primary-dark: #1565c0;
|
|
11
|
+
|
|
12
|
+
/* Colors - Neutral */
|
|
13
|
+
--color-neutral-white: #ffffff;
|
|
14
|
+
--color-neutral-gray100: #f5f5f5;
|
|
15
|
+
--color-neutral-gray200: #eeeeee;
|
|
16
|
+
--color-neutral-gray300: #e0e0e0;
|
|
17
|
+
--color-neutral-gray400: #9ca3af;
|
|
18
|
+
--color-neutral-black: #000000;
|
|
19
|
+
|
|
20
|
+
/* Colors - Text */
|
|
21
|
+
--color-text-primary: #212121;
|
|
22
|
+
--color-text-secondary: #757575;
|
|
23
|
+
--color-text-inverse: #ffffff;
|
|
24
|
+
|
|
25
|
+
/* Colors - Semantic */
|
|
26
|
+
--color-semantic-error: #f44336;
|
|
27
|
+
--color-semantic-success: #4caf50;
|
|
28
|
+
--color-semantic-warning: #ff9800;
|
|
29
|
+
--color-semantic-info: #2196f3;
|
|
30
|
+
|
|
31
|
+
/* Spacing */
|
|
32
|
+
--spacing-xs: 0.25rem;
|
|
33
|
+
--spacing-sm: 0.5rem;
|
|
34
|
+
--spacing-md: 1rem;
|
|
35
|
+
--spacing-lg: 1.5rem;
|
|
36
|
+
--spacing-xl: 2rem;
|
|
37
|
+
--spacing-2xl: 3rem;
|
|
38
|
+
--spacing-3xl: 4rem;
|
|
39
|
+
|
|
40
|
+
/* Font Sizes */
|
|
41
|
+
--font-size-xs: 0.75rem;
|
|
42
|
+
--font-size-sm: 0.875rem;
|
|
43
|
+
--font-size-base: 1rem;
|
|
44
|
+
--font-size-md: 1rem;
|
|
45
|
+
--font-size-lg: 1.125rem;
|
|
46
|
+
--font-size-xl: 1.25rem;
|
|
47
|
+
--font-size-2xl: 1.5rem;
|
|
48
|
+
--font-size-3xl: 2rem;
|
|
49
|
+
|
|
50
|
+
/* Font Weights */
|
|
51
|
+
--font-weight-normal: 400;
|
|
52
|
+
--font-weight-medium: 500;
|
|
53
|
+
--font-weight-semibold: 600;
|
|
54
|
+
--font-weight-bold: 700;
|
|
55
|
+
|
|
56
|
+
/* Border Radius */
|
|
57
|
+
--radius-sm: 0.25rem;
|
|
58
|
+
--radius-md: 0.5rem;
|
|
59
|
+
--radius-lg: 0.75rem;
|
|
60
|
+
--radius-xl: 1rem;
|
|
61
|
+
--radius-full: 9999px;
|
|
62
|
+
--border-radius-sm: 0.25rem;
|
|
63
|
+
--border-radius-md: 0.5rem;
|
|
64
|
+
--border-radius-lg: 0.75rem;
|
|
65
|
+
|
|
66
|
+
/* Shadows */
|
|
67
|
+
--shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);
|
|
68
|
+
--shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1);
|
|
69
|
+
--shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1);
|
|
70
|
+
--shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1);
|
|
71
|
+
|
|
72
|
+
/* Transitions */
|
|
73
|
+
--transition-base: 150ms cubic-bezier(0.4, 0, 0.2, 1);
|
|
74
|
+
--transition-fast: 150ms;
|
|
75
|
+
--transition-slow: 300ms cubic-bezier(0.4, 0, 0.2, 1);
|
|
76
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Accessibility assertion helper for component golden tests (Sweep L4, #1423).
|
|
3
|
+
*
|
|
4
|
+
* Runs axe-core against a rendered container and fails the test with a readable
|
|
5
|
+
* report if any violations are found. Use after a Testing Library `render()`:
|
|
6
|
+
*
|
|
7
|
+
* const { container } = render(MyComponent, { props });
|
|
8
|
+
* await expectNoA11yViolations(container);
|
|
9
|
+
*
|
|
10
|
+
* `color-contrast` is disabled by default: jsdom has no layout/paint engine, so
|
|
11
|
+
* contrast can't be computed and the rule produces non-deterministic noise.
|
|
12
|
+
* Pass `{ rules: { 'color-contrast': { enabled: true } } }` to override.
|
|
13
|
+
*/
|
|
14
|
+
import axe from 'axe-core';
|
|
15
|
+
export declare function expectNoA11yViolations(container: HTMLElement, options?: axe.RunOptions): Promise<void>;
|
|
16
|
+
//# sourceMappingURL=a11y.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"a11y.d.ts","sourceRoot":"","sources":["../../src/test-support/a11y.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,GAAG,MAAM,UAAU,CAAC;AAG3B,wBAAsB,sBAAsB,CAC1C,SAAS,EAAE,WAAW,EACtB,OAAO,GAAE,GAAG,CAAC,UAAe,GAC3B,OAAO,CAAC,IAAI,CAAC,CAmBf"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Accessibility assertion helper for component golden tests (Sweep L4, #1423).
|
|
3
|
+
*
|
|
4
|
+
* Runs axe-core against a rendered container and fails the test with a readable
|
|
5
|
+
* report if any violations are found. Use after a Testing Library `render()`:
|
|
6
|
+
*
|
|
7
|
+
* const { container } = render(MyComponent, { props });
|
|
8
|
+
* await expectNoA11yViolations(container);
|
|
9
|
+
*
|
|
10
|
+
* `color-contrast` is disabled by default: jsdom has no layout/paint engine, so
|
|
11
|
+
* contrast can't be computed and the rule produces non-deterministic noise.
|
|
12
|
+
* Pass `{ rules: { 'color-contrast': { enabled: true } } }` to override.
|
|
13
|
+
*/
|
|
14
|
+
import axe from 'axe-core';
|
|
15
|
+
import { expect } from 'vitest';
|
|
16
|
+
export async function expectNoA11yViolations(container, options = {}) {
|
|
17
|
+
const results = await axe.run(container, {
|
|
18
|
+
rules: { 'color-contrast': { enabled: false } },
|
|
19
|
+
...options,
|
|
20
|
+
});
|
|
21
|
+
if (results.violations.length > 0) {
|
|
22
|
+
const report = results.violations
|
|
23
|
+
.map((v) => {
|
|
24
|
+
const targets = v.nodes
|
|
25
|
+
.map((n) => ` - ${n.target.join(' ')}`)
|
|
26
|
+
.join('\n');
|
|
27
|
+
return ` [${v.id}] ${v.help}\n ${v.helpUrl}\n${targets}`;
|
|
28
|
+
})
|
|
29
|
+
.join('\n');
|
|
30
|
+
expect.fail(`axe found ${results.violations.length} accessibility violation(s):\n${report}`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vitest setup for smrt-svelte component tests (Sweep L4, #1423).
|
|
3
|
+
*
|
|
4
|
+
* Registered via `setupFiles` in vitest.config.ts (the smrt-vitest plugin
|
|
5
|
+
* appends its own setup alongside this one). Provides:
|
|
6
|
+
* - jest-dom matchers (`toBeInTheDocument`, `toHaveAttribute`, `toBeDisabled`, …)
|
|
7
|
+
* - Testing Library auto-cleanup after each test (unmounts mounted components
|
|
8
|
+
* so the jsdom document doesn't leak between tests).
|
|
9
|
+
*/
|
|
10
|
+
import '@testing-library/jest-dom/vitest';
|
|
11
|
+
//# sourceMappingURL=setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/test-support/setup.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,kCAAkC,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vitest setup for smrt-svelte component tests (Sweep L4, #1423).
|
|
3
|
+
*
|
|
4
|
+
* Registered via `setupFiles` in vitest.config.ts (the smrt-vitest plugin
|
|
5
|
+
* appends its own setup alongside this one). Provides:
|
|
6
|
+
* - jest-dom matchers (`toBeInTheDocument`, `toHaveAttribute`, `toBeDisabled`, …)
|
|
7
|
+
* - Testing Library auto-cleanup after each test (unmounts mounted components
|
|
8
|
+
* so the jsdom document doesn't leak between tests).
|
|
9
|
+
*/
|
|
10
|
+
import '@testing-library/jest-dom/vitest';
|
|
11
|
+
import { cleanup } from '@testing-library/svelte';
|
|
12
|
+
import { afterEach } from 'vitest';
|
|
13
|
+
afterEach(() => {
|
|
14
|
+
cleanup();
|
|
15
|
+
});
|
|
16
|
+
// jsdom does not implement the native <dialog> modal methods, so components
|
|
17
|
+
// that drive a dialog via showModal()/close() (e.g. Modal, ConfirmDialog) throw
|
|
18
|
+
// on mount. Polyfill the minimum: toggle the `open` property (which jsdom
|
|
19
|
+
// reflects to the attribute, giving the element its `dialog` role) and emit the
|
|
20
|
+
// matching events.
|
|
21
|
+
if (typeof HTMLDialogElement !== 'undefined') {
|
|
22
|
+
if (!HTMLDialogElement.prototype.showModal) {
|
|
23
|
+
HTMLDialogElement.prototype.showModal = function showModal() {
|
|
24
|
+
this.open = true;
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
if (!HTMLDialogElement.prototype.close) {
|
|
28
|
+
HTMLDialogElement.prototype.close = function close() {
|
|
29
|
+
this.open = false;
|
|
30
|
+
this.dispatchEvent(new Event('close'));
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
import { onMount } from 'svelte';
|
|
4
|
+
import {
|
|
5
|
+
setThemeContext,
|
|
6
|
+
type ThemeContext,
|
|
7
|
+
type ThemeState,
|
|
8
|
+
} from './context.js';
|
|
9
|
+
import {
|
|
10
|
+
type ColorScheme,
|
|
11
|
+
defaultThemeConfig,
|
|
12
|
+
generateThemeVariables,
|
|
13
|
+
type ThemeConfig,
|
|
14
|
+
} from './tokens.js';
|
|
15
|
+
|
|
16
|
+
interface Props {
|
|
17
|
+
/** Initial color scheme */
|
|
18
|
+
colorScheme?: ColorScheme;
|
|
19
|
+
/** Primary color override */
|
|
20
|
+
primaryColor?: string;
|
|
21
|
+
/** Border radius scale */
|
|
22
|
+
borderRadius?: ThemeConfig['borderRadius'];
|
|
23
|
+
/** Custom CSS variable overrides */
|
|
24
|
+
overrides?: Record<string, string>;
|
|
25
|
+
/** Persist preference to localStorage */
|
|
26
|
+
persist?: boolean;
|
|
27
|
+
/** Storage key for persistence */
|
|
28
|
+
storageKey?: string;
|
|
29
|
+
/** Content */
|
|
30
|
+
children: Snippet;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
let {
|
|
34
|
+
colorScheme = 'system',
|
|
35
|
+
primaryColor,
|
|
36
|
+
borderRadius = 'md',
|
|
37
|
+
overrides = {},
|
|
38
|
+
persist = true,
|
|
39
|
+
storageKey = 'smrt-theme',
|
|
40
|
+
children,
|
|
41
|
+
}: Props = $props();
|
|
42
|
+
|
|
43
|
+
// Internal state
|
|
44
|
+
let config = $state<ThemeConfig>({
|
|
45
|
+
colorScheme: 'system',
|
|
46
|
+
primaryColor: defaultThemeConfig.primaryColor,
|
|
47
|
+
borderRadius: 'md',
|
|
48
|
+
overrides: {},
|
|
49
|
+
});
|
|
50
|
+
let appliedColorScheme: ColorScheme | undefined;
|
|
51
|
+
let appliedPrimaryColor: string | undefined;
|
|
52
|
+
let appliedBorderRadius: ThemeConfig['borderRadius'] | undefined;
|
|
53
|
+
let appliedOverrides: Record<string, string> | undefined;
|
|
54
|
+
|
|
55
|
+
$effect(() => {
|
|
56
|
+
if (
|
|
57
|
+
appliedColorScheme === colorScheme &&
|
|
58
|
+
appliedPrimaryColor === primaryColor &&
|
|
59
|
+
appliedBorderRadius === borderRadius &&
|
|
60
|
+
appliedOverrides === overrides
|
|
61
|
+
) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
appliedColorScheme = colorScheme;
|
|
66
|
+
appliedPrimaryColor = primaryColor;
|
|
67
|
+
appliedBorderRadius = borderRadius;
|
|
68
|
+
appliedOverrides = overrides;
|
|
69
|
+
|
|
70
|
+
config = {
|
|
71
|
+
colorScheme,
|
|
72
|
+
primaryColor: primaryColor ?? defaultThemeConfig.primaryColor,
|
|
73
|
+
borderRadius,
|
|
74
|
+
overrides,
|
|
75
|
+
};
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
let systemPrefersDark = $state(false);
|
|
79
|
+
let mounted = $state(false);
|
|
80
|
+
|
|
81
|
+
// Resolved scheme (never 'system')
|
|
82
|
+
const resolvedScheme = $derived<'light' | 'dark'>(
|
|
83
|
+
config.colorScheme === 'system'
|
|
84
|
+
? systemPrefersDark
|
|
85
|
+
? 'dark'
|
|
86
|
+
: 'light'
|
|
87
|
+
: config.colorScheme,
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
const isDark = $derived(resolvedScheme === 'dark');
|
|
91
|
+
|
|
92
|
+
// Generate CSS variables
|
|
93
|
+
const cssVariables = $derived(() => {
|
|
94
|
+
const vars = generateThemeVariables(isDark);
|
|
95
|
+
|
|
96
|
+
// Override primary color if specified
|
|
97
|
+
if (
|
|
98
|
+
config.primaryColor &&
|
|
99
|
+
config.primaryColor !== defaultThemeConfig.primaryColor
|
|
100
|
+
) {
|
|
101
|
+
vars['--smrt-color-primary'] = config.primaryColor;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Apply custom overrides
|
|
105
|
+
return { ...vars, ...config.overrides };
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
// Create style string
|
|
109
|
+
const styleString = $derived(() => {
|
|
110
|
+
const vars = cssVariables();
|
|
111
|
+
return Object.entries(vars)
|
|
112
|
+
.map(([key, value]) => `${key}: ${value}`)
|
|
113
|
+
.join('; ');
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
// Theme state for context
|
|
117
|
+
const themeState = $derived<ThemeState>({
|
|
118
|
+
colorScheme: config.colorScheme,
|
|
119
|
+
resolvedScheme,
|
|
120
|
+
isDark,
|
|
121
|
+
config,
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
// Context methods
|
|
125
|
+
function setColorScheme(scheme: ColorScheme): void {
|
|
126
|
+
config.colorScheme = scheme;
|
|
127
|
+
if (persist && typeof localStorage !== 'undefined') {
|
|
128
|
+
try {
|
|
129
|
+
localStorage.setItem(storageKey, scheme);
|
|
130
|
+
} catch {
|
|
131
|
+
// Ignore storage errors (e.g. quota exceeded, access denied in private browsing)
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function toggleColorScheme(): void {
|
|
137
|
+
const newScheme = isDark ? 'light' : 'dark';
|
|
138
|
+
setColorScheme(newScheme);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function updateConfig(updates: Partial<ThemeConfig>): void {
|
|
142
|
+
config = { ...config, ...updates };
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Create context
|
|
146
|
+
const context: ThemeContext = {
|
|
147
|
+
get state() {
|
|
148
|
+
return themeState;
|
|
149
|
+
},
|
|
150
|
+
setColorScheme,
|
|
151
|
+
toggleColorScheme,
|
|
152
|
+
updateConfig,
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
setThemeContext(context);
|
|
156
|
+
|
|
157
|
+
onMount(() => {
|
|
158
|
+
// Check system preference
|
|
159
|
+
if (typeof window !== 'undefined') {
|
|
160
|
+
const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
|
|
161
|
+
systemPrefersDark = mediaQuery.matches;
|
|
162
|
+
|
|
163
|
+
// Listen for system preference changes
|
|
164
|
+
const handler = (e: MediaQueryListEvent) => {
|
|
165
|
+
systemPrefersDark = e.matches;
|
|
166
|
+
};
|
|
167
|
+
mediaQuery.addEventListener('change', handler);
|
|
168
|
+
|
|
169
|
+
// Load persisted preference
|
|
170
|
+
if (persist) {
|
|
171
|
+
try {
|
|
172
|
+
const stored = localStorage.getItem(storageKey);
|
|
173
|
+
if (stored && ['light', 'dark', 'system'].includes(stored)) {
|
|
174
|
+
config.colorScheme = stored as ColorScheme;
|
|
175
|
+
}
|
|
176
|
+
} catch {
|
|
177
|
+
// Ignore storage errors (e.g. access denied in private browsing)
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
mounted = true;
|
|
182
|
+
|
|
183
|
+
return () => {
|
|
184
|
+
mediaQuery.removeEventListener('change', handler);
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
// Update document class for global dark mode styling
|
|
190
|
+
$effect(() => {
|
|
191
|
+
if (typeof document !== 'undefined' && mounted) {
|
|
192
|
+
document.documentElement.classList.toggle('dark', isDark);
|
|
193
|
+
document.documentElement.setAttribute('data-theme', resolvedScheme);
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
</script>
|
|
197
|
+
|
|
198
|
+
<div class="smrt-theme-root" class:dark={isDark} style={styleString()} data-theme={resolvedScheme}>
|
|
199
|
+
{@render children()}
|
|
200
|
+
</div>
|
|
201
|
+
|
|
202
|
+
<style>
|
|
203
|
+
.smrt-theme-root {
|
|
204
|
+
/* Ensure theme variables cascade to all children */
|
|
205
|
+
display: contents;
|
|
206
|
+
}
|
|
207
|
+
</style>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
import { type ColorScheme, type ThemeConfig } from './tokens.js';
|
|
3
|
+
interface Props {
|
|
4
|
+
/** Initial color scheme */
|
|
5
|
+
colorScheme?: ColorScheme;
|
|
6
|
+
/** Primary color override */
|
|
7
|
+
primaryColor?: string;
|
|
8
|
+
/** Border radius scale */
|
|
9
|
+
borderRadius?: ThemeConfig['borderRadius'];
|
|
10
|
+
/** Custom CSS variable overrides */
|
|
11
|
+
overrides?: Record<string, string>;
|
|
12
|
+
/** Persist preference to localStorage */
|
|
13
|
+
persist?: boolean;
|
|
14
|
+
/** Storage key for persistence */
|
|
15
|
+
storageKey?: string;
|
|
16
|
+
/** Content */
|
|
17
|
+
children: Snippet;
|
|
18
|
+
}
|
|
19
|
+
declare const ThemeProvider: import("svelte").Component<Props, {}, "">;
|
|
20
|
+
type ThemeProvider = ReturnType<typeof ThemeProvider>;
|
|
21
|
+
export default ThemeProvider;
|
|
22
|
+
//# sourceMappingURL=ThemeProvider.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ThemeProvider.svelte.d.ts","sourceRoot":"","sources":["../../src/theme/ThemeProvider.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAOtC,OAAO,EACL,KAAK,WAAW,EAGhB,KAAK,WAAW,EACjB,MAAM,aAAa,CAAC;AAGrB,UAAU,KAAK;IACb,2BAA2B;IAC3B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,6BAA6B;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0BAA0B;IAC1B,YAAY,CAAC,EAAE,WAAW,CAAC,cAAc,CAAC,CAAC;IAC3C,oCAAoC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,yCAAyC;IACzC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kCAAkC;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc;IACd,QAAQ,EAAE,OAAO,CAAC;CACnB;AAqLD,QAAA,MAAM,aAAa,2CAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Theme context for sharing theme state across components
|
|
3
|
+
*/
|
|
4
|
+
import type { ColorScheme, ThemeConfig } from './tokens.js';
|
|
5
|
+
/**
|
|
6
|
+
* Theme context key
|
|
7
|
+
*/
|
|
8
|
+
export declare const THEME_KEY: unique symbol;
|
|
9
|
+
/**
|
|
10
|
+
* Theme state interface
|
|
11
|
+
*/
|
|
12
|
+
export interface ThemeState {
|
|
13
|
+
/** Current color scheme */
|
|
14
|
+
colorScheme: ColorScheme;
|
|
15
|
+
/** Resolved color scheme (never 'system') */
|
|
16
|
+
resolvedScheme: 'light' | 'dark';
|
|
17
|
+
/** Whether dark mode is active */
|
|
18
|
+
isDark: boolean;
|
|
19
|
+
/** Full theme configuration */
|
|
20
|
+
config: ThemeConfig;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Theme context interface with methods
|
|
24
|
+
*/
|
|
25
|
+
export interface ThemeContext {
|
|
26
|
+
/** Current theme state */
|
|
27
|
+
state: ThemeState;
|
|
28
|
+
/** Set color scheme preference */
|
|
29
|
+
setColorScheme: (scheme: ColorScheme) => void;
|
|
30
|
+
/** Toggle between light and dark */
|
|
31
|
+
toggleColorScheme: () => void;
|
|
32
|
+
/** Update theme configuration */
|
|
33
|
+
updateConfig: (config: Partial<ThemeConfig>) => void;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Set theme context (used by ThemeProvider)
|
|
37
|
+
*/
|
|
38
|
+
export declare function setThemeContext(context: ThemeContext): void;
|
|
39
|
+
/**
|
|
40
|
+
* Get theme context
|
|
41
|
+
* @throws If called outside of ThemeProvider
|
|
42
|
+
*/
|
|
43
|
+
export declare function getThemeContext(): ThemeContext;
|
|
44
|
+
/**
|
|
45
|
+
* Try to get theme context
|
|
46
|
+
* Returns null if not available (doesn't throw)
|
|
47
|
+
*/
|
|
48
|
+
export declare function tryGetThemeContext(): ThemeContext | null;
|
|
49
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/theme/context.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE5D;;GAEG;AACH,eAAO,MAAM,SAAS,eAAuB,CAAC;AAE9C;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,2BAA2B;IAC3B,WAAW,EAAE,WAAW,CAAC;IACzB,6CAA6C;IAC7C,cAAc,EAAE,OAAO,GAAG,MAAM,CAAC;IACjC,kCAAkC;IAClC,MAAM,EAAE,OAAO,CAAC;IAChB,+BAA+B;IAC/B,MAAM,EAAE,WAAW,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,0BAA0B;IAC1B,KAAK,EAAE,UAAU,CAAC;IAClB,kCAAkC;IAClC,cAAc,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;IAC9C,oCAAoC;IACpC,iBAAiB,EAAE,MAAM,IAAI,CAAC;IAC9B,iCAAiC;IACjC,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;CACtD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAE3D;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,YAAY,CAU9C;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,YAAY,GAAG,IAAI,CAExD"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Theme context for sharing theme state across components
|
|
3
|
+
*/
|
|
4
|
+
import { getContext, setContext } from 'svelte';
|
|
5
|
+
/**
|
|
6
|
+
* Theme context key
|
|
7
|
+
*/
|
|
8
|
+
export const THEME_KEY = Symbol('smrt-theme');
|
|
9
|
+
/**
|
|
10
|
+
* Set theme context (used by ThemeProvider)
|
|
11
|
+
*/
|
|
12
|
+
export function setThemeContext(context) {
|
|
13
|
+
setContext(THEME_KEY, context);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Get theme context
|
|
17
|
+
* @throws If called outside of ThemeProvider
|
|
18
|
+
*/
|
|
19
|
+
export function getThemeContext() {
|
|
20
|
+
const context = getContext(THEME_KEY);
|
|
21
|
+
if (!context) {
|
|
22
|
+
throw new Error('Theme context not found. Make sure to wrap your app with <ThemeProvider>');
|
|
23
|
+
}
|
|
24
|
+
return context;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Try to get theme context
|
|
28
|
+
* Returns null if not available (doesn't throw)
|
|
29
|
+
*/
|
|
30
|
+
export function tryGetThemeContext() {
|
|
31
|
+
return getContext(THEME_KEY) ?? null;
|
|
32
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Theme system exports
|
|
3
|
+
*/
|
|
4
|
+
export { getThemeContext, setThemeContext, THEME_KEY, type ThemeContext, type ThemeState, tryGetThemeContext, } from './context.js';
|
|
5
|
+
export { default as ThemeProvider } from './ThemeProvider.svelte';
|
|
6
|
+
export { borderRadius, type ColorScheme, darkColors, defaultThemeConfig, duration, easing, elevation, generateColorVariables, generateThemeVariables, lightColors, spacing, type ThemeConfig, typography, } from './tokens.js';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/theme/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,eAAe,EACf,eAAe,EACf,SAAS,EACT,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,kBAAkB,GACnB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAGlE,OAAO,EACL,YAAY,EACZ,KAAK,WAAW,EAChB,UAAU,EACV,kBAAkB,EAClB,QAAQ,EACR,MAAM,EACN,SAAS,EACT,sBAAsB,EACtB,sBAAsB,EACtB,WAAW,EACX,OAAO,EACP,KAAK,WAAW,EAChB,UAAU,GACX,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Theme system exports
|
|
3
|
+
*/
|
|
4
|
+
// Context
|
|
5
|
+
export { getThemeContext, setThemeContext, THEME_KEY, tryGetThemeContext, } from './context.js';
|
|
6
|
+
// Components
|
|
7
|
+
export { default as ThemeProvider } from './ThemeProvider.svelte';
|
|
8
|
+
// Tokens
|
|
9
|
+
export { borderRadius, darkColors, defaultThemeConfig, duration, easing, elevation, generateColorVariables, generateThemeVariables, lightColors, spacing, typography, } from './tokens.js';
|