@process.co/ui 0.0.22 → 0.0.23
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/css/ui.css +48 -0
- package/dist/components/dev/index.cjs +213 -7
- package/dist/components/dev/index.cjs.map +1 -1
- package/dist/components/dev/index.d.cts +64 -3
- package/dist/components/dev/index.d.ts +64 -3
- package/dist/components/dev/index.js +214 -9
- package/dist/components/dev/index.js.map +1 -1
- package/dist/components/fields/index.cjs.map +1 -1
- package/dist/components/fields/index.js.map +1 -1
- package/dist/components/slots/index.cjs +73 -59
- package/dist/components/slots/index.cjs.map +1 -1
- package/dist/components/slots/index.d.cts +1 -1
- package/dist/components/slots/index.d.ts +1 -1
- package/dist/components/slots/index.js +73 -60
- package/dist/components/slots/index.js.map +1 -1
- package/dist/{index-NpNmoYuX.d.cts → index-D4Fc9AJv.d.cts} +15 -2
- package/dist/{index-NpNmoYuX.d.ts → index-D4Fc9AJv.d.ts} +15 -2
- package/dist/index.cjs +14 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +15 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/css/ui.css
CHANGED
|
@@ -1053,6 +1053,9 @@
|
|
|
1053
1053
|
.uii\:mb-1 {
|
|
1054
1054
|
margin-bottom: calc(var(--uii-spacing) * 1);
|
|
1055
1055
|
}
|
|
1056
|
+
.uii\:mb-1\.5 {
|
|
1057
|
+
margin-bottom: calc(var(--uii-spacing) * 1.5);
|
|
1058
|
+
}
|
|
1056
1059
|
.uii\:mb-2 {
|
|
1057
1060
|
margin-bottom: calc(var(--uii-spacing) * 2);
|
|
1058
1061
|
}
|
|
@@ -1141,6 +1144,9 @@
|
|
|
1141
1144
|
.uii\:max-h-48 {
|
|
1142
1145
|
max-height: calc(var(--uii-spacing) * 48);
|
|
1143
1146
|
}
|
|
1147
|
+
.uii\:max-h-64 {
|
|
1148
|
+
max-height: calc(var(--uii-spacing) * 64);
|
|
1149
|
+
}
|
|
1144
1150
|
.uii\:max-h-96 {
|
|
1145
1151
|
max-height: calc(var(--uii-spacing) * 96);
|
|
1146
1152
|
}
|
|
@@ -1237,6 +1243,9 @@
|
|
|
1237
1243
|
.uii\:justify-start {
|
|
1238
1244
|
justify-content: flex-start;
|
|
1239
1245
|
}
|
|
1246
|
+
.uii\:gap-1 {
|
|
1247
|
+
gap: calc(var(--uii-spacing) * 1);
|
|
1248
|
+
}
|
|
1240
1249
|
.uii\:gap-1\.5 {
|
|
1241
1250
|
gap: calc(var(--uii-spacing) * 1.5);
|
|
1242
1251
|
}
|
|
@@ -1319,12 +1328,18 @@
|
|
|
1319
1328
|
.uii\:border-\[\#e5e7eb\] {
|
|
1320
1329
|
border-color: #e5e7eb;
|
|
1321
1330
|
}
|
|
1331
|
+
.uii\:border-amber-200 {
|
|
1332
|
+
border-color: oklch(92.4% 0.12 95.746);
|
|
1333
|
+
}
|
|
1322
1334
|
.uii\:border-amber-500\/30 {
|
|
1323
1335
|
border-color: color-mix(in oklab, oklch(76.9% 0.188 70.08) 30%, transparent);
|
|
1324
1336
|
}
|
|
1325
1337
|
.uii\:border-amber-500\/50 {
|
|
1326
1338
|
border-color: color-mix(in oklab, oklch(76.9% 0.188 70.08) 50%, transparent);
|
|
1327
1339
|
}
|
|
1340
|
+
.uii\:border-blue-500 {
|
|
1341
|
+
border-color: oklch(62.3% 0.214 259.815);
|
|
1342
|
+
}
|
|
1328
1343
|
.uii\:border-gray-300 {
|
|
1329
1344
|
border-color: oklch(87.2% 0.01 258.338);
|
|
1330
1345
|
}
|
|
@@ -1340,12 +1355,27 @@
|
|
|
1340
1355
|
.uii\:border-red-500 {
|
|
1341
1356
|
border-color: oklch(63.7% 0.237 25.331);
|
|
1342
1357
|
}
|
|
1358
|
+
.uii\:border-slate-200 {
|
|
1359
|
+
border-color: oklch(92.9% 0.013 255.508);
|
|
1360
|
+
}
|
|
1361
|
+
.uii\:border-slate-300 {
|
|
1362
|
+
border-color: oklch(86.9% 0.022 252.894);
|
|
1363
|
+
}
|
|
1364
|
+
.uii\:border-slate-500 {
|
|
1365
|
+
border-color: oklch(55.4% 0.046 257.417);
|
|
1366
|
+
}
|
|
1343
1367
|
.uii\:border-transparent {
|
|
1344
1368
|
border-color: transparent;
|
|
1345
1369
|
}
|
|
1346
1370
|
.uii\:border-l-background {
|
|
1347
1371
|
border-left-color: var(--background);
|
|
1348
1372
|
}
|
|
1373
|
+
.uii\:bg-amber-50 {
|
|
1374
|
+
background-color: oklch(98.7% 0.022 95.277);
|
|
1375
|
+
}
|
|
1376
|
+
.uii\:bg-amber-100 {
|
|
1377
|
+
background-color: oklch(96.2% 0.059 95.617);
|
|
1378
|
+
}
|
|
1349
1379
|
.uii\:bg-amber-500\/5 {
|
|
1350
1380
|
background-color: color-mix(in oklab, oklch(76.9% 0.188 70.08) 5%, transparent);
|
|
1351
1381
|
}
|
|
@@ -1355,6 +1385,9 @@
|
|
|
1355
1385
|
.uii\:bg-blue-100 {
|
|
1356
1386
|
background-color: oklch(93.2% 0.032 255.585);
|
|
1357
1387
|
}
|
|
1388
|
+
.uii\:bg-blue-200 {
|
|
1389
|
+
background-color: oklch(88.2% 0.059 254.128);
|
|
1390
|
+
}
|
|
1358
1391
|
.uii\:bg-border {
|
|
1359
1392
|
background-color: var(--border);
|
|
1360
1393
|
}
|
|
@@ -1394,6 +1427,15 @@
|
|
|
1394
1427
|
.uii\:bg-secondary {
|
|
1395
1428
|
background-color: var(--secondary);
|
|
1396
1429
|
}
|
|
1430
|
+
.uii\:bg-slate-50 {
|
|
1431
|
+
background-color: oklch(98.4% 0.003 247.858);
|
|
1432
|
+
}
|
|
1433
|
+
.uii\:bg-slate-100 {
|
|
1434
|
+
background-color: oklch(96.8% 0.007 247.896);
|
|
1435
|
+
}
|
|
1436
|
+
.uii\:bg-slate-300 {
|
|
1437
|
+
background-color: oklch(86.9% 0.022 252.894);
|
|
1438
|
+
}
|
|
1397
1439
|
.uii\:bg-transparent {
|
|
1398
1440
|
background-color: transparent;
|
|
1399
1441
|
}
|
|
@@ -1560,6 +1602,9 @@
|
|
|
1560
1602
|
.uii\:text-secondary-foreground {
|
|
1561
1603
|
color: var(--secondary-foreground);
|
|
1562
1604
|
}
|
|
1605
|
+
.uii\:text-slate-600 {
|
|
1606
|
+
color: oklch(44.6% 0.043 257.281);
|
|
1607
|
+
}
|
|
1563
1608
|
.uii\:text-white {
|
|
1564
1609
|
color: #fff;
|
|
1565
1610
|
}
|
|
@@ -1569,6 +1614,9 @@
|
|
|
1569
1614
|
.uii\:uppercase {
|
|
1570
1615
|
text-transform: uppercase;
|
|
1571
1616
|
}
|
|
1617
|
+
.uii\:italic {
|
|
1618
|
+
font-style: italic;
|
|
1619
|
+
}
|
|
1572
1620
|
.uii\:underline-offset-4 {
|
|
1573
1621
|
text-underline-offset: 4px;
|
|
1574
1622
|
}
|
|
@@ -7,6 +7,148 @@ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
|
7
7
|
var React2__default = /*#__PURE__*/_interopDefault(React2);
|
|
8
8
|
|
|
9
9
|
// src/components/dev/DevProvider.tsx
|
|
10
|
+
function evaluateSimplePath(obj, path) {
|
|
11
|
+
if (!path || !obj) return void 0;
|
|
12
|
+
const cleanPath = path.startsWith("$.") ? path.slice(2) : path.startsWith("$") ? path.slice(1) : path;
|
|
13
|
+
const parts = cleanPath.split(".");
|
|
14
|
+
let current = obj.data ?? obj;
|
|
15
|
+
for (const part of parts) {
|
|
16
|
+
if (current == null) return void 0;
|
|
17
|
+
const cleanPart = part.replace(/\[\*\]$/, "");
|
|
18
|
+
if (cleanPart) current = current[cleanPart];
|
|
19
|
+
}
|
|
20
|
+
return current;
|
|
21
|
+
}
|
|
22
|
+
function evaluateCollectionPath(obj, path) {
|
|
23
|
+
if (!path || !obj) return [];
|
|
24
|
+
let cleanPath = path.startsWith("$.") ? path.slice(2) : path.startsWith("$") ? path.slice(1) : path;
|
|
25
|
+
cleanPath = cleanPath.replace(/\[\*\]$/, "");
|
|
26
|
+
const parts = cleanPath.split(".");
|
|
27
|
+
let current = obj.data ?? obj;
|
|
28
|
+
for (const part of parts) {
|
|
29
|
+
if (current == null) return [];
|
|
30
|
+
if (part) current = current[part];
|
|
31
|
+
}
|
|
32
|
+
if (Array.isArray(current)) return current;
|
|
33
|
+
if (parts.length >= 2) {
|
|
34
|
+
const parentPath = parts.slice(0, -1).join(".");
|
|
35
|
+
let parent = obj;
|
|
36
|
+
for (const part of parentPath.split(".")) {
|
|
37
|
+
if (parent == null) return [];
|
|
38
|
+
if (part) parent = parent[part];
|
|
39
|
+
}
|
|
40
|
+
if (Array.isArray(parent)) return parent;
|
|
41
|
+
}
|
|
42
|
+
return [];
|
|
43
|
+
}
|
|
44
|
+
function evaluateItemPath(item, fullPath, _index) {
|
|
45
|
+
if (!fullPath || item == null) return void 0;
|
|
46
|
+
const wildcardIndex = fullPath.indexOf("[*]");
|
|
47
|
+
if (wildcardIndex === -1) return evaluateSimplePath(item, fullPath);
|
|
48
|
+
const afterWildcard = fullPath.slice(wildcardIndex + 3);
|
|
49
|
+
if (!afterWildcard || afterWildcard === "") return item;
|
|
50
|
+
const propertyPath = afterWildcard.startsWith(".") ? afterWildcard.slice(1) : afterWildcard;
|
|
51
|
+
const parts = propertyPath.split(".");
|
|
52
|
+
let current = item;
|
|
53
|
+
for (const part of parts) {
|
|
54
|
+
if (current == null) return void 0;
|
|
55
|
+
current = current[part];
|
|
56
|
+
}
|
|
57
|
+
return current;
|
|
58
|
+
}
|
|
59
|
+
function deriveFieldFromSlotsDefinition(slotsConfig) {
|
|
60
|
+
for (const slot of slotsConfig) {
|
|
61
|
+
const path = slot.path ?? slot.idPath ?? slot.labelPath;
|
|
62
|
+
if (typeof path !== "string") continue;
|
|
63
|
+
const afterData = path.replace(/^\$\.data\./, "").replace(/^\$\./, "");
|
|
64
|
+
const firstSegment = afterData.split(".")[0];
|
|
65
|
+
if (firstSegment) return firstSegment;
|
|
66
|
+
}
|
|
67
|
+
return void 0;
|
|
68
|
+
}
|
|
69
|
+
function deriveControlPropertyKey(def, slotsField) {
|
|
70
|
+
const props = def?.props;
|
|
71
|
+
if (!props) return slotsField;
|
|
72
|
+
const arr = Array.isArray(props) ? props : Object.keys(props).map((k) => ({ key: k, ...props[k] }));
|
|
73
|
+
const withUi = arr.find((p) => p?.ui != null);
|
|
74
|
+
const matchKey = slotsField ? arr.find((p) => p?.key === slotsField) : withUi;
|
|
75
|
+
return matchKey?.key ?? withUi?.key ?? slotsField;
|
|
76
|
+
}
|
|
77
|
+
function isDynamicSlot(slot) {
|
|
78
|
+
if (slot.type === "dynamic") return true;
|
|
79
|
+
const path = slot.path ?? slot.idPath ?? slot.labelPath ?? "";
|
|
80
|
+
return typeof path === "string" && path.includes("[*]");
|
|
81
|
+
}
|
|
82
|
+
function getSlotDefinitions(slotsConfig) {
|
|
83
|
+
return slotsConfig.map((slot) => ({
|
|
84
|
+
...slot,
|
|
85
|
+
type: isDynamicSlot(slot) ? "dynamic" : "static"
|
|
86
|
+
}));
|
|
87
|
+
}
|
|
88
|
+
function rewritePathForControlBase(path, definitionPropertyKey) {
|
|
89
|
+
if (!path || !definitionPropertyKey) return path;
|
|
90
|
+
const afterData = path.replace(/^\$\.data\./, "");
|
|
91
|
+
if (!afterData.startsWith(definitionPropertyKey + ".")) return path;
|
|
92
|
+
const rest = afterData.slice(definitionPropertyKey.length + 1);
|
|
93
|
+
return rest ? "$." + rest : path;
|
|
94
|
+
}
|
|
95
|
+
function resolveSlotDefinitions(slotDefinitions, node, nodeIdForStatic, definitionPropertyKey) {
|
|
96
|
+
const result = [];
|
|
97
|
+
for (const slot of slotDefinitions) {
|
|
98
|
+
if (slot.type === "static") {
|
|
99
|
+
const idPath = slot.idPath != null ? rewritePathForControlBase(slot.idPath, definitionPropertyKey) : void 0;
|
|
100
|
+
const id = idPath != null ? evaluateSimplePath(node, idPath) : slot.id != null ? String(slot.id).replace(/\{\{ID_GUID\}\}/g, nodeIdForStatic) : void 0;
|
|
101
|
+
const labelPath = slot.labelPath != null ? rewritePathForControlBase(slot.labelPath, definitionPropertyKey) : void 0;
|
|
102
|
+
const label = labelPath != null ? evaluateSimplePath(node, labelPath) : slot.labelPlaceholderValue ?? slot.label ?? (id ?? "");
|
|
103
|
+
result.push({ id: id ?? "", label: label ?? id ?? "" });
|
|
104
|
+
} else {
|
|
105
|
+
const path = slot.path ?? slot.idPath;
|
|
106
|
+
if (!path) continue;
|
|
107
|
+
const pathRewritten = rewritePathForControlBase(path, definitionPropertyKey);
|
|
108
|
+
const collection = evaluateCollectionPath(node, pathRewritten);
|
|
109
|
+
if (!Array.isArray(collection)) continue;
|
|
110
|
+
const idPath = rewritePathForControlBase(slot.idPath ?? path, definitionPropertyKey);
|
|
111
|
+
const labelPath = rewritePathForControlBase(slot.labelPath ?? path, definitionPropertyKey);
|
|
112
|
+
collection.forEach((item, index) => {
|
|
113
|
+
const id = evaluateItemPath(item, idPath) ?? item?.id ?? String(index);
|
|
114
|
+
const label = evaluateItemPath(item, labelPath) ?? item?.label ?? id ?? String(index);
|
|
115
|
+
result.push({ id: String(id), label: String(label) });
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return result;
|
|
120
|
+
}
|
|
121
|
+
function buildGetSlotsFromDefinition(slotDefinitions, nodeIdForStatic, options) {
|
|
122
|
+
const { devPropertyKey, definitionPropertyKey } = options;
|
|
123
|
+
return (fullData) => {
|
|
124
|
+
const controlValue = devPropertyKey != null && fullData != null ? fullData[devPropertyKey] : fullData;
|
|
125
|
+
const node = { data: controlValue ?? {} };
|
|
126
|
+
return resolveSlotDefinitions(
|
|
127
|
+
slotDefinitions,
|
|
128
|
+
node,
|
|
129
|
+
nodeIdForStatic,
|
|
130
|
+
definitionPropertyKey
|
|
131
|
+
);
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
function deriveSlotConfigFromDefinition(def, nodeId, propertyKeyFromLoader) {
|
|
135
|
+
const slotsRoot = def?.slots;
|
|
136
|
+
const slotsConfig = Array.isArray(slotsRoot) ? slotsRoot : slotsRoot?.slots;
|
|
137
|
+
if (!Array.isArray(slotsConfig) || slotsConfig.length === 0) return void 0;
|
|
138
|
+
const field = deriveFieldFromSlotsDefinition(slotsConfig);
|
|
139
|
+
const definitionPropertyKey = deriveControlPropertyKey(def, field);
|
|
140
|
+
const devPropertyKey = propertyKeyFromLoader ?? definitionPropertyKey;
|
|
141
|
+
const slotDefinitions = getSlotDefinitions(slotsConfig);
|
|
142
|
+
const getSlots = buildGetSlotsFromDefinition(slotDefinitions, nodeId ?? "dev-node", {
|
|
143
|
+
devPropertyKey,
|
|
144
|
+
definitionPropertyKey
|
|
145
|
+
});
|
|
146
|
+
return {
|
|
147
|
+
field: devPropertyKey ?? field ?? void 0,
|
|
148
|
+
activeIdPath: "activeSlotId",
|
|
149
|
+
getSlots
|
|
150
|
+
};
|
|
151
|
+
}
|
|
10
152
|
var DevContext = React2.createContext(null);
|
|
11
153
|
function useDevContext() {
|
|
12
154
|
return React2.useContext(DevContext);
|
|
@@ -40,20 +182,33 @@ function DevProvider({
|
|
|
40
182
|
storageKey = "process-dev",
|
|
41
183
|
initialData = {},
|
|
42
184
|
persist = true,
|
|
43
|
-
nodeId = "dev-node-1"
|
|
185
|
+
nodeId = "dev-node-1",
|
|
186
|
+
propertyKey = "devField",
|
|
187
|
+
slotPreset,
|
|
188
|
+
slotConfig: slotConfigProp,
|
|
189
|
+
elementDefinition
|
|
44
190
|
}) {
|
|
191
|
+
const slotConfig = React2.useMemo(
|
|
192
|
+
() => slotConfigProp ?? deriveSlotConfigFromDefinition(elementDefinition, nodeId, propertyKey),
|
|
193
|
+
[slotConfigProp, elementDefinition, nodeId, propertyKey]
|
|
194
|
+
);
|
|
195
|
+
const effectiveInitialData = React2.useMemo(
|
|
196
|
+
() => Object.keys(initialData).length > 0 ? initialData : elementDefinition?.initValue ?? {},
|
|
197
|
+
[initialData, elementDefinition?.initValue]
|
|
198
|
+
);
|
|
199
|
+
const [activeSlotId, setActiveSlotIdState] = React2.useState(null);
|
|
45
200
|
const [data, setData] = React2.useState(() => {
|
|
46
201
|
if (persist && typeof window !== "undefined") {
|
|
47
202
|
try {
|
|
48
203
|
const stored = localStorage.getItem(`${storageKey}:data`);
|
|
49
204
|
if (stored) {
|
|
50
|
-
return { ...
|
|
205
|
+
return { ...effectiveInitialData, ...JSON.parse(stored) };
|
|
51
206
|
}
|
|
52
207
|
} catch (e) {
|
|
53
208
|
console.warn("DevProvider: Failed to load from localStorage", e);
|
|
54
209
|
}
|
|
55
210
|
}
|
|
56
|
-
return
|
|
211
|
+
return effectiveInitialData;
|
|
57
212
|
});
|
|
58
213
|
const [inferredTypes, setInferredTypesState] = React2.useState(() => {
|
|
59
214
|
if (persist && typeof window !== "undefined") {
|
|
@@ -68,6 +223,10 @@ function DevProvider({
|
|
|
68
223
|
}
|
|
69
224
|
return {};
|
|
70
225
|
});
|
|
226
|
+
React2.useEffect(() => {
|
|
227
|
+
if (!elementDefinition?.initValue || typeof elementDefinition.initValue !== "object") return;
|
|
228
|
+
setData((prev) => Object.keys(prev).length === 0 ? { ...elementDefinition.initValue } : prev);
|
|
229
|
+
}, [elementDefinition?.initValue]);
|
|
71
230
|
React2.useEffect(() => {
|
|
72
231
|
if (persist && typeof window !== "undefined") {
|
|
73
232
|
try {
|
|
@@ -89,6 +248,9 @@ function DevProvider({
|
|
|
89
248
|
const setProperty = React2.useCallback((key, value2) => {
|
|
90
249
|
setData((prev) => ({ ...prev, [key]: value2 }));
|
|
91
250
|
}, []);
|
|
251
|
+
const setActiveSlotId = React2.useCallback((id) => {
|
|
252
|
+
setActiveSlotIdState(id);
|
|
253
|
+
}, []);
|
|
92
254
|
const getProperty = React2.useCallback((key) => {
|
|
93
255
|
return data[key];
|
|
94
256
|
}, [data]);
|
|
@@ -137,18 +299,36 @@ function DevProvider({
|
|
|
137
299
|
clearInferredType,
|
|
138
300
|
clearAllInferredTypes,
|
|
139
301
|
nodeId,
|
|
302
|
+
activeSlotId,
|
|
303
|
+
setActiveSlotId,
|
|
304
|
+
slotConfig,
|
|
305
|
+
elementDefinition,
|
|
140
306
|
clearAll,
|
|
141
307
|
exportData,
|
|
142
308
|
importData
|
|
143
|
-
}), [data, setProperty, getProperty, inferredTypes, setInferredType, getInferredType, clearInferredType, clearAllInferredTypes, nodeId, clearAll, exportData, importData]);
|
|
309
|
+
}), [data, setProperty, getProperty, inferredTypes, setInferredType, getInferredType, clearInferredType, clearAllInferredTypes, nodeId, activeSlotId, setActiveSlotId, slotConfig, elementDefinition, clearAll, exportData, importData]);
|
|
144
310
|
return /* @__PURE__ */ React2__default.default.createElement(DevContext.Provider, { value }, children);
|
|
145
311
|
}
|
|
312
|
+
function getSlotsFromCasesData(data) {
|
|
313
|
+
const list = data?.cases?.cases ?? data?.cases ?? data?.branches;
|
|
314
|
+
if (!Array.isArray(list)) return [];
|
|
315
|
+
return list.map((item) => ({
|
|
316
|
+
id: item.id ?? String(item),
|
|
317
|
+
label: item.label ?? item.id ?? String(item)
|
|
318
|
+
}));
|
|
319
|
+
}
|
|
146
320
|
function DevToolbar({ className }) {
|
|
147
321
|
const devCtx = useDevContext();
|
|
148
322
|
const [showData, setShowData] = React2.useState(false);
|
|
323
|
+
const [showDefinition, setShowDefinition] = React2.useState(false);
|
|
149
324
|
const [showTypeEditor, setShowTypeEditor] = React2.useState(false);
|
|
150
325
|
const [newTypeKey, setNewTypeKey] = React2.useState("");
|
|
151
326
|
const [newTypeValue, setNewTypeValue] = React2.useState("");
|
|
327
|
+
const slots = React2.useMemo(() => {
|
|
328
|
+
if (!devCtx?.slotConfig?.getSlots) return [];
|
|
329
|
+
const data = devCtx.data ?? {};
|
|
330
|
+
return devCtx.slotConfig.getSlots(data);
|
|
331
|
+
}, [devCtx?.slotConfig, devCtx?.data]);
|
|
152
332
|
if (!devCtx) {
|
|
153
333
|
return /* @__PURE__ */ React2__default.default.createElement("div", { className }, "DevToolbar: Not inside DevProvider");
|
|
154
334
|
}
|
|
@@ -167,7 +347,7 @@ function DevToolbar({ className }) {
|
|
|
167
347
|
devCtx.clearAllInferredTypes();
|
|
168
348
|
}
|
|
169
349
|
};
|
|
170
|
-
return /* @__PURE__ */ React2__default.default.createElement("div", { className: `${className || ""} uii:border uii:rounded-lg uii:p-4 uii:bg-gray-50 dark:uii:bg-gray-900` }, /* @__PURE__ */ React2__default.default.createElement("div", { className: "uii:flex uii:items-center uii:gap-4 uii:mb-2 uii:flex-wrap" }, /* @__PURE__ */ React2__default.default.createElement("span", { className: "uii:font-semibold uii:text-sm" }, "\u{1F6E0}\uFE0F Dev Mode"), /* @__PURE__ */ React2__default.default.createElement("span", { className: "uii:text-xs uii:text-gray-500" }, "Node: ", devCtx.nodeId), /* @__PURE__ */ React2__default.default.createElement(
|
|
350
|
+
return /* @__PURE__ */ React2__default.default.createElement("div", { className: `${className || ""} uii:border uii:rounded-lg uii:p-4 uii:bg-gray-50 dark:uii:bg-gray-900` }, /* @__PURE__ */ React2__default.default.createElement("div", { className: "uii:flex uii:items-center uii:gap-4 uii:mb-2 uii:flex-wrap" }, /* @__PURE__ */ React2__default.default.createElement("span", { className: "uii:font-semibold uii:text-sm " }, "\u{1F6E0}\uFE0F Dev Mode"), /* @__PURE__ */ React2__default.default.createElement("span", { className: "uii:text-xs uii:text-gray-500" }, "Node: ", devCtx.nodeId), /* @__PURE__ */ React2__default.default.createElement(
|
|
171
351
|
"button",
|
|
172
352
|
{
|
|
173
353
|
onClick: () => setShowData(!showData),
|
|
@@ -175,6 +355,14 @@ function DevToolbar({ className }) {
|
|
|
175
355
|
},
|
|
176
356
|
showData ? "Hide" : "Show",
|
|
177
357
|
" Data"
|
|
358
|
+
), /* @__PURE__ */ React2__default.default.createElement(
|
|
359
|
+
"button",
|
|
360
|
+
{
|
|
361
|
+
onClick: () => setShowDefinition(!showDefinition),
|
|
362
|
+
className: "uii:text-xs uii:px-2 uii:py-1 uii:bg-amber-100 dark:uii:bg-amber-900 uii:rounded hover:uii:bg-amber-200"
|
|
363
|
+
},
|
|
364
|
+
showDefinition ? "Hide" : "Show",
|
|
365
|
+
" Definition"
|
|
178
366
|
), /* @__PURE__ */ React2__default.default.createElement(
|
|
179
367
|
"button",
|
|
180
368
|
{
|
|
@@ -213,7 +401,24 @@ function DevToolbar({ className }) {
|
|
|
213
401
|
className: "uii:text-xs uii:px-2 uii:py-1 uii:bg-red-100 dark:uii:bg-red-900 uii:rounded hover:uii:bg-red-200"
|
|
214
402
|
},
|
|
215
403
|
"Clear"
|
|
216
|
-
)),
|
|
404
|
+
)), slots.length > 0 && /* @__PURE__ */ React2__default.default.createElement("div", { className: "uii:mt-2 uii:p-2 uii:bg-slate-50 dark:uii:bg-slate-900 uii:rounded-lg uii:border uii:border-slate-200 dark:uii:border-slate-700" }, /* @__PURE__ */ React2__default.default.createElement("div", { className: "uii:text-xs uii:font-medium uii:mb-1.5 uii:text-slate-600 dark:uii:text-slate-400" }, "Active path / case"), /* @__PURE__ */ React2__default.default.createElement("div", { className: "uii:flex uii:flex-wrap uii:gap-1" }, /* @__PURE__ */ React2__default.default.createElement(
|
|
405
|
+
"button",
|
|
406
|
+
{
|
|
407
|
+
type: "button",
|
|
408
|
+
onClick: () => devCtx.setActiveSlotId(null),
|
|
409
|
+
className: `uii:text-xs uii:px-2 uii:py-1 uii:rounded uii:border ${devCtx.activeSlotId === null ? "uii:bg-slate-300 dark:uii:bg-slate-600 uii:border-slate-500" : "uii:bg-slate-100 dark:uii:bg-slate-800 uii:border-slate-300 dark:uii:border-slate-600 hover:uii:bg-slate-200"}`
|
|
410
|
+
},
|
|
411
|
+
"(none)"
|
|
412
|
+
), slots.map((slot) => /* @__PURE__ */ React2__default.default.createElement(
|
|
413
|
+
"button",
|
|
414
|
+
{
|
|
415
|
+
key: slot.id,
|
|
416
|
+
type: "button",
|
|
417
|
+
onClick: () => devCtx.setActiveSlotId(slot.id),
|
|
418
|
+
className: `uii:text-xs uii:px-2 uii:py-1 uii:rounded uii:border ${devCtx.activeSlotId === slot.id ? "uii:bg-blue-200 dark:uii:bg-blue-800 uii:border-blue-500" : "uii:bg-white dark:uii:bg-slate-800 uii:border-slate-300 dark:uii:border-slate-600 hover:uii:bg-slate-100 dark:uii:hover:bg-slate-700"}`
|
|
419
|
+
},
|
|
420
|
+
slot.label || slot.id
|
|
421
|
+
)))), showTypeEditor && /* @__PURE__ */ React2__default.default.createElement("div", { className: "uii:mt-3 uii:p-3 uii:bg-purple-50 dark:uii:bg-purple-950 uii:rounded-lg uii:border uii:border-purple-200 dark:uii:border-purple-800" }, /* @__PURE__ */ React2__default.default.createElement("div", { className: "uii:text-xs uii:font-medium uii:mb-2 uii:text-purple-700 dark:uii:text-purple-300" }, "Spoof Inferred Types (simulate external field types)"), /* @__PURE__ */ React2__default.default.createElement("div", { className: "uii:flex uii:gap-2 uii:mb-2 uii:flex-wrap" }, /* @__PURE__ */ React2__default.default.createElement(
|
|
217
422
|
"input",
|
|
218
423
|
{
|
|
219
424
|
type: "text",
|
|
@@ -286,12 +491,13 @@ function DevToolbar({ className }) {
|
|
|
286
491
|
},
|
|
287
492
|
"\u2715"
|
|
288
493
|
)
|
|
289
|
-
))))), showData && /* @__PURE__ */ React2__default.default.createElement("div", { className: "uii:mt-2" }, /* @__PURE__ */ React2__default.default.createElement("div", { className: "uii:text-xs uii:mb-1 uii:font-medium" }, "Data:"), /* @__PURE__ */ React2__default.default.createElement("pre", { className: "uii:text-xs uii:bg-gray-100 dark:uii:bg-gray-800 uii:p-2 uii:rounded uii:overflow-auto uii:max-h-48" }, JSON.stringify(devCtx.data, null, 2)), /* @__PURE__ */ React2__default.default.createElement("div", { className: "uii:text-xs uii:mb-1 uii:mt-2 uii:font-medium" }, "Inferred Types:"), /* @__PURE__ */ React2__default.default.createElement("pre", { className: "uii:text-xs uii:bg-gray-100 dark:uii:bg-gray-800 uii:p-2 uii:rounded uii:overflow-auto uii:max-h-24" }, JSON.stringify(devCtx.inferredTypes, null, 2))));
|
|
494
|
+
))))), showData && /* @__PURE__ */ React2__default.default.createElement("div", { className: "uii:mt-2" }, /* @__PURE__ */ React2__default.default.createElement("div", { className: "uii:text-xs uii:mb-1 uii:font-medium" }, "Data:"), /* @__PURE__ */ React2__default.default.createElement("pre", { className: "uii:text-xs uii:bg-gray-100 dark:uii:bg-gray-800 uii:p-2 uii:rounded uii:overflow-auto uii:max-h-48" }, JSON.stringify(devCtx.data, null, 2)), /* @__PURE__ */ React2__default.default.createElement("div", { className: "uii:text-xs uii:mb-1 uii:mt-2 uii:font-medium" }, "Inferred Types:"), /* @__PURE__ */ React2__default.default.createElement("pre", { className: "uii:text-xs uii:bg-gray-100 dark:uii:bg-gray-800 uii:p-2 uii:rounded uii:overflow-auto uii:max-h-24" }, JSON.stringify(devCtx.inferredTypes, null, 2))), showDefinition && /* @__PURE__ */ React2__default.default.createElement("div", { className: "uii:mt-2" }, /* @__PURE__ */ React2__default.default.createElement("div", { className: "uii:text-xs uii:mb-1 uii:font-medium" }, "Action / signal definition:"), devCtx.elementDefinition != null ? /* @__PURE__ */ React2__default.default.createElement("pre", { className: "uii:text-xs uii:bg-amber-50 dark:uii:bg-amber-950/30 uii:p-2 uii:rounded uii:overflow-auto uii:max-h-64 uii:border uii:border-amber-200 dark:uii:border-amber-800" }, JSON.stringify(devCtx.elementDefinition, null, 2)) : /* @__PURE__ */ React2__default.default.createElement("p", { className: "uii:text-xs uii:text-gray-500 uii:italic" }, "No definition passed to DevProvider.")));
|
|
290
495
|
}
|
|
291
496
|
|
|
292
497
|
exports.DevContext = DevContext;
|
|
293
498
|
exports.DevProvider = DevProvider;
|
|
294
499
|
exports.DevToolbar = DevToolbar;
|
|
500
|
+
exports.getSlotsFromCasesData = getSlotsFromCasesData;
|
|
295
501
|
exports.useDevContext = useDevContext;
|
|
296
502
|
exports.useInferredTypes = useInferredTypes;
|
|
297
503
|
exports.useNodeProperty = useNodeProperty;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/dev/DevProvider.tsx","../../../src/components/dev/DevToolbar.tsx"],"names":["createContext","useContext","useCallback","useState","useEffect","value","useMemo","React"],"mappings":"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","file":"index.cjs","sourcesContent":["'use client';\n\nimport React, { createContext, useContext, useState, useCallback, useEffect, useMemo, type PropsWithChildren } from 'react';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Configuration for the DevProvider\n */\nexport interface DevProviderConfig {\n /** Unique key for localStorage persistence (defaults to 'process-dev') */\n storageKey?: string;\n /** Initial data to populate the store */\n initialData?: Record<string, any>;\n /** Whether to persist to localStorage (default: true) */\n persist?: boolean;\n /** Mock node ID (default: 'dev-node-1') */\n nodeId?: string;\n}\n\n/**\n * Context value for development/testing\n */\nexport interface DevContextValue {\n // Node property store\n data: Record<string, any>;\n setProperty: (key: string, value: any) => void;\n getProperty: <T = any>(key: string) => T | undefined;\n \n // Inferred types\n inferredTypes: Record<string, string>;\n setInferredType: (fieldName: string, type: string) => void;\n getInferredType: (fieldName: string) => string | undefined;\n /** Remove an inferred type by field name */\n clearInferredType: (fieldName: string) => void;\n /** Remove all inferred types */\n clearAllInferredTypes: () => void;\n \n // Metadata\n nodeId: string;\n \n // Utilities\n clearAll: () => void;\n exportData: () => string;\n importData: (json: string) => void;\n}\n\n// ============================================================================\n// Context\n// ============================================================================\n\nexport const DevContext = createContext<DevContextValue | null>(null);\n\n/**\n * Hook to access the dev context for property management\n */\nexport function useDevContext(): DevContextValue | null {\n return useContext(DevContext);\n}\n\n/**\n * Hook that mimics useNodeProperty from the real system\n * Works in both dev mode (with DevProvider) and production (with NodePropertyProvider)\n */\nexport function useNodeProperty<T = any>(fieldName: string): [T | undefined, (value: T) => void] {\n const devCtx = useDevContext();\n \n if (devCtx) {\n // Dev mode - use local state with persistence\n const value = devCtx.getProperty<T>(fieldName);\n const setValue = useCallback((newValue: T) => {\n devCtx.setProperty(fieldName, newValue);\n }, [devCtx, fieldName]);\n \n return [value, setValue];\n }\n \n // Not in dev mode - this is a fallback, real implementation should be provided by host\n console.warn(`useNodeProperty('${fieldName}') called outside of DevProvider - returning undefined`);\n const [localValue, setLocalValue] = useState<T | undefined>(undefined);\n return [localValue, setLocalValue];\n}\n\n/**\n * Hook that mimics useInferredTypes from the real system\n */\nexport function useInferredTypes() {\n const devCtx = useDevContext();\n \n if (devCtx) {\n return {\n inferredTypes: devCtx.inferredTypes,\n setInferredType: devCtx.setInferredType,\n getInferredType: devCtx.getInferredType,\n };\n }\n \n // Not in dev mode - return null (components should handle this gracefully)\n return null;\n}\n\n// ============================================================================\n// Provider\n// ============================================================================\n\n/**\n * DevProvider - Development environment for testing custom UI components\n * \n * Features:\n * - Persists data to localStorage\n * - Provides mock implementations of useNodeProperty and useInferredTypes\n * - Supports import/export of data for testing scenarios\n * \n * Usage:\n * ```tsx\n * import { DevProvider } from '@process.co/ui/dev';\n * \n * function App() {\n * return (\n * <DevProvider \n * storageKey=\"my-component-dev\"\n * initialData={{ switchValue: { cases: [] } }}\n * >\n * <MyCustomComponent fieldName=\"switchValue\" />\n * </DevProvider>\n * );\n * }\n * ```\n */\nexport function DevProvider({\n children, \n storageKey = 'process-dev',\n initialData = {},\n persist = true,\n nodeId = 'dev-node-1',\n}: PropsWithChildren<DevProviderConfig>) {\n \n // ========== Property Store ==========\n const [data, setData] = useState<Record<string, any>>(() => {\n // Try to load from localStorage first\n if (persist && typeof window !== 'undefined') {\n try {\n const stored = localStorage.getItem(`${storageKey}:data`);\n if (stored) {\n return { ...initialData, ...JSON.parse(stored) };\n }\n } catch (e) {\n console.warn('DevProvider: Failed to load from localStorage', e);\n }\n }\n return initialData;\n });\n \n // ========== Inferred Types ==========\n const [inferredTypes, setInferredTypesState] = useState<Record<string, string>>(() => {\n if (persist && typeof window !== 'undefined') {\n try {\n const stored = localStorage.getItem(`${storageKey}:inferredTypes`);\n if (stored) {\n return JSON.parse(stored);\n }\n } catch (e) {\n console.warn('DevProvider: Failed to load inferredTypes from localStorage', e);\n }\n }\n return {};\n });\n \n // ========== Persist to localStorage ==========\n useEffect(() => {\n if (persist && typeof window !== 'undefined') {\n try {\n localStorage.setItem(`${storageKey}:data`, JSON.stringify(data));\n } catch (e) {\n console.warn('DevProvider: Failed to save data to localStorage', e);\n }\n }\n }, [data, storageKey, persist]);\n \n useEffect(() => {\n if (persist && typeof window !== 'undefined') {\n try {\n localStorage.setItem(`${storageKey}:inferredTypes`, JSON.stringify(inferredTypes));\n } catch (e) {\n console.warn('DevProvider: Failed to save inferredTypes to localStorage', e);\n }\n }\n }, [inferredTypes, storageKey, persist]);\n \n // ========== Property Methods ==========\n const setProperty = useCallback((key: string, value: any) => {\n setData(prev => ({ ...prev, [key]: value }));\n }, []);\n \n const getProperty = useCallback(<T = any>(key: string): T | undefined => {\n return data[key] as T | undefined;\n }, [data]);\n \n // ========== Inferred Types Methods ==========\n const setInferredType = useCallback((fieldName: string, type: string) => {\n setInferredTypesState(prev => ({ ...prev, [fieldName]: type }));\n }, []);\n \n const getInferredType = useCallback((fieldName: string): string | undefined => {\n return inferredTypes[fieldName];\n }, [inferredTypes]);\n \n const clearInferredType = useCallback((fieldName: string) => {\n setInferredTypesState(prev => {\n const { [fieldName]: _, ...rest } = prev;\n return rest;\n });\n }, []);\n \n const clearAllInferredTypes = useCallback(() => {\n setInferredTypesState({});\n }, []);\n \n // ========== Utility Methods ==========\n const clearAll = useCallback(() => {\n setData({});\n setInferredTypesState({});\n if (persist && typeof window !== 'undefined') {\n localStorage.removeItem(`${storageKey}:data`);\n localStorage.removeItem(`${storageKey}:inferredTypes`);\n }\n }, [storageKey, persist]);\n \n const exportData = useCallback(() => {\n return JSON.stringify({ data, inferredTypes }, null, 2);\n }, [data, inferredTypes]);\n \n const importData = useCallback((json: string) => {\n try {\n const parsed = JSON.parse(json);\n if (parsed.data) setData(parsed.data);\n if (parsed.inferredTypes) setInferredTypesState(parsed.inferredTypes);\n } catch (e) {\n console.error('DevProvider: Failed to import data', e);\n }\n }, []);\n \n // ========== Context Value ==========\n const value = useMemo<DevContextValue>(() => ({\n data,\n setProperty,\n getProperty,\n inferredTypes,\n setInferredType,\n getInferredType,\n clearInferredType,\n clearAllInferredTypes,\n nodeId,\n clearAll,\n exportData,\n importData,\n }), [data, setProperty, getProperty, inferredTypes, setInferredType, getInferredType, clearInferredType, clearAllInferredTypes, nodeId, clearAll, exportData, importData]);\n \n return (\n <DevContext.Provider value={value}>\n {children}\n </DevContext.Provider>\n );\n}\n\nexport default DevProvider;\n","'use client';\n\nimport React, { useState } from 'react';\nimport { useDevContext } from './DevProvider';\n// Note: CSS is provided by consumer via `import '@process.co/ui/styles'`\n\n/**\n * DevToolbar - Optional toolbar for development\n * Shows current data state and provides controls for import/export/clear\n * Also allows spoofing inferred types for testing components that depend on external field types\n */\nexport function DevToolbar({ className }: { className?: string }) {\n const devCtx = useDevContext();\n const [showData, setShowData] = useState(false);\n const [showTypeEditor, setShowTypeEditor] = useState(false);\n const [newTypeKey, setNewTypeKey] = useState('');\n const [newTypeValue, setNewTypeValue] = useState('');\n \n if (!devCtx) {\n return <div className={className}>DevToolbar: Not inside DevProvider</div>;\n }\n\n const handleAddType = () => {\n if (newTypeKey.trim() && newTypeValue.trim()) {\n devCtx.setInferredType(newTypeKey.trim(), newTypeValue.trim());\n setNewTypeKey('');\n setNewTypeValue('');\n }\n };\n\n const handleRemoveType = (key: string) => {\n devCtx.clearInferredType(key);\n };\n\n const handleClearAllTypes = () => {\n if (confirm('Clear all inferred types?')) {\n devCtx.clearAllInferredTypes();\n }\n };\n \n return (\n <div className={`${className || ''} uii:border uii:rounded-lg uii:p-4 uii:bg-gray-50 dark:uii:bg-gray-900`}>\n <div className=\"uii:flex uii:items-center uii:gap-4 uii:mb-2 uii:flex-wrap\">\n <span className=\"uii:font-semibold uii:text-sm\">🛠️ Dev Mode</span>\n <span className=\"uii:text-xs uii:text-gray-500\">Node: {devCtx.nodeId}</span>\n <button \n onClick={() => setShowData(!showData)}\n className=\"uii:text-xs uii:px-2 uii:py-1 uii:bg-blue-100 dark:uii:bg-blue-900 uii:rounded hover:uii:bg-blue-200\"\n >\n {showData ? 'Hide' : 'Show'} Data\n </button>\n <button \n onClick={() => setShowTypeEditor(!showTypeEditor)}\n className=\"uii:text-xs uii:px-2 uii:py-1 uii:bg-purple-100 dark:uii:bg-purple-900 uii:rounded hover:uii:bg-purple-200\"\n >\n {showTypeEditor ? 'Hide' : 'Spoof'} Types\n </button>\n <button \n onClick={() => {\n const json = devCtx.exportData();\n navigator.clipboard.writeText(json);\n alert('Data copied to clipboard!');\n }}\n className=\"uii:text-xs uii:px-2 uii:py-1 uii:bg-green-100 dark:uii:bg-green-900 uii:rounded hover:uii:bg-green-200\"\n >\n Export\n </button>\n <button \n onClick={() => {\n const json = prompt('Paste JSON data:');\n if (json) devCtx.importData(json);\n }}\n className=\"uii:text-xs uii:px-2 uii:py-1 uii:bg-yellow-100 dark:uii:bg-yellow-900 uii:rounded hover:uii:bg-yellow-200\"\n >\n Import\n </button>\n <button \n onClick={() => {\n if (confirm('Clear all data?')) devCtx.clearAll();\n }}\n className=\"uii:text-xs uii:px-2 uii:py-1 uii:bg-red-100 dark:uii:bg-red-900 uii:rounded hover:uii:bg-red-200\"\n >\n Clear\n </button>\n </div>\n\n {/* Inferred Types Spoofing Section */}\n {showTypeEditor && (\n <div className=\"uii:mt-3 uii:p-3 uii:bg-purple-50 dark:uii:bg-purple-950 uii:rounded-lg uii:border uii:border-purple-200 dark:uii:border-purple-800\">\n <div className=\"uii:text-xs uii:font-medium uii:mb-2 uii:text-purple-700 dark:uii:text-purple-300\">\n Spoof Inferred Types (simulate external field types)\n </div>\n \n {/* Add new type */}\n <div className=\"uii:flex uii:gap-2 uii:mb-2 uii:flex-wrap\">\n <input\n type=\"text\"\n placeholder=\"Field name (e.g., switchExpression)\"\n value={newTypeKey}\n onChange={(e) => setNewTypeKey(e.target.value)}\n className=\"uii:text-xs uii:px-2 uii:py-1 uii:border uii:rounded uii:flex-1 uii:min-w-[150px] uii:bg-white dark:uii:bg-gray-800\"\n />\n <input\n type=\"text\"\n placeholder=\"Type (e.g., string | number)\"\n value={newTypeValue}\n onChange={(e) => setNewTypeValue(e.target.value)}\n onKeyDown={(e) => e.key === 'Enter' && handleAddType()}\n className=\"uii:text-xs uii:px-2 uii:py-1 uii:border uii:rounded uii:flex-1 uii:min-w-[200px] uii:bg-white dark:uii:bg-gray-800\"\n />\n <button\n onClick={handleAddType}\n disabled={!newTypeKey.trim() || !newTypeValue.trim()}\n className=\"uii:text-xs uii:px-3 uii:py-1 uii:bg-purple-500 uii:text-white uii:rounded hover:uii:bg-purple-600 disabled:uii:opacity-50 disabled:uii:cursor-not-allowed\"\n >\n Add\n </button>\n </div>\n\n {/* Current inferred types */}\n {Object.keys(devCtx.inferredTypes).length > 0 && (\n <div className=\"uii:mt-2\">\n <div className=\"uii:flex uii:items-center uii:justify-between uii:mb-1\">\n <span className=\"uii:text-xs uii:text-gray-500\">Current inferred types:</span>\n <button\n onClick={handleClearAllTypes}\n className=\"uii:text-xs uii:px-2 uii:py-0.5 uii:bg-red-100 dark:uii:bg-red-900 uii:text-red-700 dark:uii:text-red-300 uii:rounded hover:uii:bg-red-200\"\n >\n Clear All\n </button>\n </div>\n <div className=\"uii:space-y-1\">\n {Object.entries(devCtx.inferredTypes).map(([key, value]) => (\n value && (\n <div \n key={key}\n className=\"uii:flex uii:items-center uii:gap-2 uii:text-xs uii:bg-white dark:uii:bg-gray-800 uii:px-2 uii:py-1 uii:rounded\"\n >\n <button\n onClick={() => {\n navigator.clipboard.writeText(key);\n }}\n className=\"uii:text-gray-400 hover:uii:text-purple-600 uii:text-xs\"\n title=\"Copy field name\"\n >\n 📋\n </button>\n <span \n className=\"uii:font-mono uii:text-purple-600 dark:uii:text-purple-400 uii:cursor-pointer uii:truncate uii:max-w-[300px]\"\n onClick={() => {\n navigator.clipboard.writeText(key);\n }}\n title={key}\n >\n {key}\n </span>\n <span className=\"uii:text-gray-400\">→</span>\n <span className=\"uii:font-mono uii:text-gray-600 dark:uii:text-gray-300 uii:flex-1 uii:truncate\">{value}</span>\n <button\n onClick={() => handleRemoveType(key)}\n className=\"uii:text-red-500 hover:uii:text-red-700 uii:text-xs\"\n title=\"Remove\"\n >\n ✕\n </button>\n </div>\n )\n ))}\n </div>\n </div>\n )}\n </div>\n )}\n \n {showData && (\n <div className=\"uii:mt-2\">\n <div className=\"uii:text-xs uii:mb-1 uii:font-medium\">Data:</div>\n <pre className=\"uii:text-xs uii:bg-gray-100 dark:uii:bg-gray-800 uii:p-2 uii:rounded uii:overflow-auto uii:max-h-48\">\n {JSON.stringify(devCtx.data, null, 2)}\n </pre>\n <div className=\"uii:text-xs uii:mb-1 uii:mt-2 uii:font-medium\">Inferred Types:</div>\n <pre className=\"uii:text-xs uii:bg-gray-100 dark:uii:bg-gray-800 uii:p-2 uii:rounded uii:overflow-auto uii:max-h-24\">\n {JSON.stringify(devCtx.inferredTypes, null, 2)}\n </pre>\n </div>\n )}\n </div>\n );\n}\n\nexport default DevToolbar;\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/dev/DevProvider.tsx","../../../src/components/dev/DevToolbar.tsx"],"names":["createContext","useContext","useCallback","useState","useMemo","useEffect","value","React"],"mappings":"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","file":"index.cjs","sourcesContent":["'use client';\n\nimport React, { createContext, useContext, useState, useCallback, useEffect, useMemo, type PropsWithChildren } from 'react';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Optional config for slot/case awareness in dev.\n * Each control type can have unique data shape; getSlots interprets the field value and returns slot options.\n */\nexport interface DevSlotConfig {\n /** Property key (field) whose value holds the slot data (e.g. 'switchValue' or 'cases'). When set, getSlots and activeIdPath are applied to data[field]. */\n field?: string;\n /** Path (relative to the field value when field is set) where we store the active slot id in dev. This is mocked in dev only; we do not use the element definition's slots.activeSlotId (e.g. $.results.pathId). */\n activeIdPath: string;\n /**\n * Given the field value (or full data when field is unset), return the list of slots for the Active path/case selector.\n * Enables any control-specific shape (e.g. value.cases.cases, value.branches, etc.).\n */\n getSlots: (fieldValueOrData: Record<string, any>) => { id: string; label: string }[];\n}\n\n/** Preset for slot/case awareness (legacy); prefer deriving from elementDefinition.slots. */\nexport type SlotPreset = 'switch' | 'cases' | 'branches';\n\n// ---------- Path evaluation (match layout.ts semantics for $.data.xxx paths) ----------\n// Definition paths: $.data.cases.cases[*] = collection of slots ([*] = ordinal index).\n// idPath \"$.data.cases.cases[*].id\" => slot i has id collection[i].id (e.g. cases.cases[0].id, cases.cases[1].id).\n// In dev, $.data === data[propertyKey] (e.g. devField); flat shape devField.cases is supported via fallback.\nfunction evaluateSimplePath(obj: any, path: string): any {\n if (!path || !obj) return undefined;\n const cleanPath = path.startsWith('$.') ? path.slice(2) : path.startsWith('$') ? path.slice(1) : path;\n const parts = cleanPath.split('.');\n let current = obj.data ?? obj;\n for (const part of parts) {\n if (current == null) return undefined;\n const cleanPart = part.replace(/\\[\\*\\]$/, '');\n if (cleanPart) current = current[cleanPart];\n }\n return current;\n}\n\nfunction evaluateCollectionPath(obj: any, path: string): any[] {\n if (!path || !obj) return [];\n let cleanPath = path.startsWith('$.') ? path.slice(2) : path.startsWith('$') ? path.slice(1) : path;\n cleanPath = cleanPath.replace(/\\[\\*\\]$/, '');\n const parts = cleanPath.split('.');\n let current = obj.data ?? obj;\n for (const part of parts) {\n if (current == null) return [];\n if (part) current = current[part];\n }\n if (Array.isArray(current)) return current;\n // Fallback: definition may say .cases.cases[*] but dev data has .cases as the array (flat shape).\n // Navigate from obj (root) so \"data.cases\" yields obj.data.cases, not obj.data[\"data\"].\n if (parts.length >= 2) {\n const parentPath = parts.slice(0, -1).join('.');\n let parent: any = obj;\n for (const part of parentPath.split('.')) {\n if (parent == null) return [];\n if (part) parent = parent[part];\n }\n if (Array.isArray(parent)) return parent;\n }\n return [];\n}\n\nfunction evaluateItemPath(item: any, fullPath: string, _index: number): any {\n if (!fullPath || item == null) return undefined;\n const wildcardIndex = fullPath.indexOf('[*]');\n if (wildcardIndex === -1) return evaluateSimplePath(item, fullPath);\n const afterWildcard = fullPath.slice(wildcardIndex + 3);\n if (!afterWildcard || afterWildcard === '') return item;\n const propertyPath = afterWildcard.startsWith('.') ? afterWildcard.slice(1) : afterWildcard;\n const parts = propertyPath.split('.');\n let current = item;\n for (const part of parts) {\n if (current == null) return undefined;\n current = current[part];\n }\n return current;\n}\n\n/** Extract property name from slot paths (e.g. $.data.cases.cases[*] -> \"cases\"). Matches the prop that has the UI (e.g. cases with ui.switch). */\nfunction deriveFieldFromSlotsDefinition(slotsConfig: any[]): string | undefined {\n for (const slot of slotsConfig) {\n const path = slot.path ?? slot.idPath ?? slot.labelPath;\n if (typeof path !== 'string') continue;\n const afterData = path.replace(/^\\$\\.data\\./, '').replace(/^\\$\\./, '');\n const firstSegment = afterData.split('.')[0];\n if (firstSegment) return firstSegment;\n }\n return undefined;\n}\n\n/** From definition props, get the key of the prop that has the given UI (e.g. \"ui.switch\") or that matches the slots field. */\nfunction deriveControlPropertyKey(\n def: ElementDefinition | null | undefined,\n slotsField: string | undefined\n): string | undefined {\n const props = def?.props;\n if (!props) return slotsField;\n const arr = Array.isArray(props) ? props : Object.keys(props).map((k) => ({ key: k, ...(props as any)[k] }));\n const withUi = arr.find((p: any) => p?.ui != null);\n const matchKey = slotsField ? arr.find((p: any) => p?.key === slotsField) : withUi;\n return (matchKey?.key ?? withUi?.key ?? slotsField) as string | undefined;\n}\n\n/**\n * Action/signal definition shape (defineAction): optional slots, initValue, props.\n * Used to derive slotConfig and optionally initialData.\n */\nexport interface ElementDefinition {\n slots?: { slots?: any[]; activeSlotId?: string; [k: string]: any };\n initValue?: Record<string, any>;\n props?: Record<string, any>;\n [k: string]: any;\n}\n\nfunction isDynamicSlot(slot: any): boolean {\n if (slot.type === 'dynamic') return true;\n const path = slot.path ?? slot.idPath ?? slot.labelPath ?? '';\n return typeof path === 'string' && path.includes('[*]');\n}\n\n/** Normalized slot definition (static or dynamic) in definition order. */\ninterface SlotDefinition {\n type: 'static' | 'dynamic';\n path?: string;\n idPath?: string;\n labelPath?: string;\n id?: string;\n label?: string;\n labelPlaceholderValue?: string;\n [k: string]: any;\n}\n\n/** Pass 1: Derive ordered slot definitions from the definition. Preserves order (e.g. static first, dynamic middle, static default). */\nfunction getSlotDefinitions(slotsConfig: any[]): SlotDefinition[] {\n return slotsConfig.map((slot) => ({\n ...slot,\n type: isDynamicSlot(slot) ? 'dynamic' : 'static',\n }));\n}\n\n/** Rewrite definition path when node.data = control value (e.g. devField). $.data.cases.xxx -> $.xxx so the evaluator (which starts at obj.data) only applies the rest, e.g. \"cases[*]\". */\nfunction rewritePathForControlBase(path: string, definitionPropertyKey: string | undefined): string {\n if (!path || !definitionPropertyKey) return path;\n const afterData = path.replace(/^\\$\\.data\\./, '');\n if (!afterData.startsWith(definitionPropertyKey + '.')) return path;\n const rest = afterData.slice(definitionPropertyKey.length + 1);\n return rest ? '$.' + rest : path;\n}\n\n/** Pass 2: Resolve slot definitions against current node data to build the toolbar list. */\nfunction resolveSlotDefinitions(\n slotDefinitions: SlotDefinition[],\n node: { data: any },\n nodeIdForStatic: string,\n definitionPropertyKey: string | undefined\n): { id: string; label: string }[] {\n const result: { id: string; label: string }[] = [];\n for (const slot of slotDefinitions) {\n if (slot.type === 'static') {\n const idPath = slot.idPath != null ? rewritePathForControlBase(slot.idPath, definitionPropertyKey) : undefined;\n const id =\n idPath != null\n ? evaluateSimplePath(node, idPath)\n : slot.id != null\n ? String(slot.id).replace(/\\{\\{ID_GUID\\}\\}/g, nodeIdForStatic)\n : undefined;\n const labelPath = slot.labelPath != null ? rewritePathForControlBase(slot.labelPath, definitionPropertyKey) : undefined;\n const label =\n labelPath != null\n ? evaluateSimplePath(node, labelPath)\n : slot.labelPlaceholderValue ?? slot.label ?? (id ?? '');\n result.push({ id: id ?? '', label: label ?? id ?? '' });\n } else {\n const path = slot.path ?? slot.idPath;\n if (!path) continue;\n const pathRewritten = rewritePathForControlBase(path, definitionPropertyKey);\n const collection = evaluateCollectionPath(node, pathRewritten);\n if (!Array.isArray(collection)) continue;\n const idPath = rewritePathForControlBase(slot.idPath ?? path, definitionPropertyKey);\n const labelPath = rewritePathForControlBase(slot.labelPath ?? path, definitionPropertyKey);\n collection.forEach((item: any, index: number) => {\n const id = evaluateItemPath(item, idPath, index) ?? item?.id ?? String(index);\n const label = evaluateItemPath(item, labelPath, index) ?? item?.label ?? id ?? String(index);\n result.push({ id: String(id), label: String(label) });\n });\n }\n }\n return result;\n}\n\n/** Build getSlots from element definition. devPropertyKey = where control value lives in dev (e.g. devField); definitionPropertyKey = property in definition paths (e.g. cases). So devField = $.data.cases. */\nfunction buildGetSlotsFromDefinition(\n slotDefinitions: SlotDefinition[],\n nodeIdForStatic: string,\n options: { devPropertyKey?: string; definitionPropertyKey?: string }\n): (fullData: Record<string, any>) => { id: string; label: string }[] {\n const { devPropertyKey, definitionPropertyKey } = options;\n return (fullData) => {\n const controlValue =\n devPropertyKey != null && fullData != null ? fullData[devPropertyKey] : fullData;\n const node = { data: controlValue ?? {} };\n return resolveSlotDefinitions(\n slotDefinitions,\n node,\n nodeIdForStatic,\n definitionPropertyKey\n );\n };\n}\n\nfunction deriveSlotConfigFromDefinition(\n def: ElementDefinition | null | undefined,\n nodeId: string,\n propertyKeyFromLoader: string | undefined\n): DevSlotConfig | undefined {\n const slotsRoot = def?.slots;\n const slotsConfig = Array.isArray(slotsRoot) ? slotsRoot : slotsRoot?.slots;\n if (!Array.isArray(slotsConfig) || slotsConfig.length === 0) return undefined;\n const field = deriveFieldFromSlotsDefinition(slotsConfig);\n const definitionPropertyKey = deriveControlPropertyKey(def, field);\n const devPropertyKey = propertyKeyFromLoader ?? definitionPropertyKey;\n const slotDefinitions = getSlotDefinitions(slotsConfig);\n const getSlots = buildGetSlotsFromDefinition(slotDefinitions, nodeId ?? 'dev-node', {\n devPropertyKey,\n definitionPropertyKey,\n });\n return {\n field: devPropertyKey ?? field ?? undefined,\n activeIdPath: 'activeSlotId',\n getSlots,\n };\n}\n\n/**\n * Configuration for the DevProvider\n */\nexport interface DevProviderConfig {\n /** Unique key for localStorage persistence (defaults to 'process-dev') */\n storageKey?: string;\n /** Initial data to populate the store */\n initialData?: Record<string, any>;\n /** Whether to persist to localStorage (default: true) */\n persist?: boolean;\n /** Mock node ID (default: 'dev-node-1') */\n nodeId?: string;\n\n /** Key in dev data that holds the control value (e.g. devField). In the definition, the control is the prop with the UI (e.g. cases with ui.switch); in dev that value lives at data[propertyKey], so devField = $.data.cases. Default: 'devField' */\n propertyKey?: string;\n /** When set, provider builds slotConfig internally; loader does not need to pass slotConfig. */\n slotPreset?: SlotPreset;\n /** Optional. Full slot config; overrides slotPreset and elementDefinition when provided. */\n slotConfig?: DevSlotConfig;\n /**\n * Action or signal definition (defineAction result). Provider derives slotConfig from slots + initValue\n * and uses initValue as initialData when initialData is not provided.\n */\n elementDefinition?: ElementDefinition | null;\n}\n\n/**\n * Context value for development/testing\n */\nexport interface DevContextValue {\n // Node property store\n data: Record<string, any>;\n setProperty: (key: string, value: any) => void;\n getProperty: <T = any>(key: string) => T | undefined;\n \n // Inferred types\n inferredTypes: Record<string, string>;\n setInferredType: (fieldName: string, type: string) => void;\n getInferredType: (fieldName: string) => string | undefined;\n /** Remove an inferred type by field name */\n clearInferredType: (fieldName: string) => void;\n /** Remove all inferred types */\n clearAllInferredTypes: () => void;\n \n // Metadata\n nodeId: string;\n\n /** Current active slot/case id (for elements with slots, e.g. Switch). Null when none selected. Provider state only; not stored in data. */\n activeSlotId: string | null;\n /** Set the active slot/case id. Stored in provider state only; not written to data. */\n setActiveSlotId: (id: string | null) => void;\n /** Slot config when provided to DevProvider (so toolbar can call getSlots(data)). */\n slotConfig: DevSlotConfig | undefined;\n /** Action/signal definition passed to DevProvider (for debugging). */\n elementDefinition: ElementDefinition | null | undefined;\n\n // Utilities\n clearAll: () => void;\n exportData: () => string;\n importData: (json: string) => void;\n}\n\n// ============================================================================\n// Context\n// ============================================================================\n\nexport const DevContext = createContext<DevContextValue | null>(null);\n\n/**\n * Hook to access the dev context for property management\n */\nexport function useDevContext(): DevContextValue | null {\n return useContext(DevContext);\n}\n\n/**\n * Hook that mimics useNodeProperty from the real system\n * Works in both dev mode (with DevProvider) and production (with NodePropertyProvider)\n */\nexport function useNodeProperty<T = any>(fieldName: string): [T | undefined, (value: T) => void] {\n const devCtx = useDevContext();\n \n if (devCtx) {\n // Dev mode - use local state with persistence\n const value = devCtx.getProperty<T>(fieldName);\n const setValue = useCallback((newValue: T) => {\n devCtx.setProperty(fieldName, newValue);\n }, [devCtx, fieldName]);\n \n return [value, setValue];\n }\n \n // Not in dev mode - this is a fallback, real implementation should be provided by host\n console.warn(`useNodeProperty('${fieldName}') called outside of DevProvider - returning undefined`);\n const [localValue, setLocalValue] = useState<T | undefined>(undefined);\n return [localValue, setLocalValue];\n}\n\n/**\n * Hook that mimics useInferredTypes from the real system\n */\nexport function useInferredTypes() {\n const devCtx = useDevContext();\n \n if (devCtx) {\n return {\n inferredTypes: devCtx.inferredTypes,\n setInferredType: devCtx.setInferredType,\n getInferredType: devCtx.getInferredType,\n };\n }\n \n // Not in dev mode - return null (components should handle this gracefully)\n return null;\n}\n\n// ============================================================================\n// Provider\n// ============================================================================\n\n/**\n * DevProvider - Development environment for testing custom UI components\n * \n * Features:\n * - Persists data to localStorage\n * - Provides mock implementations of useNodeProperty and useInferredTypes\n * - Supports import/export of data for testing scenarios\n * \n * Usage:\n * ```tsx\n * import { DevProvider } from '@process.co/ui/dev';\n * \n * function App() {\n * return (\n * <DevProvider \n * storageKey=\"my-component-dev\"\n * initialData={{ switchValue: { cases: [] } }}\n * >\n * <MyCustomComponent fieldName=\"switchValue\" />\n * </DevProvider>\n * );\n * }\n * ```\n */\nexport function DevProvider({\n children, \n storageKey = 'process-dev',\n initialData = {},\n persist = true,\n nodeId = 'dev-node-1',\n propertyKey = 'devField',\n slotPreset,\n slotConfig: slotConfigProp,\n elementDefinition,\n}: PropsWithChildren<DevProviderConfig>) {\n const slotConfig = useMemo<DevSlotConfig | undefined>(\n () =>\n slotConfigProp ??\n deriveSlotConfigFromDefinition(elementDefinition, nodeId, propertyKey),\n [slotConfigProp, elementDefinition, nodeId, propertyKey]\n );\n const effectiveInitialData = useMemo(\n () => (Object.keys(initialData).length > 0 ? initialData : elementDefinition?.initValue ?? {}),\n [initialData, elementDefinition?.initValue]\n );\n\n // ========== Active slot/case (for Switch-like elements) ==========\n const [activeSlotId, setActiveSlotIdState] = useState<string | null>(null);\n\n // ========== Property Store ==========\n const [data, setData] = useState<Record<string, any>>(() => {\n // Try to load from localStorage first\n if (persist && typeof window !== 'undefined') {\n try {\n const stored = localStorage.getItem(`${storageKey}:data`);\n if (stored) {\n return { ...effectiveInitialData, ...JSON.parse(stored) };\n }\n } catch (e) {\n console.warn('DevProvider: Failed to load from localStorage', e);\n }\n }\n return effectiveInitialData;\n });\n \n // ========== Inferred Types ==========\n const [inferredTypes, setInferredTypesState] = useState<Record<string, string>>(() => {\n if (persist && typeof window !== 'undefined') {\n try {\n const stored = localStorage.getItem(`${storageKey}:inferredTypes`);\n if (stored) {\n return JSON.parse(stored);\n }\n } catch (e) {\n console.warn('DevProvider: Failed to load inferredTypes from localStorage', e);\n }\n }\n return {};\n });\n \n // Seed data from elementDefinition.initValue when definition appears and we have no stored data\n useEffect(() => {\n if (!elementDefinition?.initValue || typeof elementDefinition.initValue !== 'object') return;\n setData((prev) => (Object.keys(prev).length === 0 ? { ...elementDefinition!.initValue } : prev));\n }, [elementDefinition?.initValue]);\n\n // ========== Persist to localStorage ==========\n useEffect(() => {\n if (persist && typeof window !== 'undefined') {\n try {\n localStorage.setItem(`${storageKey}:data`, JSON.stringify(data));\n } catch (e) {\n console.warn('DevProvider: Failed to save data to localStorage', e);\n }\n }\n }, [data, storageKey, persist]);\n \n useEffect(() => {\n if (persist && typeof window !== 'undefined') {\n try {\n localStorage.setItem(`${storageKey}:inferredTypes`, JSON.stringify(inferredTypes));\n } catch (e) {\n console.warn('DevProvider: Failed to save inferredTypes to localStorage', e);\n }\n }\n }, [inferredTypes, storageKey, persist]);\n \n // ========== Property Methods ==========\n const setProperty = useCallback((key: string, value: any) => {\n setData(prev => ({ ...prev, [key]: value }));\n }, []);\n\n // setActiveSlotId: dev-only state in the provider; not written to data (so it never appears in Data view or export)\n const setActiveSlotId = useCallback((id: string | null) => {\n setActiveSlotIdState(id);\n }, []);\n \n const getProperty = useCallback(<T = any>(key: string): T | undefined => {\n return data[key] as T | undefined;\n }, [data]);\n \n // ========== Inferred Types Methods ==========\n const setInferredType = useCallback((fieldName: string, type: string) => {\n setInferredTypesState(prev => ({ ...prev, [fieldName]: type }));\n }, []);\n \n const getInferredType = useCallback((fieldName: string): string | undefined => {\n return inferredTypes[fieldName];\n }, [inferredTypes]);\n \n const clearInferredType = useCallback((fieldName: string) => {\n setInferredTypesState(prev => {\n const { [fieldName]: _, ...rest } = prev;\n return rest;\n });\n }, []);\n \n const clearAllInferredTypes = useCallback(() => {\n setInferredTypesState({});\n }, []);\n \n // ========== Utility Methods ==========\n const clearAll = useCallback(() => {\n setData({});\n setInferredTypesState({});\n if (persist && typeof window !== 'undefined') {\n localStorage.removeItem(`${storageKey}:data`);\n localStorage.removeItem(`${storageKey}:inferredTypes`);\n }\n }, [storageKey, persist]);\n \n const exportData = useCallback(() => {\n return JSON.stringify({ data, inferredTypes }, null, 2);\n }, [data, inferredTypes]);\n\n const importData = useCallback((json: string) => {\n try {\n const parsed = JSON.parse(json);\n if (parsed.data) setData(parsed.data);\n if (parsed.inferredTypes) setInferredTypesState(parsed.inferredTypes);\n } catch (e) {\n console.error('DevProvider: Failed to import data', e);\n }\n }, []);\n \n // ========== Context Value ==========\n const value = useMemo<DevContextValue>(() => ({\n data,\n setProperty,\n getProperty,\n inferredTypes,\n setInferredType,\n getInferredType,\n clearInferredType,\n clearAllInferredTypes,\n nodeId,\n activeSlotId,\n setActiveSlotId,\n slotConfig,\n elementDefinition,\n clearAll,\n exportData,\n importData,\n }), [data, setProperty, getProperty, inferredTypes, setInferredType, getInferredType, clearInferredType, clearAllInferredTypes, nodeId, activeSlotId, setActiveSlotId, slotConfig, elementDefinition, clearAll, exportData, importData]);\n \n return (\n <DevContext.Provider value={value}>\n {children}\n </DevContext.Provider>\n );\n}\n\nexport default DevProvider;\n","'use client';\n\nimport React, { useMemo, useState } from 'react';\nimport { useDevContext } from './DevProvider';\n// Note: CSS is provided by consumer via `import '@process.co/ui/styles'`\n\n/**\n * Helper: get slots from data when the shape is { cases: { cases: [...] } } or similar.\n * Use this inside slotConfig.getSlots for Switch-style data, or implement your own for other shapes.\n */\nexport function getSlotsFromCasesData(data: Record<string, any>): { id: string; label: string }[] {\n const list = data?.cases?.cases ?? data?.cases ?? data?.branches;\n if (!Array.isArray(list)) return [];\n return list.map((item: any) => ({\n id: item.id ?? String(item),\n label: item.label ?? item.id ?? String(item),\n }));\n}\n\n/**\n * DevToolbar - Optional toolbar for development\n * Shows current data state and provides controls for import/export/clear\n * Also allows spoofing inferred types and selecting active path/case when slotConfig.getSlots is provided\n */\nexport function DevToolbar({ className }: { className?: string }) {\n const devCtx = useDevContext();\n const [showData, setShowData] = useState(false);\n const [showDefinition, setShowDefinition] = useState(false);\n const [showTypeEditor, setShowTypeEditor] = useState(false);\n const [newTypeKey, setNewTypeKey] = useState('');\n const [newTypeValue, setNewTypeValue] = useState('');\n \n const slots = useMemo(() => {\n if (!devCtx?.slotConfig?.getSlots) return [];\n const data = devCtx.data ?? {};\n return devCtx.slotConfig.getSlots(data);\n }, [devCtx?.slotConfig, devCtx?.data]);\n \n if (!devCtx) {\n return <div className={className}>DevToolbar: Not inside DevProvider</div>;\n }\n\n const handleAddType = () => {\n if (newTypeKey.trim() && newTypeValue.trim()) {\n devCtx.setInferredType(newTypeKey.trim(), newTypeValue.trim());\n setNewTypeKey('');\n setNewTypeValue('');\n }\n };\n\n const handleRemoveType = (key: string) => {\n devCtx.clearInferredType(key);\n };\n\n const handleClearAllTypes = () => {\n if (confirm('Clear all inferred types?')) {\n devCtx.clearAllInferredTypes();\n }\n };\n \n return (\n <div className={`${className || ''} uii:border uii:rounded-lg uii:p-4 uii:bg-gray-50 dark:uii:bg-gray-900`}>\n <div className=\"uii:flex uii:items-center uii:gap-4 uii:mb-2 uii:flex-wrap\">\n <span className=\"uii:font-semibold uii:text-sm \">🛠️ Dev Mode</span>\n <span className=\"uii:text-xs uii:text-gray-500\">Node: {devCtx.nodeId}</span>\n <button \n onClick={() => setShowData(!showData)}\n className=\"uii:text-xs uii:px-2 uii:py-1 uii:bg-blue-100 dark:uii:bg-blue-900 uii:rounded hover:uii:bg-blue-200\"\n >\n {showData ? 'Hide' : 'Show'} Data\n </button>\n <button \n onClick={() => setShowDefinition(!showDefinition)}\n className=\"uii:text-xs uii:px-2 uii:py-1 uii:bg-amber-100 dark:uii:bg-amber-900 uii:rounded hover:uii:bg-amber-200\"\n >\n {showDefinition ? 'Hide' : 'Show'} Definition\n </button>\n <button \n onClick={() => setShowTypeEditor(!showTypeEditor)}\n className=\"uii:text-xs uii:px-2 uii:py-1 uii:bg-purple-100 dark:uii:bg-purple-900 uii:rounded hover:uii:bg-purple-200\"\n >\n {showTypeEditor ? 'Hide' : 'Spoof'} Types\n </button>\n <button \n onClick={() => {\n const json = devCtx.exportData();\n navigator.clipboard.writeText(json);\n alert('Data copied to clipboard!');\n }}\n className=\"uii:text-xs uii:px-2 uii:py-1 uii:bg-green-100 dark:uii:bg-green-900 uii:rounded hover:uii:bg-green-200\"\n >\n Export\n </button>\n <button \n onClick={() => {\n const json = prompt('Paste JSON data:');\n if (json) devCtx.importData(json);\n }}\n className=\"uii:text-xs uii:px-2 uii:py-1 uii:bg-yellow-100 dark:uii:bg-yellow-900 uii:rounded hover:uii:bg-yellow-200\"\n >\n Import\n </button>\n <button \n onClick={() => {\n if (confirm('Clear all data?')) devCtx.clearAll();\n }}\n className=\"uii:text-xs uii:px-2 uii:py-1 uii:bg-red-100 dark:uii:bg-red-900 uii:rounded hover:uii:bg-red-200\"\n >\n Clear\n </button>\n </div>\n\n {/* Active path/case selector when slotConfig.getSlots is provided */}\n {slots.length > 0 && (\n <div className=\"uii:mt-2 uii:p-2 uii:bg-slate-50 dark:uii:bg-slate-900 uii:rounded-lg uii:border uii:border-slate-200 dark:uii:border-slate-700\">\n <div className=\"uii:text-xs uii:font-medium uii:mb-1.5 uii:text-slate-600 dark:uii:text-slate-400\">\n Active path / case\n </div>\n <div className=\"uii:flex uii:flex-wrap uii:gap-1\">\n <button\n type=\"button\"\n onClick={() => devCtx.setActiveSlotId(null)}\n className={`uii:text-xs uii:px-2 uii:py-1 uii:rounded uii:border ${\n devCtx.activeSlotId === null\n ? 'uii:bg-slate-300 dark:uii:bg-slate-600 uii:border-slate-500'\n : 'uii:bg-slate-100 dark:uii:bg-slate-800 uii:border-slate-300 dark:uii:border-slate-600 hover:uii:bg-slate-200'\n }`}\n >\n (none)\n </button>\n {slots.map((slot) => (\n <button\n key={slot.id}\n type=\"button\"\n onClick={() => devCtx.setActiveSlotId(slot.id)}\n className={`uii:text-xs uii:px-2 uii:py-1 uii:rounded uii:border ${\n devCtx.activeSlotId === slot.id\n ? 'uii:bg-blue-200 dark:uii:bg-blue-800 uii:border-blue-500'\n : 'uii:bg-white dark:uii:bg-slate-800 uii:border-slate-300 dark:uii:border-slate-600 hover:uii:bg-slate-100 dark:uii:hover:bg-slate-700'\n }`}\n >\n {slot.label || slot.id}\n </button>\n ))}\n </div>\n </div>\n )}\n\n {/* Inferred Types Spoofing Section */}\n {showTypeEditor && (\n <div className=\"uii:mt-3 uii:p-3 uii:bg-purple-50 dark:uii:bg-purple-950 uii:rounded-lg uii:border uii:border-purple-200 dark:uii:border-purple-800\">\n <div className=\"uii:text-xs uii:font-medium uii:mb-2 uii:text-purple-700 dark:uii:text-purple-300\">\n Spoof Inferred Types (simulate external field types)\n </div>\n \n {/* Add new type */}\n <div className=\"uii:flex uii:gap-2 uii:mb-2 uii:flex-wrap\">\n <input\n type=\"text\"\n placeholder=\"Field name (e.g., switchExpression)\"\n value={newTypeKey}\n onChange={(e) => setNewTypeKey(e.target.value)}\n className=\"uii:text-xs uii:px-2 uii:py-1 uii:border uii:rounded uii:flex-1 uii:min-w-[150px] uii:bg-white dark:uii:bg-gray-800\"\n />\n <input\n type=\"text\"\n placeholder=\"Type (e.g., string | number)\"\n value={newTypeValue}\n onChange={(e) => setNewTypeValue(e.target.value)}\n onKeyDown={(e) => e.key === 'Enter' && handleAddType()}\n className=\"uii:text-xs uii:px-2 uii:py-1 uii:border uii:rounded uii:flex-1 uii:min-w-[200px] uii:bg-white dark:uii:bg-gray-800\"\n />\n <button\n onClick={handleAddType}\n disabled={!newTypeKey.trim() || !newTypeValue.trim()}\n className=\"uii:text-xs uii:px-3 uii:py-1 uii:bg-purple-500 uii:text-white uii:rounded hover:uii:bg-purple-600 disabled:uii:opacity-50 disabled:uii:cursor-not-allowed\"\n >\n Add\n </button>\n </div>\n\n {/* Current inferred types */}\n {Object.keys(devCtx.inferredTypes).length > 0 && (\n <div className=\"uii:mt-2\">\n <div className=\"uii:flex uii:items-center uii:justify-between uii:mb-1\">\n <span className=\"uii:text-xs uii:text-gray-500\">Current inferred types:</span>\n <button\n onClick={handleClearAllTypes}\n className=\"uii:text-xs uii:px-2 uii:py-0.5 uii:bg-red-100 dark:uii:bg-red-900 uii:text-red-700 dark:uii:text-red-300 uii:rounded hover:uii:bg-red-200\"\n >\n Clear All\n </button>\n </div>\n <div className=\"uii:space-y-1\">\n {Object.entries(devCtx.inferredTypes).map(([key, value]) => (\n value && (\n <div \n key={key}\n className=\"uii:flex uii:items-center uii:gap-2 uii:text-xs uii:bg-white dark:uii:bg-gray-800 uii:px-2 uii:py-1 uii:rounded\"\n >\n <button\n onClick={() => {\n navigator.clipboard.writeText(key);\n }}\n className=\"uii:text-gray-400 hover:uii:text-purple-600 uii:text-xs\"\n title=\"Copy field name\"\n >\n 📋\n </button>\n <span \n className=\"uii:font-mono uii:text-purple-600 dark:uii:text-purple-400 uii:cursor-pointer uii:truncate uii:max-w-[300px]\"\n onClick={() => {\n navigator.clipboard.writeText(key);\n }}\n title={key}\n >\n {key}\n </span>\n <span className=\"uii:text-gray-400\">→</span>\n <span className=\"uii:font-mono uii:text-gray-600 dark:uii:text-gray-300 uii:flex-1 uii:truncate\">{value}</span>\n <button\n onClick={() => handleRemoveType(key)}\n className=\"uii:text-red-500 hover:uii:text-red-700 uii:text-xs\"\n title=\"Remove\"\n >\n ✕\n </button>\n </div>\n )\n ))}\n </div>\n </div>\n )}\n </div>\n )}\n \n {showData && (\n <div className=\"uii:mt-2\">\n <div className=\"uii:text-xs uii:mb-1 uii:font-medium\">Data:</div>\n <pre className=\"uii:text-xs uii:bg-gray-100 dark:uii:bg-gray-800 uii:p-2 uii:rounded uii:overflow-auto uii:max-h-48\">\n {JSON.stringify(devCtx.data, null, 2)}\n </pre>\n <div className=\"uii:text-xs uii:mb-1 uii:mt-2 uii:font-medium\">Inferred Types:</div>\n <pre className=\"uii:text-xs uii:bg-gray-100 dark:uii:bg-gray-800 uii:p-2 uii:rounded uii:overflow-auto uii:max-h-24\">\n {JSON.stringify(devCtx.inferredTypes, null, 2)}\n </pre>\n </div>\n )}\n\n {showDefinition && (\n <div className=\"uii:mt-2\">\n <div className=\"uii:text-xs uii:mb-1 uii:font-medium\">Action / signal definition:</div>\n {devCtx.elementDefinition != null ? (\n <pre className=\"uii:text-xs uii:bg-amber-50 dark:uii:bg-amber-950/30 uii:p-2 uii:rounded uii:overflow-auto uii:max-h-64 uii:border uii:border-amber-200 dark:uii:border-amber-800\">\n {JSON.stringify(devCtx.elementDefinition, null, 2)}\n </pre>\n ) : (\n <p className=\"uii:text-xs uii:text-gray-500 uii:italic\">No definition passed to DevProvider.</p>\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport default DevToolbar;\n"]}
|