@waypointjs/devtools 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Mauconduit Thomas
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/dist/index.cjs ADDED
@@ -0,0 +1,528 @@
1
+ 'use strict';
2
+
3
+ var react = require('react');
4
+ var zustand = require('zustand');
5
+ var next = require('@waypointjs/next');
6
+ var core = require('@waypointjs/core');
7
+ var jsxRuntime = require('react/jsx-runtime');
8
+
9
+ // src/DevPanel.tsx
10
+
11
+ // src/styles.ts
12
+ var PANEL_WIDTH = 340;
13
+ var Z_INDEX = 999999;
14
+ var ACCENT = "#6366f1";
15
+ var BG = "rgba(13, 13, 18, 0.97)";
16
+ var BORDER = "rgba(255,255,255,0.08)";
17
+ var TEXT_DIM = "#64748b";
18
+ var TEXT_BASE = "#cbd5e1";
19
+ var TEXT_BRIGHT = "#f1f5f9";
20
+ function panelContainer(isOpen, side) {
21
+ return {
22
+ position: "fixed",
23
+ top: 0,
24
+ [side]: 0,
25
+ bottom: 0,
26
+ width: `${PANEL_WIDTH}px`,
27
+ zIndex: Z_INDEX - 1,
28
+ background: BG,
29
+ color: TEXT_BASE,
30
+ fontFamily: "'ui-monospace','SFMono-Regular','Menlo',monospace",
31
+ fontSize: "0.75rem",
32
+ lineHeight: 1.5,
33
+ transform: isOpen ? "translateX(0)" : `translateX(${side === "right" ? PANEL_WIDTH : -PANEL_WIDTH}px)`,
34
+ transition: "transform 220ms ease-in-out",
35
+ overflowY: "auto",
36
+ boxShadow: side === "right" ? "-4px 0 24px rgba(0,0,0,0.6)" : "4px 0 24px rgba(0,0,0,0.6)",
37
+ display: "flex",
38
+ flexDirection: "column",
39
+ borderLeft: side === "right" ? `1px solid ${BORDER}` : void 0,
40
+ borderRight: side === "left" ? `1px solid ${BORDER}` : void 0
41
+ };
42
+ }
43
+ var toggleBtn = {
44
+ position: "fixed",
45
+ bottom: "1.25rem",
46
+ right: "1.25rem",
47
+ zIndex: Z_INDEX,
48
+ background: ACCENT,
49
+ color: "#fff",
50
+ border: "none",
51
+ borderRadius: "2rem",
52
+ padding: "0.375rem 0.875rem",
53
+ fontSize: "0.72rem",
54
+ fontFamily: "'ui-monospace','SFMono-Regular','Menlo',monospace",
55
+ cursor: "pointer",
56
+ boxShadow: "0 4px 12px rgba(0,0,0,0.5)",
57
+ userSelect: "none",
58
+ display: "flex",
59
+ alignItems: "center",
60
+ gap: "0.375rem"
61
+ };
62
+ var panelHeader = {
63
+ display: "flex",
64
+ alignItems: "center",
65
+ justifyContent: "space-between",
66
+ padding: "0.75rem 1rem",
67
+ borderBottom: `1px solid ${BORDER}`,
68
+ background: "rgba(99,102,241,0.12)",
69
+ flexShrink: 0
70
+ };
71
+ var sectionHeader = {
72
+ display: "flex",
73
+ alignItems: "center",
74
+ justifyContent: "space-between",
75
+ padding: "0.4rem 1rem",
76
+ background: "rgba(255,255,255,0.03)",
77
+ cursor: "pointer",
78
+ borderBottom: `1px solid ${BORDER}`,
79
+ fontWeight: "bold",
80
+ fontSize: "0.68rem",
81
+ textTransform: "uppercase",
82
+ letterSpacing: "0.08em",
83
+ color: TEXT_DIM,
84
+ userSelect: "none"
85
+ };
86
+ var sectionBody = {
87
+ padding: "0.5rem 1rem",
88
+ borderBottom: `1px solid ${BORDER}`
89
+ };
90
+ function badge(color) {
91
+ return {
92
+ display: "inline-block",
93
+ background: color,
94
+ color: "#fff",
95
+ borderRadius: "0.25rem",
96
+ padding: "0.05rem 0.35rem",
97
+ fontSize: "0.62rem",
98
+ fontWeight: "bold",
99
+ marginLeft: "0.3rem",
100
+ verticalAlign: "middle"
101
+ };
102
+ }
103
+ var progressTrack = {
104
+ height: "4px",
105
+ background: "rgba(255,255,255,0.08)",
106
+ borderRadius: "2px",
107
+ overflow: "hidden",
108
+ margin: "0.5rem 0"
109
+ };
110
+ function progressBar(pct) {
111
+ return {
112
+ height: "100%",
113
+ width: `${pct}%`,
114
+ background: ACCENT,
115
+ borderRadius: "2px",
116
+ transition: "width 300ms ease"
117
+ };
118
+ }
119
+ function StepTree({ schema, tree, currentStepId, progress, completed }) {
120
+ const currentIdx = tree.steps.findIndex((s) => s.definition.id === currentStepId);
121
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
122
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { marginBottom: "0.75rem" }, children: [
123
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { color: TEXT_DIM, fontSize: "0.65rem" }, children: "schema" }),
124
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { color: TEXT_BRIGHT, fontWeight: "bold" }, children: schema.name }),
125
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { color: TEXT_DIM }, children: [
126
+ schema.id,
127
+ " \xB7 v",
128
+ schema.version
129
+ ] })
130
+ ] }),
131
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { marginBottom: "0.75rem" }, children: [
132
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", justifyContent: "space-between", color: TEXT_DIM, fontSize: "0.65rem" }, children: [
133
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: "progression" }),
134
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: completed ? "\u2713 termin\xE9" : `${progress}%` })
135
+ ] }),
136
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: progressTrack, children: /* @__PURE__ */ jsxRuntime.jsx("div", { style: progressBar(completed ? 100 : progress) }) })
137
+ ] }),
138
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { marginBottom: "0.5rem" }, children: tree.steps.map((step, i) => {
139
+ const isCurrent = step.definition.id === currentStepId;
140
+ const isDone = completed || i < currentIdx;
141
+ return /* @__PURE__ */ jsxRuntime.jsxs(
142
+ "div",
143
+ {
144
+ style: {
145
+ display: "flex",
146
+ alignItems: "flex-start",
147
+ gap: "0.5rem",
148
+ padding: "0.3rem 0",
149
+ borderLeft: isCurrent ? `2px solid ${ACCENT}` : "2px solid transparent",
150
+ paddingLeft: "0.5rem",
151
+ marginLeft: "-0.5rem",
152
+ opacity: !isDone && !isCurrent ? 0.45 : 1
153
+ },
154
+ children: [
155
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: {
156
+ width: "1.1rem",
157
+ height: "1.1rem",
158
+ borderRadius: "50%",
159
+ background: isDone ? "#22c55e" : isCurrent ? ACCENT : "rgba(255,255,255,0.1)",
160
+ display: "flex",
161
+ alignItems: "center",
162
+ justifyContent: "center",
163
+ fontSize: "0.6rem",
164
+ flexShrink: 0,
165
+ marginTop: "0.1rem"
166
+ }, children: isDone ? "\u2713" : i + 1 }),
167
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
168
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { color: isCurrent ? TEXT_BRIGHT : TEXT_DIM, fontWeight: isCurrent ? "bold" : "normal" }, children: step.definition.title }),
169
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { color: TEXT_DIM, fontSize: "0.65rem" }, children: step.definition.url })
170
+ ] })
171
+ ]
172
+ },
173
+ step.definition.id
174
+ );
175
+ }) }),
176
+ tree.hiddenSteps.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
177
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { color: TEXT_DIM, fontSize: "0.65rem", marginBottom: "0.25rem" }, children: [
178
+ "steps cach\xE9es (",
179
+ tree.hiddenSteps.length,
180
+ ")"
181
+ ] }),
182
+ tree.hiddenSteps.map((step) => /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", gap: "0.4rem", padding: "0.15rem 0", opacity: 0.5 }, children: [
183
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: "0.65rem" }, children: "\u2298" }),
184
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: TEXT_DIM }, children: step.definition.title }),
185
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: badge("#94a3b8"), children: "hidden" })
186
+ ] }, step.definition.id))
187
+ ] })
188
+ ] });
189
+ }
190
+ var COLOR = {
191
+ string: "#86efac",
192
+ // green-300
193
+ number: "#93c5fd",
194
+ // blue-300
195
+ boolean: "#fdba74",
196
+ // orange-300
197
+ null: "#f87171",
198
+ // red-400
199
+ key: "#c4b5fd",
200
+ // violet-300
201
+ bracket: "#94a3b8",
202
+ // slate-400
203
+ toggle: "#6366f1"
204
+ // indigo-500
205
+ };
206
+ function Primitive({ value }) {
207
+ if (value === null) return /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: COLOR.null }, children: "null" });
208
+ if (typeof value === "boolean")
209
+ return /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: COLOR.boolean }, children: String(value) });
210
+ if (typeof value === "number")
211
+ return /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: COLOR.number }, children: value });
212
+ return /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { color: COLOR.string }, children: [
213
+ '"',
214
+ value,
215
+ '"'
216
+ ] });
217
+ }
218
+ function JsonView({ data, depth = 0 }) {
219
+ const [open, setOpen] = react.useState(depth === 0);
220
+ if (data === null || typeof data !== "object") {
221
+ return /* @__PURE__ */ jsxRuntime.jsx(Primitive, { value: data });
222
+ }
223
+ const isArray = Array.isArray(data);
224
+ const entries = isArray ? data.map((v, i) => [String(i), v]) : Object.entries(data);
225
+ const count = entries.length;
226
+ const open_b = isArray ? "[" : "{";
227
+ const close_b = isArray ? "]" : "}";
228
+ if (count === 0) {
229
+ return /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { color: COLOR.bracket }, children: [
230
+ open_b,
231
+ close_b
232
+ ] });
233
+ }
234
+ return /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
235
+ /* @__PURE__ */ jsxRuntime.jsx(
236
+ "button",
237
+ {
238
+ onClick: () => setOpen((o) => !o),
239
+ style: {
240
+ background: "none",
241
+ border: "none",
242
+ color: COLOR.toggle,
243
+ cursor: "pointer",
244
+ padding: 0,
245
+ fontSize: "0.72rem",
246
+ fontFamily: "inherit"
247
+ },
248
+ children: open ? "\u25BE" : "\u25B8"
249
+ }
250
+ ),
251
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: COLOR.bracket }, children: open_b }),
252
+ !open && /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { color: COLOR.bracket, opacity: 0.6 }, children: [
253
+ count,
254
+ " ",
255
+ isArray ? "item" : "key",
256
+ count > 1 ? "s" : ""
257
+ ] }),
258
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: COLOR.bracket }, children: !open ? close_b : "" }),
259
+ open && /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
260
+ entries.map(([k, v]) => /* @__PURE__ */ jsxRuntime.jsxs(
261
+ "div",
262
+ {
263
+ style: { paddingLeft: "1rem" },
264
+ children: [
265
+ !isArray && /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { color: COLOR.key }, children: [
266
+ '"',
267
+ k,
268
+ '"'
269
+ ] }),
270
+ !isArray && /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: COLOR.bracket }, children: ": " }),
271
+ /* @__PURE__ */ jsxRuntime.jsx(JsonView, { data: v, depth: depth + 1 }),
272
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: COLOR.bracket }, children: "," })
273
+ ]
274
+ },
275
+ k
276
+ )),
277
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: COLOR.bracket }, children: close_b })
278
+ ] })
279
+ ] });
280
+ }
281
+ function DataInspector({ data, currentStepId }) {
282
+ const entries = Object.entries(data);
283
+ const [collapsed, setCollapsed] = react.useState({});
284
+ if (entries.length === 0) {
285
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { color: TEXT_DIM, fontStyle: "italic" }, children: "Aucune donn\xE9e" });
286
+ }
287
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { children: entries.map(([stepId, stepData]) => {
288
+ const isCurrent = stepId === currentStepId;
289
+ const isCollapsed = collapsed[stepId] ?? !isCurrent;
290
+ const fieldCount = Object.keys(stepData).length;
291
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { marginBottom: "0.4rem" }, children: [
292
+ /* @__PURE__ */ jsxRuntime.jsxs(
293
+ "button",
294
+ {
295
+ onClick: () => setCollapsed((p) => ({ ...p, [stepId]: !isCollapsed })),
296
+ style: {
297
+ display: "flex",
298
+ alignItems: "center",
299
+ gap: "0.4rem",
300
+ width: "100%",
301
+ background: isCurrent ? "rgba(99,102,241,0.12)" : "rgba(255,255,255,0.03)",
302
+ border: `1px solid ${isCurrent ? ACCENT : BORDER}`,
303
+ borderRadius: "0.25rem",
304
+ color: isCurrent ? TEXT_BRIGHT : TEXT_DIM,
305
+ cursor: "pointer",
306
+ padding: "0.3rem 0.5rem",
307
+ fontSize: "0.72rem",
308
+ fontFamily: "inherit",
309
+ textAlign: "left"
310
+ },
311
+ children: [
312
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: isCollapsed ? "\u25B8" : "\u25BE" }),
313
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontWeight: isCurrent ? "bold" : "normal" }, children: stepId }),
314
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { color: TEXT_DIM, marginLeft: "auto" }, children: [
315
+ fieldCount,
316
+ " champ",
317
+ fieldCount > 1 ? "s" : ""
318
+ ] }),
319
+ isCurrent && /* @__PURE__ */ jsxRuntime.jsx("span", { style: {
320
+ background: ACCENT,
321
+ color: "#fff",
322
+ borderRadius: "0.2rem",
323
+ padding: "0 0.3rem",
324
+ fontSize: "0.6rem"
325
+ }, children: "actuel" })
326
+ ]
327
+ }
328
+ ),
329
+ !isCollapsed && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { paddingLeft: "0.75rem", paddingTop: "0.25rem" }, children: /* @__PURE__ */ jsxRuntime.jsx(JsonView, { data: stepData, depth: 0 }) })
330
+ ] }, stepId);
331
+ }) });
332
+ }
333
+ function ExternalVarsView({ schema, externalVars, missingVars }) {
334
+ const vars = schema.externalVariables ?? [];
335
+ if (vars.length === 0) {
336
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { color: TEXT_DIM, fontStyle: "italic" }, children: "Aucune variable externe d\xE9clar\xE9e" });
337
+ }
338
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { children: vars.map((v) => {
339
+ const value = externalVars[v.id];
340
+ const isMissing = missingVars.includes(v.id);
341
+ const hasValue = value !== void 0;
342
+ return /* @__PURE__ */ jsxRuntime.jsxs(
343
+ "div",
344
+ {
345
+ style: {
346
+ padding: "0.4rem 0",
347
+ borderBottom: `1px solid ${BORDER}`
348
+ },
349
+ children: [
350
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", flexWrap: "wrap", gap: "0.2rem", marginBottom: "0.2rem" }, children: [
351
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontWeight: "bold" }, children: v.id }),
352
+ v.label && v.label !== v.id && /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { color: TEXT_DIM }, children: [
353
+ "\u2014 ",
354
+ v.label
355
+ ] }),
356
+ v.blocking && /* @__PURE__ */ jsxRuntime.jsx("span", { style: badge("#f97316"), children: "blocking" }),
357
+ isMissing && /* @__PURE__ */ jsxRuntime.jsx("span", { style: badge("#ef4444"), children: "missing" }),
358
+ !hasValue && !isMissing && /* @__PURE__ */ jsxRuntime.jsx("span", { style: badge("#64748b"), children: "undefined" })
359
+ ] }),
360
+ hasValue && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { paddingLeft: "0.5rem" }, children: /* @__PURE__ */ jsxRuntime.jsx(JsonView, { data: value, depth: 0 }) })
361
+ ]
362
+ },
363
+ v.id
364
+ );
365
+ }) });
366
+ }
367
+ function HistoryView({ history, currentStepId }) {
368
+ if (history.length === 0) {
369
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { color: TEXT_DIM, fontStyle: "italic" }, children: "Aucune navigation" });
370
+ }
371
+ return /* @__PURE__ */ jsxRuntime.jsx("ol", { style: { listStyle: "none", margin: 0, padding: 0 }, children: history.map((stepId, i) => {
372
+ const isCurrent = stepId === currentStepId;
373
+ return /* @__PURE__ */ jsxRuntime.jsxs(
374
+ "li",
375
+ {
376
+ style: {
377
+ display: "flex",
378
+ alignItems: "center",
379
+ gap: "0.5rem",
380
+ padding: "0.2rem 0",
381
+ color: isCurrent ? TEXT_BRIGHT : TEXT_DIM,
382
+ fontWeight: isCurrent ? "bold" : "normal"
383
+ },
384
+ children: [
385
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { color: ACCENT, minWidth: "1.2rem", fontSize: "0.65rem" }, children: [
386
+ i + 1,
387
+ "."
388
+ ] }),
389
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: stepId }),
390
+ isCurrent && /* @__PURE__ */ jsxRuntime.jsx("span", { style: {
391
+ fontSize: "0.6rem",
392
+ background: ACCENT,
393
+ color: "#fff",
394
+ borderRadius: "0.2rem",
395
+ padding: "0 0.3rem"
396
+ }, children: "ici" })
397
+ ]
398
+ },
399
+ `${stepId}-${i}`
400
+ );
401
+ }) });
402
+ }
403
+ function Section({
404
+ id,
405
+ label,
406
+ collapsed,
407
+ onToggle,
408
+ children
409
+ }) {
410
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
411
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: sectionHeader, onClick: () => onToggle(id), children: [
412
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: label }),
413
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: "0.65rem" }, children: collapsed ? "\u25B8" : "\u25BE" })
414
+ ] }),
415
+ !collapsed && /* @__PURE__ */ jsxRuntime.jsx("div", { style: sectionBody, children })
416
+ ] });
417
+ }
418
+ function DevPanel({ position = "bottom-right", defaultOpen = false }) {
419
+ const [isOpen, setIsOpen] = react.useState(defaultOpen);
420
+ const [isMounted, setIsMounted] = react.useState(false);
421
+ const [collapsed, setCollapsed] = react.useState({
422
+ nav: false,
423
+ data: false,
424
+ vars: true,
425
+ history: true,
426
+ raw: true
427
+ });
428
+ react.useEffect(() => setIsMounted(true), []);
429
+ const { store } = next.useWaypointRuntimeContext();
430
+ const schema = zustand.useStore(store, (s) => s.schema);
431
+ const data = zustand.useStore(store, (s) => s.data);
432
+ const externalVars = zustand.useStore(store, (s) => s.externalVars);
433
+ const currentStepId = zustand.useStore(store, (s) => s.currentStepId);
434
+ const history = zustand.useStore(store, (s) => s.history);
435
+ const isSubmitting = zustand.useStore(store, (s) => s.isSubmitting);
436
+ const completed = zustand.useStore(store, (s) => s.completed);
437
+ const fullState = zustand.useStore(store, (s) => s);
438
+ const tree = react.useMemo(() => core.getResolvedTree(fullState), [fullState]);
439
+ const progress = react.useMemo(() => core.calculateProgressFromState(fullState), [fullState]);
440
+ const missingVars = react.useMemo(() => core.getMissingBlockingVars(fullState), [fullState]);
441
+ if (!isMounted || !schema) return null;
442
+ const side = position === "bottom-left" ? "left" : "right";
443
+ function toggleSection(id) {
444
+ setCollapsed((p) => ({ ...p, [id]: !p[id] }));
445
+ }
446
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
447
+ /* @__PURE__ */ jsxRuntime.jsxs(
448
+ "button",
449
+ {
450
+ style: {
451
+ ...toggleBtn,
452
+ [side]: "1.25rem",
453
+ right: side === "right" ? "1.25rem" : void 0,
454
+ left: side === "left" ? "1.25rem" : void 0
455
+ },
456
+ onClick: () => setIsOpen((o) => !o),
457
+ title: "Waypoint DevTools",
458
+ children: [
459
+ "\u25C8 waypoint",
460
+ isSubmitting && /* @__PURE__ */ jsxRuntime.jsx("span", { style: { opacity: 0.7 }, children: "\u2026" }),
461
+ missingVars.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { style: { background: "#ef4444", borderRadius: "50%", width: "0.85rem", height: "0.85rem", display: "inline-flex", alignItems: "center", justifyContent: "center", fontSize: "0.55rem" }, children: "!" })
462
+ ]
463
+ }
464
+ ),
465
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: panelContainer(isOpen, side), children: [
466
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: panelHeader, children: [
467
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
468
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { color: TEXT_BRIGHT, fontWeight: "bold", fontSize: "0.8rem" }, children: "\u25C8 Waypoint DevTools" }),
469
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { color: TEXT_DIM, fontSize: "0.65rem" }, children: completed ? "\u2713 completed" : isSubmitting ? "\u27F3 submitting\u2026" : "running" })
470
+ ] }),
471
+ /* @__PURE__ */ jsxRuntime.jsx(
472
+ "button",
473
+ {
474
+ onClick: () => setIsOpen(false),
475
+ style: { background: "none", border: "none", color: TEXT_DIM, cursor: "pointer", fontSize: "1rem", lineHeight: 1 },
476
+ children: "\xD7"
477
+ }
478
+ )
479
+ ] }),
480
+ /* @__PURE__ */ jsxRuntime.jsx(Section, { id: "nav", label: "Navigation", collapsed: collapsed.nav ?? false, onToggle: toggleSection, children: /* @__PURE__ */ jsxRuntime.jsx(
481
+ StepTree,
482
+ {
483
+ schema,
484
+ tree,
485
+ currentStepId,
486
+ progress,
487
+ completed
488
+ }
489
+ ) }),
490
+ /* @__PURE__ */ jsxRuntime.jsx(Section, { id: "data", label: "Donn\xE9es", collapsed: collapsed.data ?? false, onToggle: toggleSection, children: /* @__PURE__ */ jsxRuntime.jsx(DataInspector, { data, currentStepId }) }),
491
+ /* @__PURE__ */ jsxRuntime.jsx(Section, { id: "vars", label: "Variables externes", collapsed: collapsed.vars ?? true, onToggle: toggleSection, children: /* @__PURE__ */ jsxRuntime.jsx(
492
+ ExternalVarsView,
493
+ {
494
+ schema,
495
+ externalVars,
496
+ missingVars
497
+ }
498
+ ) }),
499
+ /* @__PURE__ */ jsxRuntime.jsx(Section, { id: "history", label: "Historique", collapsed: collapsed.history ?? true, onToggle: toggleSection, children: /* @__PURE__ */ jsxRuntime.jsx(HistoryView, { history, currentStepId }) }),
500
+ /* @__PURE__ */ jsxRuntime.jsx(Section, { id: "raw", label: "\xC9tat brut", collapsed: collapsed.raw ?? true, onToggle: toggleSection, children: /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: "0.68rem" }, children: /* @__PURE__ */ jsxRuntime.jsx(
501
+ JsonView,
502
+ {
503
+ data: {
504
+ schema: schema.id,
505
+ currentStepId,
506
+ progress,
507
+ completed,
508
+ isSubmitting,
509
+ data,
510
+ externalVars,
511
+ history
512
+ },
513
+ depth: 0
514
+ }
515
+ ) }) })
516
+ ] })
517
+ ] });
518
+ }
519
+ function WaypointDevtools(props) {
520
+ if (process.env.NODE_ENV !== "development") {
521
+ return null;
522
+ }
523
+ return /* @__PURE__ */ jsxRuntime.jsx(DevPanel, { ...props });
524
+ }
525
+
526
+ exports.WaypointDevtools = WaypointDevtools;
527
+ //# sourceMappingURL=index.cjs.map
528
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/styles.ts","../src/components/StepTree.tsx","../src/components/JsonView.tsx","../src/components/DataInspector.tsx","../src/components/ExternalVarsView.tsx","../src/components/HistoryView.tsx","../src/DevPanel.tsx","../src/WaypointDevtools.tsx"],"names":["jsxs","jsx","useState","useEffect","useWaypointRuntimeContext","useStore","useMemo","getResolvedTree","calculateProgressFromState","getMissingBlockingVars","Fragment"],"mappings":";;;;;;;;;;;AAEO,IAAM,WAAA,GAAc,GAAA;AACpB,IAAM,OAAA,GAAU,MAAA;AAChB,IAAM,MAAA,GAAS,SAAA;AACf,IAAM,EAAA,GAAK,wBAAA;AACX,IAAM,MAAA,GAAS,wBAAA;AACf,IAAM,QAAA,GAAW,SAAA;AACjB,IAAM,SAAA,GAAY,SAAA;AAClB,IAAM,WAAA,GAAc,SAAA;AAEpB,SAAS,cAAA,CAAe,QAAiB,IAAA,EAAuC;AACrF,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,OAAA;AAAA,IACV,GAAA,EAAK,CAAA;AAAA,IACL,CAAC,IAAI,GAAG,CAAA;AAAA,IACR,MAAA,EAAQ,CAAA;AAAA,IACR,KAAA,EAAO,GAAG,WAAW,CAAA,EAAA,CAAA;AAAA,IACrB,QAAQ,OAAA,GAAU,CAAA;AAAA,IAClB,UAAA,EAAY,EAAA;AAAA,IACZ,KAAA,EAAO,SAAA;AAAA,IACP,UAAA,EAAY,mDAAA;AAAA,IACZ,QAAA,EAAU,SAAA;AAAA,IACV,UAAA,EAAY,GAAA;AAAA,IACZ,SAAA,EAAW,SACP,eAAA,GACA,CAAA,WAAA,EAAc,SAAS,OAAA,GAAU,WAAA,GAAc,CAAC,WAAW,CAAA,GAAA,CAAA;AAAA,IAC/D,UAAA,EAAY,6BAAA;AAAA,IACZ,SAAA,EAAW,MAAA;AAAA,IACX,SAAA,EAAW,IAAA,KAAS,OAAA,GAChB,6BAAA,GACA,4BAAA;AAAA,IACJ,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe,QAAA;AAAA,IACf,UAAA,EAAY,IAAA,KAAS,OAAA,GAAU,CAAA,UAAA,EAAa,MAAM,CAAA,CAAA,GAAK,MAAA;AAAA,IACvD,WAAA,EAAa,IAAA,KAAS,MAAA,GAAS,CAAA,UAAA,EAAa,MAAM,CAAA,CAAA,GAAK;AAAA,GACzD;AACF;AAEO,IAAM,SAAA,GAA2B;AAAA,EACtC,QAAA,EAAU,OAAA;AAAA,EACV,MAAA,EAAQ,SAAA;AAAA,EACR,KAAA,EAAO,SAAA;AAAA,EACP,MAAA,EAAQ,OAAA;AAAA,EACR,UAAA,EAAY,MAAA;AAAA,EACZ,KAAA,EAAO,MAAA;AAAA,EACP,MAAA,EAAQ,MAAA;AAAA,EACR,YAAA,EAAc,MAAA;AAAA,EACd,OAAA,EAAS,mBAAA;AAAA,EACT,QAAA,EAAU,SAAA;AAAA,EACV,UAAA,EAAY,mDAAA;AAAA,EACZ,MAAA,EAAQ,SAAA;AAAA,EACR,SAAA,EAAW,4BAAA;AAAA,EACX,UAAA,EAAY,MAAA;AAAA,EACZ,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,GAAA,EAAK;AACP,CAAA;AAEO,IAAM,WAAA,GAA6B;AAAA,EACxC,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB,eAAA;AAAA,EAChB,OAAA,EAAS,cAAA;AAAA,EACT,YAAA,EAAc,aAAa,MAAM,CAAA,CAAA;AAAA,EACjC,UAAA,EAAY,uBAAA;AAAA,EACZ,UAAA,EAAY;AACd,CAAA;AAEO,IAAM,aAAA,GAA+B;AAAA,EAC1C,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB,eAAA;AAAA,EAChB,OAAA,EAAS,aAAA;AAAA,EACT,UAAA,EAAY,wBAAA;AAAA,EACZ,MAAA,EAAQ,SAAA;AAAA,EACR,YAAA,EAAc,aAAa,MAAM,CAAA,CAAA;AAAA,EACjC,UAAA,EAAY,MAAA;AAAA,EACZ,QAAA,EAAU,SAAA;AAAA,EACV,aAAA,EAAe,WAAA;AAAA,EACf,aAAA,EAAe,QAAA;AAAA,EACf,KAAA,EAAO,QAAA;AAAA,EACP,UAAA,EAAY;AACd,CAAA;AAEO,IAAM,WAAA,GAA6B;AAAA,EACxC,OAAA,EAAS,aAAA;AAAA,EACT,YAAA,EAAc,aAAa,MAAM,CAAA;AACnC,CAAA;AAEO,SAAS,MAAM,KAAA,EAA8B;AAClD,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,cAAA;AAAA,IACT,UAAA,EAAY,KAAA;AAAA,IACZ,KAAA,EAAO,MAAA;AAAA,IACP,YAAA,EAAc,SAAA;AAAA,IACd,OAAA,EAAS,iBAAA;AAAA,IACT,QAAA,EAAU,SAAA;AAAA,IACV,UAAA,EAAY,MAAA;AAAA,IACZ,UAAA,EAAY,QAAA;AAAA,IACZ,aAAA,EAAe;AAAA,GACjB;AACF;AAEO,IAAM,aAAA,GAA+B;AAAA,EAC1C,MAAA,EAAQ,KAAA;AAAA,EACR,UAAA,EAAY,wBAAA;AAAA,EACZ,YAAA,EAAc,KAAA;AAAA,EACd,QAAA,EAAU,QAAA;AAAA,EACV,MAAA,EAAQ;AACV,CAAA;AAEO,SAAS,YAAY,GAAA,EAA4B;AACtD,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,MAAA;AAAA,IACR,KAAA,EAAO,GAAG,GAAG,CAAA,CAAA,CAAA;AAAA,IACb,UAAA,EAAY,MAAA;AAAA,IACZ,YAAA,EAAc,KAAA;AAAA,IACd,UAAA,EAAY;AAAA,GACd;AACF;AC1GO,SAAS,SAAS,EAAE,MAAA,EAAQ,MAAM,aAAA,EAAe,QAAA,EAAU,WAAU,EAAkB;AAC5F,EAAA,MAAM,UAAA,GAAa,KAAK,KAAA,CAAM,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,UAAA,CAAW,EAAA,KAAO,aAAa,CAAA;AAEhF,EAAA,uCACG,KAAA,EAAA,EAEC,QAAA,EAAA;AAAA,oBAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,YAAA,EAAc,WAAU,EACpC,QAAA,EAAA;AAAA,sBAAAC,cAAA,CAAC,KAAA,EAAA,EAAI,OAAO,EAAE,KAAA,EAAO,UAAU,QAAA,EAAU,SAAA,IAAa,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,sBAC5DA,cAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,KAAA,EAAO,aAAa,UAAA,EAAY,MAAA,EAAO,EAAI,QAAA,EAAA,MAAA,CAAO,IAAA,EAAK,CAAA;AAAA,sCACpE,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,KAAA,EAAO,UAAS,EAAI,QAAA,EAAA;AAAA,QAAA,MAAA,CAAO,EAAA;AAAA,QAAG,SAAA;AAAA,QAAK,MAAA,CAAO;AAAA,OAAA,EAAQ;AAAA,KAAA,EAClE,CAAA;AAAA,oCAGC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,YAAA,EAAc,WAAU,EACpC,QAAA,EAAA;AAAA,sBAAAD,eAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,cAAA,EAAgB,eAAA,EAAiB,KAAA,EAAO,QAAA,EAAU,QAAA,EAAU,SAAA,EAAU,EACnG,QAAA,EAAA;AAAA,wBAAAC,cAAA,CAAC,UAAK,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,uCAChB,MAAA,EAAA,EAAM,QAAA,EAAA,SAAA,GAAY,mBAAA,GAAc,CAAA,EAAG,QAAQ,CAAA,CAAA,CAAA,EAAI;AAAA,OAAA,EAClD,CAAA;AAAA,sBACAA,cAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,aAAA,EACV,QAAA,kBAAAA,cAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,WAAA,CAAY,SAAA,GAAY,GAAA,GAAM,QAAQ,CAAA,EAAG,CAAA,EACvD;AAAA,KAAA,EACF,CAAA;AAAA,oBAGAA,cAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,YAAA,EAAc,QAAA,EAAS,EAClC,QAAA,EAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,CAAA,KAAM;AAC3B,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,UAAA,CAAW,EAAA,KAAO,aAAA;AACzC,MAAA,MAAM,MAAA,GAAS,aAAa,CAAA,GAAI,UAAA;AAChC,MAAA,uBACED,eAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UAEC,KAAA,EAAO;AAAA,YACL,OAAA,EAAS,MAAA;AAAA,YACT,UAAA,EAAY,YAAA;AAAA,YACZ,GAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,UAAA;AAAA,YACT,UAAA,EAAY,SAAA,GAAY,CAAA,UAAA,EAAa,MAAM,CAAA,CAAA,GAAK,uBAAA;AAAA,YAChD,WAAA,EAAa,QAAA;AAAA,YACb,UAAA,EAAY,SAAA;AAAA,YACZ,OAAA,EAAU,CAAC,MAAA,IAAU,CAAC,YAAa,IAAA,GAAO;AAAA,WAC5C;AAAA,UAEA,QAAA,EAAA;AAAA,4BAAAC,cAAA,CAAC,SAAI,KAAA,EAAO;AAAA,cACV,KAAA,EAAO,QAAA;AAAA,cACP,MAAA,EAAQ,QAAA;AAAA,cACR,YAAA,EAAc,KAAA;AAAA,cACd,UAAA,EAAY,MAAA,GAAS,SAAA,GAAY,SAAA,GAAY,MAAA,GAAS,uBAAA;AAAA,cACtD,OAAA,EAAS,MAAA;AAAA,cACT,UAAA,EAAY,QAAA;AAAA,cACZ,cAAA,EAAgB,QAAA;AAAA,cAChB,QAAA,EAAU,QAAA;AAAA,cACV,UAAA,EAAY,CAAA;AAAA,cACZ,SAAA,EAAW;AAAA,aACb,EACG,QAAA,EAAA,MAAA,GAAS,QAAA,GAAM,CAAA,GAAI,CAAA,EACtB,CAAA;AAAA,4CACC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,8BAAAA,cAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,KAAA,EAAO,YAAY,WAAA,GAAc,QAAA,EAAU,UAAA,EAAY,SAAA,GAAY,MAAA,GAAS,QAAA,EAAS,EAChG,QAAA,EAAA,IAAA,CAAK,WAAW,KAAA,EACnB,CAAA;AAAA,8BACAA,cAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,KAAA,EAAO,QAAA,EAAU,QAAA,EAAU,SAAA,EAAU,EAAI,QAAA,EAAA,IAAA,CAAK,UAAA,CAAW,GAAA,EAAI;AAAA,aAAA,EAC7E;AAAA;AAAA,SAAA;AAAA,QA/BK,KAAK,UAAA,CAAW;AAAA,OAgCvB;AAAA,IAEJ,CAAC,CAAA,EACH,CAAA;AAAA,IAGC,IAAA,CAAK,WAAA,CAAY,MAAA,GAAS,CAAA,oCACxB,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAD,eAAA,CAAC,KAAA,EAAA,EAAI,OAAO,EAAE,KAAA,EAAO,UAAU,QAAA,EAAU,SAAA,EAAW,YAAA,EAAc,SAAA,EAAU,EAAG,QAAA,EAAA;AAAA,QAAA,oBAAA;AAAA,QAC7D,KAAK,WAAA,CAAY,MAAA;AAAA,QAAO;AAAA,OAAA,EAC1C,CAAA;AAAA,MACC,KAAK,WAAA,CAAY,GAAA,CAAI,CAAC,IAAA,qBACrBA,eAAA,CAAC,SAA6B,KAAA,EAAO,EAAE,SAAS,MAAA,EAAQ,UAAA,EAAY,UAAU,GAAA,EAAK,QAAA,EAAU,SAAS,WAAA,EAAa,OAAA,EAAS,KAAI,EAC9H,QAAA,EAAA;AAAA,wBAAAC,cAAA,CAAC,UAAK,KAAA,EAAO,EAAE,QAAA,EAAU,SAAA,IAAa,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,wBACvCA,cAAA,CAAC,UAAK,KAAA,EAAO,EAAE,OAAO,QAAA,EAAS,EAAI,QAAA,EAAA,IAAA,CAAK,UAAA,CAAW,KAAA,EAAM,CAAA;AAAA,uCACxD,MAAA,EAAA,EAAK,KAAA,EAAO,KAAA,CAAM,SAAS,GAAG,QAAA,EAAA,QAAA,EAAM;AAAA,OAAA,EAAA,EAH7B,IAAA,CAAK,UAAA,CAAW,EAI1B,CACD;AAAA,KAAA,EACH;AAAA,GAAA,EAEJ,CAAA;AAEJ;ACzFA,IAAM,KAAA,GAAQ;AAAA,EACZ,MAAA,EAAQ,SAAA;AAAA;AAAA,EACR,MAAA,EAAQ,SAAA;AAAA;AAAA,EACR,OAAA,EAAS,SAAA;AAAA;AAAA,EACT,IAAA,EAAM,SAAA;AAAA;AAAA,EACN,GAAA,EAAK,SAAA;AAAA;AAAA,EACL,OAAA,EAAS,SAAA;AAAA;AAAA,EACT,MAAA,EAAQ;AAAA;AACV,CAAA;AAEA,SAAS,SAAA,CAAU,EAAE,KAAA,EAAM,EAAgD;AACzE,EAAA,IAAI,KAAA,KAAU,IAAA,EAAM,uBAAOA,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,CAAM,IAAA,EAAK,EAAG,QAAA,EAAA,MAAA,EAAI,CAAA;AACnE,EAAA,IAAI,OAAO,KAAA,KAAU,SAAA;AACnB,IAAA,uBAAOA,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,EAAQ,EAAI,QAAA,EAAA,MAAA,CAAO,KAAK,CAAA,EAAE,CAAA;AAC/D,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA;AACnB,IAAA,uBAAOA,eAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,CAAM,MAAA,EAAO,EAAI,QAAA,EAAA,KAAA,EAAM,CAAA;AACtD,EAAA,uBAAOD,gBAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,CAAM,QAAO,EAAG,QAAA,EAAA;AAAA,IAAA,GAAA;AAAA,IAAE,KAAA;AAAA,IAAM;AAAA,GAAA,EAAC,CAAA;AACxD;AAEO,SAAS,QAAA,CAAS,EAAE,IAAA,EAAM,KAAA,GAAQ,GAAE,EAAkB;AAC3D,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIE,cAAA,CAAS,UAAU,CAAC,CAAA;AAE5C,EAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AAC7C,IAAA,uBAAOD,cAAAA,CAAC,SAAA,EAAA,EAAU,KAAA,EAAO,IAAA,EAA0C,CAAA;AAAA,EACrE;AAEA,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA;AAClC,EAAA,MAAM,UAAU,OAAA,GACX,IAAA,CAAmB,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM,CAAC,MAAA,CAAO,CAAC,GAAG,CAAC,CAAsB,CAAA,GACrE,MAAA,CAAO,QAAQ,IAA+B,CAAA;AAElD,EAAA,MAAM,QAAQ,OAAA,CAAQ,MAAA;AACtB,EAAA,MAAM,MAAA,GAAS,UAAU,GAAA,GAAM,GAAA;AAC/B,EAAA,MAAM,OAAA,GAAU,UAAU,GAAA,GAAM,GAAA;AAEhC,EAAA,IAAI,UAAU,CAAA,EAAG;AACf,IAAA,uBACED,gBAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,CAAM,SAAQ,EACjC,QAAA,EAAA;AAAA,MAAA,MAAA;AAAA,MAAQ;AAAA,KAAA,EACX,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEA,gBAAC,MAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAC,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,SAAS,MAAM,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,QAChC,KAAA,EAAO;AAAA,UACL,UAAA,EAAY,MAAA;AAAA,UACZ,MAAA,EAAQ,MAAA;AAAA,UACR,OAAO,KAAA,CAAM,MAAA;AAAA,UACb,MAAA,EAAQ,SAAA;AAAA,UACR,OAAA,EAAS,CAAA;AAAA,UACT,QAAA,EAAU,SAAA;AAAA,UACV,UAAA,EAAY;AAAA,SACd;AAAA,QAEC,iBAAO,QAAA,GAAM;AAAA;AAAA,KAChB;AAAA,oBACAA,eAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,EAAQ,EAAI,QAAA,EAAA,MAAA,EAAO,CAAA;AAAA,IAC9C,CAAC,IAAA,oBACAD,eAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,EAAS,OAAA,EAAS,GAAA,EAAI,EAC/C,QAAA,EAAA;AAAA,MAAA,KAAA;AAAA,MAAM,GAAA;AAAA,MAAE,UAAU,MAAA,GAAS,KAAA;AAAA,MAAO,KAAA,GAAQ,IAAI,GAAA,GAAM;AAAA,KAAA,EACvD,CAAA;AAAA,oBAEFC,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,EAAQ,EAAI,QAAA,EAAA,CAAC,IAAA,GAAO,OAAA,GAAU,EAAA,EAAG,CAAA;AAAA,IAE5D,IAAA,oBACCD,eAAAA,CAAC,MAAA,EAAA,EACE,QAAA,EAAA;AAAA,MAAA,OAAA,CAAQ,IAAI,CAAC,CAAC,CAAA,EAAG,CAAC,sBACjBA,eAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UAEC,KAAA,EAAO,EAAE,WAAA,EAAa,MAAA,EAAO;AAAA,UAE5B,QAAA,EAAA;AAAA,YAAA,CAAC,OAAA,oBACAA,eAAAA,CAAC,MAAA,EAAA,EAAK,OAAO,EAAE,KAAA,EAAO,KAAA,CAAM,GAAA,EAAI,EAAG,QAAA,EAAA;AAAA,cAAA,GAAA;AAAA,cAAE,CAAA;AAAA,cAAE;AAAA,aAAA,EAAC,CAAA;AAAA,YAEzC,CAAC,OAAA,oBAAWC,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,EAAQ,EAAG,QAAA,EAAA,IAAA,EAAE,CAAA;AAAA,4BACtDA,cAAAA,CAAC,QAAA,EAAA,EAAS,MAAM,CAAA,EAAG,KAAA,EAAO,QAAQ,CAAA,EAAG,CAAA;AAAA,4BACrCA,eAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,EAAQ,EAAG,QAAA,EAAA,GAAA,EAAC;AAAA;AAAA,SAAA;AAAA,QARnC;AAAA,OAUR,CAAA;AAAA,sBACDA,eAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,EAAQ,EAAI,QAAA,EAAA,OAAA,EAAQ;AAAA,KAAA,EAClD;AAAA,GAAA,EAEJ,CAAA;AAEJ;ACrFO,SAAS,aAAA,CAAc,EAAE,IAAA,EAAM,aAAA,EAAc,EAAuB;AACzE,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA;AACnC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIC,cAAAA,CAAkC,EAAE,CAAA;AAEtE,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,uBAAOD,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAO,QAAA,EAAU,SAAA,EAAW,QAAA,EAAS,EAAG,QAAA,EAAA,kBAAA,EAAa,CAAA;AAAA,EAC5E;AAEA,EAAA,uBACEA,eAAC,KAAA,EAAA,EACE,QAAA,EAAA,OAAA,CAAQ,IAAI,CAAC,CAAC,MAAA,EAAQ,QAAQ,CAAA,KAAM;AACnC,IAAA,MAAM,YAAY,MAAA,KAAW,aAAA;AAC7B,IAAA,MAAM,WAAA,GAAc,SAAA,CAAU,MAAM,CAAA,IAAK,CAAC,SAAA;AAC1C,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,CAAE,MAAA;AAEzC,IAAA,uBACED,eAAAA,CAAC,KAAA,EAAA,EAAiB,OAAO,EAAE,YAAA,EAAc,UAAS,EAChD,QAAA,EAAA;AAAA,sBAAAA,eAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,MAAM,YAAA,CAAa,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAG,CAAC,MAAM,GAAG,CAAC,aAAY,CAAE,CAAA;AAAA,UACrE,KAAA,EAAO;AAAA,YACL,OAAA,EAAS,MAAA;AAAA,YACT,UAAA,EAAY,QAAA;AAAA,YACZ,GAAA,EAAK,QAAA;AAAA,YACL,KAAA,EAAO,MAAA;AAAA,YACP,UAAA,EAAY,YAAY,uBAAA,GAA0B,wBAAA;AAAA,YAClD,MAAA,EAAQ,CAAA,UAAA,EAAa,SAAA,GAAY,MAAA,GAAS,MAAM,CAAA,CAAA;AAAA,YAChD,YAAA,EAAc,SAAA;AAAA,YACd,KAAA,EAAO,YAAY,WAAA,GAAc,QAAA;AAAA,YACjC,MAAA,EAAQ,SAAA;AAAA,YACR,OAAA,EAAS,eAAA;AAAA,YACT,QAAA,EAAU,SAAA;AAAA,YACV,UAAA,EAAY,SAAA;AAAA,YACZ,SAAA,EAAW;AAAA,WACb;AAAA,UAEA,QAAA,EAAA;AAAA,4BAAAC,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,WAAA,GAAc,QAAA,GAAM,QAAA,EAAI,CAAA;AAAA,4BAC/BA,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,YAAY,SAAA,GAAY,MAAA,GAAS,QAAA,EAAS,EAAI,QAAA,EAAA,MAAA,EAAO,CAAA;AAAA,4BACpED,gBAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,QAAA,EAAU,UAAA,EAAY,MAAA,EAAO,EAChD,QAAA,EAAA;AAAA,cAAA,UAAA;AAAA,cAAW,QAAA;AAAA,cAAO,UAAA,GAAa,IAAI,GAAA,GAAM;AAAA,aAAA,EAC5C,CAAA;AAAA,YACC,SAAA,oBACCC,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO;AAAA,cACX,UAAA,EAAY,MAAA;AAAA,cACZ,KAAA,EAAO,MAAA;AAAA,cACP,YAAA,EAAc,QAAA;AAAA,cACd,OAAA,EAAS,UAAA;AAAA,cACT,QAAA,EAAU;AAAA,eACT,QAAA,EAAA,QAAA,EAEH;AAAA;AAAA;AAAA,OAEJ;AAAA,MAEC,CAAC,WAAA,oBACAA,eAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,WAAA,EAAa,SAAA,EAAW,YAAY,SAAA,EAAU,EAC1D,0BAAAA,cAAAA,CAAC,QAAA,EAAA,EAAS,MAAM,QAAA,EAAU,KAAA,EAAO,GAAG,CAAA,EACtC;AAAA,KAAA,EAAA,EAxCM,MA0CV,CAAA;AAAA,EAEJ,CAAC,CAAA,EACH,CAAA;AAEJ;AC9DO,SAAS,gBAAA,CAAiB,EAAE,MAAA,EAAQ,YAAA,EAAc,aAAY,EAA0B;AAC7F,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,iBAAA,IAAqB,EAAC;AAE1C,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,IAAA,uBAAOA,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAO,QAAA,EAAU,SAAA,EAAW,QAAA,EAAS,EAAG,QAAA,EAAA,wCAAA,EAAgC,CAAA;AAAA,EAC/F;AAEA,EAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EACE,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM;AACf,IAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,CAAA,CAAE,EAAE,CAAA;AAC/B,IAAA,MAAM,SAAA,GAAY,WAAA,CAAY,QAAA,CAAS,CAAA,CAAE,EAAE,CAAA;AAC3C,IAAA,MAAM,WAAW,KAAA,KAAU,MAAA;AAE3B,IAAA,uBACED,eAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QAEC,KAAA,EAAO;AAAA,UACL,OAAA,EAAS,UAAA;AAAA,UACT,YAAA,EAAc,aAAa,MAAM,CAAA;AAAA,SACnC;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,SAAS,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,QAAA,EAAU,MAAA,EAAQ,GAAA,EAAK,QAAA,EAAU,YAAA,EAAc,UAAS,EAC3G,QAAA,EAAA;AAAA,4BAAAC,cAAAA,CAAC,UAAK,KAAA,EAAO,EAAE,YAAY,MAAA,EAAO,EAAI,YAAE,EAAA,EAAG,CAAA;AAAA,YAC1C,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,KAAA,KAAU,CAAA,CAAE,EAAA,oBACxBD,eAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,UAAS,EAAG,QAAA,EAAA;AAAA,cAAA,SAAA;AAAA,cAAG,CAAA,CAAE;AAAA,aAAA,EAAM,CAAA;AAAA,YAE9C,CAAA,CAAE,4BAAYC,cAAAA,CAAC,UAAK,KAAA,EAAO,KAAA,CAAM,SAAS,CAAA,EAAG,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,YACrD,SAAA,oBAAaA,cAAAA,CAAC,MAAA,EAAA,EAAK,OAAO,KAAA,CAAM,SAAS,GAAG,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,YACnD,CAAC,QAAA,IAAY,CAAC,SAAA,oBAAaA,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,KAAA,CAAM,SAAS,CAAA,EAAG,QAAA,EAAA,WAAA,EAAS;AAAA,WAAA,EACtE,CAAA;AAAA,UACC,4BACCA,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,WAAA,EAAa,QAAA,EAAS,EAClC,QAAA,kBAAAA,eAAC,QAAA,EAAA,EAAS,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,GAAG,CAAA,EACnC;AAAA;AAAA,OAAA;AAAA,MAlBG,CAAA,CAAE;AAAA,KAoBT;AAAA,EAEJ,CAAC,CAAA,EACH,CAAA;AAEJ;AC5CO,SAAS,WAAA,CAAY,EAAE,OAAA,EAAS,aAAA,EAAc,EAAqB;AACxE,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,uBAAOA,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAO,QAAA,EAAU,SAAA,EAAW,QAAA,EAAS,EAAG,QAAA,EAAA,mBAAA,EAAiB,CAAA;AAAA,EAChF;AAEA,EAAA,uBACEA,cAAAA,CAAC,IAAA,EAAA,EAAG,KAAA,EAAO,EAAE,WAAW,MAAA,EAAQ,MAAA,EAAQ,CAAA,EAAG,OAAA,EAAS,GAAE,EACnD,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,QAAQ,CAAA,KAAM;AAC1B,IAAA,MAAM,YAAY,MAAA,KAAW,aAAA;AAC7B,IAAA,uBACED,eAAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QAEC,KAAA,EAAO;AAAA,UACL,OAAA,EAAS,MAAA;AAAA,UACT,UAAA,EAAY,QAAA;AAAA,UACZ,GAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,UAAA;AAAA,UACT,KAAA,EAAO,YAAY,WAAA,GAAc,QAAA;AAAA,UACjC,UAAA,EAAY,YAAY,MAAA,GAAS;AAAA,SACnC;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAA,eAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,QAAQ,QAAA,EAAU,QAAA,EAAU,QAAA,EAAU,SAAA,EAAU,EACnE,QAAA,EAAA;AAAA,YAAA,CAAA,GAAI,CAAA;AAAA,YAAE;AAAA,WAAA,EACT,CAAA;AAAA,0BACAC,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,MAAA,EAAO,CAAA;AAAA,UACb,SAAA,oBACCA,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO;AAAA,YACX,QAAA,EAAU,QAAA;AAAA,YACV,UAAA,EAAY,MAAA;AAAA,YACZ,KAAA,EAAO,MAAA;AAAA,YACP,YAAA,EAAc,QAAA;AAAA,YACd,OAAA,EAAS;AAAA,aACR,QAAA,EAAA,KAAA,EAEH;AAAA;AAAA,OAAA;AAAA,MAvBG,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,CAAC,CAAA;AAAA,KAyBrB;AAAA,EAEJ,CAAC,CAAA,EACH,CAAA;AAEJ;ACdA,SAAS,OAAA,CAAQ;AAAA,EACf,EAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAMG;AACD,EAAA,uBACED,gBAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,SAAI,KAAA,EAAO,aAAA,EAAe,SAAS,MAAM,QAAA,CAAS,EAAE,CAAA,EACnD,QAAA,EAAA;AAAA,sBAAAC,cAAAA,CAAC,UAAM,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,sBACbA,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,UAAU,SAAA,EAAU,EAAI,QAAA,EAAA,SAAA,GAAY,QAAA,GAAM,QAAA,EAAI;AAAA,KAAA,EAC/D,CAAA;AAAA,IACC,CAAC,SAAA,oBAAaA,eAAC,KAAA,EAAA,EAAI,KAAA,EAAO,aAAc,QAAA,EAAS;AAAA,GAAA,EACpD,CAAA;AAEJ;AAMO,SAAS,SAAS,EAAE,QAAA,GAAW,cAAA,EAAgB,WAAA,GAAc,OAAM,EAAkB;AAC1F,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIC,eAAS,WAAW,CAAA;AAChD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,cAAAA,CAAkC;AAAA,IAClE,GAAA,EAAK,KAAA;AAAA,IACL,IAAA,EAAM,KAAA;AAAA,IACN,IAAA,EAAM,IAAA;AAAA,IACN,OAAA,EAAS,IAAA;AAAA,IACT,GAAA,EAAK;AAAA,GACN,CAAA;AAGD,EAAAC,eAAA,CAAU,MAAM,YAAA,CAAa,IAAI,CAAA,EAAG,EAAE,CAAA;AAEtC,EAAA,MAAM,EAAE,KAAA,EAAM,GAAIC,8BAAA,EAA0B;AAE5C,EAAA,MAAM,SAAaC,gBAAA,CAAS,KAAA,EAAO,CAAC,CAAA,KAA4B,EAAE,MAAM,CAAA;AACxE,EAAA,MAAM,OAAaA,gBAAA,CAAS,KAAA,EAAO,CAAC,CAAA,KAA4B,EAAE,IAAI,CAAA;AACtE,EAAA,MAAM,eAAeA,gBAAA,CAAS,KAAA,EAAO,CAAC,CAAA,KAA4B,EAAE,YAAY,CAAA;AAChF,EAAA,MAAM,gBAAgBA,gBAAA,CAAS,KAAA,EAAO,CAAC,CAAA,KAA4B,EAAE,aAAa,CAAA;AAClF,EAAA,MAAM,UAAaA,gBAAA,CAAS,KAAA,EAAO,CAAC,CAAA,KAA4B,EAAE,OAAO,CAAA;AACzE,EAAA,MAAM,eAAeA,gBAAA,CAAS,KAAA,EAAO,CAAC,CAAA,KAA4B,EAAE,YAAY,CAAA;AAChF,EAAA,MAAM,YAAaA,gBAAA,CAAS,KAAA,EAAO,CAAC,CAAA,KAA4B,EAAE,SAAS,CAAA;AAE3E,EAAA,MAAM,SAAA,GAAaA,gBAAA,CAAS,KAAA,EAAO,CAAC,MAA4B,CAAC,CAAA;AACjE,EAAA,MAAM,IAAA,GAAaC,cAAQ,MAAMC,oBAAA,CAAgB,SAAS,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AACxE,EAAA,MAAM,QAAA,GAAaD,cAAQ,MAAME,+BAAA,CAA2B,SAAS,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AACnF,EAAA,MAAM,WAAA,GAAcF,cAAQ,MAAMG,2BAAA,CAAuB,SAAS,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEhF,EAAA,IAAI,CAAC,SAAA,IAAa,CAAC,MAAA,EAAQ,OAAO,IAAA;AAElC,EAAA,MAAM,IAAA,GAAO,QAAA,KAAa,aAAA,GAAgB,MAAA,GAAS,OAAA;AAEnD,EAAA,SAAS,cAAc,EAAA,EAAY;AACjC,IAAA,YAAA,CAAa,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAG,CAAC,EAAE,GAAG,CAAC,CAAA,CAAE,EAAE,CAAA,EAAE,CAAE,CAAA;AAAA,EAC9C;AAEA,EAAA,uBACET,gBAAAU,mBAAA,EAAA,EAEE,QAAA,EAAA;AAAA,oBAAAV,eAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO;AAAA,UACL,GAAG,SAAA;AAAA,UACH,CAAC,IAAI,GAAG,SAAA;AAAA,UACR,KAAA,EAAO,IAAA,KAAS,OAAA,GAAU,SAAA,GAAY,MAAA;AAAA,UACtC,IAAA,EAAM,IAAA,KAAS,MAAA,GAAS,SAAA,GAAY;AAAA,SACtC;AAAA,QACA,SAAS,MAAM,SAAA,CAAU,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,QAClC,KAAA,EAAM,mBAAA;AAAA,QACP,QAAA,EAAA;AAAA,UAAA,iBAAA;AAAA,UAEE,YAAA,oBACCC,cAAAA,CAAC,MAAA,EAAA,EAAK,OAAO,EAAE,OAAA,EAAS,GAAA,EAAI,EAAG,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,UAEjC,WAAA,CAAY,MAAA,GAAS,CAAA,oBACpBA,cAAAA,CAAC,UAAK,KAAA,EAAO,EAAE,UAAA,EAAY,SAAA,EAAW,YAAA,EAAc,KAAA,EAAO,OAAO,SAAA,EAAW,MAAA,EAAQ,SAAA,EAAW,OAAA,EAAS,aAAA,EAAe,UAAA,EAAY,QAAA,EAAU,cAAA,EAAgB,QAAA,EAAU,QAAA,EAAU,SAAA,EAAU,EAAG,QAAA,EAAA,GAAA,EAE/L;AAAA;AAAA;AAAA,KAEJ;AAAA,oBAGAD,eAAAA,CAAC,KAAA,EAAA,EAAI,OAAO,cAAA,CAAe,MAAA,EAAQ,IAAI,CAAA,EAErC,QAAA,EAAA;AAAA,sBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,WAAA,EACV,QAAA,EAAA;AAAA,wBAAAA,gBAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAC,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,KAAA,EAAO,WAAA,EAAa,UAAA,EAAY,MAAA,EAAQ,QAAA,EAAU,QAAA,EAAS,EAAG,QAAA,EAAA,0BAAA,EAE5E,CAAA;AAAA,0BACAA,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,KAAA,EAAO,QAAA,EAAU,QAAA,EAAU,SAAA,EAAU,EAChD,QAAA,EAAA,SAAA,GAAY,kBAAA,GAAgB,YAAA,GAAe,4BAAkB,SAAA,EAChE;AAAA,SAAA,EACF,CAAA;AAAA,wBACAA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,MAAM,SAAA,CAAU,KAAK,CAAA;AAAA,YAC9B,KAAA,EAAO,EAAE,UAAA,EAAY,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,MAAA,EAAQ,SAAA,EAAW,QAAA,EAAU,MAAA,EAAQ,YAAY,CAAA,EAAE;AAAA,YAClH,QAAA,EAAA;AAAA;AAAA;AAED,OAAA,EACF,CAAA;AAAA,sBAGAA,cAAAA,CAAC,OAAA,EAAA,EAAQ,EAAA,EAAG,KAAA,EAAM,KAAA,EAAM,YAAA,EAAa,SAAA,EAAW,SAAA,CAAU,GAAA,IAAO,KAAA,EAAO,QAAA,EAAU,eAChF,QAAA,kBAAAA,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,MAAA;AAAA,UACA,IAAA;AAAA,UACA,aAAA;AAAA,UACA,QAAA;AAAA,UACA;AAAA;AAAA,OACF,EACF,CAAA;AAAA,sBAEAA,cAAAA,CAAC,OAAA,EAAA,EAAQ,IAAG,MAAA,EAAO,KAAA,EAAM,cAAU,SAAA,EAAW,SAAA,CAAU,IAAA,IAAQ,KAAA,EAAO,UAAU,aAAA,EAC/E,QAAA,kBAAAA,eAAC,aAAA,EAAA,EAAc,IAAA,EAAY,eAA8B,CAAA,EAC3D,CAAA;AAAA,sBAEAA,cAAAA,CAAC,OAAA,EAAA,EAAQ,EAAA,EAAG,MAAA,EAAO,KAAA,EAAM,oBAAA,EAAqB,SAAA,EAAW,SAAA,CAAU,IAAA,IAAQ,IAAA,EAAM,QAAA,EAAU,eACzF,QAAA,kBAAAA,cAAAA;AAAA,QAAC,gBAAA;AAAA,QAAA;AAAA,UACC,MAAA;AAAA,UACA,YAAA;AAAA,UACA;AAAA;AAAA,OACF,EACF,CAAA;AAAA,sBAEAA,cAAAA,CAAC,OAAA,EAAA,EAAQ,IAAG,SAAA,EAAU,KAAA,EAAM,cAAa,SAAA,EAAW,SAAA,CAAU,OAAA,IAAW,IAAA,EAAM,UAAU,aAAA,EACvF,QAAA,kBAAAA,eAAC,WAAA,EAAA,EAAY,OAAA,EAAkB,eAA8B,CAAA,EAC/D,CAAA;AAAA,sBAEAA,eAAC,OAAA,EAAA,EAAQ,EAAA,EAAG,OAAM,KAAA,EAAM,cAAA,EAAY,WAAW,SAAA,CAAU,GAAA,IAAO,MAAM,QAAA,EAAU,aAAA,EAC9E,0BAAAA,cAAAA,CAAC,KAAA,EAAA,EAAI,OAAO,EAAE,QAAA,EAAU,SAAA,EAAU,EAChC,QAAA,kBAAAA,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAM;AAAA,YACJ,QAAQ,MAAA,CAAO,EAAA;AAAA,YACf,aAAA;AAAA,YACA,QAAA;AAAA,YACA,SAAA;AAAA,YACA,YAAA;AAAA,YACA,IAAA;AAAA,YACA,YAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA,KAAA,EAAO;AAAA;AAAA,SAEX,CAAA,EACF;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AC7KO,SAAS,iBAAiB,KAAA,EAA8B;AAC7D,EAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,aAAA,EAAe;AAC1C,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,uBAAOA,cAAAA,CAAC,QAAA,EAAA,EAAU,GAAG,KAAA,EAAO,CAAA;AAC9B","file":"index.cjs","sourcesContent":["import type { CSSProperties } from \"react\";\n\nexport const PANEL_WIDTH = 340;\nexport const Z_INDEX = 999999;\nexport const ACCENT = \"#6366f1\";\nexport const BG = \"rgba(13, 13, 18, 0.97)\";\nexport const BORDER = \"rgba(255,255,255,0.08)\";\nexport const TEXT_DIM = \"#64748b\";\nexport const TEXT_BASE = \"#cbd5e1\";\nexport const TEXT_BRIGHT = \"#f1f5f9\";\n\nexport function panelContainer(isOpen: boolean, side: \"left\" | \"right\"): CSSProperties {\n return {\n position: \"fixed\",\n top: 0,\n [side]: 0,\n bottom: 0,\n width: `${PANEL_WIDTH}px`,\n zIndex: Z_INDEX - 1,\n background: BG,\n color: TEXT_BASE,\n fontFamily: \"'ui-monospace','SFMono-Regular','Menlo',monospace\",\n fontSize: \"0.75rem\",\n lineHeight: 1.5,\n transform: isOpen\n ? \"translateX(0)\"\n : `translateX(${side === \"right\" ? PANEL_WIDTH : -PANEL_WIDTH}px)`,\n transition: \"transform 220ms ease-in-out\",\n overflowY: \"auto\",\n boxShadow: side === \"right\"\n ? \"-4px 0 24px rgba(0,0,0,0.6)\"\n : \"4px 0 24px rgba(0,0,0,0.6)\",\n display: \"flex\",\n flexDirection: \"column\",\n borderLeft: side === \"right\" ? `1px solid ${BORDER}` : undefined,\n borderRight: side === \"left\" ? `1px solid ${BORDER}` : undefined,\n };\n}\n\nexport const toggleBtn: CSSProperties = {\n position: \"fixed\",\n bottom: \"1.25rem\",\n right: \"1.25rem\",\n zIndex: Z_INDEX,\n background: ACCENT,\n color: \"#fff\",\n border: \"none\",\n borderRadius: \"2rem\",\n padding: \"0.375rem 0.875rem\",\n fontSize: \"0.72rem\",\n fontFamily: \"'ui-monospace','SFMono-Regular','Menlo',monospace\",\n cursor: \"pointer\",\n boxShadow: \"0 4px 12px rgba(0,0,0,0.5)\",\n userSelect: \"none\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.375rem\",\n};\n\nexport const panelHeader: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"0.75rem 1rem\",\n borderBottom: `1px solid ${BORDER}`,\n background: \"rgba(99,102,241,0.12)\",\n flexShrink: 0,\n};\n\nexport const sectionHeader: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"0.4rem 1rem\",\n background: \"rgba(255,255,255,0.03)\",\n cursor: \"pointer\",\n borderBottom: `1px solid ${BORDER}`,\n fontWeight: \"bold\",\n fontSize: \"0.68rem\",\n textTransform: \"uppercase\",\n letterSpacing: \"0.08em\",\n color: TEXT_DIM,\n userSelect: \"none\",\n};\n\nexport const sectionBody: CSSProperties = {\n padding: \"0.5rem 1rem\",\n borderBottom: `1px solid ${BORDER}`,\n};\n\nexport function badge(color: string): CSSProperties {\n return {\n display: \"inline-block\",\n background: color,\n color: \"#fff\",\n borderRadius: \"0.25rem\",\n padding: \"0.05rem 0.35rem\",\n fontSize: \"0.62rem\",\n fontWeight: \"bold\",\n marginLeft: \"0.3rem\",\n verticalAlign: \"middle\",\n };\n}\n\nexport const progressTrack: CSSProperties = {\n height: \"4px\",\n background: \"rgba(255,255,255,0.08)\",\n borderRadius: \"2px\",\n overflow: \"hidden\",\n margin: \"0.5rem 0\",\n};\n\nexport function progressBar(pct: number): CSSProperties {\n return {\n height: \"100%\",\n width: `${pct}%`,\n background: ACCENT,\n borderRadius: \"2px\",\n transition: \"width 300ms ease\",\n };\n}\n","\"use client\";\n\nimport type { WaypointSchema } from \"@waypointjs/core\";\nimport type { ResolvedTree } from \"@waypointjs/core\";\nimport { badge, progressBar, progressTrack, TEXT_DIM, TEXT_BRIGHT, ACCENT } from \"../styles\";\n\ninterface StepTreeProps {\n schema: WaypointSchema;\n tree: ResolvedTree;\n currentStepId: string | null;\n progress: number;\n completed: boolean;\n}\n\nexport function StepTree({ schema, tree, currentStepId, progress, completed }: StepTreeProps) {\n const currentIdx = tree.steps.findIndex((s) => s.definition.id === currentStepId);\n\n return (\n <div>\n {/* Schema info */}\n <div style={{ marginBottom: \"0.75rem\" }}>\n <div style={{ color: TEXT_DIM, fontSize: \"0.65rem\" }}>schema</div>\n <div style={{ color: TEXT_BRIGHT, fontWeight: \"bold\" }}>{schema.name}</div>\n <div style={{ color: TEXT_DIM }}>{schema.id} · v{schema.version}</div>\n </div>\n\n {/* Progress */}\n <div style={{ marginBottom: \"0.75rem\" }}>\n <div style={{ display: \"flex\", justifyContent: \"space-between\", color: TEXT_DIM, fontSize: \"0.65rem\" }}>\n <span>progression</span>\n <span>{completed ? \"✓ terminé\" : `${progress}%`}</span>\n </div>\n <div style={progressTrack}>\n <div style={progressBar(completed ? 100 : progress)} />\n </div>\n </div>\n\n {/* Visible steps */}\n <div style={{ marginBottom: \"0.5rem\" }}>\n {tree.steps.map((step, i) => {\n const isCurrent = step.definition.id === currentStepId;\n const isDone = completed || i < currentIdx;\n return (\n <div\n key={step.definition.id}\n style={{\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: \"0.5rem\",\n padding: \"0.3rem 0\",\n borderLeft: isCurrent ? `2px solid ${ACCENT}` : \"2px solid transparent\",\n paddingLeft: \"0.5rem\",\n marginLeft: \"-0.5rem\",\n opacity: (!isDone && !isCurrent) ? 0.45 : 1,\n }}\n >\n <div style={{\n width: \"1.1rem\",\n height: \"1.1rem\",\n borderRadius: \"50%\",\n background: isDone ? \"#22c55e\" : isCurrent ? ACCENT : \"rgba(255,255,255,0.1)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: \"0.6rem\",\n flexShrink: 0,\n marginTop: \"0.1rem\",\n }}>\n {isDone ? \"✓\" : i + 1}\n </div>\n <div>\n <div style={{ color: isCurrent ? TEXT_BRIGHT : TEXT_DIM, fontWeight: isCurrent ? \"bold\" : \"normal\" }}>\n {step.definition.title}\n </div>\n <div style={{ color: TEXT_DIM, fontSize: \"0.65rem\" }}>{step.definition.url}</div>\n </div>\n </div>\n );\n })}\n </div>\n\n {/* Hidden steps */}\n {tree.hiddenSteps.length > 0 && (\n <div>\n <div style={{ color: TEXT_DIM, fontSize: \"0.65rem\", marginBottom: \"0.25rem\" }}>\n steps cachées ({tree.hiddenSteps.length})\n </div>\n {tree.hiddenSteps.map((step) => (\n <div key={step.definition.id} style={{ display: \"flex\", alignItems: \"center\", gap: \"0.4rem\", padding: \"0.15rem 0\", opacity: 0.5 }}>\n <span style={{ fontSize: \"0.65rem\" }}>⊘</span>\n <span style={{ color: TEXT_DIM }}>{step.definition.title}</span>\n <span style={badge(\"#94a3b8\")}>hidden</span>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\n\ninterface JsonViewProps {\n data: unknown;\n depth?: number;\n}\n\nconst COLOR = {\n string: \"#86efac\", // green-300\n number: \"#93c5fd\", // blue-300\n boolean: \"#fdba74\", // orange-300\n null: \"#f87171\", // red-400\n key: \"#c4b5fd\", // violet-300\n bracket: \"#94a3b8\", // slate-400\n toggle: \"#6366f1\", // indigo-500\n};\n\nfunction Primitive({ value }: { value: string | number | boolean | null }) {\n if (value === null) return <span style={{ color: COLOR.null }}>null</span>;\n if (typeof value === \"boolean\")\n return <span style={{ color: COLOR.boolean }}>{String(value)}</span>;\n if (typeof value === \"number\")\n return <span style={{ color: COLOR.number }}>{value}</span>;\n return <span style={{ color: COLOR.string }}>\"{value}\"</span>;\n}\n\nexport function JsonView({ data, depth = 0 }: JsonViewProps) {\n const [open, setOpen] = useState(depth === 0);\n\n if (data === null || typeof data !== \"object\") {\n return <Primitive value={data as string | number | boolean | null} />;\n }\n\n const isArray = Array.isArray(data);\n const entries = isArray\n ? (data as unknown[]).map((v, i) => [String(i), v] as [string, unknown])\n : Object.entries(data as Record<string, unknown>);\n\n const count = entries.length;\n const open_b = isArray ? \"[\" : \"{\";\n const close_b = isArray ? \"]\" : \"}\";\n\n if (count === 0) {\n return (\n <span style={{ color: COLOR.bracket }}>\n {open_b}{close_b}\n </span>\n );\n }\n\n return (\n <span>\n <button\n onClick={() => setOpen((o) => !o)}\n style={{\n background: \"none\",\n border: \"none\",\n color: COLOR.toggle,\n cursor: \"pointer\",\n padding: 0,\n fontSize: \"0.72rem\",\n fontFamily: \"inherit\",\n }}\n >\n {open ? \"▾\" : \"▸\"}\n </button>\n <span style={{ color: COLOR.bracket }}>{open_b}</span>\n {!open && (\n <span style={{ color: COLOR.bracket, opacity: 0.6 }}>\n {count} {isArray ? \"item\" : \"key\"}{count > 1 ? \"s\" : \"\"}\n </span>\n )}\n <span style={{ color: COLOR.bracket }}>{!open ? close_b : \"\"}</span>\n\n {open && (\n <span>\n {entries.map(([k, v]) => (\n <div\n key={k}\n style={{ paddingLeft: \"1rem\" }}\n >\n {!isArray && (\n <span style={{ color: COLOR.key }}>\"{k}\"</span>\n )}\n {!isArray && <span style={{ color: COLOR.bracket }}>: </span>}\n <JsonView data={v} depth={depth + 1} />\n <span style={{ color: COLOR.bracket }}>,</span>\n </div>\n ))}\n <span style={{ color: COLOR.bracket }}>{close_b}</span>\n </span>\n )}\n </span>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { JsonView } from \"./JsonView\";\nimport { TEXT_DIM, TEXT_BRIGHT, ACCENT, BORDER } from \"../styles\";\n\ninterface DataInspectorProps {\n data: Record<string, Record<string, unknown>>;\n currentStepId: string | null;\n}\n\nexport function DataInspector({ data, currentStepId }: DataInspectorProps) {\n const entries = Object.entries(data);\n const [collapsed, setCollapsed] = useState<Record<string, boolean>>({});\n\n if (entries.length === 0) {\n return <div style={{ color: TEXT_DIM, fontStyle: \"italic\" }}>Aucune donnée</div>;\n }\n\n return (\n <div>\n {entries.map(([stepId, stepData]) => {\n const isCurrent = stepId === currentStepId;\n const isCollapsed = collapsed[stepId] ?? !isCurrent;\n const fieldCount = Object.keys(stepData).length;\n\n return (\n <div key={stepId} style={{ marginBottom: \"0.4rem\" }}>\n <button\n onClick={() => setCollapsed((p) => ({ ...p, [stepId]: !isCollapsed }))}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.4rem\",\n width: \"100%\",\n background: isCurrent ? \"rgba(99,102,241,0.12)\" : \"rgba(255,255,255,0.03)\",\n border: `1px solid ${isCurrent ? ACCENT : BORDER}`,\n borderRadius: \"0.25rem\",\n color: isCurrent ? TEXT_BRIGHT : TEXT_DIM,\n cursor: \"pointer\",\n padding: \"0.3rem 0.5rem\",\n fontSize: \"0.72rem\",\n fontFamily: \"inherit\",\n textAlign: \"left\",\n }}\n >\n <span>{isCollapsed ? \"▸\" : \"▾\"}</span>\n <span style={{ fontWeight: isCurrent ? \"bold\" : \"normal\" }}>{stepId}</span>\n <span style={{ color: TEXT_DIM, marginLeft: \"auto\" }}>\n {fieldCount} champ{fieldCount > 1 ? \"s\" : \"\"}\n </span>\n {isCurrent && (\n <span style={{\n background: ACCENT,\n color: \"#fff\",\n borderRadius: \"0.2rem\",\n padding: \"0 0.3rem\",\n fontSize: \"0.6rem\",\n }}>\n actuel\n </span>\n )}\n </button>\n\n {!isCollapsed && (\n <div style={{ paddingLeft: \"0.75rem\", paddingTop: \"0.25rem\" }}>\n <JsonView data={stepData} depth={0} />\n </div>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n","\"use client\";\n\nimport type { WaypointSchema } from \"@waypointjs/core\";\nimport { JsonView } from \"./JsonView\";\nimport { badge, TEXT_DIM, BORDER } from \"../styles\";\n\ninterface ExternalVarsViewProps {\n schema: WaypointSchema;\n externalVars: Record<string, unknown>;\n missingVars: string[];\n}\n\nexport function ExternalVarsView({ schema, externalVars, missingVars }: ExternalVarsViewProps) {\n const vars = schema.externalVariables ?? [];\n\n if (vars.length === 0) {\n return <div style={{ color: TEXT_DIM, fontStyle: \"italic\" }}>Aucune variable externe déclarée</div>;\n }\n\n return (\n <div>\n {vars.map((v) => {\n const value = externalVars[v.id];\n const isMissing = missingVars.includes(v.id);\n const hasValue = value !== undefined;\n\n return (\n <div\n key={v.id}\n style={{\n padding: \"0.4rem 0\",\n borderBottom: `1px solid ${BORDER}`,\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", flexWrap: \"wrap\", gap: \"0.2rem\", marginBottom: \"0.2rem\" }}>\n <span style={{ fontWeight: \"bold\" }}>{v.id}</span>\n {v.label && v.label !== v.id && (\n <span style={{ color: TEXT_DIM }}>— {v.label}</span>\n )}\n {v.blocking && <span style={badge(\"#f97316\")}>blocking</span>}\n {isMissing && <span style={badge(\"#ef4444\")}>missing</span>}\n {!hasValue && !isMissing && <span style={badge(\"#64748b\")}>undefined</span>}\n </div>\n {hasValue && (\n <div style={{ paddingLeft: \"0.5rem\" }}>\n <JsonView data={value} depth={0} />\n </div>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n","\"use client\";\n\nimport { TEXT_DIM, TEXT_BRIGHT, ACCENT } from \"../styles\";\n\ninterface HistoryViewProps {\n history: string[];\n currentStepId: string | null;\n}\n\nexport function HistoryView({ history, currentStepId }: HistoryViewProps) {\n if (history.length === 0) {\n return <div style={{ color: TEXT_DIM, fontStyle: \"italic\" }}>Aucune navigation</div>;\n }\n\n return (\n <ol style={{ listStyle: \"none\", margin: 0, padding: 0 }}>\n {history.map((stepId, i) => {\n const isCurrent = stepId === currentStepId;\n return (\n <li\n key={`${stepId}-${i}`}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.5rem\",\n padding: \"0.2rem 0\",\n color: isCurrent ? TEXT_BRIGHT : TEXT_DIM,\n fontWeight: isCurrent ? \"bold\" : \"normal\",\n }}\n >\n <span style={{ color: ACCENT, minWidth: \"1.2rem\", fontSize: \"0.65rem\" }}>\n {i + 1}.\n </span>\n <span>{stepId}</span>\n {isCurrent && (\n <span style={{\n fontSize: \"0.6rem\",\n background: ACCENT,\n color: \"#fff\",\n borderRadius: \"0.2rem\",\n padding: \"0 0.3rem\",\n }}>\n ici\n </span>\n )}\n </li>\n );\n })}\n </ol>\n );\n}\n","\"use client\";\n\nimport { useState, useEffect, useMemo } from \"react\";\nimport { useStore } from \"zustand\";\nimport { useWaypointRuntimeContext } from \"@waypointjs/next\";\nimport {\n getResolvedTree,\n calculateProgressFromState,\n getMissingBlockingVars,\n} from \"@waypointjs/core\";\nimport type { WaypointRuntimeStore } from \"@waypointjs/core\";\n\nimport { StepTree } from \"./components/StepTree\";\nimport { DataInspector } from \"./components/DataInspector\";\nimport { ExternalVarsView } from \"./components/ExternalVarsView\";\nimport { HistoryView } from \"./components/HistoryView\";\nimport { JsonView } from \"./components/JsonView\";\nimport {\n panelContainer,\n panelHeader,\n sectionHeader,\n sectionBody,\n toggleBtn,\n TEXT_DIM,\n TEXT_BRIGHT,\n} from \"./styles\";\n\nexport interface DevPanelProps {\n position?: \"bottom-right\" | \"bottom-left\";\n defaultOpen?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Collapsible section\n// ---------------------------------------------------------------------------\n\nfunction Section({\n id,\n label,\n collapsed,\n onToggle,\n children,\n}: {\n id: string;\n label: string;\n collapsed: boolean;\n onToggle: (id: string) => void;\n children: React.ReactNode;\n}) {\n return (\n <div>\n <div style={sectionHeader} onClick={() => onToggle(id)}>\n <span>{label}</span>\n <span style={{ fontSize: \"0.65rem\" }}>{collapsed ? \"▸\" : \"▾\"}</span>\n </div>\n {!collapsed && <div style={sectionBody}>{children}</div>}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// DevPanel\n// ---------------------------------------------------------------------------\n\nexport function DevPanel({ position = \"bottom-right\", defaultOpen = false }: DevPanelProps) {\n const [isOpen, setIsOpen] = useState(defaultOpen);\n const [isMounted, setIsMounted] = useState(false);\n const [collapsed, setCollapsed] = useState<Record<string, boolean>>({\n nav: false,\n data: false,\n vars: true,\n history: true,\n raw: true,\n });\n\n // SSR safety — don't render until client-side hydration is complete\n useEffect(() => setIsMounted(true), []);\n\n const { store } = useWaypointRuntimeContext();\n\n const schema = useStore(store, (s: WaypointRuntimeStore) => s.schema);\n const data = useStore(store, (s: WaypointRuntimeStore) => s.data);\n const externalVars = useStore(store, (s: WaypointRuntimeStore) => s.externalVars);\n const currentStepId = useStore(store, (s: WaypointRuntimeStore) => s.currentStepId);\n const history = useStore(store, (s: WaypointRuntimeStore) => s.history);\n const isSubmitting = useStore(store, (s: WaypointRuntimeStore) => s.isSubmitting);\n const completed = useStore(store, (s: WaypointRuntimeStore) => s.completed);\n\n const fullState = useStore(store, (s: WaypointRuntimeStore) => s);\n const tree = useMemo(() => getResolvedTree(fullState), [fullState]);\n const progress = useMemo(() => calculateProgressFromState(fullState), [fullState]);\n const missingVars = useMemo(() => getMissingBlockingVars(fullState), [fullState]);\n\n if (!isMounted || !schema) return null;\n\n const side = position === \"bottom-left\" ? \"left\" : \"right\";\n\n function toggleSection(id: string) {\n setCollapsed((p) => ({ ...p, [id]: !p[id] }));\n }\n\n return (\n <>\n {/* Toggle button */}\n <button\n style={{\n ...toggleBtn,\n [side]: \"1.25rem\",\n right: side === \"right\" ? \"1.25rem\" : undefined,\n left: side === \"left\" ? \"1.25rem\" : undefined,\n }}\n onClick={() => setIsOpen((o) => !o)}\n title=\"Waypoint DevTools\"\n >\n ◈ waypoint\n {isSubmitting && (\n <span style={{ opacity: 0.7 }}>…</span>\n )}\n {missingVars.length > 0 && (\n <span style={{ background: \"#ef4444\", borderRadius: \"50%\", width: \"0.85rem\", height: \"0.85rem\", display: \"inline-flex\", alignItems: \"center\", justifyContent: \"center\", fontSize: \"0.55rem\" }}>\n !\n </span>\n )}\n </button>\n\n {/* Panel */}\n <div style={panelContainer(isOpen, side)}>\n {/* Header */}\n <div style={panelHeader}>\n <div>\n <div style={{ color: TEXT_BRIGHT, fontWeight: \"bold\", fontSize: \"0.8rem\" }}>\n ◈ Waypoint DevTools\n </div>\n <div style={{ color: TEXT_DIM, fontSize: \"0.65rem\" }}>\n {completed ? \"✓ completed\" : isSubmitting ? \"⟳ submitting…\" : \"running\"}\n </div>\n </div>\n <button\n onClick={() => setIsOpen(false)}\n style={{ background: \"none\", border: \"none\", color: TEXT_DIM, cursor: \"pointer\", fontSize: \"1rem\", lineHeight: 1 }}\n >\n ×\n </button>\n </div>\n\n {/* Sections */}\n <Section id=\"nav\" label=\"Navigation\" collapsed={collapsed.nav ?? false} onToggle={toggleSection}>\n <StepTree\n schema={schema}\n tree={tree}\n currentStepId={currentStepId}\n progress={progress}\n completed={completed}\n />\n </Section>\n\n <Section id=\"data\" label=\"Données\" collapsed={collapsed.data ?? false} onToggle={toggleSection}>\n <DataInspector data={data} currentStepId={currentStepId} />\n </Section>\n\n <Section id=\"vars\" label=\"Variables externes\" collapsed={collapsed.vars ?? true} onToggle={toggleSection}>\n <ExternalVarsView\n schema={schema}\n externalVars={externalVars}\n missingVars={missingVars}\n />\n </Section>\n\n <Section id=\"history\" label=\"Historique\" collapsed={collapsed.history ?? true} onToggle={toggleSection}>\n <HistoryView history={history} currentStepId={currentStepId} />\n </Section>\n\n <Section id=\"raw\" label=\"État brut\" collapsed={collapsed.raw ?? true} onToggle={toggleSection}>\n <div style={{ fontSize: \"0.68rem\" }}>\n <JsonView\n data={{\n schema: schema.id,\n currentStepId,\n progress,\n completed,\n isSubmitting,\n data,\n externalVars,\n history,\n }}\n depth={0}\n />\n </div>\n </Section>\n </div>\n </>\n );\n}\n","\"use client\";\n\nimport { DevPanel } from \"./DevPanel\";\nimport type { DevPanelProps } from \"./DevPanel\";\n\nexport type WaypointDevtoolsProps = DevPanelProps;\n\n/**\n * Drop-in debug panel for Waypoint Runtime.\n *\n * - **Dev-only** : renders nothing in production (NODE_ENV !== \"development\").\n * - Must be placed **inside** a `<WaypointRunner>` to access the runtime context.\n *\n * @example\n * <WaypointRunner schema={mySchema} onComplete={...}>\n * {children}\n * <WaypointDevtools />\n * </WaypointRunner>\n */\nexport function WaypointDevtools(props: WaypointDevtoolsProps) {\n if (process.env.NODE_ENV !== \"development\") {\n return null;\n }\n return <DevPanel {...props} />;\n}\n"]}