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