dynim-core 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +290 -0
- package/dist/builder/ai-prompt-popover.d.ts +26 -0
- package/dist/builder/ai-prompt-popover.d.ts.map +1 -0
- package/dist/builder/ai-prompt-popover.js +180 -0
- package/dist/builder/builder-client.d.ts +48 -0
- package/dist/builder/builder-client.d.ts.map +1 -0
- package/dist/builder/builder-client.js +157 -0
- package/dist/builder/builder.d.ts +41 -0
- package/dist/builder/builder.d.ts.map +1 -0
- package/dist/builder/builder.js +537 -0
- package/dist/builder/bundle-manager.d.ts +60 -0
- package/dist/builder/bundle-manager.d.ts.map +1 -0
- package/dist/builder/bundle-manager.js +357 -0
- package/dist/builder/classifier/classname-analyzer.d.ts +6 -0
- package/dist/builder/classifier/classname-analyzer.d.ts.map +1 -0
- package/dist/builder/classifier/classname-analyzer.js +107 -0
- package/dist/builder/classifier/index.d.ts +20 -0
- package/dist/builder/classifier/index.d.ts.map +1 -0
- package/dist/builder/classifier/index.js +181 -0
- package/dist/builder/classifier/semantic-analyzer.d.ts +24 -0
- package/dist/builder/classifier/semantic-analyzer.d.ts.map +1 -0
- package/dist/builder/classifier/semantic-analyzer.js +94 -0
- package/dist/builder/classifier/size-analyzer.d.ts +7 -0
- package/dist/builder/classifier/size-analyzer.d.ts.map +1 -0
- package/dist/builder/classifier/size-analyzer.js +120 -0
- package/dist/builder/classifier/visual-analyzer.d.ts +6 -0
- package/dist/builder/classifier/visual-analyzer.d.ts.map +1 -0
- package/dist/builder/classifier/visual-analyzer.js +158 -0
- package/dist/builder/client.d.ts +22 -0
- package/dist/builder/client.d.ts.map +1 -0
- package/dist/builder/client.js +54 -0
- package/dist/builder/code-client.d.ts +101 -0
- package/dist/builder/code-client.d.ts.map +1 -0
- package/dist/builder/code-client.js +418 -0
- package/dist/builder/diff-state.d.ts +24 -0
- package/dist/builder/diff-state.d.ts.map +1 -0
- package/dist/builder/diff-state.js +134 -0
- package/dist/builder/dom-scanner.d.ts +20 -0
- package/dist/builder/dom-scanner.d.ts.map +1 -0
- package/dist/builder/dom-scanner.js +102 -0
- package/dist/builder/drag-engine.d.ts +41 -0
- package/dist/builder/drag-engine.d.ts.map +1 -0
- package/dist/builder/drag-engine.js +686 -0
- package/dist/builder/editor-overlays.d.ts +31 -0
- package/dist/builder/editor-overlays.d.ts.map +1 -0
- package/dist/builder/editor-overlays.js +202 -0
- package/dist/builder/editor-state.d.ts +50 -0
- package/dist/builder/editor-state.d.ts.map +1 -0
- package/dist/builder/editor-state.js +132 -0
- package/dist/builder/element-utils.d.ts +43 -0
- package/dist/builder/element-utils.d.ts.map +1 -0
- package/dist/builder/element-utils.js +227 -0
- package/dist/builder/fiber-capture.d.ts +28 -0
- package/dist/builder/fiber-capture.d.ts.map +1 -0
- package/dist/builder/fiber-capture.js +264 -0
- package/dist/builder/freeze-overlay.d.ts +26 -0
- package/dist/builder/freeze-overlay.d.ts.map +1 -0
- package/dist/builder/freeze-overlay.js +213 -0
- package/dist/builder/history-state.d.ts +41 -0
- package/dist/builder/history-state.d.ts.map +1 -0
- package/dist/builder/history-state.js +76 -0
- package/dist/builder/index.d.ts +62 -0
- package/dist/builder/index.d.ts.map +1 -0
- package/dist/builder/index.js +92 -0
- package/dist/builder/state.d.ts +27 -0
- package/dist/builder/state.d.ts.map +1 -0
- package/dist/builder/state.js +50 -0
- package/dist/builder/style-applier.d.ts +61 -0
- package/dist/builder/style-applier.d.ts.map +1 -0
- package/dist/builder/style-applier.js +311 -0
- package/dist/builder/tree-state.d.ts +71 -0
- package/dist/builder/tree-state.d.ts.map +1 -0
- package/dist/builder/tree-state.js +168 -0
- package/dist/builder/widget.d.ts +29 -0
- package/dist/builder/widget.d.ts.map +1 -0
- package/dist/builder/widget.js +181 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/package.json +25 -0
- package/src/styles/base.css +378 -0
- package/src/styles/builder.css +422 -0
- package/src/styles/editor.css +131 -0
- package/src/styles/themes/dark.css +24 -0
- package/src/styles/themes/light.css +21 -0
- package/src/styles/variables.css +63 -0
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DOM scanner - serializes DOM tree for the component tree
|
|
3
|
+
*/
|
|
4
|
+
import { getDomPath, getRelevantStyles, serializeRect, STABLE_ID_ATTR } from './element-utils';
|
|
5
|
+
export function scanDOM(root, options = {}) {
|
|
6
|
+
const { maxDepth = 20, skipIds = ['__editor-freeze-overlay__', '__editor-overlays__', '__inspector-overlay__'] } = options;
|
|
7
|
+
function isSkippedElement(el) {
|
|
8
|
+
if (!el.id)
|
|
9
|
+
return false;
|
|
10
|
+
return skipIds.some(id => el.id === id || el.id.startsWith('__editor'));
|
|
11
|
+
}
|
|
12
|
+
function serializeNode(node, depth) {
|
|
13
|
+
if (depth > maxDepth)
|
|
14
|
+
return null;
|
|
15
|
+
if (isSkippedElement(node))
|
|
16
|
+
return null;
|
|
17
|
+
const rect = node.getBoundingClientRect();
|
|
18
|
+
const domPath = getDomPath(node, root);
|
|
19
|
+
const children = [];
|
|
20
|
+
for (const child of Array.from(node.children)) {
|
|
21
|
+
if (child instanceof HTMLElement) {
|
|
22
|
+
const serialized = serializeNode(child, depth + 1);
|
|
23
|
+
if (serialized)
|
|
24
|
+
children.push(serialized);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const attributes = {};
|
|
28
|
+
for (const attr of Array.from(node.attributes)) {
|
|
29
|
+
attributes[attr.name] = attr.value;
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
domPath,
|
|
33
|
+
tagName: node.tagName.toLowerCase(),
|
|
34
|
+
id: node.id || null,
|
|
35
|
+
className: node.className || '',
|
|
36
|
+
rect: serializeRect(rect),
|
|
37
|
+
computedStyles: getRelevantStyles(node),
|
|
38
|
+
computedDisplay: window.getComputedStyle(node).display,
|
|
39
|
+
hasChildren: node.children.length > 0,
|
|
40
|
+
textContent: (node.textContent || '').trim().slice(0, 100) || null,
|
|
41
|
+
attributes,
|
|
42
|
+
childCount: node.children.length,
|
|
43
|
+
children,
|
|
44
|
+
depth
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
return serializeNode(root, 0);
|
|
48
|
+
}
|
|
49
|
+
export function createDebouncedScanner(root, callback, delay = 100) {
|
|
50
|
+
let timeoutId = null;
|
|
51
|
+
function scan() {
|
|
52
|
+
if (timeoutId) {
|
|
53
|
+
clearTimeout(timeoutId);
|
|
54
|
+
}
|
|
55
|
+
timeoutId = setTimeout(() => {
|
|
56
|
+
const tree = scanDOM(root);
|
|
57
|
+
callback(tree);
|
|
58
|
+
}, delay);
|
|
59
|
+
}
|
|
60
|
+
function cancel() {
|
|
61
|
+
if (timeoutId) {
|
|
62
|
+
clearTimeout(timeoutId);
|
|
63
|
+
timeoutId = null;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return { scan, cancel };
|
|
67
|
+
}
|
|
68
|
+
export function getElementAtPath(path, root) {
|
|
69
|
+
let current = root;
|
|
70
|
+
for (const index of path) {
|
|
71
|
+
if (!current || !current.children[index]) {
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
current = current.children[index];
|
|
75
|
+
}
|
|
76
|
+
return current;
|
|
77
|
+
}
|
|
78
|
+
export function queryElements(selector, root = document.body) {
|
|
79
|
+
try {
|
|
80
|
+
return Array.from(root.querySelectorAll(selector));
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return [];
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
export function generateSelector(element) {
|
|
87
|
+
const tag = element.tagName.toLowerCase();
|
|
88
|
+
if (element.id) {
|
|
89
|
+
return `#${element.id}`;
|
|
90
|
+
}
|
|
91
|
+
const classes = Array.from(element.classList).filter(c => {
|
|
92
|
+
if (!c)
|
|
93
|
+
return false;
|
|
94
|
+
if (/^(flex|grid|p-|m-|w-|h-|bg-|text-|border-|rounded-|shadow-|overflow-|relative|absolute|fixed|hidden|block|inline|items-|justify-|gap-|space-)/.test(c)) {
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
return c.length > 1;
|
|
98
|
+
}).slice(0, 3);
|
|
99
|
+
const classSelector = classes.length > 0 ? '.' + classes.join('.') : '';
|
|
100
|
+
return `${tag}${classSelector}`;
|
|
101
|
+
}
|
|
102
|
+
export { STABLE_ID_ATTR };
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Drag & drop engine - handles all drag detection and drop target calculation
|
|
3
|
+
*/
|
|
4
|
+
import type { EditorState } from './editor-state';
|
|
5
|
+
import type { HistoryState } from './history-state';
|
|
6
|
+
import type { DiffState } from './diff-state';
|
|
7
|
+
import type { Overlays } from './editor-overlays';
|
|
8
|
+
import type { FreezeOverlay } from './freeze-overlay';
|
|
9
|
+
export interface DragEngineConfig {
|
|
10
|
+
contentRoot: HTMLElement;
|
|
11
|
+
editorState: EditorState;
|
|
12
|
+
historyState: HistoryState;
|
|
13
|
+
diffState: DiffState;
|
|
14
|
+
treeState?: unknown;
|
|
15
|
+
overlays: Overlays;
|
|
16
|
+
freezeOverlay?: FreezeOverlay | null;
|
|
17
|
+
onRescan?: () => void;
|
|
18
|
+
}
|
|
19
|
+
export interface DropTarget {
|
|
20
|
+
element: HTMLElement;
|
|
21
|
+
position: string;
|
|
22
|
+
rect: DOMRect;
|
|
23
|
+
parentRect: DOMRect | null;
|
|
24
|
+
}
|
|
25
|
+
export interface DragEngine {
|
|
26
|
+
attach: () => void;
|
|
27
|
+
detach: () => void;
|
|
28
|
+
setFreezeOverlay: (overlay: FreezeOverlay) => void;
|
|
29
|
+
handleMouseDown: (e: MouseEvent, element: HTMLElement | null) => void;
|
|
30
|
+
handleMouseMove: (e: MouseEvent, element: HTMLElement | null) => void;
|
|
31
|
+
handleMouseUp: (e: MouseEvent, element: HTMLElement | null) => void;
|
|
32
|
+
handleMouseLeave: (e: MouseEvent) => void;
|
|
33
|
+
handleClick: (e: MouseEvent, element: HTMLElement | null) => void;
|
|
34
|
+
handleDoubleClick: (e: MouseEvent, element: HTMLElement | null) => void;
|
|
35
|
+
handleWheel: (e: WheelEvent) => void;
|
|
36
|
+
executeUndo: () => void;
|
|
37
|
+
executeRedo: () => void;
|
|
38
|
+
findDropTarget: (x: number, y: number, draggedElement: HTMLElement) => DropTarget | null;
|
|
39
|
+
}
|
|
40
|
+
export declare function createDragEngine(config: DragEngineConfig): DragEngine;
|
|
41
|
+
//# sourceMappingURL=drag-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drag-engine.d.ts","sourceRoot":"","sources":["../../src/builder/drag-engine.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAiB,MAAM,gBAAgB,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAA6B,MAAM,iBAAiB,CAAC;AAC/E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAMtD,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,WAAW,CAAC;IACzB,WAAW,EAAE,WAAW,CAAC;IACzB,YAAY,EAAE,YAAY,CAAC;IAC3B,SAAS,EAAE,SAAS,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,QAAQ,CAAC;IACnB,aAAa,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,WAAW,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,UAAU,EAAE,OAAO,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,gBAAgB,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;IACnD,eAAe,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;IACtE,eAAe,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;IACtE,aAAa,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;IACpE,gBAAgB,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IAC1C,WAAW,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;IAClE,iBAAiB,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;IACxE,WAAW,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IACrC,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,cAAc,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,WAAW,KAAK,UAAU,GAAG,IAAI,CAAC;CAC1F;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,UAAU,CAixBrE"}
|