@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,14 +1,26 @@
|
|
|
1
|
-
<script lang="ts">
|
|
1
|
+
<script module lang="ts">
|
|
2
2
|
export interface RadarSeries {
|
|
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?: RadarSeries[];
|
|
13
|
+
axes?: string[];
|
|
14
|
+
height?: number;
|
|
15
|
+
ariaLabel?: string;
|
|
16
|
+
}
|
|
7
17
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
18
|
+
let {
|
|
19
|
+
series = [],
|
|
20
|
+
axes = [],
|
|
21
|
+
height = 200,
|
|
22
|
+
ariaLabel = 'Radar chart'
|
|
23
|
+
}: Props = $props();
|
|
12
24
|
|
|
13
25
|
const VW = 400;
|
|
14
26
|
const PAD = 36;
|
|
@@ -21,36 +33,36 @@
|
|
|
21
33
|
return coords.map(([x, y]) => `${x.toFixed(1)},${y.toFixed(1)}`).join(' ');
|
|
22
34
|
}
|
|
23
35
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
36
|
+
let n = $derived(axes.length);
|
|
37
|
+
let cx = $derived(VW / 2);
|
|
38
|
+
let cy = $derived(height / 2);
|
|
39
|
+
let R = $derived(Math.min(cx, cy) - PAD);
|
|
40
|
+
let angles = $derived(axes.map((_, i) => (2 * Math.PI * i) / n - Math.PI / 2));
|
|
29
41
|
|
|
30
|
-
|
|
42
|
+
let rings = $derived(n >= 3
|
|
31
43
|
? [0.25, 0.5, 0.75, 1.0].map((f) => makePts(angles.map((a) => pt(cx, cy, R * f, a))))
|
|
32
|
-
: [];
|
|
44
|
+
: []);
|
|
33
45
|
|
|
34
|
-
|
|
46
|
+
let axisLines = $derived(n >= 3
|
|
35
47
|
? angles.map((a) => { const [x, y] = pt(cx, cy, R, a); return { x: x.toFixed(1), y: y.toFixed(1) }; })
|
|
36
|
-
: [];
|
|
48
|
+
: []);
|
|
37
49
|
|
|
38
|
-
|
|
50
|
+
let axisLabels = $derived(n >= 3
|
|
39
51
|
? axes.map((label, i) => {
|
|
40
52
|
const [x, y] = pt(cx, cy, R + 16, angles[i]);
|
|
41
53
|
const cos = Math.cos(angles[i]);
|
|
42
54
|
const anchor = Math.abs(cos) < 0.3 ? 'middle' : cos < 0 ? 'end' : 'start';
|
|
43
55
|
return { x: x.toFixed(1), y: y.toFixed(1), label, anchor };
|
|
44
56
|
})
|
|
45
|
-
: [];
|
|
57
|
+
: []);
|
|
46
58
|
|
|
47
|
-
|
|
59
|
+
let polygons = $derived(n >= 3
|
|
48
60
|
? series.map((s) => ({
|
|
49
61
|
pts: makePts(angles.map((a, i) => pt(cx, cy, R * Math.max(0, Math.min(1, s.values[i] ?? 0)), a))),
|
|
50
62
|
color: s.color,
|
|
51
63
|
label: s.label,
|
|
52
64
|
}))
|
|
53
|
-
: [];
|
|
65
|
+
: []);
|
|
54
66
|
</script>
|
|
55
67
|
|
|
56
68
|
<div role="img" aria-label={ariaLabel} style="width:100%;">
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<script lang="ts">
|
|
1
|
+
<script module lang="ts">
|
|
2
2
|
export interface RadialBarItem {
|
|
3
3
|
label: string;
|
|
4
4
|
value: number;
|
|
@@ -6,9 +6,16 @@
|
|
|
6
6
|
color?: string;
|
|
7
7
|
unit?: string;
|
|
8
8
|
}
|
|
9
|
+
</script>
|
|
10
|
+
|
|
11
|
+
<script lang="ts">
|
|
12
|
+
|
|
13
|
+
interface Props {
|
|
14
|
+
items?: RadialBarItem[];
|
|
15
|
+
ariaLabel?: string;
|
|
16
|
+
}
|
|
9
17
|
|
|
10
|
-
|
|
11
|
-
export let ariaLabel = 'Radial bar chart';
|
|
18
|
+
let { items = [], ariaLabel = 'Radial bar chart' }: Props = $props();
|
|
12
19
|
|
|
13
20
|
const W = 280;
|
|
14
21
|
const H = 160;
|
|
@@ -38,9 +45,9 @@
|
|
|
38
45
|
return `M${x1},${y1} A${r},${r} 0 ${sweep > Math.PI ? 1 : 0} 1 ${x2},${y2}`;
|
|
39
46
|
}
|
|
40
47
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
48
|
+
let n = $derived(items.length);
|
|
49
|
+
let yStart = $derived(CY - ((n - 1) * ITEM_H) / 2);
|
|
50
|
+
let rings = $derived(items.map((item, i) => {
|
|
44
51
|
const r = MIN_R + (n - 1 - i) * (RING_W + RING_GAP);
|
|
45
52
|
const frac = Math.min(item.value / (item.max || 1), 1);
|
|
46
53
|
const color = item.color ?? '#006FFF';
|
|
@@ -56,7 +63,7 @@
|
|
|
56
63
|
value: item.value,
|
|
57
64
|
unit: item.unit ?? '',
|
|
58
65
|
};
|
|
59
|
-
});
|
|
66
|
+
}));
|
|
60
67
|
</script>
|
|
61
68
|
|
|
62
69
|
{#if items.length}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<script
|
|
1
|
+
<script module lang="ts">
|
|
2
2
|
let counter = 0;
|
|
3
3
|
export interface RadioOption {
|
|
4
4
|
value: string;
|
|
@@ -9,13 +9,25 @@
|
|
|
9
9
|
</script>
|
|
10
10
|
|
|
11
11
|
<script lang="ts">
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
12
|
+
interface Props {
|
|
13
|
+
legend: string;
|
|
14
|
+
name?: string | undefined;
|
|
15
|
+
options?: RadioOption[];
|
|
16
|
+
value?: string | undefined;
|
|
17
|
+
srOnlyLegend?: boolean;
|
|
18
|
+
horizontal?: boolean;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
let {
|
|
22
|
+
legend,
|
|
23
|
+
name = undefined,
|
|
24
|
+
options = [],
|
|
25
|
+
value = $bindable(undefined),
|
|
26
|
+
srOnlyLegend = false,
|
|
27
|
+
horizontal = false
|
|
28
|
+
}: Props = $props();
|
|
18
29
|
|
|
30
|
+
// svelte-ignore state_referenced_locally
|
|
19
31
|
const groupName = name ?? `dash-ui-rg-${++counter}`;
|
|
20
32
|
</script>
|
|
21
33
|
|
|
@@ -35,7 +47,7 @@
|
|
|
35
47
|
checked={value === opt.value}
|
|
36
48
|
disabled={opt.disabled}
|
|
37
49
|
class="radio"
|
|
38
|
-
|
|
50
|
+
onchange={() => { value = opt.value; }}
|
|
39
51
|
/>
|
|
40
52
|
<span class="radio-text">
|
|
41
53
|
<span>{opt.label}</span>
|
|
@@ -1,29 +1,41 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
|
|
2
|
+
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
4
|
+
interface Props {
|
|
5
|
+
label?: string | undefined;
|
|
6
|
+
min?: number;
|
|
7
|
+
max?: number;
|
|
8
|
+
step?: number;
|
|
9
|
+
low?: number;
|
|
10
|
+
high?: number;
|
|
11
|
+
suffix?: string | undefined;
|
|
12
|
+
disabled?: boolean;
|
|
13
|
+
onchange?: (payload: [number, number]) => void;
|
|
14
|
+
}
|
|
14
15
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
let {
|
|
17
|
+
label = undefined,
|
|
18
|
+
min = 0,
|
|
19
|
+
max = 100,
|
|
20
|
+
step = 1,
|
|
21
|
+
low = $bindable(0),
|
|
22
|
+
high = $bindable(100),
|
|
23
|
+
suffix = undefined,
|
|
24
|
+
disabled = false,
|
|
25
|
+
onchange,
|
|
26
|
+
}: Props = $props();
|
|
27
|
+
let lowPct = $derived(max === min ? 0 : ((low - min) / (max - min)) * 100);
|
|
28
|
+
let highPct = $derived(max === min ? 0 : ((high - min) / (max - min)) * 100);
|
|
29
|
+
let lowOnTop = $derived(low >= max - step);
|
|
18
30
|
|
|
19
31
|
function handleLow(e: Event) {
|
|
20
32
|
low = Math.min(Number((e.target as HTMLInputElement).value), high - step);
|
|
21
|
-
|
|
33
|
+
onchange?.([low, high]);
|
|
22
34
|
}
|
|
23
35
|
|
|
24
36
|
function handleHigh(e: Event) {
|
|
25
37
|
high = Math.max(Number((e.target as HTMLInputElement).value), low + step);
|
|
26
|
-
|
|
38
|
+
onchange?.([low, high]);
|
|
27
39
|
}
|
|
28
40
|
</script>
|
|
29
41
|
|
|
@@ -51,7 +63,7 @@
|
|
|
51
63
|
style="z-index:{lowOnTop ? 2 : 1}"
|
|
52
64
|
aria-label={label ? `${label} minimum` : 'Minimum'}
|
|
53
65
|
aria-valuetext={suffix ? `${low}${suffix}` : String(low)}
|
|
54
|
-
|
|
66
|
+
oninput={handleLow}
|
|
55
67
|
/>
|
|
56
68
|
<input
|
|
57
69
|
type="range"
|
|
@@ -62,7 +74,7 @@
|
|
|
62
74
|
style="z-index:{lowOnTop ? 1 : 2}"
|
|
63
75
|
aria-label={label ? `${label} maximum` : 'Maximum'}
|
|
64
76
|
aria-valuetext={suffix ? `${high}${suffix}` : String(high)}
|
|
65
|
-
|
|
77
|
+
oninput={handleHigh}
|
|
66
78
|
/>
|
|
67
79
|
</div>
|
|
68
80
|
</div>
|
|
@@ -1,17 +1,29 @@
|
|
|
1
|
-
<script lang="ts">
|
|
1
|
+
<script module lang="ts">
|
|
2
2
|
export interface RankedItem {
|
|
3
3
|
label: string;
|
|
4
4
|
value: number;
|
|
5
5
|
sublabel?: string;
|
|
6
6
|
color?: string;
|
|
7
7
|
}
|
|
8
|
+
</script>
|
|
9
|
+
|
|
10
|
+
<script lang="ts">
|
|
11
|
+
|
|
12
|
+
interface Props {
|
|
13
|
+
items: RankedItem[];
|
|
14
|
+
unit?: string | undefined;
|
|
15
|
+
max?: number | undefined;
|
|
16
|
+
ariaLabel?: string;
|
|
17
|
+
}
|
|
8
18
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
19
|
+
let {
|
|
20
|
+
items,
|
|
21
|
+
unit = undefined,
|
|
22
|
+
max = undefined,
|
|
23
|
+
ariaLabel = 'Ranked list'
|
|
24
|
+
}: Props = $props();
|
|
13
25
|
|
|
14
|
-
|
|
26
|
+
let resolvedMax = $derived(max ?? Math.max(...items.map((i) => i.value), 1));
|
|
15
27
|
</script>
|
|
16
28
|
|
|
17
29
|
<table class="rl" aria-label={ariaLabel}>
|
|
@@ -1,17 +1,33 @@
|
|
|
1
|
-
<script
|
|
1
|
+
<script module lang="ts">
|
|
2
2
|
export type ResizableOrientation = 'horizontal' | 'vertical';
|
|
3
3
|
</script>
|
|
4
4
|
|
|
5
5
|
<script lang="ts">
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
6
|
+
interface Props {
|
|
7
|
+
defaultSize?: number;
|
|
8
|
+
min?: number;
|
|
9
|
+
max?: number;
|
|
10
|
+
orientation?: ResizableOrientation;
|
|
11
|
+
label?: string;
|
|
12
|
+
style?: string;
|
|
13
|
+
first?: import('svelte').Snippet;
|
|
14
|
+
second?: import('svelte').Snippet;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
let {
|
|
18
|
+
defaultSize = 50,
|
|
19
|
+
min = 20,
|
|
20
|
+
max = 80,
|
|
21
|
+
orientation = 'vertical',
|
|
22
|
+
label = 'Resize panels',
|
|
23
|
+
style = '',
|
|
24
|
+
first,
|
|
25
|
+
second
|
|
26
|
+
}: Props = $props();
|
|
12
27
|
|
|
13
|
-
|
|
14
|
-
let
|
|
28
|
+
// svelte-ignore state_referenced_locally
|
|
29
|
+
let size = $state(defaultSize);
|
|
30
|
+
let container = $state<HTMLDivElement | undefined>(undefined);
|
|
15
31
|
|
|
16
32
|
function clamp(v: number) { return Math.min(max, Math.max(min, v)); }
|
|
17
33
|
|
|
@@ -49,16 +65,16 @@
|
|
|
49
65
|
if (e.key === 'End') { e.preventDefault(); size = max; }
|
|
50
66
|
}
|
|
51
67
|
|
|
52
|
-
|
|
68
|
+
let firstStyle = $derived(orientation === 'vertical'
|
|
53
69
|
? `flex: 0 0 ${size}%; min-width: 0;`
|
|
54
|
-
: `flex: 0 0 ${size}%; min-height: 0
|
|
70
|
+
: `flex: 0 0 ${size}%; min-height: 0;`);
|
|
55
71
|
</script>
|
|
56
72
|
|
|
57
73
|
<div bind:this={container} class="rp rp--{orientation}" {style}>
|
|
58
74
|
<div class="rp-pane" style={firstStyle}>
|
|
59
|
-
|
|
75
|
+
{@render first?.()}
|
|
60
76
|
</div>
|
|
61
|
-
<!-- svelte-ignore
|
|
77
|
+
<!-- svelte-ignore a11y_no_noninteractive_tabindex, a11y_no_noninteractive_element_interactions -->
|
|
62
78
|
<div
|
|
63
79
|
role="separator"
|
|
64
80
|
tabindex="0"
|
|
@@ -68,10 +84,10 @@
|
|
|
68
84
|
aria-valuemax={max}
|
|
69
85
|
aria-label={label}
|
|
70
86
|
class="rp-handle"
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
87
|
+
onmousedown={onMouseDown}
|
|
88
|
+
onkeydown={onKeyDown}
|
|
89
|
+
></div>
|
|
74
90
|
<div class="rp-pane rp-pane--second">
|
|
75
|
-
|
|
91
|
+
{@render second?.()}
|
|
76
92
|
</div>
|
|
77
93
|
</div>
|
|
@@ -1,14 +1,26 @@
|
|
|
1
|
-
<script lang="ts">
|
|
1
|
+
<script module lang="ts">
|
|
2
2
|
export interface RidgelineSeries {
|
|
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
|
+
series?: RidgelineSeries[];
|
|
13
|
+
xRange?: [number, number] | undefined;
|
|
14
|
+
height?: number;
|
|
15
|
+
ariaLabel?: string;
|
|
16
|
+
}
|
|
7
17
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
18
|
+
let {
|
|
19
|
+
series = [],
|
|
20
|
+
xRange = undefined,
|
|
21
|
+
height = 180,
|
|
22
|
+
ariaLabel = 'Ridgeline plot'
|
|
23
|
+
}: Props = $props();
|
|
12
24
|
|
|
13
25
|
const COLORS = ['#006FFF', '#00C8C8', '#F5A623', '#7FB6FF', '#A878F5', '#F56342'];
|
|
14
26
|
const SQRT_TWO_PI = Math.sqrt(2 * Math.PI);
|
|
@@ -31,31 +43,31 @@
|
|
|
31
43
|
}
|
|
32
44
|
|
|
33
45
|
const VW = 380;
|
|
34
|
-
|
|
46
|
+
let VH = $derived(height);
|
|
35
47
|
const PAD_L = 56;
|
|
36
48
|
const PAD_R = 12;
|
|
37
49
|
const PAD_T = 16;
|
|
38
50
|
const PAD_B = 20;
|
|
39
51
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
52
|
+
let TRACK_W = $derived(VW - PAD_L - PAD_R);
|
|
53
|
+
let TRACK_H = $derived(VH - PAD_T - PAD_B);
|
|
54
|
+
let n = $derived(series.length);
|
|
55
|
+
let rowH = $derived(TRACK_H / n);
|
|
56
|
+
let maxDensH = $derived(rowH * 1.6);
|
|
45
57
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
58
|
+
let allVals = $derived(series.flatMap(s => s.values));
|
|
59
|
+
let xMin = $derived(xRange ? xRange[0] : Math.min(...allVals));
|
|
60
|
+
let xMax = $derived(xRange ? xRange[1] : Math.max(...allVals));
|
|
49
61
|
|
|
50
|
-
|
|
62
|
+
let evalPts = $derived(Array.from({ length: NUM_PTS }, (_, i) =>
|
|
51
63
|
xMin + (i / (NUM_PTS - 1)) * (xMax - xMin)
|
|
52
|
-
);
|
|
64
|
+
));
|
|
53
65
|
|
|
54
66
|
function xSvg(v: number): number {
|
|
55
67
|
return PAD_L + ((v - xMin) / (xMax - xMin)) * TRACK_W;
|
|
56
68
|
}
|
|
57
69
|
|
|
58
|
-
|
|
70
|
+
let ridges = $derived(series.map((s, si) => {
|
|
59
71
|
const h = bw(s.values);
|
|
60
72
|
const dens = kde(s.values, h, evalPts);
|
|
61
73
|
const maxD = Math.max(...dens, 1e-9);
|
|
@@ -70,14 +82,14 @@
|
|
|
70
82
|
].join(' ');
|
|
71
83
|
|
|
72
84
|
return { d, baselineY, color, label: s.label };
|
|
73
|
-
});
|
|
85
|
+
}));
|
|
74
86
|
|
|
75
|
-
|
|
87
|
+
let reversedRidges = $derived([...ridges].reverse());
|
|
76
88
|
|
|
77
|
-
|
|
89
|
+
let xTicks = $derived([0, 0.25, 0.5, 0.75, 1].map(t => {
|
|
78
90
|
const v = xMin + t * (xMax - xMin);
|
|
79
91
|
return { v, x: xSvg(v) };
|
|
80
|
-
});
|
|
92
|
+
}));
|
|
81
93
|
</script>
|
|
82
94
|
|
|
83
95
|
<div role="img" aria-label={ariaLabel} style="width:100%;">
|
|
@@ -1,12 +1,22 @@
|
|
|
1
|
-
<script
|
|
1
|
+
<script module lang="ts">
|
|
2
2
|
let counter = 0;
|
|
3
3
|
</script>
|
|
4
4
|
|
|
5
5
|
<script lang="ts">
|
|
6
6
|
import Toggle from './Toggle.svelte';
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
interface Props {
|
|
8
|
+
title: string;
|
|
9
|
+
description: string;
|
|
10
|
+
on?: boolean;
|
|
11
|
+
ontoggle?: (value: boolean) => void;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
let {
|
|
15
|
+
title,
|
|
16
|
+
description,
|
|
17
|
+
on = $bindable(false),
|
|
18
|
+
ontoggle,
|
|
19
|
+
}: Props = $props();
|
|
10
20
|
const descId = `dash-ui-rowtoggle-${++counter}`;
|
|
11
21
|
</script>
|
|
12
22
|
|
|
@@ -15,5 +25,5 @@
|
|
|
15
25
|
<div class="t">{title}</div>
|
|
16
26
|
<div class="d" id={descId}>{description}</div>
|
|
17
27
|
</div>
|
|
18
|
-
<Toggle bind:on ariaLabel={title} ariaDescribedBy={descId}
|
|
28
|
+
<Toggle bind:on ariaLabel={title} ariaDescribedBy={descId} {ontoggle} />
|
|
19
29
|
</div>
|
|
@@ -1,11 +1,23 @@
|
|
|
1
|
-
<script lang="ts">
|
|
1
|
+
<script module lang="ts">
|
|
2
2
|
export interface SankeyLink { source: string; target: string; value: number; }
|
|
3
3
|
export interface SankeyNode { id: string; label: string; color?: string; }
|
|
4
|
+
</script>
|
|
5
|
+
|
|
6
|
+
<script lang="ts">
|
|
7
|
+
|
|
8
|
+
interface Props {
|
|
9
|
+
nodes?: SankeyNode[];
|
|
10
|
+
links?: SankeyLink[];
|
|
11
|
+
height?: number;
|
|
12
|
+
ariaLabel?: string;
|
|
13
|
+
}
|
|
4
14
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
15
|
+
let {
|
|
16
|
+
nodes = [],
|
|
17
|
+
links = [],
|
|
18
|
+
height = 180,
|
|
19
|
+
ariaLabel = 'Sankey diagram'
|
|
20
|
+
}: Props = $props();
|
|
9
21
|
|
|
10
22
|
const VW = 320;
|
|
11
23
|
const NODE_W = 10;
|
|
@@ -16,7 +28,7 @@
|
|
|
16
28
|
interface PositionedNode { id: string; label: string; color: string; x: number; y: number; h: number; side: 'left' | 'right'; }
|
|
17
29
|
interface PathData { d: string; color: string; }
|
|
18
30
|
|
|
19
|
-
|
|
31
|
+
let { positioned, paths } = $derived((() => {
|
|
20
32
|
if (!nodes.length || !links.length) return { positioned: [] as PositionedNode[], paths: [] as PathData[] };
|
|
21
33
|
|
|
22
34
|
const nodeMap = new Map(nodes.map((n, i) => [n.id, { ...n, color: n.color ?? PALETTE[i % PALETTE.length] }]));
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<script lang="ts">
|
|
1
|
+
<script module lang="ts">
|
|
2
2
|
export interface ScatterPoint {
|
|
3
3
|
x: number;
|
|
4
4
|
y: number;
|
|
@@ -6,39 +6,52 @@
|
|
|
6
6
|
r?: number;
|
|
7
7
|
key?: string;
|
|
8
8
|
}
|
|
9
|
+
</script>
|
|
9
10
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
11
|
+
<script lang="ts">
|
|
12
|
+
|
|
13
|
+
interface Props {
|
|
14
|
+
points?: ScatterPoint[];
|
|
15
|
+
xRange?: [number, number] | undefined;
|
|
16
|
+
yRange?: [number, number] | undefined;
|
|
17
|
+
height?: number;
|
|
18
|
+
ariaLabel?: string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
let {
|
|
22
|
+
points = [],
|
|
23
|
+
xRange = undefined,
|
|
24
|
+
yRange = undefined,
|
|
25
|
+
height = 160,
|
|
26
|
+
ariaLabel = 'Scatter plot'
|
|
27
|
+
}: Props = $props();
|
|
15
28
|
|
|
16
29
|
const VW = 400;
|
|
17
30
|
const PAD = { t: 12, r: 8, b: 12, l: 8 };
|
|
18
31
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
32
|
+
let xs = $derived(points.map((p) => p.x));
|
|
33
|
+
let ys = $derived(points.map((p) => p.y));
|
|
34
|
+
let x0 = $derived(xRange ? xRange[0] : xs.length ? Math.min(...xs) : 0);
|
|
35
|
+
let x1 = $derived(xRange ? xRange[1] : xs.length ? Math.max(...xs) : 1);
|
|
36
|
+
let y0 = $derived(yRange ? yRange[0] : ys.length ? Math.min(...ys) : 0);
|
|
37
|
+
let y1 = $derived(yRange ? yRange[1] : ys.length ? Math.max(...ys) : 1);
|
|
38
|
+
let xSpan = $derived(x1 - x0 || 1);
|
|
39
|
+
let ySpan = $derived(y1 - y0 || 1);
|
|
40
|
+
let chartW = $derived(VW - PAD.l - PAD.r);
|
|
41
|
+
let chartH = $derived(height - PAD.t - PAD.b);
|
|
42
|
+
|
|
43
|
+
let gridLines = $derived([0.25, 0.5, 0.75].map((f) => ({
|
|
31
44
|
gx: (PAD.l + f * chartW).toFixed(1),
|
|
32
45
|
gy: (PAD.t + (1 - f) * chartH).toFixed(1),
|
|
33
|
-
}));
|
|
46
|
+
})));
|
|
34
47
|
|
|
35
|
-
|
|
48
|
+
let dots = $derived(points.map((p, i) => ({
|
|
36
49
|
cx: (PAD.l + ((p.x - x0) / xSpan) * chartW).toFixed(1),
|
|
37
50
|
cy: (PAD.t + chartH - ((p.y - y0) / ySpan) * chartH).toFixed(1),
|
|
38
51
|
r: p.r ?? 5,
|
|
39
52
|
color: p.color ?? '#006FFF',
|
|
40
53
|
key: p.key ?? String(i),
|
|
41
|
-
}));
|
|
54
|
+
})));
|
|
42
55
|
</script>
|
|
43
56
|
|
|
44
57
|
<div role="img" aria-label={ariaLabel} style="width:100%;">
|
|
@@ -1,11 +1,33 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import SearchIcon from '../icons/SearchIcon.svelte';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
|
|
4
|
+
interface Props {
|
|
5
|
+
placeholder?: string;
|
|
6
|
+
value?: string;
|
|
7
|
+
ariaLabel?: string;
|
|
8
|
+
oninput?: (event: Event) => void;
|
|
9
|
+
onchange?: (event: Event) => void;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
let {
|
|
13
|
+
placeholder = '',
|
|
14
|
+
value = $bindable(''),
|
|
15
|
+
ariaLabel = '',
|
|
16
|
+
oninput,
|
|
17
|
+
onchange,
|
|
18
|
+
}: Props = $props();
|
|
6
19
|
</script>
|
|
7
20
|
|
|
8
21
|
<div class="search" role="search">
|
|
9
|
-
<span aria-hidden="true" style="display:inline-flex"
|
|
10
|
-
|
|
22
|
+
<span aria-hidden="true" style="display:inline-flex">
|
|
23
|
+
<SearchIcon size={14} style="color:#6E7079" />
|
|
24
|
+
</span>
|
|
25
|
+
<input
|
|
26
|
+
type="search"
|
|
27
|
+
{placeholder}
|
|
28
|
+
aria-label={ariaLabel || placeholder}
|
|
29
|
+
bind:value
|
|
30
|
+
{oninput}
|
|
31
|
+
{onchange}
|
|
32
|
+
/>
|
|
11
33
|
</div>
|