@w5-ui/svelte 0.1.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. package/package.json +6 -6
  2. package/src/lib/components/Accordion.svelte +9 -1
  3. package/src/lib/components/AccordionItem.svelte +11 -5
  4. package/src/lib/components/ActionMenu.svelte +19 -14
  5. package/src/lib/components/ActivityFeed.svelte +24 -11
  6. package/src/lib/components/Alert.svelte +9 -4
  7. package/src/lib/components/AnnotatedTimeSeries.svelte +40 -26
  8. package/src/lib/components/ArcDiagram.svelte +20 -8
  9. package/src/lib/components/AreaChart.svelte +26 -14
  10. package/src/lib/components/Avatar.svelte +20 -8
  11. package/src/lib/components/AvatarGroup.svelte +16 -7
  12. package/src/lib/components/Badge.svelte +24 -11
  13. package/src/lib/components/Banner.svelte +20 -9
  14. package/src/lib/components/BarChart.svelte +29 -17
  15. package/src/lib/components/BeeswarmChart.svelte +32 -18
  16. package/src/lib/components/BoxPlot.svelte +27 -15
  17. package/src/lib/components/Breadcrumb.svelte +12 -7
  18. package/src/lib/components/BubbleChart.svelte +39 -25
  19. package/src/lib/components/BulletChart.svelte +16 -9
  20. package/src/lib/components/BumpChart.svelte +15 -8
  21. package/src/lib/components/Button.svelte +32 -11
  22. package/src/lib/components/CIDRInput.svelte +27 -19
  23. package/src/lib/components/CalendarHeatmap.svelte +12 -5
  24. package/src/lib/components/Callout.svelte +9 -4
  25. package/src/lib/components/CandlestickChart.svelte +31 -16
  26. package/src/lib/components/Card.svelte +16 -6
  27. package/src/lib/components/Carousel.svelte +14 -11
  28. package/src/lib/components/Checkbox.svelte +37 -16
  29. package/src/lib/components/ChordDiagram.svelte +12 -5
  30. package/src/lib/components/CirclePacking.svelte +13 -6
  31. package/src/lib/components/CodeBlock.svelte +16 -7
  32. package/src/lib/components/ColorPicker.svelte +22 -11
  33. package/src/lib/components/ColumnToggle.svelte +18 -11
  34. package/src/lib/components/Combobox.svelte +44 -33
  35. package/src/lib/components/CommandPalette.svelte +41 -31
  36. package/src/lib/components/ConfirmDialog.svelte +66 -35
  37. package/src/lib/components/ContextMenu.svelte +46 -33
  38. package/src/lib/components/ContextualHelp.svelte +13 -9
  39. package/src/lib/components/ContourPlot.svelte +43 -28
  40. package/src/lib/components/CopyButton.svelte +8 -4
  41. package/src/lib/components/CorrelationMatrix.svelte +16 -7
  42. package/src/lib/components/CountUp.svelte +30 -13
  43. package/src/lib/components/CumulativeDistribution.svelte +32 -19
  44. package/src/lib/components/DatePicker.svelte +28 -21
  45. package/src/lib/components/DateRangePicker.svelte +39 -32
  46. package/src/lib/components/Dendrogram.svelte +18 -6
  47. package/src/lib/components/Donut.svelte +28 -14
  48. package/src/lib/components/DotPlot.svelte +31 -16
  49. package/src/lib/components/Drawer.svelte +28 -21
  50. package/src/lib/components/DualAxisChart.svelte +39 -26
  51. package/src/lib/components/DumbbellChart.svelte +24 -12
  52. package/src/lib/components/DurationInput.svelte +26 -17
  53. package/src/lib/components/EmptyState.svelte +16 -6
  54. package/src/lib/components/ErrorBandChart.svelte +28 -14
  55. package/src/lib/components/ExpandableRow.svelte +19 -6
  56. package/src/lib/components/Field.svelte +26 -12
  57. package/src/lib/components/FileUpload.svelte +29 -20
  58. package/src/lib/components/FilterBuilder.svelte +27 -17
  59. package/src/lib/components/FlameGraph.svelte +14 -7
  60. package/src/lib/components/ForceGraph.svelte +19 -7
  61. package/src/lib/components/FunnelChart.svelte +20 -13
  62. package/src/lib/components/GanttChart.svelte +14 -7
  63. package/src/lib/components/Gauge.svelte +26 -16
  64. package/src/lib/components/GroupedList.svelte +13 -6
  65. package/src/lib/components/HealthBar.svelte +14 -5
  66. package/src/lib/components/HeatMap.svelte +28 -17
  67. package/src/lib/components/HexbinChart.svelte +36 -22
  68. package/src/lib/components/Histogram.svelte +27 -14
  69. package/src/lib/components/HorizonChart.svelte +28 -16
  70. package/src/lib/components/HoverCard.svelte +24 -12
  71. package/src/lib/components/IPInput.svelte +24 -16
  72. package/src/lib/components/IcicleChart.svelte +14 -7
  73. package/src/lib/components/IconButton.svelte +27 -9
  74. package/src/lib/components/InlineEdit.svelte +22 -12
  75. package/src/lib/components/Input.svelte +67 -10
  76. package/src/lib/components/InputGroup.svelte +8 -3
  77. package/src/lib/components/JsonViewer.svelte +17 -6
  78. package/src/lib/components/JsonViewerNode.svelte +36 -18
  79. package/src/lib/components/KVTable.svelte +6 -2
  80. package/src/lib/components/KanbanBoard.svelte +24 -17
  81. package/src/lib/components/Kbd.svelte +8 -4
  82. package/src/lib/components/LineChart.svelte +29 -17
  83. package/src/lib/components/LogViewer.svelte +27 -12
  84. package/src/lib/components/LollipopChart.svelte +20 -8
  85. package/src/lib/components/MACInput.svelte +24 -16
  86. package/src/lib/components/MarimekkoChart.svelte +14 -7
  87. package/src/lib/components/MatrixChart.svelte +19 -9
  88. package/src/lib/components/Menubar.svelte +26 -19
  89. package/src/lib/components/MirroredBarChart.svelte +25 -10
  90. package/src/lib/components/Modal.svelte +46 -33
  91. package/src/lib/components/MultiSelect.svelte +49 -38
  92. package/src/lib/components/NightingaleChart.svelte +17 -10
  93. package/src/lib/components/NotificationPanel.svelte +48 -33
  94. package/src/lib/components/NumberInput.svelte +37 -23
  95. package/src/lib/components/OTPInput.svelte +28 -16
  96. package/src/lib/components/Pagination.svelte +16 -13
  97. package/src/lib/components/ParallelCoordinates.svelte +28 -16
  98. package/src/lib/components/ParetoChart.svelte +38 -24
  99. package/src/lib/components/PasswordInput.svelte +24 -14
  100. package/src/lib/components/PieChart.svelte +21 -13
  101. package/src/lib/components/Pill.svelte +17 -6
  102. package/src/lib/components/PolarHeatmap.svelte +32 -18
  103. package/src/lib/components/Popover.svelte +22 -11
  104. package/src/lib/components/ProgressBar.svelte +17 -8
  105. package/src/lib/components/PunchCard.svelte +31 -20
  106. package/src/lib/components/QuadrantChart.svelte +50 -30
  107. package/src/lib/components/RadarChart.svelte +30 -18
  108. package/src/lib/components/RadialBarChart.svelte +14 -7
  109. package/src/lib/components/RadioGroup.svelte +20 -8
  110. package/src/lib/components/RangeSlider.svelte +30 -18
  111. package/src/lib/components/RankedList.svelte +18 -6
  112. package/src/lib/components/ResizablePanel.svelte +33 -17
  113. package/src/lib/components/RidgelinePlot.svelte +33 -21
  114. package/src/lib/components/RowToggle.svelte +15 -5
  115. package/src/lib/components/SankeyDiagram.svelte +18 -6
  116. package/src/lib/components/ScatterPlot.svelte +34 -21
  117. package/src/lib/components/SearchBox.svelte +27 -5
  118. package/src/lib/components/SegmentedControl.svelte +11 -7
  119. package/src/lib/components/Select.svelte +37 -26
  120. package/src/lib/components/SelectionToolbar.svelte +25 -11
  121. package/src/lib/components/Sidebar.svelte +15 -9
  122. package/src/lib/components/Signal.svelte +6 -2
  123. package/src/lib/components/Skeleton.svelte +20 -10
  124. package/src/lib/components/SkipLink.svelte +9 -4
  125. package/src/lib/components/Slider.svelte +28 -14
  126. package/src/lib/components/SlopeChart.svelte +35 -21
  127. package/src/lib/components/SortHeader.svelte +20 -9
  128. package/src/lib/components/SortableList.svelte +20 -13
  129. package/src/lib/components/Sparkline.svelte +15 -6
  130. package/src/lib/components/SparklineMatrix.svelte +17 -10
  131. package/src/lib/components/Spinner.svelte +7 -3
  132. package/src/lib/components/SplitButton.svelte +28 -17
  133. package/src/lib/components/Spoiler.svelte +22 -11
  134. package/src/lib/components/StackedBarChart.svelte +35 -22
  135. package/src/lib/components/StackedProgress.svelte +21 -9
  136. package/src/lib/components/StarRating.svelte +22 -11
  137. package/src/lib/components/Stat.svelte +32 -10
  138. package/src/lib/components/StatusIndicator.svelte +7 -3
  139. package/src/lib/components/StepChart.svelte +27 -15
  140. package/src/lib/components/Stepper.svelte +10 -6
  141. package/src/lib/components/StreamGraph.svelte +19 -12
  142. package/src/lib/components/StripeChart.svelte +22 -12
  143. package/src/lib/components/SunburstChart.svelte +11 -4
  144. package/src/lib/components/SwitchPortGrid.svelte +13 -7
  145. package/src/lib/components/TabPanel.svelte +9 -4
  146. package/src/lib/components/Tabs.svelte +18 -10
  147. package/src/lib/components/Tag.svelte +9 -5
  148. package/src/lib/components/TagInput.svelte +28 -18
  149. package/src/lib/components/Textarea.svelte +37 -15
  150. package/src/lib/components/ThresholdAreaChart.svelte +34 -21
  151. package/src/lib/components/TimePicker.svelte +25 -17
  152. package/src/lib/components/TimeRange.svelte +19 -14
  153. package/src/lib/components/Timeline.svelte +8 -4
  154. package/src/lib/components/Toast.svelte +2 -2
  155. package/src/lib/components/Toggle.svelte +13 -7
  156. package/src/lib/components/ToggleGroup.svelte +19 -11
  157. package/src/lib/components/Tooltip.svelte +16 -6
  158. package/src/lib/components/Topbar.svelte +24 -10
  159. package/src/lib/components/TransferList.svelte +34 -27
  160. package/src/lib/components/TreeItem.svelte +23 -10
  161. package/src/lib/components/TreeMap.svelte +13 -6
  162. package/src/lib/components/TreeView.svelte +24 -12
  163. package/src/lib/components/UptimeTimeline.svelte +22 -15
  164. package/src/lib/components/VennDiagram.svelte +25 -13
  165. package/src/lib/components/ViolinPlot.svelte +31 -19
  166. package/src/lib/components/VirtualList.svelte +25 -13
  167. package/src/lib/components/WaffleChart.svelte +32 -18
  168. package/src/lib/components/WaterfallChart.svelte +33 -26
  169. package/src/lib/components/WordCloud.svelte +21 -14
  170. package/src/lib/icons/AlarmIcon.svelte +4 -1
  171. package/src/lib/icons/BellIcon.svelte +2 -1
  172. package/src/lib/icons/CaretIcon.svelte +5 -3
  173. package/src/lib/icons/ClientsIcon.svelte +4 -1
  174. package/src/lib/icons/CloseIcon.svelte +2 -1
  175. package/src/lib/icons/DashboardIcon.svelte +4 -1
  176. package/src/lib/icons/DevicesIcon.svelte +4 -1
  177. package/src/lib/icons/DownloadIcon.svelte +2 -1
  178. package/src/lib/icons/HelpIcon.svelte +2 -1
  179. package/src/lib/icons/InfraIcon.svelte +4 -1
  180. package/src/lib/icons/IntegrationsIcon.svelte +4 -1
  181. package/src/lib/icons/LogsIcon.svelte +4 -1
  182. package/src/lib/icons/PlusIcon.svelte +2 -1
  183. package/src/lib/icons/PortsIcon.svelte +4 -1
  184. package/src/lib/icons/SearchIcon.svelte +6 -4
  185. package/src/lib/icons/SecurityIcon.svelte +4 -1
  186. package/src/lib/icons/SettingsIcon.svelte +4 -1
  187. package/src/lib/icons/TopologyIcon.svelte +4 -1
  188. package/src/lib/icons/UpdatesIcon.svelte +2 -1
  189. package/src/lib/icons/VpnIcon.svelte +4 -1
  190. package/src/lib/icons/WifiIcon.svelte +4 -1
  191. package/src/lib/icons/WirelessIcon.svelte +4 -1
