fractostate 4.2.1 → 4.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.js +61 -4
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/src/devtools/FractoDevTools.css.js +1 -1
- package/dist/cjs/src/devtools/FractoDevTools.js +51 -33
- package/dist/cjs/src/devtools/FractoDevTools.js.map +1 -1
- package/dist/cjs/src/devtools/MapUtils.js +0 -1
- package/dist/cjs/src/devtools/MapUtils.js.map +1 -1
- package/dist/cjs/src/devtools/MentalMap.js +17 -17
- package/dist/cjs/src/devtools/MentalMap.js.map +1 -1
- package/dist/cjs/src/devtools/PluginManager.css.js +10 -0
- package/dist/cjs/src/devtools/PluginManager.css.js.map +1 -0
- package/dist/cjs/src/devtools/PluginManager.js +46 -0
- package/dist/cjs/src/devtools/PluginManager.js.map +1 -0
- package/dist/cjs/src/plugins/storage/StorageAdapter.js +73 -1
- package/dist/cjs/src/plugins/storage/StorageAdapter.js.map +1 -1
- package/dist/cjs/src/proxy.js +4 -0
- package/dist/cjs/src/proxy.js.map +1 -1
- package/dist/cjs/src/store.js +60 -0
- package/dist/cjs/src/store.js.map +1 -1
- package/dist/esm/index.js +57 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/src/devtools/FractoDevTools.css.js +1 -1
- package/dist/esm/src/devtools/FractoDevTools.js +23 -5
- package/dist/esm/src/devtools/FractoDevTools.js.map +1 -1
- package/dist/esm/src/devtools/MapUtils.js +0 -1
- package/dist/esm/src/devtools/MapUtils.js.map +1 -1
- package/dist/esm/src/devtools/PluginManager.css.js +8 -0
- package/dist/esm/src/devtools/PluginManager.css.js.map +1 -0
- package/dist/esm/src/devtools/PluginManager.js +44 -0
- package/dist/esm/src/devtools/PluginManager.js.map +1 -0
- package/dist/esm/src/plugins/storage/StorageAdapter.js +73 -1
- package/dist/esm/src/plugins/storage/StorageAdapter.js.map +1 -1
- package/dist/esm/src/proxy.js +4 -0
- package/dist/esm/src/proxy.js.map +1 -1
- package/dist/esm/src/store.js +60 -0
- package/dist/esm/src/store.js.map +1 -1
- package/dist/index.d.ts +8 -3
- package/dist/plugins.d.ts +1 -1
- package/dist/types-BGbbVpKy.d.ts +176 -0
- package/dist/types-B_uh22Cx.d.ts +181 -0
- package/dist/types-C9aLynPD.d.ts +176 -0
- package/dist/types-dU51pXGw.d.ts +187 -0
- package/package.json +1 -1
package/dist/cjs/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var React = require('react');
|
|
4
4
|
var store = require('./src/store.js');
|
|
5
5
|
var proxy = require('./src/proxy.js');
|
|
6
6
|
|
|
@@ -55,6 +55,62 @@ function defineDerived(source, selector, derivedKey) {
|
|
|
55
55
|
function defineFlow(key, initial, options) {
|
|
56
56
|
return { key, initial, options: options };
|
|
57
57
|
}
|
|
58
|
+
/**
|
|
59
|
+
* Non-hook version of useFlow.
|
|
60
|
+
* Useful for accessing and interacting with flows outside React components (e.g., axios interceptors).
|
|
61
|
+
*/
|
|
62
|
+
function getFlow(def) {
|
|
63
|
+
const { key, initial, options: flowOptions } = def;
|
|
64
|
+
const state = store.store.get(key, initial, flowOptions);
|
|
65
|
+
const boundActions = {};
|
|
66
|
+
const defaultOps = {
|
|
67
|
+
get self() {
|
|
68
|
+
return proxy.createDeepProxy(key, [], store.store.get(key, initial), {
|
|
69
|
+
...flowOptions,
|
|
70
|
+
actions: boundActions,
|
|
71
|
+
actor: flowOptions?.actor,
|
|
72
|
+
});
|
|
73
|
+
},
|
|
74
|
+
get state() {
|
|
75
|
+
return store.store.get(key, initial);
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
const actions = def?.options?.actions || flowOptions?.actions;
|
|
79
|
+
if (actions) {
|
|
80
|
+
for (const [name, fn] of Object.entries(actions)) {
|
|
81
|
+
boundActions[name] = (...args) => fn(...args)(defaultOps);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
const toolbox = {
|
|
85
|
+
ops: defaultOps,
|
|
86
|
+
actions: boundActions,
|
|
87
|
+
_undo: () => store.store.undo(key),
|
|
88
|
+
_redo: () => store.store.redo(key),
|
|
89
|
+
history: store.store.getHistory(key),
|
|
90
|
+
_canUndo: store.store.getHistory(key).length > 1,
|
|
91
|
+
_canRedo: store.store.getRedoStack(key).length > 0,
|
|
92
|
+
_set: (val) => {
|
|
93
|
+
const next = typeof val === "function" ? val(store.store.get(key)) : val;
|
|
94
|
+
store.store.set(key, next, {
|
|
95
|
+
...flowOptions,
|
|
96
|
+
force: true,
|
|
97
|
+
actor: flowOptions?.actor,
|
|
98
|
+
});
|
|
99
|
+
},
|
|
100
|
+
_patch: (val) => {
|
|
101
|
+
const next = typeof val === "function" ? val(store.store.get(key)) : val;
|
|
102
|
+
store.store.set(key, next, {
|
|
103
|
+
...flowOptions,
|
|
104
|
+
force: false,
|
|
105
|
+
actor: flowOptions?.actor,
|
|
106
|
+
});
|
|
107
|
+
},
|
|
108
|
+
_reset: () => store.store.reset(key),
|
|
109
|
+
cf: flowOptions || {},
|
|
110
|
+
isHydrating: !!store.store.__hydrating__?.has(key),
|
|
111
|
+
};
|
|
112
|
+
return [state, toolbox];
|
|
113
|
+
}
|
|
58
114
|
function useFlow(keyOrDef, initial, options) {
|
|
59
115
|
const isDerived = typeof keyOrDef === "object" && "selector" in keyOrDef;
|
|
60
116
|
const isDef = typeof keyOrDef === "object" && "key" in keyOrDef && !isDerived;
|
|
@@ -73,17 +129,17 @@ function useFlow(keyOrDef, initial, options) {
|
|
|
73
129
|
: isDerived
|
|
74
130
|
? keyOrDef.source.options
|
|
75
131
|
: options;
|
|
76
|
-
const [state, setState] =
|
|
132
|
+
const [state, setState] = React.useState(() => {
|
|
77
133
|
const raw = store.store.get(key, initialVal, flowOptions);
|
|
78
134
|
return isDerived ? keyOrDef.selector(raw) : raw;
|
|
79
135
|
});
|
|
80
|
-
|
|
136
|
+
React.useEffect(() => {
|
|
81
137
|
return store.store.subscribe(key, () => {
|
|
82
138
|
const raw = store.store.get(key, initialVal);
|
|
83
139
|
setState(isDerived ? keyOrDef.selector(raw) : raw);
|
|
84
140
|
}, flowOptions?.name || flowOptions?.actor);
|
|
85
141
|
}, [key, isDerived, flowOptions?.name, flowOptions?.actor]);
|
|
86
|
-
const toolbox =
|
|
142
|
+
const toolbox = React.useMemo(() => {
|
|
87
143
|
if (isDerived)
|
|
88
144
|
return {};
|
|
89
145
|
const boundActions = {};
|
|
@@ -139,6 +195,7 @@ function useFlow(keyOrDef, initial, options) {
|
|
|
139
195
|
|
|
140
196
|
exports.defineDerived = defineDerived;
|
|
141
197
|
exports.defineFlow = defineFlow;
|
|
198
|
+
exports.getFlow = getFlow;
|
|
142
199
|
exports.initFlow = initFlow;
|
|
143
200
|
exports.useFlow = useFlow;
|
|
144
201
|
//# sourceMappingURL=index.js.map
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["/* *****************************************************************************\n * FractoSate\n *\n * ACCESS RESTRICTIONS:\n * - This software is exclusively for use by Authorized Personnel of NEHONIX\n * - Intended for Internal Use only within NEHONIX operations\n * - No rights granted to unauthorized individuals or entities\n * - All modifications are works made for hire assigned to NEHONIX\n *\n * PROHIBITED ACTIVITIES:\n * - Copying, distributing, or sublicensing without written permission\n * - Reverse engineering, decompiling, or disassembling\n * - Creating derivative works without explicit authorization\n * - External use or commercial distribution outside NEHONIX\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n * For questions or permissions, contact:\n * NEHONIX Legal Department\n * Email: legal@nehonix.com\n * Website: www.nehonix.com\n ***************************************************************************** */\n\nimport { useState, useEffect, useMemo } from \"react\";\nimport type {\n FlowOperations,\n FlowDefinition,\n DerivedFlowDefinition,\n FlowOptions,\n UseFlowOptions,\n FlowOpsObject,\n} from \"./types\";\nimport { store } from \"./store\";\nimport { createDeepProxy } from \"./proxy\";\n\n// Connect proxy creator to store for internal effects\nstore.setProxyCreator(createDeepProxy);\n\nexport * from \"./types\";\n\n/**\n * Manually initializes a flow to ensure its effects run immediately.\n * This is useful for flows that need to start working before any component subscribes to them.\n */\nexport function initFlow<T, A>(flow: FlowDefinition<T, A>) {\n store.get(flow.key, flow.initial, flow.options);\n}\n\n/**\n * Defines a derived flow that reacts to changes in a source flow.\n * Use this for computed values that shouldn't be manually modified.\n */\nexport function defineDerived<T, R>(\n source: FlowDefinition<T, any>,\n selector: (state: T) => R,\n derivedKey?: string,\n): DerivedFlowDefinition<T, R> {\n return {\n key: derivedKey || `${source.key}_derived_${Date.now()}`,\n source,\n selector,\n };\n}\n\nexport function defineFlow<\n T,\n A extends Record<\n string,\n (...args: any[]) => (ops: FlowOpsObject<T, A>) => any\n >,\n>(\n key: string,\n initial: T,\n options: FlowOptions<NoInfer<T>, A> & {\n actions: A;\n },\n): FlowDefinition<T, A>;\nexport function defineFlow<T>(\n key: string,\n initial: T,\n options?: FlowOptions<NoInfer<T>, {}>,\n): FlowDefinition<T, {}>;\nexport function defineFlow<T, A>(\n key: string,\n initial: T,\n options?: FlowOptions<T> & { actions?: A },\n): FlowDefinition<T, A> {\n return { key, initial, options: options as any };\n}\n\n/**\n * Main hook to consume and interact with a FractoState flow.\n * Returns a tuple containing the current [State, Toolbox].\n */\nexport function useFlow<K extends string, T = any>(\n key: K,\n initial?: T,\n options?: UseFlowOptions<T>,\n): [T, FlowOperations<T, {}>];\n\nexport function useFlow<T, A>(\n def: FlowDefinition<T, A>,\n options?: UseFlowOptions<T>,\n): [T, FlowOperations<T, A>];\n\nexport function useFlow<T, R>(def: DerivedFlowDefinition<T, R>): [R, {}];\n\nexport function useFlow(\n keyOrDef: any,\n initial?: any,\n options?: any,\n): [any, any] {\n const isDerived = typeof keyOrDef === \"object\" && \"selector\" in keyOrDef;\n const isDef = typeof keyOrDef === \"object\" && \"key\" in keyOrDef && !isDerived;\n\n const key = isDef\n ? (keyOrDef as any).key\n : isDerived\n ? (keyOrDef as any).source.key\n : (keyOrDef as string);\n const initialVal = isDef\n ? (keyOrDef as any).initial\n : isDerived\n ? (keyOrDef as any).source.initial\n : initial;\n const flowOptions = isDef\n ? { ...((keyOrDef as any).options || {}), ...(initial || {}) }\n : isDerived\n ? (keyOrDef as any).source.options\n : options;\n\n const [state, setState] = useState(() => {\n const raw = store.get(key, initialVal, flowOptions);\n return isDerived ? (keyOrDef as any).selector(raw) : raw;\n });\n\n useEffect(() => {\n return store.subscribe(\n key,\n () => {\n const raw = store.get(key, initialVal);\n setState(isDerived ? (keyOrDef as any).selector(raw) : raw);\n },\n flowOptions?.name || flowOptions?.actor,\n );\n }, [key, isDerived, flowOptions?.name, flowOptions?.actor]);\n\n const toolbox = useMemo(() => {\n if (isDerived) return {};\n\n const boundActions = {} as any;\n const defaultOps = {\n get self() {\n return createDeepProxy(key, [], store.get(key, initialVal), {\n ...flowOptions,\n actions: boundActions,\n actor: flowOptions?.name || flowOptions?.actor,\n });\n },\n get state() {\n return store.get(key, initialVal);\n },\n };\n\n const actions = (keyOrDef as any)?.options?.actions || flowOptions?.actions;\n\n if (actions) {\n for (const [name, fn] of Object.entries(actions)) {\n boundActions[name] = (...args: any[]) =>\n (fn as Function)(...args)(defaultOps);\n }\n }\n\n return {\n ops: defaultOps,\n actions: boundActions,\n _undo: () => store.undo(key),\n _redo: () => store.redo(key),\n history: store.getHistory(key),\n _canUndo: store.getHistory(key).length > 1,\n _canRedo: store.getRedoStack(key).length > 0,\n _set: (val: any) => {\n const next = typeof val === \"function\" ? val(store.get(key)) : val;\n store.set(key, next, {\n ...flowOptions,\n force: true,\n actor: flowOptions?.name || flowOptions?.actor,\n });\n },\n _patch: (val: any) => {\n const next = typeof val === \"function\" ? val(store.get(key)) : val;\n store.set(key, next, {\n ...flowOptions,\n force: false,\n actor: flowOptions?.name || flowOptions?.actor,\n });\n },\n _reset: () => store.reset(key),\n cf: flowOptions || {},\n isHydrating: !!store.__hydrating__?.has(key),\n };\n }, [key, isDerived, state, flowOptions]);\n\n return [state, toolbox] as any;\n}\n"],"names":["store","createDeepProxy","useState","useEffect","useMemo"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["/* *****************************************************************************\n * FractoSate\n *\n * ACCESS RESTRICTIONS:\n * - This software is exclusively for use by Authorized Personnel of NEHONIX\n * - Intended for Internal Use only within NEHONIX operations\n * - No rights granted to unauthorized individuals or entities\n * - All modifications are works made for hire assigned to NEHONIX\n *\n * PROHIBITED ACTIVITIES:\n * - Copying, distributing, or sublicensing without written permission\n * - Reverse engineering, decompiling, or disassembling\n * - Creating derivative works without explicit authorization\n * - External use or commercial distribution outside NEHONIX\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n * For questions or permissions, contact:\n * NEHONIX Legal Department\n * Email: legal@nehonix.com\n * Website: www.nehonix.com\n ***************************************************************************** */\n\nimport { useState, useEffect, useMemo } from \"react\";\nimport type {\n FlowOperations,\n FlowDefinition,\n DerivedFlowDefinition,\n FlowOptions,\n UseFlowOptions,\n FlowOpsObject,\n} from \"./types\";\nimport { store } from \"./store\";\nimport { createDeepProxy } from \"./proxy\";\n\n// Connect proxy creator to store for internal effects\nstore.setProxyCreator(createDeepProxy);\n\nexport * from \"./types\";\n\n/**\n * Manually initializes a flow to ensure its effects run immediately.\n * This is useful for flows that need to start working before any component subscribes to them.\n */\nexport function initFlow<T, A>(flow: FlowDefinition<T, A>) {\n store.get(flow.key, flow.initial, flow.options);\n}\n\n/**\n * Defines a derived flow that reacts to changes in a source flow.\n * Use this for computed values that shouldn't be manually modified.\n */\nexport function defineDerived<T, R>(\n source: FlowDefinition<T, any>,\n selector: (state: T) => R,\n derivedKey?: string,\n): DerivedFlowDefinition<T, R> {\n return {\n key: derivedKey || `${source.key}_derived_${Date.now()}`,\n source,\n selector,\n };\n}\n\nexport function defineFlow<\n T,\n A extends Record<\n string,\n (...args: any[]) => (ops: FlowOpsObject<T, A>) => any\n >,\n>(\n key: string,\n initial: T,\n options: FlowOptions<NoInfer<T>, A> & {\n actions: A;\n },\n): FlowDefinition<T, A>;\nexport function defineFlow<T>(\n key: string,\n initial: T,\n options?: FlowOptions<NoInfer<T>, {}>,\n): FlowDefinition<T, {}>;\nexport function defineFlow<T, A>(\n key: string,\n initial: T,\n options?: FlowOptions<T> & { actions?: A },\n): FlowDefinition<T, A> {\n return { key, initial, options: options as any };\n}\n\n/**\n * Non-hook version of useFlow.\n * Useful for accessing and interacting with flows outside React components (e.g., axios interceptors).\n */\nexport function getFlow<T, A>(\n def: FlowDefinition<T, A>,\n): [T, FlowOperations<T, A>] {\n const { key, initial, options: flowOptions } = def;\n const state = store.get(key, initial, flowOptions);\n\n const boundActions = {} as any;\n const defaultOps: FlowOpsObject<T, A> = {\n get self() {\n return createDeepProxy<T, A>(key, [], store.get(key, initial), {\n ...flowOptions,\n actions: boundActions,\n actor: flowOptions?.actor,\n });\n },\n get state() {\n return store.get(key, initial);\n },\n };\n\n const actions = (def as any)?.options?.actions || flowOptions?.actions;\n\n if (actions) {\n for (const [name, fn] of Object.entries(actions)) {\n boundActions[name] = (...args: any[]) =>\n (fn as Function)(...args)(defaultOps);\n }\n }\n\n const toolbox: FlowOperations<T, A> = {\n ops: defaultOps,\n actions: boundActions,\n _undo: () => store.undo(key),\n _redo: () => store.redo(key),\n history: store.getHistory(key),\n _canUndo: store.getHistory(key).length > 1,\n _canRedo: store.getRedoStack(key).length > 0,\n _set: (val: any) => {\n const next = typeof val === \"function\" ? val(store.get(key)) : val;\n store.set(key, next, {\n ...flowOptions,\n force: true,\n actor: flowOptions?.actor,\n });\n },\n _patch: (val: any) => {\n const next = typeof val === \"function\" ? val(store.get(key)) : val;\n store.set(key, next, {\n ...flowOptions,\n force: false,\n actor: flowOptions?.actor,\n });\n },\n _reset: () => store.reset(key),\n cf: flowOptions || {},\n isHydrating: !!store.__hydrating__?.has(key),\n };\n\n return [state, toolbox];\n}\n\n/**\n * Main hook to consume and interact with a FractoState flow.\n * Returns a tuple containing the current [State, Toolbox].\n */\nexport function useFlow<K extends string, T = any>(\n key: K,\n initial?: T,\n options?: UseFlowOptions<T>,\n): [T, FlowOperations<T, {}>];\n\nexport function useFlow<T, A>(\n def: FlowDefinition<T, A>,\n options?: UseFlowOptions<T>,\n): [T, FlowOperations<T, A>];\n\nexport function useFlow<T, R>(def: DerivedFlowDefinition<T, R>): [R, {}];\n\nexport function useFlow(\n keyOrDef: any,\n initial?: any,\n options?: any,\n): [any, any] {\n const isDerived = typeof keyOrDef === \"object\" && \"selector\" in keyOrDef;\n const isDef = typeof keyOrDef === \"object\" && \"key\" in keyOrDef && !isDerived;\n\n const key = isDef\n ? (keyOrDef as any).key\n : isDerived\n ? (keyOrDef as any).source.key\n : (keyOrDef as string);\n const initialVal = isDef\n ? (keyOrDef as any).initial\n : isDerived\n ? (keyOrDef as any).source.initial\n : initial;\n const flowOptions = isDef\n ? { ...((keyOrDef as any).options || {}), ...(initial || {}) }\n : isDerived\n ? (keyOrDef as any).source.options\n : options;\n\n const [state, setState] = useState(() => {\n const raw = store.get(key, initialVal, flowOptions);\n return isDerived ? (keyOrDef as any).selector(raw) : raw;\n });\n\n useEffect(() => {\n return store.subscribe(\n key,\n () => {\n const raw = store.get(key, initialVal);\n setState(isDerived ? (keyOrDef as any).selector(raw) : raw);\n },\n flowOptions?.name || flowOptions?.actor,\n );\n }, [key, isDerived, flowOptions?.name, flowOptions?.actor]);\n\n const toolbox = useMemo(() => {\n if (isDerived) return {};\n\n const boundActions = {} as any;\n const defaultOps: FlowOpsObject<any, any> = {\n get self() {\n return createDeepProxy<any, any>(key, [], store.get(key, initialVal), {\n ...flowOptions,\n actions: boundActions,\n actor: flowOptions?.name || flowOptions?.actor,\n });\n },\n get state() {\n return store.get(key, initialVal);\n },\n };\n\n const actions = (keyOrDef as any)?.options?.actions || flowOptions?.actions;\n\n if (actions) {\n for (const [name, fn] of Object.entries(actions)) {\n boundActions[name] = (...args: any[]) =>\n (fn as Function)(...args)(defaultOps);\n }\n }\n\n return {\n ops: defaultOps,\n actions: boundActions,\n _undo: () => store.undo(key),\n _redo: () => store.redo(key),\n history: store.getHistory(key),\n _canUndo: store.getHistory(key).length > 1,\n _canRedo: store.getRedoStack(key).length > 0,\n _set: (val: any) => {\n const next = typeof val === \"function\" ? val(store.get(key)) : val;\n store.set(key, next, {\n ...flowOptions,\n force: true,\n actor: flowOptions?.name || flowOptions?.actor,\n });\n },\n _patch: (val: any) => {\n const next = typeof val === \"function\" ? val(store.get(key)) : val;\n store.set(key, next, {\n ...flowOptions,\n force: false,\n actor: flowOptions?.name || flowOptions?.actor,\n });\n },\n _reset: () => store.reset(key),\n cf: flowOptions || {},\n isHydrating: !!store.__hydrating__?.has(key),\n };\n }, [key, isDerived, state, flowOptions]);\n\n return [state, toolbox] as any;\n}\n"],"names":["store","createDeepProxy","useState","useEffect","useMemo"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var css_248z = ".fracto-devtools-button{align-items:center;backdrop-filter:blur(10px);background:linear-gradient(135deg,#1a1a2e,#16213e);border:2px solid rgba(0,212,255,.4);border-radius:16px;bottom:20px;box-shadow:0 8px 32px rgba(0,212,255,.3),inset 0 0 20px rgba(0,212,255,.2);color:#fff;cursor:pointer;display:flex;font-family:system-ui,-apple-system,sans-serif;font-size:28px;font-weight:700;height:56px;justify-content:center;position:fixed;transition:all .3s cubic-bezier(.4,0,.2,1);width:56px;z-index:9999}.fracto-devtools-button:hover{border-color:rgba(0,212,255,.7);box-shadow:0 12px 48px rgba(0,212,255,.5),inset 0 0 30px rgba(0,212,255,.3);transform:scale(1.1) rotate(5deg)}.fracto-devtools-button.position-right{right:20px}.fracto-devtools-button.position-left{left:20px}.fracto-devtools-panel{backdrop-filter:blur(20px);background:linear-gradient(145deg,rgba(10,10,15,.98),rgba(15,15,25,.98));border:1px solid rgba(0,212,255,.3);border-radius:20px;bottom:20px;box-shadow:0 20px 60px rgba(0,0,0,.5),inset 0 0 1px rgba(0,212,255,.5);color:#e0e0e0;display:flex;flex-direction:column;font-family:system-ui,-apple-system,monospace;height:600px;overflow:hidden;position:fixed;width:420px;z-index:9999}.fracto-devtools-panel.position-right{right:20px}.fracto-devtools-panel.position-left{left:20px}.fracto-devtools-header{align-items:center;background:linear-gradient(135deg,rgba(0,168,255,.1),rgba(0,212,255,.05));border-bottom:1px solid rgba(0,212,255,.2);display:flex;justify-content:space-between;padding:16px 20px}.fracto-devtools-dot{align-items:center;border:none;border-radius:50%;cursor:pointer;display:flex;height:12px;justify-content:center;position:relative;transition:all .2s;width:12px}.fracto-devtools-dot.red{background:#ff5f57;border:1px solid #e0443e}.fracto-devtools-dot.yellow{background:#ffbd2e;border:1px solid #dea123}.fracto-devtools-dot.green{background:#28c940;border:1px solid #1aab29}.fracto-devtools-dot.blue{background:#00d4ff;border:1px solid #00a8ff}.fracto-devtools-dot:hover{filter:brightness(1.1);transform:scale(1.1)}.fracto-devtools-header.mode-indicators{flex-direction:row}.fracto-devtools-header.mode-controls.controls-right{flex-direction:row-reverse}.fracto-devtools-header.mode-controls.controls-right .fracto-devtools-window-controls{margin-left:12px;margin-right:0}.fracto-devtools-header.mode-indicators.controls-left{flex-direction:row-reverse}.fracto-devtools-header.mode-indicators.controls-right{flex-direction:row}.fracto-devtools-window-controls{display:flex;gap:8px;margin-right:12px}.fracto-devtools-window-indicators{align-items:center;display:flex;gap:8px}.mode-indicators .fracto-devtools-dot{opacity:.3;transform:scale(.9);transition:all .2s}.mode-indicators .fracto-devtools-dot.active{animation:ledFlash .2s ease-out;filter:brightness(1.5);opacity:1}.mode-indicators .fracto-devtools-dot.green.active{animation:ledHeartbeat 2s ease-in-out infinite;filter:brightness(1.2);opacity:1}.mode-controls .fracto-devtools-dot{animation:none!important;filter:none;opacity:1;transform:none}@keyframes ledFlash{0%{box-shadow:0 0 0 hsla(0,0%,100%,0);transform:scale(1)}50%{box-shadow:0 0 20px currentColor;transform:scale(1.4)}to{box-shadow:0 0 5px currentColor;transform:scale(1)}}@keyframes ledHeartbeat{0%{box-shadow:0 0 0 rgba(40,201,64,0);opacity:.6;transform:scale(1)}15%{box-shadow:0 0 10px rgba(40,201,64,.6);opacity:1;transform:scale(1.2)}30%{box-shadow:0 0 0 rgba(40,201,64,0);opacity:.6;transform:scale(1)}45%{box-shadow:0 0 10px rgba(40,201,64,.6);opacity:1;transform:scale(1.2)}to{box-shadow:0 0 0 rgba(40,201,64,0);opacity:.6;transform:scale(1)}}.fracto-devtools-dot.red.active{color:#ff5f57}.fracto-devtools-dot.yellow.active{color:#ffbd2e}.fracto-devtools-dot.green.active{color:#28c940}.fracto-devtools-dot.blue.active{color:#00d4ff}.fracto-devtools-close-minimal{background:none;border:none;color:#555;cursor:pointer;font-size:18px;margin-left:8px;padding:0 4px;transition:color .2s}.fracto-devtools-close-minimal:hover{color:#ff5f57}.fracto-devtools-dot:after{color:rgba(0,0,0,.5);content:\"\";font-size:8px;font-weight:700;opacity:0;transition:opacity .2s}.fracto-devtools-dot.red:hover:after{content:\"×\";opacity:1}.fracto-devtools-dot.yellow:hover:after{content:\"−\";opacity:1}.fracto-devtools-dot.green:hover:after{content:\"+\";opacity:1}.fracto-devtools-dot.blue:hover:after{content:\"↗\";font-size:10px;line-height:1;opacity:1}.fracto-devtools-logo.pulse{animation:logoPulse .4s cubic-bezier(.4,0,.2,1)}@keyframes logoPulse{0%{box-shadow:0 4px 12px rgba(0,212,255,.3);transform:scale(1)}50%{box-shadow:0 0 20px rgba(0,212,255,.6);transform:scale(1.1)}to{box-shadow:0 4px 12px rgba(0,212,255,.3);transform:scale(1)}}.fracto-devtools-header-content{align-items:center;display:flex;gap:10px}.fracto-devtools-logo{align-items:center;background:linear-gradient(135deg,#1a1a2e,#16213e);border:1px solid rgba(0,212,255,.4);border-radius:8px;box-shadow:0 4px 12px rgba(0,212,255,.3),inset 0 0 15px rgba(0,212,255,.2);color:#fff;display:flex;font-size:18px;font-weight:700;height:32px;justify-content:center;transition:all .3s;width:32px}.fracto-devtools-title{color:#fff;font-size:16px;font-weight:700;line-height:1.2}.fracto-devtools-title-state{-webkit-text-fill-color:transparent;background:linear-gradient(135deg,#00d4ff,#00a8ff);-webkit-background-clip:text;background-clip:text}.fracto-devtools-subtitle{color:#888;font-size:10px;margin-top:2px}.fracto-devtools-toolbar{background:rgba(0,0,0,.2);border-bottom:1px solid rgba(0,212,255,.15);display:flex;flex-direction:column;gap:10px;padding:12px 16px}.fracto-devtools-search-container{align-items:center;display:flex;position:relative}.fracto-devtools-search-icon{color:#666;font-size:14px;left:12px;pointer-events:none;position:absolute}.fracto-devtools-search{background:rgba(0,0,0,.4);border:1px solid rgba(0,212,255,.2);border-radius:8px;color:#fff;font-family:inherit;font-size:12px;outline:none;padding:8px 12px 8px 36px;transition:all .2s;width:100%}.fracto-devtools-search::placeholder{color:#666}.fracto-devtools-search:focus{background:rgba(0,0,0,.6);border-color:rgba(0,212,255,.5);box-shadow:0 0 0 3px rgba(0,212,255,.1)}.fracto-devtools-clear-search{background:rgba(0,212,255,.1);border:none;border-radius:4px;color:#00d4ff;cursor:pointer;font-size:12px;padding:4px 8px;position:absolute;right:8px;transition:all .2s}.fracto-devtools-clear-search:hover{background:rgba(0,212,255,.2)}.fracto-devtools-filters{align-items:center;display:flex;gap:8px}.fracto-devtools-filter-label{color:#888;font-size:11px}.fracto-devtools-filter-buttons{display:flex;flex-wrap:wrap;gap:6px}.fracto-devtools-filter-button{background:rgba(0,0,0,.4);border:1px solid rgba(0,212,255,.2);border-radius:6px;color:#999;cursor:pointer;font-size:11px;padding:4px 10px;transition:all .2s}.fracto-devtools-filter-button:hover{border-color:rgba(0,212,255,.4);color:#bbb}.fracto-devtools-filter-button.active{background:rgba(0,212,255,.2);border-color:rgba(0,212,255,.5);color:#00d4ff}.fracto-devtools-stats{color:#666;display:flex;font-size:10px;gap:12px}.fracto-devtools-stat{align-items:center;display:flex;gap:4px}.fracto-devtools-stat-value{color:#00d4ff;font-weight:700}.fracto-devtools-content{flex:1;overflow:auto;padding:16px}.fracto-devtools-content::-webkit-scrollbar{width:8px}.fracto-devtools-content::-webkit-scrollbar-track{background:hsla(0,0%,100%,.02);border-radius:4px}.fracto-devtools-content::-webkit-scrollbar-thumb{background:linear-gradient(135deg,#00d4ff,#00a8ff);border-radius:4px}.fracto-devtools-content::-webkit-scrollbar-thumb:hover{background:linear-gradient(135deg,#00e4ff,#00b8ff)}.fracto-devtools-empty{align-items:center;color:#666;display:flex;flex-direction:column;gap:12px;padding:40px 20px;text-align:center}.fracto-devtools-empty-icon{align-items:center;background:linear-gradient(135deg,rgba(0,212,255,.1),rgba(0,168,255,.05));border:1px solid rgba(0,212,255,.2);border-radius:16px;display:flex;font-size:32px;height:64px;justify-content:center;opacity:.5;width:64px}.fracto-devtools-empty-title{font-size:14px;font-weight:500}.fracto-devtools-empty-subtitle{color:#555;font-size:12px}.fracto-devtools-flow{background:rgba(0,0,0,.3);border:1px solid rgba(0,212,255,.2);border-radius:10px;margin-bottom:12px;overflow:hidden;transition:all .2s}.fracto-devtools-flow:hover{border-color:rgba(0,212,255,.5);box-shadow:0 4px 16px rgba(0,212,255,.2)}.fracto-devtools-flow.collapsed .fracto-devtools-flow-content{display:none}.fracto-devtools-flow-header{align-items:center;background:linear-gradient(135deg,rgba(0,212,255,.1),rgba(0,168,255,.05));border-bottom:1px solid rgba(0,212,255,.2);cursor:pointer;display:flex;justify-content:space-between;padding:10px 14px;user-select:none}.fracto-devtools-flow.collapsed .fracto-devtools-flow-header{border-bottom:none}.fracto-devtools-flow-header-left{align-items:center;display:flex;flex:1;gap:8px;min-width:0}.fracto-devtools-flow-collapse-icon{color:#00d4ff;flex-shrink:0;font-size:12px;transition:transform .2s}.fracto-devtools-flow.collapsed .fracto-devtools-flow-collapse-icon{transform:rotate(-90deg)}.fracto-devtools-flow-key{-webkit-text-fill-color:transparent;background:linear-gradient(135deg,#00d4ff,#00a8ff);-webkit-background-clip:text;background-clip:text;font-size:13px;font-weight:700;letter-spacing:.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fracto-devtools-flow-actions{align-items:center;display:flex;gap:6px}.fracto-devtools-flow-badge{background:rgba(0,212,255,.15);border:1px solid rgba(0,212,255,.3);border-radius:4px;color:#00d4ff;font-size:10px;padding:2px 8px}.fracto-devtools-flow-action{align-items:center;background:rgba(0,0,0,.3);border:1px solid rgba(0,212,255,.2);border-radius:4px;color:#666;cursor:pointer;display:flex;font-size:12px;height:24px;justify-content:center;transition:all .2s;width:24px}.fracto-devtools-flow-action:hover{background:rgba(0,212,255,.1);border-color:rgba(0,212,255,.4);color:#00d4ff}.fracto-devtools-flow-content{background-color:rgba(0,0,0,.5);color:#ddd;font-size:11px;line-height:1.6;margin:0;max-height:300px;overflow-x:auto;overflow-y:auto;padding:12px 14px}.fracto-devtools-flow-content::-webkit-scrollbar{height:6px;width:6px}.fracto-devtools-flow-content::-webkit-scrollbar-track{background:hsla(0,0%,100%,.02)}.fracto-devtools-flow-content::-webkit-scrollbar-thumb{background:rgba(0,212,255,.3);border-radius:3px}.fracto-devtools-flow-content::-webkit-scrollbar-thumb:hover{background:rgba(0,212,255,.5)}.fracto-devtools-footer{align-items:center;background:rgba(0,0,0,.3);border-top:1px solid rgba(0,212,255,.2);color:#666;display:flex;font-size:10px;justify-content:space-between;padding:10px 20px}.fracto-devtools-footer-count{-webkit-text-fill-color:transparent;background:linear-gradient(135deg,#00d4ff,#00a8ff);-webkit-background-clip:text;background-clip:text;font-weight:700}.fracto-devtools-no-results{color:#666;padding:40px 20px;text-align:center}.fracto-devtools-no-results-icon{font-size:48px;margin-bottom:12px;opacity:.3}.fracto-devtools-no-results-title{font-size:14px;font-weight:500;margin-bottom:6px}.fracto-devtools-no-results-subtitle{color:#555;font-size:12px}.fracto-devtools-meta-tag{animation:pulse 1.5s infinite;background:rgba(0,212,255,.2);border-radius:4px;color:#00d4ff;font-size:10px;margin-left:8px;padding:1px 4px}@keyframes pulse{0%{opacity:.6}50%{opacity:1}to{opacity:.6}}.fracto-devtools-flow-expanded{background:rgba(0,0,0,.2);border-top:1px solid rgba(0,212,255,.1)}.fracto-devtools-meta-grid{background:rgba(0,212,255,.1);border-bottom:1px solid rgba(0,212,255,.1);display:grid;gap:1px;grid-template-columns:repeat(3,1fr)}.fracto-devtools-meta-item{align-items:center;background:#0a0a0f;display:flex;flex-direction:column;padding:6px 12px}.fracto-devtools-meta-item .label{color:#666;font-size:9px;letter-spacing:.5px;text-transform:uppercase}.fracto-devtools-meta-item .value{color:#00d4ff;font-size:12px;font-weight:700}.fracto-devtools-copy-toast{animation:slideDown .2s ease-out;background:#4caf50;border-radius:6px;box-shadow:0 4px 12px rgba(0,0,0,.5);color:#fff;font-size:10px;font-weight:700;padding:4px 10px;position:absolute;right:14px;top:40px;z-index:10}@keyframes slideDown{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.fracto-devtools-flow-action.copied{background:rgba(76,175,80,.1);border-color:rgba(76,175,80,.5);color:#4caf50}.fracto-devtools-badge-count{align-items:center;animation:badgePop .3s cubic-bezier(.175,.885,.32,1.275);background:#f05;border:2px solid #0a0a0f;border-radius:9px;box-shadow:0 4px 8px rgba(255,0,85,.4);color:#fff;display:flex;font-size:10px;font-weight:900;height:18px;justify-content:center;min-width:18px;padding:0 4px;position:absolute;right:-5px;top:-5px}@keyframes badgePop{0%{transform:scale(0)}to{transform:scale(1)}}.fracto-devtools-button{cursor:grab;user-select:none}.fracto-devtools-button:active{cursor:grabbing}.fracto-devtools-actions{display:flex;gap:4px;margin-left:auto}.fracto-devtools-action-btn{align-items:center;background:rgba(0,212,255,.1);border:1px solid rgba(0,212,255,.3);border-radius:4px;color:#00d4ff;cursor:pointer;display:flex;font-size:14px;height:24px;justify-content:center;transition:all .2s;width:24px}.fracto-devtools-action-btn:hover{background:rgba(0,212,255,.2);border-color:rgba(0,212,255,.5)}.fracto-devtools-action-btn.is-dirty,.fracto-devtools-flow-action.is-dirty{background:rgba(74,222,128,.1)!important;border-color:rgba(74,222,128,.5)!important;box-shadow:0 0 10px rgba(74,222,128,.2);color:#4ade80!important}.fracto-devtools-action-btn.danger.is-dirty{background:rgba(255,77,77,.15)!important;border-color:rgba(255,77,77,.6)!important;box-shadow:0 0 12px rgba(255,77,77,.3);color:#ff4d4d!important}.fracto-devtools-action-btn.danger{background:rgba(255,77,77,.05);border-color:rgba(255,77,77,.1);color:#666}.fracto-devtools-action-btn.danger:hover{background:rgba(255,77,77,.2);border-color:rgba(255,77,77,.5)}.fracto-devtools-panel.is-maximized{border-radius:24px;bottom:20px!important;height:calc(100vh - 40px)!important;left:20px!important;right:20px!important;top:20px!important;width:calc(100vw - 40px)!important}:fullscreen .fracto-devtools-panel.is-maximized{border-radius:0;bottom:0!important;height:100vh!important;left:0!important;right:0!important;top:0!important;width:100vw!important}.fracto-devtools-max-minimal{align-items:center;background:none;border:none;color:#555;cursor:pointer;display:flex;font-size:14px;justify-content:center;margin-left:8px;padding:0 4px;transition:all .2s}.fracto-devtools-max-minimal:hover{color:#00d4ff}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.spinning{animation:spin 2s linear infinite}";
|
|
3
|
+
var css_248z = ".fracto-devtools-button{align-items:center;backdrop-filter:blur(10px);background:linear-gradient(135deg,#1a1a2e,#16213e);border:2px solid rgba(0,212,255,.4);border-radius:16px;bottom:20px;box-shadow:0 8px 32px rgba(0,212,255,.3),inset 0 0 20px rgba(0,212,255,.2);color:#fff;cursor:pointer;display:flex;font-family:system-ui,-apple-system,sans-serif;font-size:28px;font-weight:700;height:56px;justify-content:center;position:fixed;transition:all .3s cubic-bezier(.4,0,.2,1);width:56px;z-index:9999}.fracto-devtools-button:hover{border-color:rgba(0,212,255,.7);box-shadow:0 12px 48px rgba(0,212,255,.5),inset 0 0 30px rgba(0,212,255,.3);transform:scale(1.1) rotate(5deg)}.fracto-devtools-button.position-right{right:20px}.fracto-devtools-button.position-left{left:20px}.fracto-devtools-panel{backdrop-filter:blur(20px);background:linear-gradient(145deg,rgba(10,10,15,.98),rgba(15,15,25,.98));border:1px solid rgba(0,212,255,.3);border-radius:20px;bottom:20px;box-shadow:0 20px 60px rgba(0,0,0,.5),inset 0 0 1px rgba(0,212,255,.5);color:#e0e0e0;display:flex;flex-direction:column;font-family:system-ui,-apple-system,monospace;height:600px;overflow:hidden;position:fixed;width:420px;z-index:9999}.fracto-devtools-panel.position-right{right:20px}.fracto-devtools-panel.position-left{left:20px}.fracto-devtools-header{align-items:center;background:linear-gradient(135deg,rgba(0,168,255,.1),rgba(0,212,255,.05));border-bottom:1px solid rgba(0,212,255,.2);display:flex;justify-content:space-between;padding:16px 20px}.fracto-devtools-dot{align-items:center;border:none;border-radius:50%;cursor:pointer;display:flex;height:12px;justify-content:center;position:relative;transition:all .2s;width:12px}.fracto-devtools-dot.red{background:#ff5f57;border:1px solid #e0443e}.fracto-devtools-dot.yellow{background:#ffbd2e;border:1px solid #dea123}.fracto-devtools-dot.green{background:#28c940;border:1px solid #1aab29}.fracto-devtools-dot.blue{background:#00d4ff;border:1px solid #00a8ff}.fracto-devtools-dot:hover{filter:brightness(1.1);transform:scale(1.1)}.fracto-devtools-header.mode-indicators{flex-direction:row}.fracto-devtools-header.mode-controls.controls-right{flex-direction:row-reverse}.fracto-devtools-header.mode-controls.controls-right .fracto-devtools-window-controls{margin-left:12px;margin-right:0}.fracto-devtools-header.mode-indicators.controls-left{flex-direction:row-reverse}.fracto-devtools-header.mode-indicators.controls-right{flex-direction:row}.fracto-devtools-window-controls{display:flex;gap:8px;margin-right:12px}.fracto-devtools-window-indicators{align-items:center;display:flex;gap:8px}.mode-indicators .fracto-devtools-dot{opacity:.3;transform:scale(.9);transition:all .2s}.mode-indicators .fracto-devtools-dot.active{animation:ledFlash .2s ease-out;filter:brightness(1.5);opacity:1}.mode-indicators .fracto-devtools-dot.green.active{animation:ledHeartbeat 2s ease-in-out infinite;filter:brightness(1.2);opacity:1}.mode-controls .fracto-devtools-dot{animation:none!important;filter:none;opacity:1;transform:none}@keyframes ledFlash{0%{box-shadow:0 0 0 hsla(0,0%,100%,0);transform:scale(1)}50%{box-shadow:0 0 20px currentColor;transform:scale(1.4)}to{box-shadow:0 0 5px currentColor;transform:scale(1)}}@keyframes ledHeartbeat{0%{box-shadow:0 0 0 rgba(40,201,64,0);opacity:.6;transform:scale(1)}15%{box-shadow:0 0 10px rgba(40,201,64,.6);opacity:1;transform:scale(1.2)}30%{box-shadow:0 0 0 rgba(40,201,64,0);opacity:.6;transform:scale(1)}45%{box-shadow:0 0 10px rgba(40,201,64,.6);opacity:1;transform:scale(1.2)}to{box-shadow:0 0 0 rgba(40,201,64,0);opacity:.6;transform:scale(1)}}.fracto-devtools-dot.red.active{color:#ff5f57}.fracto-devtools-dot.yellow.active{color:#ffbd2e}.fracto-devtools-dot.green.active{color:#28c940}.fracto-devtools-dot.blue.active{color:#00d4ff}.fracto-devtools-close-minimal{background:none;border:none;color:#555;cursor:pointer;font-size:18px;margin-left:8px;padding:0 4px;transition:color .2s}.fracto-devtools-close-minimal:hover{color:#ff5f57}.fracto-devtools-dot:after{color:rgba(0,0,0,.5);content:\"\";font-size:8px;font-weight:700;opacity:0;transition:opacity .2s}.fracto-devtools-dot.red:hover:after{content:\"×\";opacity:1}.fracto-devtools-dot.yellow:hover:after{content:\"−\";opacity:1}.fracto-devtools-dot.green:hover:after{content:\"+\";opacity:1}.fracto-devtools-dot.blue:hover:after{content:\"↗\";font-size:10px;line-height:1;opacity:1}.fracto-devtools-logo.pulse{animation:logoPulse .4s cubic-bezier(.4,0,.2,1)}@keyframes logoPulse{0%{box-shadow:0 4px 12px rgba(0,212,255,.3);transform:scale(1)}50%{box-shadow:0 0 20px rgba(0,212,255,.6);transform:scale(1.1)}to{box-shadow:0 4px 12px rgba(0,212,255,.3);transform:scale(1)}}.fracto-devtools-header-content{align-items:center;display:flex;gap:10px}.fracto-devtools-logo{align-items:center;background:linear-gradient(135deg,#1a1a2e,#16213e);border:1px solid rgba(0,212,255,.4);border-radius:8px;box-shadow:0 4px 12px rgba(0,212,255,.3),inset 0 0 15px rgba(0,212,255,.2);color:#fff;display:flex;font-size:18px;font-weight:700;height:32px;justify-content:center;transition:all .3s;width:32px}.fracto-devtools-title{color:#fff;font-size:16px;font-weight:700;line-height:1.2}.fracto-devtools-title-state{-webkit-text-fill-color:transparent;background:linear-gradient(135deg,#00d4ff,#00a8ff);-webkit-background-clip:text;background-clip:text}.fracto-devtools-subtitle{color:#888;font-size:10px;margin-top:2px}.fracto-devtools-toolbar{background:rgba(0,0,0,.2);border-bottom:1px solid rgba(0,212,255,.15);display:flex;flex-direction:column;gap:10px;padding:12px 16px}.fracto-devtools-search-container{align-items:center;display:flex;position:relative}.fracto-devtools-search-icon{color:#666;font-size:14px;left:12px;pointer-events:none;position:absolute}.fracto-devtools-search{background:rgba(0,0,0,.4);border:1px solid rgba(0,212,255,.2);border-radius:8px;color:#fff;font-family:inherit;font-size:12px;outline:none;padding:8px 12px 8px 36px;transition:all .2s;width:100%}.fracto-devtools-search::placeholder{color:#666}.fracto-devtools-search:focus{background:rgba(0,0,0,.6);border-color:rgba(0,212,255,.5);box-shadow:0 0 0 3px rgba(0,212,255,.1)}.fracto-devtools-clear-search{background:rgba(0,212,255,.1);border:none;border-radius:4px;color:#00d4ff;cursor:pointer;font-size:12px;padding:4px 8px;position:absolute;right:8px;transition:all .2s}.fracto-devtools-clear-search:hover{background:rgba(0,212,255,.2)}.fracto-devtools-filters{align-items:center;display:flex;gap:8px}.fracto-devtools-filter-label{color:#888;font-size:11px}.fracto-devtools-filter-buttons{display:flex;flex-wrap:wrap;gap:6px}.fracto-devtools-filter-button{background:rgba(0,0,0,.4);border:1px solid rgba(0,212,255,.2);border-radius:6px;color:#999;cursor:pointer;font-size:11px;padding:4px 10px;transition:all .2s}.fracto-devtools-filter-button:hover{border-color:rgba(0,212,255,.4);color:#bbb}.fracto-devtools-filter-button.active{background:rgba(0,212,255,.2);border-color:rgba(0,212,255,.5);color:#00d4ff}.fracto-devtools-stats{color:#666;display:flex;font-size:10px;gap:12px}.fracto-devtools-stat{align-items:center;display:flex;gap:4px}.fracto-devtools-stat-value{color:#00d4ff;font-weight:700}.fracto-devtools-content{flex:1;overflow:auto;padding:16px}.fracto-devtools-content::-webkit-scrollbar{width:8px}.fracto-devtools-content::-webkit-scrollbar-track{background:hsla(0,0%,100%,.02);border-radius:4px}.fracto-devtools-content::-webkit-scrollbar-thumb{background:linear-gradient(135deg,#00d4ff,#00a8ff);border-radius:4px}.fracto-devtools-content::-webkit-scrollbar-thumb:hover{background:linear-gradient(135deg,#00e4ff,#00b8ff)}.fracto-devtools-empty{align-items:center;color:#666;display:flex;flex-direction:column;gap:12px;padding:40px 20px;text-align:center}.fracto-devtools-empty-icon{align-items:center;background:linear-gradient(135deg,rgba(0,212,255,.1),rgba(0,168,255,.05));border:1px solid rgba(0,212,255,.2);border-radius:16px;display:flex;font-size:32px;height:64px;justify-content:center;opacity:.5;width:64px}.fracto-devtools-empty-title{font-size:14px;font-weight:500}.fracto-devtools-empty-subtitle{color:#555;font-size:12px}.fracto-devtools-flow{background:rgba(0,0,0,.3);border:1px solid rgba(0,212,255,.2);border-radius:10px;margin-bottom:12px;overflow:hidden;transition:all .2s}.fracto-devtools-flow:hover{border-color:rgba(0,212,255,.5);box-shadow:0 4px 16px rgba(0,212,255,.2)}.fracto-devtools-flow.collapsed .fracto-devtools-flow-content{display:none}.fracto-devtools-flow-header{align-items:center;background:linear-gradient(135deg,rgba(0,212,255,.1),rgba(0,168,255,.05));border-bottom:1px solid rgba(0,212,255,.2);cursor:pointer;display:flex;justify-content:space-between;padding:10px 14px;user-select:none}.fracto-devtools-flow.collapsed .fracto-devtools-flow-header{border-bottom:none}.fracto-devtools-flow-header-left{align-items:center;display:flex;flex:1;gap:8px;min-width:0}.fracto-devtools-flow-collapse-icon{color:#00d4ff;flex-shrink:0;font-size:12px;transition:transform .2s}.fracto-devtools-flow.collapsed .fracto-devtools-flow-collapse-icon{transform:rotate(-90deg)}.fracto-devtools-flow-key{-webkit-text-fill-color:transparent;background:linear-gradient(135deg,#00d4ff,#00a8ff);-webkit-background-clip:text;background-clip:text;font-size:13px;font-weight:700;letter-spacing:.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fracto-devtools-flow-actions{align-items:center;display:flex;gap:6px}.fracto-devtools-flow-badge{background:rgba(0,212,255,.15);border:1px solid rgba(0,212,255,.3);border-radius:4px;color:#00d4ff;font-size:10px;padding:2px 8px}.fracto-devtools-flow-action{align-items:center;background:rgba(0,0,0,.3);border:1px solid rgba(0,212,255,.2);border-radius:4px;color:#666;cursor:pointer;display:flex;font-size:12px;height:24px;justify-content:center;transition:all .2s;width:24px}.fracto-devtools-flow-action:hover{background:rgba(0,212,255,.1);border-color:rgba(0,212,255,.4);color:#00d4ff}.fracto-devtools-flow-content{background-color:rgba(0,0,0,.5);color:#ddd;font-size:11px;line-height:1.6;margin:0;max-height:300px;overflow-x:auto;overflow-y:auto;padding:12px 14px}.fracto-devtools-flow-content::-webkit-scrollbar{height:6px;width:6px}.fracto-devtools-flow-content::-webkit-scrollbar-track{background:hsla(0,0%,100%,.02)}.fracto-devtools-flow-content::-webkit-scrollbar-thumb{background:rgba(0,212,255,.3);border-radius:3px}.fracto-devtools-flow-content::-webkit-scrollbar-thumb:hover{background:rgba(0,212,255,.5)}.fracto-devtools-footer{align-items:center;background:rgba(0,0,0,.3);border-top:1px solid rgba(0,212,255,.2);color:#666;display:flex;font-size:10px;justify-content:space-between;padding:10px 20px}.fracto-devtools-footer-count{-webkit-text-fill-color:transparent;background:linear-gradient(135deg,#00d4ff,#00a8ff);-webkit-background-clip:text;background-clip:text;font-weight:700}.fracto-devtools-no-results{color:#666;padding:40px 20px;text-align:center}.fracto-devtools-no-results-icon{font-size:48px;margin-bottom:12px;opacity:.3}.fracto-devtools-no-results-title{font-size:14px;font-weight:500;margin-bottom:6px}.fracto-devtools-no-results-subtitle{color:#555;font-size:12px}.fracto-devtools-meta-tag{animation:pulse 1.5s infinite;background:rgba(0,212,255,.2);border-radius:4px;color:#00d4ff;font-size:10px;margin-left:8px;padding:1px 4px}@keyframes pulse{0%{opacity:.6}50%{opacity:1}to{opacity:.6}}.fracto-devtools-flow-expanded{background:rgba(0,0,0,.2);border-top:1px solid rgba(0,212,255,.1)}.fracto-devtools-meta-grid{background:rgba(0,212,255,.1);border-bottom:1px solid rgba(0,212,255,.1);display:grid;gap:1px;grid-template-columns:repeat(3,1fr)}.fracto-devtools-meta-item{align-items:center;background:#0a0a0f;display:flex;flex-direction:column;padding:6px 12px}.fracto-devtools-meta-item .label{color:#666;font-size:9px;letter-spacing:.5px;text-transform:uppercase}.fracto-devtools-meta-item .value{color:#00d4ff;font-size:12px;font-weight:700}.fracto-devtools-copy-toast{animation:slideDown .2s ease-out;background:#4caf50;border-radius:6px;box-shadow:0 4px 12px rgba(0,0,0,.5);color:#fff;font-size:10px;font-weight:700;padding:4px 10px;position:absolute;right:14px;top:40px;z-index:10}@keyframes slideDown{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.fracto-devtools-flow-action.copied{background:rgba(76,175,80,.1);border-color:rgba(76,175,80,.5);color:#4caf50}.fracto-devtools-badge-count{align-items:center;animation:badgePop .3s cubic-bezier(.175,.885,.32,1.275);background:#f05;border:2px solid #0a0a0f;border-radius:9px;box-shadow:0 4px 8px rgba(255,0,85,.4);color:#fff;display:flex;font-size:10px;font-weight:900;height:18px;justify-content:center;min-width:18px;padding:0 4px;position:absolute;right:-5px;top:-5px}@keyframes badgePop{0%{transform:scale(0)}to{transform:scale(1)}}.fracto-devtools-button{cursor:grab;user-select:none}.fracto-devtools-button:active{cursor:grabbing}.fracto-devtools-actions{display:flex;gap:4px;margin-left:auto}.fracto-devtools-action-btn{align-items:center;background:rgba(0,212,255,.1);border:1px solid rgba(0,212,255,.3);border-radius:4px;color:#00d4ff;cursor:pointer;display:flex;font-size:14px;height:24px;justify-content:center;transition:all .2s;width:24px}.fracto-devtools-action-btn:hover{background:rgba(0,212,255,.2);border-color:rgba(0,212,255,.5)}.fracto-devtools-action-btn.is-dirty,.fracto-devtools-flow-action.is-dirty{background:rgba(74,222,128,.1)!important;border-color:rgba(74,222,128,.5)!important;box-shadow:0 0 10px rgba(74,222,128,.2);color:#4ade80!important}.fracto-devtools-action-btn.danger.is-dirty{background:rgba(255,77,77,.15)!important;border-color:rgba(255,77,77,.6)!important;box-shadow:0 0 12px rgba(255,77,77,.3);color:#ff4d4d!important}.fracto-devtools-action-btn.danger{background:rgba(255,77,77,.05);border-color:rgba(255,77,77,.1);color:#666}.fracto-devtools-action-btn.danger:hover{background:rgba(255,77,77,.2);border-color:rgba(255,77,77,.5)}.fracto-devtools-panel.is-maximized{border-radius:24px;bottom:20px!important;height:calc(100vh - 40px)!important;left:20px!important;right:20px!important;top:20px!important;width:calc(100vw - 40px)!important}:fullscreen .fracto-devtools-panel.is-maximized{border-radius:0;bottom:0!important;height:100vh!important;left:0!important;right:0!important;top:0!important;width:100vw!important}.fracto-devtools-max-minimal{align-items:center;background:none;border:none;color:#555;cursor:pointer;display:flex;font-size:14px;justify-content:center;margin-left:8px;padding:0 4px;transition:all .2s}.fracto-devtools-max-minimal:hover{color:#00d4ff}.fracto-devtools-plugins-section{background:rgba(0,212,255,.03);border-top:1px solid rgba(0,212,255,.1);padding:12px 14px}.fracto-devtools-plugins-header{align-items:center;color:#666;display:flex;font-size:10px;gap:6px;letter-spacing:.5px;margin-bottom:8px;text-transform:uppercase}.fracto-devtools-plugins-list{display:flex;flex-direction:column;gap:8px}.fracto-devtools-plugin-item{align-items:center;background:rgba(0,0,0,.3);border:1px solid rgba(0,212,255,.1);border-radius:6px;display:flex;justify-content:space-between;padding:6px 10px}.fracto-devtools-plugin-name{align-items:center;color:#00d4ff;display:flex;font-size:11px;font-weight:500;gap:6px}.fracto-devtools-plugin-controls{display:flex;gap:4px}.fracto-devtools-plugin-controls button{align-items:center;background:rgba(0,212,255,.1);border:1px solid rgba(0,212,255,.2);border-radius:4px;color:#00d4ff;cursor:pointer;display:flex;height:24px;justify-content:center;transition:all .2s;width:24px}.fracto-devtools-plugin-controls button:hover{background:rgba(0,212,255,.2);border-color:rgba(0,212,255,.4);transform:translateY(-1px)}.fracto-devtools-plugin-controls button.danger{background:rgba(255,95,87,.05);border-color:rgba(255,95,87,.2);color:#ff5f57}.fracto-devtools-plugin-controls button.danger:hover{background:rgba(255,95,87,.15);border-color:rgba(255,95,87,.4)}.spinning{animation:spin 2s linear infinite}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}";
|
|
4
4
|
if (typeof document !== 'undefined') {
|
|
5
5
|
var style = document.createElement('style');
|
|
6
6
|
style.setAttribute('type', 'text/css');
|
|
@@ -1,41 +1,43 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
-
var
|
|
4
|
+
var React = require('react');
|
|
5
5
|
var reactDom = require('react-dom');
|
|
6
6
|
var store = require('../store.js');
|
|
7
7
|
require('./FractoDevTools.css.js');
|
|
8
8
|
require('./MentalMap.css.js');
|
|
9
9
|
var MentalMap = require('./MentalMap.js');
|
|
10
|
+
var PluginManager = require('./PluginManager.js');
|
|
10
11
|
var lucideReact = require('lucide-react');
|
|
11
12
|
|
|
12
13
|
const FractoDevTools = ({ position = "left", initialOpen = false, expanded = false, trafficLightsMode = "indicators", controlsPosition = "right", maximizeMode = "overlay", }) => {
|
|
13
|
-
const [isOpen, setIsOpen] =
|
|
14
|
-
const [isMaximized, setIsMaximized] =
|
|
15
|
-
const [showMentalMap, setShowMentalMap] =
|
|
16
|
-
const [
|
|
17
|
-
const [
|
|
18
|
-
const [
|
|
19
|
-
const [
|
|
20
|
-
const [
|
|
21
|
-
const [
|
|
22
|
-
const [
|
|
23
|
-
const [
|
|
24
|
-
const [
|
|
14
|
+
const [isOpen, setIsOpen] = React.useState(initialOpen);
|
|
15
|
+
const [isMaximized, setIsMaximized] = React.useState(false);
|
|
16
|
+
const [showMentalMap, setShowMentalMap] = React.useState(false);
|
|
17
|
+
const [showPluginManager, setShowPluginManager] = React.useState(false);
|
|
18
|
+
const [snapshot, setSnapshot] = React.useState({});
|
|
19
|
+
const [isInitialized, setIsInitialized] = React.useState(false);
|
|
20
|
+
const [lastUpdate, setLastUpdate] = React.useState(0);
|
|
21
|
+
const [searchQuery, setSearchQuery] = React.useState("");
|
|
22
|
+
const [viewMode, setViewMode] = React.useState("all");
|
|
23
|
+
const [collapsedFlows, setCollapsedFlows] = React.useState(new Set());
|
|
24
|
+
const [copiedKey, setCopiedKey] = React.useState(null);
|
|
25
|
+
const [flowCount, setFlowCount] = React.useState(0);
|
|
26
|
+
const [mentalMapSide, setMentalMapSide] = React.useState(position);
|
|
25
27
|
// Dragging state
|
|
26
|
-
const [coords, setCoords] =
|
|
27
|
-
const [isDragging, setIsDragging] =
|
|
28
|
+
const [coords, setCoords] = React.useState({ x: 20, y: 20 });
|
|
29
|
+
const [isDragging, setIsDragging] = React.useState(false);
|
|
28
30
|
// Indicators state
|
|
29
|
-
const [activeIndicators, setActiveIndicators] =
|
|
31
|
+
const [activeIndicators, setActiveIndicators] = React.useState({
|
|
30
32
|
red: false,
|
|
31
33
|
yellow: false,
|
|
32
34
|
green: false,
|
|
33
35
|
});
|
|
34
36
|
// Refs to manage pending indicator updates
|
|
35
|
-
const indicatorTimeoutsRef =
|
|
36
|
-
const isMountedRef =
|
|
37
|
+
const indicatorTimeoutsRef = React.useRef(new Map());
|
|
38
|
+
const isMountedRef = React.useRef(true);
|
|
37
39
|
// Cleanup on unmount
|
|
38
|
-
|
|
40
|
+
React.useEffect(() => {
|
|
39
41
|
isMountedRef.current = true;
|
|
40
42
|
return () => {
|
|
41
43
|
isMountedRef.current = false;
|
|
@@ -44,7 +46,7 @@ const FractoDevTools = ({ position = "left", initialOpen = false, expanded = fal
|
|
|
44
46
|
indicatorTimeoutsRef.current.clear();
|
|
45
47
|
};
|
|
46
48
|
}, []);
|
|
47
|
-
|
|
49
|
+
React.useEffect(() => {
|
|
48
50
|
const updateCount = () => {
|
|
49
51
|
if (!isMountedRef.current)
|
|
50
52
|
return;
|
|
@@ -53,8 +55,8 @@ const FractoDevTools = ({ position = "left", initialOpen = false, expanded = fal
|
|
|
53
55
|
updateCount();
|
|
54
56
|
return store.store.subscribeGlobal(updateCount);
|
|
55
57
|
}, []);
|
|
56
|
-
|
|
57
|
-
if (!isOpen && !showMentalMap)
|
|
58
|
+
React.useEffect(() => {
|
|
59
|
+
if (!isOpen && !showMentalMap && !showPluginManager)
|
|
58
60
|
return;
|
|
59
61
|
setSnapshot(store.store.getDebugSnapshot());
|
|
60
62
|
const unsub = store.store.subscribeGlobal(() => {
|
|
@@ -64,8 +66,8 @@ const FractoDevTools = ({ position = "left", initialOpen = false, expanded = fal
|
|
|
64
66
|
setLastUpdate(Date.now());
|
|
65
67
|
});
|
|
66
68
|
return unsub;
|
|
67
|
-
}, [isOpen, showMentalMap]);
|
|
68
|
-
|
|
69
|
+
}, [isOpen, showMentalMap, showPluginManager]);
|
|
70
|
+
React.useEffect(() => {
|
|
69
71
|
if (!isInitialized && Object.keys(snapshot).length > 0) {
|
|
70
72
|
if (!expanded) {
|
|
71
73
|
setCollapsedFlows(new Set(Object.keys(snapshot)));
|
|
@@ -74,7 +76,7 @@ const FractoDevTools = ({ position = "left", initialOpen = false, expanded = fal
|
|
|
74
76
|
}
|
|
75
77
|
}, [snapshot, expanded, isInitialized]);
|
|
76
78
|
// Optimized indicator effect - prevents setState during render
|
|
77
|
-
|
|
79
|
+
React.useEffect(() => {
|
|
78
80
|
if (trafficLightsMode !== "indicators")
|
|
79
81
|
return;
|
|
80
82
|
const unsub = store.store.subscribeEvents((event) => {
|
|
@@ -137,13 +139,13 @@ const FractoDevTools = ({ position = "left", initialOpen = false, expanded = fal
|
|
|
137
139
|
setIsMaximized(!isMaximized);
|
|
138
140
|
}
|
|
139
141
|
};
|
|
140
|
-
|
|
142
|
+
React.useEffect(() => {
|
|
141
143
|
const handleFsChange = () => setIsMaximized(!!document.fullscreenElement);
|
|
142
144
|
document.addEventListener("fullscreenchange", handleFsChange);
|
|
143
145
|
return () => document.removeEventListener("fullscreenchange", handleFsChange);
|
|
144
146
|
}, []);
|
|
145
147
|
// Escape key handler
|
|
146
|
-
|
|
148
|
+
React.useEffect(() => {
|
|
147
149
|
const handleEsc = (e) => {
|
|
148
150
|
if (e.key === "Escape") {
|
|
149
151
|
if (showMentalMap) {
|
|
@@ -163,7 +165,7 @@ const FractoDevTools = ({ position = "left", initialOpen = false, expanded = fal
|
|
|
163
165
|
window.addEventListener("keydown", handleEsc);
|
|
164
166
|
return () => window.removeEventListener("keydown", handleEsc);
|
|
165
167
|
}, [isMaximized, showMentalMap]);
|
|
166
|
-
const filteredEntries =
|
|
168
|
+
const filteredEntries = React.useMemo(() => {
|
|
167
169
|
let entries = Object.entries(snapshot);
|
|
168
170
|
if (searchQuery.trim()) {
|
|
169
171
|
const query = searchQuery.toLowerCase();
|
|
@@ -192,7 +194,7 @@ const FractoDevTools = ({ position = "left", initialOpen = false, expanded = fal
|
|
|
192
194
|
}
|
|
193
195
|
return entries;
|
|
194
196
|
}, [snapshot, searchQuery, viewMode]);
|
|
195
|
-
const stats =
|
|
197
|
+
const stats = React.useMemo(() => {
|
|
196
198
|
const entries = Object.values(snapshot);
|
|
197
199
|
return {
|
|
198
200
|
total: entries.length,
|
|
@@ -203,7 +205,7 @@ const FractoDevTools = ({ position = "left", initialOpen = false, expanded = fal
|
|
|
203
205
|
primitives: entries.filter((d) => typeof d.value !== "object" || d.value === null).length,
|
|
204
206
|
};
|
|
205
207
|
}, [snapshot]);
|
|
206
|
-
const isGlobalDirty =
|
|
208
|
+
const isGlobalDirty = React.useMemo(() => {
|
|
207
209
|
return Object.values(snapshot).some((d) => d.meta.isDirty);
|
|
208
210
|
}, [snapshot]);
|
|
209
211
|
const toggleCollapse = (key) => {
|
|
@@ -286,7 +288,7 @@ const FractoDevTools = ({ position = "left", initialOpen = false, expanded = fal
|
|
|
286
288
|
};
|
|
287
289
|
// Stable handler for minimize change.
|
|
288
290
|
// We ensure the main panel stays closed when Mental Map is active/minimized.
|
|
289
|
-
const handleMinimizeChange =
|
|
291
|
+
const handleMinimizeChange = React.useCallback((_min) => {
|
|
290
292
|
setIsOpen(false);
|
|
291
293
|
}, []);
|
|
292
294
|
const mentalMapPortal = showMentalMap &&
|
|
@@ -302,7 +304,14 @@ const FractoDevTools = ({ position = "left", initialOpen = false, expanded = fal
|
|
|
302
304
|
: "All flows are at initial state", children: jsxRuntime.jsx(lucideReact.RotateCcw, { size: 16 }) }), jsxRuntime.jsx("button", { onClick: () => setMentalMapSide((prev) => (prev === "left" ? "right" : "left")), className: "fracto-devtools-action-btn", title: `Map Logo default: ${mentalMapSide}`, children: mentalMapSide === "left" ? (jsxRuntime.jsx(lucideReact.ChevronLeft, { size: 16 })) : (jsxRuntime.jsx(lucideReact.ChevronRight, { size: 16 })) }), jsxRuntime.jsx("button", { onClick: () => {
|
|
303
305
|
setShowMentalMap(true);
|
|
304
306
|
setIsOpen(false);
|
|
305
|
-
}, className: "fracto-devtools-action-btn", style: { fontSize: "16px" }, title: "Mental Map & Traces", children: jsxRuntime.jsx(lucideReact.Activity, { size: 18 }) }), jsxRuntime.jsx("button", { onClick:
|
|
307
|
+
}, className: "fracto-devtools-action-btn", style: { fontSize: "16px" }, title: "Mental Map & Traces", children: jsxRuntime.jsx(lucideReact.Activity, { size: 18 }) }), jsxRuntime.jsx("button", { onClick: () => {
|
|
308
|
+
setShowPluginManager(true);
|
|
309
|
+
setIsOpen(false);
|
|
310
|
+
}, className: "fracto-devtools-action-btn", style: { fontSize: "16px" }, title: "Plugin Architect", children: jsxRuntime.jsx(lucideReact.Database, { size: 18 }) }), jsxRuntime.jsx("button", { onClick: collapseAll, className: "fracto-devtools-action-btn", title: "Collapse All", children: jsxRuntime.jsx(lucideReact.ArrowDownToLine, { size: 16 }) }), jsxRuntime.jsx("button", { onClick: expandAll, className: "fracto-devtools-action-btn", title: "Expand All", children: jsxRuntime.jsx(lucideReact.ArrowUpToLine, { size: 16 }) })] })] })] }), jsxRuntime.jsx("div", { className: "fracto-devtools-content", children: filteredEntries.length === 0 ? (jsxRuntime.jsx("div", { className: "fracto-devtools-empty", children: "No flows detected" })) : (filteredEntries.map(([key, data]) => (jsxRuntime.jsxs("div", { className: `fracto-devtools-flow ${collapsedFlows.has(key) ? "collapsed" : ""}`, children: [jsxRuntime.jsxs("div", { className: "fracto-devtools-flow-header", onClick: () => toggleCollapse(key), children: [jsxRuntime.jsxs("div", { className: "fracto-devtools-flow-header-left", children: [jsxRuntime.jsx("span", { className: "fracto-devtools-flow-collapse-icon", children: collapsedFlows.has(key) ? (jsxRuntime.jsx(lucideReact.ChevronRight, { size: 14 })) : (jsxRuntime.jsx(lucideReact.ChevronDown, { size: 14 })) }), jsxRuntime.jsx("div", { className: "fracto-devtools-flow-key", children: key }), data.meta.plugins && data.meta.plugins.length > 0 && (jsxRuntime.jsx("span", { className: "fracto-devtools-meta-tag", style: {
|
|
311
|
+
background: "rgba(255, 215, 0, 0.1)",
|
|
312
|
+
color: "#ffd700",
|
|
313
|
+
animation: "none",
|
|
314
|
+
}, title: `${data.meta.plugins.length} active plugins`, children: jsxRuntime.jsx(lucideReact.Zap, { size: 10 }) })), data.meta.isDebouncing && (jsxRuntime.jsx("span", { className: "fracto-devtools-meta-tag", title: "Sync pending", children: jsxRuntime.jsx(lucideReact.History, { size: 12, className: "spinning" }) }))] }), jsxRuntime.jsxs("div", { className: "fracto-devtools-flow-actions", children: [jsxRuntime.jsx("span", { className: "fracto-devtools-flow-badge", children: getValueType(data.value) }), jsxRuntime.jsx("button", { className: `fracto-devtools-flow-action ${data.meta.isDirty ? "is-dirty" : ""}`, onClick: (e) => {
|
|
306
315
|
e.stopPropagation();
|
|
307
316
|
handleResetFlow(key, data.meta.isDirty);
|
|
308
317
|
}, title: data.meta.isDirty
|
|
@@ -311,7 +320,16 @@ const FractoDevTools = ({ position = "left", initialOpen = false, expanded = fal
|
|
|
311
320
|
e.stopPropagation();
|
|
312
321
|
handleCopy(key, data.value);
|
|
313
322
|
}, children: copiedKey === key ? (jsxRuntime.jsx(lucideReact.Zap, { size: 14 })) : (jsxRuntime.jsx(lucideReact.Monitor, { size: 14 })) })] })] }), !collapsedFlows.has(key) && (jsxRuntime.jsxs("div", { className: "fracto-devtools-flow-expanded", children: [jsxRuntime.jsxs("div", { className: "fracto-devtools-meta-grid", children: [jsxRuntime.jsxs("div", { className: "fracto-devtools-meta-item", children: [jsxRuntime.jsx("span", { className: "label", children: "Listeners:" }), jsxRuntime.jsx("span", { className: "value", children: data.meta.listeners })] }), jsxRuntime.jsxs("div", { className: "fracto-devtools-meta-item", children: [jsxRuntime.jsx("span", { className: "label", children: "History:" }), jsxRuntime.jsx("span", { className: "value", children: data.meta.historySize })] }), jsxRuntime.jsxs("div", { className: "fracto-devtools-meta-item", children: [jsxRuntime.jsx("span", { className: "label", children: "Redo:" }), jsxRuntime.jsx("span", { className: "value", children: data.meta.redoSize })] })] }), jsxRuntime.jsx("pre", { className: "fracto-devtools-flow-content", children: JSON.stringify(data.value, null, 2) })] })), copiedKey === key && (jsxRuntime.jsx("div", { className: "fracto-devtools-copy-toast", children: "Copied!" }))] }, key)))) }), jsxRuntime.jsxs("div", { className: "fracto-devtools-footer", children: [jsxRuntime.jsx("span", { children: "FractoState Engine v5" }), jsxRuntime.jsxs("span", { className: "fracto-devtools-footer-count", children: [filteredEntries.length, " items"] })] })] }));
|
|
314
|
-
|
|
323
|
+
const pluginManagerPortal = showPluginManager &&
|
|
324
|
+
reactDom.createPortal(jsxRuntime.jsx(PluginManager.PluginManager, { snapshot: snapshot, onClose: () => {
|
|
325
|
+
setShowPluginManager(false);
|
|
326
|
+
setIsOpen(true);
|
|
327
|
+
} }), document.body);
|
|
328
|
+
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [isOpen
|
|
329
|
+
? panelContent
|
|
330
|
+
: showMentalMap || showPluginManager
|
|
331
|
+
? null
|
|
332
|
+
: buttonContent, mentalMapPortal, pluginManagerPortal] }));
|
|
315
333
|
};
|
|
316
334
|
|
|
317
335
|
exports.FractoDevTools = FractoDevTools;
|