@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,4 +1,4 @@
1
- <script lang="ts">
1
+ <script module lang="ts">
2
2
  export interface FDNode {
3
3
  id: string;
4
4
  label?: string;
@@ -9,11 +9,23 @@
9
9
  source: string;
10
10
  target: string;
11
11
  }
12
+ </script>
13
+
14
+ <script lang="ts">
15
+
16
+ interface Props {
17
+ nodes?: FDNode[];
18
+ links?: FDLink[];
19
+ height?: number;
20
+ ariaLabel?: string;
21
+ }
12
22
 
13
- export let nodes: FDNode[] = [];
14
- export let links: FDLink[] = [];
15
- export let height = 260;
16
- export let ariaLabel = 'Force-directed network graph';
23
+ let {
24
+ nodes = [],
25
+ links = [],
26
+ height = 260,
27
+ ariaLabel = 'Force-directed network graph'
28
+ }: Props = $props();
17
29
 
18
30
  const PALETTE = ['#006FFF', '#00C875', '#FF7B7B', '#F5C26B', '#A78BFA', '#34D399'];
19
31
  const VW = 340;
@@ -77,8 +89,8 @@
77
89
  return state.map((s) => ({ x: s.x, y: s.y }));
78
90
  }
79
91
 
80
- $: pos = nodes.length > 0 ? layout(VW, height) : [];
81
- $: idxById = Object.fromEntries(nodes.map((n, i) => [n.id, i]));
92
+ let pos = $derived(nodes.length > 0 ? layout(VW, height) : []);
93
+ let idxById = $derived(Object.fromEntries(nodes.map((n, i) => [n.id, i])));
82
94
  </script>
83
95
 
84
96
  {#if nodes.length > 0}
@@ -1,28 +1,35 @@
1
- <script lang="ts">
1
+ <script module lang="ts">
2
2
  export interface FunnelSegment {
3
3
  label: string;
4
4
  value: number;
5
5
  color?: string;
6
6
  }
7
+ </script>
8
+
9
+ <script lang="ts">
10
+
11
+ interface Props {
12
+ segments?: FunnelSegment[];
13
+ height?: number;
14
+ ariaLabel?: string;
15
+ }
7
16
 
8
- export let segments: FunnelSegment[] = [];
9
- export let height: number = 160;
10
- export let ariaLabel: string = 'Funnel chart';
17
+ let { segments = [], height = 160, ariaLabel = 'Funnel chart' }: Props = $props();
11
18
 
12
19
  const VW = 320;
13
20
  const PAD = { t: 4, r: 8, b: 4, l: 8 };
14
21
  const SEP = 2;
15
22
  const DEFAULT_COLORS = ['#006FFF', '#0092FF', '#00B4C2', '#00C875', '#F5A623'];
16
23
 
17
- $: maxVal = segments.length ? Math.max(...segments.map((s) => s.value)) : 1;
18
- $: n = segments.length;
19
- $: chartH = height - PAD.t - PAD.b;
20
- $: slotH = n > 0 ? (chartH - SEP * (n - 1)) / n : chartH;
21
- $: chartW = VW - PAD.l - PAD.r;
22
- $: cx = PAD.l + chartW / 2;
23
- $: widths = segments.map((s) => (s.value / (maxVal || 1)) * chartW);
24
+ let maxVal = $derived(segments.length ? Math.max(...segments.map((s) => s.value)) : 1);
25
+ let n = $derived(segments.length);
26
+ let chartH = $derived(height - PAD.t - PAD.b);
27
+ let slotH = $derived(n > 0 ? (chartH - SEP * (n - 1)) / n : chartH);
28
+ let chartW = $derived(VW - PAD.l - PAD.r);
29
+ let cx = $derived(PAD.l + chartW / 2);
30
+ let widths = $derived(segments.map((s) => (s.value / (maxVal || 1)) * chartW));
24
31
 
25
- $: shapes = segments.map((s, i) => {
32
+ let shapes = $derived(segments.map((s, i) => {
26
33
  const tw = widths[i];
27
34
  const bw = i + 1 < n ? widths[i + 1] : widths[i] * 0.7;
28
35
  const y0 = PAD.t + i * (slotH + SEP);
@@ -35,7 +42,7 @@
35
42
  cx: cx.toFixed(1),
36
43
  cy: ((y0 + y1) / 2).toFixed(1),
37
44
  };
38
- });
45
+ }));
39
46
  </script>
40
47
 
