@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,5 +1,9 @@
1
+ <script module lang="ts">
2
+ export interface AppDef { id: string; label: string; logo: AppLogo }
3
+ </script>
4
+
1
5
  <script lang="ts">
2
- import { createEventDispatcher } from 'svelte';
6
+
3
7
  import { appLogos, type AppLogoKey as AppLogo } from '@w5-ui/assets';
4
8
  import IconButton from './IconButton.svelte';
5
9
  import Avatar from './Avatar.svelte';
@@ -9,26 +13,36 @@
9
13
  import BellIcon from '../icons/BellIcon.svelte';
10
14
  import HelpIcon from '../icons/HelpIcon.svelte';
11
15
 
12
- export interface AppDef { id: string; label: string; logo: AppLogo }
13
16
  export const DEFAULT_APPS: AppDef[] = [
14
17
  { id: 'system', label: 'System', logo: 'system' },
15
18
  { id: 'instances', label: 'Instances', logo: 'instances' },
16
19
  { id: 'agents', label: 'Agents', logo: 'agents' },
17
20
  ];
18
21
 
19
- export let siteName: string;
20
- export let activeApp: string;
21
- export let apps: AppDef[] = DEFAULT_APPS;
22
- export let initials: string = 'MS';
23
- export let notificationCount: number = 1;
24
- const dispatch = createEventDispatcher<{ appchange: string }>();
22
+ interface Props {
23
+ siteName: string;
24
+ activeApp: string;
25
+ apps?: AppDef[];
26
+ initials?: string;
27
+ notificationCount?: number;
28
+ onappchange?: (payload: string) => void;
29
+ }
30
+
31
+ let {
32
+ siteName,
33
+ activeApp = $bindable(),
34
+ apps = DEFAULT_APPS,
35
+ initials = 'MS',
36
+ notificationCount = 1,
37
+ onappchange,
38
+ }: Props = $props();
25
39
  </script>
26
40
 
27
41
  <header class="topbar">
28
42
  <button type="button" class="site-switch" aria-label="Switch site: {siteName}" aria-haspopup="menu">
29
43
  <span class="status-ring"></span>
30
44
  <span class="site-name" aria-hidden="true">{siteName}</span>
31
- <CaretIcon class="caret" aria-hidden="true" />
45
+ <CaretIcon class="caret" />
32
46
  </button>
33
47
  <nav class="app-tabs" aria-label="Apps">
