@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,6 +1,10 @@
1
1
  <script lang="ts">
2
- export let size: 'sm' | 'md' | 'lg' = 'md';
3
- export let label: string = 'Loading';
2
+ interface Props {
3
+ size?: 'sm' | 'md' | 'lg';
4
+ label?: string;
5
+ }
6
+
7
+ let { size = 'md', label = 'Loading' }: Props = $props();
4
8
  </script>
5
9
 
6
- <span role="status" aria-label={label} class="spinner {size}" />
10
+ <span role="status" aria-label={label} class="spinner {size}"></span>
@@ -1,24 +1,35 @@
1
- <script context="module" lang="ts">
1
+ <script module lang="ts">
2
2
  let counter = 0;
3
3
  export interface SplitButtonItem { id: string; label: string; disabled?: boolean; }
4
4
  </script>
5
5
 
6
6
  <script lang="ts">
7
- import { createEventDispatcher, onMount, onDestroy } from 'svelte';
7
+ import { onMount, onDestroy } from 'svelte';
8
8
 
9
- export let label: string;
10
- export let variant: 'primary' | 'ghost' | 'danger' = 'ghost';
11
- export let disabled: boolean = false;
12
- export let items: SplitButtonItem[] = [];
9
+ interface Props {
10
+ label: string;
11
+ variant?: 'primary' | 'ghost' | 'danger';
12
+ disabled?: boolean;
13
+ items?: SplitButtonItem[];
14
+ onprimary?: () => void;
15
+ onaction?: (payload: string) => void;
16
+ }
13
17
 
14
- const dispatch = createEventDispatcher<{ primary: void; action: string }>();
18
+ let {
19
+ label,
20
+ variant = 'ghost',
21
+ disabled = false,
22
+ items = [],
23
+ onprimary,
24
+ onaction,
25
+ }: Props = $props();
15
26
  const uid = `dash-ui-spbtn-${++counter}`;
16
27
  const menuId = `${uid}-menu`;
17
28
 
18
- let open = false;
19
- let activeIdx = 0;
20
- let caretEl: HTMLButtonElement;
21
- let wrapperEl: HTMLDivElement;
29
+ let open = $state(false);
30
+ let activeIdx = $state(0);
31
+ let caretEl = $state<HTMLButtonElement | undefined>(undefined);
32
+ let wrapperEl = $state<HTMLDivElement | undefined>(undefined);
22
33
 
23
34
  function toggleMenu() {
24
35
  if (!open) activeIdx = 0;
@@ -26,7 +37,7 @@
26
37
  }
27
38
 
28
39
  function activate(id: string) {
29
- dispatch('action', id);
40
+ onaction?.(id);
30
41
  open = false;
31
42
  caretEl?.focus();
32
43
  }
@@ -66,7 +77,7 @@
66
77
  type="button"
67
78
  class="btn btn-{variant} split-btn-primary"
68
79
  {disabled}
69
- on:click={() => dispatch('primary')}
80
+ onclick={() => onprimary?.()}
70
81
  >{label}</button>
71
82
  <button
72
83
  bind:this={caretEl}
@@ -77,8 +88,8 @@
77
88
  aria-haspopup="menu"
78
89
  aria-expanded={open}
79
90
  aria-controls={open ? menuId : undefined}
80
- on:click={toggleMenu}
81
- on:keydown={onKeyDown}
91
+ onclick={toggleMenu}
92
+ onkeydown={onKeyDown}
82
93
  >
83
94
  <svg width="10" height="10" viewBox="0 0 10 10" aria-hidden="true" focusable="false" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
84
95
  <path d="M1 3 L5 7 L9 3" />
@@ -93,8 +104,8 @@
93
104
  aria-disabled={item.disabled}
94
105
  data-active={idx === activeIdx ? 'true' : undefined}
95
106
  class="action-menu-item"