41
48
  <div role="img" aria-label={ariaLabel} style="width:100%;">
@@ -1,14 +1,21 @@
1
- <script lang="ts">
1
+ <script module lang="ts">
2
2
  export interface GanttTask {
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
+ tasks?: GanttTask[];
14
+ xLabels?: string[];
15
+ ariaLabel?: string;
16
+ }
8
17
 
9
- export let tasks: GanttTask[] = [];
10
- export let xLabels: string[] = [];
11
- export let ariaLabel: string = 'Gantt chart';
18
+ let { tasks = [], xLabels = [], ariaLabel = 'Gantt chart' }: Props = $props();
12
19
 
13
20
  const VW = 340;
14
21
  const LABEL_W = 100;
@@ -19,11 +26,11 @@
19
26
  const PAD_T = 6;
20
27
  const AXIS_H = 18;
21
28
 
22
- $: svgH = PAD_T + tasks.length * ROW_H + AXIS_H;
23
- $: ticks = xLabels.map((lbl, i) => ({
29
+ let svgH = $derived(PAD_T + tasks.length * ROW_H + AXIS_H);
30
+ let ticks = $derived(xLabels.map((lbl, i) => ({
24
31
  x: LABEL_W + (i / (xLabels.length - 1 || 1)) * TRACK_W,
25
32
  lbl,
26
- }));
33
+ })));
27
34
 
