geoiq-frontend-ui-kit 2.0.5 → 2.0.6
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/index100.es.js +42 -23
- package/dist/index100.es.js.map +1 -1
- package/dist/index101.es.js +33 -62
- package/dist/index101.es.js.map +1 -1
- package/dist/index102.es.js +21 -9
- package/dist/index102.es.js.map +1 -1
- package/dist/index103.es.js +88 -22
- package/dist/index103.es.js.map +1 -1
- package/dist/index104.es.js +17 -9
- package/dist/index104.es.js.map +1 -1
- package/dist/index105.es.js +13 -67
- package/dist/index105.es.js.map +1 -1
- package/dist/index106.es.js +21 -185
- package/dist/index106.es.js.map +1 -1
- package/dist/index107.es.js +11 -23
- package/dist/index107.es.js.map +1 -1
- package/dist/index108.es.js +69 -198
- package/dist/index108.es.js.map +1 -1
- package/dist/index109.es.js +9 -43
- package/dist/index109.es.js.map +1 -1
- package/dist/index11.es.js +1 -1
- package/dist/index110.es.js +65 -37
- package/dist/index110.es.js.map +1 -1
- package/dist/index111.es.js +184 -47
- package/dist/index111.es.js.map +1 -1
- package/dist/index112.es.js +23 -181
- package/dist/index112.es.js.map +1 -1
- package/dist/index113.es.js +201 -20
- package/dist/index113.es.js.map +1 -1
- package/dist/index114.es.js +13 -35
- package/dist/index114.es.js.map +1 -1
- package/dist/index115.es.js +88 -58
- package/dist/index115.es.js.map +1 -1
- package/dist/index116.es.js +27 -84
- package/dist/index116.es.js.map +1 -1
- package/dist/index117.es.js +23 -15
- package/dist/index117.es.js.map +1 -1
- package/dist/index118.es.js +34 -8
- package/dist/index118.es.js.map +1 -1
- package/dist/index119.es.js +179 -29
- package/dist/index119.es.js.map +1 -1
- package/dist/index12.es.js +1 -1
- package/dist/index120.es.js +32 -11
- package/dist/index120.es.js.map +1 -1
- package/dist/index121.es.js +19 -92
- package/dist/index121.es.js.map +1 -1
- package/dist/index122.es.js +13 -27
- package/dist/index122.es.js.map +1 -1
- package/dist/index123.es.js +7 -15
- package/dist/index123.es.js.map +1 -1
- package/dist/index124.es.js +98 -20
- package/dist/index124.es.js.map +1 -1
- package/dist/index125.es.js +61 -9
- package/dist/index125.es.js.map +1 -1
- package/dist/index126.es.js +54 -97
- package/dist/index126.es.js.map +1 -1
- package/dist/index127.es.js +16 -64
- package/dist/index127.es.js.map +1 -1
- package/dist/index128.es.js +96 -50
- package/dist/index128.es.js.map +1 -1
- package/dist/index129.es.js +11 -13
- package/dist/index129.es.js.map +1 -1
- package/dist/index130.es.js +147 -99
- package/dist/index130.es.js.map +1 -1
- package/dist/index131.es.js +6 -13
- package/dist/index131.es.js.map +1 -1
- package/dist/index132.es.js +48 -148
- package/dist/index132.es.js.map +1 -1
- package/dist/index133.es.js +42 -13
- package/dist/index133.es.js.map +1 -1
- package/dist/index134.es.js +35 -269
- package/dist/index134.es.js.map +1 -1
- package/dist/index135.es.js +22 -25
- package/dist/index135.es.js.map +1 -1
- package/dist/index136.es.js +11 -7
- package/dist/index136.es.js.map +1 -1
- package/dist/index137.es.js +33 -40
- package/dist/index137.es.js.map +1 -1
- package/dist/index138.es.js +63 -37
- package/dist/index138.es.js.map +1 -1
- package/dist/index139.es.js +268 -39
- package/dist/index139.es.js.map +1 -1
- package/dist/index141.es.js +16 -5
- package/dist/index141.es.js.map +1 -1
- package/dist/index142.es.js +5 -11
- package/dist/index142.es.js.map +1 -1
- package/dist/index143.es.js +10 -10
- package/dist/index143.es.js.map +1 -1
- package/dist/index144.es.js +11 -2
- package/dist/index144.es.js.map +1 -1
- package/dist/index145.es.js +2 -44
- package/dist/index145.es.js.map +1 -1
- package/dist/index146.es.js +7 -12
- package/dist/index146.es.js.map +1 -1
- package/dist/index147.es.js +22 -6
- package/dist/index147.es.js.map +1 -1
- package/dist/index148.es.js +168 -21
- package/dist/index148.es.js.map +1 -1
- package/dist/index149.es.js +79 -167
- package/dist/index149.es.js.map +1 -1
- package/dist/index150.es.js +67 -75
- package/dist/index150.es.js.map +1 -1
- package/dist/index151.es.js +3 -72
- package/dist/index151.es.js.map +1 -1
- package/dist/index152.es.js +56 -5
- package/dist/index152.es.js.map +1 -1
- package/dist/index153.es.js +120 -56
- package/dist/index153.es.js.map +1 -1
- package/dist/index154.es.js +398 -113
- package/dist/index154.es.js.map +1 -1
- package/dist/index155.es.js +25 -398
- package/dist/index155.es.js.map +1 -1
- package/dist/index156.es.js +61 -25
- package/dist/index156.es.js.map +1 -1
- package/dist/index157.es.js +29 -64
- package/dist/index157.es.js.map +1 -1
- package/dist/index158.es.js +21 -29
- package/dist/index158.es.js.map +1 -1
- package/dist/index159.es.js +36 -23
- package/dist/index159.es.js.map +1 -1
- package/dist/index16.es.js +1 -1
- package/dist/index160.es.js +211 -37
- package/dist/index160.es.js.map +1 -1
- package/dist/index161.es.js +143 -211
- package/dist/index161.es.js.map +1 -1
- package/dist/index162.es.js +136 -136
- package/dist/index162.es.js.map +1 -1
- package/dist/index163.es.js +46 -143
- package/dist/index163.es.js.map +1 -1
- package/dist/index164.es.js +353 -45
- package/dist/index164.es.js.map +1 -1
- package/dist/index165.es.js +41 -352
- package/dist/index165.es.js.map +1 -1
- package/dist/index166.es.js +12 -2
- package/dist/index166.es.js.map +1 -1
- package/dist/index167.es.js +2 -25
- package/dist/index167.es.js.map +1 -1
- package/dist/index168.es.js +21 -12
- package/dist/index168.es.js.map +1 -1
- package/dist/index170.es.js +1 -1
- package/dist/index171.es.js +2 -2
- package/dist/index173.es.js +1 -1
- package/dist/index174.es.js +2 -2
- package/dist/index175.es.js +2 -2
- package/dist/index176.es.js +2 -2
- package/dist/index180.es.js +1 -1
- package/dist/index181.es.js +1 -1
- package/dist/index182.es.js +1 -1
- package/dist/index183.es.js +1 -1
- package/dist/index184.es.js +1 -1
- package/dist/index185.es.js +1 -1
- package/dist/index186.es.js +1 -1
- package/dist/index188.es.js +1 -1
- package/dist/index19.es.js +1 -1
- package/dist/index20.es.js +1 -1
- package/dist/index21.es.js +1 -1
- package/dist/index23.es.js +2 -2
- package/dist/index27.es.js +1 -1
- package/dist/index29.es.js +1 -1
- package/dist/index30.es.js +2 -2
- package/dist/index32.es.js +1 -1
- package/dist/index34.es.js +1 -1
- package/dist/index35.es.js +1 -1
- package/dist/index47.es.js +4 -4
- package/dist/index48.es.js +2 -2
- package/dist/index49.es.js +1 -1
- package/dist/index50.es.js +1 -1
- package/dist/index55.es.js +1 -1
- package/dist/index56.es.js +1 -1
- package/dist/index59.es.js +1 -1
- package/dist/index61.es.js +1 -1
- package/dist/index69.es.js +2 -2
- package/dist/index70.es.js +1 -1
- package/dist/index72.es.js +5 -5
- package/dist/index73.es.js +1 -1
- package/dist/index74.es.js +7 -7
- package/dist/index87.es.js +1 -1
- package/package.json +1 -1
package/dist/index128.es.js
CHANGED
|
@@ -1,58 +1,104 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
import { Button as
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
1
|
+
import { Loader2 as g, Save as v, X as E } from "lucide-react";
|
|
2
|
+
import t, { useRef as n, useState as x, useEffect as s } from "react";
|
|
3
|
+
import { Button as b } from "./index9.es.js";
|
|
4
|
+
import { ImageEditorPortalContext as h } from "./index146.es.js";
|
|
5
|
+
import { Panel as y } from "./index147.es.js";
|
|
6
|
+
import { Ribbon as S } from "./index148.es.js";
|
|
7
|
+
import { Stage as w } from "./index149.es.js";
|
|
8
|
+
import { LineSessionBar as N } from "./index150.es.js";
|
|
9
|
+
import { StatusBar as R } from "./index151.es.js";
|
|
10
|
+
function z({
|
|
11
|
+
engine: a,
|
|
12
|
+
ui: r,
|
|
13
|
+
isOpen: o,
|
|
14
|
+
saveLabel: u
|
|
15
|
+
}) {
|
|
16
|
+
const l = n(null), [d, p] = x(null), i = n(null), c = n(null), m = n(!1);
|
|
17
|
+
return s(() => {
|
|
18
|
+
if (m.current) return;
|
|
19
|
+
const e = i.current;
|
|
20
|
+
!e?.canvas || !e.overlay || !e.textEditor || !e.stage || (a.mount({
|
|
21
|
+
canvas: e.canvas,
|
|
22
|
+
overlay: e.overlay,
|
|
23
|
+
textEditor: e.textEditor,
|
|
24
|
+
stage: e.stage
|
|
25
|
+
}), m.current = !0);
|
|
26
|
+
}, [r != null]), s(() => {
|
|
27
|
+
if (!o || !l.current) return;
|
|
28
|
+
l.current.hasAttribute("tabindex") || l.current.setAttribute("tabindex", "-1");
|
|
29
|
+
const e = setTimeout(
|
|
30
|
+
() => l.current?.focus({ preventScroll: !0 }),
|
|
31
|
+
0
|
|
32
|
+
);
|
|
33
|
+
return () => clearTimeout(e);
|
|
34
|
+
}, [o]), s(() => {
|
|
35
|
+
o && a.refitStage();
|
|
36
|
+
}, [o, a]), r ? /* @__PURE__ */ t.createElement(
|
|
37
|
+
"div",
|
|
38
|
+
{
|
|
39
|
+
ref: (e) => {
|
|
40
|
+
l.current = e, p(e);
|
|
25
41
|
},
|
|
26
|
-
"
|
|
27
|
-
|
|
28
|
-
o,
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
}
|
|
34
|
-
)
|
|
35
|
-
), /* @__PURE__ */ e.createElement(
|
|
36
|
-
s,
|
|
37
|
-
{
|
|
38
|
-
value: a,
|
|
39
|
-
placeholder: "Add notes",
|
|
40
|
-
onChange: (n) => i(n.target.value),
|
|
41
|
-
className: "h-[200px] w-[400px]"
|
|
42
|
+
className: "fixed inset-0 z-[2147483000] flex items-center justify-center bg-[rgba(24,22,18,.55)] backdrop-blur-sm",
|
|
43
|
+
style: {
|
|
44
|
+
display: o ? "flex" : "none",
|
|
45
|
+
pointerEvents: "auto"
|
|
46
|
+
},
|
|
47
|
+
onMouseDown: (e) => {
|
|
48
|
+
e.target === e.currentTarget && r.closeOnBackdrop && a.close();
|
|
42
49
|
}
|
|
43
|
-
|
|
44
|
-
|
|
50
|
+
},
|
|
51
|
+
/* @__PURE__ */ t.createElement(h.Provider, { value: d }, /* @__PURE__ */ t.createElement("div", { className: "image-editor-modal-panel flex flex-col overflow-hidden bg-light-2 shadow-2xl" }, /* @__PURE__ */ t.createElement("div", { className: "flex items-center gap-3 border-b border-neutral-1 bg-light-3 px-4 py-3" }, /* @__PURE__ */ t.createElement(
|
|
52
|
+
b,
|
|
45
53
|
{
|
|
46
|
-
size: "sm",
|
|
47
54
|
variant: "primary",
|
|
48
|
-
|
|
49
|
-
disabled: !
|
|
55
|
+
size: "sm",
|
|
56
|
+
disabled: !r.hasImage || r.isLoadingImage || r.isSaving,
|
|
57
|
+
onClick: a.save,
|
|
58
|
+
className: "w-auto",
|
|
59
|
+
prefixIcon: r.isSaving ? /* @__PURE__ */ t.createElement(g, { className: "h-4 w-4 animate-spin" }) : /* @__PURE__ */ t.createElement(v, { className: "h-4 w-4" })
|
|
60
|
+
},
|
|
61
|
+
r.isSaving ? "Saving…" : u
|
|
62
|
+
), /* @__PURE__ */ t.createElement(
|
|
63
|
+
"button",
|
|
64
|
+
{
|
|
65
|
+
type: "button",
|
|
66
|
+
title: "Close",
|
|
67
|
+
onClick: () => a.close(),
|
|
68
|
+
className: "ml-auto flex h-[30px] w-[30px] items-center justify-center rounded-lg border border-neutral-1 bg-white text-light-4 hover:bg-light-3 hover:text-light-2"
|
|
50
69
|
},
|
|
51
|
-
"
|
|
52
|
-
), /* @__PURE__ */
|
|
53
|
-
|
|
54
|
-
|
|
70
|
+
/* @__PURE__ */ t.createElement(E, { className: "h-4 w-4" })
|
|
71
|
+
)), /* @__PURE__ */ t.createElement(
|
|
72
|
+
S,
|
|
73
|
+
{
|
|
74
|
+
ui: r,
|
|
75
|
+
engine: a,
|
|
76
|
+
onOpenFile: () => c.current?.click()
|
|
77
|
+
}
|
|
78
|
+
), /* @__PURE__ */ t.createElement(
|
|
79
|
+
"input",
|
|
80
|
+
{
|
|
81
|
+
ref: c,
|
|
82
|
+
type: "file",
|
|
83
|
+
accept: "image/*",
|
|
84
|
+
hidden: !0,
|
|
85
|
+
onChange: (e) => {
|
|
86
|
+
const f = e.target.files?.[0];
|
|
87
|
+
f && a.openFile(f), e.target.value = "";
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
), /* @__PURE__ */ t.createElement("div", { className: "image-editor-stage-panel-wrap relative flex min-h-0 flex-1" }, /* @__PURE__ */ t.createElement(N, { ui: r, engine: a }), /* @__PURE__ */ t.createElement(
|
|
91
|
+
w,
|
|
92
|
+
{
|
|
93
|
+
ref: i,
|
|
94
|
+
ui: r,
|
|
95
|
+
onChooseImage: () => c.current?.click(),
|
|
96
|
+
onDropFile: (e) => a.openFile(e)
|
|
97
|
+
}
|
|
98
|
+
), /* @__PURE__ */ t.createElement(y, { ui: r, engine: a })), /* @__PURE__ */ t.createElement(R, { ui: r })))
|
|
99
|
+
) : null;
|
|
100
|
+
}
|
|
55
101
|
export {
|
|
56
|
-
|
|
102
|
+
z as ImageEditorModal
|
|
57
103
|
};
|
|
58
104
|
//# sourceMappingURL=index128.es.js.map
|
package/dist/index128.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index128.es.js","sources":["../src/components/
|
|
1
|
+
{"version":3,"file":"index128.es.js","sources":["../src/components/organisms/image-editor/image-editor-modal.tsx"],"sourcesContent":["import { Loader2, Save, X } from 'lucide-react'\nimport React, { useEffect, useRef, useState } from 'react'\n\nimport { Button } from '@/components/atoms/button'\n\nimport { ImageEditorEngine, ImageEditorUiState } from './image-editor.types'\nimport { ImageEditorPortalContext } from './components/portal-context'\nimport { Panel } from './components/panel'\nimport { Ribbon } from './components/ribbon'\nimport { Stage, StageHandle } from './components/stage'\nimport { LineSessionBar } from './components/line-session-bar'\nimport { StatusBar } from './components/status-bar'\n\nexport interface ImageEditorModalProps {\n engine: ImageEditorEngine\n ui: ImageEditorUiState | null\n isOpen: boolean\n saveLabel: string\n}\n\nexport function ImageEditorModal({\n engine,\n ui,\n isOpen,\n saveLabel,\n}: ImageEditorModalProps) {\n const rootRef = useRef<HTMLDivElement | null>(null)\n const [rootEl, setRootEl] = useState<HTMLDivElement | null>(null)\n const stageRef = useRef<StageHandle>(null)\n const fileInputRef = useRef<HTMLInputElement>(null)\n const mountedRef = useRef(false)\n\n useEffect(() => {\n if (mountedRef.current) return\n const s = stageRef.current\n if (!s?.canvas || !s.overlay || !s.textEditor || !s.stage) return\n engine.mount({\n canvas: s.canvas,\n overlay: s.overlay,\n textEditor: s.textEditor,\n stage: s.stage,\n })\n mountedRef.current = true\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [ui != null])\n\n useEffect(() => {\n if (!isOpen || !rootRef.current) return\n if (!rootRef.current.hasAttribute('tabindex'))\n rootRef.current.setAttribute('tabindex', '-1')\n const t = setTimeout(\n () => rootRef.current?.focus({ preventScroll: true }),\n 0\n )\n return () => clearTimeout(t)\n }, [isOpen])\n\n useEffect(() => {\n if (!isOpen) return\n engine.refitStage()\n }, [isOpen, engine])\n\n if (!ui) return null\n\n return (\n <div\n ref={(node) => {\n rootRef.current = node\n setRootEl(node)\n }}\n className=\"fixed inset-0 z-[2147483000] flex items-center justify-center bg-[rgba(24,22,18,.55)] backdrop-blur-sm\"\n style={{\n display: isOpen ? 'flex' : 'none',\n pointerEvents: 'auto',\n }}\n onMouseDown={(e) => {\n if (e.target === e.currentTarget && ui.closeOnBackdrop) engine.close()\n }}\n >\n <ImageEditorPortalContext.Provider value={rootEl}>\n <div className=\"image-editor-modal-panel flex flex-col overflow-hidden bg-light-2 shadow-2xl\">\n <div className=\"flex items-center gap-3 border-b border-neutral-1 bg-light-3 px-4 py-3\">\n <Button\n variant=\"primary\"\n size=\"sm\"\n disabled={!ui.hasImage || ui.isLoadingImage || ui.isSaving}\n onClick={engine.save}\n className=\"w-auto\"\n prefixIcon={\n ui.isSaving ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Save className=\"h-4 w-4\" />\n )\n }\n >\n {ui.isSaving ? 'Saving…' : saveLabel}\n </Button>\n <button\n type=\"button\"\n title=\"Close\"\n onClick={() => engine.close()}\n className=\"ml-auto flex h-[30px] w-[30px] items-center justify-center rounded-lg border border-neutral-1 bg-white text-light-4 hover:bg-light-3 hover:text-light-2\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n </div>\n\n <Ribbon\n ui={ui}\n engine={engine}\n onOpenFile={() => fileInputRef.current?.click()}\n />\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/*\"\n hidden\n onChange={(e) => {\n const file = e.target.files?.[0]\n if (file) engine.openFile(file)\n e.target.value = ''\n }}\n />\n\n <div className=\"image-editor-stage-panel-wrap relative flex min-h-0 flex-1\">\n <LineSessionBar ui={ui} engine={engine} />\n <Stage\n ref={stageRef}\n ui={ui}\n onChooseImage={() => fileInputRef.current?.click()}\n onDropFile={(file) => engine.openFile(file)}\n />\n <Panel ui={ui} engine={engine} />\n </div>\n\n <StatusBar ui={ui} />\n </div>\n </ImageEditorPortalContext.Provider>\n </div>\n )\n}\n"],"names":["ImageEditorModal","engine","ui","isOpen","saveLabel","rootRef","useRef","rootEl","setRootEl","useState","stageRef","fileInputRef","mountedRef","useEffect","s","t","React","node","ImageEditorPortalContext","Button","Loader2","Save","X","Ribbon","file","LineSessionBar","Stage","Panel","StatusBar"],"mappings":"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"}
|
package/dist/index129.es.js
CHANGED
|
@@ -1,19 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
r = function(o, n) {
|
|
8
|
-
e.usingClientEntryPoint = !0;
|
|
1
|
+
function i() {
|
|
2
|
+
return typeof window > "u" ? null : window.ReactNativeWebView ?? null;
|
|
3
|
+
}
|
|
4
|
+
function n(t) {
|
|
5
|
+
const e = i();
|
|
6
|
+
if (e)
|
|
9
7
|
try {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
8
|
+
e.postMessage(
|
|
9
|
+
JSON.stringify({ type: "IMAGE_EDITOR", payload: { data: { open: t } } })
|
|
10
|
+
);
|
|
11
|
+
} catch {
|
|
13
12
|
}
|
|
14
|
-
};
|
|
15
13
|
}
|
|
16
14
|
export {
|
|
17
|
-
|
|
15
|
+
n as notifyNativeImageEditorState
|
|
18
16
|
};
|
|
19
17
|
//# sourceMappingURL=index129.es.js.map
|
package/dist/index129.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index129.es.js","sources":["../
|
|
1
|
+
{"version":3,"file":"index129.es.js","sources":["../src/components/organisms/image-editor/native-bridge.ts"],"sourcesContent":["type ReactNativeWebViewBridge = { postMessage: (message: string) => void }\n\nfunction getNativeBridge(): ReactNativeWebViewBridge | null {\n if (typeof window === 'undefined') return null\n const host = window as unknown as {\n ReactNativeWebView?: ReactNativeWebViewBridge\n }\n return host.ReactNativeWebView ?? null\n}\n\n/** No-op outside a React Native WebView. */\nexport function notifyNativeImageEditorState(open: boolean): void {\n const bridge = getNativeBridge()\n if (!bridge) return\n\n try {\n bridge.postMessage(\n JSON.stringify({ type: 'IMAGE_EDITOR', payload: { data: { open } } })\n )\n } catch {\n // noop\n }\n}\n"],"names":["getNativeBridge","notifyNativeImageEditorState","open","bridge"],"mappings":"AAEA,SAASA,IAAmD;AAC1D,SAAI,OAAO,SAAW,MAAoB,OAC7B,OAGD,sBAAsB;AACpC;AAGO,SAASC,EAA6BC,GAAqB;AAChE,QAAMC,IAASH,EAAA;AACf,MAAKG;AAEL,QAAI;AACF,MAAAA,EAAO;AAAA,QACL,KAAK,UAAU,EAAE,MAAM,gBAAgB,SAAS,EAAE,MAAM,EAAE,MAAAD,EAAA,IAAO,CAAG;AAAA,MAAA;AAAA,IAExE,QAAQ;AAAA,IAER;AACF;"}
|
package/dist/index130.es.js
CHANGED
|
@@ -1,104 +1,152 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
},
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
{
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
1
|
+
import { VERSION as L } from "./index152.es.js";
|
|
2
|
+
import { CROP_RATIOS as st, FILTERS as ot, FONTS as rt, SHAPES as it, SWATCHES as dt } from "./index152.es.js";
|
|
3
|
+
import { createState as b, getState as C, emit as i, emptySourceCanvas as g, resetAdjValues as v, getSel as x } from "./index153.es.js";
|
|
4
|
+
import { zoomIn as T, zoomOut as z, zoomToFit as F, ZOOM_MIN as O, ZOOM_MAX as k, syncCanvasSize as w, render as p, fitStage as I } from "./index154.es.js";
|
|
5
|
+
import { undo as P, redo as E } from "./index155.es.js";
|
|
6
|
+
import { rotate as u, flip as y, resetToOriginal as R, applyCrop as M, cancelCrop as A, setCropRatio as W } from "./index156.es.js";
|
|
7
|
+
import { setMode as B, selectLayer as D } from "./index157.es.js";
|
|
8
|
+
import { commitTextEdit as m } from "./index158.es.js";
|
|
9
|
+
import { addSticker as _ } from "./index159.es.js";
|
|
10
|
+
import { deleteLayer as j, deleteSelected as H, duplicateSelected as U, bringSelectedToFront as N, sendSelectedToBack as Z, setAdjustment as $, setFilter as q, selectShapeType as V, setShapeFill as X, setShapeWidth as G, setBrushSize as J, setBrushStyle as K, setTextFont as Q, setTextSize as Y, setTextColor as ee, setShapeColor as te, setDrawColor as ae, setSelectedColor as le, setSelectedText as se, setSelectedFont as oe, setSelectedTextSize as re, setSelectedBoxWidth as ie, setSelectedShapeFill as de, setSelectedWidth as ne, setSelectedLabel as ce, setSelectedLabelSize as Se, setSelectedLabelColor as pe, setSelectedLabelFont as ue, setSelectedClosed as ye, setSelectedLabelSide as me, setSelectedLabelOffset as he, setSelectedLabelPos as fe, setSelectedLabelRotate as Le, setSelectedLabelDx as be, setSelectedLabelDy as Ce, setMultiPointMode as ge, layerName as ve, rotateSelected as xe, flipSelected as Te } from "./index160.es.js";
|
|
11
|
+
import { doSave as ze, produce as Fe, normalizeSource as d, loadState as h, doLoadImage as n } from "./index161.es.js";
|
|
12
|
+
import { loadSavedLayers as Oe, saveSelectedLayer as ke, insertSavedLayer as we, deleteSavedLayer as Ie, renameSavedLayer as Pe, setSavedLayers as Ee, insertSavedLayerEntry as Re, searchSavedLayers as Me, canSearch as Ae } from "./index162.es.js";
|
|
13
|
+
import { mount as We } from "./index163.es.js";
|
|
14
|
+
import { resumePoly as Be, finishPoly as f, undoPolyPoint as De, cancelPoly as _e, polyStatus as je } from "./index164.es.js";
|
|
15
|
+
function c(s, a) {
|
|
16
|
+
queueMicrotask(() => {
|
|
17
|
+
throw new Error(`[image-editor] ${s}`, { cause: a });
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
function He(s) {
|
|
21
|
+
s = s || {};
|
|
22
|
+
const a = {}, t = b(s);
|
|
23
|
+
Oe(t);
|
|
24
|
+
function o() {
|
|
25
|
+
try {
|
|
26
|
+
typeof s.onUiChange == "function" && s.onUiChange(S());
|
|
27
|
+
} catch (e) {
|
|
28
|
+
c("onUiChange threw", e);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
t.notify = o, a.on = (e, l) => (t.listeners[e] && t.listeners[e].push(l), a), a.off = (e, l) => (t.listeners[e] && (t.listeners[e] = t.listeners[e].filter((r) => r !== l)), a);
|
|
32
|
+
function S() {
|
|
33
|
+
const e = x(t);
|
|
34
|
+
return {
|
|
35
|
+
hasImage: !!t.sourceCanvas.width,
|
|
36
|
+
mode: t.mode,
|
|
37
|
+
canUndo: t.undoStack.length > 0,
|
|
38
|
+
canRedo: t.redoStack.length > 0,
|
|
39
|
+
canReset: !!t.originalCanvas,
|
|
40
|
+
zoomPercent: Math.round(t.zoom * 100),
|
|
41
|
+
canZoomIn: t.zoom < k - 1e-6,
|
|
42
|
+
canZoomOut: t.zoom > O + 1e-6,
|
|
43
|
+
closeOnBackdrop: s.closeOnBackdrop !== !1,
|
|
44
|
+
canOpenImage: s.allowOpenImage !== !1,
|
|
45
|
+
isEditingText: !!t.editingLayer,
|
|
46
|
+
editingSelectAll: t.editingSelectAll,
|
|
47
|
+
dims: t.sourceCanvas.width ? `${t.sourceCanvas.width} × ${t.sourceCanvas.height} px` : "No image",
|
|
48
|
+
statusText: t.statusText,
|
|
49
|
+
isSaving: t.isSaving,
|
|
50
|
+
isLoadingImage: t.isLoadingImage,
|
|
51
|
+
adjustments: { ...t.adj },
|
|
52
|
+
selectedShapeType: t.selectedShapeType,
|
|
53
|
+
multiPointMode: !!t.multiPointMode,
|
|
54
|
+
canSearchSavedLayers: Ae(t),
|
|
55
|
+
savedLayers: (t.savedLayers || []).map((l) => ({
|
|
56
|
+
id: l.id,
|
|
57
|
+
name: l.name,
|
|
58
|
+
type: l.layer?.type,
|
|
59
|
+
createdAt: l.createdAt
|
|
60
|
+
})),
|
|
61
|
+
poly: je(t),
|
|
62
|
+
textColor: t.textColor,
|
|
63
|
+
shapeColor: t.shapeColor,
|
|
64
|
+
drawColor: t.drawColor,
|
|
65
|
+
shapeFill: t.shapeFill,
|
|
66
|
+
shapeWidth: t.shapeWidth,
|
|
67
|
+
brushSize: t.brushSize,
|
|
68
|
+
brushStyle: t.brushStyle,
|
|
69
|
+
textFont: t.textFont,
|
|
70
|
+
textSize: t.textSize,
|
|
71
|
+
cropRatio: t.cropRatio,
|
|
72
|
+
stickers: t.stickers,
|
|
73
|
+
selected: e ? {
|
|
74
|
+
id: e.id,
|
|
75
|
+
type: e.type,
|
|
76
|
+
color: e.color,
|
|
77
|
+
text: e.type === "text" ? e.text : void 0,
|
|
78
|
+
font: e.type === "text" ? e.font : void 0,
|
|
79
|
+
size: e.type === "text" ? e.size : void 0,
|
|
80
|
+
boxWidth: e.type === "text" ? e.boxWidth : void 0,
|
|
81
|
+
fill: e.type === "shape" ? e.fill : void 0,
|
|
82
|
+
width: e.type === "shape" || e.type === "stroke" ? e.width : void 0,
|
|
83
|
+
shape: e.type === "shape" ? e.shape : void 0,
|
|
84
|
+
label: e.type === "shape" ? e.label ?? "" : void 0,
|
|
85
|
+
labelSize: e.type === "shape" ? e.labelSize : void 0,
|
|
86
|
+
labelColor: e.type === "shape" ? e.labelColor : void 0,
|
|
87
|
+
labelFont: e.type === "shape" ? e.labelFont : void 0,
|
|
88
|
+
pointCount: e.type === "shape" && e.points ? e.points.length : void 0,
|
|
89
|
+
closed: e.type === "shape" ? !!e.closed : void 0,
|
|
90
|
+
labelSide: e.type === "shape" ? e.labelSide ?? "above" : void 0,
|
|
91
|
+
labelOffset: e.type === "shape" ? e.labelOffset : void 0,
|
|
92
|
+
labelPos: e.type === "shape" ? e.labelPos ?? 0.5 : void 0,
|
|
93
|
+
labelRotate: e.type === "shape" ? e.labelRotate !== !1 : void 0,
|
|
94
|
+
labelDx: e.type === "shape" ? e.labelDx ?? 0 : void 0,
|
|
95
|
+
labelDy: e.type === "shape" ? e.labelDy ?? 0 : void 0
|
|
96
|
+
} : null,
|
|
97
|
+
layers: t.layers.map((l) => ({
|
|
98
|
+
id: l.id,
|
|
99
|
+
type: l.type,
|
|
100
|
+
name: ve(l)
|
|
101
|
+
}))
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
return a.getUiState = S, a.refitStage = () => {
|
|
105
|
+
!t.mounted || !t.sourceCanvas.width || (I(t), p(t));
|
|
106
|
+
}, a.zoomIn = () => T(t), a.zoomOut = () => z(t), a.zoomToFit = () => F(t), a.setMode = (e) => B(t, e), a.selectLayer = (e) => D(t, e), a.undo = () => P(t), a.redo = () => E(t), a.rotate = (e) => t.selectedId != null ? xe(t, e) : u(t, e), a.flip = (e) => t.selectedId != null ? Te(t, e) : y(t, e), a.rotateImage = (e) => u(t, e), a.flipImage = (e) => y(t, e), a.resetToOriginal = () => R(t), a.applyCrop = () => M(t), a.cancelCrop = () => A(t), a.setCropRatio = (e) => W(t, e), a.commitTextEdit = () => m(t), a.addSticker = (e) => _(t, e), a.setStickers = (e) => {
|
|
107
|
+
t.stickers = e || [], o();
|
|
108
|
+
}, a.deleteLayer = (e) => j(t, e), a.deleteSelected = () => H(t), a.duplicateSelected = () => U(t), a.bringSelectedToFront = () => N(t), a.sendSelectedToBack = () => Z(t), a.setAdjustment = (e, l) => $(t, e, l), a.setFilter = (e) => q(t, e), a.selectShapeType = (e) => V(t, e), a.setShapeFill = (e) => X(t, e), a.setShapeWidth = (e) => G(t, e), a.setBrushSize = (e) => J(t, e), a.setBrushStyle = (e) => K(t, e), a.setTextFont = (e) => Q(t, e), a.setTextSize = (e) => Y(t, e), a.setTextColor = (e) => ee(t, e), a.setShapeColor = (e) => te(t, e), a.setDrawColor = (e) => ae(t, e), a.setSelectedColor = (e) => le(t, e), a.setSelectedText = (e) => se(t, e), a.setSelectedFont = (e) => oe(t, e), a.setSelectedTextSize = (e) => re(t, e), a.setSelectedBoxWidth = (e) => ie(t, e), a.setSelectedShapeFill = (e) => de(t, e), a.setSelectedWidth = (e) => ne(t, e), a.setSelectedLabel = (e) => ce(t, e), a.setSelectedLabelSize = (e) => Se(t, e), a.setSelectedLabelColor = (e) => pe(t, e), a.setSelectedLabelFont = (e) => ue(t, e), a.setSelectedClosed = (e) => ye(t, e), a.setSelectedLabelSide = (e) => me(t, e), a.setSelectedLabelOffset = (e) => he(t, e), a.setSelectedLabelPos = (e) => fe(t, e), a.setSelectedLabelRotate = (e) => Le(t, e), a.setSelectedLabelDx = (e) => be(t, e), a.setSelectedLabelDy = (e) => Ce(t, e), a.setMultiPointMode = (e) => ge(t, e), a.continueSelectedLine = () => Be(t), a.finishLine = () => f(t, !1), a.closeLine = () => f(t, !0), a.undoLinePoint = () => De(t), a.cancelLine = () => _e(t), a.saveSelectedLayer = (e) => ke(t, e), a.insertSavedLayer = (e) => we(t, e), a.deleteSavedLayer = (e) => Ie(t, e), a.renameSavedLayer = (e, l) => Pe(t, e, l), a.getSavedLayers = () => (t.savedLayers || []).slice(), a.setSavedLayers = (e) => Ee(t, e), a.insertSavedLayerEntry = (e) => Re(t, e), a.searchSavedLayers = (e) => Me(t, e), a.save = () => ze(t, a), a.export = (e) => (e = e || {}, t.sourceCanvas.width ? Fe(t, e.type, e.quality) : Promise.resolve(null)), a.getState = () => C(t), a.mount = (e) => We(t, a, e), a.openFile = (e) => d(
|
|
109
|
+
t,
|
|
110
|
+
e,
|
|
111
|
+
(l) => n(t, l)
|
|
112
|
+
), a.open = (e) => {
|
|
113
|
+
if (e = e || {}, t.isOpenFlag)
|
|
114
|
+
return o(), i(t, "open", {}), a;
|
|
115
|
+
t.isOpenFlag = !0;
|
|
116
|
+
const l = () => {
|
|
117
|
+
try {
|
|
118
|
+
t.mounted && t.sourceCanvas.width && (w(t), p(t));
|
|
119
|
+
} catch (r) {
|
|
120
|
+
c("render on open failed", r);
|
|
97
121
|
}
|
|
98
|
-
|
|
99
|
-
|
|
122
|
+
o(), i(t, "open", {});
|
|
123
|
+
};
|
|
124
|
+
return e.state ? (h(t, e.state), setTimeout(l, 0)) : e.image ? d(t, e.image, (r) => {
|
|
125
|
+
n(t, r), setTimeout(l, 0);
|
|
126
|
+
}) : setTimeout(l, 0), a;
|
|
127
|
+
}, a.close = () => {
|
|
128
|
+
t.isOpenFlag = !1;
|
|
129
|
+
try {
|
|
130
|
+
m(t);
|
|
131
|
+
} catch (e) {
|
|
132
|
+
c("commit on close failed", e);
|
|
133
|
+
}
|
|
134
|
+
return o(), i(t, "close", {}), a;
|
|
135
|
+
}, a.loadImage = (e) => (d(
|
|
136
|
+
t,
|
|
137
|
+
e,
|
|
138
|
+
(l) => n(t, l)
|
|
139
|
+
), a), a.loadState = (e) => (h(t, e), a), a.reset = () => (t.sourceCanvas = g(), t.originalCanvas = null, t.layers = [], t.selectedId = null, t.undoStack = [], t.redoStack = [], t.zoom = 1, v(t), t.statusText = "Ready", o(), a), a.isOpen = () => t.isOpenFlag, a.destroy = () => {
|
|
140
|
+
a._keyHandler && document.removeEventListener("keydown", a._keyHandler), a._resizeHandler && window.removeEventListener("resize", a._resizeHandler), Object.keys(t.listeners).forEach((e) => t.listeners[e] = []);
|
|
141
|
+
}, s.autoOpen && a.open({ image: s.image, state: s.state }), a;
|
|
100
142
|
}
|
|
143
|
+
const tt = { version: L, create: He };
|
|
101
144
|
export {
|
|
102
|
-
|
|
145
|
+
st as CROP_RATIOS,
|
|
146
|
+
ot as FILTERS,
|
|
147
|
+
rt as FONTS,
|
|
148
|
+
it as SHAPES,
|
|
149
|
+
dt as SWATCHES,
|
|
150
|
+
tt as default
|
|
103
151
|
};
|
|
104
152
|
//# sourceMappingURL=index130.es.js.map
|
package/dist/index130.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index130.es.js","sources":["../src/components/organisms/image-editor/image-editor-modal.tsx"],"sourcesContent":["import { Loader2, Save, X } from 'lucide-react'\nimport React, { useEffect, useRef, useState } from 'react'\n\nimport { Button } from '@/components/atoms/button'\n\nimport { ImageEditorEngine, ImageEditorUiState } from './image-editor.types'\nimport { ImageEditorPortalContext } from './components/portal-context'\nimport { Panel } from './components/panel'\nimport { Ribbon } from './components/ribbon'\nimport { Stage, StageHandle } from './components/stage'\nimport { LineSessionBar } from './components/line-session-bar'\nimport { StatusBar } from './components/status-bar'\n\nexport interface ImageEditorModalProps {\n engine: ImageEditorEngine\n ui: ImageEditorUiState | null\n isOpen: boolean\n saveLabel: string\n}\n\nexport function ImageEditorModal({\n engine,\n ui,\n isOpen,\n saveLabel,\n}: ImageEditorModalProps) {\n const rootRef = useRef<HTMLDivElement | null>(null)\n const [rootEl, setRootEl] = useState<HTMLDivElement | null>(null)\n const stageRef = useRef<StageHandle>(null)\n const fileInputRef = useRef<HTMLInputElement>(null)\n const mountedRef = useRef(false)\n\n useEffect(() => {\n if (mountedRef.current) return\n const s = stageRef.current\n if (!s?.canvas || !s.overlay || !s.textEditor || !s.stage) return\n engine.mount({\n canvas: s.canvas,\n overlay: s.overlay,\n textEditor: s.textEditor,\n stage: s.stage,\n })\n mountedRef.current = true\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [ui != null])\n\n useEffect(() => {\n if (!isOpen || !rootRef.current) return\n if (!rootRef.current.hasAttribute('tabindex'))\n rootRef.current.setAttribute('tabindex', '-1')\n const t = setTimeout(\n () => rootRef.current?.focus({ preventScroll: true }),\n 0\n )\n return () => clearTimeout(t)\n }, [isOpen])\n\n useEffect(() => {\n if (!isOpen) return\n engine.refitStage()\n }, [isOpen, engine])\n\n if (!ui) return null\n\n return (\n <div\n ref={(node) => {\n rootRef.current = node\n setRootEl(node)\n }}\n className=\"fixed inset-0 z-[2147483000] flex items-center justify-center bg-[rgba(24,22,18,.55)] backdrop-blur-sm\"\n style={{\n display: isOpen ? 'flex' : 'none',\n pointerEvents: 'auto',\n }}\n onMouseDown={(e) => {\n if (e.target === e.currentTarget && ui.closeOnBackdrop) engine.close()\n }}\n >\n <ImageEditorPortalContext.Provider value={rootEl}>\n <div className=\"image-editor-modal-panel flex flex-col overflow-hidden bg-light-2 shadow-2xl\">\n <div className=\"flex items-center gap-3 border-b border-neutral-1 bg-light-3 px-4 py-3\">\n <Button\n variant=\"primary\"\n size=\"sm\"\n disabled={!ui.hasImage || ui.isLoadingImage || ui.isSaving}\n onClick={engine.save}\n className=\"w-auto\"\n prefixIcon={\n ui.isSaving ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Save className=\"h-4 w-4\" />\n )\n }\n >\n {ui.isSaving ? 'Saving…' : saveLabel}\n </Button>\n <button\n type=\"button\"\n title=\"Close\"\n onClick={() => engine.close()}\n className=\"ml-auto flex h-[30px] w-[30px] items-center justify-center rounded-lg border border-neutral-1 bg-white text-light-4 hover:bg-light-3 hover:text-light-2\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n </div>\n\n <Ribbon\n ui={ui}\n engine={engine}\n onOpenFile={() => fileInputRef.current?.click()}\n />\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/*\"\n hidden\n onChange={(e) => {\n const file = e.target.files?.[0]\n if (file) engine.openFile(file)\n e.target.value = ''\n }}\n />\n\n <div className=\"image-editor-stage-panel-wrap relative flex min-h-0 flex-1\">\n <LineSessionBar ui={ui} engine={engine} />\n <Stage\n ref={stageRef}\n ui={ui}\n onChooseImage={() => fileInputRef.current?.click()}\n onDropFile={(file) => engine.openFile(file)}\n />\n <Panel ui={ui} engine={engine} />\n </div>\n\n <StatusBar ui={ui} />\n </div>\n </ImageEditorPortalContext.Provider>\n </div>\n )\n}\n"],"names":["ImageEditorModal","engine","ui","isOpen","saveLabel","rootRef","useRef","rootEl","setRootEl","useState","stageRef","fileInputRef","mountedRef","useEffect","s","t","React","node","ImageEditorPortalContext","Button","Loader2","Save","X","Ribbon","file","LineSessionBar","Stage","Panel","StatusBar"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index130.es.js","sources":["../src/components/organisms/image-editor/picture-studio-engine.js"],"sourcesContent":["import {\n FILTERS,\n SWATCHES,\n SHAPES,\n FONTS,\n CROP_RATIOS,\n VERSION,\n} from './engine/constants.js'\nimport {\n createState,\n emit,\n emptySourceCanvas,\n getSel,\n getState as readState,\n resetAdjValues,\n} from './engine/state.js'\nimport {\n fitStage,\n render,\n syncCanvasSize,\n zoomIn,\n zoomOut,\n zoomToFit,\n ZOOM_MIN,\n ZOOM_MAX,\n} from './engine/rendering.js'\nimport * as history from './engine/history.js'\nimport * as geometry from './engine/geometry.js'\nimport * as mode from './engine/mode.js'\nimport * as textEditor from './engine/text-editor.js'\nimport * as stickers from './engine/stickers.js'\nimport * as layerActions from './engine/layer-actions.js'\nimport * as saveExport from './engine/save-export.js'\nimport * as savedLayers from './engine/saved-layers.js'\nimport { mount as mountEngine } from './engine/mount.js'\nimport {\n resumePoly,\n polyStatus,\n finishPoly,\n cancelPoly,\n undoPolyPoint,\n} from './engine/pointer.js'\n\nexport { FILTERS, SWATCHES, SHAPES, FONTS, CROP_RATIOS }\n\nfunction reportError(context, error) {\n // Surfaces in DevTools via window.onerror with the stack intact, without\n // aborting the caller and without a console call the lint config forbids.\n queueMicrotask(() => {\n throw new Error(`[image-editor] ${context}`, { cause: error })\n })\n}\n\nfunction createEngine(config) {\n config = config || {}\n const self = {}\n const state = createState(config)\n savedLayers.loadSavedLayers(state)\n\n function notify() {\n // onUiChange is host code (a React setState, usually). A throw here used to\n // abort open() before its 'open' event fired, leaving isOpenFlag true while\n // the UI stayed closed -- after which every open() silently no-opped and the\n // editor could never be reopened.\n try {\n if (typeof config.onUiChange === 'function') {\n config.onUiChange(getUiState())\n }\n } catch (e) {\n reportError('onUiChange threw', e)\n }\n }\n state.notify = notify\n\n self.on = (ev, fn) => {\n if (state.listeners[ev]) state.listeners[ev].push(fn)\n return self\n }\n self.off = (ev, fn) => {\n if (state.listeners[ev])\n state.listeners[ev] = state.listeners[ev].filter((f) => f !== fn)\n return self\n }\n\n function getUiState() {\n const sel = getSel(state)\n return {\n hasImage: !!state.sourceCanvas.width,\n mode: state.mode,\n canUndo: state.undoStack.length > 0,\n canRedo: state.redoStack.length > 0,\n canReset: !!state.originalCanvas,\n zoomPercent: Math.round(state.zoom * 100),\n canZoomIn: state.zoom < ZOOM_MAX - 1e-6,\n canZoomOut: state.zoom > ZOOM_MIN + 1e-6,\n closeOnBackdrop: config.closeOnBackdrop !== false,\n canOpenImage: config.allowOpenImage !== false,\n isEditingText: !!state.editingLayer,\n editingSelectAll: state.editingSelectAll,\n dims: state.sourceCanvas.width\n ? `${state.sourceCanvas.width} × ${state.sourceCanvas.height} px`\n : 'No image',\n statusText: state.statusText,\n isSaving: state.isSaving,\n isLoadingImage: state.isLoadingImage,\n adjustments: { ...state.adj },\n selectedShapeType: state.selectedShapeType,\n multiPointMode: !!state.multiPointMode,\n canSearchSavedLayers: savedLayers.canSearch(state),\n savedLayers: (state.savedLayers || []).map((e) => ({\n id: e.id,\n name: e.name,\n type: e.layer?.type,\n createdAt: e.createdAt,\n })),\n poly: polyStatus(state),\n textColor: state.textColor,\n shapeColor: state.shapeColor,\n drawColor: state.drawColor,\n shapeFill: state.shapeFill,\n shapeWidth: state.shapeWidth,\n brushSize: state.brushSize,\n brushStyle: state.brushStyle,\n textFont: state.textFont,\n textSize: state.textSize,\n cropRatio: state.cropRatio,\n stickers: state.stickers,\n selected: sel\n ? {\n id: sel.id,\n type: sel.type,\n color: sel.color,\n text: sel.type === 'text' ? sel.text : undefined,\n font: sel.type === 'text' ? sel.font : undefined,\n size: sel.type === 'text' ? sel.size : undefined,\n boxWidth: sel.type === 'text' ? sel.boxWidth : undefined,\n fill: sel.type === 'shape' ? sel.fill : undefined,\n width:\n sel.type === 'shape' || sel.type === 'stroke'\n ? sel.width\n : undefined,\n shape: sel.type === 'shape' ? sel.shape : undefined,\n label: sel.type === 'shape' ? (sel.label ?? '') : undefined,\n labelSize: sel.type === 'shape' ? sel.labelSize : undefined,\n labelColor: sel.type === 'shape' ? sel.labelColor : undefined,\n labelFont: sel.type === 'shape' ? sel.labelFont : undefined,\n pointCount:\n sel.type === 'shape' && sel.points\n ? sel.points.length\n : undefined,\n closed: sel.type === 'shape' ? !!sel.closed : undefined,\n labelSide:\n sel.type === 'shape' ? (sel.labelSide ?? 'above') : undefined,\n labelOffset: sel.type === 'shape' ? sel.labelOffset : undefined,\n labelPos: sel.type === 'shape' ? (sel.labelPos ?? 0.5) : undefined,\n labelRotate:\n sel.type === 'shape' ? sel.labelRotate !== false : undefined,\n labelDx: sel.type === 'shape' ? (sel.labelDx ?? 0) : undefined,\n labelDy: sel.type === 'shape' ? (sel.labelDy ?? 0) : undefined,\n }\n : null,\n layers: state.layers.map((l) => ({\n id: l.id,\n type: l.type,\n name: layerActions.layerName(l),\n })),\n }\n }\n self.getUiState = getUiState\n\n self.refitStage = () => {\n if (!state.mounted || !state.sourceCanvas.width) return\n fitStage(state)\n render(state)\n }\n self.zoomIn = () => zoomIn(state)\n self.zoomOut = () => zoomOut(state)\n self.zoomToFit = () => zoomToFit(state)\n self.setMode = (m) => mode.setMode(state, m)\n self.selectLayer = (id) => mode.selectLayer(state, id)\n self.undo = () => history.undo(state)\n self.redo = () => history.redo(state)\n // With a layer selected these act on that layer; otherwise on the image.\n self.rotate = (deg) =>\n state.selectedId != null\n ? layerActions.rotateSelected(state, deg)\n : geometry.rotate(state, deg)\n self.flip = (hz) =>\n state.selectedId != null\n ? layerActions.flipSelected(state, hz)\n : geometry.flip(state, hz)\n // Explicit escape hatches, so the image can still be transformed directly.\n self.rotateImage = (deg) => geometry.rotate(state, deg)\n self.flipImage = (hz) => geometry.flip(state, hz)\n self.resetToOriginal = () => geometry.resetToOriginal(state)\n self.applyCrop = () => geometry.applyCrop(state)\n self.cancelCrop = () => geometry.cancelCrop(state)\n self.setCropRatio = (v) => geometry.setCropRatio(state, v)\n self.commitTextEdit = () => textEditor.commitTextEdit(state)\n self.addSticker = (src) => stickers.addSticker(state, src)\n self.setStickers = (list) => {\n state.stickers = list || []\n notify()\n }\n self.deleteLayer = (id) => layerActions.deleteLayer(state, id)\n self.deleteSelected = () => layerActions.deleteSelected(state)\n self.duplicateSelected = () => layerActions.duplicateSelected(state)\n self.bringSelectedToFront = () => layerActions.bringSelectedToFront(state)\n self.sendSelectedToBack = () => layerActions.sendSelectedToBack(state)\n self.setAdjustment = (key, value) =>\n layerActions.setAdjustment(state, key, value)\n self.setFilter = (id) => layerActions.setFilter(state, id)\n self.selectShapeType = (id) => layerActions.selectShapeType(state, id)\n self.setShapeFill = (v) => layerActions.setShapeFill(state, v)\n self.setShapeWidth = (v) => layerActions.setShapeWidth(state, v)\n self.setBrushSize = (v) => layerActions.setBrushSize(state, v)\n self.setBrushStyle = (v) => layerActions.setBrushStyle(state, v)\n self.setTextFont = (v) => layerActions.setTextFont(state, v)\n self.setTextSize = (v) => layerActions.setTextSize(state, v)\n self.setTextColor = (v) => layerActions.setTextColor(state, v)\n self.setShapeColor = (v) => layerActions.setShapeColor(state, v)\n self.setDrawColor = (v) => layerActions.setDrawColor(state, v)\n self.setSelectedColor = (v) => layerActions.setSelectedColor(state, v)\n self.setSelectedText = (v) => layerActions.setSelectedText(state, v)\n self.setSelectedFont = (v) => layerActions.setSelectedFont(state, v)\n self.setSelectedTextSize = (v) => layerActions.setSelectedTextSize(state, v)\n self.setSelectedBoxWidth = (v) => layerActions.setSelectedBoxWidth(state, v)\n self.setSelectedShapeFill = (v) => layerActions.setSelectedShapeFill(state, v)\n self.setSelectedWidth = (v) => layerActions.setSelectedWidth(state, v)\n self.setSelectedLabel = (v) => layerActions.setSelectedLabel(state, v)\n self.setSelectedLabelSize = (v) => layerActions.setSelectedLabelSize(state, v)\n self.setSelectedLabelColor = (v) =>\n layerActions.setSelectedLabelColor(state, v)\n self.setSelectedLabelFont = (v) => layerActions.setSelectedLabelFont(state, v)\n self.setSelectedClosed = (v) => layerActions.setSelectedClosed(state, v)\n self.setSelectedLabelSide = (v) => layerActions.setSelectedLabelSide(state, v)\n self.setSelectedLabelOffset = (v) =>\n layerActions.setSelectedLabelOffset(state, v)\n self.setSelectedLabelPos = (v) => layerActions.setSelectedLabelPos(state, v)\n self.setSelectedLabelRotate = (v) =>\n layerActions.setSelectedLabelRotate(state, v)\n self.setSelectedLabelDx = (v) => layerActions.setSelectedLabelDx(state, v)\n self.setSelectedLabelDy = (v) => layerActions.setSelectedLabelDy(state, v)\n self.setMultiPointMode = (v) => layerActions.setMultiPointMode(state, v)\n self.continueSelectedLine = () => resumePoly(state)\n // Touch has no Enter/Esc/Backspace, so every session action needs a button.\n self.finishLine = () => finishPoly(state, false)\n self.closeLine = () => finishPoly(state, true)\n self.undoLinePoint = () => undoPolyPoint(state)\n self.cancelLine = () => cancelPoly(state)\n self.saveSelectedLayer = (name) => savedLayers.saveSelectedLayer(state, name)\n self.insertSavedLayer = (id) => savedLayers.insertSavedLayer(state, id)\n self.deleteSavedLayer = (id) => savedLayers.deleteSavedLayer(state, id)\n self.renameSavedLayer = (id, name) =>\n savedLayers.renameSavedLayer(state, id, name)\n self.getSavedLayers = () => (state.savedLayers || []).slice()\n self.setSavedLayers = (list) => savedLayers.setSavedLayers(state, list)\n self.insertSavedLayerEntry = (entry) =>\n savedLayers.insertSavedLayerEntry(state, entry)\n self.searchSavedLayers = (q) => savedLayers.searchSavedLayers(state, q)\n self.save = () => saveExport.doSave(state, self)\n self.export = (opts) => {\n opts = opts || {}\n if (!state.sourceCanvas.width) return Promise.resolve(null)\n return saveExport.produce(state, opts.type, opts.quality)\n }\n self.getState = () => readState(state)\n self.mount = (refs) => mountEngine(state, self, refs)\n self.openFile = (file) =>\n saveExport.normalizeSource(state, file, (d) =>\n saveExport.doLoadImage(state, d)\n )\n\n self.open = (opts) => {\n opts = opts || {}\n if (state.isOpenFlag) {\n // Already flagged open. Re-emit rather than only notifying: if the host\n // never saw the last 'open' -- a throw mid-open, or a wrapper that hid\n // itself without calling close -- the flag and the UI have drifted apart,\n // and every later open() would no-op, leaving a permanently dead button.\n notify()\n emit(state, 'open', {})\n return self\n }\n state.isOpenFlag = true\n const finish = () => {\n try {\n if (state.mounted && state.sourceCanvas.width) {\n syncCanvasSize(state)\n render(state)\n }\n } catch (e) {\n // A render failure must not strand isOpenFlag: the event below is what\n // the host listens on, and without it the editor can never reopen.\n reportError('render on open failed', e)\n }\n notify()\n emit(state, 'open', {})\n }\n if (opts.state) {\n saveExport.loadState(state, opts.state)\n setTimeout(finish, 0)\n } else if (opts.image) {\n saveExport.normalizeSource(state, opts.image, (d) => {\n saveExport.doLoadImage(state, d)\n setTimeout(finish, 0)\n })\n } else {\n setTimeout(finish, 0)\n }\n return self\n }\n self.close = () => {\n state.isOpenFlag = false\n try {\n textEditor.commitTextEdit(state)\n } catch (e) {\n reportError('commit on close failed', e)\n }\n notify()\n emit(state, 'close', {})\n return self\n }\n self.loadImage = (src) => {\n saveExport.normalizeSource(state, src, (d) =>\n saveExport.doLoadImage(state, d)\n )\n return self\n }\n self.loadState = (s) => {\n saveExport.loadState(state, s)\n return self\n }\n self.reset = () => {\n state.sourceCanvas = emptySourceCanvas()\n state.originalCanvas = null\n state.layers = []\n state.selectedId = null\n state.undoStack = []\n state.redoStack = []\n state.zoom = 1\n resetAdjValues(state)\n state.statusText = 'Ready'\n notify()\n return self\n }\n self.isOpen = () => state.isOpenFlag\n self.destroy = () => {\n if (self._keyHandler)\n document.removeEventListener('keydown', self._keyHandler)\n if (self._resizeHandler)\n window.removeEventListener('resize', self._resizeHandler)\n Object.keys(state.listeners).forEach((k) => (state.listeners[k] = []))\n }\n\n if (config.autoOpen) self.open({ image: config.image, state: config.state })\n\n return self\n}\n\nconst PictureStudioEngine = { version: VERSION, create: createEngine }\nexport default PictureStudioEngine\n"],"names":["reportError","context","error","createEngine","config","self","state","createState","savedLayers.loadSavedLayers","notify","getUiState","ev","fn","f","sel","getSel","ZOOM_MAX","ZOOM_MIN","savedLayers.canSearch","e","polyStatus","layerActions.layerName","fitStage","render","zoomIn","zoomOut","zoomToFit","m","mode.setMode","id","mode.selectLayer","history.undo","history.redo","deg","layerActions.rotateSelected","geometry.rotate","hz","layerActions.flipSelected","geometry.flip","geometry.resetToOriginal","geometry.applyCrop","geometry.cancelCrop","v","geometry.setCropRatio","textEditor.commitTextEdit","src","stickers.addSticker","list","layerActions.deleteLayer","layerActions.deleteSelected","layerActions.duplicateSelected","layerActions.bringSelectedToFront","layerActions.sendSelectedToBack","key","value","layerActions.setAdjustment","layerActions.setFilter","layerActions.selectShapeType","layerActions.setShapeFill","layerActions.setShapeWidth","layerActions.setBrushSize","layerActions.setBrushStyle","layerActions.setTextFont","layerActions.setTextSize","layerActions.setTextColor","layerActions.setShapeColor","layerActions.setDrawColor","layerActions.setSelectedColor","layerActions.setSelectedText","layerActions.setSelectedFont","layerActions.setSelectedTextSize","layerActions.setSelectedBoxWidth","layerActions.setSelectedShapeFill","layerActions.setSelectedWidth","layerActions.setSelectedLabel","layerActions.setSelectedLabelSize","layerActions.setSelectedLabelColor","layerActions.setSelectedLabelFont","layerActions.setSelectedClosed","layerActions.setSelectedLabelSide","layerActions.setSelectedLabelOffset","layerActions.setSelectedLabelPos","layerActions.setSelectedLabelRotate","layerActions.setSelectedLabelDx","layerActions.setSelectedLabelDy","layerActions.setMultiPointMode","resumePoly","finishPoly","undoPolyPoint","cancelPoly","name","savedLayers.saveSelectedLayer","savedLayers.insertSavedLayer","savedLayers.deleteSavedLayer","savedLayers.renameSavedLayer","savedLayers.setSavedLayers","entry","savedLayers.insertSavedLayerEntry","q","savedLayers.searchSavedLayers","saveExport.doSave","opts","saveExport.produce","readState","refs","mountEngine","file","saveExport.normalizeSource","d","saveExport.doLoadImage","emit","finish","syncCanvasSize","saveExport.loadState","s","emptySourceCanvas","resetAdjValues","k","PictureStudioEngine","VERSION"],"mappings":"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"}
|
package/dist/index131.es.js
CHANGED
|
@@ -1,17 +1,10 @@
|
|
|
1
|
-
function
|
|
2
|
-
return
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
if (e)
|
|
7
|
-
try {
|
|
8
|
-
e.postMessage(
|
|
9
|
-
JSON.stringify({ type: "IMAGE_EDITOR", payload: { data: { open: t } } })
|
|
10
|
-
);
|
|
11
|
-
} catch {
|
|
12
|
-
}
|
|
1
|
+
function o(n, t) {
|
|
2
|
+
return n.replace(/\{\{(\w+)\}\}/g, (l, e) => {
|
|
3
|
+
const r = t[e];
|
|
4
|
+
return r != null ? String(r) : "";
|
|
5
|
+
});
|
|
13
6
|
}
|
|
14
7
|
export {
|
|
15
|
-
|
|
8
|
+
o as interpolateUrl
|
|
16
9
|
};
|
|
17
10
|
//# sourceMappingURL=index131.es.js.map
|