@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
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@w5-ui/svelte",
3
- "version": "0.1.0",
4
- "description": "Svelte 4 components for the Dash UI design system - mirrors the @w5-ui/react API 1:1. Part of Webber's design systems.",
3
+ "version": "0.2.1",
4
+ "description": "Svelte 5 components for the Dash UI design system - mirrors the @w5-ui/react API 1:1. Part of Webber's design systems.",
5
5
  "keywords": [
6
6
  "svelte",
7
7
  "components",
@@ -41,14 +41,14 @@
41
41
  "./components/*.svelte": "./src/lib/components/*.svelte"
42
42
  },
43
43
  "peerDependencies": {
44
- "svelte": ">=4"
44
+ "svelte": "^5"
45
45
  },
46
46
  "dependencies": {
47
- "@w5-ui/assets": "workspace:*",
48
- "@w5-ui/tokens": "workspace:*"
47
+ "@w5-ui/assets": "^0.2.1",
48
+ "@w5-ui/tokens": "^0.2.1"
49
49
  },
50
50
  "devDependencies": {
51
- "svelte": "^4.2.19",
51
+ "svelte": "^5.43.5",
52
52
  "typescript": "^5.5.0"
53
53
  },
54
54
  "files": [
@@ -1,3 +1,11 @@
1
+ <script lang="ts">
2
+ interface Props {
3
+ children?: import('svelte').Snippet;
4
+ }
5
+
6
+ let { children }: Props = $props();
7
+ </script>
8
+
1
9
  <div class="accordion">
2
- <slot />
10
+ {@render children?.()}
3
11
  </div>
@@ -1,8 +1,14 @@
1
1
  <script lang="ts">
2
- export let title: string;
3
- export let defaultOpen = false;
2
+ interface Props {
3
+ title: string;
4
+ defaultOpen?: boolean;
5
+ children?: import('svelte').Snippet;
6
+ }
4
7
 
5
- let open = defaultOpen;
8
+ let { title, defaultOpen = false, children }: Props = $props();
9
+
10
+ // svelte-ignore state_referenced_locally
11
+ let open = $state(defaultOpen);
6
12
  const uid = Math.random().toString(36).slice(2, 9);
7
13
  const btnId = `acc-btn-${uid}`;
8
14
  const panelId = `acc-panel-${uid}`;
@@ -16,7 +22,7 @@
16
22
  class="accordion-trigger"
17
23
  aria-expanded={open}
18
24
  aria-controls={panelId}
19
- on:click={() => (open = !open)}
25
+ onclick={() => (open = !open)}
20
26
  >
21
27
  <span>{title}</span>
22
28
  <svg
@@ -33,7 +39,7 @@
33
39
  {#if open}
34
40
  <div id={panelId} role="region" aria-labelledby={btnId} class="accordion-panel">
35
41
  <div class="accordion-content">
36
- <slot />
42
+ {@render children?.()}
37
43
  </div>
38
44
  </div>
39
45
  {/if}
@@ -1,22 +1,27 @@
1
- <script context="module" lang="ts">
1
+ <script module lang="ts">
2
2
  let counter = 0;
3
3
  export interface ActionMenuItem { id: string; label: string; danger?: boolean; 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 items: ActionMenuItem[] = [];
10
- export let label: string = 'Actions';
9
+ interface Props {
10
+ items?: ActionMenuItem[];
11
+ label?: string;
12
+ onaction?: (payload: string) => void;
13
+ }
11
14
 
12
- const dispatch = createEventDispatcher<{ action: string }>();
15
+ let { items = [], label = 'Actions',
16
+ onaction,
17
+ }: Props = $props();
13
18
  const uid = `dash-ui-am-${++counter}`;
14
19
  const menuId = `${uid}-menu`;
15
20
 
16
- let open = false;
17
- let activeIdx = 0;
18
- let triggerEl: HTMLButtonElement;
19
- let wrapperEl: HTMLDivElement;
21
+ let open = $state(false);
22
+ let activeIdx = $state(0);
23
+ let triggerEl = $state<HTMLButtonElement | undefined>(undefined);
24
+ let wrapperEl = $state<HTMLDivElement | undefined>(undefined);
20
25
 
21
26
  function toggle() {
22
27
  if (!open) activeIdx = 0;
@@ -24,7 +29,7 @@
24
29
  }
25
30
 
26
31
  function activate(id: string) {
27
- dispatch('action', id);
32
+ onaction?.(id);
28
33
  open = false;
29
34
  triggerEl?.focus();
30
35
  }
@@ -68,8 +73,8 @@
68
73
  aria-haspopup="menu"
69
74
  aria-expanded={open}
70
75
  aria-controls={open ? menuId : undefined}
71
- on:click={toggle}
72
- on:keydown={onKeyDown}
76
+ onclick={toggle}
77
+ onkeydown={onKeyDown}
73
78
  >
74
79
  <svg width="14" height="14" viewBox="0 0 14 14" aria-hidden="true" focusable="false" fill="currentColor">
75
80
  <circle cx="7" cy="2.5" r="1.2" />
@@ -87,8 +92,8 @@
87
92
  data-active={idx === activeIdx ? 'true' : undefined}
88
93
  data-danger={item.danger ? 'true' : undefined}
89
94
  class="action-menu-item"
90
- on:mouseenter={() => { activeIdx = idx; }}
91
- on:mousedown|preventDefault={() => { if (!item.disabled) activate(item.id); }}
95
+ onmouseenter={() => { activeIdx = idx; }}
96
+ onmousedown={(e) => { e.preventDefault(); (() => { if (!item.disabled) activate(item.id); })(); }}
92
97
  >{item.label}</li>
93
98
  {/each}
94
99
  </ul>
@@ -1,4 +1,4 @@
1
- <script context="module" lang="ts">
1
+ <script module lang="ts">
2
2
  export type ActivitySeverity = 'info' | 'success' | 'warn' | 'error' | 'neutral';
3
3
  export interface ActivityItem {
4
4
  id: string;
@@ -10,16 +10,28 @@
10
10
  </script>
11
11
 
12
12
  <script lang="ts">
13
- import { afterUpdate } from 'svelte';
14
- export let items: ActivityItem[] = [];
15
- export let label: string = 'Activity feed';
16
- export let busy: boolean = false;
17
- export let maxHeight: number = 360;
18
- export let autoScroll: boolean = false;
13
+ interface Props {
14
+ items?: ActivityItem[];
15
+ label?: string;
16
+ busy?: boolean;
17
+ maxHeight?: number;
18
+ autoScroll?: boolean;
19
+ }
20
+
21
+ let {
22
+ items = [],
23
+ label = 'Activity feed',
24
+ busy = false,
25
+ maxHeight = 360,
26
+ autoScroll = false,
27
+ }: Props = $props();
19
28
 
20
- let endEl: HTMLDivElement;
29
+ let endEl = $state<HTMLDivElement | undefined>(undefined);
21
30
 
22
- afterUpdate(() => {
31
+ // Replaces `afterUpdate`. Reading `items.length` makes the effect depend
32
+ // on the visible list so we re-scroll whenever an item is appended.
33
+ $effect(() => {
34
+ void items.length;
23
35
  if (autoScroll && endEl) endEl.scrollIntoView({ block: 'nearest' });
24
36
  });
25
37
  </script>
@@ -33,6 +45,7 @@
33
45
  style:overflow-y="auto"
34
46
  >
35
47
  {#each items as item, i (item.id)}
48
+ <!-- svelte-ignore a11y_no_noninteractive_tabindex - navigable feed item for keyboard users -->
36
49
  <article
37
50
  class="af-item af-item--{item.severity ?? 'neutral'}"
38
51
  aria-labelledby="af-title-{item.id}"
@@ -41,7 +54,7 @@
41
54
  aria-setsize={items.length}
42
55
  tabindex="0"
43
56
  >
44
- <div class="af-dot" aria-hidden="true" />
57
+ <div class="af-dot" aria-hidden="true"></div>
45
58
  <div class="af-body">
46
59
  <div class="af-header">
47
60
  <span id="af-title-{item.id}" class="af-title">{item.title}</span>
@@ -56,5 +69,5 @@
56
69
  {#if items.length === 0}
57
70
  <div class="af-empty" role="status">No activity</div>
58
71
  {/if}
59
- <div bind:this={endEl} />
72
+ <div bind:this={endEl}></div>
60
73
  </div>
@@ -1,7 +1,12 @@
1
1
  <script lang="ts">
2
2
  import CloseIcon from '../icons/CloseIcon.svelte';
3
- export let variant: 'success' | 'warn' | 'danger' | 'info' = 'info';
4
- export let onDismiss: (() => void) | undefined = undefined;
3
+ interface Props {
4
+ variant?: 'success' | 'warn' | 'danger' | 'info';
5
+ onDismiss?: (() => void) | undefined;
6
+ children?: import('svelte').Snippet;
7
+ }
8
+
9
+ let { variant = 'info', onDismiss = undefined, children }: Props = $props();
5
10
  </script>
6
11
 
7
12
  <div
@@ -10,9 +15,9 @@
10
15
  aria-live={variant === 'danger' ? 'assertive' : 'polite'}
11
16
  aria-atomic="true"
12
17
  >
13
- <span class="alert-body"><slot /></span>
18
+ <span class="alert-body">{@render children?.()}</span>
14
19
  {#if onDismiss}
15
- <button type="button" class="alert-dismiss icon-btn" on:click={onDismiss} aria-label="Dismiss alert">
20
+ <button type="button" class="alert-dismiss icon-btn" onclick={onDismiss} aria-label="Dismiss alert">
16
21
  <CloseIcon />
17
22
  </button>
18
23
  {/if}
@@ -1,27 +1,41 @@
1
- <script lang="ts">
1
+ <script module lang="ts">
2
2
  export interface TimeSeriesAnnotation {
3
3
  index: number;
4
4
  label: string;
5
5
  color?: string;
6
6
  }
7
+ </script>
8
+
9
+ <script lang="ts">
10
+
11
+ interface Props {
12
+ data?: number[];
13
+ labels?: string[];
14
+ annotations?: TimeSeriesAnnotation[];
15
+ color?: string;
16
+ height?: number;
17
+ ariaLabel?: string;
18
+ }
7
19
 
8
- export let data: number[] = [];
9
- export let labels: string[] = [];
10
- export let annotations: TimeSeriesAnnotation[] = [];
11
- export let color = '#006FFF';
12
- export let height = 160;
13
- export let ariaLabel = 'Annotated time series';
20
+ let {
21
+ data = [],
22
+ labels = [],
23
+ annotations = [],
24
+ color = '#006FFF',
25
+ height = 160,
26
+ ariaLabel = 'Annotated time series'
27
+ }: Props = $props();
14
28
 
15
29
  const VW = 400;
16
30
  const PAD = { t: 16, r: 8, b: 28, l: 32 };
17
31
 
18
- $: n = data.length;
19
- $: chartW = VW - PAD.l - PAD.r;
20
- $: chartH = height - PAD.t - PAD.b;
21
- $: minV = n >= 2 ? Math.min(...data) : 0;
22
- $: maxV = n >= 2 ? Math.max(...data) || 1 : 1;
23
- $: range = maxV - minV || 1;
24
- $: bot = PAD.t + chartH;
32
+ let n = $derived(data.length);
33
+ let chartW = $derived(VW - PAD.l - PAD.r);
34
+ let chartH = $derived(height - PAD.t - PAD.b);
35
+ let minV = $derived(n >= 2 ? Math.min(...data) : 0);
36
+ let maxV = $derived(n >= 2 ? Math.max(...data) || 1 : 1);
37
+ let range = $derived(maxV - minV || 1);
38
+ let bot = $derived(PAD.t + chartH);
25
39
 
26
40
  function toX(i: number): number {
27
41
  return PAD.l + (i / (n - 1)) * chartW;
@@ -30,33 +44,33 @@
30
44
  return PAD.t + chartH - ((v - minV) / range) * chartH;
31
45
  }
32
46
 
33
- $: pts = n >= 2 ? data.map((v, i) => [toX(i), toY(v)] as [number, number]) : [];
47
+ let pts = $derived(n >= 2 ? data.map((v, i) => [toX(i), toY(v)] as [number, number]) : []);
34
48
 
35
- $: linePath = pts.length
49
+ let linePath = $derived(pts.length
36
50
  ? pts.map(([x, y], i) => `${i === 0 ? 'M' : 'L'}${x.toFixed(1)},${y.toFixed(1)}`).join(' ')
37
- : '';
51
+ : '');
38
52
 
39
- $: areaPath = pts.length
53
+ let areaPath = $derived(pts.length
40
54
  ? `${linePath} L${pts[n - 1][0].toFixed(1)},${bot} L${pts[0][0].toFixed(1)},${bot} Z`
41
- : '';
55
+ : '');
42
56
 
43
- $: gridLines = [0, 0.5, 1].map((f) => ({
57
+ let gridLines = $derived([0, 0.5, 1].map((f) => ({
44
58
  y: PAD.t + (1 - f) * chartH,
45
59
  label: String(Math.round(minV + f * range)),
46
- }));
60
+ })));
47
61
 
48
- $: stride = n <= 8 ? 1 : Math.ceil(n / 6);
49
- $: xLabels = n >= 2
62
+ let stride = $derived(n <= 8 ? 1 : Math.ceil(n / 6));
63
+ let xLabels = $derived(n >= 2
50
64
  ? data
51
65
  .map((_, i) => ({ x: toX(i), text: labels[i] ?? String(i), i }))
52
66
  .filter(({ i }) => i % stride === 0 || i === n - 1)
53
- : [];
67
+ : []);
54
68
 
55
- $: markers = annotations.map((a) => ({
69
+ let markers = $derived(annotations.map((a) => ({
56
70
  x: toX(Math.max(0, Math.min(n - 1, a.index))),
57
71
  label: a.label,
58
72
  color: a.color ?? '#F5A623',
59
- }));
73
+ })));
60
74
  </script>
61
75
 
62
76
  {#if n >= 2}
@@ -1,27 +1,39 @@
1
- <script lang="ts">
1
+ <script module lang="ts">
2
2
  export interface ArcNode {
3
3
  id: string;
4
4
  label: string;
5
5
  color?: string;
6
6
  }
7
-
8
7
  export interface ArcLink {
9
8
  source: string;
10
9
  target: string;
11
10
  value?: number;
12
11
  color?: string;
13
12
  }
13
+ </script>
14
+
15
+ <script lang="ts">
16
+
17
+
18
+ interface Props {
19
+ nodes: ArcNode[];
20
+ links: ArcLink[];
21
+ height?: number;
22
+ ariaLabel?: string;
23
+ }
14
24
 
15
- export let nodes: ArcNode[];
16
- export let links: ArcLink[];
17
- export let height = 180;
18
- export let ariaLabel = 'Arc diagram';
25
+ let {
26
+ nodes,
27
+ links,
28
+ height = 180,
29
+ ariaLabel = 'Arc diagram'
30
+ }: Props = $props();
19
31
 
20
32
  const PALETTE = ['#006FFF', '#00C875', '#F5A623', '#A78BFA', '#FF7B7B', '#00C8C8', '#FB923C'];
21
33
  const VW = 400;
22
34
  const PAD = { t: 12, r: 20, b: 36, l: 20 };
23
35
 
24
- $: layout = (() => {
36
+ let layout = $derived((() => {
25
37
  const n = nodes.length;
26
38
  if (!n) return null;
27
39
  const chartW = VW - PAD.l - PAD.r;
@@ -53,7 +65,7 @@
53
65
  });
54
66
 
55
67
  return { dots, arcs, baseY };
56
- })();
68
+ })());
57
69
  </script>
58
70
 
59
71
  {#if layout}
@@ -1,26 +1,38 @@
1
- <script lang="ts">
1
+ <script module lang="ts">
2
2
  export interface AreaChartSeries {
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?: AreaChartSeries[];
13
+ labels?: string[];
14
+ height?: number;
15
+ ariaLabel?: string;
16
+ }
7
17
 
8
- export let series: AreaChartSeries[] = [];
9
- export let labels: string[] = [];
10
- export let height: number = 160;
11
- export let ariaLabel: string = 'Area chart';
18
+ let {
19
+ series = [],
20
+ labels = [],
21
+ height = 160,
22
+ ariaLabel = 'Area 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
- $: n = series[0]?.values.length ?? 0;
17
- $: chartW = VW - PAD.l - PAD.r;
18
- $: chartH = height - PAD.t - PAD.b;
28
+ let n = $derived(series[0]?.values.length ?? 0);
29
+ let chartW = $derived(VW - PAD.l - PAD.r);
30
+ let chartH = $derived(height - PAD.t - PAD.b);
19
31
 
20
- $: totals = Array.from({ length: n }, (_, i) =>
32
+ let totals = $derived(Array.from({ length: n }, (_, i) =>
21
33
  series.reduce((acc, s) => acc + (s.values[i] ?? 0), 0),
22
- );
23
- $: maxV = totals.length ? Math.max(...totals, 1) : 1;
34
+ ));
35
+ let maxV = $derived(totals.length ? Math.max(...totals, 1) : 1);
24
36
 
25
37
  function toX(i: number): number {
26
38
  return PAD.l + (n > 1 ? (i / (n - 1)) * chartW : chartW / 2);
@@ -29,9 +41,9 @@
29
41
  return PAD.t + chartH - (v / maxV) * chartH;
30
42
  }
31
43
 
32
- $: gridLines = [0, 0.25, 0.5, 0.75, 1].map((f) => PAD.t + (1 - f) * chartH);
44
+ let gridLines = $derived([0, 0.25, 0.5, 0.75, 1].map((f) => PAD.t + (1 - f) * chartH));
33
45
 
34
- $: areas = n > 0
46
+ let areas = $derived(n > 0
35
47
  ? series.map((s, j) => {
36
48
  const bottoms = Array.from({ length: n }, (_, i) =>
37
49
  series.slice(0, j).reduce((acc, sr) => acc + (sr.values[i] ?? 0), 0),
@@ -43,7 +55,7 @@
43
55
  .reverse();
44
56
  return { color: s.color, label: s.label, d: `M ${topPts.join(' L ')} L ${botPts.join(' L ')} Z` };
45
57
  })
46
- : [];
58
+ : []);
47
59
  </script>
48
60
 
49
61
  <div role="img" aria-label={ariaLabel} style="width:100%;">
@@ -1,16 +1,28 @@
1
- <script context="module" lang="ts">
1
+ <script module lang="ts">
2
2
  export type AvatarSize = 'sm' | 'md' | 'lg';
3
3
  export type AvatarStatus = 'online' | 'offline' | 'away';
4
4
  </script>
5
5
 
6
6
  <script lang="ts">
7
- export let initials: string = '?';
8
- export let src: string | undefined = undefined;
9
- export let alt: string | undefined = undefined;
10
- export let size: AvatarSize = 'md';
11
- export let status: AvatarStatus | undefined = undefined;
12
- export let className: string = '';
13
- export let style: string = '';
7
+ interface Props {
8
+ initials?: string;
9
+ src?: string | undefined;
10
+ alt?: string | undefined;
11
+ size?: AvatarSize;
12
+ status?: AvatarStatus | undefined;
13
+ className?: string;
14
+ style?: string;
15
+ }
16
+
17
+ let {
18
+ initials = '?',
19
+ src = undefined,
20
+ alt = undefined,
21
+ size = 'md',
22
+ status = undefined,
23
+ className = '',
24
+ style = ''
25
+ }: Props = $props();
14
26
  </script>
15
27
 
16
28
  <span
@@ -1,4 +1,4 @@
1
- <script context="module" lang="ts">
1
+ <script module lang="ts">
2
2
  export interface AvatarItem {
3
3
  initials?: string;
4
4
  src?: string;
@@ -10,13 +10,22 @@
10
10
  import Avatar from './Avatar.svelte';
11
11
  import type { AvatarSize } from './Avatar.svelte';
12
12
 
13
- export let avatars: AvatarItem[] = [];
14
- export let max: number = 5;
15
- export let size: AvatarSize = 'md';
16
- export let ariaLabel: string = 'Avatar group';
13
+ interface Props {
14
+ avatars?: AvatarItem[];
15
+ max?: number;
16
+ size?: AvatarSize;
17
+ ariaLabel?: string;
18
+ }
19
+
20
+ let {
21
+ avatars = [],
22
+ max = 5,
23
+ size = 'md',
24
+ ariaLabel = 'Avatar group'
25
+ }: Props = $props();
17
26
 
18
- $: visible = avatars.slice(0, max);
19
- $: overflow = avatars.length - visible.length;
27
+ let visible = $derived(avatars.slice(0, max));
28
+ let overflow = $derived(avatars.length - visible.length);
20
29
  </script>
21
30
 
22
31
  <span class="avatar-group" role="list" aria-label={ariaLabel}>
@@ -1,22 +1,35 @@
1
- <script context="module" lang="ts">
1
+ <script module lang="ts">
2
2
  export type BadgeColor = 'danger' | 'warn' | 'info' | 'success' | 'neutral';
3
3
  </script>
4
4
 
5
5
  <script lang="ts">
6
- export let count: number | undefined = undefined;
7
- export let dot: boolean = false;
8
- export let max: number = 99;
9
- export let showZero: boolean = false;
10
- export let color: BadgeColor = 'danger';
11
- let klass: string = '';
12
- export { klass as class };
6
+ interface Props {
7
+ count?: number | undefined;
8
+ dot?: boolean;
9
+ max?: number;
10
+ showZero?: boolean;
11
+ color?: BadgeColor;
12
+ class?: string;
13
+ children?: import('svelte').Snippet;
14
+ }
13
15
 
14
- $: show = dot || (count !== undefined && (showZero || count > 0));
15
- $: label = count !== undefined ? (count > max ? `${max}+` : String(count)) : '';
16
+ let {
17
+ count = undefined,
18
+ dot = false,
19
+ max = 99,
20
+ showZero = false,
21
+ color = 'danger',
22
+ class: klass = '',
23
+ children
24
+ }: Props = $props();
25
+
26
+
27
+ let show = $derived(dot || (count !== undefined && (showZero || count > 0)));
28
+ let label = $derived(count !== undefined ? (count > max ? `${max}+` : String(count)) : '');
16
29
  </script>
17
30
 
18
31
  <span class="badge-wrapper{klass ? ` ${klass}` : ''}">
19
- <slot />
32
+ {@render children?.()}
20
33
  {#if show}
21
34
  <span class="badge badge-{color}{dot ? ' badge-dot' : ''}" aria-hidden="true">
22
35
  {#if !dot}{label}{/if}
@@ -1,4 +1,4 @@
1
- <script context="module" lang="ts">
1
+ <script module lang="ts">
2
2
  export type BannerVariant = 'info' | 'success' | 'warn' | 'danger';
3
3
  export interface BannerAction {
4
4
  label: string;
@@ -8,12 +8,23 @@
8
8
 
9
9
  <script lang="ts">
10
10
  import CloseIcon from '../icons/CloseIcon.svelte';
11
- export let variant: BannerVariant = 'info';
12
- export let title: string | undefined = undefined;
13
- export let action: BannerAction | undefined = undefined;
14
- export let onDismiss: (() => void) | undefined = undefined;
11
+ interface Props {
12
+ variant?: BannerVariant;
13
+ title?: string | undefined;
14
+ action?: BannerAction | undefined;
15
+ onDismiss?: (() => void) | undefined;
16
+ children?: import('svelte').Snippet;
17
+ }
18
+
19
+ let {
20
+ variant = 'info',
21
+ title = undefined,
22
+ action = undefined,
23
+ onDismiss = undefined,
24
+ children
25
+ }: Props = $props();
15
26
 
16
- $: isUrgent = variant === 'danger' || variant === 'warn';
27
+ let isUrgent = $derived(variant === 'danger' || variant === 'warn');
17
28
  </script>
18
29
 
19
30
  <div
@@ -24,13 +35,13 @@
24
35
  >
25
36
  <div class="banner__body">
26
37
  {#if title}<span class="banner__title">{title}</span>{/if}
27
- <span><slot /></span>
38
+ <span>{@render children?.()}</span>
28
39
  </div>
29
40
  {#if action}
30
- <button type="button" class="banner__action" on:click={action.onClick}>{action.label}</button>
41
+ <button type="button" class="banner__action" onclick={action.onClick}>{action.label}</button>
31
42
  {/if}
32
43
  {#if onDismiss}
33
- <button type="button" class="banner__dismiss icon-btn" on:click={onDismiss} aria-label="Dismiss banner">
44
+ <button type="button" class="banner__dismiss icon-btn" onclick={onDismiss} aria-label="Dismiss banner">
34
45
  <CloseIcon />
35
46
  </button>
36
47
  {/if}