28
35
  function tx(v: number): number {
29
36
  return LABEL_W + v * TRACK_W;
@@ -1,21 +1,31 @@
1
1
  <script lang="ts">
2
- export let value: number = 0;
3
- export let label: string = '';
4
- export let color: string = '#006FFF';
5
- export let size: number = 120;
6
- export let ariaLabel: string | undefined = undefined;
2
+ interface Props {
3
+ value?: number;
4
+ label?: string;
5
+ color?: string;
6
+ size?: number;
7
+ ariaLabel?: string | undefined;
8
+ }
7
9
 
8
- $: sw = 10;
9
- $: cx = size / 2;
10
- $: cy = size / 2;
11
- $: r = cx - sw / 2 - 2;
12
- $: svgH = Math.round(size * 0.7);
13
- $: pathLen = Math.PI * r;
14
- $: fillLen = (Math.min(100, Math.max(0, value)) / 100) * pathLen;
15
- $: d = `M ${cx - r},${cy} A ${r},${r} 0 1 1 ${cx + r},${cy}`;
16
- $: valY = cy + Math.round(size * 0.06);
17
- $: lblY = valY + Math.round(size * 0.13) + 2;
18
- $: a11yLabel = ariaLabel ?? `${label} ${value}%`;
10
+ let {
11
+ value = 0,
12
+ label = '',
13
+ color = '#006FFF',
14
+ size = 120,
15
+ ariaLabel = undefined
16
+ }: Props = $props();
17
+
18
+ const sw = 10;
19
+ let cx = $derived(size / 2);
20
+ let cy = $derived(size / 2);
21
+ let r = $derived(cx - sw / 2 - 2);
22
+ let svgH = $derived(Math.round(size * 0.7));
23
+ let pathLen = $derived(Math.PI * r);
24
+ let fillLen = $derived((Math.min(100, Math.max(0, value)) / 100) * pathLen);
25
+ let d = $derived(`M ${cx - r},${cy} A ${r},${r} 0 1 1 ${cx + r},${cy}`);
26
+ let valY = $derived(cy + Math.round(size * 0.06));
27
+ let lblY = $derived(valY + Math.round(size * 0.13) + 2);
28
+ let a11yLabel = $derived(ariaLabel ?? `${label} ${value}%`);
19
29
  </script>
20
30
 
21
31
  <div
@@ -1,4 +1,4 @@
1
- <script context="module" lang="ts">
1
+ <script module lang="ts">
2
2
  export type GroupedListItemStatus = 'danger' | 'warn' | 'success' | 'info' | 'neutral';
3
3
 
4
4
  export interface GroupedListItem {
@@ -17,9 +17,13 @@
17
17
  </script>
18
18
 
19
19
  <script lang="ts">
20
- export let groups: GroupedListGroup[];
21
- export let collapsible: boolean = true;
22
- export let ariaLabel: string = 'Grouped list';
20
+ interface Props {
21
+ groups: GroupedListGroup[];
22
+ collapsible?: boolean;
23
+ ariaLabel?: string;
24
+ }
25
+
26
+ let { groups, collapsible = true, ariaLabel = 'Grouped list' }: Props = $props();
23
27
 
24
28
  const STATUS_COLORS: Record<GroupedListItemStatus, string> = {
25
29
  danger: '#F03A3A',
@@ -30,7 +34,10 @@
30
34
  };
31
35
 
32
36
  const uid = Math.random().toString(36).slice(2, 9);
33
- let open: boolean[] = groups.map(g => g.defaultOpen !== false);
37
+ // Initial open state mirrors each group's `defaultOpen` once; afterwards
38
+ // the user toggles each entry independently.
39
+ // svelte-ignore state_referenced_locally
40
+ let open: boolean[] = $state(groups.map((g) => g.defaultOpen !== false));
34
41
 
35
42
  function toggle(i: number) { open[i] = !open[i]; open = [...open]; }
36
43
  </script>
@@ -46,7 +53,7 @@
46
53
  class="gl-header"
47
54
  aria-expanded={isOpen}
48
55
  aria-controls={panelId}
49
- on:click={() => toggle(gi)}
56
+ onclick={() => toggle(gi)}
50
57
  >
51
58
  {#if group.color}<span class="gl-color-dot" style="background:{group.color}" aria-hidden="true"></span>{/if}
52
59
  <span class="gl-title">{group.label}</span>
@@ -1,9 +1,18 @@
1
1
  <script lang="ts">
2
- export let value: number;
3
- export let fillStyle: string = '';
4
- export let label: string | undefined = undefined;
5
- export let valueText: string | undefined = undefined;
6
- $: clamped = Math.max(0, Math.min(100, value));
2
+ interface Props {
3
+ value: number;
4
+ fillStyle?: string;
5
+ label?: string | undefined;
6
+ valueText?: string | undefined;
7
+ }
8
+
9
+ let {
10
+ value,
11
+ fillStyle = '',
12
+ label = undefined,
13
+ valueText = undefined
14
+ }: Props = $props();
15
+ let clamped = $derived(Math.max(0, Math.min(100, value)));
7
16
  </script>
8
17
 
9
18
  <div
@@ -1,10 +1,21 @@
1
1
  <script lang="ts">
2
- export let data: number[][] = [];
3
- export let colors: string[] = ['#1B2D5A', '#3F7BC4', '#7FB6FF', '#F5C26B', '#F5A623', '#FF7B7B'];
4
- export let xLabels: string[] = [];
5
- export let height: number = 160;
6
- export let cellGap: number = 1;
7
- export let ariaLabel: string = 'Heat map';
2
+ interface Props {
3
+ data?: number[][];
4
+ colors?: string[];
5
+ xLabels?: string[];
6
+ height?: number;
7
+ cellGap?: number;
8
+ ariaLabel?: string;
9
+ }
10
+
11
+ let {
12
+ data = [],
13
+ colors = ['#1B2D5A', '#3F7BC4', '#7FB6FF', '#F5C26B', '#F5A623', '#FF7B7B'],
14
+ xLabels = [],
15
+ height = 160,
16
+ cellGap = 1,
17
+ ariaLabel = 'Heat map'
18
+ }: Props = $props();
8
19
 
9
20
  const VW = 400;
10
21
  const PAD_BASE = { t: 4, r: 4, l: 4 };
@@ -24,15 +35,15 @@
24
35
  return `rgb(${Math.round(r1 + f * (r2 - r1))},${Math.round(g1 + f * (g2 - g1))},${Math.round(b1 + f * (b2 - b1))})`;
25
36
  }
26
37
 
27
- $: rows = data.length;
28
- $: cols = data[0]?.length ?? 0;
29
- $: padB = xLabels.length ? 16 : 4;
30
- $: chartW = VW - PAD_BASE.l - PAD_BASE.r;
31
- $: chartH = height - PAD_BASE.t - padB;
32
- $: cellW = cols > 0 ? (chartW - (cols - 1) * cellGap) / cols : 0;
33
- $: cellH = rows > 0 ? (chartH - (rows - 1) * cellGap) / rows : 0;
38
+ let rows = $derived(data.length);
39
+ let cols = $derived(data[0]?.length ?? 0);
40
+ let padB = $derived(xLabels.length ? 16 : 4);
41
+ let chartW = $derived(VW - PAD_BASE.l - PAD_BASE.r);
42
+ let chartH = $derived(height - PAD_BASE.t - padB);
43
+ let cellW = $derived(cols > 0 ? (chartW - (cols - 1) * cellGap) / cols : 0);
44
+ let cellH = $derived(rows > 0 ? (chartH - (rows - 1) * cellGap) / rows : 0);
34
45
 
35
- $: rects = rows > 0 && cols > 0
46
+ let rects = $derived(rows > 0 && cols > 0
36
47
  ? data.flatMap((rowData, row) =>
37
48
  rowData.map((val, col) => ({
38
49
  key: `${row}-${col}`,
@@ -43,13 +54,13 @@
43
54
  fill: interpolateColor(colors, val),
44
55
  }))
45
56
  )
46
- : [];
57
+ : []);
47
58
 
48
- $: labelNodes = xLabels.map((lbl, i) => ({
59
+ let labelNodes = $derived(xLabels.map((lbl, i) => ({
49
60
  lbl,
50
61
  x: (PAD_BASE.l + (xLabels.length > 1 ? (i / (xLabels.length - 1)) * chartW : chartW / 2)).toFixed(1),
51
62
  y: height - 2,
52
- }));
63
+ })));
53
64
  </script>
54
65
 
55
66
  <div role="img" aria-label={ariaLabel} style="width:100%;">
@@ -1,15 +1,29 @@
1
- <script lang="ts">
1
+ <script module lang="ts">
2
2
  export interface HexbinPoint {
3
3
  x: number;
4
4
  y: number;
5
5
  }
6
+ </script>
7
+
8
+ <script lang="ts">
9
+
10
+ interface Props {
11
+ points?: HexbinPoint[];
12
+ xRange?: [number, number] | undefined;
13
+ yRange?: [number, number] | undefined;
14
+ height?: number;
15
+ hexRadius?: number;
16
+ ariaLabel?: string;
17
+ }
6
18
 
7
- export let points: HexbinPoint[] = [];
8
- export let xRange: [number, number] | undefined = undefined;
9
- export let yRange: [number, number] | undefined = undefined;
10
- export let height = 200;
11
- export let hexRadius = 10;
12
- export let ariaLabel = 'Hexbin chart';
19
+ let {
20
+ points = [],
21
+ xRange = undefined,
22
+ yRange = undefined,
23
+ height = 200,
24
+ hexRadius = 10,
25
+ ariaLabel = 'Hexbin chart'
26
+ }: Props = $props();
13
27
 
14
28
  const ROOT3 = Math.sqrt(3);
15
29
  const VW = 340;
@@ -43,18 +57,18 @@
43
57
  return `M${pts.join('L')}Z`;
44
58
  }
45
59
 
46
- $: PLOT_W = VW - PAD_L - PAD_R;
47
- $: PLOT_H = height - PAD_T - PAD_B;
48
- $: xs = points.map((p) => p.x);
49
- $: ys = points.map((p) => p.y);
50
- $: xMin = xRange ? xRange[0] : (xs.length ? Math.min(...xs) : 0);
51
- $: xMax = xRange ? xRange[1] : (xs.length ? Math.max(...xs) : 1);
52
- $: yMin = yRange ? yRange[0] : (ys.length ? Math.min(...ys) : 0);
53
- $: yMax = yRange ? yRange[1] : (ys.length ? Math.max(...ys) : 1);
54
- $: xSpan = xMax - xMin || 1;
55
- $: ySpan = yMax - yMin || 1;
60
+ let PLOT_W = $derived(VW - PAD_L - PAD_R);
61
+ let PLOT_H = $derived(height - PAD_T - PAD_B);
62
+ let xs = $derived(points.map((p) => p.x));
63
+ let ys = $derived(points.map((p) => p.y));
64
+ let xMin = $derived(xRange ? xRange[0] : (xs.length ? Math.min(...xs) : 0));
65
+ let xMax = $derived(xRange ? xRange[1] : (xs.length ? Math.max(...xs) : 1));
66
+ let yMin = $derived(yRange ? yRange[0] : (ys.length ? Math.min(...ys) : 0));
67
+ let yMax = $derived(yRange ? yRange[1] : (ys.length ? Math.max(...ys) : 1));
68
+ let xSpan = $derived(xMax - xMin || 1);
69
+ let ySpan = $derived(yMax - yMin || 1);
56
70
 
57
- $: bins = (() => {
71
+ let bins = $derived((() => {
58
72
  const map = new Map<string, { q: number; r: number; count: number }>();
59
73
  for (const pt of points) {
60
74
  const px = ((pt.x - xMin) / xSpan) * PLOT_W;
@@ -66,11 +80,11 @@
66
80
  else map.set(key, { q, r, count: 1 });
67
81
  }
68
82
  return [...map.values()];
69
- })();
83
+ })());
70
84
 
71
- $: maxCount = bins.length ? Math.max(...bins.map((b) => b.count)) : 1;
72
- $: yTicks = [yMin, (yMin + yMax) / 2, yMax];
73
- $: xTicks = [xMin, (xMin + xMax) / 2, xMax];
85
+ let maxCount = $derived(bins.length ? Math.max(...bins.map((b) => b.count)) : 1);
86
+ let yTicks = $derived([yMin, (yMin + yMax) / 2, yMax]);
87
+ let xTicks = $derived([xMin, (xMin + xMax) / 2, xMax]);
74
88
 
75
89
  function ty(v: number): number { return PAD_T + (1 - (v - yMin) / ySpan) * PLOT_H; }
76
90
  function tx(v: number): number { return PAD_L + ((v - xMin) / xSpan) * PLOT_W; }
@@ -1,15 +1,28 @@
1
- <script lang="ts">
1
+ <script module lang="ts">
2
2
  export interface HistogramBin {
3
3
  x0: number;
4
4
  x1: number;
5
5
  count: number;
6
6
  }
7
+ </script>
8
+
9
+ <script lang="ts">
10
+
11
+ interface Props {
12
+ bins?: HistogramBin[];
13
+ height?: number;
14
+ color?: string;
15
+ xUnit?: string;
16
+ ariaLabel?: string;
17
+ }
7
18
 
8
- export let bins: HistogramBin[] = [];
9
- export let height: number = 160;
10
- export let color: string = '#006FFF';
11
- export let xUnit: string = '';
12
- export let ariaLabel: string = 'Histogram';
19
+ let {
20
+ bins = [],
21
+ height = 160,
22
+ color = '#006FFF',
23
+ xUnit = '',
24
+ ariaLabel = 'Histogram'
25
+ }: Props = $props();
13
26
 
14
27
  const VW = 320;
15
28
  const PAD_L = 36;
@@ -17,15 +30,15 @@
17
30
  const PAD_T = 8;
18
31
  const PAD_B = 28;
19
32
 
20
- $: PLOT_W = VW - PAD_L - PAD_R;
21
- $: PLOT_H = height - PAD_T - PAD_B;
22
- $: maxCount = Math.max(...bins.map((b) => b.count), 1);
23
- $: barW = PLOT_W / bins.length;
33
+ let PLOT_W = $derived(VW - PAD_L - PAD_R);
34
+ let PLOT_H = $derived(height - PAD_T - PAD_B);
35
+ let maxCount = $derived(Math.max(...bins.map((b) => b.count), 1));
36
+ let barW = $derived(PLOT_W / bins.length);
24
37
 
25
- $: yTicks = [0, 1, 2, 3].map((i) => Math.round((maxCount * i) / 3));
38
+ let yTicks = $derived([0, 1, 2, 3].map((i) => Math.round((maxCount * i) / 3)));
26
39
 
27
- $: xStep = bins.length <= 6 ? 1 : Math.ceil(bins.length / 5);
28
- $: xLabels = (() => {
40
+ let xStep = $derived(bins.length <= 6 ? 1 : Math.ceil(bins.length / 5));
41
+ let xLabels = $derived((() => {
29
42
  const labels: { x: number; label: string }[] = [];
30
43
  bins.forEach((bin, i) => {
31
44
  if (i % xStep === 0) {
@@ -34,7 +47,7 @@
34
47
  });
35
48
  labels.push({ x: PAD_L + PLOT_W, label: String(bins[bins.length - 1].x1) + xUnit });
36
49
  return labels;
37
- })();
50
+ })());
38
51
 
39
52
  function bh(count: number): number {
40
53
  return (count / maxCount) * PLOT_H;
@@ -1,14 +1,26 @@
1
- <script lang="ts">
1
+ <script module lang="ts">
2
2
  export interface HorizonSeries {
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?: HorizonSeries[];
13
+ xLabels?: string[] | undefined;
14
+ bands?: number;
15
+ ariaLabel?: string;
16
+ }
7
17
 
8
- export let series: HorizonSeries[] = [];
9
- export let xLabels: string[] | undefined = undefined;
10
- export let bands = 3;
11
- export let ariaLabel = 'Horizon chart';
18
+ let {
19
+ series = [],
20
+ xLabels = undefined,
21
+ bands = 3,
22
+ ariaLabel = 'Horizon chart'
23
+ }: Props = $props();
12
24
 
13
25
  const LABEL_W = 72;
14
26
  const ROW_H = 24;
@@ -16,18 +28,18 @@
16
28
  const X_H = 14;
17
29
  const W = 400;
18
30
 
19
- $: n = series[0]?.values.length ?? 0;
20
- $: allVals = series.flatMap((s) => s.values);
21
- $: maxVal = Math.max(...allVals, 1);
22
- $: step = maxVal / bands;
23
- $: chartW = W - LABEL_W;
24
- $: colW = chartW / Math.max(n, 1);
25
- $: totalH = series.length * (ROW_H + ROW_GAP) - ROW_GAP + (xLabels ? X_H + 4 : 0);
31
+ let n = $derived(series[0]?.values.length ?? 0);
32
+ let allVals = $derived(series.flatMap((s) => s.values));
33
+ let maxVal = $derived(Math.max(...allVals, 1));
34
+ let step = $derived(maxVal / bands);
35
+ let chartW = $derived(W - LABEL_W);
36
+ let colW = $derived(chartW / Math.max(n, 1));
37
+ let totalH = $derived(series.length * (ROW_H + ROW_GAP) - ROW_GAP + (xLabels ? X_H + 4 : 0));
26
38
 
27
39
  interface Band { x: number; y: number; w: number; h: number; alpha: number; color: string; }
28
40
  interface Row { rowY: number; color: string; label: string; bands: Band[]; }
29
41
 
30
- $: rows = series.map((s, si) => {
42
+ let rows = $derived(series.map((s, si) => {
31
43
  const rowY = si * (ROW_H + ROW_GAP);
32
44
  const color = s.color ?? '#006FFF';
33
45
  const rowBands: Band[] = [];
@@ -42,15 +54,15 @@
42
54
  }
43
55
  });
44
56
  return { rowY, color, label: s.label, bands: rowBands } as Row;
45
- });
57
+ }));
46
58
 
