@w5-ui/svelte 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +4 -4
- package/src/lib/components/Accordion.svelte +9 -1
- package/src/lib/components/AccordionItem.svelte +11 -5
- package/src/lib/components/ActionMenu.svelte +19 -14
- package/src/lib/components/ActivityFeed.svelte +24 -11
- package/src/lib/components/Alert.svelte +9 -4
- package/src/lib/components/AnnotatedTimeSeries.svelte +40 -26
- package/src/lib/components/ArcDiagram.svelte +20 -8
- package/src/lib/components/AreaChart.svelte +26 -14
- package/src/lib/components/Avatar.svelte +20 -8
- package/src/lib/components/AvatarGroup.svelte +16 -7
- package/src/lib/components/Badge.svelte +24 -11
- package/src/lib/components/Banner.svelte +20 -9
- package/src/lib/components/BarChart.svelte +29 -17
- package/src/lib/components/BeeswarmChart.svelte +32 -18
- package/src/lib/components/BoxPlot.svelte +27 -15
- package/src/lib/components/Breadcrumb.svelte +12 -7
- package/src/lib/components/BubbleChart.svelte +39 -25
- package/src/lib/components/BulletChart.svelte +16 -9
- package/src/lib/components/BumpChart.svelte +15 -8
- package/src/lib/components/Button.svelte +32 -11
- package/src/lib/components/CIDRInput.svelte +27 -19
- package/src/lib/components/CalendarHeatmap.svelte +12 -5
- package/src/lib/components/Callout.svelte +9 -4
- package/src/lib/components/CandlestickChart.svelte +31 -16
- package/src/lib/components/Card.svelte +16 -6
- package/src/lib/components/Carousel.svelte +14 -11
- package/src/lib/components/Checkbox.svelte +37 -16
- package/src/lib/components/ChordDiagram.svelte +12 -5
- package/src/lib/components/CirclePacking.svelte +13 -6
- package/src/lib/components/CodeBlock.svelte +16 -7
- package/src/lib/components/ColorPicker.svelte +22 -11
- package/src/lib/components/ColumnToggle.svelte +18 -11
- package/src/lib/components/Combobox.svelte +44 -33
- package/src/lib/components/CommandPalette.svelte +41 -31
- package/src/lib/components/ConfirmDialog.svelte +66 -35
- package/src/lib/components/ContextMenu.svelte +46 -33
- package/src/lib/components/ContextualHelp.svelte +13 -9
- package/src/lib/components/ContourPlot.svelte +43 -28
- package/src/lib/components/CopyButton.svelte +8 -4
- package/src/lib/components/CorrelationMatrix.svelte +16 -7
- package/src/lib/components/CountUp.svelte +30 -13
- package/src/lib/components/CumulativeDistribution.svelte +32 -19
- package/src/lib/components/DatePicker.svelte +28 -21
- package/src/lib/components/DateRangePicker.svelte +39 -32
- package/src/lib/components/Dendrogram.svelte +18 -6
- package/src/lib/components/Donut.svelte +28 -14
- package/src/lib/components/DotPlot.svelte +31 -16
- package/src/lib/components/Drawer.svelte +28 -21
- package/src/lib/components/DualAxisChart.svelte +39 -26
- package/src/lib/components/DumbbellChart.svelte +24 -12
- package/src/lib/components/DurationInput.svelte +26 -17
- package/src/lib/components/EmptyState.svelte +16 -6
- package/src/lib/components/ErrorBandChart.svelte +28 -14
- package/src/lib/components/ExpandableRow.svelte +19 -6
- package/src/lib/components/Field.svelte +26 -12
- package/src/lib/components/FileUpload.svelte +29 -20
- package/src/lib/components/FilterBuilder.svelte +27 -17
- package/src/lib/components/FlameGraph.svelte +14 -7
- package/src/lib/components/ForceGraph.svelte +19 -7
- package/src/lib/components/FunnelChart.svelte +20 -13
- package/src/lib/components/GanttChart.svelte +14 -7
- package/src/lib/components/Gauge.svelte +26 -16
- package/src/lib/components/GroupedList.svelte +13 -6
- package/src/lib/components/HealthBar.svelte +14 -5
- package/src/lib/components/HeatMap.svelte +28 -17
- package/src/lib/components/HexbinChart.svelte +36 -22
- package/src/lib/components/Histogram.svelte +27 -14
- package/src/lib/components/HorizonChart.svelte +28 -16
- package/src/lib/components/HoverCard.svelte +24 -12
- package/src/lib/components/IPInput.svelte +24 -16
- package/src/lib/components/IcicleChart.svelte +14 -7
- package/src/lib/components/IconButton.svelte +27 -9
- package/src/lib/components/InlineEdit.svelte +22 -12
- package/src/lib/components/Input.svelte +67 -10
- package/src/lib/components/InputGroup.svelte +8 -3
- package/src/lib/components/JsonViewer.svelte +17 -6
- package/src/lib/components/JsonViewerNode.svelte +36 -18
- package/src/lib/components/KVTable.svelte +6 -2
- package/src/lib/components/KanbanBoard.svelte +24 -17
- package/src/lib/components/Kbd.svelte +8 -4
- package/src/lib/components/LineChart.svelte +29 -17
- package/src/lib/components/LogViewer.svelte +27 -12
- package/src/lib/components/LollipopChart.svelte +20 -8
- package/src/lib/components/MACInput.svelte +24 -16
- package/src/lib/components/MarimekkoChart.svelte +14 -7
- package/src/lib/components/MatrixChart.svelte +19 -9
- package/src/lib/components/Menubar.svelte +26 -19
- package/src/lib/components/MirroredBarChart.svelte +25 -10
- package/src/lib/components/Modal.svelte +46 -33
- package/src/lib/components/MultiSelect.svelte +49 -38
- package/src/lib/components/NightingaleChart.svelte +17 -10
- package/src/lib/components/NotificationPanel.svelte +48 -33
- package/src/lib/components/NumberInput.svelte +37 -23
- package/src/lib/components/OTPInput.svelte +28 -16
- package/src/lib/components/Pagination.svelte +16 -13
- package/src/lib/components/ParallelCoordinates.svelte +28 -16
- package/src/lib/components/ParetoChart.svelte +38 -24
- package/src/lib/components/PasswordInput.svelte +24 -14
- package/src/lib/components/PieChart.svelte +21 -13
- package/src/lib/components/Pill.svelte +17 -6
- package/src/lib/components/PolarHeatmap.svelte +32 -18
- package/src/lib/components/Popover.svelte +22 -11
- package/src/lib/components/ProgressBar.svelte +17 -8
- package/src/lib/components/PunchCard.svelte +31 -20
- package/src/lib/components/QuadrantChart.svelte +50 -30
- package/src/lib/components/RadarChart.svelte +30 -18
- package/src/lib/components/RadialBarChart.svelte +14 -7
- package/src/lib/components/RadioGroup.svelte +20 -8
- package/src/lib/components/RangeSlider.svelte +30 -18
- package/src/lib/components/RankedList.svelte +18 -6
- package/src/lib/components/ResizablePanel.svelte +33 -17
- package/src/lib/components/RidgelinePlot.svelte +33 -21
- package/src/lib/components/RowToggle.svelte +15 -5
- package/src/lib/components/SankeyDiagram.svelte +18 -6
- package/src/lib/components/ScatterPlot.svelte +34 -21
- package/src/lib/components/SearchBox.svelte +27 -5
- package/src/lib/components/SegmentedControl.svelte +11 -7
- package/src/lib/components/Select.svelte +37 -26
- package/src/lib/components/SelectionToolbar.svelte +25 -11
- package/src/lib/components/Sidebar.svelte +15 -9
- package/src/lib/components/Signal.svelte +6 -2
- package/src/lib/components/Skeleton.svelte +20 -10
- package/src/lib/components/SkipLink.svelte +9 -4
- package/src/lib/components/Slider.svelte +28 -14
- package/src/lib/components/SlopeChart.svelte +35 -21
- package/src/lib/components/SortHeader.svelte +20 -9
- package/src/lib/components/SortableList.svelte +20 -13
- package/src/lib/components/Sparkline.svelte +15 -6
- package/src/lib/components/SparklineMatrix.svelte +17 -10
- package/src/lib/components/Spinner.svelte +7 -3
- package/src/lib/components/SplitButton.svelte +28 -17
- package/src/lib/components/Spoiler.svelte +22 -11
- package/src/lib/components/StackedBarChart.svelte +35 -22
- package/src/lib/components/StackedProgress.svelte +21 -9
- package/src/lib/components/StarRating.svelte +22 -11
- package/src/lib/components/Stat.svelte +32 -10
- package/src/lib/components/StatusIndicator.svelte +7 -3
- package/src/lib/components/StepChart.svelte +27 -15
- package/src/lib/components/Stepper.svelte +10 -6
- package/src/lib/components/StreamGraph.svelte +19 -12
- package/src/lib/components/StripeChart.svelte +22 -12
- package/src/lib/components/SunburstChart.svelte +11 -4
- package/src/lib/components/SwitchPortGrid.svelte +13 -7
- package/src/lib/components/TabPanel.svelte +9 -4
- package/src/lib/components/Tabs.svelte +18 -10
- package/src/lib/components/Tag.svelte +9 -5
- package/src/lib/components/TagInput.svelte +28 -18
- package/src/lib/components/Textarea.svelte +37 -15
- package/src/lib/components/ThresholdAreaChart.svelte +34 -21
- package/src/lib/components/TimePicker.svelte +25 -17
- package/src/lib/components/TimeRange.svelte +19 -14
- package/src/lib/components/Timeline.svelte +8 -4
- package/src/lib/components/Toast.svelte +2 -2
- package/src/lib/components/Toggle.svelte +13 -7
- package/src/lib/components/ToggleGroup.svelte +19 -11
- package/src/lib/components/Tooltip.svelte +16 -6
- package/src/lib/components/Topbar.svelte +24 -10
- package/src/lib/components/TransferList.svelte +34 -27
- package/src/lib/components/TreeItem.svelte +23 -10
- package/src/lib/components/TreeMap.svelte +13 -6
- package/src/lib/components/TreeView.svelte +24 -12
- package/src/lib/components/UptimeTimeline.svelte +22 -15
- package/src/lib/components/VennDiagram.svelte +25 -13
- package/src/lib/components/ViolinPlot.svelte +31 -19
- package/src/lib/components/VirtualList.svelte +25 -13
- package/src/lib/components/WaffleChart.svelte +32 -18
- package/src/lib/components/WaterfallChart.svelte +33 -26
- package/src/lib/components/WordCloud.svelte +21 -14
- package/src/lib/icons/AlarmIcon.svelte +4 -1
- package/src/lib/icons/BellIcon.svelte +2 -1
- package/src/lib/icons/CaretIcon.svelte +5 -3
- package/src/lib/icons/ClientsIcon.svelte +4 -1
- package/src/lib/icons/CloseIcon.svelte +2 -1
- package/src/lib/icons/DashboardIcon.svelte +4 -1
- package/src/lib/icons/DevicesIcon.svelte +4 -1
- package/src/lib/icons/DownloadIcon.svelte +2 -1
- package/src/lib/icons/HelpIcon.svelte +2 -1
- package/src/lib/icons/InfraIcon.svelte +4 -1
- package/src/lib/icons/IntegrationsIcon.svelte +4 -1
- package/src/lib/icons/LogsIcon.svelte +4 -1
- package/src/lib/icons/PlusIcon.svelte +2 -1
- package/src/lib/icons/PortsIcon.svelte +4 -1
- package/src/lib/icons/SearchIcon.svelte +6 -4
- package/src/lib/icons/SecurityIcon.svelte +4 -1
- package/src/lib/icons/SettingsIcon.svelte +4 -1
- package/src/lib/icons/TopologyIcon.svelte +4 -1
- package/src/lib/icons/UpdatesIcon.svelte +2 -1
- package/src/lib/icons/VpnIcon.svelte +4 -1
- package/src/lib/icons/WifiIcon.svelte +4 -1
- 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
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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
|
-
|
|
20
|
+
{@render children?.()}
|
|
11
21
|
</div>
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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"
|
|
48
|
+
<button type="button" class="carousel-btn" aria-label="Previous slide" onclick={prev}
|
|
46
49
|
>‹</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
|
-
|
|
57
|
-
|
|
59
|
+
onclick={() => (index = i)}
|
|
60
|
+
></button>
|
|
58
61
|
{/each}
|
|
59
62
|
</div>
|
|
60
|
-
<button type="button" class="carousel-btn" aria-label="Next slide"
|
|
63
|
+
<button type="button" class="carousel-btn" aria-label="Next slide" onclick={next}
|
|
61
64
|
>›</button
|
|
62
65
|
>
|
|
63
66
|
</div>
|
|
@@ -1,22 +1,43 @@
|
|
|
1
|
-
<script
|
|
1
|
+
<script module lang="ts">
|
|
2
2
|
let counter = 0;
|
|
3
3
|
</script>
|
|
4
4
|
|
|
5
5
|
<script lang="ts">
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
-
|
|
29
|
+
let inputId = $derived(id ?? uid);
|
|
14
30
|
|
|
15
|
-
let el
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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
|
-
|
|
31
|
-
{
|
|
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
|
-
|
|
43
|
-
{
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
16
|
-
let panelEl
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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 {
|
|
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
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
let
|
|
25
|
-
let
|
|
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
|
-
|
|
41
|
+
let selectedOption = $derived(options.find((o) => o.value === value));
|
|
31
42
|
|
|
32
|
-
|
|
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
|
-
|
|
47
|
+
let activeOptionId = $derived(activeIdx >= 0 && filtered[activeIdx]
|
|
37
48
|
? `${listboxId}-opt-${activeIdx}`
|
|
38
|
-
: undefined;
|
|
49
|
+
: undefined);
|
|
39
50
|
|
|
40
|
-
|
|
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
|
-
|
|
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
|
-
|
|
103
|
-
|
|
104
|
-
|
|
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
|
-
|
|
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
|
-
|
|
132
|
-
|
|
142
|
+
onmousedown={(e) => { e.preventDefault(); (() => pick(opt))(); }}
|
|
143
|
+
onmouseenter={() => { activeIdx = idx; }}
|
|
133
144
|
>{opt.label}</li>
|
|
134
145
|
{/each}
|
|
135
146
|
{/if}
|