@w5-ui/svelte 0.1.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. package/package.json +6 -6
  2. package/src/lib/components/Accordion.svelte +9 -1
  3. package/src/lib/components/AccordionItem.svelte +11 -5
  4. package/src/lib/components/ActionMenu.svelte +19 -14
  5. package/src/lib/components/ActivityFeed.svelte +24 -11
  6. package/src/lib/components/Alert.svelte +9 -4
  7. package/src/lib/components/AnnotatedTimeSeries.svelte +40 -26
  8. package/src/lib/components/ArcDiagram.svelte +20 -8
  9. package/src/lib/components/AreaChart.svelte +26 -14
  10. package/src/lib/components/Avatar.svelte +20 -8
  11. package/src/lib/components/AvatarGroup.svelte +16 -7
  12. package/src/lib/components/Badge.svelte +24 -11
  13. package/src/lib/components/Banner.svelte +20 -9
  14. package/src/lib/components/BarChart.svelte +29 -17
  15. package/src/lib/components/BeeswarmChart.svelte +32 -18
  16. package/src/lib/components/BoxPlot.svelte +27 -15
  17. package/src/lib/components/Breadcrumb.svelte +12 -7
  18. package/src/lib/components/BubbleChart.svelte +39 -25
  19. package/src/lib/components/BulletChart.svelte +16 -9
  20. package/src/lib/components/BumpChart.svelte +15 -8
  21. package/src/lib/components/Button.svelte +32 -11
  22. package/src/lib/components/CIDRInput.svelte +27 -19
  23. package/src/lib/components/CalendarHeatmap.svelte +12 -5
  24. package/src/lib/components/Callout.svelte +9 -4
  25. package/src/lib/components/CandlestickChart.svelte +31 -16
  26. package/src/lib/components/Card.svelte +16 -6
  27. package/src/lib/components/Carousel.svelte +14 -11
  28. package/src/lib/components/Checkbox.svelte +37 -16
  29. package/src/lib/components/ChordDiagram.svelte +12 -5
  30. package/src/lib/components/CirclePacking.svelte +13 -6
  31. package/src/lib/components/CodeBlock.svelte +16 -7
  32. package/src/lib/components/ColorPicker.svelte +22 -11
  33. package/src/lib/components/ColumnToggle.svelte +18 -11
  34. package/src/lib/components/Combobox.svelte +44 -33
  35. package/src/lib/components/CommandPalette.svelte +41 -31
  36. package/src/lib/components/ConfirmDialog.svelte +66 -35
  37. package/src/lib/components/ContextMenu.svelte +46 -33
  38. package/src/lib/components/ContextualHelp.svelte +13 -9
  39. package/src/lib/components/ContourPlot.svelte +43 -28
  40. package/src/lib/components/CopyButton.svelte +8 -4
  41. package/src/lib/components/CorrelationMatrix.svelte +16 -7
  42. package/src/lib/components/CountUp.svelte +30 -13
  43. package/src/lib/components/CumulativeDistribution.svelte +32 -19
  44. package/src/lib/components/DatePicker.svelte +28 -21
  45. package/src/lib/components/DateRangePicker.svelte +39 -32
  46. package/src/lib/components/Dendrogram.svelte +18 -6
  47. package/src/lib/components/Donut.svelte +28 -14
  48. package/src/lib/components/DotPlot.svelte +31 -16
  49. package/src/lib/components/Drawer.svelte +28 -21
  50. package/src/lib/components/DualAxisChart.svelte +39 -26
  51. package/src/lib/components/DumbbellChart.svelte +24 -12
  52. package/src/lib/components/DurationInput.svelte +26 -17
  53. package/src/lib/components/EmptyState.svelte +16 -6
  54. package/src/lib/components/ErrorBandChart.svelte +28 -14
  55. package/src/lib/components/ExpandableRow.svelte +19 -6
  56. package/src/lib/components/Field.svelte +26 -12
  57. package/src/lib/components/FileUpload.svelte +29 -20
  58. package/src/lib/components/FilterBuilder.svelte +27 -17
  59. package/src/lib/components/FlameGraph.svelte +14 -7
  60. package/src/lib/components/ForceGraph.svelte +19 -7
  61. package/src/lib/components/FunnelChart.svelte +20 -13
  62. package/src/lib/components/GanttChart.svelte +14 -7
  63. package/src/lib/components/Gauge.svelte +26 -16
  64. package/src/lib/components/GroupedList.svelte +13 -6
  65. package/src/lib/components/HealthBar.svelte +14 -5
  66. package/src/lib/components/HeatMap.svelte +28 -17
  67. package/src/lib/components/HexbinChart.svelte +36 -22
  68. package/src/lib/components/Histogram.svelte +27 -14
  69. package/src/lib/components/HorizonChart.svelte +28 -16
  70. package/src/lib/components/HoverCard.svelte +24 -12
  71. package/src/lib/components/IPInput.svelte +24 -16
  72. package/src/lib/components/IcicleChart.svelte +14 -7
  73. package/src/lib/components/IconButton.svelte +27 -9
  74. package/src/lib/components/InlineEdit.svelte +22 -12
  75. package/src/lib/components/Input.svelte +67 -10
  76. package/src/lib/components/InputGroup.svelte +8 -3
  77. package/src/lib/components/JsonViewer.svelte +17 -6
  78. package/src/lib/components/JsonViewerNode.svelte +36 -18
  79. package/src/lib/components/KVTable.svelte +6 -2
  80. package/src/lib/components/KanbanBoard.svelte +24 -17
  81. package/src/lib/components/Kbd.svelte +8 -4
  82. package/src/lib/components/LineChart.svelte +29 -17
  83. package/src/lib/components/LogViewer.svelte +27 -12
  84. package/src/lib/components/LollipopChart.svelte +20 -8
  85. package/src/lib/components/MACInput.svelte +24 -16
  86. package/src/lib/components/MarimekkoChart.svelte +14 -7
  87. package/src/lib/components/MatrixChart.svelte +19 -9
  88. package/src/lib/components/Menubar.svelte +26 -19
  89. package/src/lib/components/MirroredBarChart.svelte +25 -10
  90. package/src/lib/components/Modal.svelte +46 -33
  91. package/src/lib/components/MultiSelect.svelte +49 -38
  92. package/src/lib/components/NightingaleChart.svelte +17 -10
  93. package/src/lib/components/NotificationPanel.svelte +48 -33
  94. package/src/lib/components/NumberInput.svelte +37 -23
  95. package/src/lib/components/OTPInput.svelte +28 -16
  96. package/src/lib/components/Pagination.svelte +16 -13
  97. package/src/lib/components/ParallelCoordinates.svelte +28 -16
  98. package/src/lib/components/ParetoChart.svelte +38 -24
  99. package/src/lib/components/PasswordInput.svelte +24 -14
  100. package/src/lib/components/PieChart.svelte +21 -13
  101. package/src/lib/components/Pill.svelte +17 -6
  102. package/src/lib/components/PolarHeatmap.svelte +32 -18
  103. package/src/lib/components/Popover.svelte +22 -11
  104. package/src/lib/components/ProgressBar.svelte +17 -8
  105. package/src/lib/components/PunchCard.svelte +31 -20
  106. package/src/lib/components/QuadrantChart.svelte +50 -30
  107. package/src/lib/components/RadarChart.svelte +30 -18
  108. package/src/lib/components/RadialBarChart.svelte +14 -7
  109. package/src/lib/components/RadioGroup.svelte +20 -8
  110. package/src/lib/components/RangeSlider.svelte +30 -18
  111. package/src/lib/components/RankedList.svelte +18 -6
  112. package/src/lib/components/ResizablePanel.svelte +33 -17
  113. package/src/lib/components/RidgelinePlot.svelte +33 -21
  114. package/src/lib/components/RowToggle.svelte +15 -5
  115. package/src/lib/components/SankeyDiagram.svelte +18 -6
  116. package/src/lib/components/ScatterPlot.svelte +34 -21
  117. package/src/lib/components/SearchBox.svelte +27 -5
  118. package/src/lib/components/SegmentedControl.svelte +11 -7
  119. package/src/lib/components/Select.svelte +37 -26
  120. package/src/lib/components/SelectionToolbar.svelte +25 -11
  121. package/src/lib/components/Sidebar.svelte +15 -9
  122. package/src/lib/components/Signal.svelte +6 -2
  123. package/src/lib/components/Skeleton.svelte +20 -10
  124. package/src/lib/components/SkipLink.svelte +9 -4
  125. package/src/lib/components/Slider.svelte +28 -14
  126. package/src/lib/components/SlopeChart.svelte +35 -21
  127. package/src/lib/components/SortHeader.svelte +20 -9
  128. package/src/lib/components/SortableList.svelte +20 -13
  129. package/src/lib/components/Sparkline.svelte +15 -6
  130. package/src/lib/components/SparklineMatrix.svelte +17 -10
  131. package/src/lib/components/Spinner.svelte +7 -3
  132. package/src/lib/components/SplitButton.svelte +28 -17
  133. package/src/lib/components/Spoiler.svelte +22 -11
  134. package/src/lib/components/StackedBarChart.svelte +35 -22
  135. package/src/lib/components/StackedProgress.svelte +21 -9
  136. package/src/lib/components/StarRating.svelte +22 -11
  137. package/src/lib/components/Stat.svelte +32 -10
  138. package/src/lib/components/StatusIndicator.svelte +7 -3
  139. package/src/lib/components/StepChart.svelte +27 -15
  140. package/src/lib/components/Stepper.svelte +10 -6
  141. package/src/lib/components/StreamGraph.svelte +19 -12
  142. package/src/lib/components/StripeChart.svelte +22 -12
  143. package/src/lib/components/SunburstChart.svelte +11 -4
  144. package/src/lib/components/SwitchPortGrid.svelte +13 -7
  145. package/src/lib/components/TabPanel.svelte +9 -4
  146. package/src/lib/components/Tabs.svelte +18 -10
  147. package/src/lib/components/Tag.svelte +9 -5
  148. package/src/lib/components/TagInput.svelte +28 -18
  149. package/src/lib/components/Textarea.svelte +37 -15
  150. package/src/lib/components/ThresholdAreaChart.svelte +34 -21
  151. package/src/lib/components/TimePicker.svelte +25 -17
  152. package/src/lib/components/TimeRange.svelte +19 -14
  153. package/src/lib/components/Timeline.svelte +8 -4
  154. package/src/lib/components/Toast.svelte +2 -2
  155. package/src/lib/components/Toggle.svelte +13 -7
  156. package/src/lib/components/ToggleGroup.svelte +19 -11
  157. package/src/lib/components/Tooltip.svelte +16 -6
  158. package/src/lib/components/Topbar.svelte +24 -10
  159. package/src/lib/components/TransferList.svelte +34 -27
  160. package/src/lib/components/TreeItem.svelte +23 -10
  161. package/src/lib/components/TreeMap.svelte +13 -6
  162. package/src/lib/components/TreeView.svelte +24 -12
  163. package/src/lib/components/UptimeTimeline.svelte +22 -15
  164. package/src/lib/components/VennDiagram.svelte +25 -13
  165. package/src/lib/components/ViolinPlot.svelte +31 -19
  166. package/src/lib/components/VirtualList.svelte +25 -13
  167. package/src/lib/components/WaffleChart.svelte +32 -18
  168. package/src/lib/components/WaterfallChart.svelte +33 -26
  169. package/src/lib/components/WordCloud.svelte +21 -14
  170. package/src/lib/icons/AlarmIcon.svelte +4 -1
  171. package/src/lib/icons/BellIcon.svelte +2 -1
  172. package/src/lib/icons/CaretIcon.svelte +5 -3
  173. package/src/lib/icons/ClientsIcon.svelte +4 -1
  174. package/src/lib/icons/CloseIcon.svelte +2 -1
  175. package/src/lib/icons/DashboardIcon.svelte +4 -1
  176. package/src/lib/icons/DevicesIcon.svelte +4 -1
  177. package/src/lib/icons/DownloadIcon.svelte +2 -1
  178. package/src/lib/icons/HelpIcon.svelte +2 -1
  179. package/src/lib/icons/InfraIcon.svelte +4 -1
  180. package/src/lib/icons/IntegrationsIcon.svelte +4 -1
  181. package/src/lib/icons/LogsIcon.svelte +4 -1
  182. package/src/lib/icons/PlusIcon.svelte +2 -1
  183. package/src/lib/icons/PortsIcon.svelte +4 -1
  184. package/src/lib/icons/SearchIcon.svelte +6 -4
  185. package/src/lib/icons/SecurityIcon.svelte +4 -1
  186. package/src/lib/icons/SettingsIcon.svelte +4 -1
  187. package/src/lib/icons/TopologyIcon.svelte +4 -1
  188. package/src/lib/icons/UpdatesIcon.svelte +2 -1
  189. package/src/lib/icons/VpnIcon.svelte +4 -1
  190. package/src/lib/icons/WifiIcon.svelte +4 -1
  191. package/src/lib/icons/WirelessIcon.svelte +4 -1
