@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,53 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
import type { HTMLAttributes } from 'svelte/elements';
|
|
4
|
+
|
|
5
|
+
type MaxWidth = 'sm' | 'md' | 'lg' | 'xl' | 'full';
|
|
6
|
+
|
|
7
|
+
interface Props extends Omit<HTMLAttributes<HTMLDivElement>, 'class'> {
|
|
8
|
+
maxWidth?: MaxWidth;
|
|
9
|
+
children?: Snippet;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const { maxWidth = 'lg', children, ...rest }: Props = $props();
|
|
13
|
+
</script>
|
|
14
|
+
|
|
15
|
+
<div class="container max-w-{maxWidth}" {...rest}>
|
|
16
|
+
{@render children?.()}
|
|
17
|
+
</div>
|
|
18
|
+
|
|
19
|
+
<style>
|
|
20
|
+
.container {
|
|
21
|
+
width: 100%;
|
|
22
|
+
margin: 0 auto;
|
|
23
|
+
padding-left: var(--smrt-spacing-4);
|
|
24
|
+
padding-right: var(--smrt-spacing-4);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.max-w-sm {
|
|
28
|
+
max-width: 640px;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.max-w-md {
|
|
32
|
+
max-width: 768px;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.max-w-lg {
|
|
36
|
+
max-width: 1024px;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.max-w-xl {
|
|
40
|
+
max-width: 1280px;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
.max-w-full {
|
|
44
|
+
max-width: 100%;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
@media (min-width: 640px) {
|
|
48
|
+
.container {
|
|
49
|
+
padding-left: var(--smrt-spacing-6);
|
|
50
|
+
padding-right: var(--smrt-spacing-6);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
</style>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
import type { HTMLAttributes } from 'svelte/elements';
|
|
3
|
+
type MaxWidth = 'sm' | 'md' | 'lg' | 'xl' | 'full';
|
|
4
|
+
interface Props extends Omit<HTMLAttributes<HTMLDivElement>, 'class'> {
|
|
5
|
+
maxWidth?: MaxWidth;
|
|
6
|
+
children?: Snippet;
|
|
7
|
+
}
|
|
8
|
+
declare const Container: import("svelte").Component<Props, {}, "">;
|
|
9
|
+
type Container = ReturnType<typeof Container>;
|
|
10
|
+
export default Container;
|
|
11
|
+
//# sourceMappingURL=Container.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Container.svelte.d.ts","sourceRoot":"","sources":["../../../src/components/layout/Container.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGtD,KAAK,QAAQ,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC;AAEnD,UAAU,KAAM,SAAQ,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IACnE,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAkBD,QAAA,MAAM,SAAS,2CAAwC,CAAC;AACxD,KAAK,SAAS,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC;AAC9C,eAAe,SAAS,CAAC"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
/**
|
|
3
|
+
* EmptyState - Placeholder for empty lists/content
|
|
4
|
+
* refactored for Material 3
|
|
5
|
+
*
|
|
6
|
+
* Provides a consistent empty state display with optional icon,
|
|
7
|
+
* description, and call-to-action button.
|
|
8
|
+
*/
|
|
9
|
+
import type { Snippet } from 'svelte';
|
|
10
|
+
import { ripple } from '../../actions/ripple.js';
|
|
11
|
+
|
|
12
|
+
export interface Props {
|
|
13
|
+
/** Main title text */
|
|
14
|
+
title: string;
|
|
15
|
+
/** Optional description */
|
|
16
|
+
description?: string;
|
|
17
|
+
/** Icon slot or default icon name */
|
|
18
|
+
icon?: 'document' | 'folder' | 'users' | 'search' | 'inbox' | Snippet;
|
|
19
|
+
/** Action button label */
|
|
20
|
+
actionLabel?: string;
|
|
21
|
+
/** Action button href */
|
|
22
|
+
actionHref?: string;
|
|
23
|
+
/** Action button click handler */
|
|
24
|
+
onaction?: () => void;
|
|
25
|
+
/** Size variant */
|
|
26
|
+
size?: 'sm' | 'md' | 'lg';
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const {
|
|
30
|
+
title,
|
|
31
|
+
description,
|
|
32
|
+
icon = 'inbox',
|
|
33
|
+
actionLabel,
|
|
34
|
+
actionHref,
|
|
35
|
+
onaction,
|
|
36
|
+
size = 'md',
|
|
37
|
+
}: Props = $props();
|
|
38
|
+
|
|
39
|
+
// Default SVG icons
|
|
40
|
+
const icons = {
|
|
41
|
+
document: `<svg width="100%" height="100%" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
|
|
42
|
+
<path d="M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8l-6-6z"/>
|
|
43
|
+
<path d="M14 2v6h6M16 13H8M16 17H8M10 9H8"/>
|
|
44
|
+
</svg>`,
|
|
45
|
+
folder: `<svg width="100%" height="100%" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
|
|
46
|
+
<path d="M22 19a2 2 0 01-2 2H4a2 2 0 01-2-2V5a2 2 0 012-2h5l2 3h9a2 2 0 012 2z"/>
|
|
47
|
+
</svg>`,
|
|
48
|
+
users: `<svg width="100%" height="100%" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
|
|
49
|
+
<path d="M17 21v-2a4 4 0 00-4-4H5a4 4 0 00-4 4v2"/>
|
|
50
|
+
<circle cx="9" cy="7" r="4"/>
|
|
51
|
+
<path d="M23 21v-2a4 4 0 00-3-3.87M16 3.13a4 4 0 010 7.75"/>
|
|
52
|
+
</svg>`,
|
|
53
|
+
search: `<svg width="100%" height="100%" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
|
|
54
|
+
<circle cx="11" cy="11" r="8"/>
|
|
55
|
+
<path d="M21 21l-4.35-4.35"/>
|
|
56
|
+
</svg>`,
|
|
57
|
+
inbox: `<svg width="100%" height="100%" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
|
|
58
|
+
<path d="M22 12h-6l-2 3h-4l-2-3H2"/>
|
|
59
|
+
<path d="M5.45 5.11L2 12v6a2 2 0 002 2h16a2 2 0 002-2v-6l-3.45-6.89A2 2 0 0016.76 4H7.24a2 2 0 00-1.79 1.11z"/>
|
|
60
|
+
</svg>`,
|
|
61
|
+
};
|
|
62
|
+
</script>
|
|
63
|
+
|
|
64
|
+
<div class="empty-state" class:sm={size === 'sm'} class:lg={size === 'lg'}>
|
|
65
|
+
<div class="icon-container">
|
|
66
|
+
{#if typeof icon === 'string'}
|
|
67
|
+
{@html icons[icon] ?? icons.inbox}
|
|
68
|
+
{:else}
|
|
69
|
+
{@render icon()}
|
|
70
|
+
{/if}
|
|
71
|
+
</div>
|
|
72
|
+
|
|
73
|
+
<h3 class="empty-title">{title}</h3>
|
|
74
|
+
|
|
75
|
+
{#if description}
|
|
76
|
+
<p class="empty-description">{description}</p>
|
|
77
|
+
{/if}
|
|
78
|
+
|
|
79
|
+
{#if actionLabel}
|
|
80
|
+
{#if actionHref}
|
|
81
|
+
<a href={actionHref} class="action-button" use:ripple>
|
|
82
|
+
{actionLabel}
|
|
83
|
+
</a>
|
|
84
|
+
{:else if onaction}
|
|
85
|
+
<button type="button" class="action-button" onclick={onaction} use:ripple>
|
|
86
|
+
{actionLabel}
|
|
87
|
+
</button>
|
|
88
|
+
{/if}
|
|
89
|
+
{/if}
|
|
90
|
+
</div>
|
|
91
|
+
|
|
92
|
+
<style>
|
|
93
|
+
.empty-state {
|
|
94
|
+
display: flex;
|
|
95
|
+
flex-direction: column;
|
|
96
|
+
align-items: center;
|
|
97
|
+
justify-content: center;
|
|
98
|
+
padding: 4rem 2rem;
|
|
99
|
+
text-align: center;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
.empty-state.sm {
|
|
103
|
+
padding: 2rem 1.5rem;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
.empty-state.lg {
|
|
107
|
+
padding: 6rem 3rem;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
.icon-container {
|
|
111
|
+
display: flex;
|
|
112
|
+
align-items: center;
|
|
113
|
+
justify-content: center;
|
|
114
|
+
width: 96px;
|
|
115
|
+
height: 96px;
|
|
116
|
+
margin-bottom: 2rem;
|
|
117
|
+
background-color: var(--smrt-color-secondary-container);
|
|
118
|
+
color: var(--smrt-color-on-secondary-container);
|
|
119
|
+
border-radius: var(--smrt-radius-3xl, 32px); /* M3 extra large shape */
|
|
120
|
+
padding: var(--smrt-spacing-6, 24px);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.sm .icon-container {
|
|
124
|
+
width: 64px;
|
|
125
|
+
height: 64px;
|
|
126
|
+
margin-bottom: 1.5rem;
|
|
127
|
+
border-radius: var(--smrt-radius-xl, 16px);
|
|
128
|
+
padding: var(--smrt-spacing-4, 16px);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
.lg .icon-container {
|
|
132
|
+
width: 120px;
|
|
133
|
+
height: 120px;
|
|
134
|
+
margin-bottom: 2.5rem;
|
|
135
|
+
border-radius: var(--smrt-radius-3xl, 32px);
|
|
136
|
+
padding: var(--smrt-spacing-8, 32px);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
.empty-title {
|
|
140
|
+
font: var(--smrt-typography-title-large-font);
|
|
141
|
+
color: var(--smrt-color-on-surface);
|
|
142
|
+
margin: 0 0 0.75rem;
|
|
143
|
+
font-weight: var(--smrt-typography-weight-medium, 500);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
.sm .empty-title {
|
|
147
|
+
font: var(--smrt-typography-title-medium-font);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
.lg .empty-title {
|
|
151
|
+
font: var(--smrt-typography-headline-small-font);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
.empty-description {
|
|
155
|
+
font: var(--smrt-typography-body-medium-font);
|
|
156
|
+
color: var(--smrt-color-on-surface-variant);
|
|
157
|
+
margin: 0 0 2rem;
|
|
158
|
+
max-width: 440px;
|
|
159
|
+
line-height: var(--smrt-typography-body-medium-line-height, 1.5);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
.action-button {
|
|
163
|
+
display: inline-flex;
|
|
164
|
+
align-items: center;
|
|
165
|
+
justify-content: center;
|
|
166
|
+
gap: var(--smrt-spacing-2, 8px);
|
|
167
|
+
padding: 0 var(--smrt-spacing-6, 24px);
|
|
168
|
+
height: 40px;
|
|
169
|
+
font: var(--smrt-typography-label-large-font);
|
|
170
|
+
font-weight: var(--smrt-typography-weight-medium, 500);
|
|
171
|
+
color: var(--smrt-color-on-primary);
|
|
172
|
+
background-color: var(--smrt-color-primary);
|
|
173
|
+
border: none;
|
|
174
|
+
border-radius: var(--smrt-radius-2xl, 24px);
|
|
175
|
+
text-decoration: none;
|
|
176
|
+
cursor: pointer;
|
|
177
|
+
transition: box-shadow 200ms, background-color 200ms;
|
|
178
|
+
position: relative;
|
|
179
|
+
overflow: hidden;
|
|
180
|
+
box-shadow: var(--smrt-elevation-1);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
.action-button:hover {
|
|
184
|
+
background-color: var(--smrt-color-primary);
|
|
185
|
+
box-shadow: var(--smrt-elevation-2);
|
|
186
|
+
}
|
|
187
|
+
</style>
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EmptyState - Placeholder for empty lists/content
|
|
3
|
+
* refactored for Material 3
|
|
4
|
+
*
|
|
5
|
+
* Provides a consistent empty state display with optional icon,
|
|
6
|
+
* description, and call-to-action button.
|
|
7
|
+
*/
|
|
8
|
+
import type { Snippet } from 'svelte';
|
|
9
|
+
export interface Props {
|
|
10
|
+
/** Main title text */
|
|
11
|
+
title: string;
|
|
12
|
+
/** Optional description */
|
|
13
|
+
description?: string;
|
|
14
|
+
/** Icon slot or default icon name */
|
|
15
|
+
icon?: 'document' | 'folder' | 'users' | 'search' | 'inbox' | Snippet;
|
|
16
|
+
/** Action button label */
|
|
17
|
+
actionLabel?: string;
|
|
18
|
+
/** Action button href */
|
|
19
|
+
actionHref?: string;
|
|
20
|
+
/** Action button click handler */
|
|
21
|
+
onaction?: () => void;
|
|
22
|
+
/** Size variant */
|
|
23
|
+
size?: 'sm' | 'md' | 'lg';
|
|
24
|
+
}
|
|
25
|
+
declare const EmptyState: import("svelte").Component<Props, {}, "">;
|
|
26
|
+
type EmptyState = ReturnType<typeof EmptyState>;
|
|
27
|
+
export default EmptyState;
|
|
28
|
+
//# sourceMappingURL=EmptyState.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmptyState.svelte.d.ts","sourceRoot":"","sources":["../../../src/components/layout/EmptyState.svelte.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAItC,MAAM,WAAW,KAAK;IACpB,sBAAsB;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qCAAqC;IACrC,IAAI,CAAC,EAAE,UAAU,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAC;IACtE,0BAA0B;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yBAAyB;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,mBAAmB;IACnB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;CAC3B;AAyED,QAAA,MAAM,UAAU,2CAAwC,CAAC;AACzD,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAChD,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
import { M } from '../../i18n/strings.ui.js';
|
|
4
|
+
import { useI18n } from '../../i18n/use-i18n.js';
|
|
5
|
+
import Container from './Container.svelte';
|
|
6
|
+
|
|
7
|
+
const { t } = useI18n();
|
|
8
|
+
|
|
9
|
+
export interface Props {
|
|
10
|
+
children?: Snippet;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const { children }: Props = $props();
|
|
14
|
+
|
|
15
|
+
const currentYear = new Date().getFullYear();
|
|
16
|
+
</script>
|
|
17
|
+
|
|
18
|
+
<footer class="site-footer">
|
|
19
|
+
<Container>
|
|
20
|
+
<div class="footer-content">
|
|
21
|
+
<p class="copyright">© {currentYear} {t(M['ui.footer.all_rights_reserved'])}</p>
|
|
22
|
+
|
|
23
|
+
{#if children}
|
|
24
|
+
<div class="footer-links">
|
|
25
|
+
{@render children()}
|
|
26
|
+
</div>
|
|
27
|
+
{/if}
|
|
28
|
+
</div>
|
|
29
|
+
</Container>
|
|
30
|
+
</footer>
|
|
31
|
+
|
|
32
|
+
<style>
|
|
33
|
+
.site-footer {
|
|
34
|
+
background: var(--smrt-color-surface-container-low);
|
|
35
|
+
border-top: 1px solid var(--smrt-color-outline-variant);
|
|
36
|
+
padding: var(--smrt-spacing-8) 0;
|
|
37
|
+
margin-top: var(--smrt-spacing-12);
|
|
38
|
+
text-align: center;
|
|
39
|
+
color: var(--smrt-color-on-surface-variant);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.footer-content {
|
|
43
|
+
display: flex;
|
|
44
|
+
flex-direction: column;
|
|
45
|
+
gap: var(--smrt-spacing-4);
|
|
46
|
+
align-items: center;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.copyright {
|
|
50
|
+
margin: 0;
|
|
51
|
+
font-size: var(--smrt-typography-body-medium-size);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.footer-links :global(a) {
|
|
55
|
+
color: var(--smrt-color-primary);
|
|
56
|
+
text-decoration: none;
|
|
57
|
+
margin: 0 var(--smrt-spacing-2);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.footer-links :global(a:hover) {
|
|
61
|
+
text-decoration: underline;
|
|
62
|
+
}
|
|
63
|
+
</style>
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
export interface Props {
|
|
3
|
+
children?: Snippet;
|
|
4
|
+
}
|
|
5
|
+
declare const Footer: import("svelte").Component<Props, {}, "">;
|
|
6
|
+
type Footer = ReturnType<typeof Footer>;
|
|
7
|
+
export default Footer;
|
|
8
|
+
//# sourceMappingURL=Footer.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Footer.svelte.d.ts","sourceRoot":"","sources":["../../../src/components/layout/Footer.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAMtC,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAiCD,QAAA,MAAM,MAAM,2CAAwC,CAAC;AACrD,KAAK,MAAM,GAAG,UAAU,CAAC,OAAO,MAAM,CAAC,CAAC;AACxC,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
import type { HTMLAttributes } from 'svelte/elements';
|
|
4
|
+
|
|
5
|
+
type GapSize = 'sm' | 'md' | 'lg' | 'xl';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Responsive columns configuration
|
|
9
|
+
* Allows different column counts at different breakpoints.
|
|
10
|
+
*
|
|
11
|
+
* Uses mobile-first cascading: each breakpoint inherits from smaller ones.
|
|
12
|
+
* Unspecified breakpoints use sensible defaults (sm: 1, md: 2, lg: 3, xl: 4).
|
|
13
|
+
*
|
|
14
|
+
* Example: `{ md: 2, xl: 4 }` means:
|
|
15
|
+
* - sm: 1 (default)
|
|
16
|
+
* - md: 2 (specified)
|
|
17
|
+
* - lg: 2 (inherits from md)
|
|
18
|
+
* - xl: 4 (specified)
|
|
19
|
+
*/
|
|
20
|
+
interface ResponsiveColumns {
|
|
21
|
+
/** Columns for small screens (< 640px). Default: 1 */
|
|
22
|
+
sm?: number;
|
|
23
|
+
/** Columns for medium screens (>= 640px). Default: 2 or inherits from sm */
|
|
24
|
+
md?: number;
|
|
25
|
+
/** Columns for large screens (>= 1024px). Default: 3 or inherits from md */
|
|
26
|
+
lg?: number;
|
|
27
|
+
/** Columns for extra large screens (>= 1280px). Default: 4 or inherits from lg */
|
|
28
|
+
xl?: number;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Gap configuration - can be a simple size or separate row/column gaps
|
|
33
|
+
*/
|
|
34
|
+
type GapConfig = GapSize | { row?: GapSize; column?: GapSize };
|
|
35
|
+
|
|
36
|
+
type AlignItems = 'start' | 'center' | 'end' | 'stretch';
|
|
37
|
+
type JustifyItems = 'start' | 'center' | 'end' | 'stretch';
|
|
38
|
+
type AutoFlow = 'row' | 'column' | 'row dense' | 'column dense';
|
|
39
|
+
|
|
40
|
+
interface Props extends Omit<HTMLAttributes<HTMLDivElement>, 'class'> {
|
|
41
|
+
/** Number of columns, 'auto' for auto-fill, or responsive object */
|
|
42
|
+
columns?: number | 'auto' | ResponsiveColumns;
|
|
43
|
+
/** Gap between items - size or { row, column } */
|
|
44
|
+
gap?: GapConfig;
|
|
45
|
+
/** Header snippet rendered above the grid */
|
|
46
|
+
header?: Snippet;
|
|
47
|
+
/** Main grid content */
|
|
48
|
+
children?: Snippet;
|
|
49
|
+
/** Vertical alignment of grid items */
|
|
50
|
+
alignItems?: AlignItems;
|
|
51
|
+
/** Horizontal alignment of grid items */
|
|
52
|
+
justifyItems?: JustifyItems;
|
|
53
|
+
/** Grid auto-flow direction */
|
|
54
|
+
autoFlow?: AutoFlow;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const {
|
|
58
|
+
columns = 'auto',
|
|
59
|
+
gap = 'md',
|
|
60
|
+
header,
|
|
61
|
+
children,
|
|
62
|
+
alignItems,
|
|
63
|
+
justifyItems,
|
|
64
|
+
autoFlow,
|
|
65
|
+
...rest
|
|
66
|
+
}: Props = $props();
|
|
67
|
+
|
|
68
|
+
// Determine if we're using responsive columns
|
|
69
|
+
const isResponsive = $derived(
|
|
70
|
+
typeof columns === 'object' && columns !== null && !Array.isArray(columns),
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
// Build grid-template-columns for non-responsive case
|
|
74
|
+
const _gridColumns = $derived.by(() => {
|
|
75
|
+
if (isResponsive) return undefined;
|
|
76
|
+
if (columns === 'auto') {
|
|
77
|
+
return 'repeat(auto-fill, minmax(300px, 1fr))';
|
|
78
|
+
}
|
|
79
|
+
return `repeat(${columns}, 1fr)`;
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
// Build CSS custom properties for responsive columns
|
|
83
|
+
const responsiveStyles = $derived.by(() => {
|
|
84
|
+
if (!isResponsive) return '';
|
|
85
|
+
const cols = columns as ResponsiveColumns;
|
|
86
|
+
const vars: string[] = [];
|
|
87
|
+
if (cols.sm !== undefined) vars.push(`--grid-columns-sm: ${cols.sm}`);
|
|
88
|
+
if (cols.md !== undefined) vars.push(`--grid-columns-md: ${cols.md}`);
|
|
89
|
+
if (cols.lg !== undefined) vars.push(`--grid-columns-lg: ${cols.lg}`);
|
|
90
|
+
if (cols.xl !== undefined) vars.push(`--grid-columns-xl: ${cols.xl}`);
|
|
91
|
+
return vars.join('; ');
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
// Parse gap configuration - default to 'md' if not specified in object
|
|
95
|
+
const rowGap = $derived(typeof gap === 'object' ? (gap.row ?? 'md') : gap);
|
|
96
|
+
const columnGap = $derived(
|
|
97
|
+
typeof gap === 'object' ? (gap.column ?? 'md') : gap,
|
|
98
|
+
);
|
|
99
|
+
|
|
100
|
+
// Build inline styles
|
|
101
|
+
const inlineStyles = $derived.by(() => {
|
|
102
|
+
const styles: string[] = [];
|
|
103
|
+
|
|
104
|
+
// Grid template columns (non-responsive only)
|
|
105
|
+
if (_gridColumns) {
|
|
106
|
+
styles.push(`grid-template-columns: ${_gridColumns}`);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Responsive CSS variables
|
|
110
|
+
if (responsiveStyles) {
|
|
111
|
+
styles.push(responsiveStyles);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Alignment
|
|
115
|
+
if (alignItems) styles.push(`align-items: ${alignItems}`);
|
|
116
|
+
if (justifyItems) styles.push(`justify-items: ${justifyItems}`);
|
|
117
|
+
|
|
118
|
+
// Auto flow
|
|
119
|
+
if (autoFlow) styles.push(`grid-auto-flow: ${autoFlow}`);
|
|
120
|
+
|
|
121
|
+
return styles.join('; ');
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
// Build class names
|
|
125
|
+
const gridClasses = $derived.by(() => {
|
|
126
|
+
const classes = ['grid'];
|
|
127
|
+
|
|
128
|
+
// Responsive modifier
|
|
129
|
+
if (isResponsive) {
|
|
130
|
+
classes.push('grid-responsive');
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Gap classes (row and column may differ)
|
|
134
|
+
if (rowGap && columnGap && rowGap === columnGap) {
|
|
135
|
+
classes.push(`gap-${rowGap}`);
|
|
136
|
+
} else {
|
|
137
|
+
if (rowGap) classes.push(`row-gap-${rowGap}`);
|
|
138
|
+
if (columnGap) classes.push(`col-gap-${columnGap}`);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return classes.join(' ');
|
|
142
|
+
});
|
|
143
|
+
</script>
|
|
144
|
+
|
|
145
|
+
{#if header}
|
|
146
|
+
<div class="grid-header">
|
|
147
|
+
{@render header()}
|
|
148
|
+
</div>
|
|
149
|
+
{/if}
|
|
150
|
+
<div
|
|
151
|
+
class={gridClasses}
|
|
152
|
+
style={inlineStyles}
|
|
153
|
+
{...rest}
|
|
154
|
+
>
|
|
155
|
+
{@render children?.()}
|
|
156
|
+
</div>
|
|
157
|
+
|
|
158
|
+
<style>
|
|
159
|
+
.grid {
|
|
160
|
+
display: grid;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
.grid-header {
|
|
164
|
+
width: 100%;
|
|
165
|
+
margin-bottom: var(--smrt-spacing-4);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/* Responsive grid - uses CSS variables set via inline styles */
|
|
169
|
+
.grid-responsive {
|
|
170
|
+
grid-template-columns: repeat(var(--grid-columns-sm, 1), 1fr);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
@media (min-width: 640px) {
|
|
174
|
+
.grid-responsive {
|
|
175
|
+
grid-template-columns: repeat(var(--grid-columns-md, var(--grid-columns-sm, 2)), 1fr);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
@media (min-width: 1024px) {
|
|
180
|
+
.grid-responsive {
|
|
181
|
+
grid-template-columns: repeat(var(--grid-columns-lg, var(--grid-columns-md, var(--grid-columns-sm, 3))), 1fr);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
@media (min-width: 1280px) {
|
|
186
|
+
.grid-responsive {
|
|
187
|
+
grid-template-columns: repeat(var(--grid-columns-xl, var(--grid-columns-lg, var(--grid-columns-md, var(--grid-columns-sm, 4)))), 1fr);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/* Uniform gap */
|
|
192
|
+
.gap-sm {
|
|
193
|
+
gap: var(--smrt-spacing-4);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
.gap-md {
|
|
197
|
+
gap: var(--smrt-spacing-6);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
.gap-lg {
|
|
201
|
+
gap: var(--smrt-spacing-8);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
.gap-xl {
|
|
205
|
+
gap: var(--smrt-spacing-12);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/* Row gap */
|
|
209
|
+
.row-gap-sm {
|
|
210
|
+
row-gap: var(--smrt-spacing-4);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
.row-gap-md {
|
|
214
|
+
row-gap: var(--smrt-spacing-6);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
.row-gap-lg {
|
|
218
|
+
row-gap: var(--smrt-spacing-8);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
.row-gap-xl {
|
|
222
|
+
row-gap: var(--smrt-spacing-12);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/* Column gap */
|
|
226
|
+
.col-gap-sm {
|
|
227
|
+
column-gap: var(--smrt-spacing-4);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
.col-gap-md {
|
|
231
|
+
column-gap: var(--smrt-spacing-6);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
.col-gap-lg {
|
|
235
|
+
column-gap: var(--smrt-spacing-8);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
.col-gap-xl {
|
|
239
|
+
column-gap: var(--smrt-spacing-12);
|
|
240
|
+
}
|
|
241
|
+
</style>
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
import type { HTMLAttributes } from 'svelte/elements';
|
|
3
|
+
type GapSize = 'sm' | 'md' | 'lg' | 'xl';
|
|
4
|
+
/**
|
|
5
|
+
* Responsive columns configuration
|
|
6
|
+
* Allows different column counts at different breakpoints.
|
|
7
|
+
*
|
|
8
|
+
* Uses mobile-first cascading: each breakpoint inherits from smaller ones.
|
|
9
|
+
* Unspecified breakpoints use sensible defaults (sm: 1, md: 2, lg: 3, xl: 4).
|
|
10
|
+
*
|
|
11
|
+
* Example: `{ md: 2, xl: 4 }` means:
|
|
12
|
+
* - sm: 1 (default)
|
|
13
|
+
* - md: 2 (specified)
|
|
14
|
+
* - lg: 2 (inherits from md)
|
|
15
|
+
* - xl: 4 (specified)
|
|
16
|
+
*/
|
|
17
|
+
interface ResponsiveColumns {
|
|
18
|
+
/** Columns for small screens (< 640px). Default: 1 */
|
|
19
|
+
sm?: number;
|
|
20
|
+
/** Columns for medium screens (>= 640px). Default: 2 or inherits from sm */
|
|
21
|
+
md?: number;
|
|
22
|
+
/** Columns for large screens (>= 1024px). Default: 3 or inherits from md */
|
|
23
|
+
lg?: number;
|
|
24
|
+
/** Columns for extra large screens (>= 1280px). Default: 4 or inherits from lg */
|
|
25
|
+
xl?: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Gap configuration - can be a simple size or separate row/column gaps
|
|
29
|
+
*/
|
|
30
|
+
type GapConfig = GapSize | {
|
|
31
|
+
row?: GapSize;
|
|
32
|
+
column?: GapSize;
|
|
33
|
+
};
|
|
34
|
+
type AlignItems = 'start' | 'center' | 'end' | 'stretch';
|
|
35
|
+
type JustifyItems = 'start' | 'center' | 'end' | 'stretch';
|
|
36
|
+
type AutoFlow = 'row' | 'column' | 'row dense' | 'column dense';
|
|
37
|
+
interface Props extends Omit<HTMLAttributes<HTMLDivElement>, 'class'> {
|
|
38
|
+
/** Number of columns, 'auto' for auto-fill, or responsive object */
|
|
39
|
+
columns?: number | 'auto' | ResponsiveColumns;
|
|
40
|
+
/** Gap between items - size or { row, column } */
|
|
41
|
+
gap?: GapConfig;
|
|
42
|
+
/** Header snippet rendered above the grid */
|
|
43
|
+
header?: Snippet;
|
|
44
|
+
/** Main grid content */
|
|
45
|
+
children?: Snippet;
|
|
46
|
+
/** Vertical alignment of grid items */
|
|
47
|
+
alignItems?: AlignItems;
|
|
48
|
+
/** Horizontal alignment of grid items */
|
|
49
|
+
justifyItems?: JustifyItems;
|
|
50
|
+
/** Grid auto-flow direction */
|
|
51
|
+
autoFlow?: AutoFlow;
|
|
52
|
+
}
|
|
53
|
+
declare const Grid: import("svelte").Component<Props, {}, "">;
|
|
54
|
+
type Grid = ReturnType<typeof Grid>;
|
|
55
|
+
export default Grid;
|
|
56
|
+
//# sourceMappingURL=Grid.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Grid.svelte.d.ts","sourceRoot":"","sources":["../../../src/components/layout/Grid.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGtD,KAAK,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAEzC;;;;;;;;;;;;GAYG;AACH,UAAU,iBAAiB;IACzB,sDAAsD;IACtD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,4EAA4E;IAC5E,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,4EAA4E;IAC5E,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,kFAAkF;IAClF,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED;;GAEG;AACH,KAAK,SAAS,GAAG,OAAO,GAAG;IAAE,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAE/D,KAAK,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;AACzD,KAAK,YAAY,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;AAC3D,KAAK,QAAQ,GAAG,KAAK,GAAG,QAAQ,GAAG,WAAW,GAAG,cAAc,CAAC;AAEhE,UAAU,KAAM,SAAQ,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IACnE,oEAAoE;IACpE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,iBAAiB,CAAC;IAC9C,kDAAkD;IAClD,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,6CAA6C;IAC7C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,wBAAwB;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uCAAuC;IACvC,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,yCAAyC;IACzC,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAiHD,QAAA,MAAM,IAAI,2CAAwC,CAAC;AACnD,KAAK,IAAI,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC;AACpC,eAAe,IAAI,CAAC"}
|