@@ -1,4 +1,4 @@
1
- <script lang="ts">
1
+ <script module lang="ts">
2
2
  export interface CandlestickBar {
3
3
  label: string;
4
4
  open: number;
@@ -6,14 +6,29 @@
6
6
  high: number;
7
7
  low: number;
8
8
  }
9
+ </script>
10
+
11
+ <script lang="ts">
12
+
13
+ interface Props {
14
+ bars?: CandlestickBar[];
15
+ yRange?: [number, number] | undefined;
16
+ height?: number;
17
+ unit?: string;
18
+ upColor?: string;
19
+ downColor?: string;
20
+ ariaLabel?: string;
21
+ }
9
22
 
10
- export let bars: CandlestickBar[] = [];
11
- export let yRange: [number, number] | undefined = undefined;
12
- export let height = 180;
13
- export let unit = '';
14
- export let upColor = '#00C875';
15
- export let downColor = '#FF7B7B';
16
- export let ariaLabel = 'Candlestick chart';
23
+ let {
24
+ bars = [],
25
+ yRange = undefined,
26
+ height = 180,
27
+ unit = '',
28
+ upColor = '#00C875',
29
+ downColor = '#FF7B7B',
30
+ ariaLabel = 'Candlestick chart'
31
+ }: Props = $props();
17
32
 
