@w5-ui/svelte 0.1.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. package/package.json +6 -6
  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,15 +1,28 @@
1
- <script lang="ts">
1
+ <script module lang="ts">
2
2
  export interface DualAxisSeries {
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
+ bars: DualAxisSeries;
13
+ line: DualAxisSeries;
14
+ labels?: string[];
15
+ height?: number;
16
+ ariaLabel?: string;
17
+ }
7
18
 
8
- export let bars: DualAxisSeries;
9
- export let line: DualAxisSeries;
10
- export let labels: string[] = [];
11
- export let height = 160;
12
- export let ariaLabel = 'Dual axis chart';
19
+ let {
20
+ bars,
21
+ line,
22
+ labels = [],
23
+ height = 160,
24
+ ariaLabel = 'Dual axis chart'
25
+ }: Props = $props();
13
26
 
14
27
  const VW = 400;
15
28
  const PAD = { t: 16, r: 44, b: 28, l: 44 };
@@ -19,32 +32,32 @@
19
32
  return String(Math.round(n));
20
33
  }
21
34
 
22
- $: chartW = VW - PAD.l - PAD.r;
23
- $: chartH = height - PAD.t - PAD.b;
24
- $: bot = PAD.t + chartH;
25
- $: n = bars.values.length;
26
- $: gw = n > 0 ? chartW / n : chartW;
27
- $: barW = gw * 0.55;
28
- $: barMax = Math.max(...bars.values, 1);
29
- $: lineMin = Math.min(...line.values);
30
- $: lineMax = Math.max(...line.values, lineMin + 1);
31
- $: lineRange = lineMax - lineMin || 1;
32
- $: gridLines = [0, 0.25, 0.5, 0.75, 1].map((f) => PAD.t + (1 - f) * chartH);
33
- $: leftTicks = [0, 0.5, 1].map((f) => ({ y: PAD.t + (1 - f) * chartH, label: fmtTick(barMax * f) }));
34
- $: rightTicks = [0, 0.5, 1].map((f) => ({ y: PAD.t + (1 - f) * chartH, label: fmtTick(lineMin + lineRange * f) }));
35
- $: barRects = bars.values.map((v, i) => ({
35
+ let chartW = $derived(VW - PAD.l - PAD.r);
36
+ let chartH = $derived(height - PAD.t - PAD.b);
37
+ let bot = $derived(PAD.t + chartH);
38
+ let n = $derived(bars.values.length);
39
+ let gw = $derived(n > 0 ? chartW / n : chartW);
40
+ let barW = $derived(gw * 0.55);
41
+ let barMax = $derived(Math.max(...bars.values, 1));
42
+ let lineMin = $derived(Math.min(...line.values));
43
+ let lineMax = $derived(Math.max(...line.values, lineMin + 1));
44
+ let lineRange = $derived(lineMax - lineMin || 1);
45
+ let gridLines = $derived([0, 0.25, 0.5, 0.75, 1].map((f) => PAD.t + (1 - f) * chartH));
46
+ let leftTicks = $derived([0, 0.5, 1].map((f) => ({ y: PAD.t + (1 - f) * chartH, label: fmtTick(barMax * f) })));
47
+ let rightTicks = $derived([0, 0.5, 1].map((f) => ({ y: PAD.t + (1 - f) * chartH, label: fmtTick(lineMin + lineRange * f) })));
48
+ let barRects = $derived(bars.values.map((v, i) => ({
36
49
  x: (PAD.l + i * gw + gw / 2 - barW / 2).toFixed(1),
37
50
  y: (bot - (v / barMax) * chartH).toFixed(1),
38
51
  w: barW.toFixed(1),
39
52
  h: ((v / barMax) * chartH).toFixed(1),
40
- }));
41
- $: linePoints = line.values.map((v, i) =>
53
+ })));
54
+ let linePoints = $derived(line.values.map((v, i) =>
42
55
  `${(PAD.l + (n > 1 ? (i / (n - 1)) * chartW : chartW / 2)).toFixed(1)},${(PAD.t + chartH - ((v - lineMin) / lineRange) * chartH).toFixed(1)}`
43
- );
44
- $: linePath = linePoints.length ? `M ${linePoints.join(' L ')}` : '';
45
- $: lineArea = linePoints.length
56
+ ));
57
+ let linePath = $derived(linePoints.length ? `M ${linePoints.join(' L ')}` : '');
58
+ let lineArea = $derived(linePoints.length
46
59
  ? `M ${PAD.l.toFixed(1)},${bot.toFixed(1)} L ${linePoints.join(' L ')} L ${(PAD.l + (n > 1 ? chartW : 0)).toFixed(1)},${bot.toFixed(1)} Z`
47
- : '';
60
+ : '');
48
61
  </script>
