@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.
Files changed (191) hide show
  1. package/package.json +4 -4
  2. package/src/lib/components/Accordion.svelte +9 -1
  3. package/src/lib/components/AccordionItem.svelte +11 -5
  4. package/src/lib/components/ActionMenu.svelte +19 -14
  5. package/src/lib/components/ActivityFeed.svelte +24 -11
  6. package/src/lib/components/Alert.svelte +9 -4
  7. package/src/lib/components/AnnotatedTimeSeries.svelte +40 -26
  8. package/src/lib/components/ArcDiagram.svelte +20 -8
  9. package/src/lib/components/AreaChart.svelte +26 -14
  10. package/src/lib/components/Avatar.svelte +20 -8
  11. package/src/lib/components/AvatarGroup.svelte +16 -7
  12. package/src/lib/components/Badge.svelte +24 -11
  13. package/src/lib/components/Banner.svelte +20 -9
  14. package/src/lib/components/BarChart.svelte +29 -17
  15. package/src/lib/components/BeeswarmChart.svelte +32 -18
  16. package/src/lib/components/BoxPlot.svelte +27 -15
  17. package/src/lib/components/Breadcrumb.svelte +12 -7
  18. package/src/lib/components/BubbleChart.svelte +39 -25
  19. package/src/lib/components/BulletChart.svelte +16 -9
  20. package/src/lib/components/BumpChart.svelte +15 -8
  21. package/src/lib/components/Button.svelte +32 -11
  22. package/src/lib/components/CIDRInput.svelte +27 -19
  23. package/src/lib/components/CalendarHeatmap.svelte +12 -5
  24. package/src/lib/components/Callout.svelte +9 -4
  25. package/src/lib/components/CandlestickChart.svelte +31 -16
  26. package/src/lib/components/Card.svelte +16 -6
  27. package/src/lib/components/Carousel.svelte +14 -11
  28. package/src/lib/components/Checkbox.svelte +37 -16
  29. package/src/lib/components/ChordDiagram.svelte +12 -5
  30. package/src/lib/components/CirclePacking.svelte +13 -6
  31. package/src/lib/components/CodeBlock.svelte +16 -7
  32. package/src/lib/components/ColorPicker.svelte +22 -11
  33. package/src/lib/components/ColumnToggle.svelte +18 -11
  34. package/src/lib/components/Combobox.svelte +44 -33
  35. package/src/lib/components/CommandPalette.svelte +41 -31
  36. package/src/lib/components/ConfirmDialog.svelte +66 -35
  37. package/src/lib/components/ContextMenu.svelte +46 -33
  38. package/src/lib/components/ContextualHelp.svelte +13 -9
  39. package/src/lib/components/ContourPlot.svelte +43 -28
  40. package/src/lib/components/CopyButton.svelte +8 -4
  41. package/src/lib/components/CorrelationMatrix.svelte +16 -7
  42. package/src/lib/components/CountUp.svelte +30 -13
  43. package/src/lib/components/CumulativeDistribution.svelte +32 -19
  44. package/src/lib/components/DatePicker.svelte +28 -21
  45. package/src/lib/components/DateRangePicker.svelte +39 -32
  46. package/src/lib/components/Dendrogram.svelte +18 -6
  47. package/src/lib/components/Donut.svelte +28 -14
  48. package/src/lib/components/DotPlot.svelte +31 -16
  49. package/src/lib/components/Drawer.svelte +28 -21
  50. package/src/lib/components/DualAxisChart.svelte +39 -26
  51. package/src/lib/components/DumbbellChart.svelte +24 -12
  52. package/src/lib/components/DurationInput.svelte +26 -17
  53. package/src/lib/components/EmptyState.svelte +16 -6
  54. package/src/lib/components/ErrorBandChart.svelte +28 -14
  55. package/src/lib/components/ExpandableRow.svelte +19 -6
  56. package/src/lib/components/Field.svelte +26 -12
  57. package/src/lib/components/FileUpload.svelte +29 -20
  58. package/src/lib/components/FilterBuilder.svelte +27 -17
  59. package/src/lib/components/FlameGraph.svelte +14 -7
  60. package/src/lib/components/ForceGraph.svelte +19 -7
  61. package/src/lib/components/FunnelChart.svelte +20 -13
  62. package/src/lib/components/GanttChart.svelte +14 -7
  63. package/src/lib/components/Gauge.svelte +26 -16
  64. package/src/lib/components/GroupedList.svelte +13 -6
  65. package/src/lib/components/HealthBar.svelte +14 -5
  66. package/src/lib/components/HeatMap.svelte +28 -17
  67. package/src/lib/components/HexbinChart.svelte +36 -22
  68. package/src/lib/components/Histogram.svelte +27 -14
  69. package/src/lib/components/HorizonChart.svelte +28 -16
  70. package/src/lib/components/HoverCard.svelte +24 -12
  71. package/src/lib/components/IPInput.svelte +24 -16
  72. package/src/lib/components/IcicleChart.svelte +14 -7
  73. package/src/lib/components/IconButton.svelte +27 -9
  74. package/src/lib/components/InlineEdit.svelte +22 -12
  75. package/src/lib/components/Input.svelte +67 -10
  76. package/src/lib/components/InputGroup.svelte +8 -3
  77. package/src/lib/components/JsonViewer.svelte +17 -6
  78. package/src/lib/components/JsonViewerNode.svelte +36 -18
  79. package/src/lib/components/KVTable.svelte +6 -2
  80. package/src/lib/components/KanbanBoard.svelte +24 -17
  81. package/src/lib/components/Kbd.svelte +8 -4
  82. package/src/lib/components/LineChart.svelte +29 -17
  83. package/src/lib/components/LogViewer.svelte +27 -12
  84. package/src/lib/components/LollipopChart.svelte +20 -8
  85. package/src/lib/components/MACInput.svelte +24 -16
  86. package/src/lib/components/MarimekkoChart.svelte +14 -7
  87. package/src/lib/components/MatrixChart.svelte +19 -9
  88. package/src/lib/components/Menubar.svelte +26 -19
  89. package/src/lib/components/MirroredBarChart.svelte +25 -10
  90. package/src/lib/components/Modal.svelte +46 -33
  91. package/src/lib/components/MultiSelect.svelte +49 -38
  92. package/src/lib/components/NightingaleChart.svelte +17 -10
  93. package/src/lib/components/NotificationPanel.svelte +48 -33
  94. package/src/lib/components/NumberInput.svelte +37 -23
  95. package/src/lib/components/OTPInput.svelte +28 -16
  96. package/src/lib/components/Pagination.svelte +16 -13
  97. package/src/lib/components/ParallelCoordinates.svelte +28 -16
  98. package/src/lib/components/ParetoChart.svelte +38 -24
  99. package/src/lib/components/PasswordInput.svelte +24 -14
  100. package/src/lib/components/PieChart.svelte +21 -13
  101. package/src/lib/components/Pill.svelte +17 -6
  102. package/src/lib/components/PolarHeatmap.svelte +32 -18
  103. package/src/lib/components/Popover.svelte +22 -11
  104. package/src/lib/components/ProgressBar.svelte +17 -8
  105. package/src/lib/components/PunchCard.svelte +31 -20
  106. package/src/lib/components/QuadrantChart.svelte +50 -30
  107. package/src/lib/components/RadarChart.svelte +30 -18
  108. package/src/lib/components/RadialBarChart.svelte +14 -7
  109. package/src/lib/components/RadioGroup.svelte +20 -8
  110. package/src/lib/components/RangeSlider.svelte +30 -18
  111. package/src/lib/components/RankedList.svelte +18 -6
  112. package/src/lib/components/ResizablePanel.svelte +33 -17
  113. package/src/lib/components/RidgelinePlot.svelte +33 -21
  114. package/src/lib/components/RowToggle.svelte +15 -5
  115. package/src/lib/components/SankeyDiagram.svelte +18 -6
  116. package/src/lib/components/ScatterPlot.svelte +34 -21
  117. package/src/lib/components/SearchBox.svelte +27 -5
  118. package/src/lib/components/SegmentedControl.svelte +11 -7
  119. package/src/lib/components/Select.svelte +37 -26
  120. package/src/lib/components/SelectionToolbar.svelte +25 -11
  121. package/src/lib/components/Sidebar.svelte +15 -9
  122. package/src/lib/components/Signal.svelte +6 -2
  123. package/src/lib/components/Skeleton.svelte +20 -10
  124. package/src/lib/components/SkipLink.svelte +9 -4
  125. package/src/lib/components/Slider.svelte +28 -14
  126. package/src/lib/components/SlopeChart.svelte +35 -21
  127. package/src/lib/components/SortHeader.svelte +20 -9
  128. package/src/lib/components/SortableList.svelte +20 -13
  129. package/src/lib/components/Sparkline.svelte +15 -6
  130. package/src/lib/components/SparklineMatrix.svelte +17 -10
  131. package/src/lib/components/Spinner.svelte +7 -3
  132. package/src/lib/components/SplitButton.svelte +28 -17
  133. package/src/lib/components/Spoiler.svelte +22 -11
  134. package/src/lib/components/StackedBarChart.svelte +35 -22
  135. package/src/lib/components/StackedProgress.svelte +21 -9
  136. package/src/lib/components/StarRating.svelte +22 -11
  137. package/src/lib/components/Stat.svelte +32 -10
  138. package/src/lib/components/StatusIndicator.svelte +7 -3
  139. package/src/lib/components/StepChart.svelte +27 -15
  140. package/src/lib/components/Stepper.svelte +10 -6
  141. package/src/lib/components/StreamGraph.svelte +19 -12
  142. package/src/lib/components/StripeChart.svelte +22 -12
  143. package/src/lib/components/SunburstChart.svelte +11 -4
  144. package/src/lib/components/SwitchPortGrid.svelte +13 -7
  145. package/src/lib/components/TabPanel.svelte +9 -4
  146. package/src/lib/components/Tabs.svelte +18 -10
  147. package/src/lib/components/Tag.svelte +9 -5
  148. package/src/lib/components/TagInput.svelte +28 -18
  149. package/src/lib/components/Textarea.svelte +37 -15
  150. package/src/lib/components/ThresholdAreaChart.svelte +34 -21
  151. package/src/lib/components/TimePicker.svelte +25 -17
  152. package/src/lib/components/TimeRange.svelte +19 -14
  153. package/src/lib/components/Timeline.svelte +8 -4
  154. package/src/lib/components/Toast.svelte +2 -2
  155. package/src/lib/components/Toggle.svelte +13 -7
  156. package/src/lib/components/ToggleGroup.svelte +19 -11
  157. package/src/lib/components/Tooltip.svelte +16 -6
  158. package/src/lib/components/Topbar.svelte +24 -10
  159. package/src/lib/components/TransferList.svelte +34 -27
  160. package/src/lib/components/TreeItem.svelte +23 -10
  161. package/src/lib/components/TreeMap.svelte +13 -6
  162. package/src/lib/components/TreeView.svelte +24 -12
  163. package/src/lib/components/UptimeTimeline.svelte +22 -15
  164. package/src/lib/components/VennDiagram.svelte +25 -13
  165. package/src/lib/components/ViolinPlot.svelte +31 -19
  166. package/src/lib/components/VirtualList.svelte +25 -13
  167. package/src/lib/components/WaffleChart.svelte +32 -18
  168. package/src/lib/components/WaterfallChart.svelte +33 -26
  169. package/src/lib/components/WordCloud.svelte +21 -14
  170. package/src/lib/icons/AlarmIcon.svelte +4 -1
  171. package/src/lib/icons/BellIcon.svelte +2 -1
  172. package/src/lib/icons/CaretIcon.svelte +5 -3
  173. package/src/lib/icons/ClientsIcon.svelte +4 -1
  174. package/src/lib/icons/CloseIcon.svelte +2 -1
  175. package/src/lib/icons/DashboardIcon.svelte +4 -1
  176. package/src/lib/icons/DevicesIcon.svelte +4 -1
  177. package/src/lib/icons/DownloadIcon.svelte +2 -1
  178. package/src/lib/icons/HelpIcon.svelte +2 -1
  179. package/src/lib/icons/InfraIcon.svelte +4 -1
  180. package/src/lib/icons/IntegrationsIcon.svelte +4 -1
  181. package/src/lib/icons/LogsIcon.svelte +4 -1
  182. package/src/lib/icons/PlusIcon.svelte +2 -1
  183. package/src/lib/icons/PortsIcon.svelte +4 -1
  184. package/src/lib/icons/SearchIcon.svelte +6 -4
  185. package/src/lib/icons/SecurityIcon.svelte +4 -1
  186. package/src/lib/icons/SettingsIcon.svelte +4 -1
  187. package/src/lib/icons/TopologyIcon.svelte +4 -1
  188. package/src/lib/icons/UpdatesIcon.svelte +2 -1
  189. package/src/lib/icons/VpnIcon.svelte +4 -1
  190. package/src/lib/icons/WifiIcon.svelte +4 -1
  191. 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