96
- on:mouseenter={() => { activeIdx = idx; }}
97
- on:mousedown|preventDefault={() => { if (!item.disabled) activate(item.id); }}
107
+ onmouseenter={() => { activeIdx = idx; }}
108
+ onmousedown={(e) => { e.preventDefault(); (() => { if (!item.disabled) activate(item.id); })(); }}
98
109
  >{item.label}</li>
99
110
  {/each}
100
111
  </ul>
@@ -1,15 +1,26 @@
1
1
  <script lang="ts">
2
2
  import { onMount } from 'svelte';
3
3
 
4
- export let maxHeight: number = 80;
5
- export let showLabel: string = 'Show more';
6
- export let hideLabel: string = 'Show less';
7
- let klass: string = '';
8
- export { klass as class };
4
+ interface Props {
5
+ maxHeight?: number;
6
+ showLabel?: string;
7
+ hideLabel?: string;
8
+ class?: string;
9
+ children?: import('svelte').Snippet;
10
+ }
9
11
 
10
- let expanded = false;
11
- let clipped = false;
12
- let bodyEl: HTMLDivElement;
12
+ let {
13
+ maxHeight = 80,
14
+ showLabel = 'Show more',
15
+ hideLabel = 'Show less',
16
+ class: klass = '',
17
+ children
18
+ }: Props = $props();
19
+
20
+
21
+ let expanded = $state(false);
22
+ let clipped = $state(false);
23
+ let bodyEl = $state<HTMLDivElement | undefined>(undefined);
13
24
 
