@keenaioc/data-view 0.0.0-poc.1 → 0.2.0-alpha.8

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 (109) hide show
  1. package/CHANGELOG.md +105 -0
  2. package/DATA-PRIVACY.md +20 -0
  3. package/INTEGRATION.md +178 -0
  4. package/KNOWN-LIMITATIONS.md +34 -0
  5. package/LICENSE +21 -0
  6. package/README.md +67 -5
  7. package/dist/contracts.d.ts +33 -0
  8. package/dist/contracts.d.ts.map +1 -0
  9. package/dist/contracts.js +83 -0
  10. package/dist/contracts.js.map +1 -0
  11. package/dist/data-view.d.ts +3 -0
  12. package/dist/data-view.d.ts.map +1 -0
  13. package/dist/data-view.js +822 -0
  14. package/dist/data-view.js.map +1 -0
  15. package/dist/engine.d.ts +34 -0
  16. package/dist/engine.d.ts.map +1 -0
  17. package/dist/engine.js +307 -0
  18. package/dist/engine.js.map +1 -0
  19. package/dist/gantt-bar.d.ts +17 -0
  20. package/dist/gantt-bar.d.ts.map +1 -0
  21. package/dist/gantt-bar.js +142 -0
  22. package/dist/gantt-bar.js.map +1 -0
  23. package/dist/gantt-dependencies.d.ts +27 -0
  24. package/dist/gantt-dependencies.d.ts.map +1 -0
  25. package/dist/gantt-dependencies.js +218 -0
  26. package/dist/gantt-dependencies.js.map +1 -0
  27. package/dist/gantt-dependency-ui.d.ts +37 -0
  28. package/dist/gantt-dependency-ui.d.ts.map +1 -0
  29. package/dist/gantt-dependency-ui.js +79 -0
  30. package/dist/gantt-dependency-ui.js.map +1 -0
  31. package/dist/gantt-grid.d.ts +27 -0
  32. package/dist/gantt-grid.d.ts.map +1 -0
  33. package/dist/gantt-grid.js +72 -0
  34. package/dist/gantt-grid.js.map +1 -0
  35. package/dist/gantt-operations.d.ts +14 -0
  36. package/dist/gantt-operations.d.ts.map +1 -0
  37. package/dist/gantt-operations.js +103 -0
  38. package/dist/gantt-operations.js.map +1 -0
  39. package/dist/index.d.ts +17 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +17 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/operations.d.ts +11 -0
  44. package/dist/operations.d.ts.map +1 -0
  45. package/dist/operations.js +117 -0
  46. package/dist/operations.js.map +1 -0
  47. package/dist/registry.d.ts +13 -0
  48. package/dist/registry.d.ts.map +1 -0
  49. package/dist/registry.js +465 -0
  50. package/dist/registry.js.map +1 -0
  51. package/dist/remote-data.d.ts +19 -0
  52. package/dist/remote-data.d.ts.map +1 -0
  53. package/dist/remote-data.js +67 -0
  54. package/dist/remote-data.js.map +1 -0
  55. package/dist/row-move.d.ts +7 -0
  56. package/dist/row-move.d.ts.map +1 -0
  57. package/dist/row-move.js +27 -0
  58. package/dist/row-move.js.map +1 -0
  59. package/dist/schedule-view.d.ts +27 -0
  60. package/dist/schedule-view.d.ts.map +1 -0
  61. package/dist/schedule-view.js +122 -0
  62. package/dist/schedule-view.js.map +1 -0
  63. package/dist/schedule.d.ts +28 -0
  64. package/dist/schedule.d.ts.map +1 -0
  65. package/dist/schedule.js +97 -0
  66. package/dist/schedule.js.map +1 -0
  67. package/dist/style.css +986 -0
  68. package/dist/timeline.d.ts +25 -0
  69. package/dist/timeline.d.ts.map +1 -0
  70. package/dist/timeline.js +58 -0
  71. package/dist/timeline.js.map +1 -0
  72. package/dist/toolbar.d.ts +10 -0
  73. package/dist/toolbar.d.ts.map +1 -0
  74. package/dist/toolbar.js +31 -0
  75. package/dist/toolbar.js.map +1 -0
  76. package/dist/types.d.ts +472 -0
  77. package/dist/types.d.ts.map +1 -0
  78. package/dist/types.js +22 -0
  79. package/dist/types.js.map +1 -0
  80. package/dist/use-remote-data.d.ts +18 -0
  81. package/dist/use-remote-data.d.ts.map +1 -0
  82. package/dist/use-remote-data.js +12 -0
  83. package/dist/use-remote-data.js.map +1 -0
  84. package/dist/use-row-move.d.ts +12 -0
  85. package/dist/use-row-move.d.ts.map +1 -0
  86. package/dist/use-row-move.js +151 -0
  87. package/dist/use-row-move.js.map +1 -0
  88. package/dist/v2-panels.d.ts +37 -0
  89. package/dist/v2-panels.d.ts.map +1 -0
  90. package/dist/v2-panels.js +108 -0
  91. package/dist/v2-panels.js.map +1 -0
  92. package/dist/view-state.d.ts +30 -0
  93. package/dist/view-state.d.ts.map +1 -0
  94. package/dist/view-state.js +94 -0
  95. package/dist/view-state.js.map +1 -0
  96. package/dist/view-workspace.d.ts +3 -0
  97. package/dist/view-workspace.d.ts.map +1 -0
  98. package/dist/view-workspace.js +95 -0
  99. package/dist/view-workspace.js.map +1 -0
  100. package/dist/virtual-list.d.ts +12 -0
  101. package/dist/virtual-list.d.ts.map +1 -0
  102. package/dist/virtual-list.js +46 -0
  103. package/dist/virtual-list.js.map +1 -0
  104. package/package.json +19 -16
  105. package/index.d.ts +0 -2
  106. package/index.js +0 -5
  107. package/react.d.ts +0 -2
  108. package/react.js +0 -8
  109. package/style.css +0 -1
