@humain/ui 2.1.62 → 2.1.65
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/components/organisms/ai/AIToolCall/AIToolCall.d.ts +9 -3
- package/dist/components/organisms/ai/AIToolRun/index.d.ts +1 -1
- package/dist/components/organisms/ai/AIToolRun/validation.d.ts +24 -3
- package/dist/components/organisms/ai/_shared/format-ai-duration.d.ts +1 -0
- package/dist/components/organisms/ai/_shared/workflow-step-renderer.d.ts +1 -0
- package/dist/index.js +52 -52
- package/dist/index151.js +1 -1
- package/dist/index174.js +10 -333
- package/dist/index174.js.map +1 -1
- package/dist/index175.js +310 -137
- package/dist/index175.js.map +1 -1
- package/dist/index176.js +148 -174
- package/dist/index176.js.map +1 -1
- package/dist/index177.js +186 -78
- package/dist/index177.js.map +1 -1
- package/dist/index178.js +74 -124
- package/dist/index178.js.map +1 -1
- package/dist/index179.js +133 -1
- package/dist/index179.js.map +1 -0
- package/dist/index180.js +2 -201
- package/dist/index181.js +201 -0
- package/dist/{index180.js.map → index181.js.map} +1 -1
- package/dist/index183.js +130 -166
- package/dist/index183.js.map +1 -1
- package/dist/index184.js +195 -983
- package/dist/index184.js.map +1 -1
- package/dist/index185.js +1069 -369
- package/dist/index185.js.map +1 -1
- package/dist/index186.js +395 -197
- package/dist/index186.js.map +1 -1
- package/dist/index187.js +198 -243
- package/dist/index187.js.map +1 -1
- package/dist/index188.js +263 -3
- package/dist/index188.js.map +1 -1
- package/dist/index189.js +3 -209
- package/dist/index189.js.map +1 -1
- package/dist/index190.js +190 -777
- package/dist/index190.js.map +1 -1
- package/dist/index191.js +771 -252
- package/dist/index191.js.map +1 -1
- package/dist/index192.js +250 -65
- package/dist/index192.js.map +1 -1
- package/dist/index193.js +72 -523
- package/dist/index193.js.map +1 -1
- package/dist/index194.js +537 -144
- package/dist/index194.js.map +1 -1
- package/dist/index195.js +139 -720
- package/dist/index195.js.map +1 -1
- package/dist/index196.js +707 -167
- package/dist/index196.js.map +1 -1
- package/dist/index197.js +175 -151
- package/dist/index197.js.map +1 -1
- package/dist/index198.js +152 -487
- package/dist/index198.js.map +1 -1
- package/dist/index199.js +472 -225
- package/dist/index199.js.map +1 -1
- package/dist/index200.js +236 -260
- package/dist/index200.js.map +1 -1
- package/dist/index201.js +265 -215
- package/dist/index201.js.map +1 -1
- package/dist/index202.js +207 -307
- package/dist/index202.js.map +1 -1
- package/dist/index203.js +302 -135
- package/dist/index203.js.map +1 -1
- package/dist/index204.js +140 -271
- package/dist/index204.js.map +1 -1
- package/dist/index205.js +263 -253
- package/dist/index205.js.map +1 -1
- package/dist/index206.js +244 -137
- package/dist/index206.js.map +1 -1
- package/dist/index207.js +100 -238
- package/dist/index207.js.map +1 -1
- package/dist/index208.js +278 -74
- package/dist/index208.js.map +1 -1
- package/dist/index209.js +56 -97
- package/dist/index209.js.map +1 -1
- package/dist/index210.js +142 -47
- package/dist/index210.js.map +1 -1
- package/dist/index211.js +38 -84
- package/dist/index211.js.map +1 -1
- package/dist/index212.js +72 -252
- package/dist/index212.js.map +1 -1
- package/dist/index213.js +274 -26
- package/dist/index213.js.map +1 -1
- package/dist/index214.js +29 -94
- package/dist/index214.js.map +1 -1
- package/dist/index215.js +98 -25
- package/dist/index215.js.map +1 -1
- package/dist/index216.js +20 -565
- package/dist/index216.js.map +1 -1
- package/dist/index217.js +564 -17
- package/dist/index217.js.map +1 -1
- package/dist/index218.js +20 -23
- package/dist/index218.js.map +1 -1
- package/dist/index219.js +20 -95
- package/dist/index219.js.map +1 -1
- package/dist/index220.js +92 -88
- package/dist/index220.js.map +1 -1
- package/dist/index221.js +97 -29
- package/dist/index221.js.map +1 -1
- package/dist/index222.js +24 -470
- package/dist/index222.js.map +1 -1
- package/dist/index223.js +446 -196
- package/dist/index223.js.map +1 -1
- package/dist/index224.js +199 -729
- package/dist/index224.js.map +1 -1
- package/dist/index225.js +750 -61
- package/dist/index225.js.map +1 -1
- package/dist/index226.js +58 -181
- package/dist/index226.js.map +1 -1
- package/dist/index227.js +175 -259
- package/dist/index227.js.map +1 -1
- package/dist/index228.js +246 -172
- package/dist/index228.js.map +1 -1
- package/dist/index229.js +195 -32
- package/dist/index229.js.map +1 -1
- package/dist/index230.js +12 -40
- package/dist/index230.js.map +1 -1
- package/dist/index231.js +23 -26
- package/dist/index231.js.map +1 -1
- package/dist/index232.js +45 -22
- package/dist/index232.js.map +1 -1
- package/dist/index233.js +27 -48
- package/dist/index233.js.map +1 -1
- package/dist/index234.js +52 -26
- package/dist/index234.js.map +1 -1
- package/dist/index235.js +40 -225
- package/dist/index235.js.map +1 -1
- package/dist/index236.js +217 -39
- package/dist/index236.js.map +1 -1
- package/dist/index237.js +50 -0
- package/dist/index237.js.map +1 -0
- package/dist/styles.css +1 -1
- package/dist/wc/AIToolCall.js +218 -0
- package/dist/wc/AIToolCall.js.map +1 -0
- package/dist/wc/hf-ai-tool-call.js +34 -219
- package/dist/wc/hf-ai-tool-call.js.map +1 -1
- package/dist/wc/hf-ai-tool-run.js +673 -576
- package/dist/wc/hf-ai-tool-run.js.map +1 -1
- package/dist/wc/workflow-step-renderer.js +94 -86
- package/dist/wc/workflow-step-renderer.js.map +1 -1
- package/dist/wc-react/AIToolCall.js +218 -0
- package/dist/wc-react/AIToolCall.js.map +1 -0
- package/dist/wc-react/hf-ai-tool-call.js +32 -217
- package/dist/wc-react/hf-ai-tool-call.js.map +1 -1
- package/dist/wc-react/hf-ai-tool-run.js +698 -601
- package/dist/wc-react/hf-ai-tool-run.js.map +1 -1
- package/dist/wc-react/workflow-step-renderer.js +76 -68
- package/dist/wc-react/workflow-step-renderer.js.map +1 -1
- package/package.json +1 -1
- package/skills/humain-ui/SKILL.md +1 -1
- package/skills/humain-ui-wc/SKILL.md +1 -1
- package/skills/humain-ui-wc.skill +0 -0
- package/skills/humain-ui.skill +0 -0
- package/dist/index182.js +0 -143
- package/dist/index182.js.map +0 -1
- package/dist/wc/wrench.js +0 -10
- package/dist/wc/wrench.js.map +0 -1
- package/dist/wc-react/wrench.js +0 -10
- package/dist/wc-react/wrench.js.map +0 -1
package/dist/index222.js
CHANGED
|
@@ -1,479 +1,33 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
import { Sheet as SheetNamespace, SheetContent } from "./index214.js";
|
|
6
|
-
import { useIsMobile } from "./index215.js";
|
|
7
|
-
import { SidebarContext } from "./index216.js";
|
|
8
|
-
import { AppShellProvider, PanelIndexContext, PanelLayoutContext } from "./index217.js";
|
|
9
|
-
import { AppShellContent } from "./index218.js";
|
|
10
|
-
import { AppShellMobileTabBar } from "./index219.js";
|
|
11
|
-
import { AppShellPanel } from "./index220.js";
|
|
12
|
-
import { getExpandedPanelFromLayout, layoutMapToTuple, normalizePanelSizes, toResizableMinSize, toResizablePercentageSize } from "./index221.js";
|
|
13
|
-
import * as React from "react";
|
|
14
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
15
|
-
//#region src/components/templates/AppShell/AppShell.tsx
|
|
16
|
-
var DEFAULT_APP_SHELL_BACKGROUND = "var(--app-background)";
|
|
17
|
-
function isAppShellPanelComponent(type) {
|
|
18
|
-
return typeof type === "function" && type.__appShellType === "AppShell.Panel";
|
|
1
|
+
//#region src/components/templates/AppShell/AppShellResize.ts
|
|
2
|
+
var DEFAULT_PANEL_SIZES = [35, 65];
|
|
3
|
+
function isFinitePositive(value) {
|
|
4
|
+
return Number.isFinite(value) && value > 0;
|
|
19
5
|
}
|
|
20
|
-
function
|
|
21
|
-
|
|
6
|
+
function normalizePanelSizes(sizes) {
|
|
7
|
+
if (!sizes) return DEFAULT_PANEL_SIZES;
|
|
8
|
+
const [first, second] = sizes;
|
|
9
|
+
if (!isFinitePositive(first) || !isFinitePositive(second)) return DEFAULT_PANEL_SIZES;
|
|
10
|
+
const total = first + second;
|
|
11
|
+
return [Number((first / total * 100).toFixed(4)), Number((second / total * 100).toFixed(4))];
|
|
22
12
|
}
|
|
23
|
-
function
|
|
24
|
-
return
|
|
13
|
+
function toResizablePercentageSize(size) {
|
|
14
|
+
return String(size);
|
|
25
15
|
}
|
|
26
|
-
function
|
|
27
|
-
if (
|
|
28
|
-
|
|
29
|
-
visible: isMobile ? true : visible,
|
|
30
|
-
collapseMode: hasExpanded ? "animated" : "removed",
|
|
31
|
-
isMobile,
|
|
32
|
-
tabId: hasTabBar ? `${ariaBaseId}-tab-${index}` : void 0,
|
|
33
|
-
panelId: hasTabBar ? `${ariaBaseId}-tabpanel-${index}` : void 0,
|
|
34
|
-
expanded: rootExpansionActive ? hasExpanded && index === firstExpandedIndex : void 0,
|
|
35
|
-
onExpandedChange: rootExpansionActive ? (nextExpanded) => onExpandedPanelChange(nextExpanded ? index : null) : void 0,
|
|
36
|
-
...overrides
|
|
37
|
-
};
|
|
38
|
-
return /* @__PURE__ */ jsx(PanelIndexContext.Provider, {
|
|
39
|
-
value: index,
|
|
40
|
-
children: /* @__PURE__ */ jsx(PanelLayoutContext.Provider, {
|
|
41
|
-
value: layoutInfo,
|
|
42
|
-
children: panel
|
|
43
|
-
})
|
|
44
|
-
});
|
|
16
|
+
function toResizableMinSize(minWidth) {
|
|
17
|
+
if (minWidth === void 0) return void 0;
|
|
18
|
+
return typeof minWidth === "number" ? `${minWidth}px` : minWidth;
|
|
45
19
|
}
|
|
46
|
-
function
|
|
47
|
-
|
|
48
|
-
const ariaBaseId = React.useId();
|
|
49
|
-
const [internalActivePanel, setInternalActivePanel] = React.useState(defaultActivePanel);
|
|
50
|
-
const [internalExpandedPanel, setInternalExpandedPanel] = React.useState(defaultExpandedPanel ?? null);
|
|
51
|
-
const [internalPanelSizes, setInternalPanelSizes] = React.useState(() => normalizePanelSizes(defaultPanelSizes));
|
|
52
|
-
const [isResizingPanels, setIsResizingPanels] = React.useState(false);
|
|
53
|
-
const [isRestoringResizablePanels, setIsRestoringResizablePanels] = React.useState(false);
|
|
54
|
-
const [internalMobileSidebarOpen, setInternalMobileSidebarOpen] = React.useState(false);
|
|
55
|
-
const resizableGroupRef = React.useRef(null);
|
|
56
|
-
const rootRef = React.useRef(null);
|
|
57
|
-
const allowResizeReleaseExpansionRef = React.useRef(false);
|
|
58
|
-
const suppressControlledLayoutChangeRef = React.useRef(false);
|
|
59
|
-
const previousResizableExpandedRef = React.useRef(false);
|
|
60
|
-
const activePanel = activePanelProp ?? internalActivePanel;
|
|
61
|
-
const handleActivePanelChange = React.useCallback((index) => {
|
|
62
|
-
if (activePanelProp === void 0) setInternalActivePanel((prev) => prev === index ? prev : index);
|
|
63
|
-
onActivePanelChange?.(index);
|
|
64
|
-
}, [activePanelProp, onActivePanelChange]);
|
|
65
|
-
const rootExpansionRequested = expandedPanelProp !== void 0 || defaultExpandedPanel !== void 0 || onExpandedPanelChange !== void 0;
|
|
66
|
-
const resolvedExpandedPanel = expandedPanelProp !== void 0 ? expandedPanelProp : internalExpandedPanel;
|
|
67
|
-
const handleExpandedPanelChange = React.useCallback((panelIndex) => {
|
|
68
|
-
if (expandedPanelProp === void 0) setInternalExpandedPanel(panelIndex);
|
|
69
|
-
onExpandedPanelChange?.(panelIndex);
|
|
70
|
-
}, [expandedPanelProp, onExpandedPanelChange]);
|
|
71
|
-
const { panels, panelInfos, sidebarChild, otherChildren } = React.useMemo(() => {
|
|
72
|
-
const p = [];
|
|
73
|
-
const infos = [];
|
|
74
|
-
let sidebar = null;
|
|
75
|
-
const other = [];
|
|
76
|
-
React.Children.forEach(children, (child) => {
|
|
77
|
-
if (isAppShellPanelElement(child)) {
|
|
78
|
-
infos.push({
|
|
79
|
-
key: child.key ?? child.props.label,
|
|
80
|
-
label: child.props.label
|
|
81
|
-
});
|
|
82
|
-
p.push(child);
|
|
83
|
-
return;
|
|
84
|
-
}
|
|
85
|
-
if (!React.isValidElement(child)) return;
|
|
86
|
-
if (child.type === AppShellSidebar) sidebar = child;
|
|
87
|
-
else other.push(child);
|
|
88
|
-
});
|
|
89
|
-
return {
|
|
90
|
-
panels: p,
|
|
91
|
-
panelInfos: infos,
|
|
92
|
-
sidebarChild: sidebar,
|
|
93
|
-
otherChildren: other
|
|
94
|
-
};
|
|
95
|
-
}, [children]);
|
|
96
|
-
const shouldUseResizablePanels = resizablePanels ?? true;
|
|
97
|
-
const firstPanelExpandedIndex = panels.findIndex((p) => p.props.expanded);
|
|
98
|
-
const hasPanelExpansionProps = panels.some((panel) => panel.props.expanded !== void 0 || panel.props.onExpandedChange !== void 0);
|
|
99
|
-
const canUseResizablePanelPair = shouldUseResizablePanels && !connected && !isMobile && panels.length === 2 && (resizablePanels !== void 0 || !hasPanelExpansionProps);
|
|
100
|
-
const rootExpansionActive = rootExpansionRequested || canUseResizablePanelPair;
|
|
101
|
-
const validRootExpandedPanel = typeof resolvedExpandedPanel === "number" && Number.isInteger(resolvedExpandedPanel) && resolvedExpandedPanel >= 0 && resolvedExpandedPanel < panels.length ? resolvedExpandedPanel : null;
|
|
102
|
-
let firstExpandedIndex = firstPanelExpandedIndex;
|
|
103
|
-
if (rootExpansionActive) firstExpandedIndex = validRootExpandedPanel;
|
|
104
|
-
const hasExpanded = firstExpandedIndex !== -1 && firstExpandedIndex !== null;
|
|
105
|
-
const visibleCount = hasExpanded ? 1 : Math.min(panels.length, 2);
|
|
106
|
-
const canRenderResizablePanels = canUseResizablePanelPair;
|
|
107
|
-
const resolvedPanelSizes = React.useMemo(() => normalizePanelSizes(panelSizes ?? internalPanelSizes), [panelSizes, internalPanelSizes]);
|
|
108
|
-
const resizablePanelSizes = React.useMemo(() => {
|
|
109
|
-
if (hasExpanded && firstExpandedIndex === 0) return [100, 0];
|
|
110
|
-
if (hasExpanded && firstExpandedIndex === 1) return [0, 100];
|
|
111
|
-
return resolvedPanelSizes;
|
|
112
|
-
}, [
|
|
113
|
-
firstExpandedIndex,
|
|
114
|
-
hasExpanded,
|
|
115
|
-
resolvedPanelSizes
|
|
116
|
-
]);
|
|
117
|
-
const shouldBypassResizableMinSize = hasExpanded || isRestoringResizablePanels || !hasExpanded && previousResizableExpandedRef.current;
|
|
118
|
-
if (process.env.NODE_ENV !== "production") {
|
|
119
|
-
const expandedPanelPropCount = panels.filter((p) => p.props.expanded).length;
|
|
120
|
-
if (rootExpansionActive && expandedPanelPropCount > 0) console.warn("AppShell.Root: root-owned expansion props should not be mixed with AppShell.Panel expanded. Root expansion will be used.");
|
|
121
|
-
if (!rootExpansionActive && expandedPanelPropCount > 1) console.warn("AppShell.Root: multiple panels have expanded={true}. Only the first expanded panel will be shown.");
|
|
122
|
-
if (rootExpansionActive && resolvedExpandedPanel !== null && resolvedExpandedPanel !== void 0 && validRootExpandedPanel === null) console.warn(`AppShell.Root: expandedPanel index ${resolvedExpandedPanel} is out of range. No panel will be expanded.`);
|
|
123
|
-
if (resizablePanels === true && connected) console.warn("AppShell.Root: resizablePanels is not supported with connected. Rendering non-resizable panels.");
|
|
124
|
-
if (resizablePanels === true && !connected && panels.length !== 2) console.warn(`AppShell.Root: resizablePanels requires exactly 2 Panel children, got ${panels.length}. Rendering non-resizable panels.`);
|
|
125
|
-
if (panels.length > 2 && !hasExpanded) console.warn(`AppShell.Root: max 2 Panel children allowed, got ${panels.length}. Only the first 2 will be visible.`);
|
|
126
|
-
}
|
|
127
|
-
const handleLayoutChange = React.useCallback((layout) => {
|
|
128
|
-
if (hasExpanded || suppressControlledLayoutChangeRef.current) return;
|
|
129
|
-
if (panelSizes === void 0) setInternalPanelSizes(layoutMapToTuple(layout));
|
|
130
|
-
}, [hasExpanded, panelSizes]);
|
|
131
|
-
const handleLayoutChanged = React.useCallback((layout) => {
|
|
132
|
-
if (hasExpanded || !allowResizeReleaseExpansionRef.current || suppressControlledLayoutChangeRef.current) return;
|
|
133
|
-
const nextSizes = layoutMapToTuple(layout);
|
|
134
|
-
if (panelSizes === void 0) setInternalPanelSizes(nextSizes);
|
|
135
|
-
onPanelSizesChange?.(nextSizes);
|
|
136
|
-
const expandedIndex = getExpandedPanelFromLayout(layout, expandThreshold);
|
|
137
|
-
if (expandedIndex !== null) handleExpandedPanelChange(expandedIndex);
|
|
138
|
-
}, [
|
|
139
|
-
expandThreshold,
|
|
140
|
-
handleExpandedPanelChange,
|
|
141
|
-
hasExpanded,
|
|
142
|
-
onPanelSizesChange,
|
|
143
|
-
panelSizes
|
|
144
|
-
]);
|
|
145
|
-
React.useEffect(() => {
|
|
146
|
-
if (!canRenderResizablePanels) {
|
|
147
|
-
suppressControlledLayoutChangeRef.current = false;
|
|
148
|
-
previousResizableExpandedRef.current = false;
|
|
149
|
-
return;
|
|
150
|
-
}
|
|
151
|
-
const ownerWindow = rootRef.current?.ownerDocument.defaultView;
|
|
152
|
-
if (!ownerWindow) return;
|
|
153
|
-
const wasExpanded = previousResizableExpandedRef.current;
|
|
154
|
-
previousResizableExpandedRef.current = hasExpanded;
|
|
155
|
-
if (!(hasExpanded || wasExpanded || panelSizes !== void 0)) {
|
|
156
|
-
suppressControlledLayoutChangeRef.current = false;
|
|
157
|
-
return;
|
|
158
|
-
}
|
|
159
|
-
let restoreFrame;
|
|
160
|
-
const [first, second] = resizablePanelSizes;
|
|
161
|
-
if (wasExpanded && !hasExpanded) restoreFrame = ownerWindow.requestAnimationFrame(() => {
|
|
162
|
-
setIsRestoringResizablePanels(true);
|
|
163
|
-
});
|
|
164
|
-
suppressControlledLayoutChangeRef.current = true;
|
|
165
|
-
const nextLayout = {
|
|
166
|
-
panel0: first,
|
|
167
|
-
panel1: second
|
|
168
|
-
};
|
|
169
|
-
resizableGroupRef.current?.setLayout(nextLayout);
|
|
170
|
-
const frame = ownerWindow.requestAnimationFrame(() => {
|
|
171
|
-
resizableGroupRef.current?.setLayout(nextLayout);
|
|
172
|
-
});
|
|
173
|
-
const timeout = ownerWindow.setTimeout(() => {
|
|
174
|
-
suppressControlledLayoutChangeRef.current = false;
|
|
175
|
-
}, 350);
|
|
176
|
-
return () => {
|
|
177
|
-
if (restoreFrame !== void 0) ownerWindow.cancelAnimationFrame(restoreFrame);
|
|
178
|
-
ownerWindow.cancelAnimationFrame(frame);
|
|
179
|
-
ownerWindow.clearTimeout(timeout);
|
|
180
|
-
suppressControlledLayoutChangeRef.current = false;
|
|
181
|
-
};
|
|
182
|
-
}, [
|
|
183
|
-
canRenderResizablePanels,
|
|
184
|
-
hasExpanded,
|
|
185
|
-
panelSizes,
|
|
186
|
-
resizablePanelSizes
|
|
187
|
-
]);
|
|
188
|
-
React.useEffect(() => {
|
|
189
|
-
if (!isRestoringResizablePanels) return;
|
|
190
|
-
const ownerWindow = rootRef.current?.ownerDocument.defaultView;
|
|
191
|
-
if (!ownerWindow) return;
|
|
192
|
-
const timeout = ownerWindow.setTimeout(() => {
|
|
193
|
-
setIsRestoringResizablePanels(false);
|
|
194
|
-
}, 350);
|
|
195
|
-
return () => ownerWindow.clearTimeout(timeout);
|
|
196
|
-
}, [isRestoringResizablePanels]);
|
|
197
|
-
React.useEffect(() => {
|
|
198
|
-
if (!canRenderResizablePanels) {
|
|
199
|
-
allowResizeReleaseExpansionRef.current = false;
|
|
200
|
-
suppressControlledLayoutChangeRef.current = false;
|
|
201
|
-
return;
|
|
202
|
-
}
|
|
203
|
-
const ownerWindow = rootRef.current?.ownerDocument.defaultView;
|
|
204
|
-
if (!ownerWindow) return;
|
|
205
|
-
const frame = ownerWindow.requestAnimationFrame(() => {
|
|
206
|
-
allowResizeReleaseExpansionRef.current = true;
|
|
207
|
-
});
|
|
208
|
-
return () => {
|
|
209
|
-
ownerWindow.cancelAnimationFrame(frame);
|
|
210
|
-
allowResizeReleaseExpansionRef.current = false;
|
|
211
|
-
};
|
|
212
|
-
}, [canRenderResizablePanels]);
|
|
213
|
-
React.useEffect(() => {
|
|
214
|
-
if (!isResizingPanels) return;
|
|
215
|
-
const ownerWindow = rootRef.current?.ownerDocument.defaultView;
|
|
216
|
-
if (!ownerWindow) return;
|
|
217
|
-
const stopResizing = () => setIsResizingPanels(false);
|
|
218
|
-
ownerWindow.addEventListener("pointerup", stopResizing);
|
|
219
|
-
ownerWindow.addEventListener("pointercancel", stopResizing);
|
|
220
|
-
return () => {
|
|
221
|
-
ownerWindow.removeEventListener("pointerup", stopResizing);
|
|
222
|
-
ownerWindow.removeEventListener("pointercancel", stopResizing);
|
|
223
|
-
};
|
|
224
|
-
}, [isResizingPanels]);
|
|
225
|
-
const handleResizablePointerDownCapture = React.useCallback((event) => {
|
|
226
|
-
const target = event.target;
|
|
227
|
-
if (!(target instanceof Element)) return;
|
|
228
|
-
if (target.closest("[data-slot=\"resizable-handle\"]")) setIsResizingPanels(true);
|
|
229
|
-
}, []);
|
|
230
|
-
const visiblePanels = React.useMemo(() => hasExpanded ? panels.map((panel, i) => ({
|
|
231
|
-
panel,
|
|
232
|
-
visible: i === firstExpandedIndex,
|
|
233
|
-
index: i
|
|
234
|
-
})) : panels.map((panel, i) => ({
|
|
235
|
-
panel,
|
|
236
|
-
visible: i < 2,
|
|
237
|
-
index: i
|
|
238
|
-
})), [
|
|
239
|
-
panels,
|
|
240
|
-
hasExpanded,
|
|
241
|
-
firstExpandedIndex
|
|
242
|
-
]);
|
|
243
|
-
const hasTabBar = isMobile && panels.length > 1;
|
|
244
|
-
const getPanelPosition = React.useCallback((index) => {
|
|
245
|
-
if (visibleCount === 1) return "only";
|
|
246
|
-
if (hasExpanded) return index === firstExpandedIndex ? "only" : "last";
|
|
247
|
-
return index === 0 ? "first" : "last";
|
|
248
|
-
}, [
|
|
249
|
-
visibleCount,
|
|
250
|
-
hasExpanded,
|
|
251
|
-
firstExpandedIndex
|
|
252
|
-
]);
|
|
253
|
-
const contextValue = React.useMemo(() => ({
|
|
254
|
-
connected,
|
|
255
|
-
panelCount: visibleCount,
|
|
256
|
-
getPanelPosition
|
|
257
|
-
}), [
|
|
258
|
-
connected,
|
|
259
|
-
visibleCount,
|
|
260
|
-
getPanelPosition
|
|
261
|
-
]);
|
|
262
|
-
const sidebarContext = React.useContext(SidebarContext);
|
|
263
|
-
const mobileSidebarOpen = sidebarContext?.openMobile ?? internalMobileSidebarOpen;
|
|
264
|
-
const setMobileSidebarOpen = sidebarContext?.setOpenMobile ?? setInternalMobileSidebarOpen;
|
|
265
|
-
const handleSidebarOpen = React.useCallback(() => {
|
|
266
|
-
setMobileSidebarOpen(true);
|
|
267
|
-
}, [setMobileSidebarOpen]);
|
|
268
|
-
const handleSheetOpenChange = React.useCallback((open) => {
|
|
269
|
-
setMobileSidebarOpen(open);
|
|
270
|
-
}, [setMobileSidebarOpen]);
|
|
271
|
-
const skipLink = skipToId ? /* @__PURE__ */ jsx("a", {
|
|
272
|
-
href: `#${skipToId}`,
|
|
273
|
-
className: "sr-only focus:not-sr-only focus:fixed focus:left-4 focus:top-4 focus:z-50 focus:rounded-md focus:bg-background focus:px-4 focus:py-2 focus:text-sm focus:font-medium focus:text-foreground focus:shadow-sm focus:ring-2 focus:ring-ring",
|
|
274
|
-
children: "Skip to content"
|
|
275
|
-
}) : null;
|
|
276
|
-
const renderedPanels = React.useMemo(() => visiblePanels.map(({ panel, visible, index }) => /* @__PURE__ */ jsx(AppShellPanelWithLayout, {
|
|
277
|
-
panel,
|
|
278
|
-
visible,
|
|
279
|
-
index,
|
|
280
|
-
isMobile,
|
|
281
|
-
activePanel,
|
|
282
|
-
hasExpanded,
|
|
283
|
-
hasTabBar,
|
|
284
|
-
ariaBaseId,
|
|
285
|
-
rootExpansionActive,
|
|
286
|
-
firstExpandedIndex,
|
|
287
|
-
onExpandedPanelChange: handleExpandedPanelChange
|
|
288
|
-
}, getAppShellPanelIdentity(panel, ariaBaseId, index))), [
|
|
289
|
-
visiblePanels,
|
|
290
|
-
ariaBaseId,
|
|
291
|
-
isMobile,
|
|
292
|
-
activePanel,
|
|
293
|
-
hasExpanded,
|
|
294
|
-
hasTabBar,
|
|
295
|
-
rootExpansionActive,
|
|
296
|
-
firstExpandedIndex,
|
|
297
|
-
handleExpandedPanelChange
|
|
298
|
-
]);
|
|
299
|
-
const renderedResizablePanels = canRenderResizablePanels ? /* @__PURE__ */ jsxs(ResizablePanelGroup, {
|
|
300
|
-
orientation: "horizontal",
|
|
301
|
-
disabled: hasExpanded,
|
|
302
|
-
groupRef: resizableGroupRef,
|
|
303
|
-
onLayoutChange: handleLayoutChange,
|
|
304
|
-
onLayoutChanged: handleLayoutChanged,
|
|
305
|
-
onPointerDownCapture: handleResizablePointerDownCapture,
|
|
306
|
-
className: cn("min-h-0 min-w-0 flex-1", !isResizingPanels && "[&>[data-slot=resizable-panel]]:transition-[flex-grow] [&>[data-slot=resizable-panel]]:duration-300 [&>[data-slot=resizable-panel]]:ease-[cubic-bezier(0.16,1,0.3,1)] motion-reduce:[&>[data-slot=resizable-panel]]:transition-none"),
|
|
307
|
-
children: [
|
|
308
|
-
/* @__PURE__ */ jsx(ResizablePanel, {
|
|
309
|
-
id: "panel0",
|
|
310
|
-
defaultSize: toResizablePercentageSize(resizablePanelSizes[0]),
|
|
311
|
-
minSize: shouldBypassResizableMinSize ? 0 : toResizableMinSize(panels[0].props.minWidth),
|
|
312
|
-
children: /* @__PURE__ */ jsx(AppShellPanelWithLayout, {
|
|
313
|
-
panel: panels[0],
|
|
314
|
-
visible: !hasExpanded || firstExpandedIndex === 0,
|
|
315
|
-
index: 0,
|
|
316
|
-
overrides: { sizeManagedByRoot: true },
|
|
317
|
-
isMobile,
|
|
318
|
-
activePanel,
|
|
319
|
-
hasExpanded,
|
|
320
|
-
hasTabBar,
|
|
321
|
-
ariaBaseId,
|
|
322
|
-
rootExpansionActive,
|
|
323
|
-
firstExpandedIndex,
|
|
324
|
-
onExpandedPanelChange: handleExpandedPanelChange
|
|
325
|
-
})
|
|
326
|
-
}),
|
|
327
|
-
/* @__PURE__ */ jsx(ResizableHandle, {
|
|
328
|
-
disabled: hasExpanded,
|
|
329
|
-
className: cn("z-10 min-w-2 shrink-0 cursor-col-resize w-[var(--app-shell-gap,0px)] bg-transparent after:w-2 hover:bg-transparent", "transition-[width,min-width,opacity,background-color] duration-300 ease-[cubic-bezier(0.16,1,0.3,1)] motion-reduce:transition-none", hasExpanded && "min-w-0 w-0 opacity-0 after:w-0 pointer-events-none")
|
|
330
|
-
}),
|
|
331
|
-
/* @__PURE__ */ jsx(ResizablePanel, {
|
|
332
|
-
id: "panel1",
|
|
333
|
-
defaultSize: toResizablePercentageSize(resizablePanelSizes[1]),
|
|
334
|
-
minSize: shouldBypassResizableMinSize ? 0 : toResizableMinSize(panels[1].props.minWidth),
|
|
335
|
-
children: /* @__PURE__ */ jsx(AppShellPanelWithLayout, {
|
|
336
|
-
panel: panels[1],
|
|
337
|
-
visible: !hasExpanded || firstExpandedIndex === 1,
|
|
338
|
-
index: 1,
|
|
339
|
-
overrides: { sizeManagedByRoot: true },
|
|
340
|
-
isMobile,
|
|
341
|
-
activePanel,
|
|
342
|
-
hasExpanded,
|
|
343
|
-
hasTabBar,
|
|
344
|
-
ariaBaseId,
|
|
345
|
-
rootExpansionActive,
|
|
346
|
-
firstExpandedIndex,
|
|
347
|
-
onExpandedPanelChange: handleExpandedPanelChange
|
|
348
|
-
})
|
|
349
|
-
})
|
|
350
|
-
]
|
|
351
|
-
}) : null;
|
|
352
|
-
const activeLabel = hasTabBar && panelInfos[activePanel] ? panelInfos[activePanel].label || `Panel ${activePanel + 1}` : null;
|
|
353
|
-
if (isMobile) return /* @__PURE__ */ jsx(AppShellProvider, {
|
|
354
|
-
value: contextValue,
|
|
355
|
-
children: /* @__PURE__ */ jsxs(AppShell$1, {
|
|
356
|
-
ref: rootRef,
|
|
357
|
-
background,
|
|
358
|
-
height,
|
|
359
|
-
padding,
|
|
360
|
-
mobilePadding,
|
|
361
|
-
gap: 0,
|
|
362
|
-
connected,
|
|
363
|
-
className,
|
|
364
|
-
...props,
|
|
365
|
-
children: [
|
|
366
|
-
skipLink,
|
|
367
|
-
sidebarChild && /* @__PURE__ */ jsx(SheetNamespace, {
|
|
368
|
-
open: mobileSidebarOpen,
|
|
369
|
-
onOpenChange: handleSheetOpenChange,
|
|
370
|
-
children: /* @__PURE__ */ jsx(SheetContent, {
|
|
371
|
-
side: "left",
|
|
372
|
-
showCloseButton: false,
|
|
373
|
-
className: "w-[280px] p-0",
|
|
374
|
-
"aria-label": "Sidebar navigation",
|
|
375
|
-
children: sidebarChild
|
|
376
|
-
})
|
|
377
|
-
}),
|
|
378
|
-
/* @__PURE__ */ jsxs("div", {
|
|
379
|
-
className: "flex h-full min-w-0 flex-1 flex-col overflow-clip",
|
|
380
|
-
children: [/* @__PURE__ */ jsx(AppShellMobileTabBar, {
|
|
381
|
-
panels: panelInfos,
|
|
382
|
-
activeIndex: activePanel,
|
|
383
|
-
onActiveChange: handleActivePanelChange,
|
|
384
|
-
onSidebarOpen: sidebarChild ? handleSidebarOpen : void 0,
|
|
385
|
-
baseId: ariaBaseId
|
|
386
|
-
}), /* @__PURE__ */ jsx("div", {
|
|
387
|
-
className: "flex min-h-0 flex-1",
|
|
388
|
-
children: renderedPanels
|
|
389
|
-
})]
|
|
390
|
-
}),
|
|
391
|
-
activeLabel && /* @__PURE__ */ jsxs("div", {
|
|
392
|
-
className: "sr-only",
|
|
393
|
-
role: "status",
|
|
394
|
-
"aria-live": "polite",
|
|
395
|
-
children: [activeLabel, " panel active"]
|
|
396
|
-
}),
|
|
397
|
-
otherChildren
|
|
398
|
-
]
|
|
399
|
-
})
|
|
400
|
-
});
|
|
401
|
-
return /* @__PURE__ */ jsx(AppShellProvider, {
|
|
402
|
-
value: contextValue,
|
|
403
|
-
children: /* @__PURE__ */ jsxs(AppShell$1, {
|
|
404
|
-
ref: rootRef,
|
|
405
|
-
background,
|
|
406
|
-
height,
|
|
407
|
-
padding,
|
|
408
|
-
mobilePadding,
|
|
409
|
-
gap: connected || hasExpanded ? 0 : gap,
|
|
410
|
-
connected,
|
|
411
|
-
className,
|
|
412
|
-
...props,
|
|
413
|
-
children: [
|
|
414
|
-
skipLink,
|
|
415
|
-
sidebarChild,
|
|
416
|
-
renderedResizablePanels ?? renderedPanels,
|
|
417
|
-
otherChildren
|
|
418
|
-
]
|
|
419
|
-
})
|
|
420
|
-
});
|
|
20
|
+
function layoutMapToTuple(layout) {
|
|
21
|
+
return normalizePanelSizes([layout.panel0, layout.panel1]);
|
|
421
22
|
}
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
* observes the child SidebarProvider's `data-state` attribute via CSS `:has()`
|
|
429
|
-
* and transitions between `collapsedWidth` and `expandedWidth` automatically.
|
|
430
|
-
*
|
|
431
|
-
* **Manual mode:** Pass an explicit `width` to control sizing yourself.
|
|
432
|
-
*/
|
|
433
|
-
function AppShellSidebar({ width, expandedWidth = "280px", collapsedWidth = "64px", className, style, children, ...props }) {
|
|
434
|
-
const autoMode = !width;
|
|
435
|
-
return /* @__PURE__ */ jsx("div", {
|
|
436
|
-
"data-slot": "app-shell-sidebar",
|
|
437
|
-
style: {
|
|
438
|
-
...autoMode ? {
|
|
439
|
-
"--app-shell-sidebar-collapsed": collapsedWidth,
|
|
440
|
-
"--app-shell-sidebar-expanded": expandedWidth
|
|
441
|
-
} : { "--app-shell-sidebar-width": width },
|
|
442
|
-
...style
|
|
443
|
-
},
|
|
444
|
-
className: cn("flex h-full shrink-0 flex-col overflow-clip", "transition-[width] duration-300 ease-[cubic-bezier(0.16,1,0.3,1)]", "motion-reduce:transition-none", autoMode ? ["w-[var(--app-shell-sidebar-collapsed,64px)]", "[&:has([data-state=expanded])]:w-[var(--app-shell-sidebar-expanded,280px)]"] : "w-[var(--app-shell-sidebar-width,64px)]", className),
|
|
445
|
-
...props,
|
|
446
|
-
children
|
|
447
|
-
});
|
|
23
|
+
function getExpandedPanelFromLayout(layout, threshold = 85) {
|
|
24
|
+
const first = layout.panel0;
|
|
25
|
+
const second = layout.panel1;
|
|
26
|
+
if (first >= threshold) return 0;
|
|
27
|
+
if (second >= threshold) return 1;
|
|
28
|
+
return null;
|
|
448
29
|
}
|
|
449
|
-
AppShellSidebar.displayName = "AppShell.Sidebar";
|
|
450
|
-
function AppShellHeader({ className, children, ...props }) {
|
|
451
|
-
return /* @__PURE__ */ jsx("div", {
|
|
452
|
-
"data-slot": "app-shell-header",
|
|
453
|
-
className: cn("shrink-0", className),
|
|
454
|
-
...props,
|
|
455
|
-
children
|
|
456
|
-
});
|
|
457
|
-
}
|
|
458
|
-
AppShellHeader.displayName = "AppShell.Header";
|
|
459
|
-
var appShellBackgrounds = {
|
|
460
|
-
transparent: "transparent",
|
|
461
|
-
appBg: DEFAULT_APP_SHELL_BACKGROUND,
|
|
462
|
-
neutral: "var(--muted)",
|
|
463
|
-
brandSubtle: "linear-gradient(135deg, var(--air-50) 0%, var(--air-100) 100%)",
|
|
464
|
-
brand: "linear-gradient(135deg, var(--air-400) 0%, var(--primary) 100%)",
|
|
465
|
-
brandDeep: "linear-gradient(135deg, var(--primary) 0%, var(--air-900) 100%)",
|
|
466
|
-
desertMidnight: "linear-gradient(135deg, var(--slate-500) 0%, var(--slate-700) 100%)",
|
|
467
|
-
aqua: "linear-gradient(135deg, var(--air-400) 0%, var(--air-600) 100%)"
|
|
468
|
-
};
|
|
469
|
-
var AppShell = Object.assign(AppShellRoot, {
|
|
470
|
-
Root: AppShellRoot,
|
|
471
|
-
Sidebar: AppShellSidebar,
|
|
472
|
-
Header: AppShellHeader,
|
|
473
|
-
Panel: AppShellPanel,
|
|
474
|
-
Content: AppShellContent
|
|
475
|
-
});
|
|
476
30
|
//#endregion
|
|
477
|
-
export {
|
|
31
|
+
export { DEFAULT_PANEL_SIZES, getExpandedPanelFromLayout, layoutMapToTuple, normalizePanelSizes, toResizableMinSize, toResizablePercentageSize };
|
|
478
32
|
|
|
479
33
|
//# sourceMappingURL=index222.js.map
|
package/dist/index222.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index222.js","names":[],"sources":["../src/components/templates/AppShell/AppShell.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport type { GroupImperativeHandle } from 'react-resizable-panels';\nimport {\n ResizableHandle,\n ResizablePanel,\n ResizablePanelGroup,\n} from '@/components/atoms/layout/Resizable';\nimport { AppShell as AppShellPrimitive } from '@/components/ui/app-shell';\n\nimport { Sheet, SheetContent } from '@/components/ui/sheet';\nimport { SidebarContext } from '@/components/ui/sidebar';\nimport { useIsMobile } from '@/hooks/use-mobile';\nimport { cn } from '@/lib/utils';\nimport { AppShellContent } from './AppShellContent';\nimport {\n type AppShellContextValue,\n AppShellProvider,\n PanelIndexContext,\n PanelLayoutContext,\n type PanelLayoutInfo,\n type PanelPosition,\n} from './AppShellContext';\nimport { AppShellMobileTabBar } from './AppShellMobileTabBar';\nimport {\n APPSHELL_PANEL_TYPE,\n AppShellPanel,\n type AppShellPanelComponent,\n type AppShellPanelProps,\n} from './AppShellPanel';\nimport {\n DEFAULT_EXPAND_THRESHOLD,\n getExpandedPanelFromLayout,\n layoutMapToTuple,\n normalizePanelSizes,\n toResizableMinSize,\n toResizablePercentageSize,\n} from './AppShellResize';\n\nconst DEFAULT_APP_SHELL_BACKGROUND = 'var(--app-background)';\n\ninterface AppShellPanelMarker {\n __appShellType?: unknown;\n}\n\nfunction isAppShellPanelComponent(\n type: unknown,\n): type is AppShellPanelComponent {\n return (\n typeof type === 'function' &&\n (type as AppShellPanelMarker).__appShellType === APPSHELL_PANEL_TYPE\n );\n}\n\nfunction isAppShellPanelElement(\n child: React.ReactNode,\n): child is React.ReactElement<AppShellPanelProps, AppShellPanelComponent> {\n return React.isValidElement(child) && isAppShellPanelComponent(child.type);\n}\n\nfunction getAppShellPanelIdentity(\n panel: React.ReactElement<AppShellPanelProps>,\n ariaBaseId: string,\n index: number,\n): React.Key {\n return panel.key ?? panel.props.label ?? `${ariaBaseId}-panel-${index}`;\n}\n\ninterface AppShellPanelWithLayoutProps {\n panel: React.ReactElement<AppShellPanelProps>;\n visible: boolean;\n index: number;\n overrides?: Partial<PanelLayoutInfo>;\n isMobile: boolean;\n activePanel: number;\n hasExpanded: boolean;\n hasTabBar: boolean;\n ariaBaseId: string;\n rootExpansionActive: boolean;\n firstExpandedIndex: number | null;\n onExpandedPanelChange: (panelIndex: number | null) => void;\n}\n\nfunction AppShellPanelWithLayout({\n panel,\n visible,\n index,\n overrides = {},\n isMobile,\n activePanel,\n hasExpanded,\n hasTabBar,\n ariaBaseId,\n rootExpansionActive,\n firstExpandedIndex,\n onExpandedPanelChange,\n}: AppShellPanelWithLayoutProps) {\n if (isMobile && index !== activePanel) return null;\n\n const layoutInfo: PanelLayoutInfo = {\n visible: isMobile ? true : visible,\n collapseMode: hasExpanded ? 'animated' : 'removed',\n isMobile,\n tabId: hasTabBar ? `${ariaBaseId}-tab-${index}` : undefined,\n panelId: hasTabBar ? `${ariaBaseId}-tabpanel-${index}` : undefined,\n expanded: rootExpansionActive\n ? hasExpanded && index === firstExpandedIndex\n : undefined,\n onExpandedChange: rootExpansionActive\n ? (nextExpanded) => onExpandedPanelChange(nextExpanded ? index : null)\n : undefined,\n ...overrides,\n };\n\n return (\n <PanelIndexContext.Provider value={index}>\n <PanelLayoutContext.Provider value={layoutInfo}>\n {panel}\n </PanelLayoutContext.Provider>\n </PanelIndexContext.Provider>\n );\n}\n\n// ============================================\n// AppShell Root\n// ============================================\n\nexport interface AppShellProps extends React.ComponentProps<'div'> {\n /** Any CSS background value (color, gradient, image). Defaults to var(--app-background). */\n background?: string;\n /** Fixed height, supports CSS calc() */\n height?: string;\n /** Spacing around the inner content in pixels or CSS value */\n padding?: number | string;\n /** Padding on mobile viewports. Defaults to 8px. */\n mobilePadding?: number | string;\n /** Gap between panels in pixels or CSS value. Defaults to 12. */\n gap?: number | string;\n /** Joined-edge mode where panels share borders. Defaults to false. */\n connected?: boolean;\n /** ID of the main content element for skip navigation. */\n skipToId?: string;\n /** Controlled active panel index for mobile tab switching. */\n activePanel?: number;\n /** Callback when active panel changes on mobile. */\n onActivePanelChange?: (index: number) => void;\n /** Default active panel on mobile (default: 0). */\n defaultActivePanel?: number;\n /** Controlled expanded panel index. Use null for no expanded panel. */\n expandedPanel?: number | null;\n /** Initial expanded panel index for uncontrolled root-owned expansion. */\n defaultExpandedPanel?: number | null;\n /** Callback when root-owned expansion changes. */\n onExpandedPanelChange?: (panelIndex: number | null) => void;\n /** Enables root-owned two-panel resizing on desktop. Defaults to true for eligible two-panel layouts. */\n resizablePanels?: boolean;\n /** Initial panel size split in percentages. Defaults to [35, 65]. */\n defaultPanelSizes?: [number, number];\n /** Controlled panel size split in percentages. */\n panelSizes?: [number, number];\n /** Called after the user releases the resize handle. */\n onPanelSizesChange?: (sizes: [number, number]) => void;\n /** Percentage threshold that expands the dominant panel on release. */\n expandThreshold?: number;\n}\n\nfunction AppShellRoot({\n background = DEFAULT_APP_SHELL_BACKGROUND,\n height = '100dvh',\n padding = 16,\n mobilePadding,\n gap = 12,\n connected = false,\n skipToId,\n activePanel: activePanelProp,\n onActivePanelChange,\n defaultActivePanel = 0,\n expandedPanel: expandedPanelProp,\n defaultExpandedPanel,\n onExpandedPanelChange,\n resizablePanels,\n defaultPanelSizes,\n panelSizes,\n onPanelSizesChange,\n expandThreshold = DEFAULT_EXPAND_THRESHOLD,\n className,\n children,\n ...props\n}: AppShellProps): React.ReactElement {\n const isMobile = useIsMobile();\n const ariaBaseId = React.useId();\n const [internalActivePanel, setInternalActivePanel] =\n React.useState(defaultActivePanel);\n const [internalExpandedPanel, setInternalExpandedPanel] = React.useState<\n number | null\n >(defaultExpandedPanel ?? null);\n const [internalPanelSizes, setInternalPanelSizes] = React.useState(() =>\n normalizePanelSizes(defaultPanelSizes),\n );\n const [isResizingPanels, setIsResizingPanels] = React.useState(false);\n const [isRestoringResizablePanels, setIsRestoringResizablePanels] =\n React.useState(false);\n const [internalMobileSidebarOpen, setInternalMobileSidebarOpen] =\n React.useState(false);\n const resizableGroupRef = React.useRef<GroupImperativeHandle | null>(null);\n const rootRef = React.useRef<HTMLDivElement>(null);\n const allowResizeReleaseExpansionRef = React.useRef(false);\n const suppressControlledLayoutChangeRef = React.useRef(false);\n const previousResizableExpandedRef = React.useRef(false);\n\n const activePanel = activePanelProp ?? internalActivePanel;\n const handleActivePanelChange = React.useCallback(\n (index: number) => {\n if (activePanelProp === undefined) {\n setInternalActivePanel((prev) => (prev === index ? prev : index));\n }\n onActivePanelChange?.(index);\n },\n [activePanelProp, onActivePanelChange],\n );\n\n const rootExpansionRequested =\n expandedPanelProp !== undefined ||\n defaultExpandedPanel !== undefined ||\n onExpandedPanelChange !== undefined;\n const resolvedExpandedPanel =\n expandedPanelProp !== undefined ? expandedPanelProp : internalExpandedPanel;\n const handleExpandedPanelChange = React.useCallback(\n (panelIndex: number | null) => {\n if (expandedPanelProp === undefined) {\n setInternalExpandedPanel(panelIndex);\n }\n onExpandedPanelChange?.(panelIndex);\n },\n [expandedPanelProp, onExpandedPanelChange],\n );\n\n // Classify children (memoized to stabilize downstream references)\n const { panels, panelInfos, sidebarChild, otherChildren } =\n React.useMemo(() => {\n const p: React.ReactElement<AppShellPanelProps>[] = [];\n const infos: { key?: React.Key; label?: string }[] = [];\n let sidebar: React.ReactNode = null;\n const other: React.ReactNode[] = [];\n\n React.Children.forEach(children, (child) => {\n if (isAppShellPanelElement(child)) {\n infos.push({\n key: child.key ?? child.props.label,\n label: child.props.label,\n });\n p.push(child);\n return;\n }\n\n if (!React.isValidElement(child)) {\n return;\n }\n\n if (child.type === AppShellSidebar) {\n sidebar = child;\n } else {\n other.push(child);\n }\n });\n\n return {\n panels: p,\n panelInfos: infos,\n sidebarChild: sidebar,\n otherChildren: other,\n };\n }, [children]);\n\n const shouldUseResizablePanels = resizablePanels ?? true;\n\n // Determine which panels are visible\n const firstPanelExpandedIndex = panels.findIndex((p) => p.props.expanded);\n const hasPanelExpansionProps = panels.some(\n (panel) =>\n panel.props.expanded !== undefined ||\n panel.props.onExpandedChange !== undefined,\n );\n const canUseResizablePanelPair =\n shouldUseResizablePanels &&\n !connected &&\n !isMobile &&\n panels.length === 2 &&\n (resizablePanels !== undefined || !hasPanelExpansionProps);\n const rootExpansionActive =\n rootExpansionRequested || canUseResizablePanelPair;\n const validRootExpandedPanel =\n typeof resolvedExpandedPanel === 'number' &&\n Number.isInteger(resolvedExpandedPanel) &&\n resolvedExpandedPanel >= 0 &&\n resolvedExpandedPanel < panels.length\n ? resolvedExpandedPanel\n : null;\n let firstExpandedIndex: number | null = firstPanelExpandedIndex;\n if (rootExpansionActive) {\n firstExpandedIndex = validRootExpandedPanel;\n }\n const hasExpanded = firstExpandedIndex !== -1 && firstExpandedIndex !== null;\n const visibleCount = hasExpanded ? 1 : Math.min(panels.length, 2);\n const canRenderResizablePanels = canUseResizablePanelPair;\n const resolvedPanelSizes = React.useMemo(\n () => normalizePanelSizes(panelSizes ?? internalPanelSizes),\n [panelSizes, internalPanelSizes],\n );\n const resizablePanelSizes = React.useMemo<[number, number]>(() => {\n if (hasExpanded && firstExpandedIndex === 0) return [100, 0];\n if (hasExpanded && firstExpandedIndex === 1) return [0, 100];\n return resolvedPanelSizes;\n }, [firstExpandedIndex, hasExpanded, resolvedPanelSizes]);\n const shouldBypassResizableMinSize =\n hasExpanded ||\n isRestoringResizablePanels ||\n (!hasExpanded && previousResizableExpandedRef.current);\n\n // Dev warnings\n if (process.env.NODE_ENV !== 'production') {\n const expandedPanelPropCount = panels.filter(\n (p) => p.props.expanded,\n ).length;\n if (rootExpansionActive && expandedPanelPropCount > 0) {\n console.warn(\n 'AppShell.Root: root-owned expansion props should not be mixed with AppShell.Panel expanded. Root expansion will be used.',\n );\n }\n if (!rootExpansionActive && expandedPanelPropCount > 1) {\n console.warn(\n 'AppShell.Root: multiple panels have expanded={true}. Only the first expanded panel will be shown.',\n );\n }\n if (\n rootExpansionActive &&\n resolvedExpandedPanel !== null &&\n resolvedExpandedPanel !== undefined &&\n validRootExpandedPanel === null\n ) {\n console.warn(\n `AppShell.Root: expandedPanel index ${resolvedExpandedPanel} is out of range. No panel will be expanded.`,\n );\n }\n if (resizablePanels === true && connected) {\n console.warn(\n 'AppShell.Root: resizablePanels is not supported with connected. Rendering non-resizable panels.',\n );\n }\n if (resizablePanels === true && !connected && panels.length !== 2) {\n console.warn(\n `AppShell.Root: resizablePanels requires exactly 2 Panel children, got ${panels.length}. Rendering non-resizable panels.`,\n );\n }\n if (panels.length > 2 && !hasExpanded) {\n console.warn(\n `AppShell.Root: max 2 Panel children allowed, got ${panels.length}. Only the first 2 will be visible.`,\n );\n }\n }\n\n const handleLayoutChange = React.useCallback(\n (layout: Record<string, number>) => {\n if (hasExpanded || suppressControlledLayoutChangeRef.current) {\n return;\n }\n if (panelSizes === undefined) {\n setInternalPanelSizes(layoutMapToTuple(layout));\n }\n },\n [hasExpanded, panelSizes],\n );\n\n const handleLayoutChanged = React.useCallback(\n (layout: Record<string, number>) => {\n if (\n hasExpanded ||\n !allowResizeReleaseExpansionRef.current ||\n suppressControlledLayoutChangeRef.current\n ) {\n return;\n }\n\n const nextSizes = layoutMapToTuple(layout);\n if (panelSizes === undefined) {\n setInternalPanelSizes(nextSizes);\n }\n onPanelSizesChange?.(nextSizes);\n\n const expandedIndex = getExpandedPanelFromLayout(layout, expandThreshold);\n if (expandedIndex !== null) {\n handleExpandedPanelChange(expandedIndex);\n }\n },\n [\n expandThreshold,\n handleExpandedPanelChange,\n hasExpanded,\n onPanelSizesChange,\n panelSizes,\n ],\n );\n\n React.useEffect(() => {\n if (!canRenderResizablePanels) {\n suppressControlledLayoutChangeRef.current = false;\n previousResizableExpandedRef.current = false;\n return;\n }\n\n const ownerWindow = rootRef.current?.ownerDocument.defaultView;\n if (!ownerWindow) return;\n\n const wasExpanded = previousResizableExpandedRef.current;\n previousResizableExpandedRef.current = hasExpanded;\n const shouldApplyLayout =\n hasExpanded || wasExpanded || panelSizes !== undefined;\n if (!shouldApplyLayout) {\n suppressControlledLayoutChangeRef.current = false;\n return;\n }\n\n let restoreFrame: number | undefined;\n const [first, second] = resizablePanelSizes;\n if (wasExpanded && !hasExpanded) {\n restoreFrame = ownerWindow.requestAnimationFrame(() => {\n setIsRestoringResizablePanels(true);\n });\n }\n suppressControlledLayoutChangeRef.current = true;\n const nextLayout = { panel0: first, panel1: second };\n resizableGroupRef.current?.setLayout(nextLayout);\n const frame = ownerWindow.requestAnimationFrame(() => {\n resizableGroupRef.current?.setLayout(nextLayout);\n });\n const timeout = ownerWindow.setTimeout(() => {\n suppressControlledLayoutChangeRef.current = false;\n }, 350);\n return () => {\n if (restoreFrame !== undefined) {\n ownerWindow.cancelAnimationFrame(restoreFrame);\n }\n ownerWindow.cancelAnimationFrame(frame);\n ownerWindow.clearTimeout(timeout);\n suppressControlledLayoutChangeRef.current = false;\n };\n }, [canRenderResizablePanels, hasExpanded, panelSizes, resizablePanelSizes]);\n\n React.useEffect(() => {\n if (!isRestoringResizablePanels) return;\n\n const ownerWindow = rootRef.current?.ownerDocument.defaultView;\n if (!ownerWindow) return;\n\n const timeout = ownerWindow.setTimeout(() => {\n setIsRestoringResizablePanels(false);\n }, 350);\n return () => ownerWindow.clearTimeout(timeout);\n }, [isRestoringResizablePanels]);\n\n React.useEffect(() => {\n if (!canRenderResizablePanels) {\n allowResizeReleaseExpansionRef.current = false;\n suppressControlledLayoutChangeRef.current = false;\n return;\n }\n\n const ownerWindow = rootRef.current?.ownerDocument.defaultView;\n if (!ownerWindow) return;\n\n const frame = ownerWindow.requestAnimationFrame(() => {\n allowResizeReleaseExpansionRef.current = true;\n });\n return () => {\n ownerWindow.cancelAnimationFrame(frame);\n allowResizeReleaseExpansionRef.current = false;\n };\n }, [canRenderResizablePanels]);\n\n React.useEffect(() => {\n if (!isResizingPanels) return;\n const ownerWindow = rootRef.current?.ownerDocument.defaultView;\n if (!ownerWindow) return;\n\n const stopResizing = () => setIsResizingPanels(false);\n ownerWindow.addEventListener('pointerup', stopResizing);\n ownerWindow.addEventListener('pointercancel', stopResizing);\n return () => {\n ownerWindow.removeEventListener('pointerup', stopResizing);\n ownerWindow.removeEventListener('pointercancel', stopResizing);\n };\n }, [isResizingPanels]);\n\n const handleResizablePointerDownCapture = React.useCallback(\n (event: React.PointerEvent<HTMLDivElement>) => {\n const target = event.target;\n if (!(target instanceof Element)) return;\n if (target.closest('[data-slot=\"resizable-handle\"]')) {\n setIsResizingPanels(true);\n }\n },\n [],\n );\n\n // Memoize the visibility map to stabilize downstream context values\n const visiblePanels = React.useMemo(\n () =>\n hasExpanded\n ? panels.map((panel, i) => ({\n panel,\n visible: i === firstExpandedIndex,\n index: i,\n }))\n : panels.map((panel, i) => ({\n panel,\n visible: i < 2,\n index: i,\n })),\n [panels, hasExpanded, firstExpandedIndex],\n );\n\n // Whether the tab bar is active (mobile with 2+ panels)\n const hasTabBar = isMobile && panels.length > 1;\n\n // Build context (derive position from stable scalars, not array reference)\n const getPanelPosition = React.useCallback(\n (index: number): PanelPosition => {\n if (visibleCount === 1) return 'only';\n if (hasExpanded) return index === firstExpandedIndex ? 'only' : 'last';\n return index === 0 ? 'first' : 'last';\n },\n [visibleCount, hasExpanded, firstExpandedIndex],\n );\n\n const contextValue: AppShellContextValue = React.useMemo(\n () => ({\n connected,\n panelCount: visibleCount,\n getPanelPosition,\n }),\n [connected, visibleCount, getPanelPosition],\n );\n\n // Sidebar context for mobile drawer integration\n const sidebarContext = React.useContext(SidebarContext);\n const mobileSidebarOpen =\n sidebarContext?.openMobile ?? internalMobileSidebarOpen;\n const setMobileSidebarOpen =\n sidebarContext?.setOpenMobile ?? setInternalMobileSidebarOpen;\n const handleSidebarOpen = React.useCallback(() => {\n setMobileSidebarOpen(true);\n }, [setMobileSidebarOpen]);\n\n const handleSheetOpenChange = React.useCallback(\n (open: boolean) => {\n setMobileSidebarOpen(open);\n },\n [setMobileSidebarOpen],\n );\n\n // Skip navigation link\n const skipLink = skipToId ? (\n <a\n href={`#${skipToId}`}\n className=\"sr-only focus:not-sr-only focus:fixed focus:left-4 focus:top-4 focus:z-50 focus:rounded-md focus:bg-background focus:px-4 focus:py-2 focus:text-sm focus:font-medium focus:text-foreground focus:shadow-sm focus:ring-2 focus:ring-ring\"\n >\n Skip to content\n </a>\n ) : null;\n\n // Render panels with context providers (no cloneElement — panels self-style)\n const renderedPanels = React.useMemo(\n () =>\n visiblePanels.map(({ panel, visible, index }) => (\n <AppShellPanelWithLayout\n key={getAppShellPanelIdentity(panel, ariaBaseId, index)}\n panel={panel}\n visible={visible}\n index={index}\n isMobile={isMobile}\n activePanel={activePanel}\n hasExpanded={hasExpanded}\n hasTabBar={hasTabBar}\n ariaBaseId={ariaBaseId}\n rootExpansionActive={rootExpansionActive}\n firstExpandedIndex={firstExpandedIndex}\n onExpandedPanelChange={handleExpandedPanelChange}\n />\n )),\n [\n visiblePanels,\n ariaBaseId,\n isMobile,\n activePanel,\n hasExpanded,\n hasTabBar,\n rootExpansionActive,\n firstExpandedIndex,\n handleExpandedPanelChange,\n ],\n );\n\n const renderedResizablePanels = canRenderResizablePanels ? (\n <ResizablePanelGroup\n orientation=\"horizontal\"\n disabled={hasExpanded}\n groupRef={resizableGroupRef}\n onLayoutChange={handleLayoutChange}\n onLayoutChanged={handleLayoutChanged}\n onPointerDownCapture={handleResizablePointerDownCapture}\n className={cn(\n 'min-h-0 min-w-0 flex-1',\n !isResizingPanels &&\n '[&>[data-slot=resizable-panel]]:transition-[flex-grow] [&>[data-slot=resizable-panel]]:duration-300 [&>[data-slot=resizable-panel]]:ease-[cubic-bezier(0.16,1,0.3,1)] motion-reduce:[&>[data-slot=resizable-panel]]:transition-none',\n )}\n >\n <ResizablePanel\n id=\"panel0\"\n defaultSize={toResizablePercentageSize(resizablePanelSizes[0])}\n minSize={\n shouldBypassResizableMinSize\n ? 0\n : toResizableMinSize(panels[0].props.minWidth)\n }\n >\n <AppShellPanelWithLayout\n panel={panels[0]}\n visible={!hasExpanded || firstExpandedIndex === 0}\n index={0}\n overrides={{ sizeManagedByRoot: true }}\n isMobile={isMobile}\n activePanel={activePanel}\n hasExpanded={hasExpanded}\n hasTabBar={hasTabBar}\n ariaBaseId={ariaBaseId}\n rootExpansionActive={rootExpansionActive}\n firstExpandedIndex={firstExpandedIndex}\n onExpandedPanelChange={handleExpandedPanelChange}\n />\n </ResizablePanel>\n <ResizableHandle\n disabled={hasExpanded}\n className={cn(\n 'z-10 min-w-2 shrink-0 cursor-col-resize w-[var(--app-shell-gap,0px)] bg-transparent after:w-2 hover:bg-transparent',\n 'transition-[width,min-width,opacity,background-color] duration-300 ease-[cubic-bezier(0.16,1,0.3,1)] motion-reduce:transition-none',\n hasExpanded && 'min-w-0 w-0 opacity-0 after:w-0 pointer-events-none',\n )}\n />\n <ResizablePanel\n id=\"panel1\"\n defaultSize={toResizablePercentageSize(resizablePanelSizes[1])}\n minSize={\n shouldBypassResizableMinSize\n ? 0\n : toResizableMinSize(panels[1].props.minWidth)\n }\n >\n <AppShellPanelWithLayout\n panel={panels[1]}\n visible={!hasExpanded || firstExpandedIndex === 1}\n index={1}\n overrides={{ sizeManagedByRoot: true }}\n isMobile={isMobile}\n activePanel={activePanel}\n hasExpanded={hasExpanded}\n hasTabBar={hasTabBar}\n ariaBaseId={ariaBaseId}\n rootExpansionActive={rootExpansionActive}\n firstExpandedIndex={firstExpandedIndex}\n onExpandedPanelChange={handleExpandedPanelChange}\n />\n </ResizablePanel>\n </ResizablePanelGroup>\n ) : null;\n\n // Live region for announcing panel changes to screen readers\n const activeLabel =\n hasTabBar && panelInfos[activePanel]\n ? panelInfos[activePanel].label || `Panel ${activePanel + 1}`\n : null;\n\n // Mobile layout\n if (isMobile) {\n return (\n <AppShellProvider value={contextValue}>\n <AppShellPrimitive\n ref={rootRef}\n background={background}\n height={height}\n padding={padding}\n mobilePadding={mobilePadding}\n gap={0}\n connected={connected}\n className={className}\n {...props}\n >\n {skipLink}\n {sidebarChild && (\n <Sheet\n open={mobileSidebarOpen}\n onOpenChange={handleSheetOpenChange}\n >\n <SheetContent\n side=\"left\"\n showCloseButton={false}\n className=\"w-[280px] p-0\"\n aria-label=\"Sidebar navigation\"\n >\n {sidebarChild}\n </SheetContent>\n </Sheet>\n )}\n <div className=\"flex h-full min-w-0 flex-1 flex-col overflow-clip\">\n <AppShellMobileTabBar\n panels={panelInfos}\n activeIndex={activePanel}\n onActiveChange={handleActivePanelChange}\n onSidebarOpen={sidebarChild ? handleSidebarOpen : undefined}\n baseId={ariaBaseId}\n />\n <div className=\"flex min-h-0 flex-1\">{renderedPanels}</div>\n </div>\n {/* Live region for panel switch announcements */}\n {activeLabel && (\n <div className=\"sr-only\" role=\"status\" aria-live=\"polite\">\n {activeLabel} panel active\n </div>\n )}\n {otherChildren}\n </AppShellPrimitive>\n </AppShellProvider>\n );\n }\n\n // Desktop layout\n const effectiveGap = connected || hasExpanded ? 0 : gap;\n\n return (\n <AppShellProvider value={contextValue}>\n <AppShellPrimitive\n ref={rootRef}\n background={background}\n height={height}\n padding={padding}\n mobilePadding={mobilePadding}\n gap={effectiveGap}\n connected={connected}\n className={className}\n {...props}\n >\n {skipLink}\n {sidebarChild}\n {renderedResizablePanels ?? renderedPanels}\n {otherChildren}\n </AppShellPrimitive>\n </AppShellProvider>\n );\n}\n\nAppShellRoot.displayName = 'AppShell';\n\n// ============================================\n// AppShell Sidebar\n// ============================================\n\nexport interface AppShellSidebarProps extends React.ComponentProps<'div'> {\n /**\n * Explicit width override — bypasses auto-detection.\n * When omitted, the sidebar auto-sizes based on the child\n * SidebarProvider's expanded/collapsed state.\n */\n width?: string;\n /** Width when sidebar is expanded (auto mode only). @default '280px' */\n expandedWidth?: string;\n /** Width when sidebar is collapsed (auto mode only). @default '64px' */\n collapsedWidth?: string;\n}\n\n/**\n * Layout slot for the sidebar region. Renders a div — the actual aside\n * landmark is provided by AppSidebar/Sidebar primitive inside it.\n *\n * **Auto-detection (default):** When no `width` prop is provided, the sidebar\n * observes the child SidebarProvider's `data-state` attribute via CSS `:has()`\n * and transitions between `collapsedWidth` and `expandedWidth` automatically.\n *\n * **Manual mode:** Pass an explicit `width` to control sizing yourself.\n */\nfunction AppShellSidebar({\n width,\n expandedWidth = '280px',\n collapsedWidth = '64px',\n className,\n style,\n children,\n ...props\n}: AppShellSidebarProps) {\n const autoMode = !width;\n\n return (\n <div\n data-slot=\"app-shell-sidebar\"\n style={\n {\n ...(autoMode\n ? {\n '--app-shell-sidebar-collapsed': collapsedWidth,\n '--app-shell-sidebar-expanded': expandedWidth,\n }\n : { '--app-shell-sidebar-width': width }),\n ...style,\n } as React.CSSProperties\n }\n className={cn(\n 'flex h-full shrink-0 flex-col overflow-clip',\n 'transition-[width] duration-300 ease-[cubic-bezier(0.16,1,0.3,1)]',\n 'motion-reduce:transition-none',\n autoMode\n ? [\n 'w-[var(--app-shell-sidebar-collapsed,64px)]',\n '[&:has([data-state=expanded])]:w-[var(--app-shell-sidebar-expanded,280px)]',\n ]\n : 'w-[var(--app-shell-sidebar-width,64px)]',\n className,\n )}\n {...props}\n >\n {children}\n </div>\n );\n}\n\nAppShellSidebar.displayName = 'AppShell.Sidebar';\n\n// ============================================\n// AppShell Header\n// ============================================\n\nexport interface AppShellHeaderProps extends React.ComponentProps<'div'> {}\n\nfunction AppShellHeader({\n className,\n children,\n ...props\n}: AppShellHeaderProps) {\n return (\n <div\n data-slot=\"app-shell-header\"\n className={cn('shrink-0', className)}\n {...props}\n >\n {children}\n </div>\n );\n}\n\nAppShellHeader.displayName = 'AppShell.Header';\n\n// ============================================\n// Preset Background Variants\n// ============================================\n\nconst appShellBackgrounds = {\n transparent: 'transparent',\n appBg: DEFAULT_APP_SHELL_BACKGROUND,\n neutral: 'var(--muted)',\n brandSubtle: 'linear-gradient(135deg, var(--air-50) 0%, var(--air-100) 100%)',\n brand: 'linear-gradient(135deg, var(--air-400) 0%, var(--primary) 100%)',\n brandDeep: 'linear-gradient(135deg, var(--primary) 0%, var(--air-900) 100%)',\n desertMidnight:\n 'linear-gradient(135deg, var(--slate-500) 0%, var(--slate-700) 100%)',\n aqua: 'linear-gradient(135deg, var(--air-400) 0%, var(--air-600) 100%)',\n} as const;\n\n// ============================================\n// Compound Component (Dot Notation)\n// ============================================\n\nconst AppShell = Object.assign(AppShellRoot, {\n Root: AppShellRoot,\n Sidebar: AppShellSidebar,\n Header: AppShellHeader,\n Panel: AppShellPanel,\n Content: AppShellContent,\n});\n\n// ============================================\n// Exports\n// ============================================\n\nexport type { AppShellContentProps } from './AppShellContent';\nexport type { AppShellPanelProps } from './AppShellPanel';\n\nexport {\n AppShell,\n AppShellContent,\n AppShellHeader,\n AppShellPanel,\n AppShellRoot,\n AppShellSidebar,\n appShellBackgrounds,\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index222.js","names":[],"sources":["../src/components/templates/AppShell/AppShellResize.ts"],"sourcesContent":["export type PanelSizeTuple = [number, number];\nexport type PanelLayoutMap = Record<string, number>;\n\nexport const DEFAULT_PANEL_SIZES: PanelSizeTuple = [35, 65];\nexport const DEFAULT_EXPAND_THRESHOLD = 85;\n\nfunction isFinitePositive(value: number): boolean {\n return Number.isFinite(value) && value > 0;\n}\n\nexport function normalizePanelSizes(\n sizes: readonly [number, number] | undefined,\n): PanelSizeTuple {\n if (!sizes) return DEFAULT_PANEL_SIZES;\n const [first, second] = sizes;\n if (!isFinitePositive(first) || !isFinitePositive(second)) {\n return DEFAULT_PANEL_SIZES;\n }\n\n const total = first + second;\n return [\n Number(((first / total) * 100).toFixed(4)),\n Number(((second / total) * 100).toFixed(4)),\n ];\n}\n\nexport function toResizablePercentageSize(size: number): string {\n return String(size);\n}\n\nexport function toResizableMinSize(\n minWidth: number | string | undefined,\n): string | undefined {\n if (minWidth === undefined) return undefined;\n return typeof minWidth === 'number' ? `${minWidth}px` : minWidth;\n}\n\nexport function layoutMapToTuple(layout: PanelLayoutMap): PanelSizeTuple {\n return normalizePanelSizes([layout.panel0, layout.panel1]);\n}\n\nexport function getExpandedPanelFromLayout(\n layout: PanelLayoutMap,\n threshold = DEFAULT_EXPAND_THRESHOLD,\n): number | null {\n const first = layout.panel0;\n const second = layout.panel1;\n if (first >= threshold) return 0;\n if (second >= threshold) return 1;\n return null;\n}\n"],"mappings":";AAGA,IAAa,sBAAsC,CAAC,IAAI,EAAE;AAG1D,SAAS,iBAAiB,OAAwB;CAChD,OAAO,OAAO,SAAS,KAAK,KAAK,QAAQ;AAC3C;AAEA,SAAgB,oBACd,OACgB;CAChB,IAAI,CAAC,OAAO,OAAO;CACnB,MAAM,CAAC,OAAO,UAAU;CACxB,IAAI,CAAC,iBAAiB,KAAK,KAAK,CAAC,iBAAiB,MAAM,GACtD,OAAO;CAGT,MAAM,QAAQ,QAAQ;CACtB,OAAO,CACL,QAAS,QAAQ,QAAS,IAAA,CAAK,QAAQ,CAAC,CAAC,GACzC,QAAS,SAAS,QAAS,IAAA,CAAK,QAAQ,CAAC,CAAC,CAC5C;AACF;AAEA,SAAgB,0BAA0B,MAAsB;CAC9D,OAAO,OAAO,IAAI;AACpB;AAEA,SAAgB,mBACd,UACoB;CACpB,IAAI,aAAa,KAAA,GAAW,OAAO,KAAA;CACnC,OAAO,OAAO,aAAa,WAAW,GAAG,SAAS,MAAM;AAC1D;AAEA,SAAgB,iBAAiB,QAAwC;CACvE,OAAO,oBAAoB,CAAC,OAAO,QAAQ,OAAO,MAAM,CAAC;AAC3D;AAEA,SAAgB,2BACd,QACA,YAAA,IACe;CACf,MAAM,QAAQ,OAAO;CACrB,MAAM,SAAS,OAAO;CACtB,IAAI,SAAS,WAAW,OAAO;CAC/B,IAAI,UAAU,WAAW,OAAO;CAChC,OAAO;AACT"}
|