14
25
  onMount(() => {
15
26
  if (bodyEl) clipped = bodyEl.scrollHeight > maxHeight;
@@ -22,10 +33,10 @@
22
33
  bind:this={bodyEl}
23
34
  style={!expanded && clipped ? `max-height:${maxHeight}px;overflow:hidden` : undefined}
24
35
  >
25
- <slot />
36
+ {@render children?.()}
26
37
  </div>
27
38
  {#if !expanded && clipped}
28
- <div class="spoiler-fade" aria-hidden="true" />
39
+ <div class="spoiler-fade" aria-hidden="true"></div>
29
40
  {/if}
30
41
  </div>
31
42
  {#if clipped}
@@ -33,7 +44,7 @@
33
44
  type="button"
34
45
  class="spoiler-toggle"
35
46
  aria-expanded={expanded}
36
- on:click={() => (expanded = !expanded)}
47
+ onclick={() => (expanded = !expanded)}
37
48
  >
38
49
  {expanded ? hideLabel : showLabel}
39
50
  </button>
@@ -1,33 +1,46 @@
1
- <script lang="ts">
1
+ <script module lang="ts">
2
2
  export interface StackedBarSeries {
3
3
  label: string;
4
4
  color: string;
5
5
  values: number[];
6
6
  }
7
+ </script>
7
8
 
8
- export let series: StackedBarSeries[] = [];
9
- export let labels: string[] = [];
10
- export let height = 180;
11
- export let normalized = false;
12
- export let ariaLabel = 'Stacked bar chart';
9
+ <script lang="ts">
10
+
11
+ interface Props {
12
+ series?: StackedBarSeries[];
13
+ labels?: string[];
14
+ height?: number;
15
+ normalized?: boolean;
16
+ ariaLabel?: string;
17
+ }
18
+
19
+ let {
20
+ series = [],
21
+ labels = [],
22
+ height = 180,
23
+ normalized = false,
24
+ ariaLabel = 'Stacked bar chart'
25
+ }: Props = $props();
13
26
 
14
27
  const VW = 400;
15
28
  const PAD = { t: 10, r: 8, b: 28, l: 36 };
16
29
 
17
- $: n = series.length && series[0].values.length ? series[0].values.length : 0;
18
- $: chartW = VW - PAD.l - PAD.r;
19
- $: chartH = height - PAD.t - PAD.b;
20
- $: bot = PAD.t + chartH;
21
- $: barW = n > 0 ? (chartW / n) * 0.72 : 0;
22
- $: gap = n > 0 ? (chartW / n) * 0.28 : 0;
30
+ let n = $derived(series.length && series[0].values.length ? series[0].values.length : 0);
31
+ let chartW = $derived(VW - PAD.l - PAD.r);
32
+ let chartH = $derived(height - PAD.t - PAD.b);
33
+ let bot = $derived(PAD.t + chartH);
34
+ let barW = $derived(n > 0 ? (chartW / n) * 0.72 : 0);
35
+ let gap = $derived(n > 0 ? (chartW / n) * 0.28 : 0);
23
36
 
24
- $: totals = Array.from({ length: n }, (_, i) =>
37
+ let totals = $derived(Array.from({ length: n }, (_, i) =>
25
38
  series.reduce((s, ser) => s + (ser.values[i] ?? 0), 0)
26
- );
39
+ ));
27
40
 
28
- $: maxTotal = normalized ? 1 : (totals.length ? Math.max(...totals) : 1) || 1;
41
+ let maxTotal = $derived(normalized ? 1 : (totals.length ? Math.max(...totals) : 1) || 1);
29
42
 
30
- $: stacks = Array.from({ length: n }, (_, gi) => {
43
+ let stacks = $derived(Array.from({ length: n }, (_, gi) => {
31
44
  let y = bot;
32
45
  const total = totals[gi] || 1;
33
46
  return series.map((ser) => {
@@ -45,18 +58,18 @@
45
58
  y -= bh;
46
59
  return rect;
47
60
  });
48
- });
61
+ }));
49
62
 
50
- $: gridFracs = [0.25, 0.5, 0.75, 1];
51
- $: gridLines = gridFracs.map((f) => ({
63
+ let gridFracs = $derived([0.25, 0.5, 0.75, 1]);
64
+ let gridLines = $derived(gridFracs.map((f) => ({
52
65
  y: PAD.t + (1 - f) * chartH,
53
66
  label: normalized ? `${Math.round(f * 100)}%` : String(Math.round(f * maxTotal)),
54
- }));
67
+ })));
55
68
 
56
- $: xLabels = Array.from({ length: n }, (_, i) => ({
69
+ let xLabels = $derived(Array.from({ length: n }, (_, i) => ({
57
70
  x: PAD.l + i * (barW + gap) + gap / 2 + barW / 2,
58
71
  text: labels[i] ?? String(i),
59
- }));
72
+ })));
60
73
  </script>
61
74
 
62
75
  {#if n > 0}
@@ -1,28 +1,40 @@
1
- <script lang="ts">
1
+ <script module lang="ts">
2
2
  export interface StackedProgressSegment {
3
3
  label: string;
4
4
  value: number;
5
5
  color: string;
6
6
  }
7
- export let segments: StackedProgressSegment[];
8
- export let total: number | undefined = undefined;
9
- export let ariaLabel: string | undefined = undefined;
10
- export let showLegend: boolean = true;
11
- $: sum = total ?? segments.reduce((a, s) => a + s.value, 0);
12
- $: text = ariaLabel ?? segments.map((s) => `${s.label} ${Math.round((s.value / sum) * 100)}%`).join(', ');
7
+ </script>
8
+
9
+ <script lang="ts">
10
+ interface Props {
11
+ segments: StackedProgressSegment[];
12
+ total?: number | undefined;
13
+ ariaLabel?: string | undefined;
14
+ showLegend?: boolean;
15
+ }
16
+
17
+ let {
18
+ segments,
19
+ total = undefined,
20
+ ariaLabel = undefined,
21
+ showLegend = true
22
+ }: Props = $props();
23
+ let sum = $derived(total ?? segments.reduce((a, s) => a + s.value, 0));
24
+ let text = $derived(ariaLabel ?? segments.map((s) => `${s.label} ${Math.round((s.value / sum) * 100)}%`).join(', '));
13
25
  </script>
14
26
 
15
27
  <div class="sp" role="img" aria-label={text}>
16
28
  <div class="sp-bar" aria-hidden="true">
17
29
  {#each segments as { label, value, color }}
18
- <div class="sp-seg" style="width:{((value / sum) * 100).toFixed(2)}%;background:{color}" />
30
+ <div class="sp-seg" style="width:{((value / sum) * 100).toFixed(2)}%;background:{color}"></div>
19
31
  {/each}
20
32
  </div>
21
33
  {#if showLegend}
22
34
  <div class="sp-legend" aria-hidden="true">
23
35
  {#each segments as { label, value, color }}
24
36
  <span class="sp-item">
25
- <span class="sp-dot" style="background:{color}" />
37
+ <span class="sp-dot" style="background:{color}"></span>
26
38
  {label}
27
39
  <span class="sp-pct">{Math.round((value / sum) * 100)}%</span>
28
40
  </span>
@@ -1,17 +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
- export let label: string;
7
- export let value: number = 0;
8
- export let max: number = 5;
9
- export let readOnly: boolean = false;
10
- export let size: 'sm' | 'md' = 'md';
11
- export let onChange: ((v: number) => void) | undefined = undefined;
6
+ interface Props {
7
+ label: string;
8
+ value?: number;
9
+ max?: number;
10
+ readOnly?: boolean;
11
+ size?: 'sm' | 'md';
12
+ onChange?: ((v: number) => void) | undefined;
13
+ }
14
+
15
+ let {
16
+ label,
17
+ value = $bindable(0),
18
+ max = 5,
19
+ readOnly = false,
20
+ size = 'md',
21
+ onChange = undefined
22
+ }: Props = $props();
12
23
 
13
24
  const gid = `dash-ui-sr-${++counter}`;
14
- let hovered = 0;
25
+ let hovered = $state(0);
15
26
 
16
27
  function pick(star: number) {
17
28
  value = star;
@@ -42,8 +53,8 @@
42
53
  <label
43
54
  for="{gid}-{star}"
44
55
  class="star-label{on ? ' star-label--on' : ''}"
45
- on:mouseenter={() => (hovered = star)}
46
- on:mouseleave={() => (hovered = 0)}
56
+ onmouseenter={() => (hovered = star)}
57
+ onmouseleave={() => (hovered = 0)}
47
58
  >
48
59
  <input
49
60
  type="radio"
@@ -53,7 +64,7 @@
53
64
  checked={value === star}
54
65
  class="star-radio"
55
66
  aria-label="{star} out of {max}"
56
- on:change={() => pick(star)}
67
+ onchange={() => pick(star)}
57
68
  />
58
69
  <svg viewBox="0 0 24 24" fill={on ? 'currentColor' : 'none'} stroke="currentColor" stroke-width="1.5" aria-hidden="true" focusable="false">
59
70
  <polygon points="12,2 15.09,8.26 22,9.27 17,14.14 18.18,21.02 12,17.77 5.82,21.02 7,14.14 2,9.27 8.91,8.26" />
@@ -1,20 +1,42 @@
1
1
  <script lang="ts">
2
+ import type { Snippet } from 'svelte';
2
3
  import Card from './Card.svelte';
3
- export let label: string;
4
- export let value: string = '';
5
- export let unit: string | undefined = undefined;
6
- export let sub: string | undefined = undefined;
7
- export let delta: string | undefined = undefined;
8
- export let deltaDir: 'up' | 'down' | 'neutral' = 'neutral';
9
- export let span: number | undefined = undefined;
10
- export let color: string | undefined = undefined;
11
- $: deltaClass = deltaDir === 'up' ? 'delta-up' : deltaDir === 'down' ? 'delta-down' : '';
4
+
5
+ interface Props {
6
+ label: string;
7
+ value?: string;
8
+ unit?: string | undefined;
9
+ sub?: string | undefined;
10
+ delta?: string | undefined;
11
+ deltaDir?: 'up' | 'down' | 'neutral';
12
+ span?: number | undefined;
13
+ color?: string | undefined;
14
+ /** Snippet override for the value display. Renamed from the old `value`
15
+ * named slot to avoid colliding with the `value` prop in Svelte 5. */
16
+ valueSlot?: Snippet;
17
+ }
18
+
19
+ let {
20
+ label,
21
+ value = '',
22
+ unit = undefined,
23
+ sub = undefined,
24
+ delta = undefined,
25
+ deltaDir = 'neutral',
26
+ span = undefined,
27
+ color = undefined,
28
+ valueSlot,
29
+ }: Props = $props();
30
+
31
+ let deltaClass = $derived(
32
+ deltaDir === 'up' ? 'delta-up' : deltaDir === 'down' ? 'delta-down' : '',
33
+ );
12
34
  </script>
13
35
 
14
36
  <Card {span}>
15
37
  <h3>{label}</h3>
16
38
  <div class="stat" style={color ? `color:${color};` : ''}>
17
- <slot name="value">{value}</slot>{#if unit}<span class="unit">{unit}</span>{/if}
39
+ {#if valueSlot}{@render valueSlot()}{:else}{value}{/if}{#if unit}<span class="unit">{unit}</span>{/if}
18
40
  </div>
19
41
  {#if sub || delta}
20
42
  <div class="submeta">
@@ -1,7 +1,11 @@
1
1
  <script lang="ts">
2
- export let color: string;
3
- export let text: string;
4
- export let textColor: string | undefined = undefined;
2
+ interface Props {
3
+ color: string;
4
+ text: string;
5
+ textColor?: string | undefined;
6
+ }
7
+
8
+ let { color, text, textColor = undefined }: Props = $props();
5
9
  </script>
6
10
 
7
11
  <span style="display:inline-flex;align-items:center;gap:6px;color:{textColor ?? color};font-size:12px;">
@@ -1,25 +1,37 @@
1
- <script lang="ts">
1
+ <script module lang="ts">
2
2
  export interface StepChartSeries {
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?: StepChartSeries[];
13
+ labels?: string[];
14
+ height?: number;
15
+ ariaLabel?: string;
16
+ }
7
17
 
8
- export let series: StepChartSeries[] = [];
9
- export let labels: string[] = [];
10
- export let height: number = 160;
11
- export let ariaLabel: string = 'Step chart';
18
+ let {
19
+ series = [],
20
+ labels = [],
21
+ height = 160,
22
+ ariaLabel = 'Step chart'
23
+ }: Props = $props();
12
24
 
13
25
  const VW = 400;
14
26
  const PAD = { t: 12, r: 8, b: 28, l: 8 };
15
27
 
16
- $: allValues = series.flatMap((s) => s.values);
17
- $: minV = allValues.length ? Math.min(...allValues) : 0;
18
- $: maxV = allValues.length ? Math.max(...allValues) : 1;
19
- $: range = maxV - minV || 1;
20
- $: chartW = VW - PAD.l - PAD.r;
21
- $: chartH = height - PAD.t - PAD.b;
22
- $: n = series[0]?.values.length ?? 0;
28
+ let allValues = $derived(series.flatMap((s) => s.values));
29
+ let minV = $derived(allValues.length ? Math.min(...allValues) : 0);
30
+ let maxV = $derived(allValues.length ? Math.max(...allValues) : 1);
31
+ let range = $derived(maxV - minV || 1);
32
+ let chartW = $derived(VW - PAD.l - PAD.r);
33
+ let chartH = $derived(height - PAD.t - PAD.b);
34
+ let n = $derived(series[0]?.values.length ?? 0);
23
35
 
24
36
  function toX(i: number): number {
25
37
  return PAD.l + (n > 1 ? (i / (n - 1)) * chartW : chartW / 2);
@@ -48,9 +60,9 @@
48
60
  return d;
49
61
  }
50
62
 
51
- $: gridLines = [0, 0.25, 0.5, 0.75, 1].map((f) => PAD.t + (1 - f) * chartH);
52
- $: paths = series.map((s) => ({ color: s.color, label: s.label, d: stepPath(s) }));
53
- $: areas = series.map((s) => ({ color: s.color, label: s.label, d: stepArea(s) }));
63
+ let gridLines = $derived([0, 0.25, 0.5, 0.75, 1].map((f) => PAD.t + (1 - f) * chartH));
64
+ let paths = $derived(series.map((s) => ({ color: s.color, label: s.label, d: stepPath(s) })));
65
+ let areas = $derived(series.map((s) => ({ color: s.color, label: s.label, d: stepArea(s) })));
54
66
  </script>
55
67
 
56
68
  <div role="img" aria-label={ariaLabel} style="width:100%;">
@@ -1,4 +1,4 @@
1
- <script context="module" lang="ts">
1
+ <script module lang="ts">
2
2
  export interface StepperStep {
3
3
  id: string;
4
4
  label: string;
@@ -6,12 +6,16 @@
6
6
  </script>
7
7
 
8
8
  <script lang="ts">
9
- export let steps: StepperStep[];
10
- export let active: string;
11
- let className = '';
12
- export { className as class };
9
+ interface Props {
10
+ steps: StepperStep[];
11
+ active: string;
12
+ class?: string;
13
+ }
14
+
15
+ let { steps, active, class: className = '' }: Props = $props();
16
+
13
17
 
14
- $: activeIdx = steps.findIndex(s => s.id === active);
18
+ let activeIdx = $derived(steps.findIndex(s => s.id === active));
15
19
  </script>
16
20
 
17
21
  <nav aria-label="Progress" class="stepper {className}">
@@ -1,13 +1,20 @@
1
- <script lang="ts">
1
+ <script module lang="ts">
2
2
  export interface StreamSeries {
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
+ labels?: string[];
13
+ series?: StreamSeries[];
14
+ ariaLabel?: string;
15
+ }
7
16
 
8
- export let labels: string[] = [];
9
- export let series: StreamSeries[] = [];
10
- export let ariaLabel: string = 'Stream graph';
17
+ let { labels = [], series = [], ariaLabel = 'Stream graph' }: Props = $props();
11
18
 
12
19
  const VW = 380;
13
20
  const VH = 120;
@@ -17,20 +24,20 @@
17
24
  const PAD_B = 20;
18
25
  const COLORS = ['#006FFF', '#00C8C8', '#F5A623', '#7FB6FF', '#A878F5', '#F56342'];
19
26
 
20
- $: n = labels.length;
21
- $: TRACK_W = VW - PAD_L - PAD_R;
22
- $: TRACK_H = VH - PAD_T - PAD_B;
27
+ let n = $derived(labels.length);
28
+ let TRACK_W = $derived(VW - PAD_L - PAD_R);
29
+ let TRACK_H = $derived(VH - PAD_T - PAD_B);
23
30
 
24
- $: totals = Array.from({ length: n }, (_, i) =>
31
+ let totals = $derived(Array.from({ length: n }, (_, i) =>
25
32
  series.reduce((sum, s) => sum + (s.values[i] ?? 0), 0)
26
- );
27
- $: maxTotal = Math.max(...totals, 1);
33
+ ));
34
+ let maxTotal = $derived(Math.max(...totals, 1));
28
35
 
29
36
  function xOf(i: number): number {
30
37
  return n > 1 ? PAD_L + (i / (n - 1)) * TRACK_W : PAD_L + TRACK_W / 2;
31
38
  }
32
39
 
33
- $: layers = series.map((s, si) => {
40
+ let layers = $derived(series.map((s, si) => {
34
41
  const tops: number[] = [];
35
42
  const bots: number[] = [];
36
43
  for (let i = 0; i < n; i++) {
@@ -43,7 +50,7 @@
43
50
  tops[i] = PAD_T + (top / maxTotal) * TRACK_H;
44
51
  }
45
52
  return { tops, bots, color: s.color ?? COLORS[si % COLORS.length] };
46
- });
53
+ }));
47
54
 
48
55
  function buildArea(tops: number[], bots: number[]): string {
49
56
  const fwd = tops.map((y, i) => {
@@ -1,9 +1,19 @@
1
1
  <script lang="ts">
2
- export let data: { label: string; value: number }[] = [];
3
- export let height: number = 48;
4
- export let colorLow: string = '#0A2840';
5
- export let colorHigh: string = '#FF4040';
6
- export let ariaLabel: string = 'Stripe chart';
2
+ interface Props {
3
+ data?: { label: string; value: number }[];
4
+ height?: number;
5
+ colorLow?: string;
6
+ colorHigh?: string;
7
+ ariaLabel?: string;
8
+ }
9
+
10
+ let {
11
+ data = [],
12
+ height = 48,
13
+ colorLow = '#0A2840',
14
+ colorHigh = '#FF4040',
15
+ ariaLabel = 'Stripe chart'
16
+ }: Props = $props();
7
17
 
8
18
  function hexToRgb(hex: string): [number, number, number] {
9
19
  const h = hex.replace('#', '');
@@ -19,18 +29,18 @@
19
29
  return `rgb(${lerp(r1, r2, t)},${lerp(g1, g2, t)},${lerp(b1, b2, t)})`;
20
30
  }
21
31
 
22
- $: vals = data.map((d) => d.value);
23
- $: min = vals.length ? Math.min(...vals) : 0;
24
- $: max = vals.length ? Math.max(...vals) : 1;
25
- $: range = (max - min) || 1;
26
- $: sw = 400 / (data.length || 1);
27
- $: stripes = data.map((d, i) => ({
32
+ let vals = $derived(data.map((d) => d.value));
33
+ let min = $derived(vals.length ? Math.min(...vals) : 0);
34
+ let max = $derived(vals.length ? Math.max(...vals) : 1);
35
+ let range = $derived((max - min) || 1);
36
+ let sw = $derived(400 / (data.length || 1));
37
+ let stripes = $derived(data.map((d, i) => ({
28
38
  x: i * sw,
29
39
  w: sw,
30
40
  color: interpColor(colorLow, colorHigh, (d.value - min) / range),
31
41
  label: d.label,
32
42
  value: d.value,
33
- }));
43
+ })));
34
44
  </script>
35
45
 
36
46
  <div role="img" aria-label={ariaLabel} style="line-height:0;">
@@ -1,13 +1,20 @@
1
- <script lang="ts">
1
+ <script module lang="ts">
2
2
  export interface SunburstNode {
3
3
  label: string;
4
4
  value?: number;
5
5
  color?: string;
6
6
  children?: SunburstNode[];
7
7
  }
8
+ </script>
9
+
10
+ <script lang="ts">
11
+
12
+ interface Props {
13
+ root: SunburstNode;
14
+ ariaLabel?: string;
15
+ }
8
16
 
9
- export let root: SunburstNode;
10
- export let ariaLabel: string = 'Sunburst chart';
17
+ let { root, ariaLabel = 'Sunburst chart' }: Props = $props();
11
18
 
12
19
  const PALETTE = ['#006FFF', '#00C875', '#A78BFA', '#F5A623', '#50B8E7', '#F04949'];
13
20
  const CX = 160, CY = 160, R_HOLE = 48, R_MID = 97, R_OUTER = 142, GAP = 0.01;
@@ -21,7 +28,7 @@
21
28
  type PathData = { d: string; fill: string };
22
29
  type LabelData = { x: number; y: number; anchor: string; text: string };
23
30
 
24
- $: ({ paths, labels, total } = (() => {
31
+ let { paths, labels, total } = $derived((() => {
25
32
  const items = root.children ?? [];
26
33
  const total = items.reduce((s, c) => s + (c.value ?? c.children?.reduce((cs, x) => cs + (x.value ?? 0), 0) ?? 0), 0);
27
34
  if (!total) return { paths: [] as PathData[], labels: [] as LabelData[], total: 0 };