@happyvertical/smrt-ui 0.38.26 → 0.39.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 +23 -7
- package/README.md +132 -0
- package/dist/components/data/CollectionList.svelte +106 -0
- package/dist/components/data/CollectionList.svelte.d.ts +49 -0
- package/dist/components/data/CollectionList.svelte.d.ts.map +1 -0
- package/dist/components/data/CollectionToolbar.svelte +72 -0
- package/dist/components/data/CollectionToolbar.svelte.d.ts +20 -0
- package/dist/components/data/CollectionToolbar.svelte.d.ts.map +1 -0
- package/dist/components/data/DataTable.svelte +107 -17
- package/dist/components/data/DataTable.svelte.d.ts +2 -2
- package/dist/components/data/DataTable.svelte.d.ts.map +1 -1
- package/dist/components/data/__tests__/DataTable.test.js +61 -1
- package/dist/components/data/index.d.ts +2 -0
- package/dist/components/data/index.d.ts.map +1 -1
- package/dist/components/data/index.js +2 -0
- package/dist/components/data/types.d.ts +33 -0
- package/dist/components/data/types.d.ts.map +1 -1
- package/dist/components/feedback/Alert.svelte +53 -0
- package/dist/components/feedback/Alert.svelte.d.ts +14 -0
- package/dist/components/feedback/Alert.svelte.d.ts.map +1 -0
- package/dist/components/feedback/Drawer.svelte +34 -0
- package/dist/components/feedback/Drawer.svelte.d.ts +18 -0
- package/dist/components/feedback/Drawer.svelte.d.ts.map +1 -0
- package/dist/components/feedback/Meter.svelte +33 -0
- package/dist/components/feedback/Meter.svelte.d.ts +16 -0
- package/dist/components/feedback/Meter.svelte.d.ts.map +1 -0
- package/dist/components/feedback/Modal.svelte +9 -5
- package/dist/components/feedback/Modal.svelte.d.ts +2 -2
- package/dist/components/feedback/Modal.svelte.d.ts.map +1 -1
- package/dist/components/feedback/Progress.svelte +61 -0
- package/dist/components/feedback/Progress.svelte.d.ts +14 -0
- package/dist/components/feedback/Progress.svelte.d.ts.map +1 -0
- package/dist/components/feedback/Spinner.svelte +17 -0
- package/dist/components/feedback/Spinner.svelte.d.ts +9 -0
- package/dist/components/feedback/Spinner.svelte.d.ts.map +1 -0
- package/dist/components/feedback/ToastViewport.svelte +48 -0
- package/dist/components/feedback/ToastViewport.svelte.d.ts +10 -0
- package/dist/components/feedback/ToastViewport.svelte.d.ts.map +1 -0
- package/dist/components/feedback/__tests__/toast.test.js +49 -0
- package/dist/components/feedback/index.d.ts +8 -0
- package/dist/components/feedback/index.d.ts.map +1 -1
- package/dist/components/feedback/index.js +10 -3
- package/dist/components/feedback/toast.d.ts +28 -0
- package/dist/components/feedback/toast.d.ts.map +1 -0
- package/dist/components/feedback/toast.js +58 -0
- package/dist/components/forms/Checkbox.svelte +149 -0
- package/dist/components/forms/Checkbox.svelte.d.ts +13 -0
- package/dist/components/forms/Checkbox.svelte.d.ts.map +1 -0
- package/dist/components/forms/Combobox.svelte +172 -0
- package/dist/components/forms/Combobox.svelte.d.ts +18 -0
- package/dist/components/forms/Combobox.svelte.d.ts.map +1 -0
- package/dist/components/forms/DatePicker.svelte +25 -0
- package/dist/components/forms/DatePicker.svelte.d.ts +12 -0
- package/dist/components/forms/DatePicker.svelte.d.ts.map +1 -0
- package/dist/components/forms/ErrorSummary.svelte +32 -0
- package/dist/components/forms/ErrorSummary.svelte.d.ts +11 -0
- package/dist/components/forms/ErrorSummary.svelte.d.ts.map +1 -0
- package/dist/components/forms/Fieldset.svelte +32 -0
- package/dist/components/forms/Fieldset.svelte.d.ts +13 -0
- package/dist/components/forms/Fieldset.svelte.d.ts.map +1 -0
- package/dist/components/forms/FilePicker.svelte +116 -0
- package/dist/components/forms/FilePicker.svelte.d.ts +19 -0
- package/dist/components/forms/FilePicker.svelte.d.ts.map +1 -0
- package/dist/components/forms/Form.svelte +55 -2
- package/dist/components/forms/Form.svelte.d.ts +11 -1
- package/dist/components/forms/Form.svelte.d.ts.map +1 -1
- package/dist/components/forms/FormGroup.svelte +19 -2
- package/dist/components/forms/FormGroup.svelte.d.ts +3 -0
- package/dist/components/forms/FormGroup.svelte.d.ts.map +1 -1
- package/dist/components/forms/Input.svelte +127 -0
- package/dist/components/forms/Input.svelte.d.ts +9 -1
- package/dist/components/forms/Input.svelte.d.ts.map +1 -1
- package/dist/components/forms/InputGroup.svelte +17 -0
- package/dist/components/forms/InputGroup.svelte.d.ts +11 -0
- package/dist/components/forms/InputGroup.svelte.d.ts.map +1 -0
- package/dist/components/forms/Listbox.svelte +97 -0
- package/dist/components/forms/Listbox.svelte.d.ts +15 -0
- package/dist/components/forms/Listbox.svelte.d.ts.map +1 -0
- package/dist/components/forms/MultiSelect.svelte +159 -0
- package/dist/components/forms/MultiSelect.svelte.d.ts +16 -0
- package/dist/components/forms/MultiSelect.svelte.d.ts.map +1 -0
- package/dist/components/forms/Radio.svelte +34 -0
- package/dist/components/forms/Radio.svelte.d.ts +10 -0
- package/dist/components/forms/Radio.svelte.d.ts.map +1 -0
- package/dist/components/forms/RadioGroup.svelte +130 -0
- package/dist/components/forms/RadioGroup.svelte.d.ts +19 -0
- package/dist/components/forms/RadioGroup.svelte.d.ts.map +1 -0
- package/dist/components/forms/RangeSlider.svelte +137 -0
- package/dist/components/forms/RangeSlider.svelte.d.ts +21 -0
- package/dist/components/forms/RangeSlider.svelte.d.ts.map +1 -0
- package/dist/components/forms/SegmentedControl.svelte +87 -0
- package/dist/components/forms/SegmentedControl.svelte.d.ts +17 -0
- package/dist/components/forms/SegmentedControl.svelte.d.ts.map +1 -0
- package/dist/components/forms/Select.svelte +84 -3
- package/dist/components/forms/Select.svelte.d.ts +6 -1
- package/dist/components/forms/Select.svelte.d.ts.map +1 -1
- package/dist/components/forms/Slider.svelte +131 -0
- package/dist/components/forms/Slider.svelte.d.ts +18 -0
- package/dist/components/forms/Slider.svelte.d.ts.map +1 -0
- package/dist/components/forms/Switch.svelte +128 -0
- package/dist/components/forms/Switch.svelte.d.ts +14 -0
- package/dist/components/forms/Switch.svelte.d.ts.map +1 -0
- package/dist/components/forms/TagsInput.svelte +106 -0
- package/dist/components/forms/TagsInput.svelte.d.ts +17 -0
- package/dist/components/forms/TagsInput.svelte.d.ts.map +1 -0
- package/dist/components/forms/Textarea.svelte +84 -3
- package/dist/components/forms/Textarea.svelte.d.ts +6 -1
- package/dist/components/forms/Textarea.svelte.d.ts.map +1 -1
- package/dist/components/forms/TimePicker.svelte +25 -0
- package/dist/components/forms/TimePicker.svelte.d.ts +12 -0
- package/dist/components/forms/TimePicker.svelte.d.ts.map +1 -0
- package/dist/components/forms/ToggleButton.svelte +79 -0
- package/dist/components/forms/ToggleButton.svelte.d.ts +13 -0
- package/dist/components/forms/ToggleButton.svelte.d.ts.map +1 -0
- package/dist/components/forms/__tests__/composite-controls.fixture.svelte +29 -0
- package/dist/components/forms/__tests__/composite-controls.fixture.svelte.d.ts +8 -0
- package/dist/components/forms/__tests__/composite-controls.fixture.svelte.d.ts.map +1 -0
- package/dist/components/forms/__tests__/composite-controls.test.js +33 -0
- package/dist/components/forms/__tests__/control-interaction.test.js +95 -0
- package/dist/components/forms/__tests__/core-controls.fixture.svelte +39 -0
- package/dist/components/forms/__tests__/core-controls.fixture.svelte.d.ts +8 -0
- package/dist/components/forms/__tests__/core-controls.fixture.svelte.d.ts.map +1 -0
- package/dist/components/forms/__tests__/core-controls.test.js +90 -0
- package/dist/components/forms/control-dom.d.ts +6 -0
- package/dist/components/forms/control-dom.d.ts.map +1 -0
- package/dist/components/forms/control-dom.js +38 -0
- package/dist/components/forms/control-interaction-context.d.ts +9 -0
- package/dist/components/forms/control-interaction-context.d.ts.map +1 -0
- package/dist/components/forms/control-interaction-context.js +15 -0
- package/dist/components/forms/control-interaction.d.ts +147 -0
- package/dist/components/forms/control-interaction.d.ts.map +1 -0
- package/dist/components/forms/control-interaction.js +265 -0
- package/dist/components/forms/form-group-context.d.ts +7 -0
- package/dist/components/forms/form-group-context.d.ts.map +1 -1
- package/dist/components/forms/index.d.ts +22 -1
- package/dist/components/forms/index.d.ts.map +1 -1
- package/dist/components/forms/index.js +21 -1
- package/dist/components/forms/radio-group-context.d.ts +12 -0
- package/dist/components/forms/radio-group-context.d.ts.map +1 -0
- package/dist/components/forms/radio-group-context.js +11 -0
- package/dist/components/forms/types.d.ts +14 -0
- package/dist/components/forms/types.d.ts.map +1 -0
- package/dist/components/forms/types.js +1 -0
- package/dist/components/forms/use-control-registration.svelte.d.ts +8 -0
- package/dist/components/forms/use-control-registration.svelte.d.ts.map +1 -0
- package/dist/components/forms/use-control-registration.svelte.js +15 -0
- package/dist/components/ui/Accordion.svelte +44 -0
- package/dist/components/ui/Accordion.svelte.d.ts +12 -0
- package/dist/components/ui/Accordion.svelte.d.ts.map +1 -0
- package/dist/components/ui/AccordionItem.svelte +42 -0
- package/dist/components/ui/AccordionItem.svelte.d.ts +11 -0
- package/dist/components/ui/AccordionItem.svelte.d.ts.map +1 -0
- package/dist/components/ui/Disclosure.svelte +50 -0
- package/dist/components/ui/Disclosure.svelte.d.ts +13 -0
- package/dist/components/ui/Disclosure.svelte.d.ts.map +1 -0
- package/dist/components/ui/Dropdown.svelte +5 -7
- package/dist/components/ui/Dropdown.svelte.d.ts +9 -0
- package/dist/components/ui/Dropdown.svelte.d.ts.map +1 -1
- package/dist/components/ui/Popover.svelte +102 -0
- package/dist/components/ui/Popover.svelte.d.ts +16 -0
- package/dist/components/ui/Popover.svelte.d.ts.map +1 -0
- package/dist/components/ui/__tests__/interaction-primitives.fixture.svelte +13 -0
- package/dist/components/ui/__tests__/interaction-primitives.fixture.svelte.d.ts +19 -0
- package/dist/components/ui/__tests__/interaction-primitives.fixture.svelte.d.ts.map +1 -0
- package/dist/components/ui/__tests__/interaction-primitives.test.js +31 -0
- package/dist/components/ui/accordion-context.d.ts +7 -0
- package/dist/components/ui/accordion-context.d.ts.map +1 -0
- package/dist/components/ui/accordion-context.js +11 -0
- package/dist/components/ui/index.d.ts +5 -1
- package/dist/components/ui/index.d.ts.map +1 -1
- package/dist/components/ui/index.js +5 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/playground.d.ts +2 -0
- package/dist/playground.d.ts.map +1 -0
- package/dist/playground.js +1 -0
- package/dist/svelte/__tests__/playground.test.js +18 -0
- package/dist/svelte/playground/BaseControlsPreview.svelte +233 -0
- package/dist/svelte/playground/BaseControlsPreview.svelte.d.ts +4 -0
- package/dist/svelte/playground/BaseControlsPreview.svelte.d.ts.map +1 -0
- package/dist/svelte/playground/CollectionsPreview.svelte +59 -0
- package/dist/svelte/playground/CollectionsPreview.svelte.d.ts +4 -0
- package/dist/svelte/playground/CollectionsPreview.svelte.d.ts.map +1 -0
- package/dist/svelte/playground/DataTablePreview.svelte +247 -0
- package/dist/svelte/playground/DataTablePreview.svelte.d.ts +4 -0
- package/dist/svelte/playground/DataTablePreview.svelte.d.ts.map +1 -0
- package/dist/svelte/playground/FeedbackPreview.svelte +51 -0
- package/dist/svelte/playground/FeedbackPreview.svelte.d.ts +4 -0
- package/dist/svelte/playground/FeedbackPreview.svelte.d.ts.map +1 -0
- package/dist/svelte/playground/InteractiveControlsPreview.svelte +109 -0
- package/dist/svelte/playground/InteractiveControlsPreview.svelte.d.ts +4 -0
- package/dist/svelte/playground/InteractiveControlsPreview.svelte.d.ts.map +1 -0
- package/dist/svelte/playground.d.ts +20 -0
- package/dist/svelte/playground.d.ts.map +1 -0
- package/dist/svelte/playground.js +65 -0
- package/dist/theme/index.d.ts +6 -4
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/index.js +6 -7
- package/dist/themes/context.svelte.js +1 -1
- package/dist/themes/index.d.ts +1 -1
- package/dist/themes/index.js +1 -1
- package/dist/themes/smrt/index.js +1 -1
- package/dist/types-generic.d.ts +7 -1
- package/dist/types-generic.d.ts.map +1 -1
- package/package.json +23 -12
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import CollectionList from '../../components/data/CollectionList.svelte';
|
|
3
|
+
import CollectionToolbar from '../../components/data/CollectionToolbar.svelte';
|
|
4
|
+
import Button from '../../components/ui/Button.svelte';
|
|
5
|
+
|
|
6
|
+
interface Article {
|
|
7
|
+
id: string;
|
|
8
|
+
title: string;
|
|
9
|
+
description: string;
|
|
10
|
+
status: string;
|
|
11
|
+
}
|
|
12
|
+
const articles: Article[] = [
|
|
13
|
+
{
|
|
14
|
+
id: 'one',
|
|
15
|
+
title: 'Agent-ready form controls',
|
|
16
|
+
description: 'Stable identity and consent-aware updates.',
|
|
17
|
+
status: 'Published',
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
id: 'two',
|
|
21
|
+
title: 'A complete interaction layer',
|
|
22
|
+
description: 'Overlays, progress, menus, and disclosure.',
|
|
23
|
+
status: 'Draft',
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
id: 'three',
|
|
27
|
+
title: 'Collection patterns',
|
|
28
|
+
description: 'Lists and grids without application-specific markup.',
|
|
29
|
+
status: 'Review',
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
let search = $state('');
|
|
33
|
+
let view = $state<'list' | 'grid' | 'table'>('list');
|
|
34
|
+
let selected = $state<Set<string | number>>(new Set());
|
|
35
|
+
const filtered = $derived(
|
|
36
|
+
articles.filter((article) =>
|
|
37
|
+
article.title.toLowerCase().includes(search.toLowerCase()),
|
|
38
|
+
),
|
|
39
|
+
);
|
|
40
|
+
</script>
|
|
41
|
+
|
|
42
|
+
<div class="workbench">
|
|
43
|
+
<header><p class="eyebrow">Reusable content pattern</p><h4>Collection list and toolbar</h4><p>Search, switch between list and grid views, select items, and use item actions across empty and loading states.</p></header>
|
|
44
|
+
<CollectionToolbar bind:search bind:view resultCount={filtered.length} selectedCount={selected.size} onsearchchange={(value) => search = value}>
|
|
45
|
+
{#snippet actions()}<Button size="sm">New article</Button>{/snippet}
|
|
46
|
+
{#snippet bulkActions()}<Button size="sm" variant="ghost" onclick={() => selected = new Set()}>Clear</Button>{/snippet}
|
|
47
|
+
</CollectionToolbar>
|
|
48
|
+
<CollectionList items={filtered} itemKey="id" title="title" description="description" layout={view === 'grid' ? 'grid' : 'list'} selectable bind:selected>
|
|
49
|
+
{#snippet actions({ item })}<span class="status">{item.status}</span><Button size="sm" variant="ghost">Open</Button>{/snippet}
|
|
50
|
+
{#snippet empty()}<div><strong>No matching content</strong><p>Try a broader search.</p></div>{/snippet}
|
|
51
|
+
</CollectionList>
|
|
52
|
+
</div>
|
|
53
|
+
|
|
54
|
+
<style>
|
|
55
|
+
.workbench { display: grid; gap: var(--smrt-spacing-4); color: var(--smrt-color-on-surface); }
|
|
56
|
+
header { padding-bottom: var(--smrt-spacing-4); border-bottom: 1px solid var(--smrt-color-outline-variant); } h4, p { margin: 0; } h4 { font: var(--smrt-typography-headline-small-font); } header > p:last-child { max-width: 48rem; margin-top: var(--smrt-spacing-1); color: var(--smrt-color-on-surface-variant); }
|
|
57
|
+
.eyebrow { color: var(--smrt-color-primary); font: var(--smrt-typography-label-small-font); letter-spacing: .1em; text-transform: uppercase; }
|
|
58
|
+
.status { padding: var(--smrt-spacing-1) var(--smrt-spacing-2); border-radius: var(--smrt-radius-full); background: var(--smrt-color-secondary-container); color: var(--smrt-color-on-secondary-container); font: var(--smrt-typography-label-small-font); }
|
|
59
|
+
</style>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CollectionsPreview.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/playground/CollectionsPreview.svelte.ts"],"names":[],"mappings":"AAgEA,QAAA,MAAM,kBAAkB,2DAAwC,CAAC;AACjE,KAAK,kBAAkB,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAChE,eAAe,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import DataTable from '../../components/data/DataTable.svelte';
|
|
3
|
+
import type {
|
|
4
|
+
DataTableColumn,
|
|
5
|
+
SortState,
|
|
6
|
+
} from '../../components/data/types.js';
|
|
7
|
+
import Toggle from '../../components/forms/Toggle.svelte';
|
|
8
|
+
import Badge from '../../components/ui/Badge.svelte';
|
|
9
|
+
import Button from '../../components/ui/Button.svelte';
|
|
10
|
+
|
|
11
|
+
interface WorkspaceUser {
|
|
12
|
+
id: string;
|
|
13
|
+
name: string;
|
|
14
|
+
email: string;
|
|
15
|
+
role: string;
|
|
16
|
+
status: string;
|
|
17
|
+
lastSeen: string;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const users: WorkspaceUser[] = [
|
|
21
|
+
{
|
|
22
|
+
id: 'user-ada',
|
|
23
|
+
name: 'Ada Lovelace',
|
|
24
|
+
email: 'ada@example.com',
|
|
25
|
+
role: 'Admin',
|
|
26
|
+
status: 'Active',
|
|
27
|
+
lastSeen: '2 min ago',
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
id: 'user-grace',
|
|
31
|
+
name: 'Grace Hopper',
|
|
32
|
+
email: 'grace@example.com',
|
|
33
|
+
role: 'Editor',
|
|
34
|
+
status: 'Active',
|
|
35
|
+
lastSeen: '18 min ago',
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
id: 'user-alan',
|
|
39
|
+
name: 'Alan Turing',
|
|
40
|
+
email: 'alan@example.com',
|
|
41
|
+
role: 'Viewer',
|
|
42
|
+
status: 'Pending',
|
|
43
|
+
lastSeen: 'Yesterday',
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
id: 'user-margaret',
|
|
47
|
+
name: 'Margaret Hamilton',
|
|
48
|
+
email: 'margaret@example.com',
|
|
49
|
+
role: 'Editor',
|
|
50
|
+
status: 'Active',
|
|
51
|
+
lastSeen: 'Yesterday',
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
id: 'user-katherine',
|
|
55
|
+
name: 'Katherine Johnson',
|
|
56
|
+
email: 'katherine@example.com',
|
|
57
|
+
role: 'Viewer',
|
|
58
|
+
status: 'Inactive',
|
|
59
|
+
lastSeen: '4 days ago',
|
|
60
|
+
},
|
|
61
|
+
];
|
|
62
|
+
|
|
63
|
+
const columns: DataTableColumn<WorkspaceUser>[] = [
|
|
64
|
+
{ id: 'name', label: 'Name', sortable: true, minWidth: '10rem' },
|
|
65
|
+
{ id: 'email', label: 'Email', sortable: true, minWidth: '13rem' },
|
|
66
|
+
{ id: 'role', label: 'Role', sortable: true },
|
|
67
|
+
{ id: 'status', label: 'Status', sortable: true },
|
|
68
|
+
{ id: 'lastSeen', label: 'Last seen', sortable: true, align: 'right' },
|
|
69
|
+
];
|
|
70
|
+
|
|
71
|
+
let selected = $state<Set<string | number>>(new Set());
|
|
72
|
+
let sort = $state<SortState>({ columnId: null, direction: null });
|
|
73
|
+
let loading = $state(false);
|
|
74
|
+
let dense = $state(false);
|
|
75
|
+
|
|
76
|
+
function clearSelection() {
|
|
77
|
+
selected = new Set();
|
|
78
|
+
}
|
|
79
|
+
</script>
|
|
80
|
+
|
|
81
|
+
<div class="workbench">
|
|
82
|
+
<div class="workbench__header">
|
|
83
|
+
<div>
|
|
84
|
+
<p class="eyebrow">Interactive data</p>
|
|
85
|
+
<h4>Workspace users</h4>
|
|
86
|
+
<p class="supporting">
|
|
87
|
+
Sort columns, select rows, and toggle the loading or dense states.
|
|
88
|
+
</p>
|
|
89
|
+
</div>
|
|
90
|
+
<div class="summary" aria-live="polite">
|
|
91
|
+
<Badge variant={selected.size > 0 ? 'primary' : 'default'}>
|
|
92
|
+
{selected.size} selected
|
|
93
|
+
</Badge>
|
|
94
|
+
<Button
|
|
95
|
+
variant="ghost"
|
|
96
|
+
size="sm"
|
|
97
|
+
disabled={selected.size === 0}
|
|
98
|
+
onclick={clearSelection}
|
|
99
|
+
>
|
|
100
|
+
Clear
|
|
101
|
+
</Button>
|
|
102
|
+
</div>
|
|
103
|
+
</div>
|
|
104
|
+
|
|
105
|
+
<div class="table-controls" aria-label="Table display controls">
|
|
106
|
+
<Toggle label="Dense rows" size="sm" bind:checked={dense} />
|
|
107
|
+
<Toggle label="Loading state" size="sm" bind:checked={loading} />
|
|
108
|
+
<span>
|
|
109
|
+
Sort: {sort.columnId ? `${sort.columnId} ${sort.direction}` : 'none'}
|
|
110
|
+
</span>
|
|
111
|
+
</div>
|
|
112
|
+
|
|
113
|
+
<div class="table-frame">
|
|
114
|
+
<DataTable
|
|
115
|
+
data={users}
|
|
116
|
+
{columns}
|
|
117
|
+
rowKey="id"
|
|
118
|
+
selectable
|
|
119
|
+
sortable
|
|
120
|
+
striped
|
|
121
|
+
hoverable
|
|
122
|
+
stickyHeader
|
|
123
|
+
{loading}
|
|
124
|
+
{dense}
|
|
125
|
+
bind:selected
|
|
126
|
+
bind:sort
|
|
127
|
+
caption="Workspace users"
|
|
128
|
+
/>
|
|
129
|
+
</div>
|
|
130
|
+
|
|
131
|
+
<div class="empty-state">
|
|
132
|
+
<div>
|
|
133
|
+
<strong>Empty state</strong>
|
|
134
|
+
<span>The same columns with no records.</span>
|
|
135
|
+
</div>
|
|
136
|
+
<div class="table-frame">
|
|
137
|
+
<DataTable
|
|
138
|
+
data={[]}
|
|
139
|
+
columns={columns.slice(0, 3)}
|
|
140
|
+
rowKey="id"
|
|
141
|
+
dense
|
|
142
|
+
caption="Empty workspace users"
|
|
143
|
+
/>
|
|
144
|
+
</div>
|
|
145
|
+
</div>
|
|
146
|
+
</div>
|
|
147
|
+
|
|
148
|
+
<style>
|
|
149
|
+
.workbench {
|
|
150
|
+
display: grid;
|
|
151
|
+
gap: var(--smrt-spacing-5);
|
|
152
|
+
color: var(--smrt-color-on-surface);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
.workbench__header,
|
|
156
|
+
.summary,
|
|
157
|
+
.table-controls,
|
|
158
|
+
.empty-state > div:first-child {
|
|
159
|
+
display: flex;
|
|
160
|
+
align-items: center;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
.workbench__header {
|
|
164
|
+
justify-content: space-between;
|
|
165
|
+
gap: var(--smrt-spacing-4);
|
|
166
|
+
padding-bottom: var(--smrt-spacing-4);
|
|
167
|
+
border-bottom: 1px solid var(--smrt-color-outline-variant);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
h4,
|
|
171
|
+
p {
|
|
172
|
+
margin: 0;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
h4 {
|
|
176
|
+
font: var(--smrt-typography-headline-small-font);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
.eyebrow {
|
|
180
|
+
margin-bottom: var(--smrt-spacing-1);
|
|
181
|
+
color: var(--smrt-color-primary);
|
|
182
|
+
font: var(--smrt-typography-label-small-font);
|
|
183
|
+
letter-spacing: 0.1em;
|
|
184
|
+
text-transform: uppercase;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
.supporting {
|
|
188
|
+
margin-top: var(--smrt-spacing-1);
|
|
189
|
+
color: var(--smrt-color-on-surface-variant);
|
|
190
|
+
font: var(--smrt-typography-body-medium-font);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
.summary,
|
|
194
|
+
.table-controls {
|
|
195
|
+
flex-wrap: wrap;
|
|
196
|
+
gap: var(--smrt-spacing-3);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
.table-controls {
|
|
200
|
+
padding: var(--smrt-spacing-3) var(--smrt-spacing-4);
|
|
201
|
+
border-radius: var(--smrt-radius-medium);
|
|
202
|
+
background: var(--smrt-color-surface-container-low);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
.table-controls > span {
|
|
206
|
+
margin-left: auto;
|
|
207
|
+
color: var(--smrt-color-on-surface-variant);
|
|
208
|
+
font: var(--smrt-typography-body-small-font);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
.table-frame {
|
|
212
|
+
overflow: auto;
|
|
213
|
+
max-width: 100%;
|
|
214
|
+
border: 1px solid var(--smrt-color-outline-variant);
|
|
215
|
+
border-radius: var(--smrt-radius-medium);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
.empty-state {
|
|
219
|
+
display: grid;
|
|
220
|
+
gap: var(--smrt-spacing-3);
|
|
221
|
+
padding-top: var(--smrt-spacing-4);
|
|
222
|
+
border-top: 1px solid var(--smrt-color-outline-variant);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
.empty-state > div:first-child {
|
|
226
|
+
justify-content: space-between;
|
|
227
|
+
gap: var(--smrt-spacing-4);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
.empty-state span {
|
|
231
|
+
color: var(--smrt-color-on-surface-variant);
|
|
232
|
+
font: var(--smrt-typography-body-small-font);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
@media (max-width: 760px) {
|
|
236
|
+
.workbench__header,
|
|
237
|
+
.empty-state > div:first-child {
|
|
238
|
+
align-items: flex-start;
|
|
239
|
+
flex-direction: column;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
.table-controls > span {
|
|
243
|
+
width: 100%;
|
|
244
|
+
margin-left: 0;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
</style>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataTablePreview.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/playground/DataTablePreview.svelte.ts"],"names":[],"mappings":"AAuIA,QAAA,MAAM,gBAAgB,2DAAwC,CAAC;AAC/D,KAAK,gBAAgB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC5D,eAAe,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import Alert from '../../components/feedback/Alert.svelte';
|
|
3
|
+
import Drawer from '../../components/feedback/Drawer.svelte';
|
|
4
|
+
import Meter from '../../components/feedback/Meter.svelte';
|
|
5
|
+
import Progress from '../../components/feedback/Progress.svelte';
|
|
6
|
+
import Spinner from '../../components/feedback/Spinner.svelte';
|
|
7
|
+
import ToastViewport from '../../components/feedback/ToastViewport.svelte';
|
|
8
|
+
import { createToaster } from '../../components/feedback/toast.js';
|
|
9
|
+
import Accordion from '../../components/ui/Accordion.svelte';
|
|
10
|
+
import AccordionItem from '../../components/ui/AccordionItem.svelte';
|
|
11
|
+
import Button from '../../components/ui/Button.svelte';
|
|
12
|
+
import Disclosure from '../../components/ui/Disclosure.svelte';
|
|
13
|
+
import Dropdown from '../../components/ui/Dropdown.svelte';
|
|
14
|
+
import Popover from '../../components/ui/Popover.svelte';
|
|
15
|
+
|
|
16
|
+
const toaster = createToaster();
|
|
17
|
+
let progress = $state(42);
|
|
18
|
+
let drawerOpen = $state(false);
|
|
19
|
+
const menu = [
|
|
20
|
+
{ id: 'edit', label: 'Edit' },
|
|
21
|
+
{ id: 'duplicate', label: 'Duplicate' },
|
|
22
|
+
{ id: 'archive', label: 'Archive' },
|
|
23
|
+
];
|
|
24
|
+
</script>
|
|
25
|
+
|
|
26
|
+
<div class="workbench">
|
|
27
|
+
<header><div><p class="eyebrow">Feedback and disclosure</p><h4>Status, progress, overlays, and layered interaction</h4></div><div class="actions"><Button size="sm" onclick={() => toaster.success('Settings saved', { duration: 0 })}>Show toast</Button><Button size="sm" variant="secondary" onclick={() => drawerOpen = true}>Open drawer</Button></div></header>
|
|
28
|
+
|
|
29
|
+
<section><h5>Alerts</h5><div class="stack"><Alert title="Information">The index will refresh in the background.</Alert><Alert variant="success" title="Published">Your changes are live.</Alert><Alert variant="warning" title="Review needed">Two fields use inherited defaults.</Alert><Alert variant="error" title="Connection lost" dismissible>Reconnect before submitting.</Alert></div></section>
|
|
30
|
+
|
|
31
|
+
<section><h5>Progress and measurement</h5><div class="progress-grid"><div><span>Determinate</span><Progress label="Upload progress" value={progress} showValue /></div><div><span>Indeterminate</span><Progress label="Preparing files" /></div><div><span>Circular</span><Progress label="Analysis progress" value={68} variant="circular" showValue /></div><div><span>Meter</span><Meter label="Storage used" value={72} low={45} high={80} optimum={25} showValue /></div><Spinner label="Synchronizing" /></div></section>
|
|
32
|
+
|
|
33
|
+
<section><h5>Layered interaction</h5><div class="interaction-row"><Popover label="Filter options"><strong>Quick filters</strong><p>Use a popover for lightweight contextual controls.</p></Popover><Dropdown label="Actions" items={menu} /><Disclosure title="Disclosure details"><p>Native details semantics for independent content.</p></Disclosure></div><Accordion><AccordionItem value="behavior" title="Behavior"><p>Single-open accordion by default.</p></AccordionItem><AccordionItem value="accessibility" title="Accessibility"><p>Keyboard controls, labelled regions, and reduced-motion support.</p></AccordionItem></Accordion></section>
|
|
34
|
+
|
|
35
|
+
<div class="slider"><label for="progress-demo">Progress value <output>{progress}%</output></label><input id="progress-demo" type="range" min="0" max="100" bind:value={progress} /></div>
|
|
36
|
+
<ToastViewport {toaster} />
|
|
37
|
+
<Drawer bind:open={drawerOpen} title="Workspace details"><p>Drawers share the modal focus and dismissal contract.</p>{#snippet footer()}<Button onclick={() => drawerOpen = false}>Done</Button>{/snippet}</Drawer>
|
|
38
|
+
</div>
|
|
39
|
+
|
|
40
|
+
<style>
|
|
41
|
+
.workbench { display: grid; gap: var(--smrt-spacing-6); color: var(--smrt-color-on-surface); }
|
|
42
|
+
header, .actions, .interaction-row { display: flex; align-items: center; gap: var(--smrt-spacing-3); } header { justify-content: space-between; padding-bottom: var(--smrt-spacing-4); border-bottom: 1px solid var(--smrt-color-outline-variant); }
|
|
43
|
+
h4, h5, p { margin: 0; } h4 { font: var(--smrt-typography-headline-small-font); } h5 { margin-bottom: var(--smrt-spacing-3); font: var(--smrt-typography-title-medium-font); }
|
|
44
|
+
.eyebrow { color: var(--smrt-color-primary); font: var(--smrt-typography-label-small-font); letter-spacing: .1em; text-transform: uppercase; }
|
|
45
|
+
.stack { display: grid; gap: var(--smrt-spacing-2); }
|
|
46
|
+
.progress-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--smrt-spacing-5); align-items: center; }
|
|
47
|
+
.progress-grid > div { display: grid; gap: var(--smrt-spacing-2); } .progress-grid span, .slider label { color: var(--smrt-color-on-surface-variant); font: var(--smrt-typography-label-medium-font); }
|
|
48
|
+
.interaction-row { flex-wrap: wrap; align-items: flex-start; margin-bottom: var(--smrt-spacing-3); }
|
|
49
|
+
.slider { display: grid; max-width: 24rem; gap: var(--smrt-spacing-2); } .slider label { display: flex; justify-content: space-between; } input { accent-color: var(--smrt-color-primary); }
|
|
50
|
+
@media (max-width: 760px) { header { align-items: flex-start; flex-direction: column; } .progress-grid { grid-template-columns: 1fr; } }
|
|
51
|
+
</style>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FeedbackPreview.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/playground/FeedbackPreview.svelte.ts"],"names":[],"mappings":"AA4DA,QAAA,MAAM,eAAe,2DAAwC,CAAC;AAC9D,KAAK,eAAe,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;AAC1D,eAAe,eAAe,CAAC"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import Checkbox from '../../components/forms/Checkbox.svelte';
|
|
3
|
+
import Combobox from '../../components/forms/Combobox.svelte';
|
|
4
|
+
import {
|
|
5
|
+
type ControlCommand,
|
|
6
|
+
createControlInteractionRegistry,
|
|
7
|
+
} from '../../components/forms/control-interaction.js';
|
|
8
|
+
import DatePicker from '../../components/forms/DatePicker.svelte';
|
|
9
|
+
import FilePicker from '../../components/forms/FilePicker.svelte';
|
|
10
|
+
import Form from '../../components/forms/Form.svelte';
|
|
11
|
+
import Listbox from '../../components/forms/Listbox.svelte';
|
|
12
|
+
import MultiSelect from '../../components/forms/MultiSelect.svelte';
|
|
13
|
+
import Radio from '../../components/forms/Radio.svelte';
|
|
14
|
+
import RadioGroup from '../../components/forms/RadioGroup.svelte';
|
|
15
|
+
import RangeSlider from '../../components/forms/RangeSlider.svelte';
|
|
16
|
+
import SegmentedControl from '../../components/forms/SegmentedControl.svelte';
|
|
17
|
+
import Slider from '../../components/forms/Slider.svelte';
|
|
18
|
+
import Switch from '../../components/forms/Switch.svelte';
|
|
19
|
+
import TagsInput from '../../components/forms/TagsInput.svelte';
|
|
20
|
+
import TimePicker from '../../components/forms/TimePicker.svelte';
|
|
21
|
+
import ToggleButton from '../../components/forms/ToggleButton.svelte';
|
|
22
|
+
import Button from '../../components/ui/Button.svelte';
|
|
23
|
+
|
|
24
|
+
const registry = createControlInteractionRegistry();
|
|
25
|
+
const countries = [
|
|
26
|
+
{ value: 'ca', label: 'Canada' },
|
|
27
|
+
{ value: 'us', label: 'United States' },
|
|
28
|
+
{ value: 'mx', label: 'Mexico' },
|
|
29
|
+
];
|
|
30
|
+
let accepted = $state(true);
|
|
31
|
+
let notifications = $state(true);
|
|
32
|
+
let pinned = $state(false);
|
|
33
|
+
let role = $state('editor');
|
|
34
|
+
let volume = $state(35);
|
|
35
|
+
let budget = $state({ min: 25, max: 75 });
|
|
36
|
+
let view = $state<string | number>('grid');
|
|
37
|
+
let country = $state('ca');
|
|
38
|
+
let channels = $state<Array<string | number>>(['email']);
|
|
39
|
+
let tags = $state(['svelte', 'agents']);
|
|
40
|
+
let region = $state<string | number>('west');
|
|
41
|
+
let status = $state('Controls are ready for direct use or agent guidance.');
|
|
42
|
+
|
|
43
|
+
async function command(command: ControlCommand, confirmed = false) {
|
|
44
|
+
const result = await registry.execute(command, {
|
|
45
|
+
source: 'agent',
|
|
46
|
+
confirmed,
|
|
47
|
+
});
|
|
48
|
+
status = result.ok
|
|
49
|
+
? `${command.action} completed for ${command.identity.controlId}.`
|
|
50
|
+
: (result.reason ?? 'Command denied.');
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const identity = (controlId: string) => ({
|
|
54
|
+
formId: 'foundation-demo',
|
|
55
|
+
controlId,
|
|
56
|
+
});
|
|
57
|
+
</script>
|
|
58
|
+
|
|
59
|
+
<div class="workbench">
|
|
60
|
+
<header>
|
|
61
|
+
<div><p class="eyebrow">Addressable controls</p><h4>Interactive form foundation</h4><p>Every control exposes stable identity, capability, state, and consent-aware mutation hooks.</p></div>
|
|
62
|
+
<div class="agent-actions">
|
|
63
|
+
<Button size="sm" variant="secondary" onclick={() => command({ action: 'highlight', identity: identity('country') })}>Highlight country</Button>
|
|
64
|
+
<Button size="sm" variant="secondary" onclick={() => command({ action: 'stage', identity: identity('volume'), value: 72 })}>Stage volume 72</Button>
|
|
65
|
+
<Button size="sm" onclick={() => command({ action: 'apply', identity: identity('volume') }, true)}>Confirm staged value</Button>
|
|
66
|
+
</div>
|
|
67
|
+
</header>
|
|
68
|
+
<p class="agent-status" aria-live="polite">Agent: {status}</p>
|
|
69
|
+
|
|
70
|
+
<Form formId="foundation-demo" interactionRegistry={registry} aria-label="Foundation controls">
|
|
71
|
+
<section><h5>Choice and state</h5><div class="grid compact">
|
|
72
|
+
<Checkbox name="accepted" label="Accept terms" bind:checked={accepted} />
|
|
73
|
+
<Switch name="notifications" label="Notifications" bind:checked={notifications} />
|
|
74
|
+
<ToggleButton name="pinned" bind:pressed={pinned}>Pin workspace</ToggleButton>
|
|
75
|
+
<RadioGroup name="role" label="Role" bind:value={role}><Radio value="editor" label="Editor" /><Radio value="viewer" label="Viewer" /></RadioGroup>
|
|
76
|
+
<SegmentedControl name="view" label="View mode" options={[{ value: 'grid', label: 'Grid' }, { value: 'list', label: 'List' }, { value: 'table', label: 'Table' }]} bind:value={view} />
|
|
77
|
+
<Listbox name="region" label="Region" options={[{ value: 'west', label: 'West' }, { value: 'central', label: 'Central' }, { value: 'east', label: 'East' }]} bind:value={region} />
|
|
78
|
+
</div></section>
|
|
79
|
+
|
|
80
|
+
<section><h5>Ranges</h5><div class="grid">
|
|
81
|
+
<Slider name="volume" label="Volume" unit="%" bind:value={volume} />
|
|
82
|
+
<RangeSlider name="budget" label="Budget range" unit="%" bind:value={budget} />
|
|
83
|
+
</div></section>
|
|
84
|
+
|
|
85
|
+
<section><h5>Structured input</h5><div class="grid">
|
|
86
|
+
<Combobox name="country" label="Country" options={countries} bind:value={country} />
|
|
87
|
+
<MultiSelect name="channels" label="Channels" options={[{ value: 'email', label: 'Email' }, { value: 'sms', label: 'SMS' }, { value: 'push', label: 'Push' }]} bind:values={channels} />
|
|
88
|
+
<TagsInput name="topics" label="Topics" bind:values={tags} />
|
|
89
|
+
<DatePicker name="date" label="Publish date" />
|
|
90
|
+
<TimePicker name="time" label="Publish time" />
|
|
91
|
+
<FilePicker name="assets" label="Assets" accept="image/*" multiple />
|
|
92
|
+
</div></section>
|
|
93
|
+
</Form>
|
|
94
|
+
</div>
|
|
95
|
+
|
|
96
|
+
<style>
|
|
97
|
+
.workbench { display: grid; gap: var(--smrt-spacing-5); color: var(--smrt-color-on-surface); }
|
|
98
|
+
header { display: flex; align-items: flex-start; justify-content: space-between; gap: var(--smrt-spacing-5); padding-bottom: var(--smrt-spacing-4); border-bottom: 1px solid var(--smrt-color-outline-variant); }
|
|
99
|
+
h4, h5, p { margin: 0; } h4 { font: var(--smrt-typography-headline-small-font); } h5 { margin-bottom: var(--smrt-spacing-3); font: var(--smrt-typography-title-medium-font); }
|
|
100
|
+
header p:not(.eyebrow) { max-width: 40rem; color: var(--smrt-color-on-surface-variant); }
|
|
101
|
+
.eyebrow { color: var(--smrt-color-primary); font: var(--smrt-typography-label-small-font); letter-spacing: .1em; text-transform: uppercase; }
|
|
102
|
+
.agent-actions { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: var(--smrt-spacing-2); }
|
|
103
|
+
.agent-status { padding: var(--smrt-spacing-3); border-inline-start: 3px solid var(--smrt-color-tertiary); background: var(--smrt-color-surface-container-low); color: var(--smrt-color-on-surface-variant); }
|
|
104
|
+
:global(form) { display: grid; gap: var(--smrt-spacing-6); }
|
|
105
|
+
section { min-width: 0; }
|
|
106
|
+
.grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--smrt-spacing-5); align-items: start; }
|
|
107
|
+
.grid.compact { grid-template-columns: repeat(3, minmax(0, 1fr)); }
|
|
108
|
+
@media (max-width: 900px) { header { flex-direction: column; } .agent-actions { justify-content: flex-start; } .grid, .grid.compact { grid-template-columns: 1fr; } }
|
|
109
|
+
</style>
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
declare const InteractiveControlsPreview: import("svelte").Component<Record<string, never>, {}, "">;
|
|
2
|
+
type InteractiveControlsPreview = ReturnType<typeof InteractiveControlsPreview>;
|
|
3
|
+
export default InteractiveControlsPreview;
|
|
4
|
+
//# sourceMappingURL=InteractiveControlsPreview.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InteractiveControlsPreview.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/playground/InteractiveControlsPreview.svelte.ts"],"names":[],"mappings":"AAyHA,QAAA,MAAM,0BAA0B,2DAAwC,CAAC;AACzE,KAAK,0BAA0B,GAAG,UAAU,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAChF,eAAe,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
declare const _default: {
|
|
2
|
+
packageName: string;
|
|
3
|
+
displayName: string;
|
|
4
|
+
description: string;
|
|
5
|
+
entries: {
|
|
6
|
+
id: string;
|
|
7
|
+
title: string;
|
|
8
|
+
description: string;
|
|
9
|
+
loadComponent: () => Promise<typeof import("./playground/BaseControlsPreview.svelte")>;
|
|
10
|
+
order: number;
|
|
11
|
+
tags: string[];
|
|
12
|
+
modes: {
|
|
13
|
+
mock: {
|
|
14
|
+
label: string;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
}[];
|
|
18
|
+
};
|
|
19
|
+
export default _default;
|
|
20
|
+
//# sourceMappingURL=playground.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playground.d.ts","sourceRoot":"","sources":["../../src/svelte/playground.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAQA,wBAiEE"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
const loadBaseControls = () => import('./playground/BaseControlsPreview.svelte');
|
|
2
|
+
const loadDataTable = () => import('./playground/DataTablePreview.svelte');
|
|
3
|
+
const loadInteractiveControls = () => import('./playground/InteractiveControlsPreview.svelte');
|
|
4
|
+
const loadFeedback = () => import('./playground/FeedbackPreview.svelte');
|
|
5
|
+
const loadCollections = () => import('./playground/CollectionsPreview.svelte');
|
|
6
|
+
export default {
|
|
7
|
+
packageName: '@happyvertical/smrt-ui',
|
|
8
|
+
displayName: 'UI Foundation',
|
|
9
|
+
description: 'Provider-free controls and data primitives rendered in the active s-m-r-t theme.',
|
|
10
|
+
entries: [
|
|
11
|
+
{
|
|
12
|
+
id: 'base-controls',
|
|
13
|
+
title: 'Base Controls',
|
|
14
|
+
description: 'Inputs, select, textarea, toggle, form grouping, buttons, and status badges.',
|
|
15
|
+
loadComponent: loadBaseControls,
|
|
16
|
+
order: 1,
|
|
17
|
+
tags: ['forms', 'inputs', 'buttons', 'badges'],
|
|
18
|
+
modes: {
|
|
19
|
+
mock: {
|
|
20
|
+
label: 'Interactive',
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
id: 'interactive-controls',
|
|
26
|
+
title: 'Interactive Controls',
|
|
27
|
+
description: 'Checkboxes, switches, radios, sliders, ranges, segmented choices, comboboxes, multiselect, tags, date/time, files, and agent interaction.',
|
|
28
|
+
loadComponent: loadInteractiveControls,
|
|
29
|
+
order: 2,
|
|
30
|
+
tags: ['forms', 'sliders', 'choices', 'agent-interaction'],
|
|
31
|
+
modes: { mock: { label: 'Interactive' } },
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
id: 'feedback-overlays',
|
|
35
|
+
title: 'Feedback & Overlays',
|
|
36
|
+
description: 'Alerts, toasts, progress, meters, spinners, popovers, menus, disclosure, accordions, and drawers.',
|
|
37
|
+
loadComponent: loadFeedback,
|
|
38
|
+
order: 3,
|
|
39
|
+
tags: ['feedback', 'progress', 'overlays'],
|
|
40
|
+
modes: { mock: { label: 'Interactive' } },
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
id: 'collections',
|
|
44
|
+
title: 'Collections & Content Lists',
|
|
45
|
+
description: 'Reusable collection toolbar and selectable list/grid pattern for content-heavy applications.',
|
|
46
|
+
loadComponent: loadCollections,
|
|
47
|
+
order: 4,
|
|
48
|
+
tags: ['content', 'list', 'grid', 'search'],
|
|
49
|
+
modes: { mock: { label: 'Interactive' } },
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
id: 'data-table',
|
|
53
|
+
title: 'Data Table',
|
|
54
|
+
description: 'Sortable and selectable tabular data with loading, density, and empty states.',
|
|
55
|
+
loadComponent: loadDataTable,
|
|
56
|
+
order: 5,
|
|
57
|
+
tags: ['data', 'table', 'grid'],
|
|
58
|
+
modes: {
|
|
59
|
+
mock: {
|
|
60
|
+
label: 'Interactive',
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
],
|
|
65
|
+
};
|
package/dist/theme/index.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* @deprecated Import from `@happyvertical/smrt-ui/themes`.
|
|
3
|
+
*
|
|
4
|
+
* This compatibility path now forwards to the canonical preset-aware theme
|
|
5
|
+
* system so `/theme`, `/themes`, and root imports share one context and one
|
|
6
|
+
* ThemeProvider implementation.
|
|
3
7
|
*/
|
|
4
|
-
export
|
|
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';
|
|
8
|
+
export * from '../themes/index.js';
|
|
7
9
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/theme/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/theme/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,cAAc,oBAAoB,CAAC"}
|
package/dist/theme/index.js
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* @deprecated Import from `@happyvertical/smrt-ui/themes`.
|
|
3
|
+
*
|
|
4
|
+
* This compatibility path now forwards to the canonical preset-aware theme
|
|
5
|
+
* system so `/theme`, `/themes`, and root imports share one context and one
|
|
6
|
+
* ThemeProvider implementation.
|
|
3
7
|
*/
|
|
4
|
-
|
|
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';
|
|
8
|
+
export * from '../themes/index.js';
|
|
@@ -22,7 +22,7 @@ export function setThemeContext(context) {
|
|
|
22
22
|
export function getThemeContext() {
|
|
23
23
|
const context = getContext(THEME_CONTEXT_KEY);
|
|
24
24
|
if (!context) {
|
|
25
|
-
throw new Error('Theme context not found. Make sure to wrap your app with <ThemeProvider> from @smrt/
|
|
25
|
+
throw new Error('Theme context not found. Make sure to wrap your app with <ThemeProvider> from @happyvertical/smrt-ui/themes');
|
|
26
26
|
}
|
|
27
27
|
return context;
|
|
28
28
|
}
|
package/dist/themes/index.d.ts
CHANGED