- export let series: BarChartSeries[] = [];
9
- export let labels: string[] = [];
10
- export let height: number = 160;
11
- export let ariaLabel: string = 'Bar chart';
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
- $: n = series[0]?.values.length ?? 0;
17
- $: m = series.length;
18
- $: maxV = series.length ? Math.max(...series.flatMap((s) => s.values)) || 1 : 1;
19
- $: chartW = VW - PAD.l - PAD.r;
20
- $: chartH = height - PAD.t - PAD.b;
21
- $: bot = PAD.t + chartH;
22
- $: gw = n > 0 ? chartW / n : chartW;
23
- $: gap = gw * 0.15;
24
- $: barW = Math.max((gw - gap * (m + 1)) / m, 1);
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
- $: gridLines = [0.25, 0.5, 0.75, 1].map((f) => PAD.t + (1 - f) * chartH);
38
+ let gridLines = $derived([0.25, 0.5, 0.75, 1].map((f) => PAD.t + (1 - f) * chartH));
27
39
 
28
- $: bars = series.flatMap((s, si) =>
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
- export let series: BeeswarmSeries[] = [];
9
- export let yRange: [number, number] | undefined = undefined;
10
- export let height = 200;
11
- export let unit = '';
12
- export let dotRadius = 4;
13
- export let ariaLabel = 'Beeswarm chart';
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
- $: PLOT_W = VW - PAD_L - PAD_R;
46
- $: PLOT_H = height - PAD_T - PAD_B;
47
- $: n = series.length || 1;
48
- $: colWidth = PLOT_W / n;
49
- $: halfWidth = colWidth / 2 - dotRadius;
50
- $: allPts = series.flatMap((s) => s.points);
51
- $: minV = yRange ? yRange[0] : allPts.length ? Math.min(...allPts) : 0;
52
- $: maxV = yRange ? yRange[1] : allPts.length ? Math.max(...allPts) : 1;
53
- $: vRange = maxV - minV || 1;
54
- $: yTicks = [minV, (minV + maxV) / 2, maxV];
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
- $: swarmed = series.map((s) => swarmedPositions(s.points, ty, dotRadius, halfWidth));
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
- export let series: BoxSeries[] = [];
13
- export let yRange: [number, number] | undefined = undefined;
14
- export let height: number = 160;
15
- export let ariaLabel: string = 'Box plot';
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
- $: allVals = series.flatMap((s) => [s.q0, s.q1, s.q2, s.q3, s.q4]);
21
- $: y0 = yRange ? yRange[0] : allVals.length ? Math.min(...allVals) : 0;
22
- $: y1 = yRange ? yRange[1] : allVals.length ? Math.max(...allVals) : 1;
23
- $: ySpan = y1 - y0 || 1;
24
- $: chartW = VW - PAD.l - PAD.r;
25
- $: chartH = height - PAD.t - PAD.b;
26
- $: slotW = series.length > 0 ? chartW / series.length : chartW;
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
- $: gridLines = [0.25, 0.5, 0.75, 1].map((f) => (PAD.t + (1 - f) * chartH).toFixed(1));
40
+ let gridLines = $derived([0.25, 0.5, 0.75, 1].map((f) => (PAD.t + (1 - f) * chartH).toFixed(1)));
29
41
 
30
- $: boxes = series.map((s, i) => {
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 context="module" lang="ts">
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
- import { createEventDispatcher } from 'svelte';
7
- export let items: BreadcrumbItem[] = [];
8
- let className = '';
9
- export { className as class };
10
- const dispatch = createEventDispatcher<{ navigate: number }>();
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" on:click={() => dispatch('navigate', i)}>{item.label}</button>
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
- export let points: BubblePoint[] = [];
12
- export let xRange: [number, number] | undefined = undefined;
13
- export let yRange: [number, number] | undefined = undefined;
14
- export let rRange: [number, number] = [4, 20];
15
- export let height: number = 160;
16
- export let ariaLabel: string = 'Bubble chart';
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
- $: xs = points.map((p) => p.x);
22
- $: ys = points.map((p) => p.y);
23
- $: sizes = points.map((p) => p.size);
24
- $: x0 = xRange ? xRange[0] : xs.length ? Math.min(...xs) : 0;
25
- $: x1 = xRange ? xRange[1] : xs.length ? Math.max(...xs) : 1;
26
- $: y0 = yRange ? yRange[0] : ys.length ? Math.min(...ys) : 0;
27
- $: y1 = yRange ? yRange[1] : ys.length ? Math.max(...ys) : 1;
28
- $: s0 = sizes.length ? Math.min(...sizes) : 0;
29
- $: s1 = sizes.length ? Math.max(...sizes) : 1;
30
- $: xSpan = x1 - x0 || 1;
31
- $: ySpan = y1 - y0 || 1;
32
- $: sSpan = s1 - s0 || 1;
33
- $: chartW = VW - PAD.l - PAD.r;
34
- $: chartH = height - PAD.t - PAD.b;
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
- $: gridLines = [0.25, 0.5, 0.75].map((f) => ({
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
- $: bubbles = points.map((p, i) => ({
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
- export let items: BulletItem[] = [];
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
- $: trackW = VW - LABEL_W - VAL_W;
24
- $: totalH = items.length * ROW_H + PAD * 2;
30
+ let trackW = $derived(VW - LABEL_W - VAL_W);
31
+ let totalH = $derived(items.length * ROW_H + PAD * 2);
25
32
 
26
- $: rows = items.map((item, i) => {
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="tabular-nums">
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
- export let labels: string[] = [];
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
- $: maxRank = Math.max(...series.flatMap((s) => s.ranks), 1);
22
- $: TRACK_W = VW - PAD_L - PAD_R;
23
- $: svgH = PAD_T + maxRank * ROW_H + PAD_B;
24
- $: rankRows = Array.from({ length: maxRank }, (_, i) => i);
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
- export let variant: 'primary' | 'ghost' | 'danger' = 'ghost';
4
- export let iconOnly = false;
5
- export let loading = false;
6
- export let title: string | undefined = undefined;
7
- export let type: 'button' | 'submit' | 'reset' = 'button';
8
- export let disabled = false;
9
- let className = '';
10
- export { className as class };
11
- export let style: string = '';
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
- on:click
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
- <slot />
45
+ {@render children?.()}
25
46
  </button>
@@ -1,17 +1,25 @@
1
- <script context="module" lang="ts">
1
+ <script module lang="ts">
2
2
  let counter = 0;
3
3
  </script>
4
4
 
5
5
  <script lang="ts">
6
- import { createEventDispatcher } from 'svelte';
6
+
7
7
 
8
- export let label: string | undefined = undefined;
9
- export let value: string = '0.0.0.0/0';
10
- export let disabled: boolean = false;
11
- let className = '';
12
- export { className as class };
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
- const dispatch = createEventDispatcher<{ change: string }>();
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
- dispatch('change', value);
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
- on:input={(e) => commitOctet(i, e.currentTarget.value)}
116
- on:keydown={(e) => handleKey(i, e)}
117
- on:paste={handlePaste}
118
- on:focus={(e) => e.currentTarget.select()}
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
- on:input={(e) => commitPrefix(e.currentTarget.value)}
137
- on:keydown={(e) => handleKey(4, e)}
138
- on:paste={handlePaste}
139
- on:focus={(e) => e.currentTarget.select()}
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
- export let data: CalendarDay[] = [];
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
- $: ({ cells, monthLabels } = (() => {
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 context="module" lang="ts">
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
- export let variant: CalloutVariant = 'info';
7
- export let title: string | undefined = undefined;
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><slot /></div>
41
+ <div>{@render children?.()}</div>
37
42
  </div>
38
43
  </div>