@rinzai/zen 0.9.0 → 0.10.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.
- package/dist/animated-number/index.d.ts +6 -2
- package/dist/animated-number/index.d.ts.map +1 -1
- package/dist/animated-number/index.js +68 -17
- package/dist/calendar-heatmap/index.d.ts +25 -0
- package/dist/calendar-heatmap/index.d.ts.map +1 -0
- package/dist/calendar-heatmap/index.js +48 -0
- package/dist/chart/allocation.d.ts +30 -0
- package/dist/chart/allocation.d.ts.map +1 -0
- package/dist/chart/allocation.js +69 -0
- package/dist/chart/index.d.ts +1 -0
- package/dist/chart/index.d.ts.map +1 -1
- package/dist/chart/index.js +85 -83
- package/dist/code-block/index.d.ts +1 -1
- package/dist/code-block/index.d.ts.map +1 -1
- package/dist/code-block/index.js +31 -22
- package/dist/collapse/index.d.ts +3 -2
- package/dist/collapse/index.d.ts.map +1 -1
- package/dist/collapse/index.js +1 -1
- package/dist/date-picker/index.d.ts +10 -2
- package/dist/date-picker/index.d.ts.map +1 -1
- package/dist/date-picker/index.js +43 -21
- package/dist/dialog/index.d.ts +4 -2
- package/dist/dialog/index.d.ts.map +1 -1
- package/dist/dialog/index.js +69 -113
- package/dist/editable-cell/index.d.ts +2 -1
- package/dist/editable-cell/index.d.ts.map +1 -1
- package/dist/editable-cell/index.js +24 -17
- package/dist/filter-bar/index.d.ts +21 -0
- package/dist/filter-bar/index.d.ts.map +1 -0
- package/dist/filter-bar/index.js +90 -0
- package/dist/icon-picker/index.d.ts +38 -0
- package/dist/icon-picker/index.d.ts.map +1 -0
- package/dist/icon-picker/index.js +112 -0
- package/dist/icons/arrow-left.js +23 -0
- package/dist/icons/micro/arrow-trending-down.d.ts +3 -0
- package/dist/icons/micro/arrow-trending-down.d.ts.map +1 -0
- package/dist/icons/micro/arrow-trending-down.js +21 -0
- package/dist/icons/micro/arrow-trending-up.d.ts +3 -0
- package/dist/icons/micro/arrow-trending-up.d.ts.map +1 -0
- package/dist/icons/micro/arrow-trending-up.js +21 -0
- package/dist/index.d.ts +17 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/kbd/index.d.ts +4 -0
- package/dist/kbd/index.d.ts.map +1 -0
- package/dist/kbd/index.js +12 -0
- package/dist/keypad/index.d.ts +20 -0
- package/dist/keypad/index.d.ts.map +1 -0
- package/dist/keypad/index.js +42 -0
- package/dist/lib.js +92 -77
- package/dist/load-more/index.d.ts +19 -0
- package/dist/load-more/index.d.ts.map +1 -0
- package/dist/load-more/index.js +37 -0
- package/dist/menu/index.d.ts +22 -3
- package/dist/menu/index.d.ts.map +1 -1
- package/dist/menu/index.js +139 -48
- package/dist/meter/index.d.ts +3 -1
- package/dist/meter/index.d.ts.map +1 -1
- package/dist/meter/index.js +19 -14
- package/dist/money-input/index.d.ts +3 -3
- package/dist/page-transition/index.d.ts +10 -0
- package/dist/page-transition/index.d.ts.map +1 -0
- package/dist/page-transition/index.js +16 -0
- package/dist/progress-ring/index.d.ts +4 -1
- package/dist/progress-ring/index.d.ts.map +1 -1
- package/dist/progress-ring/index.js +47 -38
- package/dist/range-slider/index.d.ts +26 -0
- package/dist/range-slider/index.d.ts.map +1 -0
- package/dist/range-slider/index.js +44 -0
- package/dist/repeat-picker/index.d.ts +22 -0
- package/dist/repeat-picker/index.d.ts.map +1 -0
- package/dist/repeat-picker/index.js +115 -0
- package/dist/slider/index.d.ts +2 -0
- package/dist/slider/index.d.ts.map +1 -1
- package/dist/slider/index.js +19 -18
- package/dist/sortable/index.d.ts +33 -0
- package/dist/sortable/index.d.ts.map +1 -0
- package/dist/sortable/index.js +147 -0
- package/dist/table/index.d.ts +5 -1
- package/dist/table/index.d.ts.map +1 -1
- package/dist/table/index.js +90 -58
- package/dist/table/selection.d.ts +55 -0
- package/dist/table/selection.d.ts.map +1 -0
- package/dist/table/selection.js +83 -0
- package/dist/table/swipe.d.ts +18 -0
- package/dist/table/swipe.d.ts.map +1 -0
- package/dist/table/swipe.js +53 -0
- package/dist/tabs/index.d.ts.map +1 -1
- package/dist/tabs/index.js +101 -51
- package/dist/theme-toggle/index.js +6 -6
- package/dist/theme.css +184 -11
- package/dist/toast/index.js +25 -25
- package/dist/toggle/index.d.ts.map +1 -1
- package/dist/toggle/index.js +1 -1
- package/dist/trend/index.d.ts +19 -0
- package/dist/trend/index.d.ts.map +1 -0
- package/dist/trend/index.js +27 -0
- package/dist/utils/date.d.ts +34 -0
- package/dist/utils/date.d.ts.map +1 -1
- package/dist/utils/date.js +45 -12
- package/dist/utils/money.d.ts +3 -1
- package/dist/utils/money.d.ts.map +1 -1
- package/dist/utils/money.js +24 -1
- package/dist/utils/repeat.d.ts +17 -0
- package/dist/utils/repeat.d.ts.map +1 -0
- package/dist/utils/repeat.js +38 -0
- package/dist/utils/swipe.d.ts +29 -0
- package/dist/utils/swipe.d.ts.map +1 -0
- package/dist/utils/swipe.js +85 -0
- package/dist/utils/useAnchoredPopup.d.ts.map +1 -1
- package/dist/utils/useAnchoredPopup.js +3 -9
- package/dist/zen.css +1 -1
- package/package.json +3 -1
package/dist/menu/index.js
CHANGED
|
@@ -3,56 +3,80 @@ import { cx as e } from "../utils/cx.js";
|
|
|
3
3
|
import { useTypeahead as t } from "../utils/typeahead.js";
|
|
4
4
|
import { useGraphicsMode as n } from "../utils/graphics.js";
|
|
5
5
|
import { Slot as r } from "../utils/slot.js";
|
|
6
|
-
import {
|
|
7
|
-
import { createContext as
|
|
8
|
-
import {
|
|
6
|
+
import { anchorFor as i, anchoredStyle as a, useAnchoredPopup as o } from "../utils/useAnchoredPopup.js";
|
|
7
|
+
import { createContext as s, useContext as c, useEffect as l, useId as u, useLayoutEffect as d, useRef as f, useState as p } from "react";
|
|
8
|
+
import { createPortal as m } from "react-dom";
|
|
9
|
+
import { Fragment as h, jsx as g, jsxs as _ } from "react/jsx-runtime";
|
|
9
10
|
//#region packages/menu/index.tsx
|
|
10
|
-
var d =
|
|
11
|
-
function
|
|
12
|
-
let t =
|
|
11
|
+
var v = typeof window > "u" ? l : d, y = s(() => {}), b = s(null);
|
|
12
|
+
function x(e) {
|
|
13
|
+
let t = c(b);
|
|
13
14
|
if (!t) throw Error(`<${e}> must be inside <Menu>`);
|
|
14
15
|
return t;
|
|
15
16
|
}
|
|
16
|
-
function
|
|
17
|
+
function S({ onOpenChange: e, children: t }) {
|
|
17
18
|
n();
|
|
18
|
-
let r =
|
|
19
|
-
t
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
let r = u(), [i, a] = p(null), s = f(null), c = f(!1), l = o({ onOpenChange: (t) => {
|
|
20
|
+
if (c.current = t, t ? l.popupRef.current?.focus() : d(), !t && s.current) {
|
|
21
|
+
let e = document.activeElement;
|
|
22
|
+
(!e || e === document.body || l.popupRef.current?.contains(e)) && s.current.focus(), s.current = null;
|
|
23
|
+
}
|
|
24
|
+
e?.(t);
|
|
25
|
+
} }), d = () => {
|
|
26
|
+
let e = l.popupRef.current?.getAnimations?.() ?? [];
|
|
27
|
+
Promise.allSettled(e.map((e) => e.finished)).then(() => {
|
|
28
|
+
c.current || a(null);
|
|
29
|
+
});
|
|
30
|
+
};
|
|
31
|
+
return v(() => {
|
|
32
|
+
if (i && (l.setOpen(!0), i.pointerId !== void 0)) try {
|
|
33
|
+
l.popupRef.current?.setPointerCapture(i.pointerId);
|
|
34
|
+
} catch {}
|
|
35
|
+
}, [i]), /* @__PURE__ */ g(b.Provider, {
|
|
22
36
|
value: {
|
|
23
|
-
popup:
|
|
24
|
-
triggerId: r
|
|
37
|
+
popup: l,
|
|
38
|
+
triggerId: r,
|
|
39
|
+
point: i,
|
|
40
|
+
openAt: (e) => {
|
|
41
|
+
s.current = document.activeElement instanceof HTMLElement ? document.activeElement : null, a({ ...e });
|
|
42
|
+
}
|
|
25
43
|
},
|
|
26
|
-
children: /* @__PURE__ */
|
|
27
|
-
value: () =>
|
|
44
|
+
children: /* @__PURE__ */ g(y.Provider, {
|
|
45
|
+
value: () => l.setOpen(!1),
|
|
28
46
|
children: t
|
|
29
47
|
})
|
|
30
48
|
});
|
|
31
49
|
}
|
|
32
|
-
function
|
|
33
|
-
let { popup: o, triggerId: s } =
|
|
50
|
+
function C({ asChild: t, style: n, children: i, ...a }) {
|
|
51
|
+
let { popup: o, triggerId: s, point: c } = x("MenuTrigger"), l = {
|
|
34
52
|
id: s,
|
|
35
53
|
"aria-haspopup": "menu",
|
|
36
54
|
...o.triggerProps,
|
|
55
|
+
...c && {
|
|
56
|
+
"aria-expanded": !1,
|
|
57
|
+
"data-popup-open": void 0
|
|
58
|
+
},
|
|
37
59
|
...a,
|
|
38
60
|
style: {
|
|
39
61
|
...o.triggerProps.style,
|
|
40
62
|
...n
|
|
41
63
|
}
|
|
42
64
|
};
|
|
43
|
-
return t ? /* @__PURE__ */
|
|
44
|
-
...
|
|
65
|
+
return t ? /* @__PURE__ */ g(r, {
|
|
66
|
+
...l,
|
|
45
67
|
children: i
|
|
46
|
-
}) : /* @__PURE__ */
|
|
68
|
+
}) : /* @__PURE__ */ g("button", {
|
|
47
69
|
type: "button",
|
|
48
|
-
...
|
|
49
|
-
className: e("cursor-pointer",
|
|
70
|
+
...l,
|
|
71
|
+
className: e("cursor-pointer", l.className),
|
|
50
72
|
children: i
|
|
51
73
|
});
|
|
52
74
|
}
|
|
53
|
-
function
|
|
54
|
-
let { popup:
|
|
55
|
-
|
|
75
|
+
function w({ align: n, offset: r, className: i, style: o, children: s, ...c }) {
|
|
76
|
+
let { popup: l, triggerId: u, point: d } = x("MenuContent");
|
|
77
|
+
n ??= d ? "start" : "end", r ??= d ? 2 : 6;
|
|
78
|
+
let f = t(), p = (e) => {
|
|
79
|
+
let t = Array.from(l.popupRef.current?.querySelectorAll("[role=\"menuitem\"]:not(:disabled)") ?? []), n = t.indexOf(document.activeElement), r = t.length - 1, i = f(e);
|
|
56
80
|
if (i) {
|
|
57
81
|
t.find((e) => e.textContent?.trim().toLowerCase().startsWith(i))?.focus();
|
|
58
82
|
return;
|
|
@@ -65,61 +89,128 @@ function g({ align: n = "end", offset: r = 6, className: a, style: o, children:
|
|
|
65
89
|
}[e.key];
|
|
66
90
|
a !== void 0 && (e.preventDefault(), t[(a + t.length) % t.length]?.focus());
|
|
67
91
|
};
|
|
68
|
-
return /* @__PURE__ */
|
|
69
|
-
"aria-labelledby": d,
|
|
92
|
+
return /* @__PURE__ */ g("div", {
|
|
93
|
+
"aria-labelledby": d ? void 0 : u,
|
|
70
94
|
...c,
|
|
71
|
-
...
|
|
95
|
+
...l.popupProps,
|
|
72
96
|
role: "menu",
|
|
73
97
|
tabIndex: -1,
|
|
74
98
|
onKeyDown: (e) => {
|
|
75
|
-
c.onKeyDown?.(e),
|
|
99
|
+
c.onKeyDown?.(e), p(e);
|
|
76
100
|
},
|
|
77
101
|
style: {
|
|
78
|
-
...
|
|
102
|
+
...a(l.id, {
|
|
79
103
|
align: n,
|
|
80
104
|
offset: r
|
|
81
105
|
}),
|
|
82
106
|
...o
|
|
83
107
|
},
|
|
84
|
-
className: e("zen__popover glass glass-blur text-foreground min-w-44 rounded-xl p-1.5 outline-hidden",
|
|
108
|
+
className: e("zen__popover glass glass-blur text-foreground min-w-44 rounded-xl p-1.5 outline-hidden", i),
|
|
85
109
|
children: s
|
|
86
110
|
});
|
|
87
111
|
}
|
|
88
|
-
var
|
|
89
|
-
function
|
|
90
|
-
let
|
|
112
|
+
var T = 500, E = 8;
|
|
113
|
+
function D({ asChild: t, disabled: n, className: a, onContextMenu: o, onPointerDown: s, onClickCapture: c, children: d, ...p }) {
|
|
114
|
+
let { popup: v, point: y, openAt: b } = x("MenuContextTrigger"), S = u(), C = y?.from === S, w = f(null), D = f(!1), O = () => {
|
|
115
|
+
w.current && clearTimeout(w.current.timer), w.current = null;
|
|
116
|
+
};
|
|
117
|
+
l(() => O, []);
|
|
118
|
+
let k = {
|
|
91
119
|
...p,
|
|
120
|
+
className: e("[-webkit-touch-callout:none]", a),
|
|
121
|
+
"data-popup-open": C && v.open || void 0,
|
|
122
|
+
onContextMenu: (e) => {
|
|
123
|
+
if (o?.(e), !(n || e.defaultPrevented) && (e.preventDefault(), O(), !v.open)) {
|
|
124
|
+
if (e.clientX === 0 && e.clientY === 0) {
|
|
125
|
+
let t = e.target.getBoundingClientRect();
|
|
126
|
+
b({
|
|
127
|
+
x: t.left,
|
|
128
|
+
y: t.bottom,
|
|
129
|
+
from: S
|
|
130
|
+
});
|
|
131
|
+
} else {
|
|
132
|
+
let t = e.nativeEvent, n = "pointerId" in t && e.buttons ? t.pointerId : void 0;
|
|
133
|
+
b({
|
|
134
|
+
x: e.clientX,
|
|
135
|
+
y: e.clientY,
|
|
136
|
+
from: S,
|
|
137
|
+
pointerId: n
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
},
|
|
142
|
+
onPointerDown: (e) => {
|
|
143
|
+
if (s?.(e), D.current = !1, n || e.pointerType !== "touch" || !e.isPrimary) return;
|
|
144
|
+
let t = {
|
|
145
|
+
x: e.clientX,
|
|
146
|
+
y: e.clientY,
|
|
147
|
+
from: S,
|
|
148
|
+
pointerId: e.pointerId
|
|
149
|
+
}, r = e.currentTarget, i = (e) => {
|
|
150
|
+
Math.hypot(e.clientX - t.x, e.clientY - t.y) > E && a();
|
|
151
|
+
}, a = () => {
|
|
152
|
+
O(), r.removeEventListener("pointermove", i), r.removeEventListener("pointerup", a), r.removeEventListener("pointercancel", a);
|
|
153
|
+
};
|
|
154
|
+
r.addEventListener("pointermove", i), r.addEventListener("pointerup", a), r.addEventListener("pointercancel", a), w.current = {
|
|
155
|
+
...t,
|
|
156
|
+
timer: window.setTimeout(() => {
|
|
157
|
+
a(), D.current = !0, v.open || b(t);
|
|
158
|
+
}, T)
|
|
159
|
+
};
|
|
160
|
+
},
|
|
161
|
+
onClickCapture: (e) => {
|
|
162
|
+
c?.(e), D.current && (D.current = !1, e.preventDefault(), e.stopPropagation());
|
|
163
|
+
}
|
|
164
|
+
}, A = y && C && m(/* @__PURE__ */ g("span", {
|
|
165
|
+
"aria-hidden": !0,
|
|
166
|
+
...i(v.id),
|
|
167
|
+
style: {
|
|
168
|
+
...i(v.id).style,
|
|
169
|
+
position: "fixed",
|
|
170
|
+
left: y.x,
|
|
171
|
+
top: y.y
|
|
172
|
+
}
|
|
173
|
+
}), document.body);
|
|
174
|
+
return /* @__PURE__ */ _(h, { children: [g(t ? r : "div", {
|
|
175
|
+
...k,
|
|
176
|
+
children: d
|
|
177
|
+
}), A] });
|
|
178
|
+
}
|
|
179
|
+
var O = "flex w-full cursor-pointer items-center gap-3 rounded-lg px-3 py-2 text-left text-sm outline-hidden select-none hover:bg-tint/[0.07] focus:bg-tint/[0.07] disabled:cursor-not-allowed disabled:opacity-50";
|
|
180
|
+
function k({ icon: t, destructive: n, onSelect: i, asChild: a, className: o, children: s, onClick: l, ...u }) {
|
|
181
|
+
let d = c(y), f = {
|
|
182
|
+
...u,
|
|
92
183
|
role: "menuitem",
|
|
93
184
|
tabIndex: -1,
|
|
94
|
-
className: e(
|
|
185
|
+
className: e(O, n && "text-destructive", o),
|
|
95
186
|
onClick: (e) => {
|
|
96
|
-
|
|
187
|
+
l?.(e), d(), i?.();
|
|
97
188
|
}
|
|
98
189
|
};
|
|
99
|
-
return a ? /* @__PURE__ */
|
|
100
|
-
...
|
|
101
|
-
children:
|
|
102
|
-
}) : /* @__PURE__ */
|
|
190
|
+
return a ? /* @__PURE__ */ g(r, {
|
|
191
|
+
...f,
|
|
192
|
+
children: s
|
|
193
|
+
}) : /* @__PURE__ */ _("button", {
|
|
103
194
|
type: "button",
|
|
104
|
-
...
|
|
105
|
-
children: [t && /* @__PURE__ */
|
|
195
|
+
...f,
|
|
196
|
+
children: [t && /* @__PURE__ */ g("span", {
|
|
106
197
|
"aria-hidden": !0,
|
|
107
198
|
className: e("flex shrink-0", !n && "text-muted-foreground"),
|
|
108
199
|
children: t
|
|
109
|
-
}),
|
|
200
|
+
}), s]
|
|
110
201
|
});
|
|
111
202
|
}
|
|
112
|
-
function
|
|
113
|
-
return /* @__PURE__ */
|
|
203
|
+
function A({ className: t }) {
|
|
204
|
+
return /* @__PURE__ */ g("div", {
|
|
114
205
|
role: "separator",
|
|
115
206
|
className: e("bg-tint/[0.07] mx-2 my-1 h-px", t)
|
|
116
207
|
});
|
|
117
208
|
}
|
|
118
|
-
function
|
|
119
|
-
return /* @__PURE__ */
|
|
209
|
+
function j({ className: t, ...n }) {
|
|
210
|
+
return /* @__PURE__ */ g("div", {
|
|
120
211
|
className: e("flex items-center gap-3 px-3 py-2.5", t),
|
|
121
212
|
...n
|
|
122
213
|
});
|
|
123
214
|
}
|
|
124
215
|
//#endregion
|
|
125
|
-
export {
|
|
216
|
+
export { w as MenuContent, D as MenuContextTrigger, j as MenuHeader, k as MenuItem, A as MenuSeparator, C as MenuTrigger, S as default };
|
package/dist/meter/index.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { ComponentProps, ReactNode } from 'react';
|
|
|
4
4
|
* a figure and a note. Over the limit it turns red; near it, warm. Announced
|
|
5
5
|
* as a meter, with `valueText` read out instead of the bare number.
|
|
6
6
|
*/
|
|
7
|
-
export default function Meter({ value, max, label, detail, hint, valueText, tone, warnAt, className, ...rest }: MeterProps): import('react').JSX.Element;
|
|
7
|
+
export default function Meter({ value, max, label, detail, hint, valueText, tone, warnAt, marks, className, ...rest }: MeterProps): import('react').JSX.Element;
|
|
8
8
|
/** Also takes the element's own props, e.g. `aria-label` when there's no visible label. */
|
|
9
9
|
export interface MeterProps extends Omit<ComponentProps<'div'>, 'children'> {
|
|
10
10
|
value: number;
|
|
@@ -21,6 +21,8 @@ export interface MeterProps extends Omit<ComponentProps<'div'>, 'children'> {
|
|
|
21
21
|
tone?: 'auto' | 'default' | 'warning' | 'danger';
|
|
22
22
|
/** Fraction of max where `auto` turns to warning (default 0.85). */
|
|
23
23
|
warnAt?: number;
|
|
24
|
+
/** Milestones along the bar, in the same units as value: e.g. [2500, 5000, 7500] of 10000. */
|
|
25
|
+
marks?: number[];
|
|
24
26
|
className?: string;
|
|
25
27
|
}
|
|
26
28
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/meter/index.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAS,MAAM,OAAO,CAAC;AAEzD;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,KAAK,CAAC,EAC1B,KAAK,EACL,GAAS,EACT,KAAK,EACL,MAAM,EACN,IAAI,EACJ,SAAS,EACT,IAAa,EACb,MAAa,EACb,SAAS,EACT,GAAG,IAAI,EACV,EAAE,UAAU,+
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/meter/index.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAS,MAAM,OAAO,CAAC;AAEzD;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,KAAK,CAAC,EAC1B,KAAK,EACL,GAAS,EACT,KAAK,EACL,MAAM,EACN,IAAI,EACJ,SAAS,EACT,IAAa,EACb,MAAa,EACb,KAAK,EACL,SAAS,EACT,GAAG,IAAI,EACV,EAAE,UAAU,+BAkEZ;AAED,2FAA2F;AAC3F,MAAM,WAAW,UAAW,SAAQ,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;IACvE,KAAK,EAAE,MAAM,CAAC;IACd,4EAA4E;IAC5E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,0CAA0C;IAC1C,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,yCAAyC;IACzC,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,oFAAoF;IACpF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IACjD,oEAAoE;IACpE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8FAA8F;IAC9F,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB"}
|
package/dist/meter/index.js
CHANGED
|
@@ -3,36 +3,41 @@ import { cx as e } from "../utils/cx.js";
|
|
|
3
3
|
import { useId as t } from "react";
|
|
4
4
|
import { jsx as n, jsxs as r } from "react/jsx-runtime";
|
|
5
5
|
//#region packages/meter/index.tsx
|
|
6
|
-
function i({ value: i, max: a = 100, label: o, detail: s, hint: c, valueText: l, tone: u = "auto", warnAt: d = .85,
|
|
7
|
-
let
|
|
6
|
+
function i({ value: i, max: a = 100, label: o, detail: s, hint: c, valueText: l, tone: u = "auto", warnAt: d = .85, marks: f, className: p, ...m }) {
|
|
7
|
+
let h = t(), g = i > a, _ = a > 0 ? i / a : +(i > 0), v = Math.min(100, Math.max(0, Math.round(_ * 100))), y = u === "auto" ? g ? "danger" : _ >= d ? "warning" : "default" : u;
|
|
8
8
|
return /* @__PURE__ */ r("div", {
|
|
9
|
-
...
|
|
9
|
+
...m,
|
|
10
10
|
role: "meter",
|
|
11
|
-
"aria-labelledby": o ?
|
|
11
|
+
"aria-labelledby": o ? h : m["aria-labelledby"],
|
|
12
12
|
"aria-valuemin": 0,
|
|
13
13
|
"aria-valuemax": a,
|
|
14
14
|
"aria-valuenow": Math.min(i, a),
|
|
15
15
|
"aria-valuetext": l,
|
|
16
|
-
className: e("zen__meter grid grid-cols-2 gap-y-1.5",
|
|
16
|
+
className: e("zen__meter grid grid-cols-2 gap-y-1.5", p),
|
|
17
17
|
children: [
|
|
18
18
|
o && /* @__PURE__ */ n("span", {
|
|
19
|
-
id:
|
|
19
|
+
id: h,
|
|
20
20
|
className: "text-sm font-medium",
|
|
21
21
|
children: o
|
|
22
22
|
}),
|
|
23
23
|
s && /* @__PURE__ */ n("span", {
|
|
24
|
-
className: e("col-start-2 text-right text-sm tabular-nums",
|
|
24
|
+
className: e("col-start-2 text-right text-sm tabular-nums", y === "danger" ? "text-destructive" : "text-muted-foreground"),
|
|
25
25
|
children: s
|
|
26
26
|
}),
|
|
27
|
-
/* @__PURE__ */
|
|
28
|
-
className: "bg-muted col-span-2 h-2 overflow-hidden rounded-full",
|
|
29
|
-
children: /* @__PURE__ */ n("div", {
|
|
30
|
-
className: e("zen__meter-fill ease-out-soft h-full rounded-full transition-[width] duration-700",
|
|
31
|
-
style: { width: `${
|
|
32
|
-
})
|
|
27
|
+
/* @__PURE__ */ r("div", {
|
|
28
|
+
className: "bg-muted relative col-span-2 h-2 overflow-hidden rounded-full",
|
|
29
|
+
children: [/* @__PURE__ */ n("div", {
|
|
30
|
+
className: e("zen__meter-fill ease-out-soft h-full rounded-full transition-[width] duration-700", y === "danger" ? "bg-destructive shadow-[0_0_12px_oklch(var(--destructive)/calc(0.7*var(--glow-k)))]" : y === "warning" ? "bg-accent-foreground shadow-[0_0_12px_oklch(var(--accent-foreground)/calc(0.6*var(--glow-k)))]" : "from-primary to-glow-2 bg-gradient-to-r shadow-[0_0_12px_oklch(var(--glow)/calc(0.6*var(--glow-k)))]"),
|
|
31
|
+
style: { width: `${v}%` }
|
|
32
|
+
}), f?.map((e) => /* @__PURE__ */ n("span", {
|
|
33
|
+
"aria-hidden": !0,
|
|
34
|
+
"data-reached": i >= e || void 0,
|
|
35
|
+
className: "zen__meter-mark bg-tint/25 data-reached:bg-background/70 absolute inset-y-0 w-0.5 -translate-x-1/2 transition-colors duration-700",
|
|
36
|
+
style: { left: `${a > 0 ? Math.min(100, e / a * 100) : 0}%` }
|
|
37
|
+
}, e))]
|
|
33
38
|
}),
|
|
34
39
|
c && /* @__PURE__ */ n("span", {
|
|
35
|
-
className: e("col-span-2 text-xs",
|
|
40
|
+
className: e("col-span-2 text-xs", y === "danger" ? "text-destructive" : "text-muted-foreground"),
|
|
36
41
|
children: c
|
|
37
42
|
})
|
|
38
43
|
]
|
|
@@ -3,9 +3,9 @@ import { Money } from '../utils/money';
|
|
|
3
3
|
import { ChangeEvent, ComponentProps, KeyboardEvent, ReactNode } from 'react';
|
|
4
4
|
/**
|
|
5
5
|
* Amount input in one currency. Shows grouped digits for the locale (1,52,000
|
|
6
|
-
* for en-IN) and accepts shorthand: 1.5L, 2cr, 10k, 1.2m
|
|
7
|
-
* Enter; Escape reverts. Values are integer minor
|
|
8
|
-
* when empty.
|
|
6
|
+
* for en-IN) and accepts shorthand: 1.5L, 2cr, 10k, 1.2m, and sums: 120+45.50,
|
|
7
|
+
* 3*12.99. Commits on blur or Enter; Escape reverts. Values are integer minor
|
|
8
|
+
* units (paise, cents), or null when empty.
|
|
9
9
|
*
|
|
10
10
|
* With `convert`, the symbol becomes a currency switch: type an amount in e.g.
|
|
11
11
|
* USD and it's converted at the rates you load (in the browser; the amount is
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ComponentProps } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* The page's content, which changes between pages: wrap your route's outlet in
|
|
4
|
+
* it, and when the router changes page in a view transition (React Router's
|
|
5
|
+
* `viewTransition`, or document.startViewTransition yourself) the old page
|
|
6
|
+
* fades out as the new one rises in, while everything outside (header, nav)
|
|
7
|
+
* stays still. One per page.
|
|
8
|
+
*/
|
|
9
|
+
export default function PageTransition({ className, style, ...rest }: ComponentProps<'div'>): import('react').JSX.Element;
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/page-transition/index.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAEvC;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,EAAE,cAAc,CAAC,KAAK,CAAC,+BAQ1F"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cx as e } from "../utils/cx.js";
|
|
3
|
+
import { jsx as t } from "react/jsx-runtime";
|
|
4
|
+
//#region packages/page-transition/index.tsx
|
|
5
|
+
function n({ className: n, style: r, ...i }) {
|
|
6
|
+
return /* @__PURE__ */ t("div", {
|
|
7
|
+
className: e("zen__page-transition", n),
|
|
8
|
+
style: {
|
|
9
|
+
viewTransitionName: "zen-page",
|
|
10
|
+
...r
|
|
11
|
+
},
|
|
12
|
+
...i
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
//#endregion
|
|
16
|
+
export { n as default };
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { ReactNode } from 'react';
|
|
2
|
-
/**
|
|
2
|
+
/**
|
|
3
|
+
* Circular progress, 0–1, with optional content in the middle. Reaching 1
|
|
4
|
+
* while shown sends out a ring of glow, once.
|
|
5
|
+
*/
|
|
3
6
|
export default function ProgressRing({ value, size, stroke, label, children, className }: ProgressRingProps): import('react').JSX.Element;
|
|
4
7
|
export interface ProgressRingProps {
|
|
5
8
|
/** Progress from 0 to 1; values outside are clamped. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/progress-ring/index.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/progress-ring/index.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAY,MAAM,OAAO,CAAC;AAE5C;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EAAE,KAAK,EAAE,IAAS,EAAE,MAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,iBAAiB,+BAqDnH;AAED,MAAM,WAAW,iBAAiB;IAC9B,wDAAwD;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB"}
|
|
@@ -1,49 +1,58 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { cx as e } from "../utils/cx.js";
|
|
3
|
-
import {
|
|
3
|
+
import { useState as t } from "react";
|
|
4
|
+
import { jsx as n, jsxs as r } from "react/jsx-runtime";
|
|
4
5
|
//#region packages/progress-ring/index.tsx
|
|
5
|
-
function
|
|
6
|
-
let
|
|
7
|
-
return /* @__PURE__ */
|
|
6
|
+
function i({ value: i, size: a = 84, stroke: o = 7, label: s, children: c, className: l }) {
|
|
7
|
+
let u = (a - o) / 2, d = 2 * Math.PI * u, f = Math.min(Math.max(i, 0), 1), [p, m] = t(f), [h, g] = t(0);
|
|
8
|
+
return f !== p && (m(f), p < 1 && f === 1 && g(h + 1)), /* @__PURE__ */ r("div", {
|
|
8
9
|
role: "progressbar",
|
|
9
|
-
"aria-label":
|
|
10
|
+
"aria-label": s,
|
|
10
11
|
"aria-valuemin": 0,
|
|
11
12
|
"aria-valuemax": 100,
|
|
12
|
-
"aria-valuenow": Math.round(
|
|
13
|
-
className: e("zen__progress-ring relative grid shrink-0 place-items-center",
|
|
13
|
+
"aria-valuenow": Math.round(f * 100),
|
|
14
|
+
className: e("zen__progress-ring relative grid shrink-0 place-items-center", l),
|
|
14
15
|
style: {
|
|
15
|
-
width:
|
|
16
|
-
height:
|
|
16
|
+
width: a,
|
|
17
|
+
height: a
|
|
17
18
|
},
|
|
18
|
-
children: [
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
19
|
+
children: [
|
|
20
|
+
/* @__PURE__ */ r("svg", {
|
|
21
|
+
width: a,
|
|
22
|
+
height: a,
|
|
23
|
+
viewBox: `0 0 ${a} ${a}`,
|
|
24
|
+
className: "-rotate-90",
|
|
25
|
+
"aria-hidden": !0,
|
|
26
|
+
children: [/* @__PURE__ */ n("circle", {
|
|
27
|
+
cx: a / 2,
|
|
28
|
+
cy: a / 2,
|
|
29
|
+
r: u,
|
|
30
|
+
fill: "none",
|
|
31
|
+
strokeWidth: o,
|
|
32
|
+
className: "stroke-tint/[0.07]"
|
|
33
|
+
}), /* @__PURE__ */ n("circle", {
|
|
34
|
+
cx: a / 2,
|
|
35
|
+
cy: a / 2,
|
|
36
|
+
r: u,
|
|
37
|
+
fill: "none",
|
|
38
|
+
strokeWidth: o,
|
|
39
|
+
strokeLinecap: "round",
|
|
40
|
+
strokeDasharray: d,
|
|
41
|
+
strokeDashoffset: d * (1 - f),
|
|
42
|
+
className: "zen__progress-ring-arc stroke-primary [filter:drop-shadow(0_0_6px_oklch(var(--glow)/calc(0.45*var(--glow-k))))] transition-[stroke-dashoffset] duration-700 ease-out"
|
|
43
|
+
})]
|
|
44
|
+
}),
|
|
45
|
+
h > 0 && /* @__PURE__ */ n("span", {
|
|
46
|
+
"aria-hidden": !0,
|
|
47
|
+
className: "zen__ring-burst border-primary pointer-events-none absolute inset-0 rounded-full",
|
|
48
|
+
style: { borderWidth: o }
|
|
49
|
+
}, h),
|
|
50
|
+
/* @__PURE__ */ n("div", {
|
|
51
|
+
className: "absolute inset-0 grid place-items-center text-center",
|
|
52
|
+
children: c
|
|
53
|
+
})
|
|
54
|
+
]
|
|
46
55
|
});
|
|
47
56
|
}
|
|
48
57
|
//#endregion
|
|
49
|
-
export {
|
|
58
|
+
export { i as default };
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Two thumbs on one track, for a span such as an amount from $50 to $500:
|
|
3
|
+
* two native range inputs (keyboard, forms and screen readers work as on
|
|
4
|
+
* Slider), the span between them filled. The thumbs can meet but not cross.
|
|
5
|
+
*/
|
|
6
|
+
export default function RangeSlider({ value: [low, high], min, max, step, onValueChange, onValueCommit, label, thumbLabels, valueText, disabled, className, }: RangeSliderProps): import('react').JSX.Element;
|
|
7
|
+
export interface RangeSliderProps {
|
|
8
|
+
/** The span, low then high. */
|
|
9
|
+
value: readonly [number, number];
|
|
10
|
+
min?: number;
|
|
11
|
+
max?: number;
|
|
12
|
+
step?: number;
|
|
13
|
+
/** While dragging (every step). */
|
|
14
|
+
onValueChange?: (value: [number, number]) => void;
|
|
15
|
+
/** Once the user lets go: the moment to save or filter. */
|
|
16
|
+
onValueCommit?: (value: [number, number]) => void;
|
|
17
|
+
/** Accessible name of the pair, e.g. "Amount". */
|
|
18
|
+
label: string;
|
|
19
|
+
/** Each thumb's name (default "Minimum", "Maximum"). */
|
|
20
|
+
thumbLabels?: readonly [string, string];
|
|
21
|
+
/** Spoken value of a thumb, e.g. (v) => `$${v}`. */
|
|
22
|
+
valueText?: (value: number) => string;
|
|
23
|
+
disabled?: boolean;
|
|
24
|
+
className?: string;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/range-slider/index.tsx"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,EAChC,KAAK,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,EAClB,GAAO,EACP,GAAS,EACT,IAAQ,EACR,aAAa,EACb,aAAa,EACb,KAAK,EACL,WAAoC,EACpC,SAAS,EACT,QAAQ,EACR,SAAS,GACZ,EAAE,gBAAgB,+BAiDlB;AAED,MAAM,WAAW,gBAAgB;IAC7B,+BAA+B;IAC/B,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC;IAClD,2DAA2D;IAC3D,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC;IAClD,kDAAkD;IAClD,KAAK,EAAE,MAAM,CAAC;IACd,wDAAwD;IACxD,WAAW,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,oDAAoD;IACpD,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cx as e } from "../utils/cx.js";
|
|
3
|
+
import { THUMB as t } from "../slider/index.js";
|
|
4
|
+
import { jsx as n, jsxs as r } from "react/jsx-runtime";
|
|
5
|
+
//#region packages/range-slider/index.tsx
|
|
6
|
+
function i({ value: [i, a], min: o = 0, max: s = 100, step: c = 1, onValueChange: l, onValueCommit: u, label: d, thumbLabels: f = ["Minimum", "Maximum"], valueText: p, disabled: m, className: h }) {
|
|
7
|
+
let g = (e) => s > o ? (e - o) / (s - o) * 100 : 0, _ = [{
|
|
8
|
+
value: i,
|
|
9
|
+
set: (e) => [Math.min(e, a), a]
|
|
10
|
+
}, {
|
|
11
|
+
value: a,
|
|
12
|
+
set: (e) => [i, Math.max(e, i)]
|
|
13
|
+
}];
|
|
14
|
+
return /* @__PURE__ */ r("div", {
|
|
15
|
+
role: "group",
|
|
16
|
+
"aria-label": d,
|
|
17
|
+
className: e("zen__range-slider relative h-5 w-full", m && "opacity-50", h),
|
|
18
|
+
style: { "--zen-thumb": "oklch(var(--primary))" },
|
|
19
|
+
children: [/* @__PURE__ */ n("div", {
|
|
20
|
+
"aria-hidden": !0,
|
|
21
|
+
className: "absolute inset-x-0 top-1/2 h-2.5 -translate-y-1/2 rounded-full",
|
|
22
|
+
style: { background: `linear-gradient(to right, oklch(var(--muted)) ${g(i)}%, oklch(var(--primary)) ${g(i)}% ${g(a)}%, oklch(var(--muted)) ${g(a)}%)` }
|
|
23
|
+
}), _.map((r, d) => /* @__PURE__ */ n("input", {
|
|
24
|
+
type: "range",
|
|
25
|
+
min: o,
|
|
26
|
+
max: s,
|
|
27
|
+
step: c,
|
|
28
|
+
value: r.value,
|
|
29
|
+
disabled: m,
|
|
30
|
+
"aria-label": f[d],
|
|
31
|
+
"aria-valuetext": p?.(r.value),
|
|
32
|
+
onChange: (e) => {
|
|
33
|
+
let [t, n] = r.set(Number(e.target.value));
|
|
34
|
+
l?.([t, n]);
|
|
35
|
+
},
|
|
36
|
+
onPointerUp: () => u?.([i, a]),
|
|
37
|
+
onKeyUp: () => u?.([i, a]),
|
|
38
|
+
style: { zIndex: d === 0 && i > (o + s) / 2 ? 2 : 1 },
|
|
39
|
+
className: e("pointer-events-none absolute inset-0 h-5 w-full cursor-pointer appearance-none bg-transparent outline-hidden disabled:cursor-not-allowed", "[&::-webkit-slider-runnable-track]:h-2.5 [&::-moz-range-track]:h-2.5 [&::-moz-range-track]:bg-transparent", "[&::-webkit-slider-thumb]:pointer-events-auto [&::-moz-range-thumb]:pointer-events-auto", t)
|
|
40
|
+
}, d))]
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
//#endregion
|
|
44
|
+
export { i as default };
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { DateString } from '../utils/date';
|
|
2
|
+
import { Repeat } from '../utils/repeat';
|
|
3
|
+
/**
|
|
4
|
+
* How often something recurs, e.g. a bill: every n days, weeks, months or
|
|
5
|
+
* years, on chosen weekdays or a day of the month. Says what it means in
|
|
6
|
+
* words, and with a `start` date, the next few dates it falls on.
|
|
7
|
+
*/
|
|
8
|
+
export default function RepeatPicker({ value, onChange, locale, start, weekStartsOn, label, className, }: RepeatPickerProps): import('react').JSX.Element;
|
|
9
|
+
export interface RepeatPickerProps {
|
|
10
|
+
value: Repeat;
|
|
11
|
+
onChange: (value: Repeat) => void;
|
|
12
|
+
/** For weekday and date names, and the week's first day. */
|
|
13
|
+
locale: string;
|
|
14
|
+
/** When it starts: its weekday and day of the month are the defaults, and the next dates are shown. */
|
|
15
|
+
start?: DateString;
|
|
16
|
+
/** 0 for Sunday … 6. Defaults to the locale's. */
|
|
17
|
+
weekStartsOn?: number;
|
|
18
|
+
/** The group's name for screen readers (default "Repeats"). */
|
|
19
|
+
label?: string;
|
|
20
|
+
className?: string;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/repeat-picker/index.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,UAAU,EAAkD,MAAM,iBAAiB,CAAC;AAClG,OAAO,EAAmC,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAKjF;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EACjC,KAAK,EACL,QAAQ,EACR,MAAM,EACN,KAAK,EACL,YAAgC,EAChC,KAAiB,EACjB,SAAS,GACZ,EAAE,iBAAiB,+BA4FnB;AAED,MAAM,WAAW,iBAAiB;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,4DAA4D;IAC5D,MAAM,EAAE,MAAM,CAAC;IACf,uGAAuG;IACvG,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,kDAAkD;IAClD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+DAA+D;IAC/D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB"}
|