@w5-ui/svelte 0.1.0 → 0.2.1
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/package.json +6 -6
- package/src/lib/components/Accordion.svelte +9 -1
- package/src/lib/components/AccordionItem.svelte +11 -5
- package/src/lib/components/ActionMenu.svelte +19 -14
- package/src/lib/components/ActivityFeed.svelte +24 -11
- package/src/lib/components/Alert.svelte +9 -4
- package/src/lib/components/AnnotatedTimeSeries.svelte +40 -26
- package/src/lib/components/ArcDiagram.svelte +20 -8
- package/src/lib/components/AreaChart.svelte +26 -14
- package/src/lib/components/Avatar.svelte +20 -8
- package/src/lib/components/AvatarGroup.svelte +16 -7
- package/src/lib/components/Badge.svelte +24 -11
- package/src/lib/components/Banner.svelte +20 -9
- package/src/lib/components/BarChart.svelte +29 -17
- package/src/lib/components/BeeswarmChart.svelte +32 -18
- package/src/lib/components/BoxPlot.svelte +27 -15
- package/src/lib/components/Breadcrumb.svelte +12 -7
- package/src/lib/components/BubbleChart.svelte +39 -25
- package/src/lib/components/BulletChart.svelte +16 -9
- package/src/lib/components/BumpChart.svelte +15 -8
- package/src/lib/components/Button.svelte +32 -11
- package/src/lib/components/CIDRInput.svelte +27 -19
- package/src/lib/components/CalendarHeatmap.svelte +12 -5
- package/src/lib/components/Callout.svelte +9 -4
- package/src/lib/components/CandlestickChart.svelte +31 -16
- package/src/lib/components/Card.svelte +16 -6
- package/src/lib/components/Carousel.svelte +14 -11
- package/src/lib/components/Checkbox.svelte +37 -16
- package/src/lib/components/ChordDiagram.svelte +12 -5
- package/src/lib/components/CirclePacking.svelte +13 -6
- package/src/lib/components/CodeBlock.svelte +16 -7
- package/src/lib/components/ColorPicker.svelte +22 -11
- package/src/lib/components/ColumnToggle.svelte +18 -11
- package/src/lib/components/Combobox.svelte +44 -33
- package/src/lib/components/CommandPalette.svelte +41 -31
- package/src/lib/components/ConfirmDialog.svelte +66 -35
- package/src/lib/components/ContextMenu.svelte +46 -33
- package/src/lib/components/ContextualHelp.svelte +13 -9
- package/src/lib/components/ContourPlot.svelte +43 -28
- package/src/lib/components/CopyButton.svelte +8 -4
- package/src/lib/components/CorrelationMatrix.svelte +16 -7
- package/src/lib/components/CountUp.svelte +30 -13
- package/src/lib/components/CumulativeDistribution.svelte +32 -19
- package/src/lib/components/DatePicker.svelte +28 -21
- package/src/lib/components/DateRangePicker.svelte +39 -32
- package/src/lib/components/Dendrogram.svelte +18 -6
- package/src/lib/components/Donut.svelte +28 -14
- package/src/lib/components/DotPlot.svelte +31 -16
- package/src/lib/components/Drawer.svelte +28 -21
- package/src/lib/components/DualAxisChart.svelte +39 -26
- package/src/lib/components/DumbbellChart.svelte +24 -12
- package/src/lib/components/DurationInput.svelte +26 -17
- package/src/lib/components/EmptyState.svelte +16 -6
- package/src/lib/components/ErrorBandChart.svelte +28 -14
- package/src/lib/components/ExpandableRow.svelte +19 -6
- package/src/lib/components/Field.svelte +26 -12
- package/src/lib/components/FileUpload.svelte +29 -20
- package/src/lib/components/FilterBuilder.svelte +27 -17
- package/src/lib/components/FlameGraph.svelte +14 -7
- package/src/lib/components/ForceGraph.svelte +19 -7
- package/src/lib/components/FunnelChart.svelte +20 -13
- package/src/lib/components/GanttChart.svelte +14 -7
- package/src/lib/components/Gauge.svelte +26 -16
- package/src/lib/components/GroupedList.svelte +13 -6
- package/src/lib/components/HealthBar.svelte +14 -5
- package/src/lib/components/HeatMap.svelte +28 -17
- package/src/lib/components/HexbinChart.svelte +36 -22
- package/src/lib/components/Histogram.svelte +27 -14
- package/src/lib/components/HorizonChart.svelte +28 -16
- package/src/lib/components/HoverCard.svelte +24 -12
- package/src/lib/components/IPInput.svelte +24 -16
- package/src/lib/components/IcicleChart.svelte +14 -7
- package/src/lib/components/IconButton.svelte +27 -9
- package/src/lib/components/InlineEdit.svelte +22 -12
- package/src/lib/components/Input.svelte +67 -10
- package/src/lib/components/InputGroup.svelte +8 -3
- package/src/lib/components/JsonViewer.svelte +17 -6
- package/src/lib/components/JsonViewerNode.svelte +36 -18
- package/src/lib/components/KVTable.svelte +6 -2
- package/src/lib/components/KanbanBoard.svelte +24 -17
- package/src/lib/components/Kbd.svelte +8 -4
- package/src/lib/components/LineChart.svelte +29 -17
- package/src/lib/components/LogViewer.svelte +27 -12
- package/src/lib/components/LollipopChart.svelte +20 -8
- package/src/lib/components/MACInput.svelte +24 -16
- package/src/lib/components/MarimekkoChart.svelte +14 -7
- package/src/lib/components/MatrixChart.svelte +19 -9
- package/src/lib/components/Menubar.svelte +26 -19
- package/src/lib/components/MirroredBarChart.svelte +25 -10
- package/src/lib/components/Modal.svelte +46 -33
- package/src/lib/components/MultiSelect.svelte +49 -38
- package/src/lib/components/NightingaleChart.svelte +17 -10
- package/src/lib/components/NotificationPanel.svelte +48 -33
- package/src/lib/components/NumberInput.svelte +37 -23
- package/src/lib/components/OTPInput.svelte +28 -16
- package/src/lib/components/Pagination.svelte +16 -13
- package/src/lib/components/ParallelCoordinates.svelte +28 -16
- package/src/lib/components/ParetoChart.svelte +38 -24
- package/src/lib/components/PasswordInput.svelte +24 -14
- package/src/lib/components/PieChart.svelte +21 -13
- package/src/lib/components/Pill.svelte +17 -6
- package/src/lib/components/PolarHeatmap.svelte +32 -18
- package/src/lib/components/Popover.svelte +22 -11
- package/src/lib/components/ProgressBar.svelte +17 -8
- package/src/lib/components/PunchCard.svelte +31 -20
- package/src/lib/components/QuadrantChart.svelte +50 -30
- package/src/lib/components/RadarChart.svelte +30 -18
- package/src/lib/components/RadialBarChart.svelte +14 -7
- package/src/lib/components/RadioGroup.svelte +20 -8
- package/src/lib/components/RangeSlider.svelte +30 -18
- package/src/lib/components/RankedList.svelte +18 -6
- package/src/lib/components/ResizablePanel.svelte +33 -17
- package/src/lib/components/RidgelinePlot.svelte +33 -21
- package/src/lib/components/RowToggle.svelte +15 -5
- package/src/lib/components/SankeyDiagram.svelte +18 -6
- package/src/lib/components/ScatterPlot.svelte +34 -21
- package/src/lib/components/SearchBox.svelte +27 -5
- package/src/lib/components/SegmentedControl.svelte +11 -7
- package/src/lib/components/Select.svelte +37 -26
- package/src/lib/components/SelectionToolbar.svelte +25 -11
- package/src/lib/components/Sidebar.svelte +15 -9
- package/src/lib/components/Signal.svelte +6 -2
- package/src/lib/components/Skeleton.svelte +20 -10
- package/src/lib/components/SkipLink.svelte +9 -4
- package/src/lib/components/Slider.svelte +28 -14
- package/src/lib/components/SlopeChart.svelte +35 -21
- package/src/lib/components/SortHeader.svelte +20 -9
- package/src/lib/components/SortableList.svelte +20 -13
- package/src/lib/components/Sparkline.svelte +15 -6
- package/src/lib/components/SparklineMatrix.svelte +17 -10
- package/src/lib/components/Spinner.svelte +7 -3
- package/src/lib/components/SplitButton.svelte +28 -17
- package/src/lib/components/Spoiler.svelte +22 -11
- package/src/lib/components/StackedBarChart.svelte +35 -22
- package/src/lib/components/StackedProgress.svelte +21 -9
- package/src/lib/components/StarRating.svelte +22 -11
- package/src/lib/components/Stat.svelte +32 -10
- package/src/lib/components/StatusIndicator.svelte +7 -3
- package/src/lib/components/StepChart.svelte +27 -15
- package/src/lib/components/Stepper.svelte +10 -6
- package/src/lib/components/StreamGraph.svelte +19 -12
- package/src/lib/components/StripeChart.svelte +22 -12
- package/src/lib/components/SunburstChart.svelte +11 -4
- package/src/lib/components/SwitchPortGrid.svelte +13 -7
- package/src/lib/components/TabPanel.svelte +9 -4
- package/src/lib/components/Tabs.svelte +18 -10
- package/src/lib/components/Tag.svelte +9 -5
- package/src/lib/components/TagInput.svelte +28 -18
- package/src/lib/components/Textarea.svelte +37 -15
- package/src/lib/components/ThresholdAreaChart.svelte +34 -21
- package/src/lib/components/TimePicker.svelte +25 -17
- package/src/lib/components/TimeRange.svelte +19 -14
- package/src/lib/components/Timeline.svelte +8 -4
- package/src/lib/components/Toast.svelte +2 -2
- package/src/lib/components/Toggle.svelte +13 -7
- package/src/lib/components/ToggleGroup.svelte +19 -11
- package/src/lib/components/Tooltip.svelte +16 -6
- package/src/lib/components/Topbar.svelte +24 -10
- package/src/lib/components/TransferList.svelte +34 -27
- package/src/lib/components/TreeItem.svelte +23 -10
- package/src/lib/components/TreeMap.svelte +13 -6
- package/src/lib/components/TreeView.svelte +24 -12
- package/src/lib/components/UptimeTimeline.svelte +22 -15
- package/src/lib/components/VennDiagram.svelte +25 -13
- package/src/lib/components/ViolinPlot.svelte +31 -19
- package/src/lib/components/VirtualList.svelte +25 -13
- package/src/lib/components/WaffleChart.svelte +32 -18
- package/src/lib/components/WaterfallChart.svelte +33 -26
- package/src/lib/components/WordCloud.svelte +21 -14
- package/src/lib/icons/AlarmIcon.svelte +4 -1
- package/src/lib/icons/BellIcon.svelte +2 -1
- package/src/lib/icons/CaretIcon.svelte +5 -3
- package/src/lib/icons/ClientsIcon.svelte +4 -1
- package/src/lib/icons/CloseIcon.svelte +2 -1
- package/src/lib/icons/DashboardIcon.svelte +4 -1
- package/src/lib/icons/DevicesIcon.svelte +4 -1
- package/src/lib/icons/DownloadIcon.svelte +2 -1
- package/src/lib/icons/HelpIcon.svelte +2 -1
- package/src/lib/icons/InfraIcon.svelte +4 -1
- package/src/lib/icons/IntegrationsIcon.svelte +4 -1
- package/src/lib/icons/LogsIcon.svelte +4 -1
- package/src/lib/icons/PlusIcon.svelte +2 -1
- package/src/lib/icons/PortsIcon.svelte +4 -1
- package/src/lib/icons/SearchIcon.svelte +6 -4
- package/src/lib/icons/SecurityIcon.svelte +4 -1
- package/src/lib/icons/SettingsIcon.svelte +4 -1
- package/src/lib/icons/TopologyIcon.svelte +4 -1
- package/src/lib/icons/UpdatesIcon.svelte +2 -1
- package/src/lib/icons/VpnIcon.svelte +4 -1
- package/src/lib/icons/WifiIcon.svelte +4 -1
- package/src/lib/icons/WirelessIcon.svelte +4 -1
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@w5-ui/svelte",
|
|
3
|
-
"version": "0.1
|
|
4
|
-
"description": "Svelte
|
|
3
|
+
"version": "0.2.1",
|
|
4
|
+
"description": "Svelte 5 components for the Dash UI design system - mirrors the @w5-ui/react API 1:1. Part of Webber's design systems.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"svelte",
|
|
7
7
|
"components",
|
|
@@ -41,14 +41,14 @@
|
|
|
41
41
|
"./components/*.svelte": "./src/lib/components/*.svelte"
|
|
42
42
|
},
|
|
43
43
|
"peerDependencies": {
|
|
44
|
-
"svelte": "
|
|
44
|
+
"svelte": "^5"
|
|
45
45
|
},
|
|
46
46
|
"dependencies": {
|
|
47
|
-
"@w5-ui/assets": "
|
|
48
|
-
"@w5-ui/tokens": "
|
|
47
|
+
"@w5-ui/assets": "^0.2.1",
|
|
48
|
+
"@w5-ui/tokens": "^0.2.1"
|
|
49
49
|
},
|
|
50
50
|
"devDependencies": {
|
|
51
|
-
"svelte": "^
|
|
51
|
+
"svelte": "^5.43.5",
|
|
52
52
|
"typescript": "^5.5.0"
|
|
53
53
|
},
|
|
54
54
|
"files": [
|
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
interface Props {
|
|
3
|
+
title: string;
|
|
4
|
+
defaultOpen?: boolean;
|
|
5
|
+
children?: import('svelte').Snippet;
|
|
6
|
+
}
|
|
4
7
|
|
|
5
|
-
let
|
|
8
|
+
let { title, defaultOpen = false, children }: Props = $props();
|
|
9
|
+
|
|
10
|
+
// svelte-ignore state_referenced_locally
|
|
11
|
+
let open = $state(defaultOpen);
|
|
6
12
|
const uid = Math.random().toString(36).slice(2, 9);
|
|
7
13
|
const btnId = `acc-btn-${uid}`;
|
|
8
14
|
const panelId = `acc-panel-${uid}`;
|
|
@@ -16,7 +22,7 @@
|
|
|
16
22
|
class="accordion-trigger"
|
|
17
23
|
aria-expanded={open}
|
|
18
24
|
aria-controls={panelId}
|
|
19
|
-
|
|
25
|
+
onclick={() => (open = !open)}
|
|
20
26
|
>
|
|
21
27
|
<span>{title}</span>
|
|
22
28
|
<svg
|
|
@@ -33,7 +39,7 @@
|
|
|
33
39
|
{#if open}
|
|
34
40
|
<div id={panelId} role="region" aria-labelledby={btnId} class="accordion-panel">
|
|
35
41
|
<div class="accordion-content">
|
|
36
|
-
|
|
42
|
+
{@render children?.()}
|
|
37
43
|
</div>
|
|
38
44
|
</div>
|
|
39
45
|
{/if}
|
|
@@ -1,22 +1,27 @@
|
|
|
1
|
-
<script
|
|
1
|
+
<script module lang="ts">
|
|
2
2
|
let counter = 0;
|
|
3
3
|
export interface ActionMenuItem { id: string; label: string; danger?: boolean; disabled?: boolean; }
|
|
4
4
|
</script>
|
|
5
5
|
|
|
6
6
|
<script lang="ts">
|
|
7
|
-
import {
|
|
7
|
+
import { onMount, onDestroy } from 'svelte';
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
interface Props {
|
|
10
|
+
items?: ActionMenuItem[];
|
|
11
|
+
label?: string;
|
|
12
|
+
onaction?: (payload: string) => void;
|
|
13
|
+
}
|
|
11
14
|
|
|
12
|
-
|
|
15
|
+
let { items = [], label = 'Actions',
|
|
16
|
+
onaction,
|
|
17
|
+
}: Props = $props();
|
|
13
18
|
const uid = `dash-ui-am-${++counter}`;
|
|
14
19
|
const menuId = `${uid}-menu`;
|
|
15
20
|
|
|
16
|
-
let open = false;
|
|
17
|
-
let activeIdx = 0;
|
|
18
|
-
let triggerEl
|
|
19
|
-
let wrapperEl
|
|
21
|
+
let open = $state(false);
|
|
22
|
+
let activeIdx = $state(0);
|
|
23
|
+
let triggerEl = $state<HTMLButtonElement | undefined>(undefined);
|
|
24
|
+
let wrapperEl = $state<HTMLDivElement | undefined>(undefined);
|
|
20
25
|
|
|
21
26
|
function toggle() {
|
|
22
27
|
if (!open) activeIdx = 0;
|
|
@@ -24,7 +29,7 @@
|
|
|
24
29
|
}
|
|
25
30
|
|
|
26
31
|
function activate(id: string) {
|
|
27
|
-
|
|
32
|
+
onaction?.(id);
|
|
28
33
|
open = false;
|
|
29
34
|
triggerEl?.focus();
|
|
30
35
|
}
|
|
@@ -68,8 +73,8 @@
|
|
|
68
73
|
aria-haspopup="menu"
|
|
69
74
|
aria-expanded={open}
|
|
70
75
|
aria-controls={open ? menuId : undefined}
|
|
71
|
-
|
|
72
|
-
|
|
76
|
+
onclick={toggle}
|
|
77
|
+
onkeydown={onKeyDown}
|
|
73
78
|
>
|
|
74
79
|
<svg width="14" height="14" viewBox="0 0 14 14" aria-hidden="true" focusable="false" fill="currentColor">
|
|
75
80
|
<circle cx="7" cy="2.5" r="1.2" />
|
|
@@ -87,8 +92,8 @@
|
|
|
87
92
|
data-active={idx === activeIdx ? 'true' : undefined}
|
|
88
93
|
data-danger={item.danger ? 'true' : undefined}
|
|
89
94
|
class="action-menu-item"
|
|
90
|
-
|
|
91
|
-
|
|
95
|
+
onmouseenter={() => { activeIdx = idx; }}
|
|
96
|
+
onmousedown={(e) => { e.preventDefault(); (() => { if (!item.disabled) activate(item.id); })(); }}
|
|
92
97
|
>{item.label}</li>
|
|
93
98
|
{/each}
|
|
94
99
|
</ul>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<script
|
|
1
|
+
<script module lang="ts">
|
|
2
2
|
export type ActivitySeverity = 'info' | 'success' | 'warn' | 'error' | 'neutral';
|
|
3
3
|
export interface ActivityItem {
|
|
4
4
|
id: string;
|
|
@@ -10,16 +10,28 @@
|
|
|
10
10
|
</script>
|
|
11
11
|
|
|
12
12
|
<script lang="ts">
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
13
|
+
interface Props {
|
|
14
|
+
items?: ActivityItem[];
|
|
15
|
+
label?: string;
|
|
16
|
+
busy?: boolean;
|
|
17
|
+
maxHeight?: number;
|
|
18
|
+
autoScroll?: boolean;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
let {
|
|
22
|
+
items = [],
|
|
23
|
+
label = 'Activity feed',
|
|
24
|
+
busy = false,
|
|
25
|
+
maxHeight = 360,
|
|
26
|
+
autoScroll = false,
|
|
27
|
+
}: Props = $props();
|
|
19
28
|
|
|
20
|
-
let endEl
|
|
29
|
+
let endEl = $state<HTMLDivElement | undefined>(undefined);
|
|
21
30
|
|
|
22
|
-
afterUpdate
|
|
31
|
+
// Replaces `afterUpdate`. Reading `items.length` makes the effect depend
|
|
32
|
+
// on the visible list so we re-scroll whenever an item is appended.
|
|
33
|
+
$effect(() => {
|
|
34
|
+
void items.length;
|
|
23
35
|
if (autoScroll && endEl) endEl.scrollIntoView({ block: 'nearest' });
|
|
24
36
|
});
|
|
25
37
|
</script>
|
|
@@ -33,6 +45,7 @@
|
|
|
33
45
|
style:overflow-y="auto"
|
|
34
46
|
>
|
|
35
47
|
{#each items as item, i (item.id)}
|
|
48
|
+
<!-- svelte-ignore a11y_no_noninteractive_tabindex - navigable feed item for keyboard users -->
|
|
36
49
|
<article
|
|
37
50
|
class="af-item af-item--{item.severity ?? 'neutral'}"
|
|
38
51
|
aria-labelledby="af-title-{item.id}"
|
|
@@ -41,7 +54,7 @@
|
|
|
41
54
|
aria-setsize={items.length}
|
|
42
55
|
tabindex="0"
|
|
43
56
|
>
|
|
44
|
-
<div class="af-dot" aria-hidden="true"
|
|
57
|
+
<div class="af-dot" aria-hidden="true"></div>
|
|
45
58
|
<div class="af-body">
|
|
46
59
|
<div class="af-header">
|
|
47
60
|
<span id="af-title-{item.id}" class="af-title">{item.title}</span>
|
|
@@ -56,5 +69,5 @@
|
|
|
56
69
|
{#if items.length === 0}
|
|
57
70
|
<div class="af-empty" role="status">No activity</div>
|
|
58
71
|
{/if}
|
|
59
|
-
<div bind:this={endEl}
|
|
72
|
+
<div bind:this={endEl}></div>
|
|
60
73
|
</div>
|
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import CloseIcon from '../icons/CloseIcon.svelte';
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
interface Props {
|
|
4
|
+
variant?: 'success' | 'warn' | 'danger' | 'info';
|
|
5
|
+
onDismiss?: (() => void) | undefined;
|
|
6
|
+
children?: import('svelte').Snippet;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
let { variant = 'info', onDismiss = undefined, children }: Props = $props();
|
|
5
10
|
</script>
|
|
6
11
|
|
|
7
12
|
<div
|
|
@@ -10,9 +15,9 @@
|
|
|
10
15
|
aria-live={variant === 'danger' ? 'assertive' : 'polite'}
|
|
11
16
|
aria-atomic="true"
|
|
12
17
|
>
|
|
13
|
-
<span class="alert-body"
|
|
18
|
+
<span class="alert-body">{@render children?.()}</span>
|
|
14
19
|
{#if onDismiss}
|
|
15
|
-
<button type="button" class="alert-dismiss icon-btn"
|
|
20
|
+
<button type="button" class="alert-dismiss icon-btn" onclick={onDismiss} aria-label="Dismiss alert">
|
|
16
21
|
<CloseIcon />
|
|
17
22
|
</button>
|
|
18
23
|
{/if}
|
|
@@ -1,27 +1,41 @@
|
|
|
1
|
-
<script lang="ts">
|
|
1
|
+
<script module lang="ts">
|
|
2
2
|
export interface TimeSeriesAnnotation {
|
|
3
3
|
index: number;
|
|
4
4
|
label: string;
|
|
5
5
|
color?: string;
|
|
6
6
|
}
|
|
7
|
+
</script>
|
|
8
|
+
|
|
9
|
+
<script lang="ts">
|
|
10
|
+
|
|
11
|
+
interface Props {
|
|
12
|
+
data?: number[];
|
|
13
|
+
labels?: string[];
|
|
14
|
+
annotations?: TimeSeriesAnnotation[];
|
|
15
|
+
color?: string;
|
|
16
|
+
height?: number;
|
|
17
|
+
ariaLabel?: string;
|
|
18
|
+
}
|
|
7
19
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
20
|
+
let {
|
|
21
|
+
data = [],
|
|
22
|
+
labels = [],
|
|
23
|
+
annotations = [],
|
|
24
|
+
color = '#006FFF',
|
|
25
|
+
height = 160,
|
|
26
|
+
ariaLabel = 'Annotated time series'
|
|
27
|
+
}: Props = $props();
|
|
14
28
|
|
|
15
29
|
const VW = 400;
|
|
16
30
|
const PAD = { t: 16, r: 8, b: 28, l: 32 };
|
|
17
31
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
32
|
+
let n = $derived(data.length);
|
|
33
|
+
let chartW = $derived(VW - PAD.l - PAD.r);
|
|
34
|
+
let chartH = $derived(height - PAD.t - PAD.b);
|
|
35
|
+
let minV = $derived(n >= 2 ? Math.min(...data) : 0);
|
|
36
|
+
let maxV = $derived(n >= 2 ? Math.max(...data) || 1 : 1);
|
|
37
|
+
let range = $derived(maxV - minV || 1);
|
|
38
|
+
let bot = $derived(PAD.t + chartH);
|
|
25
39
|
|
|
26
40
|
function toX(i: number): number {
|
|
27
41
|
return PAD.l + (i / (n - 1)) * chartW;
|
|
@@ -30,33 +44,33 @@
|
|
|
30
44
|
return PAD.t + chartH - ((v - minV) / range) * chartH;
|
|
31
45
|
}
|
|
32
46
|
|
|
33
|
-
|
|
47
|
+
let pts = $derived(n >= 2 ? data.map((v, i) => [toX(i), toY(v)] as [number, number]) : []);
|
|
34
48
|
|
|
35
|
-
|
|
49
|
+
let linePath = $derived(pts.length
|
|
36
50
|
? pts.map(([x, y], i) => `${i === 0 ? 'M' : 'L'}${x.toFixed(1)},${y.toFixed(1)}`).join(' ')
|
|
37
|
-
: '';
|
|
51
|
+
: '');
|
|
38
52
|
|
|
39
|
-
|
|
53
|
+
let areaPath = $derived(pts.length
|
|
40
54
|
? `${linePath} L${pts[n - 1][0].toFixed(1)},${bot} L${pts[0][0].toFixed(1)},${bot} Z`
|
|
41
|
-
: '';
|
|
55
|
+
: '');
|
|
42
56
|
|
|
43
|
-
|
|
57
|
+
let gridLines = $derived([0, 0.5, 1].map((f) => ({
|
|
44
58
|
y: PAD.t + (1 - f) * chartH,
|
|
45
59
|
label: String(Math.round(minV + f * range)),
|
|
46
|
-
}));
|
|
60
|
+
})));
|
|
47
61
|
|
|
48
|
-
|
|
49
|
-
|
|
62
|
+
let stride = $derived(n <= 8 ? 1 : Math.ceil(n / 6));
|
|
63
|
+
let xLabels = $derived(n >= 2
|
|
50
64
|
? data
|
|
51
65
|
.map((_, i) => ({ x: toX(i), text: labels[i] ?? String(i), i }))
|
|
52
66
|
.filter(({ i }) => i % stride === 0 || i === n - 1)
|
|
53
|
-
: [];
|
|
67
|
+
: []);
|
|
54
68
|
|
|
55
|
-
|
|
69
|
+
let markers = $derived(annotations.map((a) => ({
|
|
56
70
|
x: toX(Math.max(0, Math.min(n - 1, a.index))),
|
|
57
71
|
label: a.label,
|
|
58
72
|
color: a.color ?? '#F5A623',
|
|
59
|
-
}));
|
|
73
|
+
})));
|
|
60
74
|
</script>
|
|
61
75
|
|
|
62
76
|
{#if n >= 2}
|
|
@@ -1,27 +1,39 @@
|
|
|
1
|
-
<script lang="ts">
|
|
1
|
+
<script module lang="ts">
|
|
2
2
|
export interface ArcNode {
|
|
3
3
|
id: string;
|
|
4
4
|
label: string;
|
|
5
5
|
color?: string;
|
|
6
6
|
}
|
|
7
|
-
|
|
8
7
|
export interface ArcLink {
|
|
9
8
|
source: string;
|
|
10
9
|
target: string;
|
|
11
10
|
value?: number;
|
|
12
11
|
color?: string;
|
|
13
12
|
}
|
|
13
|
+
</script>
|
|
14
|
+
|
|
15
|
+
<script lang="ts">
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
interface Props {
|
|
19
|
+
nodes: ArcNode[];
|
|
20
|
+
links: ArcLink[];
|
|
21
|
+
height?: number;
|
|
22
|
+
ariaLabel?: string;
|
|
23
|
+
}
|
|
14
24
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
25
|
+
let {
|
|
26
|
+
nodes,
|
|
27
|
+
links,
|
|
28
|
+
height = 180,
|
|
29
|
+
ariaLabel = 'Arc diagram'
|
|
30
|
+
}: Props = $props();
|
|
19
31
|
|
|
20
32
|
const PALETTE = ['#006FFF', '#00C875', '#F5A623', '#A78BFA', '#FF7B7B', '#00C8C8', '#FB923C'];
|
|
21
33
|
const VW = 400;
|
|
22
34
|
const PAD = { t: 12, r: 20, b: 36, l: 20 };
|
|
23
35
|
|
|
24
|
-
|
|
36
|
+
let layout = $derived((() => {
|
|
25
37
|
const n = nodes.length;
|
|
26
38
|
if (!n) return null;
|
|
27
39
|
const chartW = VW - PAD.l - PAD.r;
|
|
@@ -53,7 +65,7 @@
|
|
|
53
65
|
});
|
|
54
66
|
|
|
55
67
|
return { dots, arcs, baseY };
|
|
56
|
-
})();
|
|
68
|
+
})());
|
|
57
69
|
</script>
|
|
58
70
|
|
|
59
71
|
{#if layout}
|
|
@@ -1,26 +1,38 @@
|
|
|
1
|
-
<script lang="ts">
|
|
1
|
+
<script module lang="ts">
|
|
2
2
|
export interface AreaChartSeries {
|
|
3
3
|
label: string;
|
|
4
4
|
color: string;
|
|
5
5
|
values: number[];
|
|
6
6
|
}
|
|
7
|
+
</script>
|
|
8
|
+
|
|
9
|
+
<script lang="ts">
|
|
10
|
+
|
|
11
|
+
interface Props {
|
|
12
|
+
series?: AreaChartSeries[];
|
|
13
|
+
labels?: string[];
|
|
14
|
+
height?: number;
|
|
15
|
+
ariaLabel?: string;
|
|
16
|
+
}
|
|
7
17
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
18
|
+
let {
|
|
19
|
+
series = [],
|
|
20
|
+
labels = [],
|
|
21
|
+
height = 160,
|
|
22
|
+
ariaLabel = 'Area chart'
|
|
23
|
+
}: Props = $props();
|
|
12
24
|
|
|
13
25
|
const VW = 400;
|
|
14
26
|
const PAD = { t: 12, r: 8, b: 28, l: 8 };
|
|
15
27
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
28
|
+
let n = $derived(series[0]?.values.length ?? 0);
|
|
29
|
+
let chartW = $derived(VW - PAD.l - PAD.r);
|
|
30
|
+
let chartH = $derived(height - PAD.t - PAD.b);
|
|
19
31
|
|
|
20
|
-
|
|
32
|
+
let totals = $derived(Array.from({ length: n }, (_, i) =>
|
|
21
33
|
series.reduce((acc, s) => acc + (s.values[i] ?? 0), 0),
|
|
22
|
-
);
|
|
23
|
-
|
|
34
|
+
));
|
|
35
|
+
let maxV = $derived(totals.length ? Math.max(...totals, 1) : 1);
|
|
24
36
|
|
|
25
37
|
function toX(i: number): number {
|
|
26
38
|
return PAD.l + (n > 1 ? (i / (n - 1)) * chartW : chartW / 2);
|
|
@@ -29,9 +41,9 @@
|
|
|
29
41
|
return PAD.t + chartH - (v / maxV) * chartH;
|
|
30
42
|
}
|
|
31
43
|
|
|
32
|
-
|
|
44
|
+
let gridLines = $derived([0, 0.25, 0.5, 0.75, 1].map((f) => PAD.t + (1 - f) * chartH));
|
|
33
45
|
|
|
34
|
-
|
|
46
|
+
let areas = $derived(n > 0
|
|
35
47
|
? series.map((s, j) => {
|
|
36
48
|
const bottoms = Array.from({ length: n }, (_, i) =>
|
|
37
49
|
series.slice(0, j).reduce((acc, sr) => acc + (sr.values[i] ?? 0), 0),
|
|
@@ -43,7 +55,7 @@
|
|
|
43
55
|
.reverse();
|
|
44
56
|
return { color: s.color, label: s.label, d: `M ${topPts.join(' L ')} L ${botPts.join(' L ')} Z` };
|
|
45
57
|
})
|
|
46
|
-
: [];
|
|
58
|
+
: []);
|
|
47
59
|
</script>
|
|
48
60
|
|
|
49
61
|
<div role="img" aria-label={ariaLabel} style="width:100%;">
|
|
@@ -1,16 +1,28 @@
|
|
|
1
|
-
<script
|
|
1
|
+
<script module lang="ts">
|
|
2
2
|
export type AvatarSize = 'sm' | 'md' | 'lg';
|
|
3
3
|
export type AvatarStatus = 'online' | 'offline' | 'away';
|
|
4
4
|
</script>
|
|
5
5
|
|
|
6
6
|
<script lang="ts">
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
7
|
+
interface Props {
|
|
8
|
+
initials?: string;
|
|
9
|
+
src?: string | undefined;
|
|
10
|
+
alt?: string | undefined;
|
|
11
|
+
size?: AvatarSize;
|
|
12
|
+
status?: AvatarStatus | undefined;
|
|
13
|
+
className?: string;
|
|
14
|
+
style?: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
let {
|
|
18
|
+
initials = '?',
|
|
19
|
+
src = undefined,
|
|
20
|
+
alt = undefined,
|
|
21
|
+
size = 'md',
|
|
22
|
+
status = undefined,
|
|
23
|
+
className = '',
|
|
24
|
+
style = ''
|
|
25
|
+
}: Props = $props();
|
|
14
26
|
</script>
|
|
15
27
|
|
|
16
28
|
<span
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<script
|
|
1
|
+
<script module lang="ts">
|
|
2
2
|
export interface AvatarItem {
|
|
3
3
|
initials?: string;
|
|
4
4
|
src?: string;
|
|
@@ -10,13 +10,22 @@
|
|
|
10
10
|
import Avatar from './Avatar.svelte';
|
|
11
11
|
import type { AvatarSize } from './Avatar.svelte';
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
13
|
+
interface Props {
|
|
14
|
+
avatars?: AvatarItem[];
|
|
15
|
+
max?: number;
|
|
16
|
+
size?: AvatarSize;
|
|
17
|
+
ariaLabel?: string;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
let {
|
|
21
|
+
avatars = [],
|
|
22
|
+
max = 5,
|
|
23
|
+
size = 'md',
|
|
24
|
+
ariaLabel = 'Avatar group'
|
|
25
|
+
}: Props = $props();
|
|
17
26
|
|
|
18
|
-
|
|
19
|
-
|
|
27
|
+
let visible = $derived(avatars.slice(0, max));
|
|
28
|
+
let overflow = $derived(avatars.length - visible.length);
|
|
20
29
|
</script>
|
|
21
30
|
|
|
22
31
|
<span class="avatar-group" role="list" aria-label={ariaLabel}>
|
|
@@ -1,22 +1,35 @@
|
|
|
1
|
-
<script
|
|
1
|
+
<script module lang="ts">
|
|
2
2
|
export type BadgeColor = 'danger' | 'warn' | 'info' | 'success' | 'neutral';
|
|
3
3
|
</script>
|
|
4
4
|
|
|
5
5
|
<script lang="ts">
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
6
|
+
interface Props {
|
|
7
|
+
count?: number | undefined;
|
|
8
|
+
dot?: boolean;
|
|
9
|
+
max?: number;
|
|
10
|
+
showZero?: boolean;
|
|
11
|
+
color?: BadgeColor;
|
|
12
|
+
class?: string;
|
|
13
|
+
children?: import('svelte').Snippet;
|
|
14
|
+
}
|
|
13
15
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
+
let {
|
|
17
|
+
count = undefined,
|
|
18
|
+
dot = false,
|
|
19
|
+
max = 99,
|
|
20
|
+
showZero = false,
|
|
21
|
+
color = 'danger',
|
|
22
|
+
class: klass = '',
|
|
23
|
+
children
|
|
24
|
+
}: Props = $props();
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
let show = $derived(dot || (count !== undefined && (showZero || count > 0)));
|
|
28
|
+
let label = $derived(count !== undefined ? (count > max ? `${max}+` : String(count)) : '');
|
|
16
29
|
</script>
|
|
17
30
|
|
|
18
31
|
<span class="badge-wrapper{klass ? ` ${klass}` : ''}">
|
|
19
|
-
|
|
32
|
+
{@render children?.()}
|
|
20
33
|
{#if show}
|
|
21
34
|
<span class="badge badge-{color}{dot ? ' badge-dot' : ''}" aria-hidden="true">
|
|
22
35
|
{#if !dot}{label}{/if}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<script
|
|
1
|
+
<script module lang="ts">
|
|
2
2
|
export type BannerVariant = 'info' | 'success' | 'warn' | 'danger';
|
|
3
3
|
export interface BannerAction {
|
|
4
4
|
label: string;
|
|
@@ -8,12 +8,23 @@
|
|
|
8
8
|
|
|
9
9
|
<script lang="ts">
|
|
10
10
|
import CloseIcon from '../icons/CloseIcon.svelte';
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
11
|
+
interface Props {
|
|
12
|
+
variant?: BannerVariant;
|
|
13
|
+
title?: string | undefined;
|
|
14
|
+
action?: BannerAction | undefined;
|
|
15
|
+
onDismiss?: (() => void) | undefined;
|
|
16
|
+
children?: import('svelte').Snippet;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
let {
|
|
20
|
+
variant = 'info',
|
|
21
|
+
title = undefined,
|
|
22
|
+
action = undefined,
|
|
23
|
+
onDismiss = undefined,
|
|
24
|
+
children
|
|
25
|
+
}: Props = $props();
|
|
15
26
|
|
|
16
|
-
|
|
27
|
+
let isUrgent = $derived(variant === 'danger' || variant === 'warn');
|
|
17
28
|
</script>
|
|
18
29
|
|
|
19
30
|
<div
|
|
@@ -24,13 +35,13 @@
|
|
|
24
35
|
>
|
|
25
36
|
<div class="banner__body">
|
|
26
37
|
{#if title}<span class="banner__title">{title}</span>{/if}
|
|
27
|
-
<span
|
|
38
|
+
<span>{@render children?.()}</span>
|
|
28
39
|
</div>
|
|
29
40
|
{#if action}
|
|
30
|
-
<button type="button" class="banner__action"
|
|
41
|
+
<button type="button" class="banner__action" onclick={action.onClick}>{action.label}</button>
|
|
31
42
|
{/if}
|
|
32
43
|
{#if onDismiss}
|
|
33
|
-
<button type="button" class="banner__dismiss icon-btn"
|
|
44
|
+
<button type="button" class="banner__dismiss icon-btn" onclick={onDismiss} aria-label="Dismiss banner">
|
|
34
45
|
<CloseIcon />
|
|
35
46
|
</button>
|
|
36
47
|
{/if}
|