34
48
  {#each apps as a (a.id)}
@@ -36,7 +50,7 @@
36
50
  type="button"
37
51
  class="app-tab {a.id === activeApp ? 'active' : ''}"
38
52
  aria-current={a.id === activeApp ? 'page' : undefined}
39
- on:click={() => { activeApp = a.id; dispatch('appchange', a.id); }}
53
+ onclick={() => { activeApp = a.id; onappchange?.(a.id); }}
40
54
  >
41
55
  <img src={appLogos[a.logo]} alt="" width="24" height="24" />
42
56
  <span class="label">{a.label}</span>
@@ -1,4 +1,4 @@
1
- <script context="module" lang="ts">
1
+ <script module lang="ts">
2
2
  export interface TransferListItem {
3
3
  id: string;
4
4
  label: string;
@@ -7,26 +7,33 @@
7
7
  </script>
8
8
 
9
9
  <script lang="ts">
10
- import { createEventDispatcher } from 'svelte';
11
-
12
- export let sourceLabel: string = 'Available';
13
- export let targetLabel: string = 'Selected';
14
- export let source: TransferListItem[] = [];
15
- export let target: TransferListItem[] = [];
16
- let className = '';
17
- export { className as class };
10
+ interface Props {
11
+ sourceLabel?: string;
12
+ targetLabel?: string;
13
+ source?: TransferListItem[];
14
+ target?: TransferListItem[];
15
+ class?: string;
16
+ onchange?: (payload: { source: TransferListItem[]; target: TransferListItem[] }) => void;
17
+ }
18
18
 
19
- const dispatch = createEventDispatcher<{ change: { source: TransferListItem[]; target: TransferListItem[] } }>();
19
+ let {
20
+ sourceLabel = 'Available',
21
+ targetLabel = 'Selected',
22
+ source = $bindable([]),
23
+ target = $bindable([]),
24
+ class: className = '',
25
+ onchange,
26
+ }: Props = $props();
20
27
 
21
- let selSrc = new Set<string>();
22
- let selTgt = new Set<string>();
23
- let focSrc = 0;
24
- let focTgt = 0;
25
- let srcEls: (HTMLLIElement | null)[] = [];
26
- let tgtEls: (HTMLLIElement | null)[] = [];
28
+ let selSrc = $state(new Set<string>());
29
+ let selTgt = $state(new Set<string>());
30
+ let focSrc = $state(0);
31
+ let focTgt = $state(0);
32
+ let srcEls: (HTMLLIElement | null)[] = $state([]);
33
+ let tgtEls: (HTMLLIElement | null)[] = $state([]);
27
34
 
28
35
  function commit() {
29
- dispatch('change', { source, target });
36
+ onchange?.({ source, target });
30
37
  }
31
38
 
32
39
  function moveRight(ids: Set<string>) {
@@ -112,7 +119,7 @@
112
119
  aria-label={sourceLabel}
113
120
  aria-multiselectable="true"
114
121
  class="tl__list"
115
- on:keydown={srcKey}
122
+ onkeydown={srcKey}
116
123
  >
117
124
  {#if source.length === 0}
118
125
  <li class="tl__empty" role="option" aria-selected="false" aria-disabled="true">Empty</li>
@@ -124,8 +131,8 @@
124
131
  aria-selected={selSrc.has(item.id)}
125
132
  tabindex={i === focSrc ? 0 : -1}
126
133
  class="tl__item{selSrc.has(item.id) ? ' tl__item--sel' : ''}"
127
- on:click={() => { focSrc = i; toggleSrc(item.id); }}
128
- on:keydown={(e) => { if (e.key === ' ') { e.preventDefault(); focSrc = i; toggleSrc(item.id); } }}
134
+ onclick={() => { focSrc = i; toggleSrc(item.id); }}
135
+ onkeydown={(e) => { if (e.key === ' ') { e.preventDefault(); focSrc = i; toggleSrc(item.id); } }}
129
136
  >
130
137
  <span class="tl__item-label">{item.label}</span>
131
138
  {#if item.description}<span class="tl__item-desc">{item.description}</span>{/if}
@@ -138,16 +145,16 @@
138
145
  <div class="tl__controls" role="group" aria-label="Transfer controls">
139
146
  <button type="button" class="tl__btn" aria-label="Move all to {targetLabel}"
140
147
  disabled={source.length === 0}
141
- on:click={() => moveRight(new Set(source.map((i) => i.id)))}>»</button>
148
+ onclick={() => moveRight(new Set(source.map((i) => i.id)))}>»</button>
142
149
  <button type="button" class="tl__btn" aria-label="Move selected to {targetLabel}"
143
150
  disabled={selSrc.size === 0}
144
- on:click={() => moveRight(selSrc)}>›</button>
151
+ onclick={() => moveRight(selSrc)}>›</button>
145
152
  <button type="button" class="tl__btn" aria-label="Move selected back to {sourceLabel}"
146
153
  disabled={selTgt.size === 0}
147
- on:click={() => moveLeft(selTgt)}>‹</button>
154
+ onclick={() => moveLeft(selTgt)}>‹</button>
148
155
  <button type="button" class="tl__btn" aria-label="Move all back to {sourceLabel}"
149
156
  disabled={target.length === 0}
150
- on:click={() => moveLeft(new Set(target.map((i) => i.id)))}>«</button>
157
+ onclick={() => moveLeft(new Set(target.map((i) => i.id)))}>«</button>
151
158
  </div>
152
159
 
153
160
  <div class="tl__panel">
@@ -159,7 +166,7 @@
159
166
  aria-label={targetLabel}
160
167
  aria-multiselectable="true"
161
168
  class="tl__list"
162
- on:keydown={tgtKey}
169
+ onkeydown={tgtKey}
163
170
  >
164
171
  {#if target.length === 0}
165
172
  <li class="tl__empty" role="option" aria-selected="false" aria-disabled="true">Empty</li>
@@ -171,8 +178,8 @@
171
178
  aria-selected={selTgt.has(item.id)}
172
179
  tabindex={i === focTgt ? 0 : -1}
173
180
  class="tl__item{selTgt.has(item.id) ? ' tl__item--sel' : ''}"
174
- on:click={() => { focTgt = i; toggleTgt(item.id); }}
175
- on:keydown={(e) => { if (e.key === ' ') { e.preventDefault(); focTgt = i; toggleTgt(item.id); } }}
181
+ onclick={() => { focTgt = i; toggleTgt(item.id); }}
182
+ onkeydown={(e) => { if (e.key === ' ') { e.preventDefault(); focTgt = i; toggleTgt(item.id); } }}
176
183
  >
177
184
  <span class="tl__item-label">{item.label}</span>
178
185
  {#if item.description}<span class="tl__item-desc">{item.description}</span>{/if}
@@ -1,19 +1,32 @@
1
- <script lang="ts">
1
+ <script module lang="ts">
2
2
  export interface TreeNode {
3
3
  id: string;
4
4
  label: string;
5
5
  meta?: string;
6
6
  children?: TreeNode[];
7
7
  }
8
+ </script>
9
+
10
+ <script lang="ts">
11
+ import TreeItem from './TreeItem.svelte';
12
+
13
+ interface Props {
14
+ node: TreeNode;
15
+ expanded: Set<string>;
16
+ selected: string | undefined;
17
+ focusedId: string;
18
+ }
8
19
 
9
- export let node: TreeNode;
10
- export let expanded: Set<string>;
11
- export let selected: string | undefined;
12
- export let focusedId: string;
20
+ let {
21
+ node,
22
+ expanded,
23
+ selected,
24
+ focusedId
25
+ }: Props = $props();
13
26
 
14
- $: hasChildren = !!node.children?.length;
15
- $: isExpanded = expanded.has(node.id);
16
- $: isSelected = selected === node.id;
27
+ let hasChildren = $derived(!!node.children?.length);
28
+ let isExpanded = $derived(expanded.has(node.id));
29
+ let isSelected = $derived(selected === node.id);
17
30
  </script>
18
31
 
19
32
  <li
@@ -46,10 +59,10 @@
46
59
  <span class="tree__label">{node.label}</span>
47
60
  {#if node.meta}<span class="tree__meta">{node.meta}</span>{/if}
48
61
  </div>
49
- {#if hasChildren && isExpanded}
62
+ {#if hasChildren && isExpanded && node.children}
50
63
  <ul role="group" class="tree__group">
51
64
  {#each node.children as child (child.id)}
52
- <svelte:self
65
+ <TreeItem
53
66
  node={child}
54
67
  {expanded}
55
68
  {selected}
@@ -1,13 +1,20 @@
1
- <script lang="ts">
1
+ <script module lang="ts">
2
2
  export interface TreeMapNode {
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
+ nodes?: TreeMapNode[];
13
+ height?: number;
14
+ ariaLabel?: string;
15
+ }
7
16
 
8
- export let nodes: TreeMapNode[] = [];
9
- export let height: number = 160;
10
- export let ariaLabel: string = 'Treemap chart';
17
+ let { nodes = [], height = 160, ariaLabel = 'Treemap chart' }: Props = $props();
11
18
 
12
19
  const VW = 320;
13
20
  const PAD = 4;
@@ -41,13 +48,13 @@
41
48
  return [...layout(ns.slice(0, split), x, y, w, h1), ...layout(ns.slice(split), x, y + h1 + GAP, w, Math.max(h - h1 - GAP, 0))];
42
49
  }
43
50
 
44
- $: rects = (() => {
51
+ let rects = $derived((() => {
45
52
  if (!nodes.length) return [] as LayoutRect[];
46
53
  const sorted = [...nodes]
47
54
  .sort((a, b) => b.value - a.value)
48
55
  .map((n, i) => ({ ...n, color: n.color ?? PALETTE[i % PALETTE.length] }));
49
56
  return layout(sorted, PAD, PAD, VW - PAD * 2, height - PAD * 2);
50
- })();
57
+ })());
51
58
  </script>
52
59
 
53
60
  <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 TreeNode {
3
3
  id: string;
4
4
  label: string;
@@ -11,15 +11,27 @@
11
11
  import { tick } from 'svelte';
12
12
  import TreeItem from './TreeItem.svelte';
13
13
 
14
- export let nodes: TreeNode[] = [];
15
- export let selected: string | undefined = undefined;
16
- export let defaultExpanded: string[] = [];
17
- export let label: string | undefined = undefined;
18
- export let className: string = '';
14
+ interface Props {
15
+ nodes?: TreeNode[];
16
+ selected?: string | undefined;
17
+ defaultExpanded?: string[];
18
+ label?: string | undefined;
19
+ className?: string;
20
+ }
21
+
22
+ let {
23
+ nodes = [],
24
+ selected = $bindable(undefined),
25
+ defaultExpanded = [],
26
+ label = undefined,
27
+ className = ''
28
+ }: Props = $props();
19
29
 
20
- let expanded = new Set<string>(defaultExpanded);
21
- let focusedId: string = nodes[0]?.id ?? '';
22
- let rootEl: HTMLUListElement;
30
+ // svelte-ignore state_referenced_locally
31
+ let expanded = $state(new Set<string>(defaultExpanded));
32
+ // svelte-ignore state_referenced_locally
33
+ let focusedId: string = $state(nodes[0]?.id ?? '');
34
+ let rootEl = $state<HTMLUListElement | undefined>(undefined);
23
35
 
24
36
  function visibleIds(list: TreeNode[]): string[] {
25
37
  const ids: string[] = [];
@@ -120,9 +132,9 @@
120
132
  role="tree"
121
133
  aria-label={label}
122
134
  class={`tree${className ? ' ' + className : ''}`}
123
- on:keydown={handleKeydown}
124
- on:focusin={handleFocusin}
125
- on:click={handleClick}
135
+ onkeydown={handleKeydown}
136
+ onfocusin={handleFocusin}
137
+ onclick={handleClick}
126
138
  >
127
139
  {#each nodes as node (node.id)}
128
140
  <TreeItem {node} {expanded} {selected} {focusedId} />
@@ -1,20 +1,27 @@
1
- <script lang="ts">
1
+ <script module lang="ts">
2
2
  export type UptimeStatus = 'up' | 'degraded' | 'down';
3
-
4
3
  export interface UptimeSegment {
5
4
  from: number;
6
5
  to: number;
7
6
  status: UptimeStatus;
8
7
  }
9
-
10
8
  export interface UptimeSeries {
11
9
  label: string;
12
10
  segments: UptimeSegment[];
13
11
  }
12
+ </script>
13
+
14
+ <script lang="ts">
15
+
16
+
17
+
18
+ interface Props {
19
+ series?: UptimeSeries[];
20
+ xLabels?: string[];
21
+ ariaLabel?: string;
22
+ }
14
23
 
15
- export let series: UptimeSeries[] = [];
16
- export let xLabels: string[] = [];
17
- export let ariaLabel: string = 'Uptime timeline';
24
+ let { series = [], xLabels = [], ariaLabel = 'Uptime timeline' }: Props = $props();
18
25
 
19
26
  const VW = 400;
20
27
  const LABEL_W = 88;
@@ -38,13 +45,13 @@
38
45
  { status: 'down', label: 'Down' },
39
46
  ];
40
47
 
41
- $: trackW = VW - LABEL_W - PAD_R;
42
- $: rowsH = series.length * (ROW_H + ROW_GAP) - ROW_GAP;
43
- $: totalH = PAD_T + rowsH + PAD_B;
44
- $: xlblY = PAD_T + rowsH + XLBL_H;
45
- $: legY = xlblY + LEG_H;
48
+ let trackW = $derived(VW - LABEL_W - PAD_R);
49
+ let rowsH = $derived(series.length * (ROW_H + ROW_GAP) - ROW_GAP);
50
+ let totalH = $derived(PAD_T + rowsH + PAD_B);
51
+ let xlblY = $derived(PAD_T + rowsH + XLBL_H);
52
+ let legY = $derived(xlblY + LEG_H);
46
53
 
47
- $: rows = series.map((s, si) => ({
54
+ let rows = $derived(series.map((s, si) => ({
48
55
  label: s.label,
49
56
  y: PAD_T + si * (ROW_H + ROW_GAP),
50
57
  midY: PAD_T + si * (ROW_H + ROW_GAP) + ROW_H / 2 + 4,
@@ -53,13 +60,13 @@
53
60
  w: (seg.to - seg.from) * trackW,
54
61
  color: STATUS_COLOR[seg.status],
55
62
  })),
56
- }));
63
+ })));
57
64
 
58
- $: xlbls = xLabels.map((lbl, i) => ({
65
+ let xlbls = $derived(xLabels.map((lbl, i) => ({
59
66
  lbl,
60
67
  x: LABEL_W + (xLabels.length > 1 ? i / (xLabels.length - 1) : 0) * trackW,
61
68
  anchor: i === 0 ? 'start' : i === xLabels.length - 1 ? 'end' : 'middle',
62
- }));
69
+ })));
63
70
  </script>
64
71
 
65
72
  <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 VennSet {
3
3
  id: string;
4
4
  label: string;
@@ -9,11 +9,23 @@
9
9
  sets: string[];
10
10
  value: number;
11
11
  }
12
+ </script>
13
+
14
+ <script lang="ts">
15
+
16
+ interface Props {
17
+ sets?: VennSet[];
18
+ intersections?: VennIntersection[];
19
+ height?: number;
20
+ ariaLabel?: string;
21
+ }
12
22
 
13
- export let sets: VennSet[] = [];
14
- export let intersections: VennIntersection[] = [];
15
- export let height = 240;
16
- export let ariaLabel = 'Venn diagram';
23
+ let {
24
+ sets = [],
25
+ intersections = [],
26
+ height = 240,
27
+ ariaLabel = 'Venn diagram'
28
+ }: Props = $props();
17
29
 
18
30
  const PALETTE = ['#006FFF', '#00C875', '#A78BFA'];
19
31
  const VW = 340;
@@ -22,12 +34,12 @@
22
34
  return n >= 1000 ? `${(n / 1000).toFixed(1)}k` : String(n);
23
35
  }
24
36
 
25
- $: valid = sets.length >= 2 && sets.length <= 3;
26
- $: is3 = sets.length === 3;
27
- $: cx = VW / 2;
28
- $: cy = height / 2;
37
+ let valid = $derived(sets.length >= 2 && sets.length <= 3);
38
+ let is3 = $derived(sets.length === 3);
39
+ let cx = $derived(VW / 2);
40
+ let cy = $derived(height / 2);
29
41
 
30
- $: circles = is3
42
+ let circles = $derived(is3
31
43
  ? [
32
44
  { x: cx, y: cy - 40, r: 75 },
33
45
  { x: cx - 65, y: cy + 50, r: 75 },
@@ -36,9 +48,9 @@
36
48
  : [
37
49
  { x: cx - 58, y: cy, r: 85 },
38
50
  { x: cx + 58, y: cy, r: 85 },
39
- ];
51
+ ]);
40
52
 
41
- $: exclusiveValues = sets.map((s) =>
53
+ let exclusiveValues = $derived(sets.map((s) =>
42
54
  Math.max(
43
55
  0,
44
56
  s.value -
@@ -46,7 +58,7 @@
46
58
  .filter((i) => i.sets.includes(s.id))
47
59
  .reduce((sum, i) => sum + i.value, 0),
48
60
  ),
49
- );
61
+ ));
50
62
 
51
63
  function getPt(inter: VennIntersection): { x: number; y: number } | null {
52
64
  const idxById: Record<string, number> = {};
@@ -1,14 +1,26 @@
1
- <script lang="ts">
1
+ <script module lang="ts">
2
2
  export interface ViolinSeries {
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?: ViolinSeries[];
13
+ yRange?: [number, number] | undefined;
14
+ height?: number;
15
+ ariaLabel?: string;
16
+ }
7
17
 
8
- export let series: ViolinSeries[] = [];
9
- export let yRange: [number, number] | undefined = undefined;
10
- export let height: number = 160;
11
- export let ariaLabel: string = 'Violin plot';
18
+ let {
19
+ series = [],
20
+ yRange = undefined,
21
+ height = 160,
22
+ ariaLabel = 'Violin 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);
@@ -37,30 +49,30 @@
37
49
  }
38
50
 
39
51
  const VW = 380;
40
- $: VH = height;
52
+ let VH = $derived(height);
41
53
  const PAD_L = 28;
42
54
  const PAD_R = 8;
43
55
  const PAD_T = 8;
44
56
  const PAD_B = 20;
45
57
 
46
- $: allVals = series.flatMap(s => s.values);
47
- $: yMin = yRange ? yRange[0] : Math.min(...allVals);
48
- $: yMax = yRange ? yRange[1] : Math.max(...allVals);
58
+ let allVals = $derived(series.flatMap(s => s.values));
59
+ let yMin = $derived(yRange ? yRange[0] : Math.min(...allVals));
60
+ let yMax = $derived(yRange ? yRange[1] : Math.max(...allVals));
49
61
 
50
- $: TRACK_W = VW - PAD_L - PAD_R;
51
- $: TRACK_H = VH - PAD_T - PAD_B;
52
- $: slotW = TRACK_W / series.length;
53
- $: maxHalfW = slotW * 0.38;
62
+ let TRACK_W = $derived(VW - PAD_L - PAD_R);
63
+ let TRACK_H = $derived(VH - PAD_T - PAD_B);
64
+ let slotW = $derived(TRACK_W / series.length);
65
+ let maxHalfW = $derived(slotW * 0.38);
54
66
 
55
- $: evalPts = Array.from({ length: NUM_PTS }, (_, i) =>
67
+ let evalPts = $derived(Array.from({ length: NUM_PTS }, (_, i) =>
56
68
  yMin + (i / (NUM_PTS - 1)) * (yMax - yMin)
57
- );
69
+ ));
58
70
 
59
71
  function ySvg(v: number): number {
60
72
  return PAD_T + ((yMax - v) / (yMax - yMin)) * TRACK_H;
61
73
  }
62
74
 
63
- $: violins = series.map((s, si) => {
75
+ let violins = $derived(series.map((s, si) => {
64
76
  const h = bw(s.values);
65
77
  const dens = kde(s.values, h, evalPts);
66
78
  const maxD = Math.max(...dens, 1e-9);
@@ -78,12 +90,12 @@
78
90
  color: s.color ?? COLORS[si % COLORS.length],
79
91
  label: s.label,
80
92
  };
81
- });
93
+ }));
82
94
 
83
- $: ticks = [0, 0.25, 0.5, 0.75, 1].map(t => {
95
+ let ticks = $derived([0, 0.25, 0.5, 0.75, 1].map(t => {
84
96
  const v = yMin + t * (yMax - yMin);
85
97
  return { v, y: ySvg(v) };
86
- });
98
+ }));
87
99
  </script>
88
100
 
89
101
  <div role="img" aria-label={ariaLabel} style="width:100%;">
@@ -1,17 +1,29 @@
1
1
  <script lang="ts">
2
- export let items: unknown[] = [];
3
- export let itemHeight: number = 48;
4
- export let height: number = 400;
5
- export let label: string | undefined = undefined;
6
- export let overscan: number = 3;
2
+ interface Props {
3
+ items?: unknown[];
4
+ itemHeight?: number;
5
+ height?: number;
6
+ label?: string | undefined;
7
+ overscan?: number;
8
+ children?: import('svelte').Snippet<[any]>;
9
+ }
7
10
 
8
- let scrollTop = 0;
11
+ let {
12
+ items = [],
13
+ itemHeight = 48,
14
+ height = 400,
15
+ label = undefined,
16
+ overscan = 3,
17
+ children
18
+ }: Props = $props();
9
19
 
10
- $: totalHeight = items.length * itemHeight;
11
- $: firstVisible = Math.floor(scrollTop / itemHeight);
12
- $: startIndex = Math.max(0, firstVisible - overscan);
13
- $: endIndex = Math.min(items.length, firstVisible + Math.ceil(height / itemHeight) + overscan + 1);
14
- $: visible = items.slice(startIndex, endIndex).map((item, i) => ({ item, index: startIndex + i }));
20
+ let scrollTop = $state(0);
21
+
22
+ let totalHeight = $derived(items.length * itemHeight);
23
+ let firstVisible = $derived(Math.floor(scrollTop / itemHeight));
24
+ let startIndex = $derived(Math.max(0, firstVisible - overscan));
25
+ let endIndex = $derived(Math.min(items.length, firstVisible + Math.ceil(height / itemHeight) + overscan + 1));
26
+ let visible = $derived(items.slice(startIndex, endIndex).map((item, i) => ({ item, index: startIndex + i })));
15
27
  </script>
16
28
 
17
29
  <div
@@ -20,7 +32,7 @@
20
32
  class="vl"
21
33
  style:height="{height}px"
22
34
  style:overflow-y="auto"
23
- on:scroll={(e) => (scrollTop = e.currentTarget.scrollTop)}
35
+ onscroll={(e) => (scrollTop = e.currentTarget.scrollTop)}
24
36
  >
25
37
  <div style:height="{totalHeight}px" style:position="relative">
26
38
  <div style:position="absolute" style:top="{startIndex * itemHeight}px" style:width="100%">
@@ -30,7 +42,7 @@
30
42
  style:height="{itemHeight}px"
31
43
  style:overflow="hidden"
32
44
  >
33
- <slot {item} {index} />
45
+ {@render children?.({ item, index, })}
34
46
  </div>
35
47
  {/each}
36
48
  </div>