@colossal-sh/visual-editor 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,13 @@
1
+ /**
2
+ * React Fiber bridge – walks React's internal fiber tree to identify
3
+ * which component rendered a given DOM element.
4
+ */
5
+ export interface ComponentInfo {
6
+ displayName: string;
7
+ }
8
+ export declare function getComponentInfo(element: Element): ComponentInfo | null;
9
+ export declare function getElementSource(element: Element): {
10
+ fileName: string;
11
+ lineNumber: number;
12
+ } | null;
13
+ //# sourceMappingURL=fiber.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fiber.d.ts","sourceRoot":"","sources":["../src/fiber.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,aAAa;IAC7B,WAAW,EAAE,MAAM,CAAC;CACpB;AAwCD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,aAAa,GAAG,IAAI,CAgBvE;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG;IACnD,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACnB,GAAG,IAAI,CAWP"}
package/dist/fiber.js ADDED
@@ -0,0 +1,67 @@
1
+ /**
2
+ * React Fiber bridge – walks React's internal fiber tree to identify
3
+ * which component rendered a given DOM element.
4
+ */
5
+ // React fiber tags
6
+ const FUNCTION_COMPONENT = 0;
7
+ const CLASS_COMPONENT = 1;
8
+ const FORWARD_REF = 11;
9
+ const MEMO_COMPONENT = 14;
10
+ const FRAGMENT = 7;
11
+ const CONTEXT_PROVIDER = 10;
12
+ const CONTEXT_CONSUMER = 9;
13
+ const COMPONENT_TAGS = new Set([
14
+ FUNCTION_COMPONENT,
15
+ CLASS_COMPONENT,
16
+ FORWARD_REF,
17
+ MEMO_COMPONENT,
18
+ ]);
19
+ const STRUCTURAL_TAGS = new Set([FRAGMENT, CONTEXT_PROVIDER, CONTEXT_CONSUMER]);
20
+ function getFiber(element) {
21
+ for (const key in element) {
22
+ if (key.startsWith("__reactFiber$") ||
23
+ key.startsWith("__reactContainer$")) {
24
+ return element[key];
25
+ }
26
+ }
27
+ return null;
28
+ }
29
+ function getDisplayName(fiber) {
30
+ if (!(fiber === null || fiber === void 0 ? void 0 : fiber.type))
31
+ return "Unknown";
32
+ if (typeof fiber.type === "function") {
33
+ return fiber.type.displayName || fiber.type.name || "Anonymous";
34
+ }
35
+ if (typeof fiber.type === "string")
36
+ return fiber.type;
37
+ return "Unknown";
38
+ }
39
+ export function getComponentInfo(element) {
40
+ const fiber = getFiber(element);
41
+ if (!fiber)
42
+ return null;
43
+ let current = fiber.return;
44
+ while (current) {
45
+ if (COMPONENT_TAGS.has(current.tag) && !STRUCTURAL_TAGS.has(current.tag)) {
46
+ const name = getDisplayName(current);
47
+ if (name && name !== "Anonymous" && name !== "Unknown") {
48
+ return { displayName: name };
49
+ }
50
+ }
51
+ current = current.return;
52
+ }
53
+ return null;
54
+ }
55
+ export function getElementSource(element) {
56
+ let el = element;
57
+ while (el) {
58
+ const file = el.getAttribute("data-source-file");
59
+ const line = el.getAttribute("data-source-line");
60
+ if (file && line) {
61
+ return { fileName: file, lineNumber: parseInt(line, 10) };
62
+ }
63
+ el = el.parentElement;
64
+ }
65
+ return null;
66
+ }
67
+ //# sourceMappingURL=fiber.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fiber.js","sourceRoot":"","sources":["../src/fiber.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,mBAAmB;AACnB,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAC7B,MAAM,eAAe,GAAG,CAAC,CAAC;AAC1B,MAAM,WAAW,GAAG,EAAE,CAAC;AACvB,MAAM,cAAc,GAAG,EAAE,CAAC;AAC1B,MAAM,QAAQ,GAAG,CAAC,CAAC;AACnB,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAC5B,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAE3B,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;IAC9B,kBAAkB;IAClB,eAAe;IACf,WAAW;IACX,cAAc;CACd,CAAC,CAAC;AACH,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,CAAC,CAAC;AAEhF,SAAS,QAAQ,CAAC,OAAgB;IACjC,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC3B,IACC,GAAG,CAAC,UAAU,CAAC,eAAe,CAAC;YAC/B,GAAG,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAClC,CAAC;YACF,OAAQ,OAAe,CAAC,GAAG,CAAC,CAAC;QAC9B,CAAC;IACF,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED,SAAS,cAAc,CAAC,KAAU;IACjC,IAAI,CAAC,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,IAAI,CAAA;QAAE,OAAO,SAAS,CAAC;IACnC,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QACtC,OAAO,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,WAAW,CAAC;IACjE,CAAC;IACD,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC;IACtD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAgB;IAChD,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAChC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,IAAI,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC;IAC3B,OAAO,OAAO,EAAE,CAAC;QAChB,IAAI,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1E,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;YACrC,IAAI,IAAI,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACxD,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;YAC9B,CAAC;QACF,CAAC;QACD,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAC1B,CAAC;IAED,OAAO,IAAI,CAAC;AACb,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAgB;IAIhD,IAAI,EAAE,GAAmB,OAAO,CAAC;IACjC,OAAO,EAAE,EAAE,CAAC;QACX,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC;QACjD,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;YAClB,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC;QAC3D,CAAC;QACD,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC;IACvB,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { PageEditor } from "./page-editor";
2
+ export type { PageEditorProps } from "./page-editor";
3
+ export type { ComponentMeta, ComponentRegistry, FieldLabels, VariantOption } from "./types";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export { PageEditor } from "./page-editor";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { ComponentRegistry, FieldLabels } from "./types";
2
+ export interface PageEditorProps {
3
+ children: React.ReactNode;
4
+ registry?: ComponentRegistry;
5
+ fieldLabels?: FieldLabels;
6
+ }
7
+ export declare function PageEditor({ children, registry, fieldLabels }: PageEditorProps): import("react/jsx-runtime").JSX.Element;
8
+ //# sourceMappingURL=page-editor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-editor.d.ts","sourceRoot":"","sources":["../src/page-editor.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE9D,MAAM,WAAW,eAAe;IAC/B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,WAAW,CAAC,EAAE,WAAW,CAAC;CAC1B;AAUD,wBAAgB,UAAU,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,eAAe,2CAkC9E"}
@@ -0,0 +1,38 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useState } from "react";
3
+ function sendToParent(message) {
4
+ try {
5
+ if (window.parent && window.parent !== window) {
6
+ window.parent.postMessage(message, "*");
7
+ }
8
+ }
9
+ catch (_a) { }
10
+ }
11
+ export function PageEditor({ children, registry, fieldLabels }) {
12
+ const [isEditing, setIsEditing] = useState(false);
13
+ // Toggle edit mode via postMessage from parent
14
+ useEffect(() => {
15
+ const handler = (e) => {
16
+ var _a;
17
+ if (((_a = e.data) === null || _a === void 0 ? void 0 : _a.type) === "EDITOR_TOGGLE") {
18
+ setIsEditing(e.data.active);
19
+ }
20
+ };
21
+ window.addEventListener("message", handler);
22
+ return () => window.removeEventListener("message", handler);
23
+ }, []);
24
+ const handleFieldCommit = useCallback((entity, id, field, value) => {
25
+ sendToParent({ type: "EDITOR_FIELD_COMMIT", entity, id, field, value });
26
+ }, []);
27
+ return (_jsxs(_Fragment, { children: [children, isEditing && (_jsx(DevEditor, { onFieldCommit: handleFieldCommit, registry: registry, fieldLabels: fieldLabels }))] }));
28
+ }
29
+ function DevEditor(props) {
30
+ const [Editor, setEditor] = useState(null);
31
+ useEffect(() => {
32
+ import("./visual-editor").then((m) => setEditor(() => m.default));
33
+ }, []);
34
+ if (!Editor)
35
+ return null;
36
+ return _jsx(Editor, Object.assign({}, props));
37
+ }
38
+ //# sourceMappingURL=page-editor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-editor.js","sourceRoot":"","sources":["../src/page-editor.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AASzD,SAAS,YAAY,CAAC,OAAgC;IACrD,IAAI,CAAC;QACJ,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC/C,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACzC,CAAC;IACF,CAAC;IAAC,WAAM,CAAC,CAAA,CAAC;AACX,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAmB;IAC9E,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAElD,+CAA+C;IAC/C,SAAS,CAAC,GAAG,EAAE;QACd,MAAM,OAAO,GAAG,CAAC,CAAe,EAAE,EAAE;;YACnC,IAAI,CAAA,MAAA,CAAC,CAAC,IAAI,0CAAE,IAAI,MAAK,eAAe,EAAE,CAAC;gBACtC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC7B,CAAC;QACF,CAAC,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC5C,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC7D,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,iBAAiB,GAAG,WAAW,CACpC,CAAC,MAAc,EAAE,EAAU,EAAE,KAAa,EAAE,KAAa,EAAE,EAAE;QAC5D,YAAY,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACzE,CAAC,EACD,EAAE,CACF,CAAC;IAEF,OAAO,CACN,8BACE,QAAQ,EAER,SAAS,IAAI,CACb,KAAC,SAAS,IACT,aAAa,EAAE,iBAAiB,EAChC,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,WAAW,GACvB,CACF,IACC,CACH,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,KAIlB;IACA,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAA2C,IAAI,CAAC,CAAC;IAErF,SAAS,CAAC,GAAG,EAAE;QACd,MAAM,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACnE,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,OAAO,KAAC,MAAM,oBAAK,KAAK,EAAI,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,15 @@
1
+ export interface VariantOption {
2
+ value: string;
3
+ label: string;
4
+ }
5
+ export interface ComponentMeta {
6
+ label: string;
7
+ sourceFile?: string;
8
+ variants?: {
9
+ propName: string;
10
+ options: VariantOption[];
11
+ };
12
+ }
13
+ export type ComponentRegistry = Record<string, ComponentMeta>;
14
+ export type FieldLabels = Record<string, Record<string, string>>;
15
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,aAAa,EAAE,CAAA;KAAE,CAAC;CAC1D;AAED,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AAE9D,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ import type { ComponentRegistry, FieldLabels } from "./types";
2
+ export interface VisualEditorProps {
3
+ onFieldCommit?: (entity: string, id: string, field: string, value: string) => void;
4
+ registry?: ComponentRegistry;
5
+ fieldLabels?: FieldLabels;
6
+ }
7
+ export default function VisualEditor({ onFieldCommit, registry, fieldLabels, }: VisualEditorProps): import("react/jsx-runtime").JSX.Element;
8
+ //# sourceMappingURL=visual-editor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visual-editor.d.ts","sourceRoot":"","sources":["../src/visual-editor.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAmI9D,MAAM,WAAW,iBAAiB;IACjC,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnF,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,WAAW,CAAC,EAAE,WAAW,CAAC;CAC1B;AAED,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EACpC,aAAa,EACb,QAAa,EACb,WAAgB,GAChB,EAAE,iBAAiB,2CAkanB"}
@@ -0,0 +1,440 @@
1
+ import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
2
+ /**
3
+ * Visual Editor — inline editing overlay.
4
+ *
5
+ * Hover → outline, click → select, dblclick → contentEditable.
6
+ * Variant picker sends prop changes to the Vite dev server
7
+ * which rewrites source files (HMR picks up the change).
8
+ */
9
+ import { useEffect, useRef, useState, useCallback } from "react";
10
+ import { X, AlignLeft, AlignCenter, AlignRight, Minus, Plus, Check, } from "lucide-react";
11
+ import { getElementSource, getComponentInfo } from "./fiber";
12
+ // ── constants ────────────────────────────────────────────────
13
+ const HIGHLIGHT = "#1570EF";
14
+ const TW_ALIGNS = ["text-left", "text-center", "text-right"];
15
+ const TW_SIZES = [
16
+ { label: "xs", cls: "text-xs", px: 12 },
17
+ { label: "sm", cls: "text-sm", px: 14 },
18
+ { label: "base", cls: "text-base", px: 16 },
19
+ { label: "lg", cls: "text-lg", px: 18 },
20
+ { label: "xl", cls: "text-xl", px: 20 },
21
+ { label: "2xl", cls: "text-2xl", px: 24 },
22
+ { label: "3xl", cls: "text-3xl", px: 30 },
23
+ { label: "4xl", cls: "text-4xl", px: 36 },
24
+ { label: "5xl", cls: "text-5xl", px: 48 },
25
+ ];
26
+ const TW_WEIGHTS = [
27
+ { label: "Light", cls: "font-light", value: "300" },
28
+ { label: "Normal", cls: "font-normal", value: "400" },
29
+ { label: "Medium", cls: "font-medium", value: "500" },
30
+ { label: "Semi", cls: "font-semibold", value: "600" },
31
+ { label: "Bold", cls: "font-bold", value: "700" },
32
+ ];
33
+ const ALL_SIZE_CLASSES = TW_SIZES.map((s) => s.cls);
34
+ const ALL_WEIGHT_CLASSES = TW_WEIGHTS.map((w) => w.cls);
35
+ const EDITOR_CSS = /* css */ `
36
+ [data-editor-active] * { cursor: default !important; }
37
+ [data-editor-active] [contenteditable="true"],
38
+ [data-editor-active] [contenteditable="true"] * { cursor: text !important; }
39
+
40
+ [data-editor-hovered] {
41
+ outline: 2px solid ${HIGHLIGHT} !important;
42
+ outline-offset: 0px !important;
43
+ }
44
+ [data-editor-selected] {
45
+ outline: 2px solid ${HIGHLIGHT} !important;
46
+ outline-offset: 1px !important;
47
+ }
48
+
49
+ .ve-tooltip {
50
+ position: fixed; z-index: 10001; pointer-events: none;
51
+ background: ${HIGHLIGHT}; color: #fff;
52
+ padding: 3px 7px; border-radius: 4px;
53
+ font: 600 11px/1 'Inter', system-ui, sans-serif;
54
+ white-space: nowrap; box-shadow: 0 2px 4px rgba(0,0,0,.25);
55
+ }
56
+ `;
57
+ // ── helpers ──────────────────────────────────────────────────
58
+ function readTwStyles(el) {
59
+ var _a, _b, _c, _d, _e;
60
+ const cls = el.className || "";
61
+ const align = (_a = TW_ALIGNS.find((a) => cls.includes(a))) !== null && _a !== void 0 ? _a : "text-left";
62
+ const size = (_b = TW_SIZES.find((s) => cls.includes(s.cls))) !== null && _b !== void 0 ? _b : null;
63
+ const weight = (_c = TW_WEIGHTS.find((w) => cls.includes(w.cls))) !== null && _c !== void 0 ? _c : null;
64
+ const cs = getComputedStyle(el);
65
+ return {
66
+ align,
67
+ sizeIdx: size
68
+ ? TW_SIZES.indexOf(size)
69
+ : TW_SIZES.findIndex((s) => s.px >= Math.round(parseFloat(cs.fontSize))),
70
+ weightValue: (_e = (_d = weight === null || weight === void 0 ? void 0 : weight.value) !== null && _d !== void 0 ? _d : cs.fontWeight) !== null && _e !== void 0 ? _e : "400",
71
+ };
72
+ }
73
+ async function updateClass(file, line, tagName, removeClass, addClass) {
74
+ await fetch("/__editor/update-class", {
75
+ method: "POST",
76
+ headers: { "Content-Type": "application/json" },
77
+ body: JSON.stringify({ file, line, tagName, removeClass, addClass }),
78
+ });
79
+ }
80
+ function getDirectText(el) {
81
+ let text = "";
82
+ for (const node of el.childNodes) {
83
+ if (node.nodeType === Node.TEXT_NODE) {
84
+ text += node.textContent;
85
+ }
86
+ }
87
+ return text.trim();
88
+ }
89
+ function getEditorLabel(el, fieldLabels) {
90
+ var _a;
91
+ const entity = el.getAttribute("data-editable-entity");
92
+ const field = el.getAttribute("data-editable-field");
93
+ if (entity && field && ((_a = fieldLabels[entity]) === null || _a === void 0 ? void 0 : _a[field]))
94
+ return fieldLabels[entity][field];
95
+ const info = getComponentInfo(el);
96
+ if (info && info.displayName !== "Unknown" && info.displayName !== el.tagName.toLowerCase()) {
97
+ return info.displayName;
98
+ }
99
+ return null;
100
+ }
101
+ async function updateSourceProp(componentName, propName, newValue, file) {
102
+ await fetch("/__editor/update-prop", {
103
+ method: "POST",
104
+ headers: { "Content-Type": "application/json" },
105
+ body: JSON.stringify({ file, componentName, propName, newValue }),
106
+ });
107
+ }
108
+ async function updateSourceText(file, line, tagName, content) {
109
+ await fetch("/__editor/update-text", {
110
+ method: "POST",
111
+ headers: { "Content-Type": "application/json" },
112
+ body: JSON.stringify({ file, line, tagName, content }),
113
+ });
114
+ }
115
+ export default function VisualEditor({ onFieldCommit, registry = {}, fieldLabels = {}, }) {
116
+ var _a, _b, _c, _d;
117
+ const toolbarRef = useRef(null);
118
+ const [selectedEl, setSelectedEl] = useState(null);
119
+ const [tick, setTick] = useState(0);
120
+ const bump = useCallback(() => setTick((n) => n + 1), []);
121
+ const [activeComp, setActiveComp] = useState(null);
122
+ const [pendingCommit, setPendingCommit] = useState(null);
123
+ const pendingRef = useRef(pendingCommit);
124
+ pendingRef.current = pendingCommit;
125
+ const selRef = useRef(selectedEl);
126
+ selRef.current = selectedEl;
127
+ const onFieldCommitRef = useRef(onFieldCommit);
128
+ onFieldCommitRef.current = onFieldCommit;
129
+ const fieldLabelsRef = useRef(fieldLabels);
130
+ fieldLabelsRef.current = fieldLabels;
131
+ /* ── imperative effect ────────────────────────────────── */
132
+ useEffect(() => {
133
+ let hovered = null;
134
+ const style = document.createElement("style");
135
+ style.textContent = EDITOR_CSS;
136
+ document.head.appendChild(style);
137
+ document.body.setAttribute("data-editor-active", "true");
138
+ const tip = document.createElement("div");
139
+ tip.className = "ve-tooltip";
140
+ tip.style.display = "none";
141
+ document.body.appendChild(tip);
142
+ function resolve(target) {
143
+ var _a;
144
+ if (!(target instanceof Element))
145
+ return null;
146
+ if ((_a = toolbarRef.current) === null || _a === void 0 ? void 0 : _a.contains(target))
147
+ return null;
148
+ if (target.closest("[data-editor-toolbar]"))
149
+ return null;
150
+ if (target.closest(".ve-tooltip"))
151
+ return null;
152
+ if (target.closest("[data-editor-ignore]"))
153
+ return null;
154
+ const tag = target.tagName;
155
+ if (tag === "HTML" || tag === "BODY")
156
+ return null;
157
+ if (tag.toLowerCase() !== "svg" && target.closest("svg"))
158
+ return target.closest("svg");
159
+ return target;
160
+ }
161
+ function positionTip(el) {
162
+ if (!el) {
163
+ tip.style.display = "none";
164
+ return;
165
+ }
166
+ const r = el.getBoundingClientRect();
167
+ const label = getEditorLabel(el, fieldLabelsRef.current);
168
+ if (!label) {
169
+ tip.style.display = "none";
170
+ return;
171
+ }
172
+ tip.textContent = label;
173
+ tip.style.display = "block";
174
+ tip.style.left = `${r.left}px`;
175
+ tip.style.top = `${Math.max(0, r.top - 24)}px`;
176
+ }
177
+ function unhover() {
178
+ hovered === null || hovered === void 0 ? void 0 : hovered.removeAttribute("data-editor-hovered");
179
+ hovered = null;
180
+ positionTip(null);
181
+ }
182
+ function deselect() {
183
+ var _a;
184
+ const prev = selRef.current;
185
+ if (!prev)
186
+ return;
187
+ prev.removeAttribute("data-editor-selected");
188
+ if (prev.getAttribute("contenteditable") === "true") {
189
+ prev.removeAttribute("contenteditable");
190
+ (_a = prev.blur) === null || _a === void 0 ? void 0 : _a.call(prev);
191
+ }
192
+ setSelectedEl(null);
193
+ }
194
+ function onMouseOver(e) {
195
+ if (pendingRef.current)
196
+ return;
197
+ const el = resolve(e.target);
198
+ if (!el || el === hovered)
199
+ return;
200
+ unhover();
201
+ hovered = el;
202
+ el.setAttribute("data-editor-hovered", "true");
203
+ positionTip(el);
204
+ }
205
+ function onMouseOut(e) {
206
+ if (pendingRef.current)
207
+ return;
208
+ if (e.relatedTarget instanceof Element && (hovered === null || hovered === void 0 ? void 0 : hovered.contains(e.relatedTarget)))
209
+ return;
210
+ unhover();
211
+ }
212
+ function onClick(e) {
213
+ var _a;
214
+ if (pendingRef.current)
215
+ return;
216
+ const el = resolve(e.target);
217
+ if (!el)
218
+ return;
219
+ if (((_a = selRef.current) === null || _a === void 0 ? void 0 : _a.getAttribute("contenteditable")) === "true" &&
220
+ selRef.current.contains(e.target))
221
+ return;
222
+ e.preventDefault();
223
+ e.stopPropagation();
224
+ if (el === selRef.current)
225
+ return;
226
+ deselect();
227
+ el.setAttribute("data-editor-selected", "true");
228
+ setSelectedEl(el);
229
+ }
230
+ function onDblClick(e) {
231
+ var _a;
232
+ if (pendingRef.current)
233
+ return;
234
+ const target = e.target;
235
+ if (!(target instanceof Element))
236
+ return;
237
+ if ((_a = toolbarRef.current) === null || _a === void 0 ? void 0 : _a.contains(target))
238
+ return;
239
+ if (target.closest("svg"))
240
+ return;
241
+ e.preventDefault();
242
+ e.stopPropagation();
243
+ const el = target;
244
+ if (el === selRef.current && el.getAttribute("contenteditable") === "true")
245
+ return;
246
+ deselect();
247
+ el.setAttribute("data-editor-selected", "true");
248
+ setSelectedEl(el);
249
+ el.setAttribute("contenteditable", "true");
250
+ el.dataset.editableOriginal = getDirectText(el);
251
+ el.focus();
252
+ const sel = window.getSelection();
253
+ if (sel)
254
+ sel.selectAllChildren(el);
255
+ }
256
+ function onKeyDown(e) {
257
+ var _a, _b, _c;
258
+ if (e.key === "Escape") {
259
+ if (((_a = selRef.current) === null || _a === void 0 ? void 0 : _a.getAttribute("contenteditable")) === "true") {
260
+ selRef.current.removeAttribute("contenteditable");
261
+ (_c = (_b = selRef.current).blur) === null || _c === void 0 ? void 0 : _c.call(_b);
262
+ }
263
+ else {
264
+ deselect();
265
+ }
266
+ }
267
+ }
268
+ function onFocusOut(e) {
269
+ const t = e.target;
270
+ if (t instanceof HTMLElement && t.getAttribute("contenteditable") === "true") {
271
+ const originalValue = t.dataset.editableOriginal;
272
+ const newValue = getDirectText(t);
273
+ const changed = originalValue !== undefined && newValue !== originalValue.trim();
274
+ if (changed) {
275
+ const entity = t.dataset.editableEntity;
276
+ const id = t.dataset.editableId;
277
+ const field = t.dataset.editableField;
278
+ if (entity && id && field) {
279
+ unhover();
280
+ deselect();
281
+ setPendingCommit({
282
+ entity,
283
+ id,
284
+ field,
285
+ newValue,
286
+ originalValue: originalValue,
287
+ el: t,
288
+ });
289
+ }
290
+ else {
291
+ const source = getElementSource(t);
292
+ if (source) {
293
+ updateSourceText(source.fileName, source.lineNumber, t.tagName.toLowerCase(), newValue);
294
+ }
295
+ }
296
+ }
297
+ t.removeAttribute("data-editable-original");
298
+ setTimeout(() => {
299
+ if (document.activeElement !== t)
300
+ t.removeAttribute("contenteditable");
301
+ }, 150);
302
+ }
303
+ }
304
+ function onScroll() {
305
+ if (hovered)
306
+ positionTip(hovered);
307
+ else if (selRef.current)
308
+ positionTip(selRef.current);
309
+ }
310
+ function onInteractiveClick(e) {
311
+ var _a, _b;
312
+ const t = e.target;
313
+ if (!(t instanceof Element))
314
+ return;
315
+ if ((_a = toolbarRef.current) === null || _a === void 0 ? void 0 : _a.contains(t))
316
+ return;
317
+ if (t.closest("[data-editor-toolbar]"))
318
+ return;
319
+ const interactive = t.closest("a, button, [role='button']");
320
+ if (interactive && !((_b = toolbarRef.current) === null || _b === void 0 ? void 0 : _b.contains(interactive))) {
321
+ e.preventDefault();
322
+ e.stopPropagation();
323
+ }
324
+ }
325
+ document.addEventListener("click", onInteractiveClick, true);
326
+ document.addEventListener("mouseover", onMouseOver);
327
+ document.addEventListener("mouseout", onMouseOut);
328
+ document.addEventListener("click", onClick, true);
329
+ document.addEventListener("dblclick", onDblClick, true);
330
+ document.addEventListener("keydown", onKeyDown);
331
+ document.addEventListener("focusout", onFocusOut);
332
+ window.addEventListener("scroll", onScroll, { passive: true });
333
+ return () => {
334
+ style.remove();
335
+ tip.remove();
336
+ document.body.removeAttribute("data-editor-active");
337
+ for (const el of document.querySelectorAll("[data-editor-hovered],[data-editor-selected]")) {
338
+ el.removeAttribute("data-editor-hovered");
339
+ el.removeAttribute("data-editor-selected");
340
+ el.removeAttribute("contenteditable");
341
+ }
342
+ document.removeEventListener("click", onInteractiveClick, true);
343
+ document.removeEventListener("mouseover", onMouseOver);
344
+ document.removeEventListener("mouseout", onMouseOut);
345
+ document.removeEventListener("click", onClick, true);
346
+ document.removeEventListener("dblclick", onDblClick, true);
347
+ document.removeEventListener("keydown", onKeyDown);
348
+ document.removeEventListener("focusout", onFocusOut);
349
+ window.removeEventListener("scroll", onScroll);
350
+ };
351
+ }, []);
352
+ /* ── active component detection ──────────────────────── */
353
+ useEffect(() => {
354
+ if (!selectedEl) {
355
+ setActiveComp(null);
356
+ return;
357
+ }
358
+ const wrapper = selectedEl.closest("[data-component-type]");
359
+ if (!(wrapper === null || wrapper === void 0 ? void 0 : wrapper.dataset.componentType)) {
360
+ setActiveComp(null);
361
+ return;
362
+ }
363
+ setActiveComp({ type: wrapper.dataset.componentType, el: wrapper });
364
+ }, [selectedEl]);
365
+ const variantsMeta = activeComp && ((_a = registry[activeComp.type]) === null || _a === void 0 ? void 0 : _a.variants)
366
+ ? registry[activeComp.type].variants
367
+ : null;
368
+ const currentVariant = variantsMeta
369
+ ? ((_b = activeComp.el.dataset.editorVariant) !== null && _b !== void 0 ? _b : variantsMeta.options[0].value)
370
+ : null;
371
+ const pickVariant = useCallback((value) => {
372
+ if (!activeComp || !variantsMeta)
373
+ return;
374
+ const meta = registry[activeComp.type];
375
+ if (!(meta === null || meta === void 0 ? void 0 : meta.sourceFile))
376
+ return;
377
+ updateSourceProp(activeComp.type, variantsMeta.propName, value, meta.sourceFile);
378
+ }, [activeComp, variantsMeta, registry]);
379
+ /* ── style helpers ────────────────────────────────────── */
380
+ const cur = selectedEl ? readTwStyles(selectedEl) : null;
381
+ const toggleClass = useCallback((removeClass, addClass) => {
382
+ if (!selectedEl)
383
+ return;
384
+ for (const c of removeClass)
385
+ selectedEl.classList.remove(c);
386
+ for (const c of addClass)
387
+ selectedEl.classList.add(c);
388
+ bump();
389
+ const source = getElementSource(selectedEl);
390
+ if (source) {
391
+ updateClass(source.fileName, source.lineNumber, selectedEl.tagName.toLowerCase(), removeClass, addClass);
392
+ }
393
+ }, [selectedEl, bump]);
394
+ const setAlign = useCallback((cls) => toggleClass([...TW_ALIGNS], [cls]), [toggleClass]);
395
+ const stepSize = useCallback((dir) => {
396
+ if (!cur)
397
+ return;
398
+ const idx = Math.max(0, cur.sizeIdx);
399
+ const next = Math.max(0, Math.min(TW_SIZES.length - 1, idx + dir));
400
+ toggleClass([...ALL_SIZE_CLASSES], [TW_SIZES[next].cls]);
401
+ }, [cur, toggleClass]);
402
+ const setWeight = useCallback((cls) => toggleClass([...ALL_WEIGHT_CLASSES], [cls]), [toggleClass]);
403
+ const confirmCommit = useCallback(() => {
404
+ if (!pendingCommit)
405
+ return;
406
+ onFieldCommit === null || onFieldCommit === void 0 ? void 0 : onFieldCommit(pendingCommit.entity, pendingCommit.id, pendingCommit.field, pendingCommit.newValue);
407
+ pendingCommit.el.removeAttribute("data-editable-original");
408
+ setPendingCommit(null);
409
+ }, [pendingCommit, onFieldCommit]);
410
+ const cancelCommit = useCallback(() => {
411
+ if (!pendingCommit)
412
+ return;
413
+ pendingCommit.el.textContent = pendingCommit.originalValue;
414
+ pendingCommit.el.removeAttribute("data-editable-original");
415
+ setPendingCommit(null);
416
+ }, [pendingCommit]);
417
+ void tick;
418
+ /* ── render ───────────────────────────────────────────── */
419
+ return (_jsxs(_Fragment, { children: [pendingCommit && (_jsx("div", { "data-editor-toolbar": true, className: "fixed inset-0 z-[10002] flex items-center justify-center bg-black/50 backdrop-blur-sm", children: _jsxs("div", { className: "w-full max-w-sm rounded-xl border border-white/10 bg-black p-5 text-white shadow-2xl", children: [_jsxs("h3", { className: "text-sm font-semibold", children: ["Update ", pendingCommit.field, "?"] }), _jsxs("div", { className: "mt-3 space-y-2 text-xs text-white/60", children: [_jsxs("div", { className: "flex items-baseline gap-2", children: [_jsx("span", { className: "shrink-0 font-medium text-white/40", children: "From" }), _jsx("span", { className: "rounded bg-white/5 px-2 py-1 text-white/80 line-through", children: pendingCommit.originalValue })] }), _jsxs("div", { className: "flex items-baseline gap-2", children: [_jsx("span", { className: "shrink-0 font-medium text-white/40", children: "To" }), _jsx("span", { className: "rounded bg-white/10 px-2 py-1 text-white", children: pendingCommit.newValue })] })] }), _jsxs("div", { className: "mt-5 flex items-center justify-end gap-2", children: [_jsxs("button", { type: "button", onClick: cancelCommit, className: "flex items-center gap-1.5 rounded-full px-4 py-1.5 text-sm font-medium text-white/60 transition-colors hover:bg-white/10 hover:text-white", children: [_jsx(X, { className: "h-3.5 w-3.5" }), "Cancel"] }), _jsxs("button", { type: "button", onClick: confirmCommit, className: "flex items-center gap-1.5 rounded-full bg-white/15 px-4 py-1.5 text-sm font-medium transition-colors hover:bg-white/25", children: [_jsx(Check, { className: "h-3.5 w-3.5" }), "Confirm"] })] })] }) })), _jsxs("div", { ref: toolbarRef, "data-editor-toolbar": true, className: "fixed bottom-6 left-1/2 z-10001 -translate-x-1/2", children: [variantsMeta && currentVariant && (_jsxs("div", { className: "mx-auto mb-2 flex w-fit items-center gap-1 rounded-full border border-white/10 bg-black px-2 py-1.5 text-white shadow-2xl", children: [_jsx("div", { className: "flex items-center gap-2 pl-3 pr-1", children: _jsx("span", { className: "text-[11px] font-medium uppercase tracking-widest text-white/40", children: "Layout" }) }), _jsx(Sep, {}), _jsx(BtnGroup, { children: variantsMeta.options.map((opt) => (_jsx(Btn, { active: currentVariant === opt.value, title: opt.label, onClick: () => pickVariant(opt.value), children: _jsx(VariantIcon, { variant: opt.value }) }, opt.value))) })] })), _jsxs("div", { className: "flex items-center gap-1 rounded-full border border-white/10 bg-black px-2 py-1.5 text-white shadow-2xl", children: [_jsxs("div", { className: "flex items-center gap-2 pl-3 pr-2", children: [_jsxs("span", { className: "relative flex h-2 w-2", children: [_jsx("span", { className: "absolute inline-flex h-full w-full animate-ping rounded-full bg-green-400 opacity-75" }), _jsx("span", { className: "relative inline-flex h-2 w-2 rounded-full bg-green-400" })] }), _jsx("span", { className: "text-sm font-medium", children: "Editing" })] }), cur && (_jsxs(_Fragment, { children: [_jsx(Sep, {}), _jsxs(BtnGroup, { children: [_jsx(Btn, { active: cur.align === "text-left", title: "Align left", onClick: () => setAlign("text-left"), children: _jsx(AlignLeft, { className: "h-3.5 w-3.5" }) }), _jsx(Btn, { active: cur.align === "text-center", title: "Align center", onClick: () => setAlign("text-center"), children: _jsx(AlignCenter, { className: "h-3.5 w-3.5" }) }), _jsx(Btn, { active: cur.align === "text-right", title: "Align right", onClick: () => setAlign("text-right"), children: _jsx(AlignRight, { className: "h-3.5 w-3.5" }) })] }), _jsx(Sep, {}), _jsxs(BtnGroup, { children: [_jsx(Btn, { title: "Decrease size", onClick: () => stepSize(-1), children: _jsx(Minus, { className: "h-3.5 w-3.5" }) }), _jsx("span", { className: "min-w-[3ch] text-center text-xs tabular-nums", children: (_d = (_c = TW_SIZES[Math.max(0, cur.sizeIdx)]) === null || _c === void 0 ? void 0 : _c.label) !== null && _d !== void 0 ? _d : "?" }), _jsx(Btn, { title: "Increase size", onClick: () => stepSize(1), children: _jsx(Plus, { className: "h-3.5 w-3.5" }) })] }), _jsx(Sep, {}), _jsx(BtnGroup, { children: TW_WEIGHTS.map((w) => (_jsx(Btn, { active: cur.weightValue === w.value, title: w.label, onClick: () => setWeight(w.cls), children: _jsx("span", { className: "text-[11px] leading-none", style: { fontWeight: Number(w.value) }, children: "A" }) }, w.value))) })] }))] })] })] }));
420
+ }
421
+ // ── presentational helpers ──────────────────────────────────
422
+ function Sep() {
423
+ return _jsx("div", { className: "mx-0.5 h-5 w-px bg-white/20" });
424
+ }
425
+ function BtnGroup({ children }) {
426
+ return _jsx("div", { className: "flex items-center", children: children });
427
+ }
428
+ function VariantIcon({ variant }) {
429
+ if (variant === "stack") {
430
+ return (_jsxs("span", { className: "inline-flex w-4 flex-col gap-0.5", children: [_jsx("span", { className: "h-0.75 w-full rounded-[1px] bg-current" }), _jsx("span", { className: "h-0.75 w-full rounded-[1px] bg-current" }), _jsx("span", { className: "h-0.75 w-full rounded-[1px] bg-current" })] }));
431
+ }
432
+ if (variant === "featured") {
433
+ return (_jsxs("span", { className: "inline-flex w-4 flex-col gap-0.5", children: [_jsx("span", { className: "h-1.5 w-full rounded-[1px] bg-current" }), _jsxs("span", { className: "flex gap-0.5", children: [_jsx("span", { className: "h-0.75 flex-1 rounded-[1px] bg-current" }), _jsx("span", { className: "h-0.75 flex-1 rounded-[1px] bg-current" }), _jsx("span", { className: "h-0.75 flex-1 rounded-[1px] bg-current" })] })] }));
434
+ }
435
+ return (_jsxs("span", { className: "inline-grid w-4 grid-cols-2 gap-0.5", children: [_jsx("span", { className: "h-1 rounded-[1px] bg-current" }), _jsx("span", { className: "h-1 rounded-[1px] bg-current" }), _jsx("span", { className: "h-1 rounded-[1px] bg-current" }), _jsx("span", { className: "h-1 rounded-[1px] bg-current" })] }));
436
+ }
437
+ function Btn({ active, title, onClick, children }) {
438
+ return (_jsx("button", { type: "button", onClick: onClick, title: title, className: `flex h-7 w-7 items-center justify-center rounded transition-colors ${active ? "bg-white/25" : "hover:bg-white/15"}`, children: children }));
439
+ }
440
+ //# sourceMappingURL=visual-editor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visual-editor.js","sourceRoot":"","sources":["../src/visual-editor.tsx"],"names":[],"mappings":"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"}
package/dist/vite.d.ts ADDED
@@ -0,0 +1,16 @@
1
+ import type { Plugin } from "vite";
2
+ export interface EditorPluginOptions {
3
+ /** Formatter command to run after AST rewrites (default: npx biome format --write) */
4
+ formatCommand?: string[];
5
+ }
6
+ export declare function editorVitePlugin(options?: EditorPluginOptions): Plugin;
7
+ /**
8
+ * Babel plugin: annotates host JSX elements with data-source-file
9
+ * and data-source-line attributes in dev builds.
10
+ */
11
+ export declare function editorBabelPlugin(babel: any): {
12
+ visitor: {
13
+ JSXOpeningElement(nodePath: any, state: any): void;
14
+ };
15
+ };
16
+ //# sourceMappingURL=vite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite.d.ts","sourceRoot":"","sources":["../src/vite.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAKnC,MAAM,WAAW,mBAAmB;IACnC,sFAAsF;IACtF,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,MAAM,CA+KtE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,GAAG;;oCAIb,GAAG,SAAS,GAAG;;EAiB7C"}
package/dist/vite.js ADDED
@@ -0,0 +1,226 @@
1
+ var _a, _b;
2
+ /**
3
+ * Vite plugin + Babel plugin for the visual editor.
4
+ *
5
+ * Usage in vite.config.ts:
6
+ * import { editorVitePlugin, editorBabelPlugin } from "@colossal-sh/visual-editor/vite";
7
+ * plugins: [
8
+ * editorVitePlugin(),
9
+ * viteReact({ babel: { plugins: [editorBabelPlugin] } }),
10
+ * ]
11
+ */
12
+ import { execFileSync } from "node:child_process";
13
+ import fs from "node:fs";
14
+ import path from "node:path";
15
+ import { parse } from "@babel/parser";
16
+ import _traverse from "@babel/traverse";
17
+ import _generate from "@babel/generator";
18
+ const traverse = (_a = _traverse.default) !== null && _a !== void 0 ? _a : _traverse;
19
+ const generate = (_b = _generate.default) !== null && _b !== void 0 ? _b : _generate;
20
+ export function editorVitePlugin(options) {
21
+ var _a;
22
+ const formatCmd = (_a = options === null || options === void 0 ? void 0 : options.formatCommand) !== null && _a !== void 0 ? _a : ["npx", "biome", "format", "--write"];
23
+ function runFormat(filePath) {
24
+ if (formatCmd.length === 0)
25
+ return;
26
+ try {
27
+ execFileSync(formatCmd[0], [...formatCmd.slice(1), filePath], { stdio: "ignore" });
28
+ }
29
+ catch (_a) { }
30
+ }
31
+ function readBody(req) {
32
+ return new Promise((resolve) => {
33
+ let body = "";
34
+ req.on("data", (chunk) => { body += chunk; });
35
+ req.on("end", () => resolve(body));
36
+ });
37
+ }
38
+ return {
39
+ name: "visual-editor",
40
+ apply: "serve",
41
+ configureServer(server) {
42
+ // ── update-prop ─────────────────────────────────
43
+ server.middlewares.use("/__editor/update-prop", async (req, res, next) => {
44
+ if (req.method !== "POST")
45
+ return next();
46
+ try {
47
+ const { file, componentName, propName, newValue } = JSON.parse(await readBody(req));
48
+ const filePath = path.resolve(file);
49
+ if (!fs.existsSync(filePath)) {
50
+ res.statusCode = 404;
51
+ res.end(JSON.stringify({ error: "File not found" }));
52
+ return;
53
+ }
54
+ let source = fs.readFileSync(filePath, "utf-8");
55
+ const propRegex = new RegExp(`(<${componentName}\\b[^>]*?)\\b${propName}=(?:"[^"]*"|\\{[^}]*\\})`);
56
+ const tagRegex = new RegExp(`(<${componentName}\\b)([^>]*?)(\\/?>)`);
57
+ if (propRegex.test(source)) {
58
+ source = source.replace(propRegex, `$1${propName}="${newValue}"`);
59
+ }
60
+ else if (tagRegex.test(source)) {
61
+ source = source.replace(tagRegex, `$1$2 ${propName}="${newValue}"$3`);
62
+ }
63
+ else {
64
+ res.statusCode = 404;
65
+ res.end(JSON.stringify({ error: `Component <${componentName}> not found in ${file}` }));
66
+ return;
67
+ }
68
+ fs.writeFileSync(filePath, source, "utf-8");
69
+ res.writeHead(200, { "Content-Type": "application/json" });
70
+ res.end(JSON.stringify({ status: "ok" }));
71
+ }
72
+ catch (e) {
73
+ res.statusCode = 400;
74
+ res.end(JSON.stringify({ error: String(e) }));
75
+ }
76
+ });
77
+ // ── update-text ─────────────────────────────────
78
+ server.middlewares.use("/__editor/update-text", async (req, res, next) => {
79
+ if (req.method !== "POST")
80
+ return next();
81
+ try {
82
+ const { file, line, tagName, content } = JSON.parse(await readBody(req));
83
+ const filePath = path.resolve(file);
84
+ if (!fs.existsSync(filePath)) {
85
+ res.statusCode = 404;
86
+ res.end(JSON.stringify({ error: "File not found" }));
87
+ return;
88
+ }
89
+ const source = fs.readFileSync(filePath, "utf-8");
90
+ const ast = parse(source, { sourceType: "module", plugins: ["jsx", "typescript"] });
91
+ let targetElement = null;
92
+ let bestDist = Infinity;
93
+ traverse(ast, {
94
+ JSXElement(nodePath) {
95
+ var _a, _b;
96
+ const opening = nodePath.node.openingElement;
97
+ const name = opening.name;
98
+ if (tagName && name.type === "JSXIdentifier" && name.name !== tagName)
99
+ return;
100
+ const nodeLine = (_b = (_a = opening.loc) === null || _a === void 0 ? void 0 : _a.start.line) !== null && _b !== void 0 ? _b : 0;
101
+ const dist = Math.abs(nodeLine - line);
102
+ if (dist < bestDist) {
103
+ bestDist = dist;
104
+ targetElement = nodePath.node;
105
+ }
106
+ },
107
+ });
108
+ if (!targetElement) {
109
+ res.statusCode = 404;
110
+ res.end(JSON.stringify({ error: `No <${tagName}> found near line ${line} of ${file}` }));
111
+ return;
112
+ }
113
+ const textChild = targetElement.children.find((c) => c.type === "JSXText" && c.value.trim());
114
+ if (!textChild) {
115
+ res.statusCode = 404;
116
+ res.end(JSON.stringify({ error: `No text content in <${tagName}> near line ${line}` }));
117
+ return;
118
+ }
119
+ const oldTrimmed = textChild.value.trim();
120
+ textChild.value = textChild.value.replace(oldTrimmed, content);
121
+ const output = generate(ast, { retainLines: true }, source);
122
+ fs.writeFileSync(filePath, output.code, "utf-8");
123
+ runFormat(filePath);
124
+ res.writeHead(200, { "Content-Type": "application/json" });
125
+ res.end(JSON.stringify({ status: "ok", file }));
126
+ }
127
+ catch (e) {
128
+ res.statusCode = 400;
129
+ res.end(JSON.stringify({ error: String(e) }));
130
+ }
131
+ });
132
+ // ── update-class ────────────────────────────────
133
+ server.middlewares.use("/__editor/update-class", async (req, res, next) => {
134
+ var _a, _b;
135
+ if (req.method !== "POST")
136
+ return next();
137
+ try {
138
+ const { file, line, tagName, removeClass, addClass } = JSON.parse(await readBody(req));
139
+ const filePath = path.resolve(file);
140
+ if (!fs.existsSync(filePath)) {
141
+ res.statusCode = 404;
142
+ res.end(JSON.stringify({ error: "File not found" }));
143
+ return;
144
+ }
145
+ const source = fs.readFileSync(filePath, "utf-8");
146
+ const ast = parse(source, { sourceType: "module", plugins: ["jsx", "typescript"] });
147
+ let target = null;
148
+ let bestDist = Infinity;
149
+ traverse(ast, {
150
+ JSXOpeningElement(nodePath) {
151
+ var _a, _b;
152
+ const name = nodePath.node.name;
153
+ if (tagName && name.type === "JSXIdentifier" && name.name !== tagName)
154
+ return;
155
+ const nodeLine = (_b = (_a = nodePath.node.loc) === null || _a === void 0 ? void 0 : _a.start.line) !== null && _b !== void 0 ? _b : 0;
156
+ const dist = Math.abs(nodeLine - line);
157
+ if (dist < bestDist) {
158
+ bestDist = dist;
159
+ target = nodePath.node;
160
+ }
161
+ },
162
+ });
163
+ if (!target) {
164
+ res.statusCode = 404;
165
+ res.end(JSON.stringify({ error: `No <${tagName}> found near line ${line} of ${file}` }));
166
+ return;
167
+ }
168
+ const classAttr = target.attributes.find((a) => { var _a; return a.type === "JSXAttribute" && ((_a = a.name) === null || _a === void 0 ? void 0 : _a.name) === "className"; });
169
+ if (((_a = classAttr === null || classAttr === void 0 ? void 0 : classAttr.value) === null || _a === void 0 ? void 0 : _a.type) === "StringLiteral") {
170
+ let classes = classAttr.value.value.split(/\s+/).filter(Boolean);
171
+ classes = classes.filter((c) => !(removeClass || []).includes(c));
172
+ for (const c of (addClass || [])) {
173
+ if (!classes.includes(c))
174
+ classes.push(c);
175
+ }
176
+ classAttr.value.value = classes.join(" ");
177
+ }
178
+ else if (((_b = classAttr === null || classAttr === void 0 ? void 0 : classAttr.value) === null || _b === void 0 ? void 0 : _b.type) === "JSXExpressionContainer" && classAttr.value.expression.type === "StringLiteral") {
179
+ let classes = classAttr.value.expression.value.split(/\s+/).filter(Boolean);
180
+ classes = classes.filter((c) => !(removeClass || []).includes(c));
181
+ for (const c of (addClass || [])) {
182
+ if (!classes.includes(c))
183
+ classes.push(c);
184
+ }
185
+ classAttr.value.expression.value = classes.join(" ");
186
+ }
187
+ const output = generate(ast, { retainLines: true }, source);
188
+ fs.writeFileSync(filePath, output.code, "utf-8");
189
+ runFormat(filePath);
190
+ res.writeHead(200, { "Content-Type": "application/json" });
191
+ res.end(JSON.stringify({ status: "ok", file }));
192
+ }
193
+ catch (e) {
194
+ res.statusCode = 400;
195
+ res.end(JSON.stringify({ error: String(e) }));
196
+ }
197
+ });
198
+ },
199
+ };
200
+ }
201
+ /**
202
+ * Babel plugin: annotates host JSX elements with data-source-file
203
+ * and data-source-line attributes in dev builds.
204
+ */
205
+ export function editorBabelPlugin(babel) {
206
+ const t = babel.types;
207
+ return {
208
+ visitor: {
209
+ JSXOpeningElement(nodePath, state) {
210
+ var _a;
211
+ const { node } = nodePath;
212
+ const name = node.name;
213
+ if (name.type !== "JSXIdentifier" || name.name[0] !== name.name[0].toLowerCase())
214
+ return;
215
+ if (node.attributes.some((a) => { var _a; return a.type === "JSXAttribute" && ((_a = a.name) === null || _a === void 0 ? void 0 : _a.name) === "data-source-file"; }))
216
+ return;
217
+ const fileName = (state.filename || "").replace(process.cwd() + "/", "");
218
+ const line = (_a = node.loc) === null || _a === void 0 ? void 0 : _a.start.line;
219
+ if (!fileName || !line)
220
+ return;
221
+ node.attributes.push(t.jsxAttribute(t.jsxIdentifier("data-source-file"), t.stringLiteral(fileName)), t.jsxAttribute(t.jsxIdentifier("data-source-line"), t.stringLiteral(String(line))));
222
+ },
223
+ },
224
+ };
225
+ }
226
+ //# sourceMappingURL=vite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite.js","sourceRoot":"","sources":["../src/vite.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@colossal-sh/visual-editor",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "import": "./dist/index.js"
11
+ },
12
+ "./vite": {
13
+ "types": "./dist/vite.d.ts",
14
+ "import": "./dist/vite.js"
15
+ }
16
+ },
17
+ "files": [
18
+ "dist/"
19
+ ],
20
+ "peerDependencies": {
21
+ "react": ">=18",
22
+ "vite": ">=5"
23
+ },
24
+ "dependencies": {
25
+ "lucide-react": ">=0.400"
26
+ },
27
+ "devDependencies": {
28
+ "@babel/parser": "^7.29.0",
29
+ "@babel/traverse": "^7.29.0",
30
+ "@babel/generator": "^7.29.0",
31
+ "@types/babel__traverse": "^7.28.0",
32
+ "@types/babel__generator": "^7.27.0",
33
+ "@types/react": "^19.0.0",
34
+ "react": "^19.0.0",
35
+ "typescript": "^5.0.0",
36
+ "vite": "^6.0.0"
37
+ },
38
+ "scripts": {
39
+ "build": "tsc -p tsconfig.build.json",
40
+ "publish:npm": "pnpm build && npm publish --access public"
41
+ }
42
+ }