@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,37 +1,49 @@
|
|
|
1
|
-
<script lang="ts">
|
|
1
|
+
<script module lang="ts">
|
|
2
2
|
export interface BarChartSeries {
|
|
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?: BarChartSeries[];
|
|
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 = 'Bar 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
|
-
|
|
23
|
-
|
|
24
|
-
|
|
28
|
+
let n = $derived(series[0]?.values.length ?? 0);
|
|
29
|
+
let m = $derived(series.length);
|
|
30
|
+
let maxV = $derived(series.length ? Math.max(...series.flatMap((s) => s.values)) || 1 : 1);
|
|
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 gw = $derived(n > 0 ? chartW / n : chartW);
|
|
35
|
+
let gap = $derived(gw * 0.15);
|
|
36
|
+
let barW = $derived(Math.max((gw - gap * (m + 1)) / m, 1));
|
|
25
37
|
|
|
26
|
-
|
|
38
|
+
let gridLines = $derived([0.25, 0.5, 0.75, 1].map((f) => PAD.t + (1 - f) * chartH));
|
|
27
39
|
|
|
28
|
-
|
|
40
|
+
let bars = $derived(series.flatMap((s, si) =>
|
|
29
41
|
s.values.map((v, gi) => {
|
|
30
42
|
const x = PAD.l + gi * gw + gap * (si + 1) + barW * si;
|
|
31
43
|
const bh = (v / maxV) * chartH;
|
|
32
44
|
return { x: x.toFixed(1), y: (bot - bh).toFixed(1), w: barW.toFixed(1), h: bh.toFixed(1), color: s.color, key: `${si}-${gi}` };
|
|
33
45
|
}),
|
|
34
|
-
);
|
|
46
|
+
));
|
|
35
47
|
</script>
|
|
36
48
|
|
|
37
49
|
<div role="img" aria-label={ariaLabel} style="width:100%;">
|
|
@@ -1,16 +1,30 @@
|
|
|
1
|
-
<script lang="ts">
|
|
1
|
+
<script module lang="ts">
|
|
2
2
|
export interface BeeswarmSeries {
|
|
3
3
|
label: string;
|
|
4
4
|
points: number[];
|
|
5
5
|
color?: string;
|
|
6
6
|
}
|
|
7
|
+
</script>
|
|
8
|
+
|
|
9
|
+
<script lang="ts">
|
|
10
|
+
|
|
11
|
+
interface Props {
|
|
12
|
+
series?: BeeswarmSeries[];
|
|
13
|
+
yRange?: [number, number] | undefined;
|
|
14
|
+
height?: number;
|
|
15
|
+
unit?: string;
|
|
16
|
+
dotRadius?: number;
|
|
17
|
+
ariaLabel?: string;
|
|
18
|
+
}
|
|
7
19
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
20
|
+
let {
|
|
21
|
+
series = [],
|
|
22
|
+
yRange = undefined,
|
|
23
|
+
height = 200,
|
|
24
|
+
unit = '',
|
|
25
|
+
dotRadius = 4,
|
|
26
|
+
ariaLabel = 'Beeswarm chart'
|
|
27
|
+
}: Props = $props();
|
|
14
28
|
|
|
15
29
|
const PALETTE = ['#006FFF', '#00C875', '#FF7B7B', '#F5C26B', '#A78BFA', '#34D399'];
|
|
16
30
|
const VW = 340;
|
|
@@ -42,16 +56,16 @@
|
|
|
42
56
|
return pts;
|
|
43
57
|
}
|
|
44
58
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
59
|
+
let PLOT_W = $derived(VW - PAD_L - PAD_R);
|
|
60
|
+
let PLOT_H = $derived(height - PAD_T - PAD_B);
|
|
61
|
+
let n = $derived(series.length || 1);
|
|
62
|
+
let colWidth = $derived(PLOT_W / n);
|
|
63
|
+
let halfWidth = $derived(colWidth / 2 - dotRadius);
|
|
64
|
+
let allPts = $derived(series.flatMap((s) => s.points));
|
|
65
|
+
let minV = $derived(yRange ? yRange[0] : allPts.length ? Math.min(...allPts) : 0);
|
|
66
|
+
let maxV = $derived(yRange ? yRange[1] : allPts.length ? Math.max(...allPts) : 1);
|
|
67
|
+
let vRange = $derived(maxV - minV || 1);
|
|
68
|
+
let yTicks = $derived([minV, (minV + maxV) / 2, maxV]);
|
|
55
69
|
|
|
56
70
|
function ty(v: number): number {
|
|
57
71
|
return PAD_T + (1 - (v - minV) / vRange) * PLOT_H;
|
|
@@ -61,7 +75,7 @@
|
|
|
61
75
|
return PAD_L + (i + 0.5) * colWidth;
|
|
62
76
|
}
|
|
63
77
|
|
|
64
|
-
|
|
78
|
+
let swarmed = $derived(series.map((s) => swarmedPositions(s.points, ty, dotRadius, halfWidth)));
|
|
65
79
|
</script>
|
|
66
80
|
|
|
67
81
|
{#if series.length > 0}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<script lang="ts">
|
|
1
|
+
<script module lang="ts">
|
|
2
2
|
export interface BoxSeries {
|
|
3
3
|
label: string;
|
|
4
4
|
q0: number;
|
|
@@ -8,26 +8,38 @@
|
|
|
8
8
|
q4: number;
|
|
9
9
|
color?: string;
|
|
10
10
|
}
|
|
11
|
+
</script>
|
|
12
|
+
|
|
13
|
+
<script lang="ts">
|
|
14
|
+
|
|
15
|
+
interface Props {
|
|
16
|
+
series?: BoxSeries[];
|
|
17
|
+
yRange?: [number, number] | undefined;
|
|
18
|
+
height?: number;
|
|
19
|
+
ariaLabel?: string;
|
|
20
|
+
}
|
|
11
21
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
22
|
+
let {
|
|
23
|
+
series = [],
|
|
24
|
+
yRange = undefined,
|
|
25
|
+
height = 160,
|
|
26
|
+
ariaLabel = 'Box plot'
|
|
27
|
+
}: Props = $props();
|
|
16
28
|
|
|
17
29
|
const VW = 400;
|
|
18
30
|
const PAD = { t: 12, r: 8, b: 28, l: 8 };
|
|
19
31
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
32
|
+
let allVals = $derived(series.flatMap((s) => [s.q0, s.q1, s.q2, s.q3, s.q4]));
|
|
33
|
+
let y0 = $derived(yRange ? yRange[0] : allVals.length ? Math.min(...allVals) : 0);
|
|
34
|
+
let y1 = $derived(yRange ? yRange[1] : allVals.length ? Math.max(...allVals) : 1);
|
|
35
|
+
let ySpan = $derived(y1 - y0 || 1);
|
|
36
|
+
let chartW = $derived(VW - PAD.l - PAD.r);
|
|
37
|
+
let chartH = $derived(height - PAD.t - PAD.b);
|
|
38
|
+
let slotW = $derived(series.length > 0 ? chartW / series.length : chartW);
|
|
27
39
|
|
|
28
|
-
|
|
40
|
+
let gridLines = $derived([0.25, 0.5, 0.75, 1].map((f) => (PAD.t + (1 - f) * chartH).toFixed(1)));
|
|
29
41
|
|
|
30
|
-
|
|
42
|
+
let boxes = $derived(series.map((s, i) => {
|
|
31
43
|
const cx = PAD.l + (i + 0.5) * slotW;
|
|
32
44
|
const bw = slotW * 0.4;
|
|
33
45
|
const ty = (v: number) => PAD.t + chartH - ((v - y0) / ySpan) * chartH;
|
|
@@ -46,7 +58,7 @@
|
|
|
46
58
|
boxH: (ty(s.q1) - ty(s.q3)).toFixed(1),
|
|
47
59
|
medY: ty(s.q2).toFixed(1),
|
|
48
60
|
};
|
|
49
|
-
});
|
|
61
|
+
}));
|
|
50
62
|
</script>
|
|
51
63
|
|
|
52
64
|
<div role="img" aria-label={ariaLabel} style="width:100%;">
|
|
@@ -1,13 +1,18 @@
|
|
|
1
|
-
<script
|
|
1
|
+
<script module lang="ts">
|
|
2
2
|
export interface BreadcrumbItem { label: string; href?: string; }
|
|
3
3
|
</script>
|
|
4
4
|
|
|
5
5
|
<script lang="ts">
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
6
|
+
|
|
7
|
+
interface Props {
|
|
8
|
+
items?: BreadcrumbItem[];
|
|
9
|
+
class?: string;
|
|
10
|
+
onnavigate?: (payload: number) => void;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
let { items = [], class: className = '',
|
|
14
|
+
onnavigate,
|
|
15
|
+
}: Props = $props();
|
|
11
16
|
</script>
|
|
12
17
|
|
|
13
18
|
<nav aria-label="Breadcrumb" class="breadcrumb {className}">
|
|
@@ -20,7 +25,7 @@
|
|
|
20
25
|
{:else if item.href}
|
|
21
26
|
<a href={item.href} class="breadcrumb__link">{item.label}</a>
|
|
22
27
|
{:else}
|
|
23
|
-
<button type="button" class="breadcrumb__link"
|
|
28
|
+
<button type="button" class="breadcrumb__link" onclick={() => onnavigate?.(i)}>{item.label}</button>
|
|
24
29
|
{/if}
|
|
25
30
|
{#if !isLast}
|
|
26
31
|
<span aria-hidden="true" class="breadcrumb__sep">/</span>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<script lang="ts">
|
|
1
|
+
<script module lang="ts">
|
|
2
2
|
export interface BubblePoint {
|
|
3
3
|
x: number;
|
|
4
4
|
y: number;
|
|
@@ -7,44 +7,58 @@
|
|
|
7
7
|
label?: string;
|
|
8
8
|
key?: string;
|
|
9
9
|
}
|
|
10
|
+
</script>
|
|
11
|
+
|
|
12
|
+
<script lang="ts">
|
|
13
|
+
|
|
14
|
+
interface Props {
|
|
15
|
+
points?: BubblePoint[];
|
|
16
|
+
xRange?: [number, number] | undefined;
|
|
17
|
+
yRange?: [number, number] | undefined;
|
|
18
|
+
rRange?: [number, number];
|
|
19
|
+
height?: number;
|
|
20
|
+
ariaLabel?: string;
|
|
21
|
+
}
|
|
10
22
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
23
|
+
let {
|
|
24
|
+
points = [],
|
|
25
|
+
xRange = undefined,
|
|
26
|
+
yRange = undefined,
|
|
27
|
+
rRange = [4, 20],
|
|
28
|
+
height = 160,
|
|
29
|
+
ariaLabel = 'Bubble chart'
|
|
30
|
+
}: Props = $props();
|
|
17
31
|
|
|
18
32
|
const VW = 400;
|
|
19
33
|
const PAD = { t: 12, r: 12, b: 12, l: 12 };
|
|
20
34
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
+
let xs = $derived(points.map((p) => p.x));
|
|
36
|
+
let ys = $derived(points.map((p) => p.y));
|
|
37
|
+
let sizes = $derived(points.map((p) => p.size));
|
|
38
|
+
let x0 = $derived(xRange ? xRange[0] : xs.length ? Math.min(...xs) : 0);
|
|
39
|
+
let x1 = $derived(xRange ? xRange[1] : xs.length ? Math.max(...xs) : 1);
|
|
40
|
+
let y0 = $derived(yRange ? yRange[0] : ys.length ? Math.min(...ys) : 0);
|
|
41
|
+
let y1 = $derived(yRange ? yRange[1] : ys.length ? Math.max(...ys) : 1);
|
|
42
|
+
let s0 = $derived(sizes.length ? Math.min(...sizes) : 0);
|
|
43
|
+
let s1 = $derived(sizes.length ? Math.max(...sizes) : 1);
|
|
44
|
+
let xSpan = $derived(x1 - x0 || 1);
|
|
45
|
+
let ySpan = $derived(y1 - y0 || 1);
|
|
46
|
+
let sSpan = $derived(s1 - s0 || 1);
|
|
47
|
+
let chartW = $derived(VW - PAD.l - PAD.r);
|
|
48
|
+
let chartH = $derived(height - PAD.t - PAD.b);
|
|
35
49
|
|
|
36
|
-
|
|
50
|
+
let gridLines = $derived([0.25, 0.5, 0.75].map((f) => ({
|
|
37
51
|
gx: (PAD.l + f * chartW).toFixed(1),
|
|
38
52
|
gy: (PAD.t + (1 - f) * chartH).toFixed(1),
|
|
39
|
-
}));
|
|
53
|
+
})));
|
|
40
54
|
|
|
41
|
-
|
|
55
|
+
let bubbles = $derived(points.map((p, i) => ({
|
|
42
56
|
cx: (PAD.l + ((p.x - x0) / xSpan) * chartW).toFixed(1),
|
|
43
57
|
cy: (PAD.t + chartH - ((p.y - y0) / ySpan) * chartH).toFixed(1),
|
|
44
58
|
r: (rRange[0] + ((p.size - s0) / sSpan) * (rRange[1] - rRange[0])).toFixed(1),
|
|
45
59
|
color: p.color ?? '#006FFF',
|
|
46
60
|
key: p.key ?? String(i),
|
|
47
|
-
}));
|
|
61
|
+
})));
|
|
48
62
|
</script>
|
|
49
63
|
|
|
50
64
|
<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 BulletItem {
|
|
3
3
|
label: string;
|
|
4
4
|
value: number;
|
|
@@ -7,10 +7,17 @@
|
|
|
7
7
|
unit?: string;
|
|
8
8
|
color?: string;
|
|
9
9
|
}
|
|
10
|
+
</script>
|
|
11
|
+
|
|
12
|
+
<script lang="ts">
|
|
13
|
+
|
|
14
|
+
interface Props {
|
|
15
|
+
items?: BulletItem[];
|
|
16
|
+
max?: number;
|
|
17
|
+
ariaLabel?: string;
|
|
18
|
+
}
|
|
10
19
|
|
|
11
|
-
|
|
12
|
-
export let max: number = 100;
|
|
13
|
-
export let ariaLabel: string = 'Bullet chart';
|
|
20
|
+
let { items = [], max = 100, ariaLabel = 'Bullet chart' }: Props = $props();
|
|
14
21
|
|
|
15
22
|
const VW = 400;
|
|
16
23
|
const LABEL_W = 110;
|
|
@@ -20,10 +27,10 @@
|
|
|
20
27
|
const ROW_H = 34;
|
|
21
28
|
const PAD = 8;
|
|
22
29
|
|
|
23
|
-
|
|
24
|
-
|
|
30
|
+
let trackW = $derived(VW - LABEL_W - VAL_W);
|
|
31
|
+
let totalH = $derived(items.length * ROW_H + PAD * 2);
|
|
25
32
|
|
|
26
|
-
|
|
33
|
+
let rows = $derived(items.map((item, i) => {
|
|
27
34
|
const y = PAD + i * ROW_H;
|
|
28
35
|
const midY = y + ROW_H / 2;
|
|
29
36
|
const rangeY = midY - RANGE_H / 2;
|
|
@@ -46,7 +53,7 @@
|
|
|
46
53
|
label: item.label,
|
|
47
54
|
value: item.value,
|
|
48
55
|
};
|
|
49
|
-
});
|
|
56
|
+
}));
|
|
50
57
|
</script>
|
|
51
58
|
|
|
52
59
|
<div role="img" aria-label={ariaLabel} style="width:100%;">
|
|
@@ -62,7 +69,7 @@
|
|
|
62
69
|
{#if row.targetX != null}
|
|
63
70
|
<rect x={LABEL_W + row.targetX - 1.5} y={row.rangeY} width="3" height={RANGE_H} fill="rgba(255,255,255,0.85)" rx="1" />
|
|
64
71
|
{/if}
|
|
65
|
-
<text x={LABEL_W + trackW + 6} y={row.midY + 4} fill="#fff" font-size="11" font-family="inherit" font-variant-numeric
|
|
72
|
+
<text x={LABEL_W + trackW + 6} y={row.midY + 4} fill="#fff" font-size="11" font-family="inherit" style="font-variant-numeric: tabular-nums">
|
|
66
73
|
{row.value}{row.unit}
|
|
67
74
|
</text>
|
|
68
75
|
{/each}
|
|
@@ -1,13 +1,20 @@
|
|
|
1
|
-
<script lang="ts">
|
|
1
|
+
<script module lang="ts">
|
|
2
2
|
export interface BumpSeries {
|
|
3
3
|
label: string;
|
|
4
4
|
ranks: number[];
|
|
5
5
|
color?: string;
|
|
6
6
|
}
|
|
7
|
+
</script>
|
|
8
|
+
|
|
9
|
+
<script lang="ts">
|
|
10
|
+
|
|
11
|
+
interface Props {
|
|
12
|
+
labels?: string[];
|
|
13
|
+
series?: BumpSeries[];
|
|
14
|
+
ariaLabel?: string;
|
|
15
|
+
}
|
|
7
16
|
|
|
8
|
-
|
|
9
|
-
export let series: BumpSeries[] = [];
|
|
10
|
-
export let ariaLabel: string = 'Bump chart';
|
|
17
|
+
let { labels = [], series = [], ariaLabel = 'Bump chart' }: Props = $props();
|
|
11
18
|
|
|
12
19
|
const VW = 380;
|
|
13
20
|
const PAD_L = 12;
|
|
@@ -18,10 +25,10 @@
|
|
|
18
25
|
const DOT_R = 5;
|
|
19
26
|
const COLORS = ['#006FFF', '#00C8C8', '#F5A623', '#7FB6FF', '#A878F5', '#F56342'];
|
|
20
27
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
28
|
+
let maxRank = $derived(Math.max(...series.flatMap((s) => s.ranks), 1));
|
|
29
|
+
let TRACK_W = $derived(VW - PAD_L - PAD_R);
|
|
30
|
+
let svgH = $derived(PAD_T + maxRank * ROW_H + PAD_B);
|
|
31
|
+
let rankRows = $derived(Array.from({ length: maxRank }, (_, i) => i));
|
|
25
32
|
|
|
26
33
|
function xOf(i: number): number {
|
|
27
34
|
return labels.length > 1
|
|
@@ -1,25 +1,46 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
2
3
|
import Spinner from './Spinner.svelte';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
4
|
+
|
|
5
|
+
interface Props {
|
|
6
|
+
variant?: 'primary' | 'ghost' | 'danger';
|
|
7
|
+
iconOnly?: boolean;
|
|
8
|
+
loading?: boolean;
|
|
9
|
+
title?: string | undefined;
|
|
10
|
+
type?: 'button' | 'submit' | 'reset';
|
|
11
|
+
disabled?: boolean;
|
|
12
|
+
class?: string;
|
|
13
|
+
style?: string;
|
|
14
|
+
'aria-label'?: string | undefined;
|
|
15
|
+
onclick?: (event: MouseEvent) => void;
|
|
16
|
+
children?: Snippet;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
let {
|
|
20
|
+
variant = 'ghost',
|
|
21
|
+
iconOnly = false,
|
|
22
|
+
loading = false,
|
|
23
|
+
title = undefined,
|
|
24
|
+
type = 'button',
|
|
25
|
+
disabled = false,
|
|
26
|
+
class: className = '',
|
|
27
|
+
style = '',
|
|
28
|
+
'aria-label': ariaLabel = undefined,
|
|
29
|
+
onclick,
|
|
30
|
+
children,
|
|
31
|
+
}: Props = $props();
|
|
12
32
|
</script>
|
|
13
33
|
|
|
14
34
|
<button
|
|
15
35
|
{type}
|
|
16
36
|
{title}
|
|
17
|
-
|
|
37
|
+
aria-label={ariaLabel}
|
|
38
|
+
{onclick}
|
|
18
39
|
class="btn btn-{variant} {iconOnly ? 'btn-icon' : ''} {className}"
|
|
19
40
|
{style}
|
|
20
41
|
disabled={disabled || loading}
|
|
21
42
|
aria-busy={loading ? true : undefined}
|
|
22
43
|
>
|
|
23
44
|
{#if loading}<Spinner size="sm" />{/if}
|
|
24
|
-
|
|
45
|
+
{@render children?.()}
|
|
25
46
|
</button>
|
|
@@ -1,17 +1,25 @@
|
|
|
1
|
-
<script
|
|
1
|
+
<script module lang="ts">
|
|
2
2
|
let counter = 0;
|
|
3
3
|
</script>
|
|
4
4
|
|
|
5
5
|
<script lang="ts">
|
|
6
|
-
|
|
6
|
+
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
8
|
+
interface Props {
|
|
9
|
+
label?: string | undefined;
|
|
10
|
+
value?: string;
|
|
11
|
+
disabled?: boolean;
|
|
12
|
+
class?: string;
|
|
13
|
+
onchange?: (payload: string) => void;
|
|
14
|
+
}
|
|
13
15
|
|
|
14
|
-
|
|
16
|
+
let {
|
|
17
|
+
label = undefined,
|
|
18
|
+
value = $bindable('0.0.0.0/0'),
|
|
19
|
+
disabled = false,
|
|
20
|
+
class: className = '',
|
|
21
|
+
onchange,
|
|
22
|
+
}: Props = $props();
|
|
15
23
|
const uid = `dash-ui-cidr-${++counter}`;
|
|
16
24
|
|
|
17
25
|
function clampOctet(s: string): string {
|
|
@@ -34,8 +42,8 @@
|
|
|
34
42
|
return [parts[0] ?? '0', parts[1] ?? '0', parts[2] ?? '0', parts[3] ?? '0', prefix];
|
|
35
43
|
}
|
|
36
44
|
|
|
37
|
-
let fields: [string, string, string, string, string] = parseCIDR(value);
|
|
38
|
-
let inputs: (HTMLInputElement | null)[] = [null, null, null, null, null];
|
|
45
|
+
let fields: [string, string, string, string, string] = $state(parseCIDR(value));
|
|
46
|
+
let inputs: (HTMLInputElement | null)[] = $state([null, null, null, null, null]);
|
|
39
47
|
|
|
40
48
|
function focusAt(i: number) {
|
|
41
49
|
const el = inputs[i];
|
|
@@ -44,7 +52,7 @@
|
|
|
44
52
|
|
|
45
53
|
function commitFields() {
|
|
46
54
|
value = `${fields.slice(0, 4).join('.')}/${fields[4]}`;
|
|
47
|
-
|
|
55
|
+
onchange?.(value);
|
|
48
56
|
}
|
|
49
57
|
|
|
50
58
|
function commitOctet(i: number, raw: string) {
|
|
@@ -112,10 +120,10 @@
|
|
|
112
120
|
{disabled}
|
|
113
121
|
maxlength={3}
|
|
114
122
|
class="cidr-input__octet"
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
123
|
+
oninput={(e) => commitOctet(i, e.currentTarget.value)}
|
|
124
|
+
onkeydown={(e) => handleKey(i, e)}
|
|
125
|
+
onpaste={handlePaste}
|
|
126
|
+
onfocus={(e) => e.currentTarget.select()}
|
|
119
127
|
/>
|
|
120
128
|
<span class="cidr-input__dot" aria-hidden="true">{i < 3 ? '.' : '/'}</span>
|
|
121
129
|
{/each}
|
|
@@ -133,10 +141,10 @@
|
|
|
133
141
|
{disabled}
|
|
134
142
|
maxlength={2}
|
|
135
143
|
class="cidr-input__prefix"
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
144
|
+
oninput={(e) => commitPrefix(e.currentTarget.value)}
|
|
145
|
+
onkeydown={(e) => handleKey(4, e)}
|
|
146
|
+
onpaste={handlePaste}
|
|
147
|
+
onfocus={(e) => e.currentTarget.select()}
|
|
140
148
|
/>
|
|
141
149
|
</div>
|
|
142
150
|
</div>
|
|
@@ -1,12 +1,19 @@
|
|
|
1
|
-
<script lang="ts">
|
|
1
|
+
<script module lang="ts">
|
|
2
2
|
export interface CalendarDay {
|
|
3
3
|
date: string;
|
|
4
4
|
value: number;
|
|
5
5
|
}
|
|
6
|
+
</script>
|
|
7
|
+
|
|
8
|
+
<script lang="ts">
|
|
9
|
+
|
|
10
|
+
interface Props {
|
|
11
|
+
data?: CalendarDay[];
|
|
12
|
+
maxValue?: number | undefined;
|
|
13
|
+
ariaLabel?: string;
|
|
14
|
+
}
|
|
6
15
|
|
|
7
|
-
|
|
8
|
-
export let maxValue: number | undefined = undefined;
|
|
9
|
-
export let ariaLabel: string = 'Calendar heatmap';
|
|
16
|
+
let { data = [], maxValue = undefined, ariaLabel = 'Calendar heatmap' }: Props = $props();
|
|
10
17
|
|
|
11
18
|
const CELL = 10;
|
|
12
19
|
const GAP = 2;
|
|
@@ -30,7 +37,7 @@
|
|
|
30
37
|
return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`;
|
|
31
38
|
}
|
|
32
39
|
|
|
33
|
-
|
|
40
|
+
let { cells, monthLabels } = $derived((() => {
|
|
34
41
|
const byDate = new Map(data.map((d) => [d.date, d.value]));
|
|
35
42
|
const mx = maxValue ?? Math.max(1, ...data.map((d) => d.value));
|
|
36
43
|
|
|
@@ -1,10 +1,15 @@
|
|
|
1
|
-
<script
|
|
1
|
+
<script module lang="ts">
|
|
2
2
|
export type CalloutVariant = 'info' | 'success' | 'warn' | 'danger' | 'tip';
|
|
3
3
|
</script>
|
|
4
4
|
|
|
5
5
|
<script lang="ts">
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
interface Props {
|
|
7
|
+
variant?: CalloutVariant;
|
|
8
|
+
title?: string | undefined;
|
|
9
|
+
children?: import('svelte').Snippet;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
let { variant = 'info', title = undefined, children }: Props = $props();
|
|
8
13
|
</script>
|
|
9
14
|
|
|
10
15
|
<div class="callout callout--{variant}" role="note">
|
|
@@ -33,6 +38,6 @@
|
|
|
33
38
|
{#if title}
|
|
34
39
|
<div class="callout-title">{title}</div>
|
|
35
40
|
{/if}
|
|
36
|
-
<div
|
|
41
|
+
<div>{@render children?.()}</div>
|
|
37
42
|
</div>
|
|
38
43
|
</div>
|