18
33
  const VW = 340;
19
34
  const PAD_L = 28;
@@ -22,14 +37,14 @@
22
37
  const PAD_B = 20;
23
38
  const PLOT_W = VW - PAD_L - PAD_R;
24
39
 
25
- $: n = bars.length;
26
- $: PLOT_H = height - PAD_T - PAD_B;
27
- $: allVals = bars.flatMap((b) => [b.low, b.high]);
28
- $: minV = yRange ? yRange[0] : allVals.length ? Math.min(...allVals) : 0;
29
- $: maxV = yRange ? yRange[1] : allVals.length ? Math.max(...allVals) : 1;
30
- $: vRange = maxV - minV || 1;
31
- $: yTicks = [minV, (minV + maxV) / 2, maxV];
32
- $: candleW = Math.max(4, (PLOT_W / (n || 1)) * 0.5);
40
+ let n = $derived(bars.length);
41
+ let PLOT_H = $derived(height - PAD_T - PAD_B);
42
+ let allVals = $derived(bars.flatMap((b) => [b.low, b.high]));
43
+ let minV = $derived(yRange ? yRange[0] : allVals.length ? Math.min(...allVals) : 0);
44
+ let maxV = $derived(yRange ? yRange[1] : allVals.length ? Math.max(...allVals) : 1);
45
+ let vRange = $derived(maxV - minV || 1);
46
+ let yTicks = $derived([minV, (minV + maxV) / 2, maxV]);
47
+ let candleW = $derived(Math.max(4, (PLOT_W / (n || 1)) * 0.5));
33
48
 
