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.
Files changed (178) hide show
  1. package/dist/index100.es.js +42 -23
  2. package/dist/index100.es.js.map +1 -1
  3. package/dist/index101.es.js +33 -62
  4. package/dist/index101.es.js.map +1 -1
  5. package/dist/index102.es.js +21 -9
  6. package/dist/index102.es.js.map +1 -1
  7. package/dist/index103.es.js +88 -22
  8. package/dist/index103.es.js.map +1 -1
  9. package/dist/index104.es.js +17 -9
  10. package/dist/index104.es.js.map +1 -1
  11. package/dist/index105.es.js +13 -67
  12. package/dist/index105.es.js.map +1 -1
  13. package/dist/index106.es.js +21 -185
  14. package/dist/index106.es.js.map +1 -1
  15. package/dist/index107.es.js +11 -23
  16. package/dist/index107.es.js.map +1 -1
  17. package/dist/index108.es.js +69 -198
  18. package/dist/index108.es.js.map +1 -1
  19. package/dist/index109.es.js +9 -43
  20. package/dist/index109.es.js.map +1 -1
  21. package/dist/index11.es.js +1 -1
  22. package/dist/index110.es.js +65 -37
  23. package/dist/index110.es.js.map +1 -1
  24. package/dist/index111.es.js +184 -47
  25. package/dist/index111.es.js.map +1 -1
  26. package/dist/index112.es.js +23 -181
  27. package/dist/index112.es.js.map +1 -1
  28. package/dist/index113.es.js +201 -20
  29. package/dist/index113.es.js.map +1 -1
  30. package/dist/index114.es.js +13 -35
  31. package/dist/index114.es.js.map +1 -1
  32. package/dist/index115.es.js +88 -58
  33. package/dist/index115.es.js.map +1 -1
  34. package/dist/index116.es.js +27 -84
  35. package/dist/index116.es.js.map +1 -1
  36. package/dist/index117.es.js +23 -15
  37. package/dist/index117.es.js.map +1 -1
  38. package/dist/index118.es.js +34 -8
  39. package/dist/index118.es.js.map +1 -1
  40. package/dist/index119.es.js +179 -29
  41. package/dist/index119.es.js.map +1 -1
  42. package/dist/index12.es.js +1 -1
  43. package/dist/index120.es.js +32 -11
  44. package/dist/index120.es.js.map +1 -1
  45. package/dist/index121.es.js +19 -92
  46. package/dist/index121.es.js.map +1 -1
  47. package/dist/index122.es.js +13 -27
  48. package/dist/index122.es.js.map +1 -1
  49. package/dist/index123.es.js +7 -15
  50. package/dist/index123.es.js.map +1 -1
  51. package/dist/index124.es.js +98 -20
  52. package/dist/index124.es.js.map +1 -1
  53. package/dist/index125.es.js +61 -9
  54. package/dist/index125.es.js.map +1 -1
  55. package/dist/index126.es.js +54 -97
  56. package/dist/index126.es.js.map +1 -1
  57. package/dist/index127.es.js +16 -64
  58. package/dist/index127.es.js.map +1 -1
  59. package/dist/index128.es.js +96 -50
  60. package/dist/index128.es.js.map +1 -1
  61. package/dist/index129.es.js +11 -13
  62. package/dist/index129.es.js.map +1 -1
  63. package/dist/index130.es.js +147 -99
  64. package/dist/index130.es.js.map +1 -1
  65. package/dist/index131.es.js +6 -13
  66. package/dist/index131.es.js.map +1 -1
  67. package/dist/index132.es.js +48 -148
  68. package/dist/index132.es.js.map +1 -1
  69. package/dist/index133.es.js +42 -13
  70. package/dist/index133.es.js.map +1 -1
  71. package/dist/index134.es.js +35 -269
  72. package/dist/index134.es.js.map +1 -1
  73. package/dist/index135.es.js +22 -25
  74. package/dist/index135.es.js.map +1 -1
  75. package/dist/index136.es.js +11 -7
  76. package/dist/index136.es.js.map +1 -1
  77. package/dist/index137.es.js +33 -40
  78. package/dist/index137.es.js.map +1 -1
  79. package/dist/index138.es.js +63 -37
  80. package/dist/index138.es.js.map +1 -1
  81. package/dist/index139.es.js +268 -39
  82. package/dist/index139.es.js.map +1 -1
  83. package/dist/index141.es.js +16 -5
  84. package/dist/index141.es.js.map +1 -1
  85. package/dist/index142.es.js +5 -11
  86. package/dist/index142.es.js.map +1 -1
  87. package/dist/index143.es.js +10 -10
  88. package/dist/index143.es.js.map +1 -1
  89. package/dist/index144.es.js +11 -2
  90. package/dist/index144.es.js.map +1 -1
  91. package/dist/index145.es.js +2 -44
  92. package/dist/index145.es.js.map +1 -1
  93. package/dist/index146.es.js +7 -12
  94. package/dist/index146.es.js.map +1 -1
  95. package/dist/index147.es.js +22 -6
  96. package/dist/index147.es.js.map +1 -1
  97. package/dist/index148.es.js +168 -21
  98. package/dist/index148.es.js.map +1 -1
  99. package/dist/index149.es.js +79 -167
  100. package/dist/index149.es.js.map +1 -1
  101. package/dist/index150.es.js +67 -75
  102. package/dist/index150.es.js.map +1 -1
  103. package/dist/index151.es.js +3 -72
  104. package/dist/index151.es.js.map +1 -1
  105. package/dist/index152.es.js +56 -5
  106. package/dist/index152.es.js.map +1 -1
  107. package/dist/index153.es.js +120 -56
  108. package/dist/index153.es.js.map +1 -1
  109. package/dist/index154.es.js +398 -113
  110. package/dist/index154.es.js.map +1 -1
  111. package/dist/index155.es.js +25 -398
  112. package/dist/index155.es.js.map +1 -1
  113. package/dist/index156.es.js +61 -25
  114. package/dist/index156.es.js.map +1 -1
  115. package/dist/index157.es.js +29 -64
  116. package/dist/index157.es.js.map +1 -1
  117. package/dist/index158.es.js +21 -29
  118. package/dist/index158.es.js.map +1 -1
  119. package/dist/index159.es.js +36 -23
  120. package/dist/index159.es.js.map +1 -1
  121. package/dist/index16.es.js +1 -1
  122. package/dist/index160.es.js +211 -37
  123. package/dist/index160.es.js.map +1 -1
  124. package/dist/index161.es.js +143 -211
  125. package/dist/index161.es.js.map +1 -1
  126. package/dist/index162.es.js +136 -136
  127. package/dist/index162.es.js.map +1 -1
  128. package/dist/index163.es.js +46 -143
  129. package/dist/index163.es.js.map +1 -1
  130. package/dist/index164.es.js +353 -45
  131. package/dist/index164.es.js.map +1 -1
  132. package/dist/index165.es.js +41 -352
  133. package/dist/index165.es.js.map +1 -1
  134. package/dist/index166.es.js +12 -2
  135. package/dist/index166.es.js.map +1 -1
  136. package/dist/index167.es.js +2 -25
  137. package/dist/index167.es.js.map +1 -1
  138. package/dist/index168.es.js +21 -12
  139. package/dist/index168.es.js.map +1 -1
  140. package/dist/index170.es.js +1 -1
  141. package/dist/index171.es.js +2 -2
  142. package/dist/index173.es.js +1 -1
  143. package/dist/index174.es.js +2 -2
  144. package/dist/index175.es.js +2 -2
  145. package/dist/index176.es.js +2 -2
  146. package/dist/index180.es.js +1 -1
  147. package/dist/index181.es.js +1 -1
  148. package/dist/index182.es.js +1 -1
  149. package/dist/index183.es.js +1 -1
  150. package/dist/index184.es.js +1 -1
  151. package/dist/index185.es.js +1 -1
  152. package/dist/index186.es.js +1 -1
  153. package/dist/index188.es.js +1 -1
  154. package/dist/index19.es.js +1 -1
  155. package/dist/index20.es.js +1 -1
  156. package/dist/index21.es.js +1 -1
  157. package/dist/index23.es.js +2 -2
  158. package/dist/index27.es.js +1 -1
  159. package/dist/index29.es.js +1 -1
  160. package/dist/index30.es.js +2 -2
  161. package/dist/index32.es.js +1 -1
  162. package/dist/index34.es.js +1 -1
  163. package/dist/index35.es.js +1 -1
  164. package/dist/index47.es.js +4 -4
  165. package/dist/index48.es.js +2 -2
  166. package/dist/index49.es.js +1 -1
  167. package/dist/index50.es.js +1 -1
  168. package/dist/index55.es.js +1 -1
  169. package/dist/index56.es.js +1 -1
  170. package/dist/index59.es.js +1 -1
  171. package/dist/index61.es.js +1 -1
  172. package/dist/index69.es.js +2 -2
  173. package/dist/index70.es.js +1 -1
  174. package/dist/index72.es.js +5 -5
  175. package/dist/index73.es.js +1 -1
  176. package/dist/index74.es.js +7 -7
  177. package/dist/index87.es.js +1 -1
  178. package/package.json +1 -1
