@nar-bus/ui-kit 1.9.0 → 1.11.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/Button-DsTGnChX.js +3222 -0
- package/dist/atoms/Tooltip.d.ts.map +1 -1
- package/dist/i18n/en.json.d.ts +10 -0
- package/dist/i18n/resources.d.ts +20 -0
- package/dist/i18n/resources.d.ts.map +1 -1
- package/dist/i18n/resources.js +1 -1
- package/dist/i18n/tr.json.d.ts +10 -0
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3462 -6140
- package/dist/map.d.ts +7 -0
- package/dist/map.d.ts.map +1 -0
- package/dist/map.js +174 -0
- package/dist/molecules/IconCell.d.ts +28 -0
- package/dist/molecules/IconCell.d.ts.map +1 -0
- package/dist/molecules/TextCell.d.ts +3 -1
- package/dist/molecules/TextCell.d.ts.map +1 -1
- package/dist/molecules/index.d.ts +1 -0
- package/dist/molecules/index.d.ts.map +1 -1
- package/dist/organisms/EditableGrid/EditableGrid.d.ts +111 -0
- package/dist/organisms/EditableGrid/EditableGrid.d.ts.map +1 -0
- package/dist/organisms/EditableGrid/EditableGridCell.d.ts +28 -0
- package/dist/organisms/EditableGrid/EditableGridCell.d.ts.map +1 -0
- package/dist/organisms/EditableGrid/index.d.ts +4 -0
- package/dist/organisms/EditableGrid/index.d.ts.map +1 -0
- package/dist/organisms/EditableGrid/useEditableGridKeyboardNav.d.ts +38 -0
- package/dist/organisms/EditableGrid/useEditableGridKeyboardNav.d.ts.map +1 -0
- package/dist/organisms/MapLayerControl.d.ts +33 -0
- package/dist/organisms/MapLayerControl.d.ts.map +1 -0
- package/dist/organisms/MapLegend.d.ts +25 -0
- package/dist/organisms/MapLegend.d.ts.map +1 -0
- package/dist/organisms/MapShell.d.ts +64 -0
- package/dist/organisms/MapShell.d.ts.map +1 -0
- package/dist/organisms/index.d.ts +1 -0
- package/dist/organisms/index.d.ts.map +1 -1
- package/dist/resources-ksT-xLKO.js +50 -0
- package/dist/theme.css +1 -1
- package/dist/ui-kit.css +1 -1
- package/dist/utils/tooltipPosition.d.ts +51 -0
- package/dist/utils/tooltipPosition.d.ts.map +1 -0
- package/package.json +13 -2
- package/dist/resources-BuIFXmWZ.js +0 -46
package/dist/map.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { MapShell } from './organisms/MapShell';
|
|
2
|
+
export type { MapShellProps } from './organisms/MapShell';
|
|
3
|
+
export { MapLayerControl } from './organisms/MapLayerControl';
|
|
4
|
+
export type { MapLayerControlProps, MapLayerToggleItem } from './organisms/MapLayerControl';
|
|
5
|
+
export { MapLegend } from './organisms/MapLegend';
|
|
6
|
+
export type { MapLegendProps, MapLegendEntry } from './organisms/MapLegend';
|
|
7
|
+
//# sourceMappingURL=map.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map.d.ts","sourceRoot":"","sources":["../src/map.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,YAAY,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAC5F,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC"}
|
package/dist/map.js
ADDED
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { jsx as t, jsxs as m } from "react/jsx-runtime";
|
|
2
|
+
import { useRef as f, useState as D, useEffect as U } from "react";
|
|
3
|
+
import { useTranslation as T } from "react-i18next";
|
|
4
|
+
import { a as h, B as V } from "./Button-DsTGnChX.js";
|
|
5
|
+
function X() {
|
|
6
|
+
if (typeof document > "u") return !1;
|
|
7
|
+
try {
|
|
8
|
+
const e = document.createElement("canvas");
|
|
9
|
+
return !!(e.getContext("webgl2") || e.getContext("webgl"));
|
|
10
|
+
} catch {
|
|
11
|
+
return !1;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function Y() {
|
|
15
|
+
const { t: e } = T();
|
|
16
|
+
return /* @__PURE__ */ m(
|
|
17
|
+
"div",
|
|
18
|
+
{
|
|
19
|
+
role: "status",
|
|
20
|
+
className: "flex h-full w-full flex-col items-center justify-center px-8 py-10 text-center",
|
|
21
|
+
children: [
|
|
22
|
+
/* @__PURE__ */ t("h3", { className: "mb-3 text-[length:var(--font-base)] font-medium text-[var(--color-text-primary)]", children: e("map_shell.webglTitle") }),
|
|
23
|
+
/* @__PURE__ */ t("p", { className: "max-w-md text-[length:var(--font-sm)] text-[var(--color-text-muted)]", children: e("map_shell.webglBody") })
|
|
24
|
+
]
|
|
25
|
+
}
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
function Z({
|
|
29
|
+
style: e,
|
|
30
|
+
bounds: r,
|
|
31
|
+
fitBoundsPadding: c = 24,
|
|
32
|
+
interactive: u = !1,
|
|
33
|
+
preserveDrawingBuffer: a = !0,
|
|
34
|
+
glyphs: x,
|
|
35
|
+
onMapReady: g,
|
|
36
|
+
preMapInit: d,
|
|
37
|
+
webglFallback: k,
|
|
38
|
+
loadingOverlay: p,
|
|
39
|
+
isLoading: b = !1,
|
|
40
|
+
className: R,
|
|
41
|
+
children: G,
|
|
42
|
+
"data-testid": j
|
|
43
|
+
}) {
|
|
44
|
+
const S = f(null), y = f(null), [H, E] = D(!1), [z] = D(X), M = f(e);
|
|
45
|
+
M.current = e;
|
|
46
|
+
const w = f(g);
|
|
47
|
+
w.current = g;
|
|
48
|
+
const N = f(d);
|
|
49
|
+
N.current = d;
|
|
50
|
+
const l = f({ bounds: r, fitBoundsPadding: c, interactive: u, preserveDrawingBuffer: a, glyphs: x });
|
|
51
|
+
return l.current = { bounds: r, fitBoundsPadding: c, interactive: u, preserveDrawingBuffer: a, glyphs: x }, U(() => {
|
|
52
|
+
if (!z) return;
|
|
53
|
+
const C = S.current;
|
|
54
|
+
if (!C) return;
|
|
55
|
+
let B = !1, n, v, A = 0, L;
|
|
56
|
+
return (async () => {
|
|
57
|
+
var W;
|
|
58
|
+
const F = await import("maplibre-gl"), J = F.default;
|
|
59
|
+
if (B) return;
|
|
60
|
+
(W = N.current) == null || W.call(N, F);
|
|
61
|
+
const s = l.current, K = s.glyphs ? { ...M.current, glyphs: s.glyphs } : M.current;
|
|
62
|
+
n = new J.Map({
|
|
63
|
+
container: C,
|
|
64
|
+
style: K,
|
|
65
|
+
interactive: s.interactive,
|
|
66
|
+
attributionControl: !1,
|
|
67
|
+
canvasContextAttributes: { preserveDrawingBuffer: s.preserveDrawingBuffer },
|
|
68
|
+
...s.bounds ? { bounds: s.bounds, fitBoundsOptions: { padding: s.fitBoundsPadding, animate: !1 } } : {}
|
|
69
|
+
}), y.current = n;
|
|
70
|
+
let _ = !1;
|
|
71
|
+
const P = () => {
|
|
72
|
+
_ = !0;
|
|
73
|
+
};
|
|
74
|
+
s.interactive && (n.on("dragstart", P), n.on("zoomstart", P)), n.on("load", () => {
|
|
75
|
+
var i;
|
|
76
|
+
B || (E(!0), A = requestAnimationFrame(() => {
|
|
77
|
+
const o = y.current;
|
|
78
|
+
if (B || !o) return;
|
|
79
|
+
const q = o.getCanvas();
|
|
80
|
+
q.width > 0 && q.height > 0 && (o.resize(), l.current.bounds && o.fitBounds(l.current.bounds, {
|
|
81
|
+
padding: l.current.fitBoundsPadding,
|
|
82
|
+
animate: !1
|
|
83
|
+
}), o.triggerRepaint());
|
|
84
|
+
}), L = (i = w.current) == null ? void 0 : i.call(w, n));
|
|
85
|
+
});
|
|
86
|
+
const Q = () => {
|
|
87
|
+
const i = y.current;
|
|
88
|
+
if (!i) return;
|
|
89
|
+
i.resize();
|
|
90
|
+
const o = i.getCanvas();
|
|
91
|
+
!_ && l.current.bounds && o.width > 0 && o.height > 0 && i.fitBounds(l.current.bounds, {
|
|
92
|
+
padding: l.current.fitBoundsPadding,
|
|
93
|
+
animate: !1
|
|
94
|
+
});
|
|
95
|
+
};
|
|
96
|
+
v = new ResizeObserver(Q), v.observe(C.parentElement ?? C);
|
|
97
|
+
})(), () => {
|
|
98
|
+
B = !0, A && cancelAnimationFrame(A), typeof L == "function" && L(), v == null || v.disconnect(), n == null || n.remove(), y.current = null, E(!1);
|
|
99
|
+
};
|
|
100
|
+
}, [z]), z ? /* @__PURE__ */ m("div", { className: h("map-shell relative h-full w-full", R), "data-testid": j, children: [
|
|
101
|
+
/* @__PURE__ */ t("div", { ref: S, className: "absolute inset-0" }),
|
|
102
|
+
(b || !H) && p ? /* @__PURE__ */ t("div", { className: "pointer-events-none absolute inset-0 z-10 flex items-center justify-center", children: p }) : null,
|
|
103
|
+
G
|
|
104
|
+
] }) : /* @__PURE__ */ t("div", { className: h("map-shell h-full w-full", R), "data-testid": j, children: k ?? /* @__PURE__ */ t(Y, {}) });
|
|
105
|
+
}
|
|
106
|
+
Z.displayName = "MapShell";
|
|
107
|
+
function $({
|
|
108
|
+
items: e,
|
|
109
|
+
activeId: r,
|
|
110
|
+
onChange: c,
|
|
111
|
+
className: u,
|
|
112
|
+
ariaLabel: a,
|
|
113
|
+
children: x
|
|
114
|
+
}) {
|
|
115
|
+
const { t: g } = T();
|
|
116
|
+
return /* @__PURE__ */ m(
|
|
117
|
+
"div",
|
|
118
|
+
{
|
|
119
|
+
role: "group",
|
|
120
|
+
"aria-label": a ?? g("map_shell.layerControl"),
|
|
121
|
+
className: h("flex flex-wrap items-center gap-[var(--space-2)]", u),
|
|
122
|
+
children: [
|
|
123
|
+
e.map(({ id: d, label: k, icon: p }) => {
|
|
124
|
+
const b = d === r;
|
|
125
|
+
return /* @__PURE__ */ m(
|
|
126
|
+
V,
|
|
127
|
+
{
|
|
128
|
+
variant: "ghost",
|
|
129
|
+
size: "sm",
|
|
130
|
+
"aria-pressed": b,
|
|
131
|
+
onClick: () => c(d),
|
|
132
|
+
className: h(
|
|
133
|
+
"h-auto rounded-[var(--radius-xs)] px-3 py-1.5 font-mono text-[length:var(--font-sm)] tracking-[0.16em] uppercase",
|
|
134
|
+
b ? "border border-[var(--color-primary)] bg-[var(--color-primary-subtle)] text-[var(--color-primary)]" : "border border-transparent text-[var(--color-text-muted)]"
|
|
135
|
+
),
|
|
136
|
+
children: [
|
|
137
|
+
p ? /* @__PURE__ */ t(p, { className: "mr-1.5 inline-block h-3.5 w-3.5" }) : null,
|
|
138
|
+
k
|
|
139
|
+
]
|
|
140
|
+
},
|
|
141
|
+
d
|
|
142
|
+
);
|
|
143
|
+
}),
|
|
144
|
+
x
|
|
145
|
+
]
|
|
146
|
+
}
|
|
147
|
+
);
|
|
148
|
+
}
|
|
149
|
+
$.displayName = "MapLayerControl";
|
|
150
|
+
function O({ color: e, label: r }) {
|
|
151
|
+
return /* @__PURE__ */ m("div", { className: "flex items-center gap-1", children: [
|
|
152
|
+
/* @__PURE__ */ t(
|
|
153
|
+
"span",
|
|
154
|
+
{
|
|
155
|
+
className: "inline-block h-3 w-3 rounded-[var(--radius-xs)]",
|
|
156
|
+
style: { backgroundColor: e, opacity: 0.82 }
|
|
157
|
+
}
|
|
158
|
+
),
|
|
159
|
+
/* @__PURE__ */ t("span", { className: "font-mono text-[10px] text-[var(--color-text-muted)]", children: r })
|
|
160
|
+
] });
|
|
161
|
+
}
|
|
162
|
+
function I({ entries: e, noData: r, label: c, className: u }) {
|
|
163
|
+
return /* @__PURE__ */ m("div", { className: h("flex flex-wrap items-center gap-[var(--space-3)]", u), children: [
|
|
164
|
+
c ? /* @__PURE__ */ t("span", { className: "font-mono text-[10px] tracking-[0.12em] text-[var(--color-text-muted)] uppercase", children: c }) : null,
|
|
165
|
+
e.map((a) => /* @__PURE__ */ t(O, { color: a.color, label: a.label }, a.label)),
|
|
166
|
+
r ? /* @__PURE__ */ t(O, { color: r.color, label: r.label }) : null
|
|
167
|
+
] });
|
|
168
|
+
}
|
|
169
|
+
I.displayName = "MapLegend";
|
|
170
|
+
export {
|
|
171
|
+
$ as MapLayerControl,
|
|
172
|
+
I as MapLegend,
|
|
173
|
+
Z as MapShell
|
|
174
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
export interface IconCellProps {
|
|
3
|
+
/** Leading visual — a lucide icon, a color-dot `<span>`, a small badge, etc. */
|
|
4
|
+
icon: ReactNode;
|
|
5
|
+
/** Primary content (usually the entity name/label). */
|
|
6
|
+
label: ReactNode;
|
|
7
|
+
/** Optional secondary line under the label (code / id / type), muted + `--font-xs`. */
|
|
8
|
+
secondary?: ReactNode;
|
|
9
|
+
/**
|
|
10
|
+
* Optional caller-supplied CSS color applied to the icon wrapper, so
|
|
11
|
+
* `currentColor`-based icons (lucide) pick it up — the data-driven tint case
|
|
12
|
+
* (e.g. a tag's own color). Mirrors the `DetailSection.accentColor` pattern.
|
|
13
|
+
*/
|
|
14
|
+
iconColor?: string;
|
|
15
|
+
/** Truncate the label (adds a title tooltip when `label` is a string). */
|
|
16
|
+
truncate?: boolean;
|
|
17
|
+
className?: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Icon + label (+ optional secondary line) cell for table columns — the
|
|
21
|
+
* sibling of `TextCell`/`BadgeCell`/`AvatarCell`. Generalizes the hand-rolled
|
|
22
|
+
* "leading-icon entity cell" (a colored icon + name, or a color-dot swatch +
|
|
23
|
+
* label) so consumers drop their local versions. Pure-presentation: the icon,
|
|
24
|
+
* label and secondary are all caller-supplied nodes; `iconColor` is a caller
|
|
25
|
+
* CSS color.
|
|
26
|
+
*/
|
|
27
|
+
export declare const IconCell: import('react').ForwardRefExoticComponent<IconCellProps & import('react').RefAttributes<HTMLDivElement>>;
|
|
28
|
+
//# sourceMappingURL=IconCell.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IconCell.d.ts","sourceRoot":"","sources":["../../src/molecules/IconCell.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGnD,MAAM,WAAW,aAAa;IAC5B,gFAAgF;IAChF,IAAI,EAAE,SAAS,CAAC;IAChB,uDAAuD;IACvD,KAAK,EAAE,SAAS,CAAC;IACjB,uFAAuF;IACvF,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,QAAQ,0GAoCpB,CAAC"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
export interface TextCellProps {
|
|
2
2
|
value: string | null | undefined;
|
|
3
3
|
variant?: "primary" | "secondary" | "muted";
|
|
4
|
+
/** Monospace figures — for codes, serials, IDs (composes with `variant`). */
|
|
5
|
+
mono?: boolean;
|
|
4
6
|
className?: string;
|
|
5
7
|
truncate?: boolean;
|
|
6
8
|
maxWidth?: string;
|
|
7
9
|
}
|
|
8
10
|
/** Standard text cell for table columns — null/undefined renders as "—". */
|
|
9
|
-
export declare function TextCell({ value, variant, className, truncate, maxWidth }: TextCellProps): import("react").JSX.Element;
|
|
11
|
+
export declare function TextCell({ value, variant, mono, className, truncate, maxWidth }: TextCellProps): import("react").JSX.Element;
|
|
10
12
|
//# sourceMappingURL=TextCell.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TextCell.d.ts","sourceRoot":"","sources":["../../src/molecules/TextCell.tsx"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACjC,OAAO,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,OAAO,CAAC;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAQD,4EAA4E;AAC5E,wBAAgB,QAAQ,CAAC,EAAE,KAAK,EAAE,OAAmB,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,aAAa,+
|
|
1
|
+
{"version":3,"file":"TextCell.d.ts","sourceRoot":"","sources":["../../src/molecules/TextCell.tsx"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACjC,OAAO,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,OAAO,CAAC;IAC5C,6EAA6E;IAC7E,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAQD,4EAA4E;AAC5E,wBAAgB,QAAQ,CAAC,EAAE,KAAK,EAAE,OAAmB,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,aAAa,+BAgB1G"}
|
|
@@ -19,6 +19,7 @@ export { MetricTile, type MetricTileProps, type MetricTileTone, type MetricTileS
|
|
|
19
19
|
export { SectionCard, type SectionCardProps } from './SectionCard';
|
|
20
20
|
export { Dropzone, type DropzoneProps, type FileRejection } from './Dropzone';
|
|
21
21
|
export { AvatarCell, type AvatarCellProps } from './AvatarCell';
|
|
22
|
+
export { IconCell, type IconCellProps } from './IconCell';
|
|
22
23
|
export { StateBlock, type StateBlockProps, type StateBlockState } from './StateBlock';
|
|
23
24
|
export { MonitoringCard, type MonitoringCardProps } from './MonitoringCard';
|
|
24
25
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/molecules/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,KAAK,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAClF,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,yBAAyB,EAAE,KAAK,gBAAgB,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AACjI,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,KAAK,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAC3F,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC/F,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AACrF,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,KAAK,gBAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAClI,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAC9E,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/molecules/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,KAAK,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAClF,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,yBAAyB,EAAE,KAAK,gBAAgB,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AACjI,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,KAAK,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAC3F,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC/F,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AACrF,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,KAAK,gBAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAClI,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAC9E,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
export interface EditableGridColumn {
|
|
3
|
+
/** Canonical column key — matches `EditableGridRow.cells` keys. */
|
|
4
|
+
key: string;
|
|
5
|
+
/** Header content (string or any node). */
|
|
6
|
+
label: ReactNode;
|
|
7
|
+
/**
|
|
8
|
+
* Accessible name for the cell editors of this column — required only when
|
|
9
|
+
* `label` is a non-string node (otherwise the string `label`, else `key`, is
|
|
10
|
+
* used).
|
|
11
|
+
*/
|
|
12
|
+
ariaLabel?: string;
|
|
13
|
+
/** Value semantics — drives the cell editor; NOT a domain enum. */
|
|
14
|
+
type: "STRING" | "NUMBER" | "DATE" | "DATETIME" | "ENUM";
|
|
15
|
+
required?: boolean;
|
|
16
|
+
/** Options when `type === "ENUM"`. */
|
|
17
|
+
enumValues?: string[];
|
|
18
|
+
/** Format placeholder shown in the cell (e.g. "MM.yyyy") — display only. */
|
|
19
|
+
hint?: string;
|
|
20
|
+
/**
|
|
21
|
+
* Optional value transform applied on blur/commit (e.g. TR decimal comma
|
|
22
|
+
* "1,5" → "1.5"). Default: identity — the grid never coerces, the consumer's
|
|
23
|
+
* backend owns parsing (legacy `strToNumber` parity).
|
|
24
|
+
*/
|
|
25
|
+
normalize?: (raw: string) => string;
|
|
26
|
+
}
|
|
27
|
+
export interface EditableGridRow {
|
|
28
|
+
/**
|
|
29
|
+
* STABLE identity — server `row_number` (review) or a client uuid assigned
|
|
30
|
+
* once at creation (compose). NEVER the array index (anti-pattern #2): status,
|
|
31
|
+
* errors and cell edits all map by `rowId`, so reorder/paginate can't skew them.
|
|
32
|
+
*/
|
|
33
|
+
rowId: string;
|
|
34
|
+
/** Column key → raw string value (no client-side type coercion). */
|
|
35
|
+
cells: Record<string, string>;
|
|
36
|
+
/** Row-level validation state — drives the trailing status column. */
|
|
37
|
+
status?: "pending" | "valid" | "invalid";
|
|
38
|
+
/** Row-level messages, surfaced in the status Popover. */
|
|
39
|
+
errors?: string[];
|
|
40
|
+
/** Caller-managed; the grid never sets it (consumer drives re-validate). */
|
|
41
|
+
dirty?: boolean;
|
|
42
|
+
}
|
|
43
|
+
/** Localized accessible names for the row-status indicator (§4 — no baked literals). */
|
|
44
|
+
export interface EditableGridStatusLabels {
|
|
45
|
+
pending?: string;
|
|
46
|
+
valid?: string;
|
|
47
|
+
invalid?: string;
|
|
48
|
+
}
|
|
49
|
+
export interface EditableGridProps {
|
|
50
|
+
columns: EditableGridColumn[];
|
|
51
|
+
rows: EditableGridRow[];
|
|
52
|
+
onRowsChange: (rows: EditableGridRow[]) => void;
|
|
53
|
+
/** Show an "add row" control (appends an empty row). */
|
|
54
|
+
allowRowAdd?: boolean;
|
|
55
|
+
/** Show a per-row delete control. */
|
|
56
|
+
allowRowDelete?: boolean;
|
|
57
|
+
/** Show a "clear all" control (empties every cell, keeps rows & rowIds). */
|
|
58
|
+
allowClear?: boolean;
|
|
59
|
+
/** Read-only grid: no cell edit, no add/delete/clear controls. */
|
|
60
|
+
readOnly?: boolean;
|
|
61
|
+
/** Column keys that are never editable even when the grid is editable. */
|
|
62
|
+
readOnlyColumns?: string[];
|
|
63
|
+
/**
|
|
64
|
+
* Per-cell validation, keyed rowId → columnKey → message. Independent of
|
|
65
|
+
* `row.status`/`row.errors`; tints the cell border + native title.
|
|
66
|
+
*/
|
|
67
|
+
cellErrors?: Record<string, Record<string, string>>;
|
|
68
|
+
/**
|
|
69
|
+
* Accessible labels for the row-status indicator, keyed by status. Supply
|
|
70
|
+
* localized text (e.g. `{ invalid: "Geçersiz" }`); when a status is absent
|
|
71
|
+
* here it falls back to a localized default from the ui-kit `common` bundle
|
|
72
|
+
* (`editablegrid.status_{pending,valid,invalid}`) — never a raw enum value.
|
|
73
|
+
*/
|
|
74
|
+
statusLabels?: EditableGridStatusLabels;
|
|
75
|
+
/**
|
|
76
|
+
* Scroll a specific row into view (acceptance-(c) "scroll-to-row"). Set to a
|
|
77
|
+
* `rowId` (e.g. the first invalid row after a validate pass); changing the
|
|
78
|
+
* value re-triggers the scroll.
|
|
79
|
+
*/
|
|
80
|
+
scrollToRowId?: string;
|
|
81
|
+
/** Force windowing on/off. Default: auto-on when `rows.length > virtualizeThreshold`. */
|
|
82
|
+
virtualized?: boolean;
|
|
83
|
+
/** Auto-virtualize above this row count (default 100). */
|
|
84
|
+
virtualizeThreshold?: number;
|
|
85
|
+
/** Estimated row height (px) for the virtualizer (default 40). */
|
|
86
|
+
rowHeight?: number;
|
|
87
|
+
/** Scroll viewport height used when virtualizing (default 480). */
|
|
88
|
+
maxHeight?: number | string;
|
|
89
|
+
/** Cap enforced by add-row AND paste-append (overflow dropped). */
|
|
90
|
+
maxRows?: number;
|
|
91
|
+
/**
|
|
92
|
+
* Called when a **paste** appends rows past `maxRows`, with the number of
|
|
93
|
+
* dropped rows. (Add-row is prevented up front by disabling the button at the
|
|
94
|
+
* cap, so it never reports here.)
|
|
95
|
+
*/
|
|
96
|
+
onMaxRowsExceeded?: (droppedCount: number) => void;
|
|
97
|
+
addRowLabel?: ReactNode;
|
|
98
|
+
emptyState?: ReactNode;
|
|
99
|
+
className?: string;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* EditableGrid — spreadsheet-style, controlled, prop-driven data-entry organism
|
|
103
|
+
* (GAP-EDITGRID). Composition of ui-kit `Table`/`Input`/`Badge`/`Popover`
|
|
104
|
+
* primitives — no third-party grid, no package fork (ADR-010).
|
|
105
|
+
*
|
|
106
|
+
* Fully generic (§13): the same API serves MDM's bulk-entry (compose/review) and
|
|
107
|
+
* any other consumer's manual-entry grid — domain vocabulary maps onto generic
|
|
108
|
+
* capability flags + typed columns, never leaks into this contract.
|
|
109
|
+
*/
|
|
110
|
+
export declare const EditableGrid: import('react').ForwardRefExoticComponent<EditableGridProps & import('react').RefAttributes<HTMLTableElement>>;
|
|
111
|
+
//# sourceMappingURL=EditableGrid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EditableGrid.d.ts","sourceRoot":"","sources":["../../../src/organisms/EditableGrid/EditableGrid.tsx"],"names":[],"mappings":"AAAA,OAAO,EASL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAYf,MAAM,WAAW,kBAAkB;IACjC,mEAAmE;IACnE,GAAG,EAAE,MAAM,CAAC;IACZ,2CAA2C;IAC3C,KAAK,EAAE,SAAS,CAAC;IACjB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,CAAC;IACzD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,sCAAsC;IACtC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,4EAA4E;IAC5E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,eAAe;IAC9B;;;;OAIG;IACH,KAAK,EAAE,MAAM,CAAC;IACd,oEAAoE;IACpE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,sEAAsE;IACtE,MAAM,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;IACzC,0DAA0D;IAC1D,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wFAAwF;AACxF,MAAM,WAAW,wBAAwB;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,IAAI,EAAE,eAAe,EAAE,CAAC;IACxB,YAAY,EAAE,CAAC,IAAI,EAAE,eAAe,EAAE,KAAK,IAAI,CAAC;IAEhD,wDAAwD;IACxD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,qCAAqC;IACrC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,4EAA4E;IAC5E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,0EAA0E;IAC1E,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAE3B;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAEpD;;;;;OAKG;IACH,YAAY,CAAC,EAAE,wBAAwB,CAAC;IAExC;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,yFAAyF;IACzF,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,0DAA0D;IAC1D,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAE5B,mEAAmE;IACnE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,UAAU,CAAC,EAAE,SAAS,CAAC;IAEvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAcD;;;;;;;;GAQG;AACH,eAAO,MAAM,YAAY,gHAgXxB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { ClipboardEvent, KeyboardEvent } from 'react';
|
|
2
|
+
import { EditableGridColumn } from './EditableGrid';
|
|
3
|
+
export interface EditableGridCellProps {
|
|
4
|
+
column: EditableGridColumn;
|
|
5
|
+
value: string;
|
|
6
|
+
/** Per-cell validation message (from `cellErrors[rowId][column.key]`). */
|
|
7
|
+
error?: string;
|
|
8
|
+
disabled?: boolean;
|
|
9
|
+
onChange: (value: string) => void;
|
|
10
|
+
refCb: (el: HTMLInputElement | HTMLSelectElement | null) => void;
|
|
11
|
+
onKeyDown: (e: KeyboardEvent<HTMLInputElement | HTMLSelectElement>) => void;
|
|
12
|
+
onPaste: (e: ClipboardEvent<HTMLInputElement | HTMLSelectElement>) => void;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* EditableGridCell — one type-aware editable cell.
|
|
16
|
+
*
|
|
17
|
+
* Values are ALWAYS raw strings (backend owns parsing — legacy `strToNumber`
|
|
18
|
+
* parity + MDM G1 `cells: Record<string,string>`); no client-side coercion.
|
|
19
|
+
* `column.normalize` (e.g. TR "1,5"→"1.5") is applied on blur (commit), not on
|
|
20
|
+
* every keystroke, so it never fights the user mid-type.
|
|
21
|
+
*
|
|
22
|
+
* Accessibility: every cell carries an accessible name (`column.ariaLabel`, else
|
|
23
|
+
* a string `column.label`, else `column.key`) so screen readers announce the
|
|
24
|
+
* field; a per-cell `error` sets `aria-invalid`, tints the border, and is linked
|
|
25
|
+
* via `aria-describedby` to a visually-hidden message.
|
|
26
|
+
*/
|
|
27
|
+
export declare function EditableGridCell({ column, value, error, disabled, onChange, refCb, onKeyDown, onPaste, }: EditableGridCellProps): import("react").JSX.Element;
|
|
28
|
+
//# sourceMappingURL=EditableGridCell.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EditableGridCell.d.ts","sourceRoot":"","sources":["../../../src/organisms/EditableGrid/EditableGridCell.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAGvE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEzD,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,kBAAkB,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,0EAA0E;IAC1E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,KAAK,EAAE,CAAC,EAAE,EAAE,gBAAgB,GAAG,iBAAiB,GAAG,IAAI,KAAK,IAAI,CAAC;IACjE,SAAS,EAAE,CAAC,CAAC,EAAE,aAAa,CAAC,gBAAgB,GAAG,iBAAiB,CAAC,KAAK,IAAI,CAAC;IAC5E,OAAO,EAAE,CAAC,CAAC,EAAE,cAAc,CAAC,gBAAgB,GAAG,iBAAiB,CAAC,KAAK,IAAI,CAAC;CAC5E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,MAAM,EACN,KAAK,EACL,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,KAAK,EACL,SAAS,EACT,OAAO,GACR,EAAE,qBAAqB,+BA6EvB"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { EditableGrid } from './EditableGrid';
|
|
2
|
+
export type { EditableGridProps, EditableGridColumn, EditableGridRow, EditableGridStatusLabels, } from './EditableGrid';
|
|
3
|
+
export { EditableGridCell, type EditableGridCellProps } from './EditableGridCell';
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/organisms/EditableGrid/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EACV,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,wBAAwB,GACzB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,KAAK,qBAAqB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { KeyboardEvent } from 'react';
|
|
2
|
+
export interface EditableGridKeyboardNavOptions {
|
|
3
|
+
/** Whether a column accepts focus/edit — read-only columns are skipped by nav. */
|
|
4
|
+
isColumnEditable: (colKey: string) => boolean;
|
|
5
|
+
/**
|
|
6
|
+
* Bring a row into view before focusing it (virtualized mode) — typically
|
|
7
|
+
* `virtualizer.scrollToIndex`. Harmless/no-op when not virtualizing.
|
|
8
|
+
*/
|
|
9
|
+
ensureRowVisible?: (rowIndex: number) => void;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* useEditableGridKeyboardNav — roving spreadsheet focus for `EditableGrid`.
|
|
13
|
+
*
|
|
14
|
+
* Focus is tracked by a `Map` keyed `${rowId}:${columnKey}` (NEVER by array
|
|
15
|
+
* index — the grid's stable-rowId contract, legacy anti-pattern #2). Navigation
|
|
16
|
+
* derives neighbours from the CURRENT order arrays (held in refs so the handler
|
|
17
|
+
* closes over live data without re-binding every keystroke) and SKIPS read-only
|
|
18
|
+
* columns:
|
|
19
|
+
* - Tab / Shift+Tab → next / previous editable cell (wraps across rows); at
|
|
20
|
+
* the grid boundary it does NOT preventDefault, so focus escapes the grid
|
|
21
|
+
* naturally (no WCAG keyboard trap)
|
|
22
|
+
* - Enter / Shift+Enter, ArrowDown / ArrowUp → down / up the same column
|
|
23
|
+
* - ArrowLeft / ArrowRight → previous / next editable column in the same row,
|
|
24
|
+
* but ONLY when the caret is at the field edge (intra-cell editing wins first)
|
|
25
|
+
*
|
|
26
|
+
* `<select>` cells (ENUM columns) keep their native Arrow behaviour (option
|
|
27
|
+
* cycling) — only Tab / Enter navigate away from them.
|
|
28
|
+
*
|
|
29
|
+
* When the target row is not mounted (virtualized window), `focusCell` scrolls
|
|
30
|
+
* it into view via `ensureRowVisible` and retries focus after it mounts.
|
|
31
|
+
*/
|
|
32
|
+
export declare function useEditableGridKeyboardNav(rowIds: string[], colKeys: string[], opts: EditableGridKeyboardNavOptions): {
|
|
33
|
+
cellRefs: import('react').RefObject<Map<string, HTMLInputElement | HTMLSelectElement>>;
|
|
34
|
+
setCellRef: (rowId: string, colKey: string) => (el: HTMLInputElement | HTMLSelectElement | null) => void;
|
|
35
|
+
focusCell: (rowId: string, colKey: string) => void;
|
|
36
|
+
handleKeyDown: (e: KeyboardEvent<HTMLInputElement | HTMLSelectElement>, rowId: string, colKey: string) => void;
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=useEditableGridKeyboardNav.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useEditableGridKeyboardNav.d.ts","sourceRoot":"","sources":["../../../src/organisms/EditableGrid/useEditableGridKeyboardNav.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAEhE,MAAM,WAAW,8BAA8B;IAC7C,kFAAkF;IAClF,gBAAgB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9C;;;OAGG;IACH,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/C;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,MAAM,EAAE,EAChB,OAAO,EAAE,MAAM,EAAE,EACjB,IAAI,EAAE,8BAA8B;;wBAc1B,MAAM,UAAU,MAAM,UACvB,gBAAgB,GAAG,iBAAiB,GAAG,IAAI;uBAQd,MAAM,UAAU,MAAM;uBAiEtD,aAAa,CAAC,gBAAgB,GAAG,iBAAiB,CAAC,SAAS,MAAM,UAAU,MAAM;EAwDzF"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { ComponentType, ReactNode } from 'react';
|
|
2
|
+
/** One selectable map layer. `label` is caller-pre-translated. */
|
|
3
|
+
export interface MapLayerToggleItem {
|
|
4
|
+
id: string;
|
|
5
|
+
label: string;
|
|
6
|
+
/** Optional leading icon (e.g. a lucide component). */
|
|
7
|
+
icon?: ComponentType<{
|
|
8
|
+
className?: string;
|
|
9
|
+
}>;
|
|
10
|
+
}
|
|
11
|
+
export interface MapLayerControlProps {
|
|
12
|
+
items: MapLayerToggleItem[];
|
|
13
|
+
activeId: string;
|
|
14
|
+
onChange: (id: string) => void;
|
|
15
|
+
className?: string;
|
|
16
|
+
ariaLabel?: string;
|
|
17
|
+
/** Slot for conditional extras beside the toggle (e.g. an operator selector). */
|
|
18
|
+
children?: ReactNode;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* MapLayerControl — data-agnostic segmented layer toggle (GAP-04).
|
|
22
|
+
*
|
|
23
|
+
* The generalized `LayerToggleRow` that both the package's TurkeyMap and HES's
|
|
24
|
+
* NetworkHealth cockpit reproduce: a mono/uppercase button cluster with an
|
|
25
|
+
* accent-chip active state. Token-neutral (`--color-primary`) so it renders in
|
|
26
|
+
* both themes; the consumer supplies items + active id + a conditional
|
|
27
|
+
* `children` slot for extras.
|
|
28
|
+
*/
|
|
29
|
+
export declare function MapLayerControl({ items, activeId, onChange, className, ariaLabel, children, }: MapLayerControlProps): import("react").JSX.Element;
|
|
30
|
+
export declare namespace MapLayerControl {
|
|
31
|
+
var displayName: string;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=MapLayerControl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MapLayerControl.d.ts","sourceRoot":"","sources":["../../src/organisms/MapLayerControl.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAK3D,kEAAkE;AAClE,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,uDAAuD;IACvD,IAAI,CAAC,EAAE,aAAa,CAAC;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC9C;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iFAAiF;IACjF,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,SAAS,EACT,QAAQ,GACT,EAAE,oBAAoB,+BAgCtB;yBAvCe,eAAe"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** One legend swatch. `color` is a raw CSS color from the caller's paint module. */
|
|
2
|
+
export interface MapLegendEntry {
|
|
3
|
+
color: string;
|
|
4
|
+
label: string;
|
|
5
|
+
}
|
|
6
|
+
export interface MapLegendProps {
|
|
7
|
+
entries: MapLegendEntry[];
|
|
8
|
+
/** Optional trailing swatch (e.g. a "no data" bucket). */
|
|
9
|
+
noData?: MapLegendEntry;
|
|
10
|
+
/** Optional leading caption. */
|
|
11
|
+
label?: string;
|
|
12
|
+
className?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* MapLegend — data-agnostic color-ramp legend (GAP-04).
|
|
16
|
+
*
|
|
17
|
+
* The generalized `LegendRow`. The consumer computes `{ color, label }[]` from
|
|
18
|
+
* its own paint module and passes it in; raw caller-supplied colors are allowed
|
|
19
|
+
* (a paint ramp is inherently domain data, not a token).
|
|
20
|
+
*/
|
|
21
|
+
export declare function MapLegend({ entries, noData, label, className }: MapLegendProps): import("react").JSX.Element;
|
|
22
|
+
export declare namespace MapLegend {
|
|
23
|
+
var displayName: string;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=MapLegend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MapLegend.d.ts","sourceRoot":"","sources":["../../src/organisms/MapLegend.tsx"],"names":[],"mappings":"AAEA,oFAAoF;AACpF,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,0DAA0D;IAC1D,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,gCAAgC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAcD;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,cAAc,+BAc9E;yBAde,SAAS"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { StyleSpecification, Map as MapLibreMap } from 'maplibre-gl';
|
|
3
|
+
/**
|
|
4
|
+
* MapShell — data-agnostic MapLibre GL mount container (GAP-04).
|
|
5
|
+
*
|
|
6
|
+
* Owns ONLY the shared chrome that every MapLibre surface reproduces: WebGL
|
|
7
|
+
* feature-gate, the sized container element, map construction boilerplate, the
|
|
8
|
+
* RAF 0×0-container guard, ResizeObserver re-fit, and teardown. It deliberately
|
|
9
|
+
* does NOT own style/paint/data/interactions — the app wires those against the
|
|
10
|
+
* live map via the `onMapReady(map)` seam. This lets a glance map (interactive
|
|
11
|
+
* false) and a drill-down map (interactive true) share one component with zero
|
|
12
|
+
* fork.
|
|
13
|
+
*
|
|
14
|
+
* The root carries a `.map-shell` scope class so the shipped popup re-skin
|
|
15
|
+
* (`MapShell.css`) never collides across two mounted maps. Base MapLibre control
|
|
16
|
+
* styles are NOT bundled — a consumer whose map shows controls imports
|
|
17
|
+
* `maplibre-gl/dist/maplibre-gl.css` itself (it holds the maplibre-gl peer dep).
|
|
18
|
+
*
|
|
19
|
+
* maplibre-gl is an OPTIONAL peer dependency; code-split your map surface
|
|
20
|
+
* (`React.lazy`) so non-map routes never load it.
|
|
21
|
+
*/
|
|
22
|
+
export interface MapShellProps {
|
|
23
|
+
/** MapLibre style document (sources + layers) built by the consumer. */
|
|
24
|
+
style: StyleSpecification;
|
|
25
|
+
/** `[west, south, east, north]` to fit on load + resize. Omit for style-driven framing. */
|
|
26
|
+
bounds?: [number, number, number, number];
|
|
27
|
+
/** Padding (px) for `fitBounds`. Default `24`. */
|
|
28
|
+
fitBoundsPadding?: number;
|
|
29
|
+
/** Enable pan/zoom. Default `false` (a static glance map). */
|
|
30
|
+
interactive?: boolean;
|
|
31
|
+
/** Keep the WebGL drawing buffer across composites. Default `true` (required for non-interactive maps to paint). */
|
|
32
|
+
preserveDrawingBuffer?: boolean;
|
|
33
|
+
/** Optional glyphs endpoint merged into the style. */
|
|
34
|
+
glyphs?: string;
|
|
35
|
+
/**
|
|
36
|
+
* Called once the map's `load` fires (after the 0×0 guard). Wire paint,
|
|
37
|
+
* layer visibility, interactions, and data here against the live `map`.
|
|
38
|
+
* Return a cleanup that runs on unmount.
|
|
39
|
+
*/
|
|
40
|
+
onMapReady?: (map: MapLibreMap) => void | (() => void);
|
|
41
|
+
/**
|
|
42
|
+
* Called with the loaded `maplibre-gl` module IMMEDIATELY before the map is
|
|
43
|
+
* constructed — the seam for global setup that must precede style load, e.g.
|
|
44
|
+
* `maplibre.addProtocol(...)` for a custom glyph/tile protocol (`onMapReady`
|
|
45
|
+
* fires post-`load`, too late for protocol registration).
|
|
46
|
+
*/
|
|
47
|
+
preMapInit?: (maplibre: typeof import("maplibre-gl")) => void;
|
|
48
|
+
/** Rendered instead of the map when WebGL is unavailable. Defaults to a built-in panel. */
|
|
49
|
+
webglFallback?: ReactNode;
|
|
50
|
+
/** Overlay shown centered over the map until it is ready (or while `isLoading`). */
|
|
51
|
+
loadingOverlay?: ReactNode;
|
|
52
|
+
/** Forces the loading overlay even after the map is ready. */
|
|
53
|
+
isLoading?: boolean;
|
|
54
|
+
/** Applied to the root — the consumer supplies its own glass frame token here. */
|
|
55
|
+
className?: string;
|
|
56
|
+
/** Overlay content positioned over the map (e.g. a floating control). */
|
|
57
|
+
children?: ReactNode;
|
|
58
|
+
"data-testid"?: string;
|
|
59
|
+
}
|
|
60
|
+
export declare function MapShell({ style, bounds, fitBoundsPadding, interactive, preserveDrawingBuffer, glyphs, onMapReady, preMapInit, webglFallback, loadingOverlay, isLoading, className, children, "data-testid": dataTestId, }: MapShellProps): import("react").JSX.Element;
|
|
61
|
+
export declare namespace MapShell {
|
|
62
|
+
var displayName: string;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=MapShell.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MapShell.d.ts","sourceRoot":"","sources":["../../src/organisms/MapShell.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA+B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACpE,OAAO,KAAK,EAAE,kBAAkB,EAAE,GAAG,IAAI,WAAW,EAAE,MAAM,aAAa,CAAC;AAG1E,OAAO,gBAAgB,CAAC;AAExB;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,aAAa;IAC5B,wEAAwE;IACxE,KAAK,EAAE,kBAAkB,CAAC;IAC1B,2FAA2F;IAC3F,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,kDAAkD;IAClD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,8DAA8D;IAC9D,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,oHAAoH;IACpH,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,sDAAsD;IACtD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;IACvD;;;;;OAKG;IACH,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,aAAa,CAAC,KAAK,IAAI,CAAC;IAC9D,2FAA2F;IAC3F,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B,oFAAoF;IACpF,cAAc,CAAC,EAAE,SAAS,CAAC;IAC3B,8DAA8D;IAC9D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,kFAAkF;IAClF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yEAAyE;IACzE,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AA8BD,wBAAgB,QAAQ,CAAC,EACvB,KAAK,EACL,MAAM,EACN,gBAAqB,EACrB,WAAmB,EACnB,qBAA4B,EAC5B,MAAM,EACN,UAAU,EACV,UAAU,EACV,aAAa,EACb,cAAc,EACd,SAAiB,EACjB,SAAS,EACT,QAAQ,EACR,aAAa,EAAE,UAAU,GAC1B,EAAE,aAAa,+BA4If;yBA3Je,QAAQ"}
|
|
@@ -16,5 +16,6 @@ export { JsonViewer, type JsonViewerProps } from './JsonViewer';
|
|
|
16
16
|
export { PageHeader, type PageHeaderProps } from './PageHeader';
|
|
17
17
|
export { Stepper, type StepperProps, type StepperStep, type StepperStatus } from './Stepper';
|
|
18
18
|
export { GlassTableShell, type GlassTableShellProps } from './GlassTableShell';
|
|
19
|
+
export { EditableGrid, type EditableGridProps, type EditableGridColumn, type EditableGridRow, type EditableGridStatusLabels, } from './EditableGrid';
|
|
19
20
|
export { Sidebar, SidebarNavGroup, SidebarNavItem, type SidebarProps, type SidebarNavGroupProps, type SidebarNavItemProps, } from './Sidebar';
|
|
20
21
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/organisms/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,KAAK,UAAU,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,KAAK,SAAS,EAAE,KAAK,OAAO,EAAE,MAAM,QAAQ,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,KAAK,gBAAgB,EAAE,KAAK,cAAc,EAAE,KAAK,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACpI,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC7F,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AACrF,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,KAAK,cAAc,EAAE,KAAK,0BAA0B,EAAE,KAAK,UAAU,EAAE,KAAK,cAAc,EAAE,KAAK,SAAS,EAAE,KAAK,gBAAgB,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AACvN,OAAO,EACL,KAAK,EACL,WAAW,EACX,SAAS,EACT,WAAW,EACX,QAAQ,EACR,SAAS,EACT,SAAS,EACT,YAAY,EACZ,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,iBAAiB,GACvB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAC7H,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EACL,cAAc,EACd,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,GAC5B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAC7F,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EACL,OAAO,EACP,eAAe,EACf,cAAc,EACd,KAAK,YAAY,EACjB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,GACzB,MAAM,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/organisms/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,KAAK,UAAU,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,KAAK,SAAS,EAAE,KAAK,OAAO,EAAE,MAAM,QAAQ,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,KAAK,gBAAgB,EAAE,KAAK,cAAc,EAAE,KAAK,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACpI,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC7F,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AACrF,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,KAAK,cAAc,EAAE,KAAK,0BAA0B,EAAE,KAAK,UAAU,EAAE,KAAK,cAAc,EAAE,KAAK,SAAS,EAAE,KAAK,gBAAgB,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AACvN,OAAO,EACL,KAAK,EACL,WAAW,EACX,SAAS,EACT,WAAW,EACX,QAAQ,EACR,SAAS,EACT,SAAS,EACT,YAAY,EACZ,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,iBAAiB,GACvB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAC7H,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EACL,cAAc,EACd,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,GAC5B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAC7F,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EACL,YAAY,EACZ,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACpB,KAAK,wBAAwB,GAC9B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,OAAO,EACP,eAAe,EACf,cAAc,EACd,KAAK,YAAY,EACjB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,GACzB,MAAM,WAAW,CAAC"}
|