49
62
 
50
63
  <div role="img" aria-label={ariaLabel} style="width:100%;">
@@ -1,15 +1,27 @@
1
- <script lang="ts">
1
+ <script module lang="ts">
2
2
  export interface DumbbellItem {
3
3
  label: string;
4
4
  start: number;
5
5
  end: number;
6
6
  color?: string;
7
7
  }
8
+ </script>
9
+
10
+ <script lang="ts">
11
+
12
+ interface Props {
13
+ items?: DumbbellItem[];
14
+ unit?: string;
15
+ color?: string;
16
+ ariaLabel?: string;
17
+ }
8
18
 
9
- export let items: DumbbellItem[] = [];
10
- export let unit: string = '';
11
- export let color: string = '#006FFF';
12
- export let ariaLabel: string = 'Dumbbell chart';
19
+ let {
20
+ items = [],
21
+ unit = '',
22
+ color = '#006FFF',
23
+ ariaLabel = 'Dumbbell chart'
24
+ }: Props = $props();
13
25
 
14
26
  const VW = 340;
15
27
  const LABEL_W = 110;
@@ -21,19 +33,19 @@
21
33
  const AXIS_H = 18;
22
34
  const TICKS = 4;
23
35
 
24
- $: allValues = items.flatMap((it) => [it.start, it.end]);
25
- $: minVal = allValues.length ? Math.min(...allValues) : 0;
26
- $: maxVal = allValues.length ? Math.max(...allValues) : 1;
27
- $: range = maxVal - minVal || 1;
28
- $: svgH = PAD_T + items.length * ROW_H + AXIS_H;
36
+ let allValues = $derived(items.flatMap((it) => [it.start, it.end]));
37
+ let minVal = $derived(allValues.length ? Math.min(...allValues) : 0);
38
+ let maxVal = $derived(allValues.length ? Math.max(...allValues) : 1);
39
+ let range = $derived(maxVal - minVal || 1);
40
+ let svgH = $derived(PAD_T + items.length * ROW_H + AXIS_H);
29
41
 
30
42
  function tx(v: number): number {
31
43
  return LABEL_W + ((v - minVal) / range) * TRACK_W;
32
44
  }
33
45
 
34
- $: ticks = Array.from({ length: TICKS + 1 }, (_, i) =>
46
+ let ticks = $derived(Array.from({ length: TICKS + 1 }, (_, i) =>
35
47
  Math.round(minVal + (i / TICKS) * range),
36
- );
48
+ ));
37
49
  </script>
38
50
 
39
51
  <div role="img" aria-label={ariaLabel} style="width:100%;">
@@ -1,18 +1,27 @@
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: number = 0;
10
- export let maxHours: number = 99;
11
- export let disabled: boolean = false;
12
- let className = '';
13
- export { className as class };
8
+ interface Props {
9
+ label?: string | undefined;
10
+ value?: number;
11
+ maxHours?: number;
12
+ disabled?: boolean;
13
+ class?: string;
14
+ onchange?: (payload: number) => void;
15
+ }
14
16
 
