@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.
Files changed (42) hide show
  1. package/dist/Button-DsTGnChX.js +3222 -0
  2. package/dist/atoms/Tooltip.d.ts.map +1 -1
  3. package/dist/i18n/en.json.d.ts +10 -0
  4. package/dist/i18n/resources.d.ts +20 -0
  5. package/dist/i18n/resources.d.ts.map +1 -1
  6. package/dist/i18n/resources.js +1 -1
  7. package/dist/i18n/tr.json.d.ts +10 -0
  8. package/dist/index.d.ts +4 -4
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +3462 -6140
  11. package/dist/map.d.ts +7 -0
  12. package/dist/map.d.ts.map +1 -0
  13. package/dist/map.js +174 -0
  14. package/dist/molecules/IconCell.d.ts +28 -0
  15. package/dist/molecules/IconCell.d.ts.map +1 -0
  16. package/dist/molecules/TextCell.d.ts +3 -1
  17. package/dist/molecules/TextCell.d.ts.map +1 -1
  18. package/dist/molecules/index.d.ts +1 -0
  19. package/dist/molecules/index.d.ts.map +1 -1
  20. package/dist/organisms/EditableGrid/EditableGrid.d.ts +111 -0
  21. package/dist/organisms/EditableGrid/EditableGrid.d.ts.map +1 -0
  22. package/dist/organisms/EditableGrid/EditableGridCell.d.ts +28 -0
  23. package/dist/organisms/EditableGrid/EditableGridCell.d.ts.map +1 -0
  24. package/dist/organisms/EditableGrid/index.d.ts +4 -0
  25. package/dist/organisms/EditableGrid/index.d.ts.map +1 -0
  26. package/dist/organisms/EditableGrid/useEditableGridKeyboardNav.d.ts +38 -0
  27. package/dist/organisms/EditableGrid/useEditableGridKeyboardNav.d.ts.map +1 -0
  28. package/dist/organisms/MapLayerControl.d.ts +33 -0
  29. package/dist/organisms/MapLayerControl.d.ts.map +1 -0
  30. package/dist/organisms/MapLegend.d.ts +25 -0
  31. package/dist/organisms/MapLegend.d.ts.map +1 -0
  32. package/dist/organisms/MapShell.d.ts +64 -0
  33. package/dist/organisms/MapShell.d.ts.map +1 -0
  34. package/dist/organisms/index.d.ts +1 -0
  35. package/dist/organisms/index.d.ts.map +1 -1
  36. package/dist/resources-ksT-xLKO.js +50 -0
  37. package/dist/theme.css +1 -1
  38. package/dist/ui-kit.css +1 -1
  39. package/dist/utils/tooltipPosition.d.ts +51 -0
  40. package/dist/utils/tooltipPosition.d.ts.map +1 -0
  41. package/package.json +13 -2
  42. 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,+BAepG"}
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"}