@jbpark/live-editor 1.14.0 → 1.15.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/dist/context-DrqO0VVu.js +38 -0
- package/dist/context-DrqO0VVu.js.map +1 -0
- package/dist/core-B7igZRDs.js +11195 -0
- package/dist/core-B7igZRDs.js.map +1 -0
- package/dist/dnd/index.d.ts +2 -0
- package/dist/dnd/index.js +2 -0
- package/dist/dnd-BdNgmgYB.js +1717 -0
- package/dist/dnd-BdNgmgYB.js.map +1 -0
- package/dist/editor/index.d.ts +2 -0
- package/dist/editor/index.js +3 -0
- package/dist/editor-DmgTeTcG.js +51 -0
- package/dist/editor-DmgTeTcG.js.map +1 -0
- package/dist/error/index.d.ts +2 -0
- package/dist/error/index.js +2 -0
- package/dist/error-DRMGumEj.js +168 -0
- package/dist/error-DRMGumEj.js.map +1 -0
- package/dist/frame-C11nuIBH.js +357 -0
- package/dist/frame-C11nuIBH.js.map +1 -0
- package/dist/index-BnncHZTt.d.ts +63 -0
- package/dist/index-C4TBkJBG.d.ts +37 -0
- package/dist/index-CCynrS6c.d.ts +52 -0
- package/dist/index-DpDU1IAw.d.ts +23 -0
- package/dist/index-lgHdCda5.d.ts +17 -0
- package/dist/index.d.ts +13 -185
- package/dist/index.js +8 -13614
- package/dist/index.js.map +1 -1
- package/dist/preview/index.d.ts +2 -0
- package/dist/preview/index.js +2 -0
- package/dist/preview-DkLLqgKE.js +113 -0
- package/dist/preview-DkLLqgKE.js.map +1 -0
- package/dist/provider/index.d.ts +8 -0
- package/dist/provider/index.js +2 -0
- package/dist/states-Ci1AvoQ9.js +18 -0
- package/dist/states-Ci1AvoQ9.js.map +1 -0
- package/dist/style.css +3830 -3
- package/dist/tailwind-CbjdLyVX.js +28 -0
- package/dist/tailwind-CbjdLyVX.js.map +1 -0
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/utils/tailwind/index.d.ts +2 -2
- package/dist/utils/tailwind/index.js +2 -2
- package/dist/{utils-B11t9ZYd.js → utils-BzfDKU6y.js} +10 -23
- package/dist/{utils-B11t9ZYd.js.map → utils-BzfDKU6y.js.map} +1 -1
- package/package.json +26 -12
- package/dist/tailwind-CzPhj3D9.js +0 -36
- package/dist/tailwind-CzPhj3D9.js.map +0 -1
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { i as compile, r as cn, t as baseModules } from "./utils-BzfDKU6y.js";
|
|
2
|
+
import { i as usePreview, r as useError } from "./states-Ci1AvoQ9.js";
|
|
3
|
+
import { t as Frame } from "./frame-C11nuIBH.js";
|
|
4
|
+
import { t as generateTailwindCSSFromDOM } from "./tailwind-CbjdLyVX.js";
|
|
5
|
+
import { t as Error$1 } from "./error-DRMGumEj.js";
|
|
6
|
+
import { useCallback, useEffect, useMemo, useState } from "react";
|
|
7
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
+
//#region src/components/preview/client.tsx
|
|
9
|
+
const Client = ({ code: _code = "", className, showError, props = {}, modules = {}, frame, dynamicTailwind = false, provider }) => {
|
|
10
|
+
const { code } = usePreview();
|
|
11
|
+
const { error, setError } = useError();
|
|
12
|
+
const isError = !!showError && !!error;
|
|
13
|
+
const classNames = cn(isError && "hidden", className);
|
|
14
|
+
const mergedModules = {
|
|
15
|
+
...baseModules,
|
|
16
|
+
...modules
|
|
17
|
+
};
|
|
18
|
+
const effectiveCode = _code || code;
|
|
19
|
+
const [dynamicCSS, setDynamicCSS] = useState("");
|
|
20
|
+
const [contentEl, setContentEl] = useState(null);
|
|
21
|
+
const contentRef = useCallback((el) => {
|
|
22
|
+
setContentEl(el);
|
|
23
|
+
}, []);
|
|
24
|
+
useEffect(() => {
|
|
25
|
+
if (!effectiveCode || !dynamicTailwind || !contentEl) return;
|
|
26
|
+
let cancelled = false;
|
|
27
|
+
generateTailwindCSSFromDOM(contentEl).then((css) => {
|
|
28
|
+
if (!cancelled) setDynamicCSS(css);
|
|
29
|
+
});
|
|
30
|
+
return () => {
|
|
31
|
+
cancelled = true;
|
|
32
|
+
};
|
|
33
|
+
}, [
|
|
34
|
+
effectiveCode,
|
|
35
|
+
dynamicTailwind,
|
|
36
|
+
contentEl
|
|
37
|
+
]);
|
|
38
|
+
let module = null;
|
|
39
|
+
if (effectiveCode) try {
|
|
40
|
+
module = compile(effectiveCode, mergedModules);
|
|
41
|
+
} catch (e) {
|
|
42
|
+
module = {
|
|
43
|
+
exports: {},
|
|
44
|
+
error: e instanceof Error ? e.message : "Module transformation error"
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
const componentProps = useMemo(() => ({ ...props }), [props]);
|
|
48
|
+
const renderProvider = (component) => {
|
|
49
|
+
return provider ? provider(component) : component;
|
|
50
|
+
};
|
|
51
|
+
if (module && module.error) return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("div", {
|
|
52
|
+
className: cn("relative h-full w-full", classNames),
|
|
53
|
+
children: /* @__PURE__ */ jsx(Error$1, {
|
|
54
|
+
message: module.error,
|
|
55
|
+
title: "Compile Error"
|
|
56
|
+
})
|
|
57
|
+
}), /* @__PURE__ */ jsx(Error$1.Runtime, { open: isError })] });
|
|
58
|
+
const Component = module?.exports?.default;
|
|
59
|
+
if (!Component) return null;
|
|
60
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [frame ? /* @__PURE__ */ jsx("div", {
|
|
61
|
+
className: cn("h-full w-full", classNames),
|
|
62
|
+
children: /* @__PURE__ */ jsx(Frame, {
|
|
63
|
+
...frame,
|
|
64
|
+
children: (container) => /* @__PURE__ */ jsx("div", {
|
|
65
|
+
ref: contentRef,
|
|
66
|
+
style: { display: "contents" },
|
|
67
|
+
children: /* @__PURE__ */ jsx(Error$1.Boundary, {
|
|
68
|
+
resetKeys: [effectiveCode],
|
|
69
|
+
onError: (e) => setError(e.message),
|
|
70
|
+
children: renderProvider(/* @__PURE__ */ jsxs(Error$1.Guard, {
|
|
71
|
+
onError: (e) => setError(e.message),
|
|
72
|
+
children: [/* @__PURE__ */ jsx(Component, {
|
|
73
|
+
...componentProps,
|
|
74
|
+
container
|
|
75
|
+
}), dynamicTailwind && dynamicCSS && /* @__PURE__ */ jsx("style", { children: dynamicCSS })]
|
|
76
|
+
}))
|
|
77
|
+
})
|
|
78
|
+
})
|
|
79
|
+
})
|
|
80
|
+
}) : /* @__PURE__ */ jsx("div", {
|
|
81
|
+
ref: contentRef,
|
|
82
|
+
className: cn("relative h-full w-full overflow-x-hidden overflow-y-auto", classNames),
|
|
83
|
+
style: {
|
|
84
|
+
isolation: "isolate",
|
|
85
|
+
transform: "translateZ(0)",
|
|
86
|
+
containerType: "inline-size"
|
|
87
|
+
},
|
|
88
|
+
children: /* @__PURE__ */ jsx(Error$1.Boundary, {
|
|
89
|
+
resetKeys: [effectiveCode],
|
|
90
|
+
onError: (e) => setError(e.message),
|
|
91
|
+
children: renderProvider(/* @__PURE__ */ jsxs(Error$1.Guard, {
|
|
92
|
+
onError: (e) => setError(e.message),
|
|
93
|
+
children: [/* @__PURE__ */ jsx(Component, { ...componentProps }), dynamicTailwind && dynamicCSS && /* @__PURE__ */ jsx("style", { children: dynamicCSS })]
|
|
94
|
+
}))
|
|
95
|
+
})
|
|
96
|
+
}), /* @__PURE__ */ jsx(Error$1.Runtime, { open: isError })] });
|
|
97
|
+
};
|
|
98
|
+
//#endregion
|
|
99
|
+
//#region src/components/preview/preview.tsx
|
|
100
|
+
const Preview = ({ code, props = {}, modules = {}, dynamicTailwind = false, provider, ...restProps }) => {
|
|
101
|
+
return /* @__PURE__ */ jsx(Client, {
|
|
102
|
+
code,
|
|
103
|
+
props,
|
|
104
|
+
modules,
|
|
105
|
+
dynamicTailwind,
|
|
106
|
+
provider,
|
|
107
|
+
...restProps
|
|
108
|
+
});
|
|
109
|
+
};
|
|
110
|
+
//#endregion
|
|
111
|
+
export { Preview as t };
|
|
112
|
+
|
|
113
|
+
//# sourceMappingURL=preview-DkLLqgKE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preview-DkLLqgKE.js","names":["LiveError"],"sources":["../src/components/preview/client.tsx","../src/components/preview/preview.tsx"],"sourcesContent":["'use client';\n\nimport { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { useError, usePreview } from '~/components/context/states';\nimport LiveError from '~/components/error';\nimport Frame, { type FrameProps } from '~/components/frame';\nimport { baseModules, cn, compile } from '~/utils';\nimport { generateTailwindCSSFromDOM } from '~/utils/tailwind';\n\nimport { type Props } from './preview';\n\nconst Client = ({\n code: _code = '',\n className,\n showError,\n props = {},\n modules = {},\n frame,\n dynamicTailwind = false,\n provider,\n}: Props) => {\n const { code } = usePreview();\n const { error, setError } = useError();\n const isError = !!showError && !!error;\n\n const classNames = cn(isError && 'hidden', className);\n\n const mergedModules = { ...baseModules, ...modules };\n const effectiveCode = _code || code;\n\n // Scans the actual rendered DOM (via `contentRef`, attached below) rather\n // than `effectiveCode`'s source text, so classes contributed by an\n // imported component (e.g. ui-kit's `Button`) are picked up too — those\n // never appear as literal text in the previewed source, only in that\n // component's own compiled output.\n //\n // The wrapper below is tracked via a callback ref (`contentEl` state)\n // rather than a plain `useRef`, because in shadow mode it isn't mounted\n // on this component's first commit at all — `Shadow` creates its portal\n // target in its own effect and only re-renders with it afterwards, one\n // commit later. A plain ref read in an `[effectiveCode, dynamicTailwind]`\n // -keyed effect would see `null` on that first pass and never retry;\n // making the element itself a dependency re-runs the scan once it\n // actually exists.\n const [dynamicCSS, setDynamicCSS] = useState('');\n const [contentEl, setContentEl] = useState<HTMLDivElement | null>(null);\n const contentRef = useCallback((el: HTMLDivElement | null) => {\n setContentEl(el);\n }, []);\n\n useEffect(() => {\n if (!effectiveCode || !dynamicTailwind || !contentEl) {\n return;\n }\n\n let cancelled = false;\n\n generateTailwindCSSFromDOM(contentEl).then(css => {\n if (!cancelled) {\n setDynamicCSS(css);\n }\n });\n\n return () => {\n cancelled = true;\n };\n }, [effectiveCode, dynamicTailwind, contentEl]);\n\n let module = null;\n\n if (effectiveCode) {\n try {\n module = compile(effectiveCode, mergedModules);\n } catch (e) {\n module = {\n exports: {},\n error: e instanceof Error ? e.message : 'Module transformation error',\n };\n }\n }\n\n const componentProps = useMemo(\n () => ({\n ...props,\n }),\n [props],\n );\n\n const renderProvider = (component: React.ReactNode) => {\n return provider ? provider(component) : component;\n };\n\n if (module && module.error) {\n return (\n <>\n <div className={cn('relative h-full w-full', classNames)}>\n <LiveError message={module.error} title=\"Compile Error\" />\n </div>\n <LiveError.Runtime open={isError} />\n </>\n );\n }\n\n const Component = module?.exports?.default;\n\n if (!Component) {\n return null;\n }\n\n return (\n <>\n {frame ? (\n <div className={cn('h-full w-full', classNames)}>\n <Frame {...(frame as FrameProps)}>\n {container => (\n <div ref={contentRef} style={{ display: 'contents' }}>\n <LiveError.Boundary\n resetKeys={[effectiveCode]}\n onError={(e: Error) => setError(e.message)}\n >\n {renderProvider(\n <LiveError.Guard onError={e => setError(e.message)}>\n <Component {...componentProps} container={container} />\n {dynamicTailwind && dynamicCSS && (\n <style>{dynamicCSS}</style>\n )}\n </LiveError.Guard>,\n )}\n </LiveError.Boundary>\n </div>\n )}\n </Frame>\n </div>\n ) : (\n <div\n ref={contentRef}\n className={cn(\n 'relative h-full w-full overflow-x-hidden overflow-y-auto',\n classNames,\n )}\n style={{\n isolation: 'isolate',\n transform: 'translateZ(0)',\n containerType: 'inline-size',\n }}\n >\n <LiveError.Boundary\n resetKeys={[effectiveCode]}\n onError={e => setError(e.message)}\n >\n {renderProvider(\n <LiveError.Guard onError={e => setError(e.message)}>\n <Component {...componentProps} />\n {dynamicTailwind && dynamicCSS && <style>{dynamicCSS}</style>}\n </LiveError.Guard>,\n )}\n </LiveError.Boundary>\n </div>\n )}\n <LiveError.Runtime open={isError} />\n </>\n );\n};\n\nexport default Client;\n","import type React from 'react';\n\nimport type { FrameProps } from '../frame';\nimport Client from './client';\n\nexport interface Props extends React.ComponentPropsWithRef<'div'> {\n code?: string;\n showError?: boolean;\n props?: Record<string, unknown>;\n container?: HTMLElement | null;\n frame?: boolean | FrameProps;\n modules?: Record<string, unknown>;\n dynamicTailwind?: boolean;\n provider?: (children: React.ReactNode) => React.ReactNode;\n}\n\n// A thin wrapper around Client, which does the actual compiling, error\n// handling, and frame wrapping. This used to have its own duplicate\n// compile-and-render branch for the `code` prop that never wrapped its\n// output in <Frame>, so `frame` was silently ignored whenever `code` was\n// passed — see #187. Client already handles `code` (falling back to\n// context when absent) and `frame`, so there is only one render path now.\nconst Preview = ({\n code,\n props = {},\n modules = {},\n dynamicTailwind = false,\n provider,\n ...restProps\n}: Props) => {\n return (\n <Client\n code={code}\n props={props}\n modules={modules}\n dynamicTailwind={dynamicTailwind}\n provider={provider}\n {...restProps}\n />\n );\n};\n\nexport default Preview;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
//#region src/components/context/context.d.ts
|
|
3
|
+
declare const ContextProvider: ({ children }: {
|
|
4
|
+
children?: React.ReactNode;
|
|
5
|
+
}) => React.JSX.Element;
|
|
6
|
+
//#endregion
|
|
7
|
+
export { ContextProvider as default };
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { createContext, useContext } from "react";
|
|
2
|
+
//#region src/components/context/states.ts
|
|
3
|
+
const PreviewContext = createContext(void 0);
|
|
4
|
+
const ErrorContext = createContext(void 0);
|
|
5
|
+
const usePreview = () => {
|
|
6
|
+
const context = useContext(PreviewContext);
|
|
7
|
+
if (context === void 0) throw new Error("usePreview must be used within <Live> (ContextProvider)");
|
|
8
|
+
return context;
|
|
9
|
+
};
|
|
10
|
+
const useError = () => {
|
|
11
|
+
const context = useContext(ErrorContext);
|
|
12
|
+
if (context === void 0) throw new Error("useError must be used within <Live> (ContextProvider)");
|
|
13
|
+
return context;
|
|
14
|
+
};
|
|
15
|
+
//#endregion
|
|
16
|
+
export { usePreview as i, PreviewContext as n, useError as r, ErrorContext as t };
|
|
17
|
+
|
|
18
|
+
//# sourceMappingURL=states-Ci1AvoQ9.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"states-Ci1AvoQ9.js","names":[],"sources":["../src/components/context/states.ts"],"sourcesContent":["'use client';\n\nimport { createContext, useContext } from 'react';\nimport type { Dispatch, SetStateAction } from 'react';\n\nexport interface PreviewContextType {\n code: string;\n setCode: Dispatch<SetStateAction<string>>;\n}\n\nexport interface ErrorContextType {\n error: string | null;\n setError: Dispatch<SetStateAction<string | null>>;\n}\n\n// `undefined` (rather than a no-op default) so usePreview/useError can tell\n// \"no <Live>/ContextProvider ancestor\" apart from \"a real value\" and throw\n// instead of silently no-op'ing — forgetting to wrap with <Live> previously\n// failed silently (setCode/setError did nothing, code/error just stayed at\n// their hardcoded defaults) instead of surfacing as a clear error.\nexport const PreviewContext = createContext<PreviewContextType | undefined>(\n undefined,\n);\n\nexport const ErrorContext = createContext<ErrorContextType | undefined>(\n undefined,\n);\n\nexport const usePreview = () => {\n const context = useContext(PreviewContext);\n\n if (context === undefined) {\n throw new Error('usePreview must be used within <Live> (ContextProvider)');\n }\n\n return context;\n};\n\nexport const useError = () => {\n const context = useContext(ErrorContext);\n\n if (context === undefined) {\n throw new Error('useError must be used within <Live> (ContextProvider)');\n }\n\n return context;\n};\n"],"mappings":";;AAoBA,MAAa,iBAAiB,cAC5B,KAAA,CACF;AAEA,MAAa,eAAe,cAC1B,KAAA,CACF;AAEA,MAAa,mBAAmB;CAC9B,MAAM,UAAU,WAAW,cAAc;CAEzC,IAAI,YAAY,KAAA,GACd,MAAM,IAAI,MAAM,yDAAyD;CAG3E,OAAO;AACT;AAEA,MAAa,iBAAiB;CAC5B,MAAM,UAAU,WAAW,YAAY;CAEvC,IAAI,YAAY,KAAA,GACd,MAAM,IAAI,MAAM,uDAAuD;CAGzE,OAAO;AACT"}
|