@w5-ui/svelte 0.1.0 → 0.2.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/package.json +4 -4
- 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
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
interface Props {
|
|
3
|
+
size?: 'sm' | 'md' | 'lg';
|
|
4
|
+
label?: string;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
let { size = 'md', label = 'Loading' }: Props = $props();
|
|
4
8
|
</script>
|
|
5
9
|
|
|
6
|
-
<span role="status" aria-label={label} class="spinner {size}"
|
|
10
|
+
<span role="status" aria-label={label} class="spinner {size}"></span>
|
|
@@ -1,24 +1,35 @@
|
|
|
1
|
-
<script
|
|
1
|
+
<script module lang="ts">
|
|
2
2
|
let counter = 0;
|
|
3
3
|
export interface SplitButtonItem { id: string; label: string; disabled?: boolean; }
|
|
4
4
|
</script>
|
|
5
5
|
|
|
6
6
|
<script lang="ts">
|
|
7
|
-
import {
|
|
7
|
+
import { onMount, onDestroy } from 'svelte';
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
9
|
+
interface Props {
|
|
10
|
+
label: string;
|
|
11
|
+
variant?: 'primary' | 'ghost' | 'danger';
|
|
12
|
+
disabled?: boolean;
|
|
13
|
+
items?: SplitButtonItem[];
|
|
14
|
+
onprimary?: () => void;
|
|
15
|
+
onaction?: (payload: string) => void;
|
|
16
|
+
}
|
|
13
17
|
|
|
14
|
-
|
|
18
|
+
let {
|
|
19
|
+
label,
|
|
20
|
+
variant = 'ghost',
|
|
21
|
+
disabled = false,
|
|
22
|
+
items = [],
|
|
23
|
+
onprimary,
|
|
24
|
+
onaction,
|
|
25
|
+
}: Props = $props();
|
|
15
26
|
const uid = `dash-ui-spbtn-${++counter}`;
|
|
16
27
|
const menuId = `${uid}-menu`;
|
|
17
28
|
|
|
18
|
-
let open = false;
|
|
19
|
-
let activeIdx = 0;
|
|
20
|
-
let caretEl
|
|
21
|
-
let wrapperEl
|
|
29
|
+
let open = $state(false);
|
|
30
|
+
let activeIdx = $state(0);
|
|
31
|
+
let caretEl = $state<HTMLButtonElement | undefined>(undefined);
|
|
32
|
+
let wrapperEl = $state<HTMLDivElement | undefined>(undefined);
|
|
22
33
|
|
|
23
34
|
function toggleMenu() {
|
|
24
35
|
if (!open) activeIdx = 0;
|
|
@@ -26,7 +37,7 @@
|
|
|
26
37
|
}
|
|
27
38
|
|
|
28
39
|
function activate(id: string) {
|
|
29
|
-
|
|
40
|
+
onaction?.(id);
|
|
30
41
|
open = false;
|
|
31
42
|
caretEl?.focus();
|
|
32
43
|
}
|
|
@@ -66,7 +77,7 @@
|
|
|
66
77
|
type="button"
|
|
67
78
|
class="btn btn-{variant} split-btn-primary"
|
|
68
79
|
{disabled}
|
|
69
|
-
|
|
80
|
+
onclick={() => onprimary?.()}
|
|
70
81
|
>{label}</button>
|
|
71
82
|
<button
|
|
72
83
|
bind:this={caretEl}
|
|
@@ -77,8 +88,8 @@
|
|
|
77
88
|
aria-haspopup="menu"
|
|
78
89
|
aria-expanded={open}
|
|
79
90
|
aria-controls={open ? menuId : undefined}
|
|
80
|
-
|
|
81
|
-
|
|
91
|
+
onclick={toggleMenu}
|
|
92
|
+
onkeydown={onKeyDown}
|
|
82
93
|
>
|
|
83
94
|
<svg width="10" height="10" viewBox="0 0 10 10" aria-hidden="true" focusable="false" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
|
|
84
95
|
<path d="M1 3 L5 7 L9 3" />
|
|
@@ -93,8 +104,8 @@
|
|
|
93
104
|
aria-disabled={item.disabled}
|
|
94
105
|
data-active={idx === activeIdx ? 'true' : undefined}
|
|
95
106
|
class="action-menu-item"
|
|
96
|
-
|
|
97
|
-
|
|
107
|
+
onmouseenter={() => { activeIdx = idx; }}
|
|
108
|
+
onmousedown={(e) => { e.preventDefault(); (() => { if (!item.disabled) activate(item.id); })(); }}
|
|
98
109
|
>{item.label}</li>
|
|
99
110
|
{/each}
|
|
100
111
|
</ul>
|
|
@@ -1,15 +1,26 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { onMount } from 'svelte';
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
4
|
+
interface Props {
|
|
5
|
+
maxHeight?: number;
|
|
6
|
+
showLabel?: string;
|
|
7
|
+
hideLabel?: string;
|
|
8
|
+
class?: string;
|
|
9
|
+
children?: import('svelte').Snippet;
|
|
10
|
+
}
|
|
9
11
|
|
|
10
|
-
let
|
|
11
|
-
|
|
12
|
-
|
|
12
|
+
let {
|
|
13
|
+
maxHeight = 80,
|
|
14
|
+
showLabel = 'Show more',
|
|
15
|
+
hideLabel = 'Show less',
|
|
16
|
+
class: klass = '',
|
|
17
|
+
children
|
|
18
|
+
}: Props = $props();
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
let expanded = $state(false);
|
|
22
|
+
let clipped = $state(false);
|
|
23
|
+
let bodyEl = $state<HTMLDivElement | undefined>(undefined);
|
|
13
24
|
|
|
14
25
|
onMount(() => {
|
|
15
26
|
if (bodyEl) clipped = bodyEl.scrollHeight > maxHeight;
|
|
@@ -22,10 +33,10 @@
|
|
|
22
33
|
bind:this={bodyEl}
|
|
23
34
|
style={!expanded && clipped ? `max-height:${maxHeight}px;overflow:hidden` : undefined}
|
|
24
35
|
>
|
|
25
|
-
|
|
36
|
+
{@render children?.()}
|
|
26
37
|
</div>
|
|
27
38
|
{#if !expanded && clipped}
|
|
28
|
-
<div class="spoiler-fade" aria-hidden="true"
|
|
39
|
+
<div class="spoiler-fade" aria-hidden="true"></div>
|
|
29
40
|
{/if}
|
|
30
41
|
</div>
|
|
31
42
|
{#if clipped}
|
|
@@ -33,7 +44,7 @@
|
|
|
33
44
|
type="button"
|
|
34
45
|
class="spoiler-toggle"
|
|
35
46
|
aria-expanded={expanded}
|
|
36
|
-
|
|
47
|
+
onclick={() => (expanded = !expanded)}
|
|
37
48
|
>
|
|
38
49
|
{expanded ? hideLabel : showLabel}
|
|
39
50
|
</button>
|
|
@@ -1,33 +1,46 @@
|
|
|
1
|
-
<script lang="ts">
|
|
1
|
+
<script module lang="ts">
|
|
2
2
|
export interface StackedBarSeries {
|
|
3
3
|
label: string;
|
|
4
4
|
color: string;
|
|
5
5
|
values: number[];
|
|
6
6
|
}
|
|
7
|
+
</script>
|
|
7
8
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
9
|
+
<script lang="ts">
|
|
10
|
+
|
|
11
|
+
interface Props {
|
|
12
|
+
series?: StackedBarSeries[];
|
|
13
|
+
labels?: string[];
|
|
14
|
+
height?: number;
|
|
15
|
+
normalized?: boolean;
|
|
16
|
+
ariaLabel?: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
let {
|
|
20
|
+
series = [],
|
|
21
|
+
labels = [],
|
|
22
|
+
height = 180,
|
|
23
|
+
normalized = false,
|
|
24
|
+
ariaLabel = 'Stacked bar chart'
|
|
25
|
+
}: Props = $props();
|
|
13
26
|
|
|
14
27
|
const VW = 400;
|
|
15
28
|
const PAD = { t: 10, r: 8, b: 28, l: 36 };
|
|
16
29
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
30
|
+
let n = $derived(series.length && series[0].values.length ? series[0].values.length : 0);
|
|
31
|
+
let chartW = $derived(VW - PAD.l - PAD.r);
|
|
32
|
+
let chartH = $derived(height - PAD.t - PAD.b);
|
|
33
|
+
let bot = $derived(PAD.t + chartH);
|
|
34
|
+
let barW = $derived(n > 0 ? (chartW / n) * 0.72 : 0);
|
|
35
|
+
let gap = $derived(n > 0 ? (chartW / n) * 0.28 : 0);
|
|
23
36
|
|
|
24
|
-
|
|
37
|
+
let totals = $derived(Array.from({ length: n }, (_, i) =>
|
|
25
38
|
series.reduce((s, ser) => s + (ser.values[i] ?? 0), 0)
|
|
26
|
-
);
|
|
39
|
+
));
|
|
27
40
|
|
|
28
|
-
|
|
41
|
+
let maxTotal = $derived(normalized ? 1 : (totals.length ? Math.max(...totals) : 1) || 1);
|
|
29
42
|
|
|
30
|
-
|
|
43
|
+
let stacks = $derived(Array.from({ length: n }, (_, gi) => {
|
|
31
44
|
let y = bot;
|
|
32
45
|
const total = totals[gi] || 1;
|
|
33
46
|
return series.map((ser) => {
|
|
@@ -45,18 +58,18 @@
|
|
|
45
58
|
y -= bh;
|
|
46
59
|
return rect;
|
|
47
60
|
});
|
|
48
|
-
});
|
|
61
|
+
}));
|
|
49
62
|
|
|
50
|
-
|
|
51
|
-
|
|
63
|
+
let gridFracs = $derived([0.25, 0.5, 0.75, 1]);
|
|
64
|
+
let gridLines = $derived(gridFracs.map((f) => ({
|
|
52
65
|
y: PAD.t + (1 - f) * chartH,
|
|
53
66
|
label: normalized ? `${Math.round(f * 100)}%` : String(Math.round(f * maxTotal)),
|
|
54
|
-
}));
|
|
67
|
+
})));
|
|
55
68
|
|
|
56
|
-
|
|
69
|
+
let xLabels = $derived(Array.from({ length: n }, (_, i) => ({
|
|
57
70
|
x: PAD.l + i * (barW + gap) + gap / 2 + barW / 2,
|
|
58
71
|
text: labels[i] ?? String(i),
|
|
59
|
-
}));
|
|
72
|
+
})));
|
|
60
73
|
</script>
|
|
61
74
|
|
|
62
75
|
{#if n > 0}
|
|
@@ -1,28 +1,40 @@
|
|
|
1
|
-
<script lang="ts">
|
|
1
|
+
<script module lang="ts">
|
|
2
2
|
export interface StackedProgressSegment {
|
|
3
3
|
label: string;
|
|
4
4
|
value: number;
|
|
5
5
|
color: string;
|
|
6
6
|
}
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
7
|
+
</script>
|
|
8
|
+
|
|
9
|
+
<script lang="ts">
|
|
10
|
+
interface Props {
|
|
11
|
+
segments: StackedProgressSegment[];
|
|
12
|
+
total?: number | undefined;
|
|
13
|
+
ariaLabel?: string | undefined;
|
|
14
|
+
showLegend?: boolean;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
let {
|
|
18
|
+
segments,
|
|
19
|
+
total = undefined,
|
|
20
|
+
ariaLabel = undefined,
|
|
21
|
+
showLegend = true
|
|
22
|
+
}: Props = $props();
|
|
23
|
+
let sum = $derived(total ?? segments.reduce((a, s) => a + s.value, 0));
|
|
24
|
+
let text = $derived(ariaLabel ?? segments.map((s) => `${s.label} ${Math.round((s.value / sum) * 100)}%`).join(', '));
|
|
13
25
|
</script>
|
|
14
26
|
|
|
15
27
|
<div class="sp" role="img" aria-label={text}>
|
|
16
28
|
<div class="sp-bar" aria-hidden="true">
|
|
17
29
|
{#each segments as { label, value, color }}
|
|
18
|
-
<div class="sp-seg" style="width:{((value / sum) * 100).toFixed(2)}%;background:{color}"
|
|
30
|
+
<div class="sp-seg" style="width:{((value / sum) * 100).toFixed(2)}%;background:{color}"></div>
|
|
19
31
|
{/each}
|
|
20
32
|
</div>
|
|
21
33
|
{#if showLegend}
|
|
22
34
|
<div class="sp-legend" aria-hidden="true">
|
|
23
35
|
{#each segments as { label, value, color }}
|
|
24
36
|
<span class="sp-item">
|
|
25
|
-
<span class="sp-dot" style="background:{color}"
|
|
37
|
+
<span class="sp-dot" style="background:{color}"></span>
|
|
26
38
|
{label}
|
|
27
39
|
<span class="sp-pct">{Math.round((value / sum) * 100)}%</span>
|
|
28
40
|
</span>
|
|
@@ -1,17 +1,28 @@
|
|
|
1
|
-
<script
|
|
1
|
+
<script module lang="ts">
|
|
2
2
|
let counter = 0;
|
|
3
3
|
</script>
|
|
4
4
|
|
|
5
5
|
<script lang="ts">
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
6
|
+
interface Props {
|
|
7
|
+
label: string;
|
|
8
|
+
value?: number;
|
|
9
|
+
max?: number;
|
|
10
|
+
readOnly?: boolean;
|
|
11
|
+
size?: 'sm' | 'md';
|
|
12
|
+
onChange?: ((v: number) => void) | undefined;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
let {
|
|
16
|
+
label,
|
|
17
|
+
value = $bindable(0),
|
|
18
|
+
max = 5,
|
|
19
|
+
readOnly = false,
|
|
20
|
+
size = 'md',
|
|
21
|
+
onChange = undefined
|
|
22
|
+
}: Props = $props();
|
|
12
23
|
|
|
13
24
|
const gid = `dash-ui-sr-${++counter}`;
|
|
14
|
-
let hovered = 0;
|
|
25
|
+
let hovered = $state(0);
|
|
15
26
|
|
|
16
27
|
function pick(star: number) {
|
|
17
28
|
value = star;
|
|
@@ -42,8 +53,8 @@
|
|
|
42
53
|
<label
|
|
43
54
|
for="{gid}-{star}"
|
|
44
55
|
class="star-label{on ? ' star-label--on' : ''}"
|
|
45
|
-
|
|
46
|
-
|
|
56
|
+
onmouseenter={() => (hovered = star)}
|
|
57
|
+
onmouseleave={() => (hovered = 0)}
|
|
47
58
|
>
|
|
48
59
|
<input
|
|
49
60
|
type="radio"
|
|
@@ -53,7 +64,7 @@
|
|
|
53
64
|
checked={value === star}
|
|
54
65
|
class="star-radio"
|
|
55
66
|
aria-label="{star} out of {max}"
|
|
56
|
-
|
|
67
|
+
onchange={() => pick(star)}
|
|
57
68
|
/>
|
|
58
69
|
<svg viewBox="0 0 24 24" fill={on ? 'currentColor' : 'none'} stroke="currentColor" stroke-width="1.5" aria-hidden="true" focusable="false">
|
|
59
70
|
<polygon points="12,2 15.09,8.26 22,9.27 17,14.14 18.18,21.02 12,17.77 5.82,21.02 7,14.14 2,9.27 8.91,8.26" />
|
|
@@ -1,20 +1,42 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
2
3
|
import Card from './Card.svelte';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
4
|
+
|
|
5
|
+
interface Props {
|
|
6
|
+
label: string;
|
|
7
|
+
value?: string;
|
|
8
|
+
unit?: string | undefined;
|
|
9
|
+
sub?: string | undefined;
|
|
10
|
+
delta?: string | undefined;
|
|
11
|
+
deltaDir?: 'up' | 'down' | 'neutral';
|
|
12
|
+
span?: number | undefined;
|
|
13
|
+
color?: string | undefined;
|
|
14
|
+
/** Snippet override for the value display. Renamed from the old `value`
|
|
15
|
+
* named slot to avoid colliding with the `value` prop in Svelte 5. */
|
|
16
|
+
valueSlot?: Snippet;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
let {
|
|
20
|
+
label,
|
|
21
|
+
value = '',
|
|
22
|
+
unit = undefined,
|
|
23
|
+
sub = undefined,
|
|
24
|
+
delta = undefined,
|
|
25
|
+
deltaDir = 'neutral',
|
|
26
|
+
span = undefined,
|
|
27
|
+
color = undefined,
|
|
28
|
+
valueSlot,
|
|
29
|
+
}: Props = $props();
|
|
30
|
+
|
|
31
|
+
let deltaClass = $derived(
|
|
32
|
+
deltaDir === 'up' ? 'delta-up' : deltaDir === 'down' ? 'delta-down' : '',
|
|
33
|
+
);
|
|
12
34
|
</script>
|
|
13
35
|
|
|
14
36
|
<Card {span}>
|
|
15
37
|
<h3>{label}</h3>
|
|
16
38
|
<div class="stat" style={color ? `color:${color};` : ''}>
|
|
17
|
-
|
|
39
|
+
{#if valueSlot}{@render valueSlot()}{:else}{value}{/if}{#if unit}<span class="unit">{unit}</span>{/if}
|
|
18
40
|
</div>
|
|
19
41
|
{#if sub || delta}
|
|
20
42
|
<div class="submeta">
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
interface Props {
|
|
3
|
+
color: string;
|
|
4
|
+
text: string;
|
|
5
|
+
textColor?: string | undefined;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
let { color, text, textColor = undefined }: Props = $props();
|
|
5
9
|
</script>
|
|
6
10
|
|
|
7
11
|
<span style="display:inline-flex;align-items:center;gap:6px;color:{textColor ?? color};font-size:12px;">
|
|
@@ -1,25 +1,37 @@
|
|
|
1
|
-
<script lang="ts">
|
|
1
|
+
<script module lang="ts">
|
|
2
2
|
export interface StepChartSeries {
|
|
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?: StepChartSeries[];
|
|
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 = 'Step 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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
28
|
+
let allValues = $derived(series.flatMap((s) => s.values));
|
|
29
|
+
let minV = $derived(allValues.length ? Math.min(...allValues) : 0);
|
|
30
|
+
let maxV = $derived(allValues.length ? Math.max(...allValues) : 1);
|
|
31
|
+
let range = $derived(maxV - minV || 1);
|
|
32
|
+
let chartW = $derived(VW - PAD.l - PAD.r);
|
|
33
|
+
let chartH = $derived(height - PAD.t - PAD.b);
|
|
34
|
+
let n = $derived(series[0]?.values.length ?? 0);
|
|
23
35
|
|
|
24
36
|
function toX(i: number): number {
|
|
25
37
|
return PAD.l + (n > 1 ? (i / (n - 1)) * chartW : chartW / 2);
|
|
@@ -48,9 +60,9 @@
|
|
|
48
60
|
return d;
|
|
49
61
|
}
|
|
50
62
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
63
|
+
let gridLines = $derived([0, 0.25, 0.5, 0.75, 1].map((f) => PAD.t + (1 - f) * chartH));
|
|
64
|
+
let paths = $derived(series.map((s) => ({ color: s.color, label: s.label, d: stepPath(s) })));
|
|
65
|
+
let areas = $derived(series.map((s) => ({ color: s.color, label: s.label, d: stepArea(s) })));
|
|
54
66
|
</script>
|
|
55
67
|
|
|
56
68
|
<div role="img" aria-label={ariaLabel} style="width:100%;">
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<script
|
|
1
|
+
<script module lang="ts">
|
|
2
2
|
export interface StepperStep {
|
|
3
3
|
id: string;
|
|
4
4
|
label: string;
|
|
@@ -6,12 +6,16 @@
|
|
|
6
6
|
</script>
|
|
7
7
|
|
|
8
8
|
<script lang="ts">
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
9
|
+
interface Props {
|
|
10
|
+
steps: StepperStep[];
|
|
11
|
+
active: string;
|
|
12
|
+
class?: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
let { steps, active, class: className = '' }: Props = $props();
|
|
16
|
+
|
|
13
17
|
|
|
14
|
-
|
|
18
|
+
let activeIdx = $derived(steps.findIndex(s => s.id === active));
|
|
15
19
|
</script>
|
|
16
20
|
|
|
17
21
|
<nav aria-label="Progress" class="stepper {className}">
|
|
@@ -1,13 +1,20 @@
|
|
|
1
|
-
<script lang="ts">
|
|
1
|
+
<script module lang="ts">
|
|
2
2
|
export interface StreamSeries {
|
|
3
3
|
label: string;
|
|
4
4
|
values: number[];
|
|
5
5
|
color?: string;
|
|
6
6
|
}
|
|
7
|
+
</script>
|
|
8
|
+
|
|
9
|
+
<script lang="ts">
|
|
10
|
+
|
|
11
|
+
interface Props {
|
|
12
|
+
labels?: string[];
|
|
13
|
+
series?: StreamSeries[];
|
|
14
|
+
ariaLabel?: string;
|
|
15
|
+
}
|
|
7
16
|
|
|
8
|
-
|
|
9
|
-
export let series: StreamSeries[] = [];
|
|
10
|
-
export let ariaLabel: string = 'Stream graph';
|
|
17
|
+
let { labels = [], series = [], ariaLabel = 'Stream graph' }: Props = $props();
|
|
11
18
|
|
|
12
19
|
const VW = 380;
|
|
13
20
|
const VH = 120;
|
|
@@ -17,20 +24,20 @@
|
|
|
17
24
|
const PAD_B = 20;
|
|
18
25
|
const COLORS = ['#006FFF', '#00C8C8', '#F5A623', '#7FB6FF', '#A878F5', '#F56342'];
|
|
19
26
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
27
|
+
let n = $derived(labels.length);
|
|
28
|
+
let TRACK_W = $derived(VW - PAD_L - PAD_R);
|
|
29
|
+
let TRACK_H = $derived(VH - PAD_T - PAD_B);
|
|
23
30
|
|
|
24
|
-
|
|
31
|
+
let totals = $derived(Array.from({ length: n }, (_, i) =>
|
|
25
32
|
series.reduce((sum, s) => sum + (s.values[i] ?? 0), 0)
|
|
26
|
-
);
|
|
27
|
-
|
|
33
|
+
));
|
|
34
|
+
let maxTotal = $derived(Math.max(...totals, 1));
|
|
28
35
|
|
|
29
36
|
function xOf(i: number): number {
|
|
30
37
|
return n > 1 ? PAD_L + (i / (n - 1)) * TRACK_W : PAD_L + TRACK_W / 2;
|
|
31
38
|
}
|
|
32
39
|
|
|
33
|
-
|
|
40
|
+
let layers = $derived(series.map((s, si) => {
|
|
34
41
|
const tops: number[] = [];
|
|
35
42
|
const bots: number[] = [];
|
|
36
43
|
for (let i = 0; i < n; i++) {
|
|
@@ -43,7 +50,7 @@
|
|
|
43
50
|
tops[i] = PAD_T + (top / maxTotal) * TRACK_H;
|
|
44
51
|
}
|
|
45
52
|
return { tops, bots, color: s.color ?? COLORS[si % COLORS.length] };
|
|
46
|
-
});
|
|
53
|
+
}));
|
|
47
54
|
|
|
48
55
|
function buildArea(tops: number[], bots: number[]): string {
|
|
49
56
|
const fwd = tops.map((y, i) => {
|
|
@@ -1,9 +1,19 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
interface Props {
|
|
3
|
+
data?: { label: string; value: number }[];
|
|
4
|
+
height?: number;
|
|
5
|
+
colorLow?: string;
|
|
6
|
+
colorHigh?: string;
|
|
7
|
+
ariaLabel?: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
let {
|
|
11
|
+
data = [],
|
|
12
|
+
height = 48,
|
|
13
|
+
colorLow = '#0A2840',
|
|
14
|
+
colorHigh = '#FF4040',
|
|
15
|
+
ariaLabel = 'Stripe chart'
|
|
16
|
+
}: Props = $props();
|
|
7
17
|
|
|
8
18
|
function hexToRgb(hex: string): [number, number, number] {
|
|
9
19
|
const h = hex.replace('#', '');
|
|
@@ -19,18 +29,18 @@
|
|
|
19
29
|
return `rgb(${lerp(r1, r2, t)},${lerp(g1, g2, t)},${lerp(b1, b2, t)})`;
|
|
20
30
|
}
|
|
21
31
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
32
|
+
let vals = $derived(data.map((d) => d.value));
|
|
33
|
+
let min = $derived(vals.length ? Math.min(...vals) : 0);
|
|
34
|
+
let max = $derived(vals.length ? Math.max(...vals) : 1);
|
|
35
|
+
let range = $derived((max - min) || 1);
|
|
36
|
+
let sw = $derived(400 / (data.length || 1));
|
|
37
|
+
let stripes = $derived(data.map((d, i) => ({
|
|
28
38
|
x: i * sw,
|
|
29
39
|
w: sw,
|
|
30
40
|
color: interpColor(colorLow, colorHigh, (d.value - min) / range),
|
|
31
41
|
label: d.label,
|
|
32
42
|
value: d.value,
|
|
33
|
-
}));
|
|
43
|
+
})));
|
|
34
44
|
</script>
|
|
35
45
|
|
|
36
46
|
<div role="img" aria-label={ariaLabel} style="line-height:0;">
|
|
@@ -1,13 +1,20 @@
|
|
|
1
|
-
<script lang="ts">
|
|
1
|
+
<script module lang="ts">
|
|
2
2
|
export interface SunburstNode {
|
|
3
3
|
label: string;
|
|
4
4
|
value?: number;
|
|
5
5
|
color?: string;
|
|
6
6
|
children?: SunburstNode[];
|
|
7
7
|
}
|
|
8
|
+
</script>
|
|
9
|
+
|
|
10
|
+
<script lang="ts">
|
|
11
|
+
|
|
12
|
+
interface Props {
|
|
13
|
+
root: SunburstNode;
|
|
14
|
+
ariaLabel?: string;
|
|
15
|
+
}
|
|
8
16
|
|
|
9
|
-
|
|
10
|
-
export let ariaLabel: string = 'Sunburst chart';
|
|
17
|
+
let { root, ariaLabel = 'Sunburst chart' }: Props = $props();
|
|
11
18
|
|
|
12
19
|
const PALETTE = ['#006FFF', '#00C875', '#A78BFA', '#F5A623', '#50B8E7', '#F04949'];
|
|
13
20
|
const CX = 160, CY = 160, R_HOLE = 48, R_MID = 97, R_OUTER = 142, GAP = 0.01;
|
|
@@ -21,7 +28,7 @@
|
|
|
21
28
|
type PathData = { d: string; fill: string };
|
|
22
29
|
type LabelData = { x: number; y: number; anchor: string; text: string };
|
|
23
30
|
|
|
24
|
-
|
|
31
|
+
let { paths, labels, total } = $derived((() => {
|
|
25
32
|
const items = root.children ?? [];
|
|
26
33
|
const total = items.reduce((s, c) => s + (c.value ?? c.children?.reduce((cs, x) => cs + (x.value ?? 0), 0) ?? 0), 0);
|
|
27
34
|
if (!total) return { paths: [] as PathData[], labels: [] as LabelData[], total: 0 };
|