@@ -1,58 +1,104 @@
1
- import e from "react";
2
- import { X as o } from "lucide-react";
3
- import { Button as r } from "./index9.es.js";
4
- import { _Dialog as c } from "./index43.es.js";
5
- import { Textarea as s } from "./index16.es.js";
6
- import { Typography as p } from "./index19.es.js";
7
- const x = ({
8
- open: m,
9
- noteValue: a,
10
- onNoteChange: i,
11
- onClose: t,
12
- onSave: l
13
- }) => /* @__PURE__ */ e.createElement(
14
- c,
15
- {
16
- trigger: null,
17
- contentClassName: "h-fit w-fit",
18
- open: m,
19
- onInteractOutside: t,
20
- body: /* @__PURE__ */ e.createElement("div", { className: "p-4" }, /* @__PURE__ */ e.createElement(
21
- p,
22
- {
23
- variant: "h3",
24
- className: "mb-2 flex items-center justify-between text-light-2"
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
- "Add notes",
27
- /* @__PURE__ */ e.createElement(
28
- o,
29
- {
30
- size: 16,
31
- className: "cursor-pointer justify-end text-light-1",
32
- onClick: t
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
- ), /* @__PURE__ */ e.createElement("div", { className: "mt-4 flex gap-2" }, /* @__PURE__ */ e.createElement(
44
- r,
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
- onClick: l,
49
- disabled: !a.trim()
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
- "Save"
52
- ), /* @__PURE__ */ e.createElement(r, { size: "sm", variant: "secondary", onClick: t }, "Cancel")))
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
- x as DialogNote
102
+ z as ImageEditorModal
57
103
  };
58
104
  //# sourceMappingURL=index128.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index128.es.js","sources":["../src/components/ui/agent-snippet-view/components/add-notes-dialog.tsx"],"sourcesContent":["import React from 'react'\nimport { X } from 'lucide-react'\nimport { Button } from '@/components/atoms/button'\nimport { Dialog } from '@/components/organisms/dialog'\nimport { Textarea } from '@/components/atoms/textarea'\nimport { Typography } from '@/components/atoms/typography'\n\ninterface DialogNoteProps {\n open: boolean\n noteValue: string\n onNoteChange: (value: string) => void\n onClose: () => void\n onSave: () => void\n}\n\nexport const DialogNote: React.FC<DialogNoteProps> = ({\n open,\n noteValue,\n onNoteChange,\n onClose,\n onSave,\n}) => (\n <Dialog\n trigger={null}\n contentClassName=\"h-fit w-fit\"\n open={open}\n onInteractOutside={onClose}\n body={\n <div className=\"p-4\">\n <Typography\n variant=\"h3\"\n className=\"mb-2 flex items-center justify-between text-light-2\"\n >\n Add notes\n <X\n size={16}\n className=\"cursor-pointer justify-end text-light-1\"\n onClick={onClose}\n />\n </Typography>\n\n <Textarea\n value={noteValue}\n placeholder=\"Add notes\"\n onChange={(e) => onNoteChange(e.target.value)}\n className=\"h-[200px] w-[400px]\"\n />\n <div className=\"mt-4 flex gap-2\">\n <Button\n size=\"sm\"\n variant=\"primary\"\n onClick={onSave}\n disabled={!noteValue.trim()}\n >\n Save\n </Button>\n <Button size=\"sm\" variant=\"secondary\" onClick={onClose}>\n Cancel\n </Button>\n </div>\n </div>\n }\n />\n)\n"],"names":["DialogNote","open","noteValue","onNoteChange","onClose","onSave","React","Dialog","Typography","X","Textarea","e","Button"],"mappings":";;;;;;AAeO,MAAMA,IAAwC,CAAC;AAAA,EACpD,MAAAC;AAAA,EACA,WAAAC;AAAA,EACA,cAAAC;AAAA,EACA,SAAAC;AAAA,EACA,QAAAC;AACF,MACEC,gBAAAA,EAAA;AAAA,EAACC;AAAAA,EAAA;AAAA,IACC,SAAS;AAAA,IACT,kBAAiB;AAAA,IACjB,MAAAN;AAAA,IACA,mBAAmBG;AAAA,IACnB,MACEE,gBAAAA,EAAA,cAAC,OAAA,EAAI,WAAU,MAAA,GACbA,gBAAAA,EAAA;AAAA,MAACE;AAAA,MAAA;AAAA,QACC,SAAQ;AAAA,QACR,WAAU;AAAA,MAAA;AAAA,MACX;AAAA,MAECF,gBAAAA,EAAA;AAAA,QAACG;AAAA,QAAA;AAAA,UACC,MAAM;AAAA,UACN,WAAU;AAAA,UACV,SAASL;AAAA,QAAA;AAAA,MAAA;AAAA,IACX,GAGFE,gBAAAA,EAAA;AAAA,MAACI;AAAA,MAAA;AAAA,QACC,OAAOR;AAAA,QACP,aAAY;AAAA,QACZ,UAAU,CAACS,MAAMR,EAAaQ,EAAE,OAAO,KAAK;AAAA,QAC5C,WAAU;AAAA,MAAA;AAAA,IAAA,GAEZL,gBAAAA,EAAA,cAAC,OAAA,EAAI,WAAU,kBAAA,GACbA,gBAAAA,EAAA;AAAA,MAACM;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAQ;AAAA,QACR,SAASP;AAAA,QACT,UAAU,CAACH,EAAU,KAAA;AAAA,MAAK;AAAA,MAC3B;AAAA,IAAA,GAGDI,gBAAAA,EAAA,cAACM,GAAA,EAAO,MAAK,MAAK,SAAQ,aAAY,SAASR,EAAA,GAAS,QAExD,CACF,CACF;AAAA,EAAA;AAEJ;"}
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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"}
@@ -1,19 +1,17 @@
1
- import _ from "react-dom";
2
- var r, t = _;
3
- if (process.env.NODE_ENV === "production")
4
- r = t.createRoot, t.hydrateRoot;
5
- else {
6
- var e = t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
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
- return t.createRoot(o, n);
11
- } finally {
12
- e.usingClientEntryPoint = !1;
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
- r as createRoot
15
+ n as notifyNativeImageEditorState
18
16
  };
19
17
  //# sourceMappingURL=index129.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index129.es.js","sources":["../node_modules/react-dom/client.js"],"sourcesContent":["'use strict';\n\nvar m = require('react-dom');\nif (process.env.NODE_ENV === 'production') {\n exports.createRoot = m.createRoot;\n exports.hydrateRoot = m.hydrateRoot;\n} else {\n var i = m.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n exports.createRoot = function(c, o) {\n i.usingClientEntryPoint = true;\n try {\n return m.createRoot(c, o);\n } finally {\n i.usingClientEntryPoint = false;\n }\n };\n exports.hydrateRoot = function(c, h, o) {\n i.usingClientEntryPoint = true;\n try {\n return m.hydrateRoot(c, h, o);\n } finally {\n i.usingClientEntryPoint = false;\n }\n };\n}\n"],"names":["m","require$$0","createRoot","i","c","o"],"mappings":";OAEIA,IAAIC;AACR,IAAI,QAAQ,IAAI,aAAa;AAC3B,EAAAC,IAAqBF,EAAE,YACDA,EAAE;AAAA,KACnB;AACL,MAAIG,IAAIH,EAAE;AACV,EAAAE,IAAqB,SAASE,GAAGC,GAAG;AAClC,IAAAF,EAAE,wBAAwB;AAC1B,QAAI;AACF,aAAOH,EAAE,WAAWI,GAAGC,CAAC;AAAA,IAC9B,UAAK;AACC,MAAAF,EAAE,wBAAwB;AAAA,IAChC;AAAA,EACA;AASA;","x_google_ignoreList":[0]}
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;"}
@@ -1,104 +1,152 @@
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 "./index147.es.js";
5
- import { Panel as y } from "./index148.es.js";
6
- import { Ribbon as S } from "./index149.es.js";
7
- import { Stage as w } from "./index150.es.js";
8
- import { LineSessionBar as N } from "./index151.es.js";
9
- import { StatusBar as R } from "./index152.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);
41
- },
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();
49
- }
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,
53
- {
54
- variant: "primary",
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"
69
- },
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)
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
- ), /* @__PURE__ */ t.createElement(y, { ui: r, engine: a })), /* @__PURE__ */ t.createElement(R, { ui: r })))
99
- ) : null;
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
- z as ImageEditorModal
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
@@ -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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"}
@@ -1,17 +1,10 @@
1
- function i() {
2
- return typeof window > "u" ? null : window.ReactNativeWebView ?? null;
3
- }
4
- function n(t) {
5
- const e = i();
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
- n as notifyNativeImageEditorState
8
+ o as interpolateUrl
16
9
  };
17
10
  //# sourceMappingURL=index131.es.js.map