@wizzard-packages/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) 2025 Aziz
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,418 @@
1
+ 'use strict';
2
+
3
+ var react = require('react');
4
+ var react$1 = require('@wizzard-packages/react');
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+
7
+ // src/WizardDevTools.tsx
8
+ function WizardDevTools() {
9
+ const [isOpen, setIsOpen] = react.useState(false);
10
+ const [activeTab, setActiveTab] = react.useState("state");
11
+ const { data, allErrors, store, ...state } = react$1.useWizardContext();
12
+ const [logs, setLogs] = react.useState([]);
13
+ react.useEffect(() => {
14
+ if (!store) return;
15
+ const s = store;
16
+ return s.subscribeToActions((action) => {
17
+ setLogs(
18
+ (prev) => [
19
+ {
20
+ timestamp: Date.now(),
21
+ action,
22
+ state: store.getSnapshot()
23
+ },
24
+ ...prev
25
+ ].slice(0, 50)
26
+ );
27
+ });
28
+ }, [store]);
29
+ react.useEffect(() => {
30
+ if (typeof window !== "undefined") {
31
+ const search = new URLSearchParams(window.location.search);
32
+ const hash = window.location.hash;
33
+ const hashParams = hash.includes("?") ? hash.split("?")[1] : "";
34
+ const hashSearch = new URLSearchParams(hashParams);
35
+ if (search.get("devtools") === "true" || hashSearch.get("devtools") === "true") {
36
+ setIsOpen(true);
37
+ }
38
+ }
39
+ }, []);
40
+ if (!isOpen) {
41
+ return /* @__PURE__ */ jsxRuntime.jsx(
42
+ "button",
43
+ {
44
+ "data-testid": "wizard-devtools-toggle",
45
+ onClick: () => setIsOpen(true),
46
+ style: {
47
+ position: "fixed",
48
+ bottom: "20px",
49
+ right: "20px",
50
+ zIndex: 9999,
51
+ padding: "10px 15px",
52
+ borderRadius: "50px",
53
+ background: "rgba(37, 99, 235, 0.9)",
54
+ color: "white",
55
+ border: "none",
56
+ boxShadow: "0 4px 15px rgba(0,0,0,0.2)",
57
+ cursor: "pointer",
58
+ fontWeight: "bold",
59
+ fontSize: "12px",
60
+ backdropFilter: "blur(5px)"
61
+ },
62
+ children: "Wizard DevTools"
63
+ }
64
+ );
65
+ }
66
+ return /* @__PURE__ */ jsxRuntime.jsxs(
67
+ "div",
68
+ {
69
+ "data-testid": "wizard-devtools",
70
+ style: {
71
+ position: "fixed",
72
+ bottom: "20px",
73
+ right: "20px",
74
+ width: "400px",
75
+ height: "500px",
76
+ backgroundColor: "rgba(15, 23, 42, 0.9)",
77
+ backdropFilter: "blur(12px)",
78
+ borderRadius: "16px",
79
+ border: "1px solid rgba(255, 255, 255, 0.1)",
80
+ boxShadow: "0 10px 40px rgba(0,0,0,0.5)",
81
+ zIndex: 9999,
82
+ display: "flex",
83
+ flexDirection: "column",
84
+ color: "#e2e8f0",
85
+ fontFamily: "Inter, sans-serif",
86
+ overflow: "hidden"
87
+ },
88
+ children: [
89
+ /* @__PURE__ */ jsxRuntime.jsxs(
90
+ "div",
91
+ {
92
+ style: {
93
+ padding: "12px 16px",
94
+ borderBottom: "1px solid rgba(255, 255, 255, 0.1)",
95
+ display: "flex",
96
+ justifyContent: "space-between",
97
+ alignItems: "center",
98
+ background: "rgba(255, 255, 255, 0.03)"
99
+ },
100
+ children: [
101
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontWeight: 600, fontSize: "14px" }, children: "Wizard DevTools" }),
102
+ /* @__PURE__ */ jsxRuntime.jsx(
103
+ "button",
104
+ {
105
+ onClick: () => setIsOpen(false),
106
+ style: {
107
+ background: "none",
108
+ border: "none",
109
+ color: "#94a3b8",
110
+ cursor: "pointer",
111
+ fontSize: "18px"
112
+ },
113
+ children: "\xD7"
114
+ }
115
+ )
116
+ ]
117
+ }
118
+ ),
119
+ /* @__PURE__ */ jsxRuntime.jsx(
120
+ "div",
121
+ {
122
+ style: {
123
+ display: "flex",
124
+ borderBottom: "1px solid rgba(255, 255, 255, 0.1)",
125
+ background: "rgba(255, 255, 255, 0.02)"
126
+ },
127
+ children: ["state", "actions", "errors"].map((tab) => /* @__PURE__ */ jsxRuntime.jsx(
128
+ "button",
129
+ {
130
+ "data-testid": `devtools-tab-${tab}`,
131
+ onClick: () => setActiveTab(tab),
132
+ style: {
133
+ flex: 1,
134
+ padding: "10px",
135
+ background: activeTab === tab ? "rgba(37, 99, 235, 0.2)" : "none",
136
+ border: "none",
137
+ color: activeTab === tab ? "#60a5fa" : "#94a3b8",
138
+ borderBottom: activeTab === tab ? "2px solid #3b82f6" : "none",
139
+ cursor: "pointer",
140
+ fontSize: "12px",
141
+ textTransform: "capitalize",
142
+ fontWeight: activeTab === tab ? 600 : 400
143
+ },
144
+ children: tab
145
+ },
146
+ tab
147
+ ))
148
+ }
149
+ ),
150
+ /* @__PURE__ */ jsxRuntime.jsxs(
151
+ "div",
152
+ {
153
+ style: {
154
+ flex: 1,
155
+ overflowY: "auto",
156
+ padding: "16px",
157
+ fontSize: "12px"
158
+ },
159
+ children: [
160
+ activeTab === "state" && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
161
+ /* @__PURE__ */ jsxRuntime.jsxs(Section, { title: "Navigation", children: [
162
+ /* @__PURE__ */ jsxRuntime.jsx(KeyVal, { label: "Current Step", value: state.currentStepId }),
163
+ /* @__PURE__ */ jsxRuntime.jsx(KeyVal, { label: "Index", value: state.currentStepIndex }),
164
+ /* @__PURE__ */ jsxRuntime.jsx(KeyVal, { label: "Progress", value: `${state.progress}%` }),
165
+ /* @__PURE__ */ jsxRuntime.jsx(KeyVal, { label: "Total Steps", value: state.activeStepsCount }),
166
+ /* @__PURE__ */ jsxRuntime.jsx(KeyVal, { label: "Is Loading", value: String(state.isLoading) }),
167
+ /* @__PURE__ */ jsxRuntime.jsx(KeyVal, { label: "Is Busy", value: String(state.isBusy) })
168
+ ] }),
169
+ /* @__PURE__ */ jsxRuntime.jsx(Section, { title: "History", children: /* @__PURE__ */ jsxRuntime.jsx("div", { style: { color: "#94a3b8" }, children: state.history.join(" \u2192 ") || "Empty" }) }),
170
+ /* @__PURE__ */ jsxRuntime.jsx(Section, { title: "Data", children: /* @__PURE__ */ jsxRuntime.jsx(JsonView, { data }) }),
171
+ /* @__PURE__ */ jsxRuntime.jsx(Section, { title: "Meta", children: /* @__PURE__ */ jsxRuntime.jsx(
172
+ JsonView,
173
+ {
174
+ data: {
175
+ visited: Array.from(state.visitedSteps),
176
+ completed: Array.from(state.completedSteps),
177
+ busy: Array.from(state.busySteps)
178
+ }
179
+ }
180
+ ) })
181
+ ] }),
182
+ activeTab === "errors" && /* @__PURE__ */ jsxRuntime.jsx("div", { children: Object.keys(allErrors).length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(
183
+ "div",
184
+ {
185
+ style: {
186
+ color: "#94a3b8",
187
+ textAlign: "center",
188
+ marginTop: "20px"
189
+ },
190
+ children: "No active errors"
191
+ }
192
+ ) : /* @__PURE__ */ jsxRuntime.jsx(JsonView, { data: allErrors }) }),
193
+ activeTab === "actions" && /* @__PURE__ */ jsxRuntime.jsx(
194
+ "div",
195
+ {
196
+ "data-testid": "devtools-action-list",
197
+ style: { display: "flex", flexDirection: "column", gap: "8px" },
198
+ children: logs.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(
199
+ "div",
200
+ {
201
+ style: {
202
+ color: "#94a3b8",
203
+ textAlign: "center",
204
+ marginTop: "20px"
205
+ },
206
+ children: "No actions recorded yet"
207
+ }
208
+ ) : logs.map((log, i) => /* @__PURE__ */ jsxRuntime.jsx(
209
+ ActionLogItem,
210
+ {
211
+ log,
212
+ onJump: (s) => store.dispatch({
213
+ type: "RESTORE_SNAPSHOT",
214
+ payload: { snapshot: s }
215
+ })
216
+ },
217
+ log.timestamp + i
218
+ ))
219
+ }
220
+ )
221
+ ]
222
+ }
223
+ ),
224
+ /* @__PURE__ */ jsxRuntime.jsxs(
225
+ "div",
226
+ {
227
+ style: {
228
+ padding: "8px 16px",
229
+ fontSize: "10px",
230
+ color: "#64748b",
231
+ borderTop: "1px solid rgba(255, 255, 255, 0.1)",
232
+ background: "rgba(255, 255, 255, 0.02)",
233
+ display: "flex",
234
+ justifyContent: "space-between"
235
+ },
236
+ children: [
237
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: "v2.1.0" }),
238
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: "Strict Mode: Active" })
239
+ ]
240
+ }
241
+ )
242
+ ]
243
+ }
244
+ );
245
+ }
246
+ var ActionLogItem = ({ log, onJump }) => {
247
+ const [isExpanded, setIsExpanded] = react.useState(false);
248
+ const time = new Date(log.timestamp).toLocaleTimeString();
249
+ return /* @__PURE__ */ jsxRuntime.jsxs(
250
+ "div",
251
+ {
252
+ "data-testid": "action-item",
253
+ style: {
254
+ background: "rgba(255, 255, 255, 0.05)",
255
+ borderRadius: "8px",
256
+ overflow: "hidden",
257
+ border: "1px solid rgba(255, 255, 255, 0.05)"
258
+ },
259
+ children: [
260
+ /* @__PURE__ */ jsxRuntime.jsxs(
261
+ "div",
262
+ {
263
+ "data-testid": "action-item-header",
264
+ onClick: () => onJump(log.state),
265
+ style: {
266
+ padding: "8px 12px",
267
+ display: "flex",
268
+ justifyContent: "space-between",
269
+ cursor: "pointer",
270
+ alignItems: "center"
271
+ },
272
+ children: [
273
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", gap: "8px", alignItems: "center" }, children: [
274
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: "#64748b", fontSize: "10px" }, children: time }),
275
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "data-testid": "action-type", style: { color: "#60a5fa", fontWeight: 600 }, children: log.action.type }),
276
+ /* @__PURE__ */ jsxRuntime.jsx(
277
+ "button",
278
+ {
279
+ "data-testid": "jump-button",
280
+ onClick: (e) => {
281
+ e.stopPropagation();
282
+ onJump(log.state);
283
+ },
284
+ style: {
285
+ padding: "2px 6px",
286
+ fontSize: "9px",
287
+ background: "#1e293b",
288
+ border: "1px solid #334155",
289
+ color: "#60a5fa",
290
+ borderRadius: "4px",
291
+ cursor: "pointer"
292
+ },
293
+ children: "Jump"
294
+ }
295
+ )
296
+ ] }),
297
+ /* @__PURE__ */ jsxRuntime.jsx(
298
+ "span",
299
+ {
300
+ style: {
301
+ color: "#475569",
302
+ transform: isExpanded ? "rotate(180deg)" : "none",
303
+ transition: "transform 0.2s",
304
+ padding: "4px"
305
+ },
306
+ onClick: (e) => {
307
+ e.stopPropagation();
308
+ setIsExpanded(!isExpanded);
309
+ },
310
+ children: "\u25BE"
311
+ }
312
+ )
313
+ ]
314
+ }
315
+ ),
316
+ isExpanded && /* @__PURE__ */ jsxRuntime.jsxs(
317
+ "div",
318
+ {
319
+ style: {
320
+ padding: "0 12px 12px 12px",
321
+ borderTop: "1px solid rgba(255, 255, 255, 0.05)"
322
+ },
323
+ children: [
324
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { marginTop: "8px" }, children: [
325
+ /* @__PURE__ */ jsxRuntime.jsx(
326
+ "div",
327
+ {
328
+ style: {
329
+ color: "#94a3b8",
330
+ marginBottom: "4px",
331
+ fontSize: "10px"
332
+ },
333
+ children: "Payload:"
334
+ }
335
+ ),
336
+ /* @__PURE__ */ jsxRuntime.jsx(JsonView, { data: log.action.payload })
337
+ ] }),
338
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { marginTop: "8px" }, children: [
339
+ /* @__PURE__ */ jsxRuntime.jsx(
340
+ "div",
341
+ {
342
+ style: {
343
+ color: "#94a3b8",
344
+ marginBottom: "4px",
345
+ fontSize: "10px"
346
+ },
347
+ children: "State after:"
348
+ }
349
+ ),
350
+ /* @__PURE__ */ jsxRuntime.jsx(JsonView, { data: log.state })
351
+ ] })
352
+ ]
353
+ }
354
+ )
355
+ ]
356
+ }
357
+ );
358
+ };
359
+ var Section = ({ title, children }) => /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { marginBottom: "20px" }, children: [
360
+ /* @__PURE__ */ jsxRuntime.jsx(
361
+ "h4",
362
+ {
363
+ style: {
364
+ margin: "0 0 8px 0",
365
+ color: "#3b82f6",
366
+ fontSize: "11px",
367
+ textTransform: "uppercase",
368
+ letterSpacing: "0.05em"
369
+ },
370
+ children: title
371
+ }
372
+ ),
373
+ children
374
+ ] });
375
+ var KeyVal = ({ label, value }) => /* @__PURE__ */ jsxRuntime.jsxs(
376
+ "div",
377
+ {
378
+ style: {
379
+ display: "flex",
380
+ justifyContent: "space-between",
381
+ marginBottom: "4px"
382
+ },
383
+ children: [
384
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { color: "#94a3b8" }, children: [
385
+ label,
386
+ ":"
387
+ ] }),
388
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: "#f8fafc", fontWeight: 500 }, children: value })
389
+ ]
390
+ }
391
+ );
392
+ var JsonView = ({ data }) => {
393
+ const replacer = (_key, value) => {
394
+ if (value instanceof Set) {
395
+ return Array.from(value);
396
+ }
397
+ return value;
398
+ };
399
+ return /* @__PURE__ */ jsxRuntime.jsx(
400
+ "pre",
401
+ {
402
+ style: {
403
+ background: "rgba(0, 0, 0, 0.3)",
404
+ padding: "10px",
405
+ borderRadius: "8px",
406
+ overflowX: "auto",
407
+ color: "#60a5fa",
408
+ border: "1px solid rgba(255, 255, 255, 0.05)",
409
+ margin: 0
410
+ },
411
+ children: JSON.stringify(data, replacer, 2)
412
+ }
413
+ );
414
+ };
415
+
416
+ exports.WizardDevTools = WizardDevTools;
417
+ //# sourceMappingURL=index.cjs.map
418
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/WizardDevTools.tsx"],"names":["useState","useWizardContext","useEffect","jsx","jsxs"],"mappings":";;;;;;;AAUO,SAAS,cAAA,GAAiB;AAC/B,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAyC,OAAO,CAAA;AAClF,EAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAW,OAAO,GAAG,KAAA,KAAUC,wBAAA,EAAiB;AAC9D,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAID,cAAA,CAAuB,EAAE,CAAA;AAEjD,EAAAE,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,MAAM,CAAA,GAAI,KAAA;AACV,IAAA,OAAO,CAAA,CAAE,kBAAA,CAAmB,CAAC,MAAA,KAAmC;AAC9D,MAAA,OAAA;AAAA,QAAQ,CAAC,IAAA,KACP;AAAA,UACE;AAAA,YACE,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,YACpB,MAAA;AAAA,YACA,KAAA,EAAO,MAAM,WAAA;AAAY,WAC3B;AAAA,UACA,GAAG;AAAA,SACL,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE;AAAA,OACf;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB,MAAA,CAAO,SAAS,MAAM,CAAA;AACzD,MAAA,MAAM,IAAA,GAAO,OAAO,QAAA,CAAS,IAAA;AAC7B,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,GAAI,KAAK,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,GAAI,EAAA;AAC7D,MAAA,MAAM,UAAA,GAAa,IAAI,eAAA,CAAgB,UAAU,CAAA;AAEjD,MAAA,IAAI,MAAA,CAAO,IAAI,UAAU,CAAA,KAAM,UAAU,UAAA,CAAW,GAAA,CAAI,UAAU,CAAA,KAAM,MAAA,EAAQ;AAC9E,QAAA,SAAA,CAAU,IAAI,CAAA;AAAA,MAChB;AAAA,IACF;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,uBACEC,cAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,aAAA,EAAY,wBAAA;AAAA,QACZ,OAAA,EAAS,MAAM,SAAA,CAAU,IAAI,CAAA;AAAA,QAC7B,KAAA,EAAO;AAAA,UACL,QAAA,EAAU,OAAA;AAAA,UACV,MAAA,EAAQ,MAAA;AAAA,UACR,KAAA,EAAO,MAAA;AAAA,UACP,MAAA,EAAQ,IAAA;AAAA,UACR,OAAA,EAAS,WAAA;AAAA,UACT,YAAA,EAAc,MAAA;AAAA,UACd,UAAA,EAAY,wBAAA;AAAA,UACZ,KAAA,EAAO,OAAA;AAAA,UACP,MAAA,EAAQ,MAAA;AAAA,UACR,SAAA,EAAW,4BAAA;AAAA,UACX,MAAA,EAAQ,SAAA;AAAA,UACR,UAAA,EAAY,MAAA;AAAA,UACZ,QAAA,EAAU,MAAA;AAAA,UACV,cAAA,EAAgB;AAAA,SAClB;AAAA,QACD,QAAA,EAAA;AAAA;AAAA,KAED;AAAA,EAEJ;AAEA,EAAA,uBACEC,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAY,iBAAA;AAAA,MACZ,KAAA,EAAO;AAAA,QACL,QAAA,EAAU,OAAA;AAAA,QACV,MAAA,EAAQ,MAAA;AAAA,QACR,KAAA,EAAO,MAAA;AAAA,QACP,KAAA,EAAO,OAAA;AAAA,QACP,MAAA,EAAQ,OAAA;AAAA,QACR,eAAA,EAAiB,uBAAA;AAAA,QACjB,cAAA,EAAgB,YAAA;AAAA,QAChB,YAAA,EAAc,MAAA;AAAA,QACd,MAAA,EAAQ,oCAAA;AAAA,QACR,SAAA,EAAW,6BAAA;AAAA,QACX,MAAA,EAAQ,IAAA;AAAA,QACR,OAAA,EAAS,MAAA;AAAA,QACT,aAAA,EAAe,QAAA;AAAA,QACf,KAAA,EAAO,SAAA;AAAA,QACP,UAAA,EAAY,mBAAA;AAAA,QACZ,QAAA,EAAU;AAAA,OACZ;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAA,eAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO;AAAA,cACL,OAAA,EAAS,WAAA;AAAA,cACT,YAAA,EAAc,oCAAA;AAAA,cACd,OAAA,EAAS,MAAA;AAAA,cACT,cAAA,EAAgB,eAAA;AAAA,cAChB,UAAA,EAAY,QAAA;AAAA,cACZ,UAAA,EAAY;AAAA,aACd;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAAD,cAAA,CAAC,MAAA,EAAA,EAAK,OAAO,EAAE,UAAA,EAAY,KAAK,QAAA,EAAU,MAAA,IAAU,QAAA,EAAA,iBAAA,EAAe,CAAA;AAAA,8BACnEA,cAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,OAAA,EAAS,MAAM,SAAA,CAAU,KAAK,CAAA;AAAA,kBAC9B,KAAA,EAAO;AAAA,oBACL,UAAA,EAAY,MAAA;AAAA,oBACZ,MAAA,EAAQ,MAAA;AAAA,oBACR,KAAA,EAAO,SAAA;AAAA,oBACP,MAAA,EAAQ,SAAA;AAAA,oBACR,QAAA,EAAU;AAAA,mBACZ;AAAA,kBACD,QAAA,EAAA;AAAA;AAAA;AAED;AAAA;AAAA,SACF;AAAA,wBAEAA,cAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO;AAAA,cACL,OAAA,EAAS,MAAA;AAAA,cACT,YAAA,EAAc,oCAAA;AAAA,cACd,UAAA,EAAY;AAAA,aACd;AAAA,YAEC,WAAC,OAAA,EAAS,SAAA,EAAW,QAAQ,CAAA,CAAE,GAAA,CAAI,CAAC,GAAA,qBACnCA,cAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBAEC,aAAA,EAAa,gBAAgB,GAAG,CAAA,CAAA;AAAA,gBAChC,OAAA,EAAS,MAAM,YAAA,CAAa,GAAU,CAAA;AAAA,gBACtC,KAAA,EAAO;AAAA,kBACL,IAAA,EAAM,CAAA;AAAA,kBACN,OAAA,EAAS,MAAA;AAAA,kBACT,UAAA,EAAY,SAAA,KAAc,GAAA,GAAM,wBAAA,GAA2B,MAAA;AAAA,kBAC3D,MAAA,EAAQ,MAAA;AAAA,kBACR,KAAA,EAAO,SAAA,KAAc,GAAA,GAAM,SAAA,GAAY,SAAA;AAAA,kBACvC,YAAA,EAAc,SAAA,KAAc,GAAA,GAAM,mBAAA,GAAsB,MAAA;AAAA,kBACxD,MAAA,EAAQ,SAAA;AAAA,kBACR,QAAA,EAAU,MAAA;AAAA,kBACV,aAAA,EAAe,YAAA;AAAA,kBACf,UAAA,EAAY,SAAA,KAAc,GAAA,GAAM,GAAA,GAAM;AAAA,iBACxC;AAAA,gBAEC,QAAA,EAAA;AAAA,eAAA;AAAA,cAhBI;AAAA,aAkBR;AAAA;AAAA,SACH;AAAA,wBAEAC,eAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO;AAAA,cACL,IAAA,EAAM,CAAA;AAAA,cACN,SAAA,EAAW,MAAA;AAAA,cACX,OAAA,EAAS,MAAA;AAAA,cACT,QAAA,EAAU;AAAA,aACZ;AAAA,YAEC,QAAA,EAAA;AAAA,cAAA,SAAA,KAAc,OAAA,oCACZ,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,gCAAAA,eAAA,CAAC,OAAA,EAAA,EAAQ,OAAM,YAAA,EACb,QAAA,EAAA;AAAA,kCAAAD,cAAA,CAAC,MAAA,EAAA,EAAO,KAAA,EAAM,cAAA,EAAe,KAAA,EAAO,MAAM,aAAA,EAAe,CAAA;AAAA,iDACxD,MAAA,EAAA,EAAO,KAAA,EAAM,OAAA,EAAQ,KAAA,EAAO,MAAM,gBAAA,EAAkB,CAAA;AAAA,kCACrDA,cAAA,CAAC,UAAO,KAAA,EAAM,UAAA,EAAW,OAAO,CAAA,EAAG,KAAA,CAAM,QAAQ,CAAA,CAAA,CAAA,EAAK,CAAA;AAAA,iDACrD,MAAA,EAAA,EAAO,KAAA,EAAM,aAAA,EAAc,KAAA,EAAO,MAAM,gBAAA,EAAkB,CAAA;AAAA,kCAC3DA,cAAA,CAAC,UAAO,KAAA,EAAM,YAAA,EAAa,OAAO,MAAA,CAAO,KAAA,CAAM,SAAS,CAAA,EAAG,CAAA;AAAA,kCAC3DA,cAAA,CAAC,UAAO,KAAA,EAAM,SAAA,EAAU,OAAO,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,EAAG;AAAA,iBAAA,EACvD,CAAA;AAAA,+CAEC,OAAA,EAAA,EAAQ,KAAA,EAAM,SAAA,EACb,QAAA,kBAAAA,cAAA,CAAC,SAAI,KAAA,EAAO,EAAE,KAAA,EAAO,SAAA,IAAc,QAAA,EAAA,KAAA,CAAM,OAAA,CAAQ,KAAK,UAAK,CAAA,IAAK,SAAQ,CAAA,EAC1E,CAAA;AAAA,+CAEC,OAAA,EAAA,EAAQ,KAAA,EAAM,QACb,QAAA,kBAAAA,cAAA,CAAC,QAAA,EAAA,EAAS,MAAY,CAAA,EACxB,CAAA;AAAA,gCAEAA,cAAA,CAAC,OAAA,EAAA,EAAQ,KAAA,EAAM,MAAA,EACb,QAAA,kBAAAA,cAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAM;AAAA,sBACJ,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,YAAY,CAAA;AAAA,sBACtC,SAAA,EAAW,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,cAAc,CAAA;AAAA,sBAC1C,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,SAAS;AAAA;AAClC;AAAA,iBACF,EACF;AAAA,eAAA,EACF,CAAA;AAAA,cAGD,SAAA,KAAc,4BACbA,cAAA,CAAC,KAAA,EAAA,EACE,iBAAO,IAAA,CAAK,SAAS,CAAA,CAAE,MAAA,KAAW,CAAA,mBACjCA,cAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBACC,KAAA,EAAO;AAAA,oBACL,KAAA,EAAO,SAAA;AAAA,oBACP,SAAA,EAAW,QAAA;AAAA,oBACX,SAAA,EAAW;AAAA,mBACb;AAAA,kBACD,QAAA,EAAA;AAAA;AAAA,eAED,mBAEAA,cAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAM,WAAW,CAAA,EAE/B,CAAA;AAAA,cAGD,cAAc,SAAA,oBACbA,cAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBACC,aAAA,EAAY,sBAAA;AAAA,kBACZ,OAAO,EAAE,OAAA,EAAS,QAAQ,aAAA,EAAe,QAAA,EAAU,KAAK,KAAA,EAAM;AAAA,kBAE7D,QAAA,EAAA,IAAA,CAAK,WAAW,CAAA,mBACfA,cAAA;AAAA,oBAAC,KAAA;AAAA,oBAAA;AAAA,sBACC,KAAA,EAAO;AAAA,wBACL,KAAA,EAAO,SAAA;AAAA,wBACP,SAAA,EAAW,QAAA;AAAA,wBACX,SAAA,EAAW;AAAA,uBACb;AAAA,sBACD,QAAA,EAAA;AAAA;AAAA,mBAED,GAEA,IAAA,CAAK,GAAA,CAAI,CAAC,KAAK,CAAA,qBACbA,cAAA;AAAA,oBAAC,aAAA;AAAA,oBAAA;AAAA,sBAEC,GAAA;AAAA,sBACA,MAAA,EAAQ,CAAC,CAAA,KACP,KAAA,CAAM,QAAA,CAAS;AAAA,wBACb,IAAA,EAAM,kBAAA;AAAA,wBACN,OAAA,EAAS,EAAE,QAAA,EAAU,CAAA;AAAE,uBACxB;AAAA,qBAAA;AAAA,oBANE,IAAI,SAAA,GAAY;AAAA,mBASxB;AAAA;AAAA;AAEL;AAAA;AAAA,SAEJ;AAAA,wBAEAC,eAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO;AAAA,cACL,OAAA,EAAS,UAAA;AAAA,cACT,QAAA,EAAU,MAAA;AAAA,cACV,KAAA,EAAO,SAAA;AAAA,cACP,SAAA,EAAW,oCAAA;AAAA,cACX,UAAA,EAAY,2BAAA;AAAA,cACZ,OAAA,EAAS,MAAA;AAAA,cACT,cAAA,EAAgB;AAAA,aAClB;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAAD,cAAA,CAAC,UAAK,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,8BACZA,cAAA,CAAC,UAAK,QAAA,EAAA,qBAAA,EAAmB;AAAA;AAAA;AAAA;AAC3B;AAAA;AAAA,GACF;AAEJ;AAEA,IAAM,aAAA,GAGD,CAAC,EAAE,GAAA,EAAK,QAAO,KAAM;AACxB,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIH,eAAS,KAAK,CAAA;AAClD,EAAA,MAAM,OAAO,IAAI,IAAA,CAAK,GAAA,CAAI,SAAS,EAAE,kBAAA,EAAmB;AAExD,EAAA,uBACEI,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAY,aAAA;AAAA,MACZ,KAAA,EAAO;AAAA,QACL,UAAA,EAAY,2BAAA;AAAA,QACZ,YAAA,EAAc,KAAA;AAAA,QACd,QAAA,EAAU,QAAA;AAAA,QACV,MAAA,EAAQ;AAAA,OACV;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAA,eAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAY,oBAAA;AAAA,YACZ,OAAA,EAAS,MAAM,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AAAA,YAC/B,KAAA,EAAO;AAAA,cACL,OAAA,EAAS,UAAA;AAAA,cACT,OAAA,EAAS,MAAA;AAAA,cACT,cAAA,EAAgB,eAAA;AAAA,cAChB,MAAA,EAAQ,SAAA;AAAA,cACR,UAAA,EAAY;AAAA,aACd;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,OAAO,EAAE,OAAA,EAAS,QAAQ,GAAA,EAAK,KAAA,EAAO,UAAA,EAAY,QAAA,EAAS,EAC9D,QAAA,EAAA;AAAA,gCAAAD,cAAA,CAAC,MAAA,EAAA,EAAK,OAAO,EAAE,KAAA,EAAO,WAAW,QAAA,EAAU,MAAA,IAAW,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,gCAC3DA,cAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAY,aAAA,EAAc,KAAA,EAAO,EAAE,KAAA,EAAO,SAAA,EAAW,UAAA,EAAY,GAAA,EAAI,EACxE,QAAA,EAAA,GAAA,CAAI,OAAO,IAAA,EACd,CAAA;AAAA,gCACAA,cAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACC,aAAA,EAAY,aAAA;AAAA,oBACZ,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,sBAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,sBAAA,MAAA,CAAO,IAAI,KAAK,CAAA;AAAA,oBAClB,CAAA;AAAA,oBACA,KAAA,EAAO;AAAA,sBACL,OAAA,EAAS,SAAA;AAAA,sBACT,QAAA,EAAU,KAAA;AAAA,sBACV,UAAA,EAAY,SAAA;AAAA,sBACZ,MAAA,EAAQ,mBAAA;AAAA,sBACR,KAAA,EAAO,SAAA;AAAA,sBACP,YAAA,EAAc,KAAA;AAAA,sBACd,MAAA,EAAQ;AAAA,qBACV;AAAA,oBACD,QAAA,EAAA;AAAA;AAAA;AAED,eAAA,EACF,CAAA;AAAA,8BACAA,cAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,KAAA,EAAO;AAAA,oBACL,KAAA,EAAO,SAAA;AAAA,oBACP,SAAA,EAAW,aAAa,gBAAA,GAAmB,MAAA;AAAA,oBAC3C,UAAA,EAAY,gBAAA;AAAA,oBACZ,OAAA,EAAS;AAAA,mBACX;AAAA,kBACA,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,oBAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,oBAAA,aAAA,CAAc,CAAC,UAAU,CAAA;AAAA,kBAC3B,CAAA;AAAA,kBACD,QAAA,EAAA;AAAA;AAAA;AAED;AAAA;AAAA,SACF;AAAA,QACC,UAAA,oBACCC,eAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO;AAAA,cACL,OAAA,EAAS,kBAAA;AAAA,cACT,SAAA,EAAW;AAAA,aACb;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,SAAA,EAAW,OAAM,EAC7B,QAAA,EAAA;AAAA,gCAAAD,cAAA;AAAA,kBAAC,KAAA;AAAA,kBAAA;AAAA,oBACC,KAAA,EAAO;AAAA,sBACL,KAAA,EAAO,SAAA;AAAA,sBACP,YAAA,EAAc,KAAA;AAAA,sBACd,QAAA,EAAU;AAAA,qBACZ;AAAA,oBACD,QAAA,EAAA;AAAA;AAAA,iBAED;AAAA,gCACAA,cAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAM,GAAA,CAAI,OAAO,OAAA,EAAS;AAAA,eAAA,EACtC,CAAA;AAAA,8CACC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,SAAA,EAAW,OAAM,EAC7B,QAAA,EAAA;AAAA,gCAAAA,cAAA;AAAA,kBAAC,KAAA;AAAA,kBAAA;AAAA,oBACC,KAAA,EAAO;AAAA,sBACL,KAAA,EAAO,SAAA;AAAA,sBACP,YAAA,EAAc,KAAA;AAAA,sBACd,QAAA,EAAU;AAAA,qBACZ;AAAA,oBACD,QAAA,EAAA;AAAA;AAAA,iBAED;AAAA,gCACAA,cAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAM,GAAA,CAAI,KAAA,EAAO;AAAA,eAAA,EAC7B;AAAA;AAAA;AAAA;AACF;AAAA;AAAA,GAEJ;AAEJ,CAAA;AAEA,IAAM,OAAA,GAAkE,CAAC,EAAE,KAAA,EAAO,QAAA,EAAS,qBACzFC,eAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,YAAA,EAAc,MAAA,EAAO,EACjC,QAAA,EAAA;AAAA,kBAAAD,cAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,WAAA;AAAA,QACR,KAAA,EAAO,SAAA;AAAA,QACP,QAAA,EAAU,MAAA;AAAA,QACV,aAAA,EAAe,WAAA;AAAA,QACf,aAAA,EAAe;AAAA,OACjB;AAAA,MAEC,QAAA,EAAA;AAAA;AAAA,GACH;AAAA,EACC;AAAA,CAAA,EACH,CAAA;AAGF,IAAM,MAAA,GAAkD,CAAC,EAAE,KAAA,EAAO,OAAM,qBACtEC,eAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,KAAA,EAAO;AAAA,MACL,OAAA,EAAS,MAAA;AAAA,MACT,cAAA,EAAgB,eAAA;AAAA,MAChB,YAAA,EAAc;AAAA,KAChB;AAAA,IAEA,QAAA,EAAA;AAAA,sBAAAA,eAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,WAAU,EAAI,QAAA,EAAA;AAAA,QAAA,KAAA;AAAA,QAAM;AAAA,OAAA,EAAC,CAAA;AAAA,sBAC3CD,cAAA,CAAC,UAAK,KAAA,EAAO,EAAE,OAAO,SAAA,EAAW,UAAA,EAAY,GAAA,EAAI,EAAI,QAAA,EAAA,KAAA,EAAM;AAAA;AAAA;AAC7D,CAAA;AAGF,IAAM,QAAA,GAAoC,CAAC,EAAE,IAAA,EAAK,KAAM;AACtD,EAAA,MAAM,QAAA,GAAW,CAAC,IAAA,EAAc,KAAA,KAAe;AAC7C,IAAA,IAAI,iBAAiB,GAAA,EAAK;AACxB,MAAA,OAAO,KAAA,CAAM,KAAK,KAAK,CAAA;AAAA,IACzB;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AAEA,EAAA,uBACEA,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO;AAAA,QACL,UAAA,EAAY,oBAAA;AAAA,QACZ,OAAA,EAAS,MAAA;AAAA,QACT,YAAA,EAAc,KAAA;AAAA,QACd,SAAA,EAAW,MAAA;AAAA,QACX,KAAA,EAAO,SAAA;AAAA,QACP,MAAA,EAAQ,qCAAA;AAAA,QACR,MAAA,EAAQ;AAAA,OACV;AAAA,MAEC,QAAA,EAAA,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,QAAA,EAAU,CAAC;AAAA;AAAA,GACnC;AAEJ,CAAA","file":"index.cjs","sourcesContent":["import React, { useState, useEffect } from 'react';\nimport { useWizardContext } from '@wizzard-packages/react';\nimport type { WizardAction, IWizardStore } from '@wizzard-packages/core';\n\ninterface IActionLog {\n timestamp: number;\n action: WizardAction<any, any>;\n state: any;\n}\n\nexport function WizardDevTools() {\n const [isOpen, setIsOpen] = useState(false);\n const [activeTab, setActiveTab] = useState<'state' | 'actions' | 'errors'>('state');\n const { data, allErrors, store, ...state } = useWizardContext();\n const [logs, setLogs] = useState<IActionLog[]>([]);\n\n useEffect(() => {\n if (!store) return;\n const s = store as IWizardStore<any, any>;\n return s.subscribeToActions((action: WizardAction<any, any>) => {\n setLogs((prev) =>\n [\n {\n timestamp: Date.now(),\n action,\n state: store.getSnapshot(),\n },\n ...prev,\n ].slice(0, 50)\n );\n });\n }, [store]);\n\n useEffect(() => {\n if (typeof window !== 'undefined') {\n const search = new URLSearchParams(window.location.search);\n const hash = window.location.hash;\n const hashParams = hash.includes('?') ? hash.split('?')[1] : '';\n const hashSearch = new URLSearchParams(hashParams);\n\n if (search.get('devtools') === 'true' || hashSearch.get('devtools') === 'true') {\n setIsOpen(true);\n }\n }\n }, []);\n\n if (!isOpen) {\n return (\n <button\n data-testid=\"wizard-devtools-toggle\"\n onClick={() => setIsOpen(true)}\n style={{\n position: 'fixed',\n bottom: '20px',\n right: '20px',\n zIndex: 9999,\n padding: '10px 15px',\n borderRadius: '50px',\n background: 'rgba(37, 99, 235, 0.9)',\n color: 'white',\n border: 'none',\n boxShadow: '0 4px 15px rgba(0,0,0,0.2)',\n cursor: 'pointer',\n fontWeight: 'bold',\n fontSize: '12px',\n backdropFilter: 'blur(5px)',\n }}\n >\n Wizard DevTools\n </button>\n );\n }\n\n return (\n <div\n data-testid=\"wizard-devtools\"\n style={{\n position: 'fixed',\n bottom: '20px',\n right: '20px',\n width: '400px',\n height: '500px',\n backgroundColor: 'rgba(15, 23, 42, 0.9)',\n backdropFilter: 'blur(12px)',\n borderRadius: '16px',\n border: '1px solid rgba(255, 255, 255, 0.1)',\n boxShadow: '0 10px 40px rgba(0,0,0,0.5)',\n zIndex: 9999,\n display: 'flex',\n flexDirection: 'column',\n color: '#e2e8f0',\n fontFamily: 'Inter, sans-serif',\n overflow: 'hidden',\n }}\n >\n <div\n style={{\n padding: '12px 16px',\n borderBottom: '1px solid rgba(255, 255, 255, 0.1)',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n background: 'rgba(255, 255, 255, 0.03)',\n }}\n >\n <span style={{ fontWeight: 600, fontSize: '14px' }}>Wizard DevTools</span>\n <button\n onClick={() => setIsOpen(false)}\n style={{\n background: 'none',\n border: 'none',\n color: '#94a3b8',\n cursor: 'pointer',\n fontSize: '18px',\n }}\n >\n &times;\n </button>\n </div>\n\n <div\n style={{\n display: 'flex',\n borderBottom: '1px solid rgba(255, 255, 255, 0.1)',\n background: 'rgba(255, 255, 255, 0.02)',\n }}\n >\n {['state', 'actions', 'errors'].map((tab) => (\n <button\n key={tab}\n data-testid={`devtools-tab-${tab}`}\n onClick={() => setActiveTab(tab as any)}\n style={{\n flex: 1,\n padding: '10px',\n background: activeTab === tab ? 'rgba(37, 99, 235, 0.2)' : 'none',\n border: 'none',\n color: activeTab === tab ? '#60a5fa' : '#94a3b8',\n borderBottom: activeTab === tab ? '2px solid #3b82f6' : 'none',\n cursor: 'pointer',\n fontSize: '12px',\n textTransform: 'capitalize',\n fontWeight: activeTab === tab ? 600 : 400,\n }}\n >\n {tab}\n </button>\n ))}\n </div>\n\n <div\n style={{\n flex: 1,\n overflowY: 'auto',\n padding: '16px',\n fontSize: '12px',\n }}\n >\n {activeTab === 'state' && (\n <div>\n <Section title=\"Navigation\">\n <KeyVal label=\"Current Step\" value={state.currentStepId} />\n <KeyVal label=\"Index\" value={state.currentStepIndex} />\n <KeyVal label=\"Progress\" value={`${state.progress}%`} />\n <KeyVal label=\"Total Steps\" value={state.activeStepsCount} />\n <KeyVal label=\"Is Loading\" value={String(state.isLoading)} />\n <KeyVal label=\"Is Busy\" value={String(state.isBusy)} />\n </Section>\n\n <Section title=\"History\">\n <div style={{ color: '#94a3b8' }}>{state.history.join(' → ') || 'Empty'}</div>\n </Section>\n\n <Section title=\"Data\">\n <JsonView data={data} />\n </Section>\n\n <Section title=\"Meta\">\n <JsonView\n data={{\n visited: Array.from(state.visitedSteps),\n completed: Array.from(state.completedSteps),\n busy: Array.from(state.busySteps),\n }}\n />\n </Section>\n </div>\n )}\n\n {activeTab === 'errors' && (\n <div>\n {Object.keys(allErrors).length === 0 ? (\n <div\n style={{\n color: '#94a3b8',\n textAlign: 'center',\n marginTop: '20px',\n }}\n >\n No active errors\n </div>\n ) : (\n <JsonView data={allErrors} />\n )}\n </div>\n )}\n\n {activeTab === 'actions' && (\n <div\n data-testid=\"devtools-action-list\"\n style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}\n >\n {logs.length === 0 ? (\n <div\n style={{\n color: '#94a3b8',\n textAlign: 'center',\n marginTop: '20px',\n }}\n >\n No actions recorded yet\n </div>\n ) : (\n logs.map((log, i) => (\n <ActionLogItem\n key={log.timestamp + i}\n log={log}\n onJump={(s) =>\n store.dispatch({\n type: 'RESTORE_SNAPSHOT',\n payload: { snapshot: s },\n })\n }\n />\n ))\n )}\n </div>\n )}\n </div>\n\n <div\n style={{\n padding: '8px 16px',\n fontSize: '10px',\n color: '#64748b',\n borderTop: '1px solid rgba(255, 255, 255, 0.1)',\n background: 'rgba(255, 255, 255, 0.02)',\n display: 'flex',\n justifyContent: 'space-between',\n }}\n >\n <span>v2.1.0</span>\n <span>Strict Mode: Active</span>\n </div>\n </div>\n );\n}\n\nconst ActionLogItem: React.FC<{\n log: IActionLog;\n onJump: (state: any) => void;\n}> = ({ log, onJump }) => {\n const [isExpanded, setIsExpanded] = useState(false);\n const time = new Date(log.timestamp).toLocaleTimeString();\n\n return (\n <div\n data-testid=\"action-item\"\n style={{\n background: 'rgba(255, 255, 255, 0.05)',\n borderRadius: '8px',\n overflow: 'hidden',\n border: '1px solid rgba(255, 255, 255, 0.05)',\n }}\n >\n <div\n data-testid=\"action-item-header\"\n onClick={() => onJump(log.state)}\n style={{\n padding: '8px 12px',\n display: 'flex',\n justifyContent: 'space-between',\n cursor: 'pointer',\n alignItems: 'center',\n }}\n >\n <div style={{ display: 'flex', gap: '8px', alignItems: 'center' }}>\n <span style={{ color: '#64748b', fontSize: '10px' }}>{time}</span>\n <span data-testid=\"action-type\" style={{ color: '#60a5fa', fontWeight: 600 }}>\n {log.action.type}\n </span>\n <button\n data-testid=\"jump-button\"\n onClick={(e) => {\n e.stopPropagation();\n onJump(log.state);\n }}\n style={{\n padding: '2px 6px',\n fontSize: '9px',\n background: '#1e293b',\n border: '1px solid #334155',\n color: '#60a5fa',\n borderRadius: '4px',\n cursor: 'pointer',\n }}\n >\n Jump\n </button>\n </div>\n <span\n style={{\n color: '#475569',\n transform: isExpanded ? 'rotate(180deg)' : 'none',\n transition: 'transform 0.2s',\n padding: '4px',\n }}\n onClick={(e) => {\n e.stopPropagation();\n setIsExpanded(!isExpanded);\n }}\n >\n ▾\n </span>\n </div>\n {isExpanded && (\n <div\n style={{\n padding: '0 12px 12px 12px',\n borderTop: '1px solid rgba(255, 255, 255, 0.05)',\n }}\n >\n <div style={{ marginTop: '8px' }}>\n <div\n style={{\n color: '#94a3b8',\n marginBottom: '4px',\n fontSize: '10px',\n }}\n >\n Payload:\n </div>\n <JsonView data={log.action.payload} />\n </div>\n <div style={{ marginTop: '8px' }}>\n <div\n style={{\n color: '#94a3b8',\n marginBottom: '4px',\n fontSize: '10px',\n }}\n >\n State after:\n </div>\n <JsonView data={log.state} />\n </div>\n </div>\n )}\n </div>\n );\n};\n\nconst Section: React.FC<{ title: string; children: React.ReactNode }> = ({ title, children }) => (\n <div style={{ marginBottom: '20px' }}>\n <h4\n style={{\n margin: '0 0 8px 0',\n color: '#3b82f6',\n fontSize: '11px',\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n }}\n >\n {title}\n </h4>\n {children}\n </div>\n);\n\nconst KeyVal: React.FC<{ label: string; value: any }> = ({ label, value }) => (\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n marginBottom: '4px',\n }}\n >\n <span style={{ color: '#94a3b8' }}>{label}:</span>\n <span style={{ color: '#f8fafc', fontWeight: 500 }}>{value}</span>\n </div>\n);\n\nconst JsonView: React.FC<{ data: any }> = ({ data }) => {\n const replacer = (_key: string, value: any) => {\n if (value instanceof Set) {\n return Array.from(value);\n }\n return value;\n };\n\n return (\n <pre\n style={{\n background: 'rgba(0, 0, 0, 0.3)',\n padding: '10px',\n borderRadius: '8px',\n overflowX: 'auto',\n color: '#60a5fa',\n border: '1px solid rgba(255, 255, 255, 0.05)',\n margin: 0,\n }}\n >\n {JSON.stringify(data, replacer, 2)}\n </pre>\n );\n};\n"]}
@@ -0,0 +1,5 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ declare function WizardDevTools(): react_jsx_runtime.JSX.Element;
4
+
5
+ export { WizardDevTools };
@@ -0,0 +1,5 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ declare function WizardDevTools(): react_jsx_runtime.JSX.Element;
4
+
5
+ export { WizardDevTools };
package/dist/index.js ADDED
@@ -0,0 +1,416 @@
1
+ import { useState, useEffect } from 'react';
2
+ import { useWizardContext } from '@wizzard-packages/react';
3
+ import { jsx, jsxs } from 'react/jsx-runtime';
4
+
5
+ // src/WizardDevTools.tsx
6
+ function WizardDevTools() {
7
+ const [isOpen, setIsOpen] = useState(false);
8
+ const [activeTab, setActiveTab] = useState("state");
9
+ const { data, allErrors, store, ...state } = useWizardContext();
10
+ const [logs, setLogs] = useState([]);
11
+ useEffect(() => {
12
+ if (!store) return;
13
+ const s = store;
14
+ return s.subscribeToActions((action) => {
15
+ setLogs(
16
+ (prev) => [
17
+ {
18
+ timestamp: Date.now(),
19
+ action,
20
+ state: store.getSnapshot()
21
+ },
22
+ ...prev
23
+ ].slice(0, 50)
24
+ );
25
+ });
26
+ }, [store]);
27
+ useEffect(() => {
28
+ if (typeof window !== "undefined") {
29
+ const search = new URLSearchParams(window.location.search);
30
+ const hash = window.location.hash;
31
+ const hashParams = hash.includes("?") ? hash.split("?")[1] : "";
32
+ const hashSearch = new URLSearchParams(hashParams);
33
+ if (search.get("devtools") === "true" || hashSearch.get("devtools") === "true") {
34
+ setIsOpen(true);
35
+ }
36
+ }
37
+ }, []);
38
+ if (!isOpen) {
39
+ return /* @__PURE__ */ jsx(
40
+ "button",
41
+ {
42
+ "data-testid": "wizard-devtools-toggle",
43
+ onClick: () => setIsOpen(true),
44
+ style: {
45
+ position: "fixed",
46
+ bottom: "20px",
47
+ right: "20px",
48
+ zIndex: 9999,
49
+ padding: "10px 15px",
50
+ borderRadius: "50px",
51
+ background: "rgba(37, 99, 235, 0.9)",
52
+ color: "white",
53
+ border: "none",
54
+ boxShadow: "0 4px 15px rgba(0,0,0,0.2)",
55
+ cursor: "pointer",
56
+ fontWeight: "bold",
57
+ fontSize: "12px",
58
+ backdropFilter: "blur(5px)"
59
+ },
60
+ children: "Wizard DevTools"
61
+ }
62
+ );
63
+ }
64
+ return /* @__PURE__ */ jsxs(
65
+ "div",
66
+ {
67
+ "data-testid": "wizard-devtools",
68
+ style: {
69
+ position: "fixed",
70
+ bottom: "20px",
71
+ right: "20px",
72
+ width: "400px",
73
+ height: "500px",
74
+ backgroundColor: "rgba(15, 23, 42, 0.9)",
75
+ backdropFilter: "blur(12px)",
76
+ borderRadius: "16px",
77
+ border: "1px solid rgba(255, 255, 255, 0.1)",
78
+ boxShadow: "0 10px 40px rgba(0,0,0,0.5)",
79
+ zIndex: 9999,
80
+ display: "flex",
81
+ flexDirection: "column",
82
+ color: "#e2e8f0",
83
+ fontFamily: "Inter, sans-serif",
84
+ overflow: "hidden"
85
+ },
86
+ children: [
87
+ /* @__PURE__ */ jsxs(
88
+ "div",
89
+ {
90
+ style: {
91
+ padding: "12px 16px",
92
+ borderBottom: "1px solid rgba(255, 255, 255, 0.1)",
93
+ display: "flex",
94
+ justifyContent: "space-between",
95
+ alignItems: "center",
96
+ background: "rgba(255, 255, 255, 0.03)"
97
+ },
98
+ children: [
99
+ /* @__PURE__ */ jsx("span", { style: { fontWeight: 600, fontSize: "14px" }, children: "Wizard DevTools" }),
100
+ /* @__PURE__ */ jsx(
101
+ "button",
102
+ {
103
+ onClick: () => setIsOpen(false),
104
+ style: {
105
+ background: "none",
106
+ border: "none",
107
+ color: "#94a3b8",
108
+ cursor: "pointer",
109
+ fontSize: "18px"
110
+ },
111
+ children: "\xD7"
112
+ }
113
+ )
114
+ ]
115
+ }
116
+ ),
117
+ /* @__PURE__ */ jsx(
118
+ "div",
119
+ {
120
+ style: {
121
+ display: "flex",
122
+ borderBottom: "1px solid rgba(255, 255, 255, 0.1)",
123
+ background: "rgba(255, 255, 255, 0.02)"
124
+ },
125
+ children: ["state", "actions", "errors"].map((tab) => /* @__PURE__ */ jsx(
126
+ "button",
127
+ {
128
+ "data-testid": `devtools-tab-${tab}`,
129
+ onClick: () => setActiveTab(tab),
130
+ style: {
131
+ flex: 1,
132
+ padding: "10px",
133
+ background: activeTab === tab ? "rgba(37, 99, 235, 0.2)" : "none",
134
+ border: "none",
135
+ color: activeTab === tab ? "#60a5fa" : "#94a3b8",
136
+ borderBottom: activeTab === tab ? "2px solid #3b82f6" : "none",
137
+ cursor: "pointer",
138
+ fontSize: "12px",
139
+ textTransform: "capitalize",
140
+ fontWeight: activeTab === tab ? 600 : 400
141
+ },
142
+ children: tab
143
+ },
144
+ tab
145
+ ))
146
+ }
147
+ ),
148
+ /* @__PURE__ */ jsxs(
149
+ "div",
150
+ {
151
+ style: {
152
+ flex: 1,
153
+ overflowY: "auto",
154
+ padding: "16px",
155
+ fontSize: "12px"
156
+ },
157
+ children: [
158
+ activeTab === "state" && /* @__PURE__ */ jsxs("div", { children: [
159
+ /* @__PURE__ */ jsxs(Section, { title: "Navigation", children: [
160
+ /* @__PURE__ */ jsx(KeyVal, { label: "Current Step", value: state.currentStepId }),
161
+ /* @__PURE__ */ jsx(KeyVal, { label: "Index", value: state.currentStepIndex }),
162
+ /* @__PURE__ */ jsx(KeyVal, { label: "Progress", value: `${state.progress}%` }),
163
+ /* @__PURE__ */ jsx(KeyVal, { label: "Total Steps", value: state.activeStepsCount }),
164
+ /* @__PURE__ */ jsx(KeyVal, { label: "Is Loading", value: String(state.isLoading) }),
165
+ /* @__PURE__ */ jsx(KeyVal, { label: "Is Busy", value: String(state.isBusy) })
166
+ ] }),
167
+ /* @__PURE__ */ jsx(Section, { title: "History", children: /* @__PURE__ */ jsx("div", { style: { color: "#94a3b8" }, children: state.history.join(" \u2192 ") || "Empty" }) }),
168
+ /* @__PURE__ */ jsx(Section, { title: "Data", children: /* @__PURE__ */ jsx(JsonView, { data }) }),
169
+ /* @__PURE__ */ jsx(Section, { title: "Meta", children: /* @__PURE__ */ jsx(
170
+ JsonView,
171
+ {
172
+ data: {
173
+ visited: Array.from(state.visitedSteps),
174
+ completed: Array.from(state.completedSteps),
175
+ busy: Array.from(state.busySteps)
176
+ }
177
+ }
178
+ ) })
179
+ ] }),
180
+ activeTab === "errors" && /* @__PURE__ */ jsx("div", { children: Object.keys(allErrors).length === 0 ? /* @__PURE__ */ jsx(
181
+ "div",
182
+ {
183
+ style: {
184
+ color: "#94a3b8",
185
+ textAlign: "center",
186
+ marginTop: "20px"
187
+ },
188
+ children: "No active errors"
189
+ }
190
+ ) : /* @__PURE__ */ jsx(JsonView, { data: allErrors }) }),
191
+ activeTab === "actions" && /* @__PURE__ */ jsx(
192
+ "div",
193
+ {
194
+ "data-testid": "devtools-action-list",
195
+ style: { display: "flex", flexDirection: "column", gap: "8px" },
196
+ children: logs.length === 0 ? /* @__PURE__ */ jsx(
197
+ "div",
198
+ {
199
+ style: {
200
+ color: "#94a3b8",
201
+ textAlign: "center",
202
+ marginTop: "20px"
203
+ },
204
+ children: "No actions recorded yet"
205
+ }
206
+ ) : logs.map((log, i) => /* @__PURE__ */ jsx(
207
+ ActionLogItem,
208
+ {
209
+ log,
210
+ onJump: (s) => store.dispatch({
211
+ type: "RESTORE_SNAPSHOT",
212
+ payload: { snapshot: s }
213
+ })
214
+ },
215
+ log.timestamp + i
216
+ ))
217
+ }
218
+ )
219
+ ]
220
+ }
221
+ ),
222
+ /* @__PURE__ */ jsxs(
223
+ "div",
224
+ {
225
+ style: {
226
+ padding: "8px 16px",
227
+ fontSize: "10px",
228
+ color: "#64748b",
229
+ borderTop: "1px solid rgba(255, 255, 255, 0.1)",
230
+ background: "rgba(255, 255, 255, 0.02)",
231
+ display: "flex",
232
+ justifyContent: "space-between"
233
+ },
234
+ children: [
235
+ /* @__PURE__ */ jsx("span", { children: "v2.1.0" }),
236
+ /* @__PURE__ */ jsx("span", { children: "Strict Mode: Active" })
237
+ ]
238
+ }
239
+ )
240
+ ]
241
+ }
242
+ );
243
+ }
244
+ var ActionLogItem = ({ log, onJump }) => {
245
+ const [isExpanded, setIsExpanded] = useState(false);
246
+ const time = new Date(log.timestamp).toLocaleTimeString();
247
+ return /* @__PURE__ */ jsxs(
248
+ "div",
249
+ {
250
+ "data-testid": "action-item",
251
+ style: {
252
+ background: "rgba(255, 255, 255, 0.05)",
253
+ borderRadius: "8px",
254
+ overflow: "hidden",
255
+ border: "1px solid rgba(255, 255, 255, 0.05)"
256
+ },
257
+ children: [
258
+ /* @__PURE__ */ jsxs(
259
+ "div",
260
+ {
261
+ "data-testid": "action-item-header",
262
+ onClick: () => onJump(log.state),
263
+ style: {
264
+ padding: "8px 12px",
265
+ display: "flex",
266
+ justifyContent: "space-between",
267
+ cursor: "pointer",
268
+ alignItems: "center"
269
+ },
270
+ children: [
271
+ /* @__PURE__ */ jsxs("div", { style: { display: "flex", gap: "8px", alignItems: "center" }, children: [
272
+ /* @__PURE__ */ jsx("span", { style: { color: "#64748b", fontSize: "10px" }, children: time }),
273
+ /* @__PURE__ */ jsx("span", { "data-testid": "action-type", style: { color: "#60a5fa", fontWeight: 600 }, children: log.action.type }),
274
+ /* @__PURE__ */ jsx(
275
+ "button",
276
+ {
277
+ "data-testid": "jump-button",
278
+ onClick: (e) => {
279
+ e.stopPropagation();
280
+ onJump(log.state);
281
+ },
282
+ style: {
283
+ padding: "2px 6px",
284
+ fontSize: "9px",
285
+ background: "#1e293b",
286
+ border: "1px solid #334155",
287
+ color: "#60a5fa",
288
+ borderRadius: "4px",
289
+ cursor: "pointer"
290
+ },
291
+ children: "Jump"
292
+ }
293
+ )
294
+ ] }),
295
+ /* @__PURE__ */ jsx(
296
+ "span",
297
+ {
298
+ style: {
299
+ color: "#475569",
300
+ transform: isExpanded ? "rotate(180deg)" : "none",
301
+ transition: "transform 0.2s",
302
+ padding: "4px"
303
+ },
304
+ onClick: (e) => {
305
+ e.stopPropagation();
306
+ setIsExpanded(!isExpanded);
307
+ },
308
+ children: "\u25BE"
309
+ }
310
+ )
311
+ ]
312
+ }
313
+ ),
314
+ isExpanded && /* @__PURE__ */ jsxs(
315
+ "div",
316
+ {
317
+ style: {
318
+ padding: "0 12px 12px 12px",
319
+ borderTop: "1px solid rgba(255, 255, 255, 0.05)"
320
+ },
321
+ children: [
322
+ /* @__PURE__ */ jsxs("div", { style: { marginTop: "8px" }, children: [
323
+ /* @__PURE__ */ jsx(
324
+ "div",
325
+ {
326
+ style: {
327
+ color: "#94a3b8",
328
+ marginBottom: "4px",
329
+ fontSize: "10px"
330
+ },
331
+ children: "Payload:"
332
+ }
333
+ ),
334
+ /* @__PURE__ */ jsx(JsonView, { data: log.action.payload })
335
+ ] }),
336
+ /* @__PURE__ */ jsxs("div", { style: { marginTop: "8px" }, children: [
337
+ /* @__PURE__ */ jsx(
338
+ "div",
339
+ {
340
+ style: {
341
+ color: "#94a3b8",
342
+ marginBottom: "4px",
343
+ fontSize: "10px"
344
+ },
345
+ children: "State after:"
346
+ }
347
+ ),
348
+ /* @__PURE__ */ jsx(JsonView, { data: log.state })
349
+ ] })
350
+ ]
351
+ }
352
+ )
353
+ ]
354
+ }
355
+ );
356
+ };
357
+ var Section = ({ title, children }) => /* @__PURE__ */ jsxs("div", { style: { marginBottom: "20px" }, children: [
358
+ /* @__PURE__ */ jsx(
359
+ "h4",
360
+ {
361
+ style: {
362
+ margin: "0 0 8px 0",
363
+ color: "#3b82f6",
364
+ fontSize: "11px",
365
+ textTransform: "uppercase",
366
+ letterSpacing: "0.05em"
367
+ },
368
+ children: title
369
+ }
370
+ ),
371
+ children
372
+ ] });
373
+ var KeyVal = ({ label, value }) => /* @__PURE__ */ jsxs(
374
+ "div",
375
+ {
376
+ style: {
377
+ display: "flex",
378
+ justifyContent: "space-between",
379
+ marginBottom: "4px"
380
+ },
381
+ children: [
382
+ /* @__PURE__ */ jsxs("span", { style: { color: "#94a3b8" }, children: [
383
+ label,
384
+ ":"
385
+ ] }),
386
+ /* @__PURE__ */ jsx("span", { style: { color: "#f8fafc", fontWeight: 500 }, children: value })
387
+ ]
388
+ }
389
+ );
390
+ var JsonView = ({ data }) => {
391
+ const replacer = (_key, value) => {
392
+ if (value instanceof Set) {
393
+ return Array.from(value);
394
+ }
395
+ return value;
396
+ };
397
+ return /* @__PURE__ */ jsx(
398
+ "pre",
399
+ {
400
+ style: {
401
+ background: "rgba(0, 0, 0, 0.3)",
402
+ padding: "10px",
403
+ borderRadius: "8px",
404
+ overflowX: "auto",
405
+ color: "#60a5fa",
406
+ border: "1px solid rgba(255, 255, 255, 0.05)",
407
+ margin: 0
408
+ },
409
+ children: JSON.stringify(data, replacer, 2)
410
+ }
411
+ );
412
+ };
413
+
414
+ export { WizardDevTools };
415
+ //# sourceMappingURL=index.js.map
416
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/WizardDevTools.tsx"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import React, { useState, useEffect } from 'react';\nimport { useWizardContext } from '@wizzard-packages/react';\nimport type { WizardAction, IWizardStore } from '@wizzard-packages/core';\n\ninterface IActionLog {\n timestamp: number;\n action: WizardAction<any, any>;\n state: any;\n}\n\nexport function WizardDevTools() {\n const [isOpen, setIsOpen] = useState(false);\n const [activeTab, setActiveTab] = useState<'state' | 'actions' | 'errors'>('state');\n const { data, allErrors, store, ...state } = useWizardContext();\n const [logs, setLogs] = useState<IActionLog[]>([]);\n\n useEffect(() => {\n if (!store) return;\n const s = store as IWizardStore<any, any>;\n return s.subscribeToActions((action: WizardAction<any, any>) => {\n setLogs((prev) =>\n [\n {\n timestamp: Date.now(),\n action,\n state: store.getSnapshot(),\n },\n ...prev,\n ].slice(0, 50)\n );\n });\n }, [store]);\n\n useEffect(() => {\n if (typeof window !== 'undefined') {\n const search = new URLSearchParams(window.location.search);\n const hash = window.location.hash;\n const hashParams = hash.includes('?') ? hash.split('?')[1] : '';\n const hashSearch = new URLSearchParams(hashParams);\n\n if (search.get('devtools') === 'true' || hashSearch.get('devtools') === 'true') {\n setIsOpen(true);\n }\n }\n }, []);\n\n if (!isOpen) {\n return (\n <button\n data-testid=\"wizard-devtools-toggle\"\n onClick={() => setIsOpen(true)}\n style={{\n position: 'fixed',\n bottom: '20px',\n right: '20px',\n zIndex: 9999,\n padding: '10px 15px',\n borderRadius: '50px',\n background: 'rgba(37, 99, 235, 0.9)',\n color: 'white',\n border: 'none',\n boxShadow: '0 4px 15px rgba(0,0,0,0.2)',\n cursor: 'pointer',\n fontWeight: 'bold',\n fontSize: '12px',\n backdropFilter: 'blur(5px)',\n }}\n >\n Wizard DevTools\n </button>\n );\n }\n\n return (\n <div\n data-testid=\"wizard-devtools\"\n style={{\n position: 'fixed',\n bottom: '20px',\n right: '20px',\n width: '400px',\n height: '500px',\n backgroundColor: 'rgba(15, 23, 42, 0.9)',\n backdropFilter: 'blur(12px)',\n borderRadius: '16px',\n border: '1px solid rgba(255, 255, 255, 0.1)',\n boxShadow: '0 10px 40px rgba(0,0,0,0.5)',\n zIndex: 9999,\n display: 'flex',\n flexDirection: 'column',\n color: '#e2e8f0',\n fontFamily: 'Inter, sans-serif',\n overflow: 'hidden',\n }}\n >\n <div\n style={{\n padding: '12px 16px',\n borderBottom: '1px solid rgba(255, 255, 255, 0.1)',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n background: 'rgba(255, 255, 255, 0.03)',\n }}\n >\n <span style={{ fontWeight: 600, fontSize: '14px' }}>Wizard DevTools</span>\n <button\n onClick={() => setIsOpen(false)}\n style={{\n background: 'none',\n border: 'none',\n color: '#94a3b8',\n cursor: 'pointer',\n fontSize: '18px',\n }}\n >\n &times;\n </button>\n </div>\n\n <div\n style={{\n display: 'flex',\n borderBottom: '1px solid rgba(255, 255, 255, 0.1)',\n background: 'rgba(255, 255, 255, 0.02)',\n }}\n >\n {['state', 'actions', 'errors'].map((tab) => (\n <button\n key={tab}\n data-testid={`devtools-tab-${tab}`}\n onClick={() => setActiveTab(tab as any)}\n style={{\n flex: 1,\n padding: '10px',\n background: activeTab === tab ? 'rgba(37, 99, 235, 0.2)' : 'none',\n border: 'none',\n color: activeTab === tab ? '#60a5fa' : '#94a3b8',\n borderBottom: activeTab === tab ? '2px solid #3b82f6' : 'none',\n cursor: 'pointer',\n fontSize: '12px',\n textTransform: 'capitalize',\n fontWeight: activeTab === tab ? 600 : 400,\n }}\n >\n {tab}\n </button>\n ))}\n </div>\n\n <div\n style={{\n flex: 1,\n overflowY: 'auto',\n padding: '16px',\n fontSize: '12px',\n }}\n >\n {activeTab === 'state' && (\n <div>\n <Section title=\"Navigation\">\n <KeyVal label=\"Current Step\" value={state.currentStepId} />\n <KeyVal label=\"Index\" value={state.currentStepIndex} />\n <KeyVal label=\"Progress\" value={`${state.progress}%`} />\n <KeyVal label=\"Total Steps\" value={state.activeStepsCount} />\n <KeyVal label=\"Is Loading\" value={String(state.isLoading)} />\n <KeyVal label=\"Is Busy\" value={String(state.isBusy)} />\n </Section>\n\n <Section title=\"History\">\n <div style={{ color: '#94a3b8' }}>{state.history.join(' → ') || 'Empty'}</div>\n </Section>\n\n <Section title=\"Data\">\n <JsonView data={data} />\n </Section>\n\n <Section title=\"Meta\">\n <JsonView\n data={{\n visited: Array.from(state.visitedSteps),\n completed: Array.from(state.completedSteps),\n busy: Array.from(state.busySteps),\n }}\n />\n </Section>\n </div>\n )}\n\n {activeTab === 'errors' && (\n <div>\n {Object.keys(allErrors).length === 0 ? (\n <div\n style={{\n color: '#94a3b8',\n textAlign: 'center',\n marginTop: '20px',\n }}\n >\n No active errors\n </div>\n ) : (\n <JsonView data={allErrors} />\n )}\n </div>\n )}\n\n {activeTab === 'actions' && (\n <div\n data-testid=\"devtools-action-list\"\n style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}\n >\n {logs.length === 0 ? (\n <div\n style={{\n color: '#94a3b8',\n textAlign: 'center',\n marginTop: '20px',\n }}\n >\n No actions recorded yet\n </div>\n ) : (\n logs.map((log, i) => (\n <ActionLogItem\n key={log.timestamp + i}\n log={log}\n onJump={(s) =>\n store.dispatch({\n type: 'RESTORE_SNAPSHOT',\n payload: { snapshot: s },\n })\n }\n />\n ))\n )}\n </div>\n )}\n </div>\n\n <div\n style={{\n padding: '8px 16px',\n fontSize: '10px',\n color: '#64748b',\n borderTop: '1px solid rgba(255, 255, 255, 0.1)',\n background: 'rgba(255, 255, 255, 0.02)',\n display: 'flex',\n justifyContent: 'space-between',\n }}\n >\n <span>v2.1.0</span>\n <span>Strict Mode: Active</span>\n </div>\n </div>\n );\n}\n\nconst ActionLogItem: React.FC<{\n log: IActionLog;\n onJump: (state: any) => void;\n}> = ({ log, onJump }) => {\n const [isExpanded, setIsExpanded] = useState(false);\n const time = new Date(log.timestamp).toLocaleTimeString();\n\n return (\n <div\n data-testid=\"action-item\"\n style={{\n background: 'rgba(255, 255, 255, 0.05)',\n borderRadius: '8px',\n overflow: 'hidden',\n border: '1px solid rgba(255, 255, 255, 0.05)',\n }}\n >\n <div\n data-testid=\"action-item-header\"\n onClick={() => onJump(log.state)}\n style={{\n padding: '8px 12px',\n display: 'flex',\n justifyContent: 'space-between',\n cursor: 'pointer',\n alignItems: 'center',\n }}\n >\n <div style={{ display: 'flex', gap: '8px', alignItems: 'center' }}>\n <span style={{ color: '#64748b', fontSize: '10px' }}>{time}</span>\n <span data-testid=\"action-type\" style={{ color: '#60a5fa', fontWeight: 600 }}>\n {log.action.type}\n </span>\n <button\n data-testid=\"jump-button\"\n onClick={(e) => {\n e.stopPropagation();\n onJump(log.state);\n }}\n style={{\n padding: '2px 6px',\n fontSize: '9px',\n background: '#1e293b',\n border: '1px solid #334155',\n color: '#60a5fa',\n borderRadius: '4px',\n cursor: 'pointer',\n }}\n >\n Jump\n </button>\n </div>\n <span\n style={{\n color: '#475569',\n transform: isExpanded ? 'rotate(180deg)' : 'none',\n transition: 'transform 0.2s',\n padding: '4px',\n }}\n onClick={(e) => {\n e.stopPropagation();\n setIsExpanded(!isExpanded);\n }}\n >\n ▾\n </span>\n </div>\n {isExpanded && (\n <div\n style={{\n padding: '0 12px 12px 12px',\n borderTop: '1px solid rgba(255, 255, 255, 0.05)',\n }}\n >\n <div style={{ marginTop: '8px' }}>\n <div\n style={{\n color: '#94a3b8',\n marginBottom: '4px',\n fontSize: '10px',\n }}\n >\n Payload:\n </div>\n <JsonView data={log.action.payload} />\n </div>\n <div style={{ marginTop: '8px' }}>\n <div\n style={{\n color: '#94a3b8',\n marginBottom: '4px',\n fontSize: '10px',\n }}\n >\n State after:\n </div>\n <JsonView data={log.state} />\n </div>\n </div>\n )}\n </div>\n );\n};\n\nconst Section: React.FC<{ title: string; children: React.ReactNode }> = ({ title, children }) => (\n <div style={{ marginBottom: '20px' }}>\n <h4\n style={{\n margin: '0 0 8px 0',\n color: '#3b82f6',\n fontSize: '11px',\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n }}\n >\n {title}\n </h4>\n {children}\n </div>\n);\n\nconst KeyVal: React.FC<{ label: string; value: any }> = ({ label, value }) => (\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n marginBottom: '4px',\n }}\n >\n <span style={{ color: '#94a3b8' }}>{label}:</span>\n <span style={{ color: '#f8fafc', fontWeight: 500 }}>{value}</span>\n </div>\n);\n\nconst JsonView: React.FC<{ data: any }> = ({ data }) => {\n const replacer = (_key: string, value: any) => {\n if (value instanceof Set) {\n return Array.from(value);\n }\n return value;\n };\n\n return (\n <pre\n style={{\n background: 'rgba(0, 0, 0, 0.3)',\n padding: '10px',\n borderRadius: '8px',\n overflowX: 'auto',\n color: '#60a5fa',\n border: '1px solid rgba(255, 255, 255, 0.05)',\n margin: 0,\n }}\n >\n {JSON.stringify(data, replacer, 2)}\n </pre>\n );\n};\n"]}
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "@wizzard-packages/devtools",
3
+ "version": "0.1.0",
4
+ "description": "DevTools UI for Wizzard Stepper.",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "publishConfig": {
13
+ "access": "public"
14
+ },
15
+ "exports": {
16
+ ".": {
17
+ "types": "./dist/index.d.ts",
18
+ "import": "./dist/index.js",
19
+ "require": "./dist/index.cjs"
20
+ }
21
+ },
22
+ "dependencies": {
23
+ "@wizzard-packages/react": "0.1.0"
24
+ },
25
+ "peerDependencies": {
26
+ "react": ">=18.0.0",
27
+ "react-dom": ">=18.0.0",
28
+ "@wizzard-packages/core": "0.1.0"
29
+ },
30
+ "devDependencies": {
31
+ "react": "^19.2.0",
32
+ "react-dom": "^19.2.0",
33
+ "tsup": "^8.3.5",
34
+ "typescript": "^5.7.2",
35
+ "vitest": "^4.0.16",
36
+ "@wizzard-packages/core": "0.1.0"
37
+ },
38
+ "scripts": {
39
+ "build": "tsup",
40
+ "dev": "tsup src/index.ts --format cjs,esm --watch --dts",
41
+ "lint": "eslint .",
42
+ "test": "vitest",
43
+ "test:run": "vitest run",
44
+ "type-check": "tsc --noEmit"
45
+ }
46
+ }