@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,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DataTable types
|
|
3
|
+
*/
|
|
4
|
+
import type { Snippet } from 'svelte';
|
|
5
|
+
/**
|
|
6
|
+
* Column definition for DataTable
|
|
7
|
+
*/
|
|
8
|
+
export interface DataTableColumn<T> {
|
|
9
|
+
/** Unique column identifier */
|
|
10
|
+
id: string;
|
|
11
|
+
/** Column header label */
|
|
12
|
+
label: string;
|
|
13
|
+
/** Property key to access from row data (supports dot notation) */
|
|
14
|
+
accessor?: keyof T | string;
|
|
15
|
+
/** Custom cell renderer */
|
|
16
|
+
cell?: Snippet<[{
|
|
17
|
+
row: T;
|
|
18
|
+
value: unknown;
|
|
19
|
+
index: number;
|
|
20
|
+
}]>;
|
|
21
|
+
/** Custom header renderer */
|
|
22
|
+
header?: Snippet<[{
|
|
23
|
+
column: DataTableColumn<T>;
|
|
24
|
+
}]>;
|
|
25
|
+
/** Whether column is sortable */
|
|
26
|
+
sortable?: boolean;
|
|
27
|
+
/** Column width (CSS value) */
|
|
28
|
+
width?: string;
|
|
29
|
+
/** Minimum width (CSS value) */
|
|
30
|
+
minWidth?: string;
|
|
31
|
+
/** Maximum width (CSS value) */
|
|
32
|
+
maxWidth?: string;
|
|
33
|
+
/** Text alignment */
|
|
34
|
+
align?: 'left' | 'center' | 'right';
|
|
35
|
+
/** Whether column is hidden */
|
|
36
|
+
hidden?: boolean;
|
|
37
|
+
/** Custom sort function */
|
|
38
|
+
sortFn?: (a: T, b: T, direction: SortDirection) => number;
|
|
39
|
+
/** Column class name */
|
|
40
|
+
className?: string;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Sort direction
|
|
44
|
+
*/
|
|
45
|
+
export type SortDirection = 'asc' | 'desc' | null;
|
|
46
|
+
/**
|
|
47
|
+
* Sort state
|
|
48
|
+
*/
|
|
49
|
+
export interface SortState {
|
|
50
|
+
columnId: string | null;
|
|
51
|
+
direction: SortDirection;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* DataTable props
|
|
55
|
+
*/
|
|
56
|
+
export interface DataTableProps<T> {
|
|
57
|
+
/** Data rows */
|
|
58
|
+
data: T[];
|
|
59
|
+
/** Column definitions */
|
|
60
|
+
columns: DataTableColumn<T>[];
|
|
61
|
+
/** Unique key accessor for rows */
|
|
62
|
+
rowKey?: keyof T | ((row: T) => string | number);
|
|
63
|
+
/** Enable row selection */
|
|
64
|
+
selectable?: boolean;
|
|
65
|
+
/** Selected row keys */
|
|
66
|
+
selected?: Set<string | number>;
|
|
67
|
+
/** Selection change callback */
|
|
68
|
+
onSelectionChange?: (selected: Set<string | number>) => void;
|
|
69
|
+
/** Row click callback */
|
|
70
|
+
onRowClick?: (row: T, index: number) => void;
|
|
71
|
+
/** Enable sorting */
|
|
72
|
+
sortable?: boolean;
|
|
73
|
+
/** Current sort state */
|
|
74
|
+
sort?: SortState;
|
|
75
|
+
/** Sort change callback */
|
|
76
|
+
onSortChange?: (sort: SortState) => void;
|
|
77
|
+
/** Loading state */
|
|
78
|
+
loading?: boolean;
|
|
79
|
+
/** Empty state content */
|
|
80
|
+
empty?: Snippet;
|
|
81
|
+
/** Custom row class function */
|
|
82
|
+
rowClass?: (row: T, index: number) => string;
|
|
83
|
+
/** Table size variant */
|
|
84
|
+
size?: 'sm' | 'md' | 'lg';
|
|
85
|
+
/** Enable striped rows */
|
|
86
|
+
striped?: boolean;
|
|
87
|
+
/** Enable hover highlight */
|
|
88
|
+
hoverable?: boolean;
|
|
89
|
+
/** Enable sticky header */
|
|
90
|
+
stickyHeader?: boolean;
|
|
91
|
+
/** Table caption for accessibility */
|
|
92
|
+
caption?: string;
|
|
93
|
+
/** Dense mode (reduced padding) */
|
|
94
|
+
dense?: boolean;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Get nested value from object using dot notation
|
|
98
|
+
*/
|
|
99
|
+
export declare function getNestedValue<T>(obj: T, path: string): unknown;
|
|
100
|
+
/**
|
|
101
|
+
* Default sort function for basic types
|
|
102
|
+
*/
|
|
103
|
+
export declare function defaultSort<T>(a: T, b: T, accessor: string, direction: SortDirection): number;
|
|
104
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/data/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DataTable types
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Get nested value from object using dot notation
|
|
6
|
+
*/
|
|
7
|
+
export function getNestedValue(obj, path) {
|
|
8
|
+
return path.split('.').reduce((acc, part) => {
|
|
9
|
+
if (acc && typeof acc === 'object' && part in acc) {
|
|
10
|
+
return acc[part];
|
|
11
|
+
}
|
|
12
|
+
return undefined;
|
|
13
|
+
}, obj);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Default sort function for basic types
|
|
17
|
+
*/
|
|
18
|
+
export function defaultSort(a, b, accessor, direction) {
|
|
19
|
+
if (!direction)
|
|
20
|
+
return 0;
|
|
21
|
+
const aVal = getNestedValue(a, accessor);
|
|
22
|
+
const bVal = getNestedValue(b, accessor);
|
|
23
|
+
// Handle nullish values
|
|
24
|
+
if (aVal == null && bVal == null)
|
|
25
|
+
return 0;
|
|
26
|
+
if (aVal == null)
|
|
27
|
+
return direction === 'asc' ? 1 : -1;
|
|
28
|
+
if (bVal == null)
|
|
29
|
+
return direction === 'asc' ? -1 : 1;
|
|
30
|
+
// Compare values
|
|
31
|
+
let comparison = 0;
|
|
32
|
+
if (typeof aVal === 'string' && typeof bVal === 'string') {
|
|
33
|
+
comparison = aVal.localeCompare(bVal);
|
|
34
|
+
}
|
|
35
|
+
else if (typeof aVal === 'number' && typeof bVal === 'number') {
|
|
36
|
+
comparison = aVal - bVal;
|
|
37
|
+
}
|
|
38
|
+
else if (aVal instanceof Date && bVal instanceof Date) {
|
|
39
|
+
comparison = aVal.getTime() - bVal.getTime();
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
comparison = String(aVal).localeCompare(String(bVal));
|
|
43
|
+
}
|
|
44
|
+
return direction === 'asc' ? comparison : -comparison;
|
|
45
|
+
}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
/**
|
|
3
|
+
* ConfidenceBadge - Displays AI confidence level indicator
|
|
4
|
+
*
|
|
5
|
+
* Shows a visual indicator for confidence scores (0-100).
|
|
6
|
+
* Useful for OCR results, AI predictions, etc.
|
|
7
|
+
*
|
|
8
|
+
* Accessibility: Uses role="meter" with aria-valuenow for screen readers
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/** Props for ConfidenceBadge component */
|
|
12
|
+
export interface Props {
|
|
13
|
+
/** Confidence value (0-100) */
|
|
14
|
+
confidence: number;
|
|
15
|
+
/** Show percentage value */
|
|
16
|
+
showPercent?: boolean;
|
|
17
|
+
/** Size variant */
|
|
18
|
+
size?: 'sm' | 'md' | 'lg';
|
|
19
|
+
/** Optional CSS class */
|
|
20
|
+
class?: string;
|
|
21
|
+
/** Accessible label */
|
|
22
|
+
'aria-label'?: string;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const {
|
|
26
|
+
confidence,
|
|
27
|
+
showPercent = true,
|
|
28
|
+
size = 'md',
|
|
29
|
+
class: className = '',
|
|
30
|
+
'aria-label': ariaLabel,
|
|
31
|
+
}: Props = $props();
|
|
32
|
+
|
|
33
|
+
// Clamp confidence to valid range
|
|
34
|
+
const clampedConfidence = $derived(Math.max(0, Math.min(100, confidence)));
|
|
35
|
+
|
|
36
|
+
// Determine level based on confidence
|
|
37
|
+
const level = $derived.by(() => {
|
|
38
|
+
if (clampedConfidence >= 80) return 'high';
|
|
39
|
+
if (clampedConfidence >= 50) return 'medium';
|
|
40
|
+
return 'low';
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
// Color scheme based on level - uses CSS variables with fallbacks
|
|
44
|
+
const colors = $derived.by(() => {
|
|
45
|
+
switch (level) {
|
|
46
|
+
case 'high':
|
|
47
|
+
return {
|
|
48
|
+
bg: 'var(--smrt-color-primary-container, #dcfce7)',
|
|
49
|
+
text: 'var(--smrt-color-on-primary-container, #166534)',
|
|
50
|
+
bar: 'var(--smrt-color-primary, #22c55e)',
|
|
51
|
+
};
|
|
52
|
+
case 'medium':
|
|
53
|
+
return {
|
|
54
|
+
bg: 'var(--smrt-color-secondary-container, #fef3c7)',
|
|
55
|
+
text: 'var(--smrt-color-on-secondary-container, #92400e)',
|
|
56
|
+
bar: 'var(--smrt-color-secondary, #f59e0b)',
|
|
57
|
+
};
|
|
58
|
+
case 'low':
|
|
59
|
+
return {
|
|
60
|
+
bg: 'var(--smrt-color-error-container, #fee2e2)',
|
|
61
|
+
text: 'var(--smrt-color-on-error-container, #dc2626)',
|
|
62
|
+
bar: 'var(--smrt-color-error, #ef4444)',
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
// Format percentage
|
|
68
|
+
const percentText = $derived(`${Math.round(clampedConfidence)}%`);
|
|
69
|
+
|
|
70
|
+
// Accessible label
|
|
71
|
+
const defaultLabel = $derived(`Confidence: ${Math.round(clampedConfidence)}%`);
|
|
72
|
+
|
|
73
|
+
// Human-readable value text for screen readers
|
|
74
|
+
const valueText = $derived(
|
|
75
|
+
`${level} confidence (${Math.round(clampedConfidence)}%)`,
|
|
76
|
+
);
|
|
77
|
+
</script>
|
|
78
|
+
|
|
79
|
+
<span
|
|
80
|
+
class="confidence-badge {className}"
|
|
81
|
+
class:sm={size === 'sm'}
|
|
82
|
+
class:lg={size === 'lg'}
|
|
83
|
+
style:--badge-bg={colors.bg}
|
|
84
|
+
style:--badge-text={colors.text}
|
|
85
|
+
style:--bar-color={colors.bar}
|
|
86
|
+
role="meter"
|
|
87
|
+
aria-valuenow={clampedConfidence}
|
|
88
|
+
aria-valuemin={0}
|
|
89
|
+
aria-valuemax={100}
|
|
90
|
+
aria-valuetext={valueText}
|
|
91
|
+
aria-label={ariaLabel ?? defaultLabel}
|
|
92
|
+
>
|
|
93
|
+
<span class="confidence-bar" style:width="{clampedConfidence}%"></span>
|
|
94
|
+
{#if showPercent}
|
|
95
|
+
<span class="confidence-value" aria-hidden="true">{percentText}</span>
|
|
96
|
+
{/if}
|
|
97
|
+
</span>
|
|
98
|
+
|
|
99
|
+
<style>
|
|
100
|
+
.confidence-badge {
|
|
101
|
+
display: inline-flex;
|
|
102
|
+
align-items: center;
|
|
103
|
+
gap: 0.5rem;
|
|
104
|
+
padding: 0.25rem 0.5rem;
|
|
105
|
+
font-size: var(--smrt-typography-label-medium-size, 0.75rem);
|
|
106
|
+
font-weight: var(--smrt-typography-weight-medium, 500);
|
|
107
|
+
border-radius: var(--smrt-radius-sm, 4px);
|
|
108
|
+
background-color: var(--badge-bg);
|
|
109
|
+
color: var(--badge-text);
|
|
110
|
+
position: relative;
|
|
111
|
+
overflow: hidden;
|
|
112
|
+
min-width: 60px;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
.confidence-badge.sm {
|
|
116
|
+
padding: 0.125rem 0.375rem;
|
|
117
|
+
font-size: var(--smrt-typography-label-small-size, 0.625rem);
|
|
118
|
+
min-width: 48px;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
.confidence-badge.lg {
|
|
122
|
+
padding: 0.375rem 0.75rem;
|
|
123
|
+
font-size: var(--smrt-typography-label-large-size, 0.875rem);
|
|
124
|
+
min-width: 80px;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
.confidence-bar {
|
|
128
|
+
position: absolute;
|
|
129
|
+
left: 0;
|
|
130
|
+
top: 0;
|
|
131
|
+
bottom: 0;
|
|
132
|
+
background-color: var(--bar-color);
|
|
133
|
+
opacity: 0.3;
|
|
134
|
+
transition: width var(--smrt-duration-short4, 300ms) var(--smrt-easing-standard, ease);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
.confidence-value {
|
|
138
|
+
position: relative;
|
|
139
|
+
z-index: 1;
|
|
140
|
+
font-variant-numeric: tabular-nums;
|
|
141
|
+
}
|
|
142
|
+
</style>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ConfidenceBadge - Displays AI confidence level indicator
|
|
3
|
+
*
|
|
4
|
+
* Shows a visual indicator for confidence scores (0-100).
|
|
5
|
+
* Useful for OCR results, AI predictions, etc.
|
|
6
|
+
*
|
|
7
|
+
* Accessibility: Uses role="meter" with aria-valuenow for screen readers
|
|
8
|
+
*/
|
|
9
|
+
/** Props for ConfidenceBadge component */
|
|
10
|
+
export interface Props {
|
|
11
|
+
/** Confidence value (0-100) */
|
|
12
|
+
confidence: number;
|
|
13
|
+
/** Show percentage value */
|
|
14
|
+
showPercent?: boolean;
|
|
15
|
+
/** Size variant */
|
|
16
|
+
size?: 'sm' | 'md' | 'lg';
|
|
17
|
+
/** Optional CSS class */
|
|
18
|
+
class?: string;
|
|
19
|
+
/** Accessible label */
|
|
20
|
+
'aria-label'?: string;
|
|
21
|
+
}
|
|
22
|
+
declare const ConfidenceBadge: import("svelte").Component<Props, {}, "">;
|
|
23
|
+
type ConfidenceBadge = ReturnType<typeof ConfidenceBadge>;
|
|
24
|
+
export default ConfidenceBadge;
|
|
25
|
+
//# sourceMappingURL=ConfidenceBadge.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfidenceBadge.svelte.d.ts","sourceRoot":"","sources":["../../../src/components/display/ConfidenceBadge.svelte.ts"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AAEH,0CAA0C;AAC1C,MAAM,WAAW,KAAK;IACpB,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,4BAA4B;IAC5B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,mBAAmB;IACnB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,yBAAyB;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uBAAuB;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAqED,QAAA,MAAM,eAAe,2CAAwC,CAAC;AAC9D,KAAK,eAAe,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;AAC1D,eAAe,eAAe,CAAC"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
/**
|
|
3
|
+
* CurrencyDisplay - Formats and displays monetary values
|
|
4
|
+
*
|
|
5
|
+
* Displays formatted currency with configurable unit.
|
|
6
|
+
* Use `unit="cents"` (default) when amount is in cents, or `unit="dollars"` for dollar values.
|
|
7
|
+
* Supports CAD/USD with appropriate symbols and locale formatting.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/** Props for CurrencyDisplay component */
|
|
11
|
+
export interface Props {
|
|
12
|
+
/** Amount value */
|
|
13
|
+
amount: number;
|
|
14
|
+
/** Currency code */
|
|
15
|
+
currency?: 'CAD' | 'USD';
|
|
16
|
+
/** Whether amount is in cents or dollars (default: cents) */
|
|
17
|
+
unit?: 'cents' | 'dollars';
|
|
18
|
+
/** Show +/- sign for non-zero values */
|
|
19
|
+
showSign?: boolean;
|
|
20
|
+
/** Display size */
|
|
21
|
+
size?: 'sm' | 'md' | 'lg';
|
|
22
|
+
/** Highlight negative values in red */
|
|
23
|
+
highlightNegative?: boolean;
|
|
24
|
+
/** Highlight positive values in green */
|
|
25
|
+
highlightPositive?: boolean;
|
|
26
|
+
/** Optional CSS class */
|
|
27
|
+
class?: string;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const {
|
|
31
|
+
amount,
|
|
32
|
+
currency = 'CAD',
|
|
33
|
+
unit = 'cents',
|
|
34
|
+
showSign = false,
|
|
35
|
+
size = 'md',
|
|
36
|
+
highlightNegative = false,
|
|
37
|
+
highlightPositive = false,
|
|
38
|
+
class: className = '',
|
|
39
|
+
}: Props = $props();
|
|
40
|
+
|
|
41
|
+
// Format amount using Intl.NumberFormat
|
|
42
|
+
const formatted = $derived.by(() => {
|
|
43
|
+
const dollars = unit === 'cents' ? amount / 100 : amount;
|
|
44
|
+
const absValue = Math.abs(dollars);
|
|
45
|
+
|
|
46
|
+
const formatter = new Intl.NumberFormat('en-CA', {
|
|
47
|
+
style: 'currency',
|
|
48
|
+
currency,
|
|
49
|
+
minimumFractionDigits: 2,
|
|
50
|
+
maximumFractionDigits: 2,
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
let display = formatter.format(absValue);
|
|
54
|
+
|
|
55
|
+
// Add sign if requested
|
|
56
|
+
if (showSign && amount !== 0) {
|
|
57
|
+
const sign = amount > 0 ? '+' : '-';
|
|
58
|
+
display = sign + display;
|
|
59
|
+
} else if (amount < 0) {
|
|
60
|
+
display = `-${display}`;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return display;
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
// Determine color class
|
|
67
|
+
const colorClass = $derived.by(() => {
|
|
68
|
+
if (highlightNegative && amount < 0) return 'negative';
|
|
69
|
+
if (highlightPositive && amount > 0) return 'positive';
|
|
70
|
+
return '';
|
|
71
|
+
});
|
|
72
|
+
</script>
|
|
73
|
+
|
|
74
|
+
<span
|
|
75
|
+
class="currency-display {className}"
|
|
76
|
+
class:sm={size === 'sm'}
|
|
77
|
+
class:lg={size === 'lg'}
|
|
78
|
+
class:negative={colorClass === 'negative'}
|
|
79
|
+
class:positive={colorClass === 'positive'}
|
|
80
|
+
>
|
|
81
|
+
{formatted}
|
|
82
|
+
</span>
|
|
83
|
+
|
|
84
|
+
<style>
|
|
85
|
+
.currency-display {
|
|
86
|
+
font-variant-numeric: tabular-nums;
|
|
87
|
+
white-space: nowrap;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
.currency-display.sm {
|
|
91
|
+
font-size: var(--smrt-typography-body-medium-size, 0.875rem);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.currency-display.lg {
|
|
95
|
+
font-size: var(--smrt-typography-title-large-size, 1.25rem);
|
|
96
|
+
font-weight: var(--smrt-typography-title-large-weight, 600);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.currency-display.negative {
|
|
100
|
+
color: var(--smrt-color-error, #dc2626);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
.currency-display.positive {
|
|
104
|
+
color: var(--smrt-color-tertiary, #16a34a);
|
|
105
|
+
}
|
|
106
|
+
</style>
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CurrencyDisplay - Formats and displays monetary values
|
|
3
|
+
*
|
|
4
|
+
* Displays formatted currency with configurable unit.
|
|
5
|
+
* Use `unit="cents"` (default) when amount is in cents, or `unit="dollars"` for dollar values.
|
|
6
|
+
* Supports CAD/USD with appropriate symbols and locale formatting.
|
|
7
|
+
*/
|
|
8
|
+
/** Props for CurrencyDisplay component */
|
|
9
|
+
export interface Props {
|
|
10
|
+
/** Amount value */
|
|
11
|
+
amount: number;
|
|
12
|
+
/** Currency code */
|
|
13
|
+
currency?: 'CAD' | 'USD';
|
|
14
|
+
/** Whether amount is in cents or dollars (default: cents) */
|
|
15
|
+
unit?: 'cents' | 'dollars';
|
|
16
|
+
/** Show +/- sign for non-zero values */
|
|
17
|
+
showSign?: boolean;
|
|
18
|
+
/** Display size */
|
|
19
|
+
size?: 'sm' | 'md' | 'lg';
|
|
20
|
+
/** Highlight negative values in red */
|
|
21
|
+
highlightNegative?: boolean;
|
|
22
|
+
/** Highlight positive values in green */
|
|
23
|
+
highlightPositive?: boolean;
|
|
24
|
+
/** Optional CSS class */
|
|
25
|
+
class?: string;
|
|
26
|
+
}
|
|
27
|
+
declare const CurrencyDisplay: import("svelte").Component<Props, {}, "">;
|
|
28
|
+
type CurrencyDisplay = ReturnType<typeof CurrencyDisplay>;
|
|
29
|
+
export default CurrencyDisplay;
|
|
30
|
+
//# sourceMappingURL=CurrencyDisplay.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CurrencyDisplay.svelte.d.ts","sourceRoot":"","sources":["../../../src/components/display/CurrencyDisplay.svelte.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,WAAW,KAAK;IACpB,mBAAmB;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,oBAAoB;IACpB,QAAQ,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IACzB,6DAA6D;IAC7D,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC3B,wCAAwC;IACxC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mBAAmB;IACnB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,uCAAuC;IACvC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,yCAAyC;IACzC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,yBAAyB;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAwDD,QAAA,MAAM,eAAe,2CAAwC,CAAC;AAC9D,KAAK,eAAe,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;AAC1D,eAAe,eAAe,CAAC"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
/**
|
|
3
|
+
* DateDisplay - Formats and displays dates
|
|
4
|
+
*
|
|
5
|
+
* Supports various format options and relative time display.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/** Props for DateDisplay component */
|
|
9
|
+
export interface Props {
|
|
10
|
+
/** Date to display (Date, ISO string, or timestamp) */
|
|
11
|
+
date: Date | string | number | null | undefined;
|
|
12
|
+
/** Display format */
|
|
13
|
+
format?: 'short' | 'medium' | 'long' | 'relative';
|
|
14
|
+
/** Fallback text when date is null/undefined */
|
|
15
|
+
fallback?: string;
|
|
16
|
+
/** Show time along with date */
|
|
17
|
+
showTime?: boolean;
|
|
18
|
+
/** Locale for formatting (defaults to en-CA) */
|
|
19
|
+
locale?: string;
|
|
20
|
+
/** Optional CSS class */
|
|
21
|
+
class?: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const {
|
|
25
|
+
date,
|
|
26
|
+
format = 'medium',
|
|
27
|
+
fallback = 'N/A',
|
|
28
|
+
showTime = false,
|
|
29
|
+
locale = 'en-CA',
|
|
30
|
+
class: className = '',
|
|
31
|
+
}: Props = $props();
|
|
32
|
+
|
|
33
|
+
// Parse the date
|
|
34
|
+
const parsedDate = $derived.by(() => {
|
|
35
|
+
if (date === null || date === undefined) return null;
|
|
36
|
+
if (date instanceof Date) return date;
|
|
37
|
+
const d = new Date(date);
|
|
38
|
+
return Number.isNaN(d.getTime()) ? null : d;
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
// Format options for Intl.DateTimeFormat
|
|
42
|
+
const dateOptions: Record<string, Intl.DateTimeFormatOptions> = {
|
|
43
|
+
short: { month: 'short', day: 'numeric' },
|
|
44
|
+
medium: { year: 'numeric', month: 'short', day: 'numeric' },
|
|
45
|
+
long: { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' },
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
// Format relative time
|
|
49
|
+
function formatRelative(d: Date): string {
|
|
50
|
+
const now = new Date();
|
|
51
|
+
const diffMs = now.getTime() - d.getTime();
|
|
52
|
+
const diffSec = Math.floor(diffMs / 1000);
|
|
53
|
+
const diffMin = Math.floor(diffSec / 60);
|
|
54
|
+
const diffHours = Math.floor(diffMin / 60);
|
|
55
|
+
const diffDays = Math.floor(diffHours / 24);
|
|
56
|
+
const diffWeeks = Math.floor(diffDays / 7);
|
|
57
|
+
const diffMonths = Math.floor(diffDays / 30);
|
|
58
|
+
const diffYears = Math.floor(diffDays / 365);
|
|
59
|
+
|
|
60
|
+
// Future dates
|
|
61
|
+
if (diffMs < 0) {
|
|
62
|
+
const absDiffDays = Math.abs(diffDays);
|
|
63
|
+
if (absDiffDays === 0) return 'today';
|
|
64
|
+
if (absDiffDays === 1) return 'tomorrow';
|
|
65
|
+
if (absDiffDays < 7) return `in ${absDiffDays} days`;
|
|
66
|
+
if (absDiffDays < 30) return `in ${Math.abs(diffWeeks)} weeks`;
|
|
67
|
+
if (absDiffDays < 365) return `in ${Math.abs(diffMonths)} months`;
|
|
68
|
+
return `in ${Math.abs(diffYears)} years`;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Past dates
|
|
72
|
+
if (diffSec < 60) return 'just now';
|
|
73
|
+
if (diffMin < 60) return `${diffMin}m ago`;
|
|
74
|
+
if (diffHours < 24) return `${diffHours}h ago`;
|
|
75
|
+
if (diffDays === 1) return 'yesterday';
|
|
76
|
+
if (diffDays < 7) return `${diffDays} days ago`;
|
|
77
|
+
if (diffWeeks < 4) return `${diffWeeks} weeks ago`;
|
|
78
|
+
if (diffMonths < 12) return `${diffMonths} months ago`;
|
|
79
|
+
return `${diffYears} years ago`;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Format the date
|
|
83
|
+
const formatted = $derived.by(() => {
|
|
84
|
+
if (!parsedDate) return fallback;
|
|
85
|
+
|
|
86
|
+
if (format === 'relative') {
|
|
87
|
+
return formatRelative(parsedDate);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const options = { ...dateOptions[format] };
|
|
91
|
+
if (showTime) {
|
|
92
|
+
options.hour = 'numeric';
|
|
93
|
+
options.minute = '2-digit';
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
return new Intl.DateTimeFormat(locale, options).format(parsedDate);
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
// ISO string for datetime attribute
|
|
100
|
+
const isoString = $derived(parsedDate?.toISOString() ?? '');
|
|
101
|
+
</script>
|
|
102
|
+
|
|
103
|
+
{#if parsedDate}
|
|
104
|
+
<time class="date-display {className}" datetime={isoString}>
|
|
105
|
+
{formatted}
|
|
106
|
+
</time>
|
|
107
|
+
{:else}
|
|
108
|
+
<span class="date-display date-fallback {className}">
|
|
109
|
+
{fallback}
|
|
110
|
+
</span>
|
|
111
|
+
{/if}
|
|
112
|
+
|
|
113
|
+
<style>
|
|
114
|
+
.date-display {
|
|
115
|
+
white-space: nowrap;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
.date-fallback {
|
|
119
|
+
color: var(--smrt-color-on-surface-variant, #9ca3af);
|
|
120
|
+
font-style: italic;
|
|
121
|
+
}
|
|
122
|
+
</style>
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DateDisplay - Formats and displays dates
|
|
3
|
+
*
|
|
4
|
+
* Supports various format options and relative time display.
|
|
5
|
+
*/
|
|
6
|
+
/** Props for DateDisplay component */
|
|
7
|
+
export interface Props {
|
|
8
|
+
/** Date to display (Date, ISO string, or timestamp) */
|
|
9
|
+
date: Date | string | number | null | undefined;
|
|
10
|
+
/** Display format */
|
|
11
|
+
format?: 'short' | 'medium' | 'long' | 'relative';
|
|
12
|
+
/** Fallback text when date is null/undefined */
|
|
13
|
+
fallback?: string;
|
|
14
|
+
/** Show time along with date */
|
|
15
|
+
showTime?: boolean;
|
|
16
|
+
/** Locale for formatting (defaults to en-CA) */
|
|
17
|
+
locale?: string;
|
|
18
|
+
/** Optional CSS class */
|
|
19
|
+
class?: string;
|
|
20
|
+
}
|
|
21
|
+
declare const DateDisplay: import("svelte").Component<Props, {}, "">;
|
|
22
|
+
type DateDisplay = ReturnType<typeof DateDisplay>;
|
|
23
|
+
export default DateDisplay;
|
|
24
|
+
//# sourceMappingURL=DateDisplay.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DateDisplay.svelte.d.ts","sourceRoot":"","sources":["../../../src/components/display/DateDisplay.svelte.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AAEH,sCAAsC;AACtC,MAAM,WAAW,KAAK;IACpB,uDAAuD;IACvD,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAChD,qBAAqB;IACrB,MAAM,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;IAClD,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gCAAgC;IAChC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gDAAgD;IAChD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yBAAyB;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAiGD,QAAA,MAAM,WAAW,2CAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
|