@@ -0,0 +1,27 @@
1
+ import { type ReactNode } from "react";
2
+ import { type ScheduleItem } from "./schedule.js";
3
+ import type { ScheduleEntry, timelineWindow } from "./timeline.js";
4
+ import type { CellCommit, DataViewConfig, DataViewPermissions, FieldDefinition, GanttDependencyState, ViewLocation, DataViewMetrics, DataViewGroupNode } from "./types.js";
5
+ export declare function GanttGrid<Row>({ entries, items, fields, getRowId, view, window: range, onLocationChange, onToggleGroup, renderLeftHeader, renderLeftRow, onOpen, onCommit, onMessage, busy, permissions, dependencies, metrics, getRowLabel, groupLabel, onLoadNearEnd }: {
6
+ metrics: DataViewMetrics;
7
+ getRowLabel: (row: Row) => string;
8
+ groupLabel: (node: DataViewGroupNode<Row>) => ReactNode;
9
+ onLoadNearEnd: (el: HTMLElement) => void;
10
+ entries: ScheduleEntry<Row>[];
11
+ items: ScheduleItem<Row>[];
12
+ fields: FieldDefinition<Row>[];
13
+ getRowId: (row: Row) => string;
14
+ view: DataViewConfig;
15
+ window: ReturnType<typeof timelineWindow>;
16
+ onLocationChange: (patch: ViewLocation) => void;
17
+ onToggleGroup?: (key: string) => void;
18
+ renderLeftHeader?: () => ReactNode;
19
+ renderLeftRow?: (row: Row) => ReactNode;
20
+ onOpen: (row: Row) => void;
21
+ onCommit?: (changes: CellCommit<Row>[]) => Promise<boolean | "cancelled">;
22
+ onMessage: (message: string) => void;
23
+ busy?: boolean;
24
+ permissions?: DataViewPermissions<Row>;
25
+ dependencies?: GanttDependencyState<Row>;
26
+ }): import("react/jsx-runtime").JSX.Element;
27
+ //# sourceMappingURL=gantt-grid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gantt-grid.d.ts","sourceRoot":"","sources":["../src/gantt-grid.tsx"],"names":[],"mappings":"AACA,OAAO,EAA4D,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGjG,OAAO,EAAa,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAG7D,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,mBAAmB,EAAE,eAAe,EAAE,oBAAoB,EAAE,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC3K,wBAAgB,SAAS,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,EAAE;IACzQ,OAAO,EAAE,eAAe,CAAC;IAAC,WAAW,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM,CAAC;IAAC,UAAU,EAAE,CAAC,IAAI,EAAE,iBAAiB,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC;IAAC,aAAa,EAAE,CAAC,EAAE,EAAE,WAAW,KAAK,IAAI,CAAC;IAC/J,OAAO,EAAE,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;IAAC,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;IAAC,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;IAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM,CAAC;IAAC,IAAI,EAAE,cAAc,CAAC;IAChJ,MAAM,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;IAAC,gBAAgB,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IAAC,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAClI,gBAAgB,CAAC,EAAE,MAAM,SAAS,CAAC;IAAC,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,SAAS,CAAC;IAAC,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC;IACxG,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,KAAK,OAAO,CAAC,OAAO,GAAG,WAAW,CAAC,CAAC;IAAC,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChH,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAAC,YAAY,CAAC,EAAE,oBAAoB,CAAC,GAAG,CAAC,CAAC;CAClG,2CAgEA"}
@@ -0,0 +1,72 @@
1
+ "use client";
2
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
3
+ import { useEffect, useMemo, useRef, useState } from "react";
4
+ import { virtualWindow } from "./contracts.js";
5
+ import { visibleFields } from "./engine.js";
6
+ import { dayString } from "./schedule.js";
7
+ import { GanttBar } from "./gantt-bar.js";
8
+ import { GanttDependencyLines } from "./gantt-dependency-ui.js";
9
+ export function GanttGrid({ entries, items, fields, getRowId, view, window: range, onLocationChange, onToggleGroup, renderLeftHeader, renderLeftRow, onOpen, onCommit, onMessage, busy, permissions, dependencies, metrics, getRowLabel, groupLabel, onLoadNearEnd }) {
10
+ const left = useRef(null);
11
+ const right = useRef(null);
12
+ const root = useRef(null);
13
+ const location = useRef(view.location);
14
+ useEffect(() => { location.current = view.location; }, [view.location]);
15
+ const needsFocus = view.location?.timelineLeft === undefined;
16
+ const [split, setSplit] = useState(view.location?.splitWidth ?? 420);
17
+ const [available, setAvailable] = useState(1200);
18
+ useEffect(() => { const el = root.current; if (!el)
19
+ return; const observer = new ResizeObserver(() => setAvailable(el.clientWidth)); observer.observe(el); return () => observer.disconnect(); }, []);
20
+ useEffect(() => {
21
+ if (!left.current || !right.current)
22
+ return;
23
+ left.current.scrollTop = location.current?.ganttTop ?? 0;
24
+ right.current.scrollTop = left.current.scrollTop;
25
+ left.current.scrollLeft = location.current?.ganttLeft ?? 0;
26
+ right.current.scrollLeft = location.current?.timelineLeft ?? range.anchorOffset;
27
+ }, [range.start, range.dayWidth, range.anchorOffset, view.location?.schedulePage, needsFocus]);
28
+ const width = Math.min(split, Math.max(180, available - 240));
29
+ const columns = visibleFields(fields, view);
30
+ const tableWidth = 44 + columns.reduce((sum, v) => sum + v.column.width, 0);
31
+ const rowHeight = metrics.rowHeight;
32
+ const [scrollTop, setScrollTop] = useState(view.location?.ganttTop ?? 0);
33
+ const [height, setHeight] = useState(560);
34
+ useEffect(() => { const el = left.current; if (!el)
35
+ return; const observer = new ResizeObserver(() => setHeight(el.clientHeight)); observer.observe(el); return () => observer.disconnect(); }, []);
36
+ const heights = useMemo(() => entries.map((e) => e.kind === "group" ? metrics.groupHeight + (e.node.depth ? metrics.nestedGroupGap : metrics.groupGap) : rowHeight), [entries, metrics.groupHeight, metrics.groupGap, metrics.nestedGroupGap, rowHeight]);
37
+ const windowed = useMemo(() => virtualWindow(heights, scrollTop, height), [heights, scrollTop, height]);
38
+ const shown = entries.slice(windowed.start, windowed.end);
39
+ const map = new Map(items.map((item) => [item.id, item]));
40
+ const [today, setToday] = useState(() => Math.floor(Date.now() / 86400000));
41
+ useEffect(() => { const timer = window.setInterval(() => setToday(Math.floor(Date.now() / 86400000)), 60000); return () => window.clearInterval(timer); }, []);
42
+ const weekends = [];
43
+ for (let d = range.start; d <= range.end; d++)
44
+ if ([0, 6].includes(new Date(d * 86400000).getUTCDay()))
45
+ weekends.push(d);
46
+ const collapsed = new Set(view.collapsedGroups);
47
+ function group(entry) { return _jsxs("button", { style: { paddingLeft: 10 + 16 * entry.node.depth }, "aria-expanded": !collapsed.has(entry.node.key), onClick: () => onToggleGroup?.(entry.node.key), children: [collapsed.has(entry.node.key) ? "›" : "⌄", " ", groupLabel(entry.node)] }); }
48
+ function saveScroll(source) {
49
+ const a = source === "left" ? left.current : right.current;
50
+ const b = source === "left" ? right.current : left.current;
51
+ if (!a || !b)
52
+ return;
53
+ setScrollTop(a.scrollTop);
54
+ onLoadNearEnd(a);
55
+ if (Math.abs(a.scrollTop - b.scrollTop) > 1)
56
+ b.scrollTop = a.scrollTop;
57
+ onLocationChange({ ganttTop: a.scrollTop, ganttLeft: left.current.scrollLeft, timelineLeft: right.current.scrollLeft });
58
+ }
59
+ return _jsxs("div", { ref: root, className: "hy-dv-gantt-split", style: { gridTemplateColumns: `${width}px 8px minmax(0, 1fr)`, "--hy-row-height": `${rowHeight}px`, "--hy-month-days": range.end - range.start + 1 }, children: [_jsx("div", { ref: left, className: "hy-dv-gantt-pane hy-dv-gantt-left", onScroll: () => saveScroll("left"), children: _jsxs("table", { className: "hy-dv-table", style: { width: renderLeftRow ? tableWidth : 240 }, "aria-label": "\u7518\u7279\u5DE6\u5074\u8CC7\u6599", children: [renderLeftRow && _jsxs("colgroup", { children: [_jsx("col", { style: { width: 44 } }), columns.map(({ field, column }) => _jsx("col", { style: { width: column.width } }, field.id))] }), _jsx("thead", { children: renderLeftHeader?.() ?? _jsx("tr", { children: _jsx("th", { children: "\u6A19\u984C" }) }) }), _jsxs("tbody", { children: [windowed.before > 0 && _jsx("tr", { "aria-hidden": true, children: _jsx("td", { colSpan: columns.length + 1, style: { height: windowed.before, padding: 0, border: 0 } }) }), shown.map((entry, index) => entry.kind === "group" ? _jsx("tr", { className: "hy-dv-group", style: { height: heights[windowed.start + index] }, children: _jsx("td", { colSpan: columns.length + 1, children: group(entry) }) }, `g:${entry.node.key}`) : renderLeftRow?.(entry.row) ?? _jsx("tr", { children: _jsx("td", { children: _jsx("button", { onClick: () => onOpen(entry.row), children: getRowLabel(entry.row) }) }) }, getRowId(entry.row))), windowed.after > 0 && _jsx("tr", { "aria-hidden": true, children: _jsx("td", { colSpan: columns.length + 1, style: { height: windowed.after, padding: 0, border: 0 } }) })] })] }) }), _jsx("div", { className: "hy-dv-split-handle", role: "separator", "aria-label": "\u8ABF\u6574\u7518\u7279\u5DE6\u5074\u5BEC\u5EA6", "aria-orientation": "vertical", "aria-valuemin": 180, "aria-valuemax": 900, "aria-valuenow": Math.round(width), tabIndex: 0, onKeyDown: (e) => { if (!["ArrowLeft", "ArrowRight"].includes(e.key))
60
+ return; e.preventDefault(); const n = Math.max(180, Math.min(900, split + (e.key === "ArrowRight" ? 20 : -20))); setSplit(n); onLocationChange({ splitWidth: n }); }, onPointerDown: (e) => { e.preventDefault(); e.currentTarget.setPointerCapture(e.pointerId); }, onPointerMove: (e) => { if (!e.currentTarget.hasPointerCapture(e.pointerId))
61
+ return; const n = Math.max(180, Math.min(900, e.clientX - (root.current?.getBoundingClientRect().left ?? 0))); setSplit(n); }, onPointerUp: (e) => { if (e.currentTarget.hasPointerCapture(e.pointerId))
62
+ e.currentTarget.releasePointerCapture(e.pointerId); onLocationChange({ splitWidth: split }); }, onPointerCancel: () => setSplit(view.location?.splitWidth ?? 420) }), _jsx("div", { ref: right, className: "hy-dv-gantt-pane hy-dv-timeline-pane", onScroll: () => saveScroll("right"), children: _jsxs("div", { className: "hy-dv-timeline", style: { width: range.width }, children: [_jsx("div", { className: "hy-dv-timeline-header", children: range.ticks.map((tick) => _jsx("span", { style: { left: (tick.day - range.start) * range.dayWidth }, children: tick.label }, tick.day)) }), _jsxs("div", { className: "hy-dv-timeline-body", children: [_jsxs("div", { className: "hy-dv-time-background", "aria-hidden": true, children: [weekends.map((d) => _jsx("i", { style: { left: (d - range.start) * range.dayWidth, width: range.dayWidth } }, d)), today >= range.start && today <= range.end && _jsx("b", { className: "hy-dv-today-line", style: { left: (today - range.start) * range.dayWidth } })] }), _jsx("div", { "aria-hidden": true, style: { height: windowed.before } }), shown.map((entry, index) => entry.kind === "group" ? _jsx("div", { className: "hy-dv-timeline-group", style: { height: heights[windowed.start + index] } }, `g:${entry.node.key}`) : _jsx("div", { className: "hy-dv-gantt-track", style: { height: rowHeight }, children: renderBar(entry.row) }, getRowId(entry.row))), _jsx("div", { "aria-hidden": true, style: { height: windowed.after } }), dependencies && _jsx(GanttDependencyLines, { dayWidth: range.dayWidth, rowHeight: rowHeight, items: entries.flatMap((entry, i) => { const item = entry.kind === "row" ? map.get(getRowId(entry.row)) : undefined; return item ? [{ item, y: windowed.offsets[i] + rowHeight / 2 }] : []; }), state: dependencies, start: range.start, end: range.end, workdaysOnly: view.gantt?.workdaysOnly })] })] }) })] });
63
+ function renderBar(row) {
64
+ const item = map.get(getRowId(row));
65
+ if (!item)
66
+ return null;
67
+ if (item.end < range.start || item.start > range.end)
68
+ return _jsxs("button", { className: "hy-dv-gantt-outside", onClick: () => onLocationChange({ anchorDate: dayString(item.start), timelineLeft: undefined }), "aria-label": `定位 ${item.title} 的排程日期`, children: [item.end < range.start ? "←" : "→", " ", dayString(item.start)] });
69
+ return _jsx(GanttBar, { previewRequired: Boolean(dependencies), item: item, fields: fields, mapping: view.gantt, getRowId: getRowId, monthStart: range.start, monthEnd: range.end, permissions: permissions, busy: busy, onCommit: onCommit && !dependencies?.isDateLocked?.(row) ? onCommit : undefined, onOpen: onOpen, onMessage: onMessage });
70
+ }
71
+ }
72
+ //# sourceMappingURL=gantt-grid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gantt-grid.js","sourceRoot":"","sources":["../src/gantt-grid.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { CellCommit, DataViewPermissions, FieldDefinition, GanttMapping } from "./types.js";
2
+ export type GanttAction = "move" | "start" | "end";
3
+ export type GanttRange = {
4
+ start: number;
5
+ end: number;
6
+ };
7
+ export declare function isWorkday(day: number): boolean;
8
+ export declare function ganttDuration(start: number, end: number, workdaysOnly?: boolean): number;
9
+ /** Drag uses whole wall-calendar days. Moving preserves the active duration rule. */
10
+ export declare function adjustGanttRange(range: GanttRange, action: GanttAction, delta: number, workdaysOnly?: boolean): GanttRange;
11
+ export declare function canDragGantt<Row>(row: Row, fields: FieldDefinition<Row>[], mapping: GanttMapping, permissions?: DataViewPermissions<Row>): boolean;
12
+ /** Both endpoints are sent atomically, even for a resize, to check both old values. */
13
+ export declare function createGanttChanges<Row>(row: Row, fields: FieldDefinition<Row>[], mapping: GanttMapping, getRowId: (row: Row) => string, action: GanttAction, delta: number, permissions?: DataViewPermissions<Row>): CellCommit<Row>[];
14
+ //# sourceMappingURL=gantt-operations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gantt-operations.d.ts","sourceRoot":"","sources":["../src/gantt-operations.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEjG,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC;AACnD,MAAM,MAAM,UAAU,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AACxD,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,WAAgG;AACrI,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,UAAQ,UAO7E;AAQD,qFAAqF;AACrF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,UAAQ,GAAG,UAAU,CAmBxH;AAOD,wBAAgB,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,CAAC,EAAE,mBAAmB,CAAC,GAAG,CAAC,WAGxI;AAQD,uFAAuF;AACvF,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,mBAAmB,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,EAAE,CAiBtO"}
@@ -0,0 +1,103 @@
1
+ import { getFieldValue } from "./engine.js";
2
+ import { canWriteField, validateChanges } from "./operations.js";
3
+ import { dateDay, dayString, DAY_MS } from "./schedule.js";
4
+ export function isWorkday(day) { const weekday = new Date(day * DAY_MS).getUTCDay(); return weekday !== 0 && weekday !== 6; }
5
+ export function ganttDuration(start, end, workdaysOnly = false) {
6
+ if (!Number.isInteger(start) || !Number.isInteger(end) || end < start)
7
+ return 0;
8
+ const days = end - start + 1;
9
+ if (!workdaysOnly)
10
+ return days;
11
+ let count = Math.floor(days / 7) * 5;
12
+ for (let day = start; day < start + days % 7; day++)
13
+ if (isWorkday(day))
14
+ count++;
15
+ return count;
16
+ }
17
+ function snapWorkday(day, direction) { while (!isWorkday(day))
18
+ day += direction < 0 ? -1 : 1; return day; }
19
+ function endAfterWorkdays(start, count) {
20
+ let end = start + Math.floor((count - 1) / 5) * 7;
21
+ for (let remaining = (count - 1) % 5; remaining > 0; remaining--)
22
+ end = snapWorkday(end + 1, 1);
23
+ return end;
24
+ }
25
+ /** Drag uses whole wall-calendar days. Moving preserves the active duration rule. */
26
+ export function adjustGanttRange(range, action, delta, workdaysOnly = false) {
27
+ if (!Number.isSafeInteger(delta) || Math.abs(delta) > 3_652_058 || !Number.isInteger(range.start) || !Number.isInteger(range.end) || range.end < range.start)
28
+ throw new Error("無效日期區間");
29
+ if (!delta)
30
+ return range;
31
+ const count = ganttDuration(range.start, range.end, workdaysOnly);
32
+ if (!count)
33
+ throw new Error("此區間沒有工作天,請先調整日期或關閉僅計算工作天。");
34
+ let { start, end } = range;
35
+ if (action === "move") {
36
+ start += delta;
37
+ if (workdaysOnly) {
38
+ start = snapWorkday(start, delta);
39
+ end = endAfterWorkdays(start, count);
40
+ }
41
+ else
42
+ end += delta;
43
+ }
44
+ else if (action === "start") {
45
+ start = Math.min(start + delta, end);
46
+ if (workdaysOnly)
47
+ start = Math.min(snapWorkday(start, delta), snapWorkday(end, -1));
48
+ }
49
+ else {
50
+ end = Math.max(end + delta, start);
51
+ if (workdaysOnly)
52
+ end = Math.max(snapWorkday(end, delta), snapWorkday(start, 1));
53
+ }
54
+ if (![start, end].every((day) => day >= dateDay("0001-01-01") && day <= dateDay("9999-12-31")))
55
+ throw new Error("日期超出支援範圍");
56
+ return { start, end };
57
+ }
58
+ function dateFields(fields, mapping) {
59
+ const start = fields.find((field) => field.id === mapping.startFieldId);
60
+ const end = fields.find((field) => field.id === mapping.endFieldId);
61
+ return { start, end };
62
+ }
63
+ export function canDragGantt(row, fields, mapping, permissions) {
64
+ const { start, end } = dateFields(fields, mapping);
65
+ return Boolean(start && end && start.id !== end.id && [start, end].every((field) => ["date", "dateTime"].includes(field.type) && canWriteField(row, field, permissions)));
66
+ }
67
+ function replaceDay(value, day, field) {
68
+ if (typeof value !== "string" || dateDay(value) === null)
69
+ throw new Error(`${field.label}不是有效日期`);
70
+ if (field.type === "date")
71
+ return dayString(day);
72
+ if (!/^\d{4}-\d{2}-\d{2}T(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d{1,3})?)?(?:Z|[+-](?:[01]\d|2[0-3]):[0-5]\d)?$/.test(value) || !Number.isFinite(Date.parse(value)))
73
+ throw new Error(`${field.label}不是有效日期時間`);
74
+ return dayString(day) + value.slice(10);
75
+ }
76
+ /** Both endpoints are sent atomically, even for a resize, to check both old values. */
77
+ export function createGanttChanges(row, fields, mapping, getRowId, action, delta, permissions) {
78
+ if (!canDragGantt(row, fields, mapping, permissions))
79
+ throw new Error("拖曳需要兩個不同且都可修改的日期欄位");
80
+ const { start: startField, end: endField } = dateFields(fields, mapping);
81
+ const startValue = getFieldValue(row, startField);
82
+ const endValue = getFieldValue(row, endField);
83
+ const start = dateDay(startValue);
84
+ const end = dateDay(endValue);
85
+ if (start === null || end === null || end < start)
86
+ throw new Error("請先修正開始與結束日期");
87
+ const next = adjustGanttRange({ start, end }, action, delta, mapping.workdaysOnly);
88
+ if (next.start === start && next.end === end)
89
+ return [];
90
+ const nextStart = replaceDay(startValue, next.start, startField);
91
+ const nextEnd = replaceDay(endValue, next.end, endField);
92
+ if (startField.type === "dateTime" && endField.type === "dateTime" && Date.parse(nextEnd) < Date.parse(nextStart))
93
+ throw new Error("結束時間不能早於開始時間");
94
+ const changes = [
95
+ { row, rowId: getRowId(row), field: startField, previousValue: startValue, nextValue: nextStart },
96
+ { row, rowId: getRowId(row), field: endField, previousValue: endValue, nextValue: nextEnd },
97
+ ];
98
+ const error = validateChanges(changes, permissions);
99
+ if (error)
100
+ throw new Error(error);
101
+ return changes;
102
+ }
103
+ //# sourceMappingURL=gantt-operations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gantt-operations.js","sourceRoot":"","sources":["../src/gantt-operations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export * from "./types.js";
2
+ export * from "./engine.js";
3
+ export * from "./registry.js";
4
+ export * from "./data-view.js";
5
+ export * from "./operations.js";
6
+ export * from "./schedule.js";
7
+ export * from "./gantt-operations.js";
8
+ export * from "./gantt-dependencies.js";
9
+ export declare const DATA_VIEW_VERSION = "0.2.0-alpha.8";
10
+ export * from "./view-state.js";
11
+ export * from "./view-workspace.js";
12
+ export * from "./timeline.js";
13
+ export * from "./contracts.js";
14
+ export * from "./remote-data.js";
15
+ export * from "./use-remote-data.js";
16
+ export * from "./row-move.js";
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AAEtC,cAAc,yBAAyB,CAAC;AAExC,eAAO,MAAM,iBAAiB,kBAAkB,CAAC;AAEjD,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AAEpC,cAAc,eAAe,CAAC;AAE9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,17 @@
1
+ export * from "./types.js";
2
+ export * from "./engine.js";
3
+ export * from "./registry.js";
4
+ export * from "./data-view.js";
5
+ export * from "./operations.js";
6
+ export * from "./schedule.js";
7
+ export * from "./gantt-operations.js";
8
+ export * from "./gantt-dependencies.js";
9
+ export const DATA_VIEW_VERSION = "0.2.0-alpha.8";
10
+ export * from "./view-state.js";
11
+ export * from "./view-workspace.js";
12
+ export * from "./timeline.js";
13
+ export * from "./contracts.js";
14
+ export * from "./remote-data.js";
15
+ export * from "./use-remote-data.js";
16
+ export * from "./row-move.js";
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AAEtC,cAAc,yBAAyB,CAAC;AAExC,MAAM,CAAC,MAAM,iBAAiB,GAAG,eAAe,CAAC;AAEjD,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AAEpC,cAAc,eAAe,CAAC;AAE9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { CellCommit, DataViewPermissions, FieldChange, FieldDefinition } from "./types.js";
2
+ export declare const MAX_BATCH_CELLS = 1000;
3
+ export declare function canWriteField<Row>(row: Row, field: FieldDefinition<Row>, permissions?: DataViewPermissions<Row>): boolean;
4
+ export declare function validateChanges<Row>(changes: CellCommit<Row>[], permissions?: DataViewPermissions<Row>): string | null;
5
+ /** Quoted TSV supports tabs/newlines inside text. No formulas are evaluated. */
6
+ export declare function parseTSV(text: string): string[][];
7
+ export declare function encodeTSV(rows: string[][]): string;
8
+ export declare function createPasteChanges<Row>(text: string, rows: Row[], fields: FieldDefinition<Row>[], getRowId: (row: Row) => string, rowIndex: number, columnIndex: number): CellCommit<Row>[];
9
+ export declare function validateFieldChange<Row>(fields: FieldDefinition<Row>[], change: FieldChange<Row>, permissions?: DataViewPermissions<Row>): "沒有管理欄位的權限" | "欄位不存在" | "系統或受保護欄位不能修改結構" | "沒有變更此欄位的權限" | "請填欄位名稱" | "至少保留一個欄位" | "欄位 ID 格式不正確" | "欄位 ID 已存在" | "系統欄位只能由接入專案建立" | "有逐列讀取限制的欄位,請由專案管理員處理複製" | null;
10
+ export declare function newOperationId(): `${string}-${string}-${string}-${string}-${string}`;
11
+ //# sourceMappingURL=operations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operations.d.ts","sourceRoot":"","sources":["../src/operations.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEhG,eAAO,MAAM,eAAe,OAAO,CAAC;AACpC,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,WAAW,CAAC,EAAE,mBAAmB,CAAC,GAAG,CAAC,WAG/G;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,WAAW,CAAC,EAAE,mBAAmB,CAAC,GAAG,CAAC,iBAatG;AAED,gFAAgF;AAChF,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,CAmBjD;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,UAMzC;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,EAAE,CAO3L;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,WAAW,CAAC,EAAE,mBAAmB,CAAC,GAAG,CAAC,qKAkBxI;AAED,wBAAgB,cAAc,wDAA6G"}
@@ -0,0 +1,117 @@
1
+ import { getFieldValue, validateValue } from "./engine.js";
2
+ import { getFieldTypeDefinition, parseClipboardValue } from "./registry.js";
3
+ export const MAX_BATCH_CELLS = 1000;
4
+ export function canWriteField(row, field, permissions) {
5
+ return !field.internal && !field.renderAction && getFieldTypeDefinition(field.type).editable && !field.readOnly && !field.system &&
6
+ field.canRead?.({ row, field }) !== false && field.canEdit?.({ row, field }) !== false && permissions?.canEditRow?.(row) !== false;
7
+ }
8
+ export function validateChanges(changes, permissions) {
9
+ if (!changes.length)
10
+ return "沒有可修改的儲存格";
11
+ if (changes.length > MAX_BATCH_CELLS)
12
+ return `一次最多 ${MAX_BATCH_CELLS} 格,請縮小範圍`;
13
+ const seen = new Set();
14
+ for (const c of changes) {
15
+ const key = JSON.stringify([c.rowId, c.field.id]);
16
+ if (seen.has(key))
17
+ return "同一批次不可重複修改同一格";
18
+ seen.add(key);
19
+ if (!canWriteField(c.row, c.field, permissions))
20
+ return `${c.rowId}/${c.field.label}:無修改權限`;
21
+ const error = validateValue(c.nextValue, c.field, c.row);
22
+ if (error)
23
+ return `${c.rowId}/${c.field.label}:${error}`;
24
+ }
25
+ return null;
26
+ }
27
+ /** Quoted TSV supports tabs/newlines inside text. No formulas are evaluated. */
28
+ export function parseTSV(text) {
29
+ if (text.length > 1_000_000)
30
+ throw new Error("貼上內容過大");
31
+ const result = [];
32
+ let row = [];
33
+ let cell = "";
34
+ let quoted = false;
35
+ const input = text.replace(/\r\n?/g, "\n");
36
+ for (let i = 0; i < input.length; i++) {
37
+ const c = input[i];
38
+ if (c === '"') {
39
+ if (quoted && input[i + 1] === '"') {
40
+ cell += '"';
41
+ i++;
42
+ }
43
+ else if (quoted || cell === "")
44
+ quoted = !quoted;
45
+ else
46
+ cell += c;
47
+ }
48
+ else if (!quoted && (c === "\t" || c === "\n")) {
49
+ row.push(cell);
50
+ cell = "";
51
+ if (c === "\n") {
52
+ result.push(row);
53
+ row = [];
54
+ }
55
+ }
56
+ else
57
+ cell += c;
58
+ }
59
+ if (quoted)
60
+ throw new Error("貼上內容的引號未關閉");
61
+ if (cell || row.length || !input.endsWith("\n")) {
62
+ row.push(cell);
63
+ result.push(row);
64
+ }
65
+ if (result.reduce((n, r) => n + r.length, 0) > MAX_BATCH_CELLS)
66
+ throw new Error(`一次最多 ${MAX_BATCH_CELLS} 格`);
67
+ return result;
68
+ }
69
+ export function encodeTSV(rows) {
70
+ return rows.map((r) => r.map((value) => {
71
+ // Spreadsheet-safe export: prefix formula-leading text, never execute it.
72
+ const safe = /^[=+@\-]/.test(value) && !/^-?\d+(\.\d+)?$/.test(value) ? `'${value}` : value;
73
+ return /["\t\n\r]/.test(safe) ? `"${safe.replace(/"/g, '""')}"` : safe;
74
+ }).join("\t")).join("\n");
75
+ }
76
+ export function createPasteChanges(text, rows, fields, getRowId, rowIndex, columnIndex) {
77
+ const grid = parseTSV(text);
78
+ if (rowIndex < 0 || columnIndex < 0 || rowIndex + grid.length > rows.length || grid.some((r) => columnIndex + r.length > fields.length))
79
+ throw new Error("貼上範圍超出目前顯示的資料列或欄位");
80
+ return grid.flatMap((r, offset) => r.map((textValue, x) => {
81
+ const row = rows[rowIndex + offset];
82
+ const field = fields[columnIndex + x];
83
+ return { row, rowId: getRowId(row), field, previousValue: getFieldValue(row, field), nextValue: parseClipboardValue(textValue, field) };
84
+ }));
85
+ }
86
+ export function validateFieldChange(fields, change, permissions) {
87
+ if (permissions?.canManageFields !== true)
88
+ return "沒有管理欄位的權限";
89
+ const id = "fieldId" in change ? change.fieldId : change.action === "copy" ? change.sourceFieldId : null;
90
+ const existing = fields.find((f) => f.id === id);
91
+ if (change.action !== "add") {
92
+ if (!existing)
93
+ return "欄位不存在";
94
+ if (existing.internal || existing.renderAction || existing.system || !getFieldTypeDefinition(existing.type).deletable || existing.deletable === false)
95
+ return "系統或受保護欄位不能修改結構";
96
+ if (permissions?.canChangeField?.(existing, change.action) === false)
97
+ return "沒有變更此欄位的權限";
98
+ }
99
+ if (change.action === "rename")
100
+ return change.label.trim() ? null : "請填欄位名稱";
101
+ if (change.action === "delete")
102
+ return fields.length > 1 ? null : "至少保留一個欄位";
103
+ const field = change.field;
104
+ if (!/^[a-zA-Z][a-zA-Z0-9_\-]{0,79}$/.test(field.id) || ["__proto__", "constructor", "prototype"].includes(field.id))
105
+ return "欄位 ID 格式不正確";
106
+ if (fields.some((f) => f.id === field.id))
107
+ return "欄位 ID 已存在";
108
+ if (!field.label.trim())
109
+ return "請填欄位名稱";
110
+ if (!getFieldTypeDefinition(field.type)?.editable || field.internal || field.system || field.readOnly || field.renderAction)
111
+ return "系統欄位只能由接入專案建立";
112
+ if (change.action === "copy" && existing?.canRead)
113
+ return "有逐列讀取限制的欄位,請由專案管理員處理複製";
114
+ return null;
115
+ }
116
+ export function newOperationId() { return globalThis.crypto?.randomUUID?.() ?? `hy-${Date.now()}-${Math.random().toString(36).slice(2)}`; }
117
+ //# sourceMappingURL=operations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operations.js","sourceRoot":"","sources":["../src/operations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { type ReactNode } from "react";
2
+ import type { FieldDefinition, FieldEditorProps, FieldType, FieldTypeDefinition, FilterOperator } from "./types.js";
3
+ export declare const FILTER_OPERATOR_LABELS: Record<FilterOperator, string>;
4
+ export declare function ReferenceEditor<Row>({ value, field, onCommit, onCancel }: FieldEditorProps<Row>): import("react/jsx-runtime").JSX.Element;
5
+ export declare const FIELD_TYPE_REGISTRY: Record<FieldType, FieldTypeDefinition>;
6
+ export declare function getFieldTypeDefinition(type: FieldType): FieldTypeDefinition;
7
+ export declare function renderFieldValue<Row>(value: unknown, field: FieldDefinition<Row>, row: Row): ReactNode;
8
+ /** The registry owns clipboard conversion too, so every view uses the same types. */
9
+ export declare function formatClipboardValue<Row>(value: unknown, field: FieldDefinition<Row>): string;
10
+ export declare function parseClipboardValue<Row>(text: string, field: FieldDefinition<Row>): unknown;
11
+ export declare function formatReadableValue<Row>(value: unknown, field: FieldDefinition<Row>, row: Row): string;
12
+ export declare function formatReadableRow<Row>(row: Row, fields: FieldDefinition<Row>[]): string;
13
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA0D,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAC/F,OAAO,KAAK,EAEV,eAAe,EACf,gBAAgB,EAChB,SAAS,EACT,mBAAmB,EACnB,cAAc,EAIf,MAAM,YAAY,CAAC;AAOpB,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAgBjE,CAAC;AAwNF,wBAAgB,eAAe,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,gBAAgB,CAAC,GAAG,CAAC,2CAe/F;AAgCD,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,SAAS,EAAE,mBAAmB,CAsDtE,CAAC;AAcF,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,SAAS,uBAErD;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,SAAS,CAMtG;AAED,qFAAqF;AACrF,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,CAAC,GAAG,CAAC,GAAG,MAAM,CAI7F;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,CAAC,GAAG,CAAC,GAAG,OAAO,CAiC3F;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,MAAM,CAMtG;AACD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,UAE9E"}