@sentropic/design-system-svelte 0.15.0 → 0.17.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/dist/ComboChart.svelte +620 -0
- package/dist/ComboChart.svelte.d.ts +28 -0
- package/dist/ComboChart.svelte.d.ts.map +1 -0
- package/dist/ForceGraph.svelte +239 -2
- package/dist/ForceGraph.svelte.d.ts +32 -0
- package/dist/ForceGraph.svelte.d.ts.map +1 -1
- package/dist/FunnelChart.svelte +358 -0
- package/dist/FunnelChart.svelte.d.ts +21 -0
- package/dist/FunnelChart.svelte.d.ts.map +1 -0
- package/dist/GaugeChart.svelte +300 -0
- package/dist/GaugeChart.svelte.d.ts +36 -0
- package/dist/GaugeChart.svelte.d.ts.map +1 -0
- package/dist/KpiCard.svelte +318 -0
- package/dist/KpiCard.svelte.d.ts +36 -0
- package/dist/KpiCard.svelte.d.ts.map +1 -0
- package/dist/SelectableList.svelte +186 -0
- package/dist/SelectableList.svelte.d.ts +30 -0
- package/dist/SelectableList.svelte.d.ts.map +1 -0
- package/dist/SelectableRow.svelte +291 -0
- package/dist/SelectableRow.svelte.d.ts +63 -0
- package/dist/SelectableRow.svelte.d.ts.map +1 -0
- package/dist/TreemapChart.svelte +448 -0
- package/dist/TreemapChart.svelte.d.ts +26 -0
- package/dist/TreemapChart.svelte.d.ts.map +1 -0
- package/dist/WaterfallChart.svelte +469 -0
- package/dist/WaterfallChart.svelte.d.ts +19 -0
- package/dist/WaterfallChart.svelte.d.ts.map +1 -0
- package/dist/chartContrast.d.ts +6 -0
- package/dist/chartContrast.d.ts.map +1 -0
- package/dist/chartContrast.js +58 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -0
- package/package.json +1 -1
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
import type { Snippet } from "svelte";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Shared context contract between {@link SelectableList} and its slotted
|
|
6
|
+
* {@link SelectableRow} children. The list owns selection + roving tabindex and
|
|
7
|
+
* exposes reactive getters the rows read to derive their own `role` / `tabindex`
|
|
8
|
+
* / `aria-selected`, plus callbacks for registration and activation. When a row
|
|
9
|
+
* is used STANDALONE (no list) `getContext` returns undefined and the row falls
|
|
10
|
+
* back to its own `role` / `tabindex` / selection state.
|
|
11
|
+
*/
|
|
12
|
+
export const SELECTABLE_LIST_KEY = Symbol("st-selectable-list");
|
|
13
|
+
|
|
14
|
+
export type SelectableListContext = {
|
|
15
|
+
/** True when the list manages selection/roving for its rows. */
|
|
16
|
+
readonly managed: true;
|
|
17
|
+
/** listbox role for the wrapper → rows are "option". */
|
|
18
|
+
readonly itemRole: "option";
|
|
19
|
+
/** Register a row element; returns an unregister callback. */
|
|
20
|
+
register: (el: HTMLElement, value: string | undefined) => () => void;
|
|
21
|
+
/** Is the row with this element currently selected? */
|
|
22
|
+
isSelected: (el: HTMLElement) => boolean;
|
|
23
|
+
/** Should the row with this element be the roving-tabindex stop (tabindex 0)? */
|
|
24
|
+
isTabStop: (el: HTMLElement) => boolean;
|
|
25
|
+
/** Row was activated (click / Space / Enter). The list toggles selection. */
|
|
26
|
+
activate: (el: HTMLElement) => void;
|
|
27
|
+
/** Row received focus → becomes the roving tab stop. */
|
|
28
|
+
focusRow: (el: HTMLElement) => void;
|
|
29
|
+
/** Arrow / Home / End navigation from a row. */
|
|
30
|
+
navigate: (el: HTMLElement, key: string) => void;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
export type SelectableRowProps = {
|
|
34
|
+
/**
|
|
35
|
+
* Selected state (bindable). Honoured when the row is used STANDALONE; inside
|
|
36
|
+
* a {@link SelectableList} the list is the source of truth and drives the
|
|
37
|
+
* selected styling, so this prop is ignored for managed rows.
|
|
38
|
+
*/
|
|
39
|
+
selected?: boolean;
|
|
40
|
+
/** Notified on every toggle with the new selected state (standalone rows). */
|
|
41
|
+
onselect?: (selected: boolean) => void;
|
|
42
|
+
/** Non-interactive when true. */
|
|
43
|
+
disabled?: boolean;
|
|
44
|
+
/** Stable value, surfaced as `data-value` and used by the list for `value`. */
|
|
45
|
+
value?: string;
|
|
46
|
+
/**
|
|
47
|
+
* ARIA role for the standalone row. Defaults to "option" so a lone row still
|
|
48
|
+
* reads as a selectable item. Inside a list the role is forced to "option".
|
|
49
|
+
*/
|
|
50
|
+
role?: string;
|
|
51
|
+
/**
|
|
52
|
+
* Opt-in left accent bar on the selected state. Off by default so the
|
|
53
|
+
* selected item is a calm tinted surface + accented text (two signals only).
|
|
54
|
+
*/
|
|
55
|
+
accentBar?: boolean;
|
|
56
|
+
/** Leading slot (icon / avatar). */
|
|
57
|
+
leading?: Snippet;
|
|
58
|
+
/** Trailing slot (meta / icon). */
|
|
59
|
+
trailing?: Snippet;
|
|
60
|
+
/** Main content. */
|
|
61
|
+
children?: Snippet;
|
|
62
|
+
class?: string;
|
|
63
|
+
};
|
|
64
|
+
</script>
|
|
65
|
+
|
|
66
|
+
<script lang="ts">
|
|
67
|
+
import { getContext } from "svelte";
|
|
68
|
+
|
|
69
|
+
let {
|
|
70
|
+
selected = $bindable(false),
|
|
71
|
+
onselect,
|
|
72
|
+
disabled = false,
|
|
73
|
+
value,
|
|
74
|
+
role = "option",
|
|
75
|
+
accentBar = false,
|
|
76
|
+
leading,
|
|
77
|
+
trailing,
|
|
78
|
+
children,
|
|
79
|
+
class: className
|
|
80
|
+
}: SelectableRowProps = $props();
|
|
81
|
+
|
|
82
|
+
// When rendered inside a SelectableList, the list (via context) owns selection
|
|
83
|
+
// and the roving tabindex. Standalone rows manage their own state.
|
|
84
|
+
const list = getContext<SelectableListContext | undefined>(SELECTABLE_LIST_KEY);
|
|
85
|
+
|
|
86
|
+
let el: HTMLElement | null = $state(null);
|
|
87
|
+
|
|
88
|
+
// Register with the parent list (if any) so it can order rows for arrow nav
|
|
89
|
+
// and compute the roving tab stop. The effect re-registers if value changes.
|
|
90
|
+
$effect(() => {
|
|
91
|
+
if (!list || !el || disabled) return;
|
|
92
|
+
return list.register(el, value);
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
// Effective selected state: list-managed rows read the list; standalone rows
|
|
96
|
+
// use their own bindable prop.
|
|
97
|
+
const isSelected = $derived(list && el ? list.isSelected(el) : selected);
|
|
98
|
+
|
|
99
|
+
// Effective role: a managed row is always an "option" inside the listbox.
|
|
100
|
+
const effectiveRole = $derived(list ? list.itemRole : role);
|
|
101
|
+
|
|
102
|
+
// Roving tabindex: in a list, exactly one enabled row is the tab stop (0), the
|
|
103
|
+
// rest are -1. Standalone enabled rows are always tabbable (0). Disabled = -1.
|
|
104
|
+
const tabindex = $derived(
|
|
105
|
+
disabled ? -1 : list && el ? (list.isTabStop(el) ? 0 : -1) : 0
|
|
106
|
+
);
|
|
107
|
+
|
|
108
|
+
const classes = $derived(
|
|
109
|
+
[
|
|
110
|
+
"st-selectableRow",
|
|
111
|
+
isSelected ? "st-selectableRow--selected" : null,
|
|
112
|
+
disabled ? "st-selectableRow--disabled" : null,
|
|
113
|
+
accentBar ? "st-selectableRow--accentBar" : null,
|
|
114
|
+
className
|
|
115
|
+
]
|
|
116
|
+
.filter(Boolean)
|
|
117
|
+
.join(" ")
|
|
118
|
+
);
|
|
119
|
+
|
|
120
|
+
function activate() {
|
|
121
|
+
if (disabled) return;
|
|
122
|
+
if (list && el) {
|
|
123
|
+
list.activate(el);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
selected = !selected;
|
|
127
|
+
onselect?.(selected);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function handleKeydown(e: KeyboardEvent) {
|
|
131
|
+
if (disabled) return;
|
|
132
|
+
if (e.key === "Enter" || e.key === " ") {
|
|
133
|
+
e.preventDefault();
|
|
134
|
+
activate();
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
// Roving navigation is owned by the list; forward the relevant keys.
|
|
138
|
+
if (
|
|
139
|
+
list &&
|
|
140
|
+
el &&
|
|
141
|
+
(e.key === "ArrowDown" ||
|
|
142
|
+
e.key === "ArrowUp" ||
|
|
143
|
+
e.key === "ArrowLeft" ||
|
|
144
|
+
e.key === "ArrowRight" ||
|
|
145
|
+
e.key === "Home" ||
|
|
146
|
+
e.key === "End")
|
|
147
|
+
) {
|
|
148
|
+
e.preventDefault();
|
|
149
|
+
list.navigate(el, e.key);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function handleFocus() {
|
|
154
|
+
if (disabled) return;
|
|
155
|
+
if (list && el) list.focusRow(el);
|
|
156
|
+
}
|
|
157
|
+
</script>
|
|
158
|
+
|
|
159
|
+
<!-- The row carries an interactive ARIA role (option/listbox item) so a roving
|
|
160
|
+
tabindex is correct; the role is dynamic, which the static a11y check cannot
|
|
161
|
+
verify, hence the targeted ignore. -->
|
|
162
|
+
<!-- svelte-ignore a11y_no_noninteractive_tabindex -->
|
|
163
|
+
<div
|
|
164
|
+
bind:this={el}
|
|
165
|
+
class={classes}
|
|
166
|
+
role={effectiveRole}
|
|
167
|
+
aria-selected={effectiveRole === "option" ? isSelected : undefined}
|
|
168
|
+
aria-disabled={disabled ? "true" : undefined}
|
|
169
|
+
data-value={value}
|
|
170
|
+
{tabindex}
|
|
171
|
+
onclick={activate}
|
|
172
|
+
onkeydown={handleKeydown}
|
|
173
|
+
onfocus={handleFocus}
|
|
174
|
+
>
|
|
175
|
+
{#if leading}
|
|
176
|
+
<span class="st-selectableRow__leading">{@render leading()}</span>
|
|
177
|
+
{/if}
|
|
178
|
+
<span class="st-selectableRow__content">{@render children?.()}</span>
|
|
179
|
+
{#if trailing}
|
|
180
|
+
<span class="st-selectableRow__trailing">{@render trailing()}</span>
|
|
181
|
+
{/if}
|
|
182
|
+
</div>
|
|
183
|
+
|
|
184
|
+
<style>
|
|
185
|
+
/* Compact, full-width selectable list/rail row. By DEFAULT the selected state
|
|
186
|
+
is just two calm signals — a tinted surface + accented text — deliberately
|
|
187
|
+
NOT the off-theme "boudin box" (inset box-shadow + heavy rounded border) it
|
|
188
|
+
replaces, and NOT a reflow-causing font-weight bump. The fine left accent
|
|
189
|
+
bar is OPT-IN via the `accentBar` prop. */
|
|
190
|
+
.st-selectableRow {
|
|
191
|
+
align-items: center;
|
|
192
|
+
background: transparent;
|
|
193
|
+
border-radius: var(--st-radius-sm, 0.25rem);
|
|
194
|
+
box-sizing: border-box;
|
|
195
|
+
color: var(--st-semantic-text-secondary, #475569);
|
|
196
|
+
cursor: pointer;
|
|
197
|
+
display: flex;
|
|
198
|
+
gap: var(--st-spacing-2, 0.5rem);
|
|
199
|
+
padding: 0.5rem 0.75rem;
|
|
200
|
+
position: relative;
|
|
201
|
+
text-align: left;
|
|
202
|
+
transition:
|
|
203
|
+
background-color var(--st-motion-fast, 120ms) var(--st-motion-easing, ease),
|
|
204
|
+
color var(--st-motion-fast, 120ms) var(--st-motion-easing, ease);
|
|
205
|
+
user-select: none;
|
|
206
|
+
width: 100%;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/* Opt-in accent bar: reserve the 2px gutter only when enabled so text never
|
|
210
|
+
shifts on selection. */
|
|
211
|
+
.st-selectableRow--accentBar {
|
|
212
|
+
padding-left: calc(0.75rem - 2px);
|
|
213
|
+
border-left: 2px solid transparent;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
.st-selectableRow:hover:not(.st-selectableRow--disabled):not(.st-selectableRow--selected) {
|
|
217
|
+
background: var(
|
|
218
|
+
--st-component-control-hoverBackground,
|
|
219
|
+
var(--st-semantic-surface-subtle, #f8fafc)
|
|
220
|
+
);
|
|
221
|
+
color: var(--st-semantic-text-primary, #0f172a);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/* Focus ring as an EXTERNAL offset (not inset) so it reads as a focus
|
|
225
|
+
affordance around the row rather than an inner stroke. */
|
|
226
|
+
.st-selectableRow:focus-visible {
|
|
227
|
+
outline: 2px solid var(--st-semantic-border-interactive, var(--st-semantic-action-primary));
|
|
228
|
+
outline-offset: 2px;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/* Selected: two signals by default — tinted surface + accented (contrast-safe)
|
|
232
|
+
text. The token values carry a flat fallback; the inline color-mix is only a
|
|
233
|
+
last-resort default when the token is unset. */
|
|
234
|
+
.st-selectableRow--selected {
|
|
235
|
+
background: var(
|
|
236
|
+
--st-component-selectableRow-selectedBackground,
|
|
237
|
+
color-mix(in oklch, var(--st-semantic-action-primary, #2563eb) 12%, transparent)
|
|
238
|
+
);
|
|
239
|
+
color: var(
|
|
240
|
+
--st-component-selectableRow-selectedText,
|
|
241
|
+
color-mix(in oklch, var(--st-semantic-action-primary, #2563eb) 78%, black)
|
|
242
|
+
);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/* The left accent bar paints only when opt-in AND selected. */
|
|
246
|
+
.st-selectableRow--accentBar.st-selectableRow--selected {
|
|
247
|
+
border-left-color: var(
|
|
248
|
+
--st-component-selectableRow-selectedAccent,
|
|
249
|
+
var(--st-semantic-action-primary, #2563eb)
|
|
250
|
+
);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/* color-mix fallback: engines without color-mix() get a flat tinted surface +
|
|
254
|
+
a solid accent text from the resolved tokens' plain values. */
|
|
255
|
+
@supports not (color: color-mix(in oklch, red, blue)) {
|
|
256
|
+
.st-selectableRow--selected {
|
|
257
|
+
background: var(
|
|
258
|
+
--st-component-selectableRow-selectedBackground,
|
|
259
|
+
var(--st-semantic-surface-subtle, #eef2ff)
|
|
260
|
+
);
|
|
261
|
+
color: var(
|
|
262
|
+
--st-component-selectableRow-selectedText,
|
|
263
|
+
var(--st-semantic-action-primary, #1d4ed8)
|
|
264
|
+
);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
.st-selectableRow--disabled {
|
|
269
|
+
cursor: not-allowed;
|
|
270
|
+
opacity: 0.55;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
.st-selectableRow__leading,
|
|
274
|
+
.st-selectableRow__trailing {
|
|
275
|
+
align-items: center;
|
|
276
|
+
display: inline-flex;
|
|
277
|
+
flex: 0 0 auto;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
.st-selectableRow__content {
|
|
281
|
+
flex: 1 1 auto;
|
|
282
|
+
min-width: 0;
|
|
283
|
+
overflow: hidden;
|
|
284
|
+
text-overflow: ellipsis;
|
|
285
|
+
white-space: nowrap;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
@media (prefers-reduced-motion: reduce) {
|
|
289
|
+
.st-selectableRow { transition: none; }
|
|
290
|
+
}
|
|
291
|
+
</style>
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { Snippet } from "svelte";
|
|
2
|
+
/**
|
|
3
|
+
* Shared context contract between {@link SelectableList} and its slotted
|
|
4
|
+
* {@link SelectableRow} children. The list owns selection + roving tabindex and
|
|
5
|
+
* exposes reactive getters the rows read to derive their own `role` / `tabindex`
|
|
6
|
+
* / `aria-selected`, plus callbacks for registration and activation. When a row
|
|
7
|
+
* is used STANDALONE (no list) `getContext` returns undefined and the row falls
|
|
8
|
+
* back to its own `role` / `tabindex` / selection state.
|
|
9
|
+
*/
|
|
10
|
+
export declare const SELECTABLE_LIST_KEY: unique symbol;
|
|
11
|
+
export type SelectableListContext = {
|
|
12
|
+
/** True when the list manages selection/roving for its rows. */
|
|
13
|
+
readonly managed: true;
|
|
14
|
+
/** listbox role for the wrapper → rows are "option". */
|
|
15
|
+
readonly itemRole: "option";
|
|
16
|
+
/** Register a row element; returns an unregister callback. */
|
|
17
|
+
register: (el: HTMLElement, value: string | undefined) => () => void;
|
|
18
|
+
/** Is the row with this element currently selected? */
|
|
19
|
+
isSelected: (el: HTMLElement) => boolean;
|
|
20
|
+
/** Should the row with this element be the roving-tabindex stop (tabindex 0)? */
|
|
21
|
+
isTabStop: (el: HTMLElement) => boolean;
|
|
22
|
+
/** Row was activated (click / Space / Enter). The list toggles selection. */
|
|
23
|
+
activate: (el: HTMLElement) => void;
|
|
24
|
+
/** Row received focus → becomes the roving tab stop. */
|
|
25
|
+
focusRow: (el: HTMLElement) => void;
|
|
26
|
+
/** Arrow / Home / End navigation from a row. */
|
|
27
|
+
navigate: (el: HTMLElement, key: string) => void;
|
|
28
|
+
};
|
|
29
|
+
export type SelectableRowProps = {
|
|
30
|
+
/**
|
|
31
|
+
* Selected state (bindable). Honoured when the row is used STANDALONE; inside
|
|
32
|
+
* a {@link SelectableList} the list is the source of truth and drives the
|
|
33
|
+
* selected styling, so this prop is ignored for managed rows.
|
|
34
|
+
*/
|
|
35
|
+
selected?: boolean;
|
|
36
|
+
/** Notified on every toggle with the new selected state (standalone rows). */
|
|
37
|
+
onselect?: (selected: boolean) => void;
|
|
38
|
+
/** Non-interactive when true. */
|
|
39
|
+
disabled?: boolean;
|
|
40
|
+
/** Stable value, surfaced as `data-value` and used by the list for `value`. */
|
|
41
|
+
value?: string;
|
|
42
|
+
/**
|
|
43
|
+
* ARIA role for the standalone row. Defaults to "option" so a lone row still
|
|
44
|
+
* reads as a selectable item. Inside a list the role is forced to "option".
|
|
45
|
+
*/
|
|
46
|
+
role?: string;
|
|
47
|
+
/**
|
|
48
|
+
* Opt-in left accent bar on the selected state. Off by default so the
|
|
49
|
+
* selected item is a calm tinted surface + accented text (two signals only).
|
|
50
|
+
*/
|
|
51
|
+
accentBar?: boolean;
|
|
52
|
+
/** Leading slot (icon / avatar). */
|
|
53
|
+
leading?: Snippet;
|
|
54
|
+
/** Trailing slot (meta / icon). */
|
|
55
|
+
trailing?: Snippet;
|
|
56
|
+
/** Main content. */
|
|
57
|
+
children?: Snippet;
|
|
58
|
+
class?: string;
|
|
59
|
+
};
|
|
60
|
+
declare const SelectableRow: import("svelte").Component<SelectableRowProps, {}, "selected">;
|
|
61
|
+
type SelectableRow = ReturnType<typeof SelectableRow>;
|
|
62
|
+
export default SelectableRow;
|
|
63
|
+
//# sourceMappingURL=SelectableRow.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SelectableRow.svelte.d.ts","sourceRoot":"","sources":["../src/lib/SelectableRow.svelte.ts"],"names":[],"mappings":"AAGE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEtC;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,eAA+B,CAAC;AAEhE,MAAM,MAAM,qBAAqB,GAAG;IAClC,gEAAgE;IAChE,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;IACvB,wDAAwD;IACxD,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,8DAA8D;IAC9D,QAAQ,EAAE,CAAC,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,MAAM,IAAI,CAAC;IACrE,uDAAuD;IACvD,UAAU,EAAE,CAAC,EAAE,EAAE,WAAW,KAAK,OAAO,CAAC;IACzC,iFAAiF;IACjF,SAAS,EAAE,CAAC,EAAE,EAAE,WAAW,KAAK,OAAO,CAAC;IACxC,6EAA6E;IAC7E,QAAQ,EAAE,CAAC,EAAE,EAAE,WAAW,KAAK,IAAI,CAAC;IACpC,wDAAwD;IACxD,QAAQ,EAAE,CAAC,EAAE,EAAE,WAAW,KAAK,IAAI,CAAC;IACpC,gDAAgD;IAChD,QAAQ,EAAE,CAAC,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAClD,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,iCAAiC;IACjC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,+EAA+E;IAC/E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,oCAAoC;IACpC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,mCAAmC;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oBAAoB;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAoHJ,QAAA,MAAM,aAAa,gEAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
|