15
- const dispatch = createEventDispatcher<{ change: number }>();
17
+ let {
18
+ label = undefined,
19
+ value = $bindable(0),
20
+ maxHours = 99,
21
+ disabled = false,
22
+ class: className = '',
23
+ onchange,
24
+ }: Props = $props();
16
25
  const uid = `dash-ui-dur-${++counter}`;
17
26
 
18
27
  function toHMS(secs: number): [number, number, number] {
@@ -28,9 +37,9 @@
28
37
  return String(n).padStart(2, '0');
29
38
  }
30
39
 
31
- $: [hours, minutes, seconds] = toHMS(value);
40
+ let [hours, minutes, seconds] = $derived(toHMS(value));
32
41
 
33
- let inputs: [HTMLInputElement | null, HTMLInputElement | null, HTMLInputElement | null] = [null, null, null];
42
+ let inputs: [HTMLInputElement | null, HTMLInputElement | null, HTMLInputElement | null] = $state([null, null, null]);
34
43
 
35
44
  function focusAt(i: number) {
36
45
  const el = inputs[i];
@@ -39,7 +48,7 @@
39
48
 
40
49
  function commit(h: number, m: number, s: number) {
41
50
  value = fromHMS(Math.min(maxHours, h), m, s);
42
- dispatch('change', value);
51
+ onchange?.(value);
43
52
  }
44
53
 
45
54
  function handleKey(field: number, e: KeyboardEvent) {
@@ -80,8 +89,8 @@
80
89
  { idx: 2, ariaLabel: 'Seconds' },
81
90
  ];
82
91
 
83
- $: fieldVals = [hours, minutes, seconds];
84
- $: fieldMaxes = [maxHours, 59, 59];
92
+ let fieldVals = $derived([hours, minutes, seconds]);
93
+ let fieldMaxes = $derived([maxHours, 59, 59]);
85
94
  </script>
86
95
 
87
96
  <div class="dur-input-wrapper {className}">
@@ -106,9 +115,9 @@
106
115
  {disabled}
107
116
  maxlength={2}
108
117
  class="dur-input__field"
109
- on:input={(e) => handleInput(idx, e)}
110
- on:keydown={(e) => handleKey(idx, e)}
111
- on:focus={(e) => e.currentTarget.select()}
118
+ oninput={(e) => handleInput(idx, e)}
119
+ onkeydown={(e) => handleKey(idx, e)}
120
+ onfocus={(e) => e.currentTarget.select()}
112
121
  />
113
122
  {#if i < 2}
114
123
  <span class="dur-input__sep" aria-hidden="true">:</span>
@@ -1,8 +1,18 @@
1
1
  <script lang="ts">
2
- export let title: string;
3
- export let description: string | undefined = undefined;
4
- let className = '';
5
- export { className as class };
2
+ interface Props {
3
+ title: string;
4
+ description?: string | undefined;
5
+ class?: string;
6
+ action?: import('svelte').Snippet;
7
+ }
8
+
9
+ let {
10
+ title,
11
+ description = undefined,
12
+ class: className = '',
13
+ action
14
+ }: Props = $props();
15
+
6
16
  </script>
7
17
 
8
18
  <div role="status" aria-live="polite" class="empty-state {className}">
@@ -15,7 +25,7 @@
15
25
  {#if description}
16
26
  <p class="empty-state__desc">{description}</p>
17
27
  {/if}
18
- {#if $$slots.action}
19
- <div class="empty-state__action"><slot name="action" /></div>
28
+ {#if action}
29
+ <div class="empty-state__action">{@render action?.()}</div>
20
30
  {/if}
21
31
  </div>
@@ -1,4 +1,4 @@
1
- <script lang="ts">
1
+ <script module lang="ts">
2
2
  export interface ErrorBandSeries {
3
3
  label: string;
4
4
  color: string;
@@ -6,13 +6,27 @@
6
6
  lower: number[];
7
7
  upper: number[];
8
8
  }
9
+ </script>
10
+
11
+ <script lang="ts">
12
+
13
+ interface Props {
14
+ series?: ErrorBandSeries[];
15
+ xLabels?: string[];
16
+ yRange?: [number, number] | undefined;
17
+ height?: number;
18
+ unit?: string;
19
+ ariaLabel?: string;
20
+ }
9
21
 
10
- export let series: ErrorBandSeries[] = [];
11
- export let xLabels: string[] = [];
12
- export let yRange: [number, number] | undefined = undefined;
13
- export let height = 180;
14
- export let unit = '';
15
- export let ariaLabel = 'Error band chart';
22
+ let {
23
+ series = [],
24
+ xLabels = [],
25
+ yRange = undefined,
26
+ height = 180,
27
+ unit = '',
28
+ ariaLabel = 'Error band chart'
29
+ }: Props = $props();
16
30
 
17
31
  const VW = 340;
18
32
  const PAD_L = 28;
@@ -21,13 +35,13 @@
21
35
  const PAD_B = 20;
22
36
  const PLOT_W = VW - PAD_L - PAD_R;
23
37
 
24
- $: n = series.length ? series[0].mean.length : 0;
25
- $: PLOT_H = height - PAD_T - PAD_B;
26
- $: allVals = series.flatMap((s) => [...s.lower, ...s.upper]);
27
- $: minV = yRange ? yRange[0] : allVals.length ? Math.min(...allVals) : 0;
28
- $: maxV = yRange ? yRange[1] : allVals.length ? Math.max(...allVals) : 1;
29
- $: vRange = maxV - minV || 1;
30
- $: yTicks = [minV, (minV + maxV) / 2, maxV];
38
+ let n = $derived(series.length ? series[0].mean.length : 0);
39
+ let PLOT_H = $derived(height - PAD_T - PAD_B);
40
+ let allVals = $derived(series.flatMap((s) => [...s.lower, ...s.upper]));
41
+ let minV = $derived(yRange ? yRange[0] : allVals.length ? Math.min(...allVals) : 0);
42
+ let maxV = $derived(yRange ? yRange[1] : allVals.length ? Math.max(...allVals) : 1);
43
+ let vRange = $derived(maxV - minV || 1);
44
+ let yTicks = $derived([minV, (minV + maxV) / 2, maxV]);
31
45
 
32
46
  function tx(i: number): number {
33
47
  return PAD_L + (i / (n - 1 || 1)) * PLOT_W;
@@ -1,8 +1,20 @@
1
1
  <script lang="ts">
2
- export let colSpan: number;
3
- export let defaultExpanded: boolean = false;
2
+ interface Props {
3
+ colSpan: number;
4
+ defaultExpanded?: boolean;
5
+ row?: import('svelte').Snippet;
6
+ detail?: import('svelte').Snippet;
7
+ }
4
8
 
5
- let open = defaultExpanded;
9
+ let {
10
+ colSpan,
11
+ defaultExpanded = false,
12
+ row,
13
+ detail
14
+ }: Props = $props();
15
+
16
+ // svelte-ignore state_referenced_locally
17
+ let open = $state(defaultExpanded);
6
18
  const detailId = `exp-${Math.random().toString(36).slice(2, 9)}`;
7
19
  </script>
8
20
 
@@ -14,7 +26,8 @@
14
26
  class="exp-toggle"
15
27
  aria-expanded={open}
16
28
  aria-controls={detailId}
17
- on:click={() => (open = !open)}
29
+ aria-label={open ? 'Collapse row' : 'Expand row'}
30
+ onclick={() => (open = !open)}
18
31
  >
19
32
  <svg
20
33
  class="exp-chevron"
@@ -27,7 +40,7 @@
27
40
  </svg>
28
41
  </button>
29
42
  </td>
30
- <slot name="row" />
43
+ {@render row?.()}
31
44
  </tr>
32
45
  <tr
33
46
  id={detailId}
@@ -36,7 +49,7 @@
36
49
  aria-hidden={!open}
37
50
  >
38
51
  <td colspan={colSpan + 1} class="exp-detail-cell">
39
- <slot name="detail" />
52
+ {@render detail?.()}
40
53
  </td>
41
54
  </tr>
42
55
  </tbody>
@@ -1,18 +1,32 @@
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
- export let label: string;
7
- export let value: string = '';
8
- export let id: string | undefined = undefined;
9
- export let error: string | undefined = undefined;
10
- export let required: boolean = false;
11
- export let hint: string | undefined = undefined;
6
+ interface Props {
7
+ label: string;
8
+ value?: string;
9
+ id?: string | undefined;
10
+ error?: string | undefined;
11
+ required?: boolean;
12
+ hint?: string | undefined;
13
+ children?: import('svelte').Snippet;
14
+ }
15
+
16
+ let {
17
+ label,
18
+ value = $bindable(''),
19
+ id = undefined,
20
+ error = undefined,
21
+ required = false,
22
+ hint = undefined,
23
+ children
24
+ }: Props = $props();
25
+ // svelte-ignore state_referenced_locally
12
26
  const inputId = id ?? `dash-ui-field-${++counter}`;
13
- $: errorId = error ? `${inputId}-error` : undefined;
14
- $: hintId = hint ? `${inputId}-hint` : undefined;
15
- $: describedBy = [hintId, errorId].filter(Boolean).join(' ') || undefined;
27
+ let errorId = $derived(error ? `${inputId}-error` : undefined);
28
+ let hintId = $derived(hint ? `${inputId}-hint` : undefined);
29
+ let describedBy = $derived([hintId, errorId].filter(Boolean).join(' ') || undefined);
16
30
  </script>
17
31
 
18
32
  <div class="field">
@@ -22,8 +36,8 @@
22
36
  {#if hint}
23
37
  <div class="field-hint" id={hintId}>{hint}</div>
24
38
  {/if}
25
- {#if $$slots.default}
26
- <slot />
39
+ {#if children}
40
+ {@render children?.()}
27
41
  {:else}
28
42
  <input
29
43
  class="input"
@@ -1,23 +1,32 @@
1
1
  <script lang="ts">
2
- import { createEventDispatcher } from 'svelte';
2
+
3
3
 
4
- export let label = 'Upload file';
5
- export let hint: string | undefined = undefined;
6
- export let accept: string | undefined = undefined;
7
- export let multiple = false;
8
- export let disabled = false;
9
-
10
- const dispatch = createEventDispatcher<{ files: File[] }>();
4
+ interface Props {
5
+ label?: string;
6
+ hint?: string | undefined;
7
+ accept?: string | undefined;
8
+ multiple?: boolean;
9
+ disabled?: boolean;
10
+ onfiles?: (payload: File[]) => void;
11
+ }
11
12
 
12
- let drag = false;
13
- let done: string | null = null;
14
- let inputEl: HTMLInputElement;
13
+ let {
14
+ label = 'Upload file',
15
+ hint = undefined,
16
+ accept = undefined,
17
+ multiple = false,
18
+ disabled = false,
19
+ onfiles,
20
+ }: Props = $props();
21
+ let drag = $state(false);
22
+ let done: string | null = $state(null);
23
+ let inputEl = $state<HTMLInputElement | undefined>(undefined);
15
24
 
16
25
  function handleFiles(files: FileList | null) {
17
26
  if (!files || files.length === 0) return;
18
27
  const arr = Array.from(files);
19
28
  done = arr.length === 1 ? arr[0].name : `${arr.length} files selected`;
20
- dispatch('files', arr);
29
+ onfiles?.(arr);
21
30
  }
22
31
 
23
32
  function onChange(e: Event) {
@@ -43,13 +52,13 @@
43
52
  }
44
53
 
45
54
  function onClick() {
46
- if (!disabled) inputEl.click();
55
+ if (!disabled) inputEl?.click();
47
56
  }
48
57
 
49
58
  function onKeyDown(e: KeyboardEvent) {
50
59
  if (e.key === 'Enter' || e.key === ' ') {
51
60
  e.preventDefault();
52
- if (!disabled) inputEl.click();
61
+ if (!disabled) inputEl?.click();
53
62
  }
54
63
  }
55
64
  </script>
@@ -60,11 +69,11 @@
60
69
  class:file-upload--drag={drag}
61
70
  class:file-upload--done={done}
62
71
  class:file-upload--disabled={disabled}
63
- on:dragover={onDragOver}
64
- on:dragleave={onDragLeave}
65
- on:drop={onDrop}
66
- on:click={onClick}
67
- on:keydown={onKeyDown}
72
+ ondragover={onDragOver}
73
+ ondragleave={onDragLeave}
74
+ ondrop={onDrop}
75
+ onclick={onClick}
76
+ onkeydown={onKeyDown}
68
77
  tabindex={disabled ? -1 : 0}
69
78
  aria-label={done ?? label}
70
79
  >
@@ -77,7 +86,7 @@
77
86
  class="sr-only"
78
87
  aria-label={label}
79
88
  tabindex="-1"
80
- on:change={onChange}
89
+ onchange={onChange}
81
90
  />
82
91
  <svg class="file-upload__icon" viewBox="0 0 24 24" aria-hidden="true" focusable="false">
83
92
  {#if done}
@@ -1,4 +1,4 @@
1
- <script context="module" lang="ts">
1
+ <script module lang="ts">
2
2
  let counter = 0;
3
3
  export interface FilterField {
4
4
  key: string;
@@ -26,18 +26,28 @@
26
26
  </script>
27
27
 
28
28
  <script lang="ts">
29
- import { createEventDispatcher } from 'svelte';
29
+ interface Props {
30
+ fields?: FilterField[];
31
+ value?: FilterRule[];
32
+ conjunction?: 'and' | 'or';
33
+ ariaLabel?: string;
34
+ onchange?: (payload: { rules: FilterRule[]; conjunction: 'and' | 'or' }) => void;
35
+ }
30
36
 
31
- export let fields: FilterField[] = [];
32
- export let value: FilterRule[] = [];
33
- export let conjunction: 'and' | 'or' = 'and';
34
- export let ariaLabel = 'Filter builder';
37
+ let {
38
+ fields = [],
39
+ value = [],
40
+ conjunction = 'and',
41
+ ariaLabel = 'Filter builder',
42
+ onchange,
43
+ }: Props = $props();
35
44
 
36
45
  const uid = `dash-ui-fb-${++counter}`;
37
- const dispatch = createEventDispatcher<{ change: { rules: FilterRule[]; conjunction: 'and' | 'or' } }>();
46
+
47
+ const CONJUNCTIONS = ['and', 'or'] as const;
38
48
 
39
49
  function emit(rules: FilterRule[], conj: 'and' | 'or' = conjunction) {
40
- dispatch('change', { rules, conjunction: conj });
50
+ onchange?.({ rules, conjunction: conj });
41
51
  }
42
52
 
43
53
  function addRule() {
@@ -69,20 +79,20 @@
69
79
  {#if value.length > 0}
70
80
  <span class="fb-conj-label">Match</span>
71
81
  <div class="fb-conj" role="group" aria-label="Conjunction">
72
- {#each ['and', 'or'] as c}
82
+ {#each CONJUNCTIONS as c}
73
83
  <button
74
84
  type="button"
75
85
  class="fb-conj-btn{conjunction === c ? ' is-active' : ''}"
76
86
  aria-pressed={conjunction === c}
77
- on:click={() => emit(value, c)}
87
+ onclick={() => emit(value, c)}
78
88
  >{c.toUpperCase()}</button>
79
89
  {/each}
80
90
  </div>
81
91
  <span class="fb-conj-label">conditions</span>
82
92
  {/if}
83
- <button type="button" class="fb-add" on:click={addRule} aria-label="Add filter rule">+ Add rule</button>
93
+ <button type="button" class="fb-add" onclick={addRule} aria-label="Add filter rule">+ Add rule</button>
84
94
  {#if value.length > 0}
85
- <button type="button" class="fb-clear" on:click={() => emit([])} aria-label="Clear all filters">Clear</button>
95
+ <button type="button" class="fb-clear" onclick={() => emit([])} aria-label="Clear all filters">Clear</button>
86
96
  {/if}
87
97
  </div>
88
98
  {#if value.length > 0}
@@ -99,7 +109,7 @@
99
109
  id={fieldId}
100
110
  class="fb-select"
101
111
  value={rule.field}
102
- on:change={(e) => setField(rule.id, e.currentTarget.value)}
112
+ onchange={(e) => setField(rule.id, e.currentTarget.value)}
103
113
  aria-label="Rule {i + 1} field"
104
114
  >
105
115
  {#each fields as x}
@@ -111,7 +121,7 @@
111
121
  id={opId}
112
122
  class="fb-select fb-select--op"
113
123
  value={rule.op}
114
- on:change={(e) => setOp(rule.id, e.currentTarget.value)}
124
+ onchange={(e) => setOp(rule.id, e.currentTarget.value)}
115
125
  aria-label="Rule {i + 1} operator"
116
126
  >
117
127
  {#each ops as op}
@@ -124,7 +134,7 @@
124
134
  id={valId}
125
135
  class="fb-select fb-select--val"
126
136
  value={rule.value}
127
- on:change={(e) => setValue(rule.id, e.currentTarget.value)}
137
+ onchange={(e) => setValue(rule.id, e.currentTarget.value)}
128
138
  aria-label="Rule {i + 1} value"
129
139
  >
130
140
  <option value="">Any</option>
@@ -139,14 +149,14 @@
139
149
  type={f?.type === 'number' ? 'number' : 'text'}
140
150
  value={rule.value}
141
151
  placeholder="Value…"
142
- on:input={(e) => setValue(rule.id, e.currentTarget.value)}
152
+ oninput={(e) => setValue(rule.id, e.currentTarget.value)}
143
153
  aria-label="Rule {i + 1} value"
144
154
  />
145
155
  {/if}
146
156
  <button
147
157
  type="button"
148
158
  class="fb-remove icon-btn"
149
- on:click={() => removeRule(rule.id)}
159
+ onclick={() => removeRule(rule.id)}
150
160
  aria-label="Remove rule {i + 1}"
151
161
  >
152
162
  <svg viewBox="0 0 12 12" width="10" height="10" aria-hidden="true" fill="currentColor">
@@ -1,14 +1,21 @@
1
- <script lang="ts">
1
+ <script module lang="ts">
2
2
  export interface FlameNode {
3
3
  label: string;
4
4
  value?: number;
5
5
  color?: string;
6
6
  children?: FlameNode[];
7
7
  }
8
+ </script>
9
+
10
+ <script lang="ts">
11
+
12
+ interface Props {
13
+ root: FlameNode;
14
+ height?: number;
15
+ ariaLabel?: string;
16
+ }
8
17
 
9
- export let root: FlameNode;
10
- export let height = 160;
11
- export let ariaLabel = 'Flame graph';
18
+ let { root, height = 160, ariaLabel = 'Flame graph' }: Props = $props();
12
19
 
13
20
  const PALETTE = ['#006FFF', '#FF7B2E', '#F5A623', '#FB923C', '#F97316', '#EF4444', '#A78BFA'];
14
21
  const VW = 340;
@@ -50,9 +57,9 @@
50
57
  return cells;
51
58
  }
52
59
 
53
- $: depth = treeDepth(root);
54
- $: levelH = height / (depth + 1);
55
- $: cells = flatten(root, 0, 0, VW, levelH, height, PALETTE[0], { n: 0 });
60
+ let depth = $derived(treeDepth(root));
61
+ let levelH = $derived(height / (depth + 1));
62
+ let cells = $derived(flatten(root, 0, 0, VW, levelH, height, PALETTE[0], { n: 0 }));
56
63
  </script>
57
64
 
58
65
  {#if cells.length > 0}