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