47
- $: xTickPositions = xLabels
59
+ let xTickPositions = $derived(xLabels
48
60
  ? xLabels.map((label, i) => ({
49
61
  label,
50
62
  x: LABEL_W + (i / Math.max(xLabels!.length - 1, 1)) * chartW,
51
63
  anchor: i === 0 ? 'start' : i === xLabels!.length - 1 ? 'end' : 'middle',
52
64
  }))
53
- : [];
65
+ : []);
54
66
  </script>
55
67
 
56
68
  {#if series.length}
@@ -1,16 +1,28 @@
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 { onDestroy } from 'svelte';
7
- export let placement: 'top' | 'bottom' | 'left' | 'right' = 'bottom';
8
- export let delay: number = 300;
9
- let className = '';
10
- export { className as class };
7
+ interface Props {
8
+ placement?: 'top' | 'bottom' | 'left' | 'right';
9
+ delay?: number;
10
+ class?: string;
11
+ trigger?: import('svelte').Snippet;
12
+ content?: import('svelte').Snippet;
13
+ }
14
+
15
+ let {
16
+ placement = 'bottom',
17
+ delay = 300,
18
+ class: className = '',
19
+ trigger,
20
+ content
21
+ }: Props = $props();
22
+
11
23
 
12
24
  const id = `dash-ui-hovercard-${++counter}`;
13
- let open = false;
25
+ let open = $state(false);
14
26
  let timer: ReturnType<typeof setTimeout> | null = null;
15
27
 
16
28
  function show() {
@@ -29,17 +41,17 @@
29
41
  <div
30
42
  role="group"
31
43
  class="hovercard-wrapper hovercard-{placement} {className}"
32
- on:mouseenter={show}
33
- on:mouseleave={hide}
34
- on:focusin={show}
35
- on:focusout={hide}
44
+ onmouseenter={show}
45
+ onmouseleave={hide}
46
+ onfocusin={show}
47
+ onfocusout={hide}
36
48
  >
37
49
  <div class="hovercard-trigger" aria-describedby={open ? id : undefined}>
38
- <slot name="trigger" />
50
+ {@render trigger?.()}
39
51
  </div>
40
52
  {#if open}
41
53
  <div {id} role="tooltip" class="hovercard">
42
- <slot name="content" />
54
+ {@render content?.()}
43
55
  </div>
44
56
  {/if}
45
57
  </div>