34
49
  function tx(i: number): number {
35
50
  return PAD_L + ((i + 0.5) / (n || 1)) * PLOT_W;
@@ -1,11 +1,21 @@
1
1
  <script lang="ts">
2
- export let span: number | undefined = undefined;
3
- let className = '';
4
- export { className as class };
5
- export let style: string = '';
6
- $: spanStyle = span !== undefined ? `grid-column: span ${span};` : '';
2
+
3
+ interface Props {
4
+ span?: number | undefined;
5
+ class?: string;
6
+ style?: string;
7
+ children?: import('svelte').Snippet;
8
+ }
9
+
10
+ let {
11
+ span = undefined,
12
+ class: className = '',
13
+ style = '',
14
+ children
15
+ }: Props = $props();
16
+ let spanStyle = $derived(span !== undefined ? `grid-column: span ${span};` : '');
7
17
  </script>
8
18
 
9
19
  <div class="card {className}" style="{spanStyle} {style}">
10
- <slot />
20
+ {@render children?.()}
11
21
  </div>
@@ -1,11 +1,14 @@
1
1
  <script lang="ts">
2
- export let slides: Array<{ id: string; title: string; description?: string; color?: string }> =
3
- [];
4
- export let label: string;
5
- let klass = '';
6
- export { klass as class };
2
+ interface Props {
3
+ slides?: Array<{ id: string; title: string; description?: string; color?: string }>;
4
+ label: string;
5
+ class?: string;
6
+ }
7
+
8
+ let { slides = [], label, class: klass = '' }: Props = $props();
9
+
7
10
 
8
- let index = 0;
11
+ let index = $state(0);
9
12
 
10
13
  function prev() {
11
14
  index = (index - 1 + slides.length) % slides.length;
@@ -30,7 +33,7 @@
30
33
  aria-hidden={i !== index ? true : undefined}
31
34
  >
32
35
  {#if slide.color}
33
- <div class="carousel-slide-accent" style="background:{slide.color}" aria-hidden="true" />
36
+ <div class="carousel-slide-accent" style="background:{slide.color}" aria-hidden="true"></div>
34
37
  {/if}
35
38
  <div class="carousel-slide-body">
36
39
  <div class="carousel-slide-title">{slide.title}</div>
@@ -42,7 +45,7 @@
42
45
  {/each}
43
46
  </div>
44
47
  <div class="carousel-controls">
45
- <button type="button" class="carousel-btn" aria-label="Previous slide" on:click={prev}
48
+ <button type="button" class="carousel-btn" aria-label="Previous slide" onclick={prev}
46
49
  >&#8249;</button
47
50
  >
48
51
  <div role="tablist" aria-label="Choose slide to display" class="carousel-indicators">
@@ -53,11 +56,11 @@
53
56
  aria-selected={i === index}
54
57
  aria-label="Slide {i + 1}: {slide.title}"
55
58
  class="carousel-dot{i === index ? ' is-active' : ''}"
56
- on:click={() => (index = i)}
57
- />
59
+ onclick={() => (index = i)}
60
+ ></button>
58
61
  {/each}
59
62
  </div>
60
- <button type="button" class="carousel-btn" aria-label="Next slide" on:click={next}
63
+ <button type="button" class="carousel-btn" aria-label="Next slide" onclick={next}
61
64
  >&#8250;</button
62
65
  >
63
66
  </div>
@@ -1,22 +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
- export let checked: boolean = false;
7
- export let indeterminate: boolean = false;
8
- export let label: string | undefined = undefined;
9
- export let id: string | undefined = undefined;
10
- export let disabled: boolean = false;
6
+ interface Props {
7
+ checked?: boolean;
8
+ indeterminate?: boolean;
9
+ label?: string | undefined;
10
+ id?: string | undefined;
11
+ disabled?: boolean;
12
+ onchange?: (event: Event) => void;
13
+ [key: string]: unknown;
14
+ }
15
+
16
+ // svelte-ignore state_referenced_locally
17
+ // svelte-ignore state_referenced_locally
18
+ let {
19
+ checked = false,
20
+ indeterminate = false,
21
+ label = undefined,
22
+ id = undefined,
23
+ disabled = false,
24
+ onchange,
25
+ ...rest
26
+ }: Props = $props();
11
27
 
12
28
  const uid = `dash-ui-cb-${++counter}`;
13
- $: inputId = id ?? uid;
29
+ let inputId = $derived(id ?? uid);
14
30
 
15
- let el: HTMLInputElement;
16
- $: if (el) {
17
- el.checked = checked;
18
- el.indeterminate = indeterminate;
19
- }
31
+ let el = $state<HTMLInputElement | undefined>(undefined);
32
+
33
+ // Sync the imperative DOM properties to the reactive props. `$effect` reads
34
+ // both `checked` and `indeterminate` so it re-runs whenever either flips.
35
+ $effect(() => {
36
+ if (el) {
37
+ el.checked = checked;
38
+ el.indeterminate = indeterminate;
39
+ }
40
+ });
20
41
  </script>
21
42
 
22
43
  {#if label}
@@ -27,8 +48,8 @@
27
48
  id={inputId}
28
49
  {disabled}
29
50
  class="checkbox"
30
- on:change
31
- {...$$restProps}
51
+ {onchange}
52
+ {...rest}
32
53
  />
33
54
  <span>{label}</span>
34
55
  </label>
@@ -39,7 +60,7 @@
39
60
  id={inputId}
40
61
  {disabled}
41
62
  class="checkbox"
42
- on:change
43
- {...$$restProps}
63
+ {onchange}
64
+ {...rest}
44
65
  />
45
66
  {/if}
@@ -1,9 +1,16 @@
1
- <script lang="ts">
1
+ <script module lang="ts">
2
2
  export interface ChordNode { label: string; color?: string; }
3
+ </script>
4
+
5
+ <script lang="ts">
6
+
7
+ interface Props {
8
+ nodes: ChordNode[];
9
+ matrix: number[][];
10
+ ariaLabel?: string;
11
+ }
3
12
 
4
- export let nodes: ChordNode[];
5
- export let matrix: number[][];
6
- export let ariaLabel: string = 'Chord diagram';
13
+ let { nodes, matrix, ariaLabel = 'Chord diagram' }: Props = $props();
7
14
 
8
15
  const PALETTE = ['#006FFF', '#00C875', '#A78BFA', '#F5A623', '#50B8E7', '#F04949'];
9
16
  const CX = 160, CY = 160, R_IN = 108, R_ARC = 125, R_LBL = 138, PAD = 0.04;
@@ -27,7 +34,7 @@
27
34
  type Chord = { d: string; fill: string };
28
35
  type Label = { x: number; y: number; anchor: string; text: string };
29
36
 
30
- $: ({ arcs, chords, labels } = (() => {
37
+ let { arcs, chords, labels } = $derived((() => {
31
38
  const n = nodes.length;
32
39
  const totals = nodes.map((_, i) => matrix[i].reduce((s, v) => s + v, 0));
33
40
  const grand = totals.reduce((s, v) => s + v, 0);
@@ -1,14 +1,21 @@
1
- <script lang="ts">
1
+ <script module lang="ts">
2
2
  export interface CirclePackItem {
3
3
  id: string;
4
4
  label: string;
5
5
  value: number;
6
6
  color?: string;
7
7
  }
8
+ </script>
9
+
10
+ <script lang="ts">
11
+
12
+ interface Props {
13
+ items: CirclePackItem[];
14
+ height?: number;
15
+ ariaLabel?: string;
16
+ }
8
17
 
9
- export let items: CirclePackItem[];
10
- export let height = 200;
11
- export let ariaLabel = 'Circle packing chart';
18
+ let { items, height = 200, ariaLabel = 'Circle packing chart' }: Props = $props();
12
19
 
13
20
  const PALETTE = ['#006FFF', '#00C875', '#F5A623', '#A78BFA', '#FF7B7B', '#00C8C8', '#FB923C', '#4797FF'];
14
21
  const VW = 360;
@@ -64,7 +71,7 @@
64
71
  return pos.map(({ cx, cy }) => ({ cx, cy }));
65
72
  }
66
73
 
67
- $: layout = (() => {
74
+ let layout = $derived((() => {
68
75
  if (!items.length) return null;
69
76
  const sorted = [...items].sort((a, b) => b.value - a.value);
70
77
  const maxV = sorted[0].value;
@@ -91,7 +98,7 @@
91
98
  const color = item.color ?? PALETTE[i % PALETTE.length];
92
99
  return { id: item.id, label: item.label, value: item.value, cx, cy, r, color };
93
100
  });
94
- })();
101
+ })());
95
102
  </script>
96
103
 
97
104
  {#if layout}
@@ -1,12 +1,21 @@
1
1
  <script lang="ts">
2
2
  import { onDestroy } from 'svelte';
3
- export let code: string = '';
4
- export let label: string = 'Code block';
5
- export let language: string = '';
6
- let className = '';
7
- export { className as class };
3
+ interface Props {
4
+ code?: string;
5
+ label?: string;
6
+ language?: string;
7
+ class?: string;
8
+ }
9
+
10
+ let {
11
+ code = '',
12
+ label = 'Code block',
13
+ language = '',
14
+ class: className = ''
15
+ }: Props = $props();
16
+
8
17
 
9
- let copied = false;
18
+ let copied = $state(false);
10
19
  let timer: ReturnType<typeof setTimeout> | null = null;
11
20
 
12
21
  function handleCopy() {
@@ -31,7 +40,7 @@
31
40
  type="button"
32
41
  class="copy-btn{copied ? ' copy-btn--done' : ''}"
33
42
  aria-label={copied ? 'Copied!' : 'Copy code'}
34
- on:click={handleCopy}
43
+ onclick={handleCopy}
35
44
  >
36
45
  {#if copied}
37
46
  <svg viewBox="0 0 14 14" width="14" height="14" fill="none" aria-hidden="true" focusable="false">
@@ -1,4 +1,4 @@
1
- <script context="module" lang="ts">
1
+ <script module lang="ts">
2
2
  let counter = 0;
3
3
  export interface ColorSwatchDef {
4
4
  value: string;
@@ -20,12 +20,23 @@
20
20
  </script>
21
21
 
22
22
  <script lang="ts">
23
- export let label: string = 'Colour';
24
- export let srOnlyLabel: boolean = false;
25
- export let value: string = COLOR_SWATCHES[0].value;
26
- export let swatches: ColorSwatchDef[] = COLOR_SWATCHES;
27
- export let disabled: boolean = false;
28
- export let onChange: ((v: string) => void) | undefined = undefined;
23
+ interface Props {
24
+ label?: string;
25
+ srOnlyLabel?: boolean;
26
+ value?: string;
27
+ swatches?: ColorSwatchDef[];
28
+ disabled?: boolean;
29
+ onChange?: ((v: string) => void) | undefined;
30
+ }
31
+
32
+ let {
33
+ label = 'Colour',
34
+ srOnlyLabel = false,
35
+ value = $bindable(COLOR_SWATCHES[0].value),
36
+ swatches = COLOR_SWATCHES,
37
+ disabled = false,
38
+ onChange = undefined
39
+ }: Props = $props();
29
40
 
30
41
  const groupId = `dash-ui-cp-${++counter}`;
31
42
 
@@ -48,7 +59,7 @@
48
59
  onChange?.(value);
49
60
  }
50
61
 
51
- $: hasMatch = swatches.some((s) => s.value === value);
62
+ let hasMatch = $derived(swatches.some((s) => s.value === value));
52
63
  </script>
53
64
 
54
65
  <div class="color-picker{disabled ? ' color-picker--disabled' : ''}">
@@ -60,7 +71,7 @@
60
71
  aria-labelledby="{groupId}-label"
61
72
  class="color-picker__grid"
62
73
  tabindex="-1"
63
- on:keydown={handleKeyDown}
74
+ onkeydown={handleKeyDown}
64
75
  >
65
76
  {#each swatches as sw, i}
66
77
  {@const checked = sw.value === value}
@@ -75,7 +86,7 @@
75
86
  class="sr-only"
76
87
  tabindex={tabIdx}
77
88
  aria-label={sw.label}
78
- on:change={() => {
89
+ onchange={() => {
79
90
  value = sw.value;
80
91
  onChange?.(value);
81
92
  }}
@@ -84,7 +95,7 @@
84
95
  class="color-picker__circle{checked ? ' color-picker__circle--selected' : ''}"
85
96
  style="background:{sw.color}"
86
97
  aria-hidden="true"
87
- />
98
+ ></span>
88
99
  </label>
89
100
  {/each}
90
101
  </div>
@@ -1,19 +1,26 @@
1
- <script lang="ts">
2
- import { onMount } from 'svelte';
3
-
1
+ <script module lang="ts">
4
2
  export interface ColumnDef {
5
3
  key: string;
6
4
  label: string;
7
5
  required?: boolean;
8
6
  }
7
+ </script>
8
+
9
+ <script lang="ts">
10
+ import { onMount } from 'svelte';
11
+
12
+
13
+ interface Props {
14
+ columns?: ColumnDef[];
15
+ visible?: Set<string>;
16
+ onChange?: (visible: Set<string>) => void;
17
+ }
9
18
 
10
- export let columns: ColumnDef[] = [];
11
- export let visible: Set<string> = new Set();
12
- export let onChange: (visible: Set<string>) => void = () => {};
19
+ let { columns = [], visible = $bindable(new Set()), onChange = () => {} }: Props = $props();
13
20
 
14
- let open = false;
15
- let btnEl: HTMLButtonElement;
16
- let panelEl: HTMLDivElement;
21
+ let open = $state(false);
22
+ let btnEl = $state<HTMLButtonElement | undefined>(undefined);
23
+ let panelEl = $state<HTMLDivElement | undefined>(undefined);
17
24
  const panelId = `col-toggle-${Math.random().toString(36).slice(2)}`;
18
25
 
19
26
  function close() {
@@ -57,7 +64,7 @@
57
64
  aria-haspopup="dialog"
58
65
  aria-expanded={open}
59
66
  aria-controls={panelId}
60
- on:click={() => (open = !open)}
67
+ onclick={() => (open = !open)}
61
68
  >
62
69
  <svg viewBox="0 0 14 14" width="14" height="14" fill="none" aria-hidden="true" focusable="false">
63
70
  <rect x="1" y="2" width="3" height="10" rx="1" stroke="currentColor" stroke-width="1.3" />
@@ -84,7 +91,7 @@
84
91
  class="col-toggle__check"
85
92
  checked={visible.has(col.key)}
86
93
  disabled={col.required}
87
- on:change={() => { if (!col.required) toggle(col.key); }}
94
+ onchange={() => { if (!col.required) toggle(col.key); }}
88
95
  />
89
96
  <span>{col.label}</span>
90
97
  </label>
@@ -1,43 +1,54 @@
1
- <script context="module" lang="ts">
1
+ <script module lang="ts">
2
2
  let counter = 0;
3
3
  export interface ComboboxOption { value: string; label: string; }
4
4
  </script>
5
5
 
6
6
  <script lang="ts">
7
- import { createEventDispatcher, onMount, onDestroy } from 'svelte';
7
+ import { onMount, onDestroy } from 'svelte';
8
+
9
+ interface Props {
10
+ options?: ComboboxOption[];
11
+ value?: string | undefined;
12
+ label?: string | undefined;
13
+ placeholder?: string;
14
+ id?: string | undefined;
15
+ disabled?: boolean;
16
+ class?: string;
17
+ onchange?: (payload: string) => void;
18
+ }
8
19
 
9
- export let options: ComboboxOption[] = [];
10
- export let value: string | undefined = undefined;
11
- export let label: string | undefined = undefined;
12
- export let placeholder: string = 'Search…';
13
- export let id: string | undefined = undefined;
14
- export let disabled: boolean = false;
15
- let className = '';
16
- export { className as class };
20
+ let {
21
+ options = [],
22
+ value = undefined,
23
+ label = undefined,
24
+ placeholder = 'Search…',
25
+ id = undefined,
26
+ disabled = false,
27
+ class: className = '',
28
+ onchange,
29
+ }: Props = $props();
30
+
17
31
 
18
32
  const uid = `dash-ui-cb-${++counter}`;
19
- $: inputId = id ?? uid;
20
- $: listboxId = `${inputId}-lb`;
21
-
22
- const dispatch = createEventDispatcher<{ change: string }>();
23
-
24
- let open = false;
25
- let query = '';
26
- let activeIdx = -1;
27
- let inputEl: HTMLInputElement;
28
- let wrapperEl: HTMLDivElement;
33
+ let inputId = $derived(id ?? uid);
34
+ let listboxId = $derived(`${inputId}-lb`);
35
+ let open = $state(false);
36
+ let query = $state('');
37
+ let activeIdx = $state(-1);
38
+ let inputEl = $state<HTMLInputElement | undefined>(undefined);
39
+ let wrapperEl = $state<HTMLDivElement | undefined>(undefined);
29
40
 
30
- $: selectedOption = options.find((o) => o.value === value);
41
+ let selectedOption = $derived(options.find((o) => o.value === value));
31
42
 
32
- $: filtered = query.trim() === ''
43
+ let filtered = $derived(query.trim() === ''
33
44
  ? options
34
- : options.filter((o) => o.label.toLowerCase().includes(query.toLowerCase()));
45
+ : options.filter((o) => o.label.toLowerCase().includes(query.toLowerCase())));
35
46
 
36
- $: activeOptionId = activeIdx >= 0 && filtered[activeIdx]
47
+ let activeOptionId = $derived(activeIdx >= 0 && filtered[activeIdx]
37
48
  ? `${listboxId}-opt-${activeIdx}`
38
- : undefined;
49
+ : undefined);
39
50
 
40
- $: displayValue = open ? query : (selectedOption?.label ?? '');
51
+ let displayValue = $derived(open ? query : (selectedOption?.label ?? ''));
41
52
 
42
53
  function openList() {
43
54
  if (disabled) return;
@@ -47,7 +58,7 @@
47
58
  }
48
59
 
49
60
  function pick(opt: ComboboxOption) {
50
- dispatch('change', opt.value);
61
+ onchange?.(opt.value);
51
62
  open = false;
52
63
  query = '';
53
64
  inputEl?.focus();
@@ -99,9 +110,9 @@
99
110
  {disabled}
100
111
  {placeholder}
101
112
  value={displayValue}
102
- on:input={onInputChange}
103
- on:focus={openList}
104
- on:keydown={onKeyDown}
113
+ oninput={onInputChange}
114
+ onfocus={openList}
115
+ onkeydown={onKeyDown}
105
116
  class="combobox-input"
106
117
  />
107
118
  <button
@@ -109,7 +120,7 @@
109
120
  tabindex="-1"
110
121
  aria-hidden="true"
111
122
  class="combobox-chevron-btn"
112
- on:click={() => { if (open) { open = false; query = ''; } else { inputEl?.focus(); openList(); } }}
123
+ onclick={() => { if (open) { open = false; query = ''; } else { inputEl?.focus(); openList(); } }}
113
124
  >
114
125
  <svg class="select-chevron{open ? ' combobox-chevron-open' : ''}" viewBox="0 0 16 16" aria-hidden="true" focusable="false">
115
126
  <path d="M4 6l4 4 4-4" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" fill="none" />
@@ -128,8 +139,8 @@
128
139
  aria-selected={opt.value === value}
129
140
  data-active={idx === activeIdx ? 'true' : undefined}
130
141
  class="select-option"
131
- on:mousedown|preventDefault={() => pick(opt)}
132
- on:mouseenter={() => { activeIdx = idx; }}
142
+ onmousedown={(e) => { e.preventDefault(); (() => pick(opt))(); }}
143
+ onmouseenter={() => { activeIdx = idx; }}
133
144
  >{opt.label}</li>
134
145
  {/each}
135
146
  {/if}