@@ -1,4 +1,4 @@
1
- <script context="module" lang="ts">
1
+ <script module lang="ts">
2
2
  export type SwitchPortStatus = 'up' | 'poe' | 'down';
3
3
  export interface SwitchPort {
4
4
  status: SwitchPortStatus;
@@ -13,11 +13,17 @@
13
13
  </script>
14
14
 
15
15
  <script lang="ts">
16
- import { createEventDispatcher } from 'svelte';
17
- export let ports: SwitchPort[] = [];
18
- export let columns: number = 12;
19
- export let ariaLabel: string = 'Switch port panel';
20
- const dispatch = createEventDispatcher<{ portclick: number }>();
16
+
17
+ interface Props {
18
+ ports?: SwitchPort[];
19
+ columns?: number;
20
+ ariaLabel?: string;
21
+ onportclick?: (payload: number) => void;
22
+ }
23
+
24
+ let { ports = [], columns = 12, ariaLabel = 'Switch port panel',
25
+ onportclick,
26
+ }: Props = $props();
21
27
  </script>
22
28
 
23
29
  <ul class="spg" role="list" aria-label={ariaLabel} style="grid-template-columns: repeat({columns}, 1fr);">
@@ -30,7 +36,7 @@
30
36
  class="spg__btn"
31
37
  data-status={port.status}
32
38
  aria-label={desc}
33
- on:click={() => dispatch('portclick', i)}
39
+ onclick={() => onportclick?.(i)}
34
40
  >
35
41
  <span class="spg__num">{n}</span>
36
42
  {#if port.speed}
@@ -1,7 +1,12 @@
1
1
  <script lang="ts">
2
- export let id: string;
3
- export let active: string;
4
- $: isActive = id === active;
2
+ interface Props {
3
+ id: string;
4
+ active: string;
5
+ children?: import('svelte').Snippet;
6
+ }
7
+
8
+ let { id, active, children }: Props = $props();
9
+ let isActive = $derived(id === active);
5
10
  </script>
6
11
 
7
12
  <div
@@ -12,6 +17,6 @@
12
17
  tabindex="0"
13
18
  >
14
19
  {#if isActive}
15
- <slot />
20
+ {@render children?.()}
16
21
  {/if}
17
22
  </div>
@@ -1,18 +1,26 @@
1
- <script lang="ts">
2
- import { createEventDispatcher } from 'svelte';
1
+ <script module lang="ts">
3
2
  export interface TabItem { id: string; label: string; badge?: string | number }
4
- export let items: TabItem[] = [];
5
- export let active: string;
6
- export let ariaLabel: string | undefined = undefined;
7
- const dispatch = createEventDispatcher<{ change: string }>();
3
+ </script>
4
+
5
+ <script lang="ts">
6
+
7
+ interface Props {
8
+ items?: TabItem[];
9
+ active: string;
10
+ ariaLabel?: string | undefined;
11
+ onchange?: (payload: string) => void;
12
+ }
8
13
 
9
- let buttons: (HTMLButtonElement | null)[] = [];
14
+ let { items = [], active = $bindable(), ariaLabel = undefined,
15
+ onchange,
16
+ }: Props = $props();
17
+ let buttons: (HTMLButtonElement | null)[] = $state([]);
10
18
 
11
19
  function select(idx: number) {
12
20
  const next = items[(idx + items.length) % items.length];
13
21
  if (!next) return;
14
22
  active = next.id;
15
- dispatch('change', next.id);
23
+ onchange?.(next.id);
16
24
  buttons[(idx + items.length) % items.length]?.focus();
17
25
  }
18
26
 
@@ -35,8 +43,8 @@
35
43
  aria-selected={t.id === active}
36
44
  aria-controls="tabpanel-{t.id}"
37
45
  tabindex={t.id === active ? 0 : -1}
38
- on:click={() => { active = t.id; dispatch('change', t.id); }}
39
- on:keydown={(e) => onKey(e, i)}
46
+ onclick={() => { active = t.id; onchange?.(t.id); }}
47
+ onkeydown={(e) => onKey(e, i)}
40
48
  >
41
49
  {t.label}
42
50
  {#if t.badge !== undefined}<span class="badge">{t.badge}</span>{/if}
@@ -1,7 +1,11 @@
1
1
  <script lang="ts">
2
- export let label: string;
3
- let className = '';
4
- export { className as class };
2
+ interface Props {
3
+ label: string;
4
+ class?: string;
5
+ onclick?: (event: MouseEvent) => void;
6
+ }
7
+
8
+ let { label, class: className = '', onclick }: Props = $props();
5
9
  </script>
6
10
 
7
11
  <span class="tag {className}">
@@ -10,10 +14,10 @@
10
14
  type="button"
11
15
  class="tag__remove"
12
16
  aria-label="Remove {label} filter"
13
- on:click
17
+ {onclick}
14
18
  >
15
19
  <svg viewBox="0 0 10 10" width="10" height="10" fill="none" aria-hidden="true" focusable="false">
16
- <path d="M2 2l6 6M8 2l-6 6" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/>
20
+ <path d="M2 2l6 6M8 2l-6 6" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" />
17
21
  </svg>
18
22
  </button>
19
23
  </span>
@@ -1,34 +1,43 @@
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
- import { createEventDispatcher } from 'svelte';
6
+
7
7
 
8
- export let label: string | undefined = undefined;
9
- export let value: string[] = [];
10
- export let placeholder: string = 'Type and press Enter…';
11
- export let disabled: boolean = false;
12
- let klass = '';
13
- export { klass as class };
8
+ interface Props {
9
+ label?: string | undefined;
10
+ value?: string[];
11
+ placeholder?: string;
12
+ disabled?: boolean;
13
+ class?: string;
14
+ onchange?: (payload: string[]) => void;
15
+ }
14
16
 
15
- const dispatch = createEventDispatcher<{ change: string[] }>();
17
+ let {
18
+ label = undefined,
19
+ value = $bindable([]),
20
+ placeholder = 'Type and press Enter…',
21
+ disabled = false,
22
+ class: klass = '',
23
+ onchange,
24
+ }: Props = $props();
16
25
  const uid = `dash-ui-tag-input-${++counter}`;
17
26
 
18
- let draft = '';
19
- let inputEl: HTMLInputElement;
27
+ let draft = $state('');
28
+ let inputEl = $state<HTMLInputElement | undefined>(undefined);
20
29
 
21
30
  function addTag(raw: string) {
22
31
  const trimmed = raw.trim();
23
32
  if (!trimmed || value.includes(trimmed)) return;
24
33
  value = [...value, trimmed];
25
34
  draft = '';
26
- dispatch('change', value);
35
+ onchange?.(value);
27
36
  }
28
37
 
29
38
  function removeTag(index: number) {
30
39
  value = value.filter((_, i) => i !== index);
31
- dispatch('change', value);
40
+ onchange?.(value);
32
41
  }
33
42
 
34
43
  function handleKeyDown(e: KeyboardEvent) {
@@ -51,12 +60,13 @@
51
60
  {#if label}
52
61
  <label for={uid} class="tag-input__label">{label}</label>
53
62
  {/if}
54
- <!-- svelte-ignore a11y-click-events-have-key-events a11y-no-static-element-interactions -->
63
+ <!-- svelte-ignore a11y_click_events_have_key_events, a11y_no_static_element_interactions -->
64
+ <!-- svelte-ignore a11y_no_noninteractive_element_interactions - group container focuses input on click -->
55
65
  <div
56
66
  role="group"
57
67
  aria-label={label ?? 'Tags'}
58
68
  class="tag-input{disabled ? ' tag-input--disabled' : ''}"
59
- on:click={() => inputEl?.focus()}
69
+ onclick={() => inputEl?.focus()}
60
70
  >
61
71
  {#each value as tag, i}
62
72
  <span class="tag">
@@ -66,7 +76,7 @@
66
76
  type="button"
67
77
  class="tag__remove"
68
78
  aria-label="Remove {tag}"
69
- on:click|stopPropagation={() => removeTag(i)}
79
+ onclick={(e) => { e.stopPropagation(); (() => removeTag(i))(); }}
70
80
  >
71
81
  <svg viewBox="0 0 10 10" width="10" height="10" fill="none" aria-hidden="true" focusable="false">
72
82
  <path d="M2 2l6 6M8 2l-6 6" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/>
@@ -85,8 +95,8 @@
85
95
  placeholder={value.length === 0 ? placeholder : ''}
86
96
  aria-label={label ?? 'Add tag'}
87
97
  autocomplete="off"
88
- on:keydown={handleKeyDown}
89
- on:blur={handleBlur}
98
+ onkeydown={handleKeyDown}
99
+ onblur={handleBlur}
90
100
  />
91
101
  </div>
92
102
  </div>
@@ -1,31 +1,53 @@
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 value: string = '';
7
- export let rows: number = 4;
8
- export let placeholder: string | undefined = undefined;
9
- export let disabled: boolean = false;
10
- export let readonly: boolean = false;
11
- export let id: string | undefined = undefined;
12
- let className = '';
13
- export { className as class };
6
+ interface Props {
7
+ value?: string;
8
+ rows?: number;
9
+ placeholder?: string | undefined;
10
+ disabled?: boolean;
11
+ readonly?: boolean;
12
+ id?: string | undefined;
13
+ class?: string;
14
+ style?: string;
15
+ oninput?: (event: Event) => void;
16
+ onchange?: (event: Event) => void;
17
+ onfocus?: (event: FocusEvent) => void;
18
+ onblur?: (event: FocusEvent) => void;
19
+ }
20
+
21
+ let {
22
+ value = $bindable(''),
23
+ rows = 4,
24
+ placeholder = undefined,
25
+ disabled = false,
26
+ readonly = false,
27
+ id = undefined,
28
+ class: className = '',
29
+ style = '',
30
+ oninput,
31
+ onchange,
32
+ onfocus,
33
+ onblur,
34
+ }: Props = $props();
14
35
 
15
36
  const uid = `dash-ui-ta-${++counter}`;
16
- $: inputId = id ?? uid;
37
+ let inputId = $derived(id ?? uid);
17
38
  </script>
18
39
 
19
40
  <textarea
20
41
  id={inputId}
21
42
  class="input textarea {className}"
43
+ {style}
22
44
  {rows}
23
45
  {placeholder}
24
46
  {disabled}
25
- readonly={readonly}
47
+ {readonly}
26
48
  bind:value
27
- on:input
28
- on:change
29
- on:focus
30
- on:blur
49
+ {oninput}
50
+ {onchange}
51
+ {onfocus}
52
+ {onblur}
31
53
  ></textarea>
@@ -1,33 +1,46 @@
1
- <script context="module">
1
+ <script module>
2
2
  let _n = 0;
3
3
  </script>
4
4
  <script lang="ts">
5
5
  const uid = `tac${_n++}`;
6
6
 
7
- export let values: number[];
8
- export let labels: string[] = [];
9
- export let threshold: number;
10
- export let thresholdLabel: string | undefined = undefined;
11
- export let belowColor: string = '#00C875';
12
- export let aboveColor: string = '#FF7B7B';
13
- export let height: number = 160;
14
- export let ariaLabel: string = 'Threshold area chart';
7
+ interface Props {
8
+ values: number[];
9
+ labels?: string[];
10
+ threshold: number;
11
+ thresholdLabel?: string | undefined;
12
+ belowColor?: string;
13
+ aboveColor?: string;
14
+ height?: number;
15
+ ariaLabel?: string;
16
+ }
17
+
18
+ let {
19
+ values,
20
+ labels = [],
21
+ threshold,
22
+ thresholdLabel = undefined,
23
+ belowColor = '#00C875',
24
+ aboveColor = '#FF7B7B',
25
+ height = 160,
26
+ ariaLabel = 'Threshold area chart'
27
+ }: Props = $props();
15
28
 
16
29
  const VW = 400;
17
30
  const PAD = { t: 16, r: 8, b: 28, l: 8 };
18
31
 
19
- $: n = values.length;
20
- $: chartW = VW - PAD.l - PAD.r;
21
- $: chartH = height - PAD.t - PAD.b;
22
- $: maxV = Math.max(...values, threshold, 1);
23
- $: toX = (i: number) => PAD.l + (n > 1 ? (i / (n - 1)) * chartW : chartW / 2);
24
- $: toY = (v: number) => PAD.t + chartH - (v / maxV) * chartH;
25
- $: threshY = toY(threshold);
26
- $: baseY = PAD.t + chartH;
27
- $: pts = values.map((v, i) => `${toX(i).toFixed(1)},${toY(v).toFixed(1)}`);
28
- $: d = `M ${pts.join(' L ')} L ${toX(n - 1).toFixed(1)},${baseY} L ${toX(0).toFixed(1)},${baseY} Z`;
29
- $: tLabel = thresholdLabel ?? String(threshold);
30
- $: gridLines = [0.25, 0.5, 0.75, 1].map((f) => PAD.t + (1 - f) * chartH);
32
+ let n = $derived(values.length);
33
+ let chartW = $derived(VW - PAD.l - PAD.r);
34
+ let chartH = $derived(height - PAD.t - PAD.b);
35
+ let maxV = $derived(Math.max(...values, threshold, 1));
36
+ let toX = $derived((i: number) => PAD.l + (n > 1 ? (i / (n - 1)) * chartW : chartW / 2));
37
+ let toY = $derived((v: number) => PAD.t + chartH - (v / maxV) * chartH);
38
+ let threshY = $derived(toY(threshold));
39
+ let baseY = $derived(PAD.t + chartH);
40
+ let pts = $derived(values.map((v, i) => `${toX(i).toFixed(1)},${toY(v).toFixed(1)}`));
41
+ let d = $derived(`M ${pts.join(' L ')} L ${toX(n - 1).toFixed(1)},${baseY} L ${toX(0).toFixed(1)},${baseY} Z`);
42
+ let tLabel = $derived(thresholdLabel ?? String(threshold));
43
+ let gridLines = $derived([0.25, 0.5, 0.75, 1].map((f) => PAD.t + (1 - f) * chartH));
31
44
  </script>
32
45
 
33
46
  <div role="img" aria-label={ariaLabel} style="width:100%">
@@ -1,17 +1,25 @@
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
- import { createEventDispatcher } from 'svelte';
6
+
7
7
 
8
- export let label: string | undefined = undefined;
9
- export let value: string = '00:00';
10
- export let disabled: boolean = false;
11
- let className = '';
12
- export { className as class };
8
+ interface Props {
9
+ label?: string | undefined;
10
+ value?: string;
11
+ disabled?: boolean;
12
+ class?: string;
13
+ onchange?: (payload: string) => void;
14
+ }
13
15
 
14
- const dispatch = createEventDispatcher<{ change: string }>();
16
+ let {
17
+ label = undefined,
18
+ value = $bindable('00:00'),
19
+ disabled = false,
20
+ class: className = '',
21
+ onchange,
22
+ }: Props = $props();
15
23
  const uid = `dash-ui-tp-${++counter}`;
16
24
 
17
25
  function pad(n: number): string {
@@ -26,13 +34,13 @@
26
34
  ];
27
35
  }
28
36
 
29
- $: [hours, minutes] = parseTime(value);
37
+ let [hours, minutes] = $derived(parseTime(value));
30
38
 
31
- let inputs: [HTMLInputElement | null, HTMLInputElement | null] = [null, null];
39
+ let inputs: [HTMLInputElement | null, HTMLInputElement | null] = $state([null, null]);
32
40
 
33
41
  function commit(h: number, m: number) {
34
42
  value = `${pad(h)}:${pad(m)}`;
35
- dispatch('change', value);
43
+ onchange?.(value);
36
44
  }
37
45
 
38
46
  function handleKey(field: 0 | 1, e: KeyboardEvent) {
@@ -88,9 +96,9 @@
88
96
  {disabled}
89
97
  maxlength={2}
90
98
  class="time-picker__field"
91
- on:input={(e) => handleInput(0, e)}
92
- on:keydown={(e) => handleKey(0, e)}
93
- on:focus={(e) => e.currentTarget.select()}
99
+ oninput={(e) => handleInput(0, e)}
100
+ onkeydown={(e) => handleKey(0, e)}
101
+ onfocus={(e) => e.currentTarget.select()}
94
102
  />
95
103
  <span class="time-picker__sep" aria-hidden="true">:</span>
96
104
  <input
@@ -108,9 +116,9 @@
108
116
  {disabled}
109
117
  maxlength={2}
110
118
  class="time-picker__field"
111
- on:input={(e) => handleInput(1, e)}
112
- on:keydown={(e) => handleKey(1, e)}
113
- on:focus={(e) => e.currentTarget.select()}
119
+ oninput={(e) => handleInput(1, e)}
120
+ onkeydown={(e) => handleKey(1, e)}
121
+ onfocus={(e) => e.currentTarget.select()}
114
122
  />
115
123
  </div>
116
124
  </div>
@@ -1,4 +1,4 @@
1
- <script context="module" lang="ts">
1
+ <script module lang="ts">
2
2
  let counter = 0;
3
3
  export type TimeRangeId = '1h' | '6h' | '24h' | '7d' | '30d';
4
4
  const PRESETS: { id: TimeRangeId; label: string; short: string }[] = [
@@ -11,20 +11,25 @@
11
11
  </script>
12
12
 
13
13
  <script lang="ts">
14
- import { createEventDispatcher, onMount, onDestroy } from 'svelte';
14
+ import { onMount, onDestroy } from 'svelte';
15
15
 
16
- export let value: TimeRangeId = '1h';
16
+ interface Props {
17
+ value?: TimeRangeId;
18
+ onchange?: (payload: TimeRangeId) => void;
19
+ }
17
20
 
18
- const dispatch = createEventDispatcher<{ change: TimeRangeId }>();
21
+ let { value = '1h',
22
+ onchange,
23
+ }: Props = $props();
19
24
  const uid = `dash-ui-tr-${++counter}`;
20
25
  const listId = `${uid}-list`;
21
26
 
22
- let open = false;
23
- let activeIdx = 0;
24
- let triggerEl: HTMLButtonElement;
25
- let wrapperEl: HTMLDivElement;
27
+ let open = $state(false);
28
+ let activeIdx = $state(0);
29
+ let triggerEl = $state<HTMLButtonElement | undefined>(undefined);
30
+ let wrapperEl = $state<HTMLDivElement | undefined>(undefined);
26
31
 
27
- $: selected = PRESETS.find((p) => p.id === value) ?? PRESETS[0];
32
+ let selected = $derived(PRESETS.find((p) => p.id === value) ?? PRESETS[0]);
28
33
 
29
34
  function toggle() {
30
35
  if (!open) activeIdx = PRESETS.findIndex((p) => p.id === value);
@@ -32,7 +37,7 @@
32
37
  }
33
38
 
34
39
  function select(id: TimeRangeId) {
35
- dispatch('change', id);
40
+ onchange?.(id);
36
41
  open = false;
37
42
  triggerEl?.focus();
38
43
  }
@@ -71,8 +76,8 @@
71
76
  aria-haspopup="listbox"
72
77
  aria-expanded={open}
73
78
  aria-controls={open ? listId : undefined}
74
- on:click={toggle}
75
- on:keydown={onKeyDown}
79
+ onclick={toggle}
80
+ onkeydown={onKeyDown}
76
81
  >
77
82
  {selected.short}
78
83
  <svg class="time-range-chevron" width="10" height="6" viewBox="0 0 10 6" aria-hidden="true" focusable="false" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
@@ -88,8 +93,8 @@
88
93
  tabindex="-1"
89
94
  data-active={idx === activeIdx ? 'true' : undefined}
90
95
  class="time-range-option"
91
- on:mouseenter={() => { activeIdx = idx; }}
92
- on:mousedown|preventDefault={() => select(p.id)}
96
+ onmouseenter={() => { activeIdx = idx; }}
97
+ onmousedown={(e) => { e.preventDefault(); (() => select(p.id))(); }}
93
98
  >
94
99
  {p.label}
95
100
  {#if p.id === value}
@@ -1,4 +1,4 @@
1
- <script context="module" lang="ts">
1
+ <script module lang="ts">
2
2
  export interface TimelineEvent {
3
3
  id: string;
4
4
  title: string;
@@ -9,9 +9,13 @@
9
9
  </script>
10
10
 
11
11
  <script lang="ts">
12
- export let events: TimelineEvent[];
13
- let className = '';
14
- export { className as class };
12
+ interface Props {
13
+ events: TimelineEvent[];
14
+ class?: string;
15
+ }
16
+
17
+ let { events, class: className = '' }: Props = $props();
18
+
15
19
  </script>
16
20
 
17
21
  <ol class="timeline {className}" aria-label="Event timeline">
@@ -1,4 +1,4 @@
1
- <script context="module" lang="ts">
1
+ <script module lang="ts">
2
2
  import { writable } from 'svelte/store';
3
3
 
4
4
  export type ToastVariant = 'success' | 'info' | 'warn' | 'danger';
@@ -40,7 +40,7 @@
40
40
  <button
41
41
  type="button"
42
42
  class="toast-dismiss icon-btn"
43
- on:click={() => dismiss(item.id)}
43
+ onclick={() => dismiss(item.id)}
44
44
  aria-label="Dismiss notification"
45
45
  >
46
46
  <svg viewBox="0 0 14 14" width="14" height="14" aria-hidden="true" focusable="false">
@@ -1,12 +1,18 @@
1
1
  <script lang="ts">
2
- import { createEventDispatcher } from 'svelte';
3
- export let on: boolean = false;
4
- export let ariaLabel: string | undefined = undefined;
5
- export let ariaDescribedBy: string | undefined = undefined;
6
- const dispatch = createEventDispatcher<{ toggle: boolean }>();
2
+
3
+ interface Props {
4
+ on?: boolean;
5
+ ariaLabel?: string | undefined;
6
+ ariaDescribedBy?: string | undefined;
7
+ ontoggle?: (payload: boolean) => void;
8
+ }
9
+
10
+ let { on = $bindable(false), ariaLabel = undefined, ariaDescribedBy = undefined,
11
+ ontoggle,
12
+ }: Props = $props();
7
13
  function flip() {
8
14
  on = !on;
9
- dispatch('toggle', on);
15
+ ontoggle?.(on);
10
16
  }
11
17
  </script>
12
18
 
@@ -17,7 +23,7 @@
17
23
  aria-label={ariaLabel}
18
24
  aria-describedby={ariaDescribedBy}
19
25
  class="toggle-track {on ? 'on' : 'off'}"
20
- on:click={flip}
26
+ onclick={flip}
21
27
  >
22
28
  <span class="knob"></span>
23
29
  </button>
@@ -1,19 +1,27 @@
1
1
  <script lang="ts">
2
- import { createEventDispatcher } from 'svelte';
2
+
3
3
 
4
- export let options: { value: string; label: string; disabled?: boolean }[] = [];
5
- export let value: string[] = [];
6
- export let ariaLabel: string = '';
7
- export let size: 'sm' | 'md' = 'md';
8
- let klass: string = '';
9
- export { klass as class };
10
-
11
- const dispatch = createEventDispatcher<{ change: string[] }>();
4
+ interface Props {
5
+ options?: { value: string; label: string; disabled?: boolean }[];
6
+ value?: string[];
7
+ ariaLabel?: string;
8
+ size?: 'sm' | 'md';
9
+ class?: string;
10
+ onchange?: (payload: string[]) => void;
11
+ }
12
12
 
13
+ let {
14
+ options = [],
15
+ value = $bindable([]),
16
+ ariaLabel = '',
17
+ size = 'md',
18
+ class: klass = '',
19
+ onchange,
20
+ }: Props = $props();
13
21
  function toggle(v: string) {
14
22
  const next = value.includes(v) ? value.filter((x) => x !== v) : [...value, v];
15
23
  value = next;
16
- dispatch('change', next);
24
+ onchange?.(next);
17
25
  }
18
26
  </script>
19
27
 
@@ -24,7 +32,7 @@
24
32
  aria-pressed={value.includes(opt.value)}
25
33
  disabled={opt.disabled}
26
34
  class="tg-btn{value.includes(opt.value) ? ' tg-btn--on' : ''}"
27
- on:click={() => toggle(opt.value)}
35
+ onclick={() => toggle(opt.value)}
28
36
  >
29
37
  {opt.label}
30
38
  </button>
@@ -1,16 +1,26 @@
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 placement: 'top' | 'bottom' | 'left' | 'right' = 'top';
8
- let className = '';
9
- export { className as class };
6
+ interface Props {
7
+ label: string;
8
+ placement?: 'top' | 'bottom' | 'left' | 'right';
9
+ class?: string;
10
+ children?: import('svelte').Snippet;
11
+ }
12
+
13
+ let {
14
+ label,
15
+ placement = 'top',
16
+ class: className = '',
17
+ children
18
+ }: Props = $props();
19
+
10
20
  const id = `dash-ui-tooltip-${++counter}`;
11
21
  </script>
12
22
 
13
23
  <span class="tooltip-wrapper tooltip-{placement} {className}">
14
- <span class="tooltip-trigger" aria-describedby={id}><slot /></span>
24
+ <span class="tooltip-trigger" aria-describedby={id}>{@render children?.()}</span>
15
25
  <span {id} role="tooltip" class="tooltip-content">{label}</span>
16
26
  </span>