@duxweb/dvha-pro 1.0.23 → 1.0.25

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 (229) hide show
  1. package/dist/cjs/component.cjs +1 -1
  2. package/dist/cjs/components/card/card.cjs +1 -1
  3. package/dist/cjs/components/card/store.cjs +1 -1
  4. package/dist/cjs/components/carousel/carousel.cjs +1 -1
  5. package/dist/cjs/components/chart/echart.cjs +1 -1
  6. package/dist/cjs/components/crop/imageCrop.cjs +1 -1
  7. package/dist/cjs/components/crop/imageCropModal.cjs +1 -1
  8. package/dist/cjs/components/dashboard/hello.cjs +1 -1
  9. package/dist/cjs/components/dashboard/helloBig.cjs +1 -1
  10. package/dist/cjs/components/dashboard/quick.cjs +1 -1
  11. package/dist/cjs/components/data/dynamicData.cjs +1 -1
  12. package/dist/cjs/components/data/dynamicSelect.cjs +1 -1
  13. package/dist/cjs/components/data/selectModal.cjs +1 -1
  14. package/dist/cjs/components/dialog/dialog.cjs +1 -1
  15. package/dist/cjs/components/drawer/drawer.cjs +1 -1
  16. package/dist/cjs/components/drawer/drawerPage.cjs +1 -1
  17. package/dist/cjs/components/editor/aiEditor.cjs +1 -1
  18. package/dist/cjs/components/form/drawerForm.cjs +1 -1
  19. package/dist/cjs/components/form/formItem.cjs +1 -1
  20. package/dist/cjs/components/form/formLayout.cjs +1 -1
  21. package/dist/cjs/components/form/modalForm.cjs +1 -1
  22. package/dist/cjs/components/form/pageForm.cjs +1 -1
  23. package/dist/cjs/components/form/settingForm.cjs +1 -1
  24. package/dist/cjs/components/icon/icon.cjs +1 -1
  25. package/dist/cjs/components/icon/iconPicker.cjs +1 -1
  26. package/dist/cjs/components/image/components/CanvasRuler.cjs +1 -0
  27. package/dist/cjs/components/image/elements/circle.cjs +1 -0
  28. package/dist/cjs/components/image/elements/image.cjs +1 -0
  29. package/dist/cjs/components/image/elements/index.cjs +1 -0
  30. package/dist/cjs/components/image/elements/rect.cjs +1 -0
  31. package/dist/cjs/components/image/elements/text.cjs +1 -0
  32. package/dist/cjs/components/image/hooks/usePosterEditor.cjs +1 -0
  33. package/dist/cjs/components/image/pages/LeftToolbar.cjs +1 -0
  34. package/dist/cjs/components/image/pages/Panel.cjs +1 -0
  35. package/dist/cjs/components/image/pages/PanelItem.cjs +1 -0
  36. package/dist/cjs/components/image/pages/RightPanel.cjs +1 -0
  37. package/dist/cjs/components/image/posterEditor.cjs +1 -0
  38. package/dist/cjs/components/layout/filter.cjs +1 -1
  39. package/dist/cjs/components/layout/filterLayout.cjs +1 -1
  40. package/dist/cjs/components/layout/list.cjs +1 -1
  41. package/dist/cjs/components/layout/table.cjs +1 -1
  42. package/dist/cjs/components/layout/tools.cjs +1 -1
  43. package/dist/cjs/components/level/level.cjs +1 -1
  44. package/dist/cjs/components/list/card.cjs +1 -1
  45. package/dist/cjs/components/list/list.cjs +1 -1
  46. package/dist/cjs/components/media/media.cjs +1 -1
  47. package/dist/cjs/components/modal/modal.cjs +1 -1
  48. package/dist/cjs/components/modal/modalPage.cjs +1 -1
  49. package/dist/cjs/components/modal/modalTab.cjs +1 -1
  50. package/dist/cjs/components/panel/alert.cjs +1 -1
  51. package/dist/cjs/components/panel/collapse.cjs +1 -1
  52. package/dist/cjs/components/panel/setting.cjs +1 -1
  53. package/dist/cjs/components/select/cardSelect.cjs +1 -1
  54. package/dist/cjs/components/status/listEmpty.cjs +1 -1
  55. package/dist/cjs/components/table/table.cjs +1 -1
  56. package/dist/cjs/components/table/tablePage.cjs +1 -1
  57. package/dist/cjs/components/tree/treeFilter.cjs +1 -1
  58. package/dist/cjs/components/upload/config.cjs +1 -1
  59. package/dist/cjs/components/upload/file.cjs +1 -1
  60. package/dist/cjs/components/upload/image.cjs +1 -1
  61. package/dist/cjs/components/upload/manage/item.cjs +1 -1
  62. package/dist/cjs/components/upload/manager.cjs +1 -1
  63. package/dist/cjs/components/widget/connect.cjs +1 -1
  64. package/dist/cjs/dvha-pro.css +1 -1
  65. package/dist/cjs/hooks/action.cjs +1 -1
  66. package/dist/cjs/hooks/dialog.cjs +1 -1
  67. package/dist/cjs/hooks/download.cjs +1 -1
  68. package/dist/cjs/hooks/drawer.cjs +1 -1
  69. package/dist/cjs/hooks/echart.cjs +1 -1
  70. package/dist/cjs/hooks/image.cjs +1 -1
  71. package/dist/cjs/hooks/level.cjs +1 -1
  72. package/dist/cjs/hooks/modal.cjs +1 -1
  73. package/dist/cjs/hooks/table/color.cjs +1 -0
  74. package/dist/cjs/hooks/table/column.cjs +1 -1
  75. package/dist/cjs/hooks/table/image.cjs +1 -1
  76. package/dist/cjs/hooks/table/input.cjs +1 -1
  77. package/dist/cjs/hooks/table/map.cjs +1 -1
  78. package/dist/cjs/hooks/table/media.cjs +1 -1
  79. package/dist/cjs/hooks/table/status.cjs +1 -1
  80. package/dist/cjs/hooks/table/switch.cjs +1 -1
  81. package/dist/cjs/hooks/table.cjs +1 -1
  82. package/dist/cjs/index.cjs +1 -1
  83. package/dist/cjs/pages/authLayout.cjs +1 -1
  84. package/dist/cjs/pages/layout/global.cjs +1 -1
  85. package/dist/cjs/pages/layout/page.cjs +1 -1
  86. package/dist/cjs/pages/layout/tab.cjs +1 -1
  87. package/dist/cjs/pages/layout.cjs +1 -1
  88. package/dist/cjs/pages/login.cjs +1 -1
  89. package/dist/cjs/pages/menu/avatar.cjs +1 -1
  90. package/dist/cjs/pages/menu/button.cjs +1 -1
  91. package/dist/cjs/pages/menu/cmd.cjs +1 -1
  92. package/dist/cjs/pages/menu/main.cjs +1 -1
  93. package/dist/cjs/pages/menu/mobile.cjs +1 -1
  94. package/dist/cjs/pages/page.cjs +1 -1
  95. package/dist/cjs/pages/page404.cjs +1 -1
  96. package/dist/cjs/pages/pageStatus.cjs +1 -1
  97. package/dist/cjs/stores/ui.cjs +1 -1
  98. package/dist/cjs/theme/uno.css.cjs +26 -1
  99. package/dist/esm/component.js +49 -47
  100. package/dist/esm/components/card/card.js +24 -27
  101. package/dist/esm/components/card/store.js +33 -39
  102. package/dist/esm/components/carousel/carousel.js +16 -19
  103. package/dist/esm/components/chart/echart.js +15 -13
  104. package/dist/esm/components/crop/imageCrop.js +45 -46
  105. package/dist/esm/components/crop/imageCropModal.js +36 -37
  106. package/dist/esm/components/dashboard/hello.js +27 -30
  107. package/dist/esm/components/dashboard/helloBig.js +328 -331
  108. package/dist/esm/components/dashboard/quick.js +30 -33
  109. package/dist/esm/components/data/dynamicData.js +86 -98
  110. package/dist/esm/components/data/dynamicSelect.js +42 -42
  111. package/dist/esm/components/data/selectModal.js +58 -60
  112. package/dist/esm/components/dialog/dialog.js +54 -55
  113. package/dist/esm/components/drawer/drawer.js +23 -23
  114. package/dist/esm/components/drawer/drawerPage.js +39 -49
  115. package/dist/esm/components/editor/aiEditor.js +64 -70
  116. package/dist/esm/components/form/drawerForm.js +61 -59
  117. package/dist/esm/components/form/formItem.js +45 -51
  118. package/dist/esm/components/form/formLayout.js +7 -10
  119. package/dist/esm/components/form/modalForm.js +63 -61
  120. package/dist/esm/components/form/pageForm.js +56 -57
  121. package/dist/esm/components/form/settingForm.js +43 -44
  122. package/dist/esm/components/icon/icon.js +15 -13
  123. package/dist/esm/components/icon/iconPicker.js +54 -58
  124. package/dist/esm/components/image/components/CanvasRuler.js +113 -0
  125. package/dist/esm/components/image/elements/circle.js +127 -0
  126. package/dist/esm/components/image/elements/image.js +131 -0
  127. package/dist/esm/components/image/elements/index.js +46 -0
  128. package/dist/esm/components/image/elements/rect.js +171 -0
  129. package/dist/esm/components/image/elements/text.js +206 -0
  130. package/dist/esm/components/image/hooks/usePosterEditor.js +434 -0
  131. package/dist/esm/components/image/pages/LeftToolbar.js +40 -0
  132. package/dist/esm/components/image/pages/Panel.js +31 -0
  133. package/dist/esm/components/image/pages/PanelItem.js +22 -0
  134. package/dist/esm/components/image/pages/RightPanel.js +421 -0
  135. package/dist/esm/components/image/posterEditor.js +227 -0
  136. package/dist/esm/components/layout/filter.js +13 -16
  137. package/dist/esm/components/layout/filterLayout.js +7 -10
  138. package/dist/esm/components/layout/list.js +312 -337
  139. package/dist/esm/components/layout/table.js +281 -294
  140. package/dist/esm/components/layout/tools.js +38 -41
  141. package/dist/esm/components/level/level.js +15 -13
  142. package/dist/esm/components/list/card.js +35 -38
  143. package/dist/esm/components/list/list.js +15 -18
  144. package/dist/esm/components/media/media.js +35 -36
  145. package/dist/esm/components/modal/modal.js +10 -10
  146. package/dist/esm/components/modal/modalPage.js +32 -36
  147. package/dist/esm/components/modal/modalTab.js +39 -45
  148. package/dist/esm/components/panel/alert.js +19 -22
  149. package/dist/esm/components/panel/collapse.js +33 -36
  150. package/dist/esm/components/panel/setting.js +25 -31
  151. package/dist/esm/components/select/cardSelect.js +27 -28
  152. package/dist/esm/components/status/listEmpty.js +13 -13
  153. package/dist/esm/components/table/table.js +15 -13
  154. package/dist/esm/components/table/tablePage.js +25 -25
  155. package/dist/esm/components/tree/treeFilter.js +137 -147
  156. package/dist/esm/components/upload/config.js +15 -27
  157. package/dist/esm/components/upload/file.js +115 -109
  158. package/dist/esm/components/upload/image.js +135 -130
  159. package/dist/esm/components/upload/manage/item.js +59 -60
  160. package/dist/esm/components/upload/manager.js +203 -218
  161. package/dist/esm/components/widget/connect.js +103 -106
  162. package/dist/esm/dvha-pro.css +1 -1
  163. package/dist/esm/hooks/action.js +115 -131
  164. package/dist/esm/hooks/dialog.js +15 -13
  165. package/dist/esm/hooks/download.js +55 -56
  166. package/dist/esm/hooks/drawer.js +15 -13
  167. package/dist/esm/hooks/echart.js +156 -179
  168. package/dist/esm/hooks/image.js +14 -15
  169. package/dist/esm/hooks/level.js +7 -7
  170. package/dist/esm/hooks/modal.js +15 -13
  171. package/dist/esm/hooks/table/color.js +19 -0
  172. package/dist/esm/hooks/table/column.js +25 -23
  173. package/dist/esm/hooks/table/image.js +17 -15
  174. package/dist/esm/hooks/table/input.js +28 -28
  175. package/dist/esm/hooks/table/map.js +7 -7
  176. package/dist/esm/hooks/table/media.js +15 -13
  177. package/dist/esm/hooks/table/status.js +8 -9
  178. package/dist/esm/hooks/table/switch.js +19 -19
  179. package/dist/esm/hooks/table.js +27 -31
  180. package/dist/esm/index.js +213 -200
  181. package/dist/esm/pages/authLayout.js +15 -13
  182. package/dist/esm/pages/layout/global.js +12 -15
  183. package/dist/esm/pages/layout/page.js +15 -13
  184. package/dist/esm/pages/layout/tab.js +58 -71
  185. package/dist/esm/pages/layout.js +7 -6
  186. package/dist/esm/pages/login.js +95 -98
  187. package/dist/esm/pages/menu/avatar.js +151 -162
  188. package/dist/esm/pages/menu/button.js +29 -31
  189. package/dist/esm/pages/menu/cmd.js +83 -87
  190. package/dist/esm/pages/menu/main.js +25 -23
  191. package/dist/esm/pages/menu/mobile.js +15 -13
  192. package/dist/esm/pages/page.js +21 -25
  193. package/dist/esm/pages/page404.js +13 -11
  194. package/dist/esm/pages/pageStatus.js +33 -34
  195. package/dist/esm/stores/ui.js +15 -15
  196. package/dist/esm/theme/uno.css.js +26 -1
  197. package/dist/types/components/form/drawerForm.d.ts +6 -0
  198. package/dist/types/components/form/modalForm.d.ts +6 -0
  199. package/dist/types/components/form/pageForm.d.ts +6 -0
  200. package/dist/types/components/form/settingForm.d.ts +6 -0
  201. package/dist/types/components/image/components/CanvasRuler.d.ts +43 -0
  202. package/dist/types/components/image/components/index.d.ts +1 -0
  203. package/dist/types/components/image/elements/circle.d.ts +3 -0
  204. package/dist/types/components/image/elements/image.d.ts +3 -0
  205. package/dist/types/components/image/elements/index.d.ts +15 -0
  206. package/dist/types/components/image/elements/rect.d.ts +3 -0
  207. package/dist/types/components/image/elements/text.d.ts +3 -0
  208. package/dist/types/components/image/elements/types.d.ts +51 -0
  209. package/dist/types/components/image/hooks/index.d.ts +1 -0
  210. package/dist/types/components/image/hooks/usePosterEditor.d.ts +48 -0
  211. package/dist/types/components/image/index.d.ts +4 -0
  212. package/dist/types/components/image/pages/LeftToolbar.d.ts +33 -0
  213. package/dist/types/components/image/pages/Panel.d.ts +11 -0
  214. package/dist/types/components/image/pages/PanelItem.d.ts +11 -0
  215. package/dist/types/components/image/pages/RightPanel.d.ts +208 -0
  216. package/dist/types/components/image/pages/index.d.ts +4 -0
  217. package/dist/types/components/image/posterEditor.d.ts +61 -0
  218. package/dist/types/components/image/types/editor.d.ts +47 -0
  219. package/dist/types/components/index.d.ts +2 -2
  220. package/dist/types/components/layout/table.d.ts +9 -0
  221. package/dist/types/components/stats/number.d.ts +1 -1
  222. package/dist/types/components/table/tablePage.d.ts +9 -0
  223. package/dist/types/components/upload/file.d.ts +5 -3
  224. package/dist/types/hooks/table/color.d.ts +13 -0
  225. package/dist/types/hooks/table/column.d.ts +1 -0
  226. package/dist/types/hooks/table/index.d.ts +1 -0
  227. package/dist/types/index.d.ts +1 -0
  228. package/dist/types/pages/layout/global.d.ts +0 -1
  229. package/package.json +6 -3
@@ -0,0 +1,434 @@
1
+ import { useThrottleFn as fe } from "@vueuse/core";
2
+ import { Canvas as be, FabricImage as pe } from "fabric";
3
+ import { ref as f, computed as m, watch as Ie, nextTick as Y, markRaw as ke } from "vue";
4
+ import { getElementConfig as I } from "../elements/index.js";
5
+ function Me(k = {}) {
6
+ const n = f(null), P = f(null), l = f({
7
+ width: k.width || 750,
8
+ height: k.height || 1e3,
9
+ backgroundColor: k.backgroundColor || "#ffffff",
10
+ backgroundImage: k.backgroundImage || "",
11
+ elements: []
12
+ }), h = f([]), O = f(!1), B = f(1), y = f(0), A = f(0);
13
+ let M = null, D = () => {
14
+ }, F = 0;
15
+ const T = () => `element_${++F}`, b = () => {
16
+ O.value || (O.value = !0, Y(() => {
17
+ D(JSON.stringify(l.value)), O.value = !1;
18
+ }));
19
+ }, C = () => {
20
+ if (!n.value)
21
+ return;
22
+ const t = n.value.getObjects(), e = [];
23
+ t.forEach((o) => {
24
+ const a = o.elementId;
25
+ if (!a)
26
+ return;
27
+ const s = l.value.elements.find((i) => i.id === a);
28
+ if (!s)
29
+ return;
30
+ const u = I(s.type);
31
+ if (!u)
32
+ return;
33
+ const r = u.getPropsFromFabricObject(o);
34
+ e.push({
35
+ ...s,
36
+ ...r,
37
+ id: s.id,
38
+ type: s.type
39
+ });
40
+ }), l.value.elements = e;
41
+ }, g = fe(() => {
42
+ C(), b();
43
+ }, 100), w = () => {
44
+ if (!n.value)
45
+ return;
46
+ const t = n.value.getActiveObjects(), e = n.value.getActiveObject();
47
+ t.length > 0 ? h.value = [...t] : e ? h.value = [e] : h.value = [];
48
+ }, z = () => {
49
+ h.value = [];
50
+ }, L = (t) => {
51
+ if (!t.target)
52
+ return;
53
+ const e = t.target, o = e.elementId, s = l.value.elements.find((i) => i.id === o)?.type, u = e.scaleX || 1, r = e.scaleY || 1;
54
+ if (u !== 1 || r !== 1) {
55
+ if (s === "circle") {
56
+ const i = Math.max(u, r), d = Math.round((e.radius || 50) * i);
57
+ e.set({ radius: d, scaleX: 1, scaleY: 1 });
58
+ } else if (s !== "image") {
59
+ const i = Math.round(e.width * u), d = Math.round(e.height * r);
60
+ e.set({ width: i, height: d, scaleX: 1, scaleY: 1 });
61
+ }
62
+ e.setCoords();
63
+ }
64
+ g();
65
+ }, H = (t) => {
66
+ const e = t.target;
67
+ if (!e)
68
+ return;
69
+ const o = e.elementId;
70
+ if (!o)
71
+ return;
72
+ const a = l.value.elements.find((s) => s.id === o);
73
+ if (a) {
74
+ if (a.type === "circle") {
75
+ const s = Math.max(e.scaleX || 1, e.scaleY || 1);
76
+ e.set({ scaleX: s, scaleY: s }), e.setCoords();
77
+ }
78
+ if (a.type === "rect") {
79
+ const s = e.__corner;
80
+ if (s && ["tl", "tr", "bl", "br"].includes(s)) {
81
+ const r = Math.max(Math.abs(e.scaleX || 1), Math.abs(e.scaleY || 1));
82
+ e.set({
83
+ scaleX: e.scaleX >= 0 ? r : -r,
84
+ scaleY: e.scaleY >= 0 ? r : -r
85
+ }), e.setCoords();
86
+ }
87
+ }
88
+ if (a.type === "image") {
89
+ const s = e.__corner;
90
+ if (s && ["tl", "tr", "bl", "br"].includes(s)) {
91
+ const r = Math.max(Math.abs(e.scaleX || 1), Math.abs(e.scaleY || 1));
92
+ e.set({
93
+ scaleX: e.scaleX >= 0 ? r : -r,
94
+ scaleY: e.scaleY >= 0 ? r : -r
95
+ }), e.setCoords();
96
+ }
97
+ }
98
+ }
99
+ }, _ = () => {
100
+ n.value && (n.value.on("selection:created", w), n.value.on("selection:updated", w), n.value.on("selection:cleared", z), n.value.on("mouse:down", () => setTimeout(w, 10)), n.value.on("mouse:up", () => setTimeout(w, 10)), n.value.on("object:modified", L), n.value.on("object:scaling", H), n.value.on("path:created", g), n.value.on("object:moving", g), n.value.on("object:rotating", g), n.value.on("object:skewing", g), n.value.on("object:added", g), n.value.on("object:removed", g), n.value.on("custom:text:changed", (t) => {
101
+ t.target && t.newText !== void 0 && t.target.elementId && g();
102
+ }));
103
+ }, E = () => {
104
+ if (!n.value)
105
+ return;
106
+ const t = B.value || 1;
107
+ n.value.setZoom(t), n.value.setDimensions({
108
+ width: l.value.width * t,
109
+ height: l.value.height * t
110
+ }), n.value.backgroundColor = l.value.backgroundColor, n.value.renderAll(), n.value.getObjects().forEach((e) => e.setCoords());
111
+ }, x = () => {
112
+ if (!M)
113
+ return;
114
+ const t = M.getBoundingClientRect();
115
+ y.value = t.width - 40, A.value = t.height - 40;
116
+ const e = y.value / l.value.width, o = A.value / l.value.height, a = Math.min(e, o, 1);
117
+ B.value = a, n.value && (n.value.setZoom(a), n.value.setDimensions({
118
+ width: l.value.width * a,
119
+ height: l.value.height * a
120
+ }), n.value.renderAll(), n.value.getObjects().forEach((s) => s.setCoords()));
121
+ }, S = (t) => {
122
+ M = t, Y(x);
123
+ const e = new ResizeObserver(x);
124
+ return e.observe(t), () => e.disconnect();
125
+ }, J = (t, e) => {
126
+ const o = l.value.width, a = l.value.height, s = t.getBoundingRect();
127
+ switch (e) {
128
+ case "center-horizontal":
129
+ t.set("left", Math.round(t.left + (o / 2 - s.left - s.width / 2)));
130
+ break;
131
+ case "center-vertical":
132
+ t.set("top", Math.round(t.top + (a / 2 - s.top - s.height / 2)));
133
+ break;
134
+ case "center-both":
135
+ t.set({
136
+ left: Math.round(t.left + (o / 2 - s.left - s.width / 2)),
137
+ top: Math.round(t.top + (a / 2 - s.top - s.height / 2))
138
+ });
139
+ break;
140
+ case "move-up":
141
+ n.value?.bringObjectForward(t);
142
+ break;
143
+ case "move-down":
144
+ n.value?.sendObjectBackwards(t);
145
+ break;
146
+ case "move-to-front":
147
+ n.value?.bringObjectToFront(t);
148
+ break;
149
+ case "move-to-back":
150
+ n.value?.sendObjectToBack(t);
151
+ break;
152
+ }
153
+ t.setCoords(), n.value?.renderAll();
154
+ }, K = (t) => {
155
+ if (t.length < 3)
156
+ return;
157
+ const e = [...t].sort((d, c) => d.getBoundingRect().left - c.getBoundingRect().left), o = e[0].getBoundingRect(), a = e[e.length - 1].getBoundingRect(), s = a.left + a.width - o.left, u = e.reduce((d, c) => d + c.getBoundingRect().width, 0), r = (s - u) / (e.length - 1);
158
+ let i = o.left + o.width + r;
159
+ for (let d = 1; d < e.length - 1; d++) {
160
+ const c = e[d], v = c.getBoundingRect();
161
+ c.set("left", Math.round(c.left + (i - v.left))), i += v.width + r;
162
+ }
163
+ }, U = (t) => {
164
+ if (t.length < 3)
165
+ return;
166
+ const e = [...t].sort((d, c) => d.getBoundingRect().top - c.getBoundingRect().top), o = e[0].getBoundingRect(), a = e[e.length - 1].getBoundingRect(), s = a.top + a.height - o.top, u = e.reduce((d, c) => d + c.getBoundingRect().height, 0), r = (s - u) / (e.length - 1);
167
+ let i = o.top + o.height + r;
168
+ for (let d = 1; d < e.length - 1; d++) {
169
+ const c = e[d], v = c.getBoundingRect();
170
+ c.set("top", Math.round(c.top + (i - v.top))), i += v.height + r;
171
+ }
172
+ }, W = (t, e) => {
173
+ if (t.length < 2)
174
+ return;
175
+ const o = t.map((c) => c.getBoundingRect()), a = Math.min(...o.map((c) => c.left)), s = Math.max(...o.map((c) => c.left + c.width)), u = Math.min(...o.map((c) => c.top)), r = Math.max(...o.map((c) => c.top + c.height)), i = (a + s) / 2, d = (u + r) / 2;
176
+ switch (e) {
177
+ case "left":
178
+ t.forEach((c) => {
179
+ const v = c.getBoundingRect();
180
+ c.set("left", Math.round(c.left + (a - v.left)));
181
+ });
182
+ break;
183
+ case "right":
184
+ t.forEach((c) => {
185
+ const v = c.getBoundingRect();
186
+ c.set("left", Math.round(c.left + (s - v.left - v.width)));
187
+ });
188
+ break;
189
+ case "top":
190
+ t.forEach((c) => {
191
+ const v = c.getBoundingRect();
192
+ c.set("top", Math.round(c.top + (u - v.top)));
193
+ });
194
+ break;
195
+ case "bottom":
196
+ t.forEach((c) => {
197
+ const v = c.getBoundingRect();
198
+ c.set("top", Math.round(c.top + (r - v.top - v.height)));
199
+ });
200
+ break;
201
+ case "center-horizontal":
202
+ t.forEach((c) => {
203
+ const v = c.getBoundingRect(), j = v.left + v.width / 2;
204
+ c.set("left", Math.round(c.left + (i - j)));
205
+ });
206
+ break;
207
+ case "center-vertical":
208
+ t.forEach((c) => {
209
+ const v = c.getBoundingRect(), j = v.top + v.height / 2;
210
+ c.set("top", Math.round(c.top + (d - j)));
211
+ });
212
+ break;
213
+ case "distribute-horizontal":
214
+ K(t);
215
+ break;
216
+ case "distribute-vertical":
217
+ U(t);
218
+ break;
219
+ }
220
+ t.forEach((c) => c.setCoords()), n.value?.renderAll();
221
+ }, N = (t, e) => (P.value = t, n.value = ke(new be(t, {
222
+ selection: !0,
223
+ preserveObjectStacking: !0,
224
+ uniformScaling: !1,
225
+ uniScaleKey: "shiftKey",
226
+ altActionKey: "altKey"
227
+ })), _(), E(), e && S(e), n.value), Z = async (t, e = {}) => {
228
+ const o = I(t);
229
+ if (!o || !n.value)
230
+ return;
231
+ const a = T(), s = l.value.width / 2, u = l.value.height / 2, r = {
232
+ ...o.defaultProps,
233
+ left: Math.round(s - (o.defaultProps.width || 100) / 2),
234
+ top: Math.round(u - (o.defaultProps.height || 50) / 2),
235
+ ...e,
236
+ id: a
237
+ }, i = await o.createFabricObject(r);
238
+ if (!i)
239
+ return;
240
+ i.elementId = a, n.value.add(i), i.setCoords(), n.value.setActiveObject(i), n.value.renderAll();
241
+ const d = r;
242
+ return l.value.elements.push(d), a;
243
+ }, $ = () => {
244
+ if (!n.value || h.value.length === 0)
245
+ return;
246
+ n.value.getActiveObjects().forEach((e) => {
247
+ const o = e.elementId;
248
+ if (o) {
249
+ const a = l.value.elements.findIndex((s) => s.id === o);
250
+ a !== -1 && l.value.elements.splice(a, 1);
251
+ }
252
+ n.value?.remove(e);
253
+ }), n.value.discardActiveObject(), h.value = [], n.value.renderAll();
254
+ }, V = () => {
255
+ n.value?.discardActiveObject(), n.value?.renderAll();
256
+ }, q = (t, e, o) => {
257
+ const a = l.value.elements.findIndex((i) => i.id === t);
258
+ if (a === -1)
259
+ return;
260
+ const s = l.value.elements[a], u = I(s.type);
261
+ if (!u)
262
+ return;
263
+ l.value.elements[a] = {
264
+ ...s,
265
+ [e]: o
266
+ };
267
+ const r = n.value?.getObjects().find((i) => i.elementId === t);
268
+ r && u.onPropsChange && (u.onPropsChange(l.value.elements[a], r), r.setCoords(), n.value?.renderAll());
269
+ }, G = m(() => {
270
+ if (h.value.length !== 1 || l.value.elements.length <= 1)
271
+ return !1;
272
+ const e = h.value[0].elementId;
273
+ if (!e)
274
+ return !1;
275
+ const o = l.value.elements.findIndex((a) => a.id === e);
276
+ return o !== -1 && o < l.value.elements.length - 1;
277
+ }), Q = m(() => {
278
+ if (h.value.length !== 1 || l.value.elements.length <= 1)
279
+ return !1;
280
+ const e = h.value[0].elementId;
281
+ return e ? l.value.elements.findIndex((a) => a.id === e) > 0 : !1;
282
+ }), ee = m(() => {
283
+ if (h.value.length !== 1 || l.value.elements.length <= 1)
284
+ return !1;
285
+ const e = h.value[0].elementId;
286
+ if (!e)
287
+ return !1;
288
+ const o = l.value.elements.findIndex((a) => a.id === e);
289
+ return o !== -1 && o < l.value.elements.length - 1;
290
+ }), te = m(() => {
291
+ if (h.value.length !== 1 || l.value.elements.length <= 1)
292
+ return !1;
293
+ const e = h.value[0].elementId;
294
+ return e ? l.value.elements.findIndex((a) => a.id === e) > 0 : !1;
295
+ }), ne = (t) => {
296
+ const e = n.value?.getActiveObjects() || [];
297
+ if (e.length === 1) {
298
+ if (J(e[0], t), ["move-up", "move-down", "move-to-front", "move-to-back"].includes(t)) {
299
+ const o = e[0].elementId;
300
+ if (o) {
301
+ const a = l.value.elements.findIndex((s) => s.id === o);
302
+ if (a !== -1) {
303
+ const s = l.value.elements[a];
304
+ switch (l.value.elements.splice(a, 1), t) {
305
+ case "move-up":
306
+ l.value.elements.splice(Math.min(a + 1, l.value.elements.length), 0, s);
307
+ break;
308
+ case "move-down":
309
+ l.value.elements.splice(Math.max(a - 1, 0), 0, s);
310
+ break;
311
+ case "move-to-front":
312
+ l.value.elements.push(s);
313
+ break;
314
+ case "move-to-back":
315
+ l.value.elements.unshift(s);
316
+ break;
317
+ }
318
+ }
319
+ }
320
+ }
321
+ } else e.length > 1 && W(e, t);
322
+ }, ae = () => {
323
+ n.value && (n.value.clear(), l.value.elements = [], h.value = []);
324
+ }, le = async (t) => {
325
+ if (t)
326
+ try {
327
+ const e = JSON.parse(t);
328
+ if (l.value = {
329
+ width: e.width || 750,
330
+ height: e.height || 1e3,
331
+ backgroundColor: e.backgroundColor || "#ffffff",
332
+ backgroundImage: e.backgroundImage || "",
333
+ elements: e.elements || []
334
+ }, n.value) {
335
+ n.value.clear(), n.value.setDimensions({
336
+ width: l.value.width,
337
+ height: l.value.height
338
+ }), n.value.backgroundColor = l.value.backgroundColor, l.value.backgroundImage && X(l.value.backgroundImage);
339
+ const o = l.value.elements.map(async (a) => {
340
+ const s = I(a.type);
341
+ if (!s)
342
+ return;
343
+ const u = await s.createFabricObject(a);
344
+ u && (u.elementId = a.id, n.value?.add(u));
345
+ });
346
+ Promise.all(o).then(() => {
347
+ E(), n.value?.renderAll(), b();
348
+ });
349
+ }
350
+ } catch (e) {
351
+ console.error("Failed to load data:", e);
352
+ }
353
+ }, oe = (t) => {
354
+ D = t?.onDataChange || (() => {
355
+ });
356
+ }, se = () => {
357
+ n.value && (n.value.dispose(), n.value = null);
358
+ }, R = m(() => h.value.length === 1 ? h.value[0] : null), p = m(() => {
359
+ if (!R.value)
360
+ return null;
361
+ const t = R.value.elementId;
362
+ return l.value.elements.find((e) => e.id === t) || null;
363
+ }), ce = m(() => p.value ? I(p.value.type) : null), re = m(() => h.value.length > 1), ue = (t) => {
364
+ if (p.value)
365
+ return p.value[t];
366
+ }, ie = m(() => h.value.map((t) => {
367
+ const e = t.elementId;
368
+ return l.value.elements.find((o) => o.id === e);
369
+ }).filter((t) => !!t)), de = (t, e) => {
370
+ l.value.width = t, l.value.height = e, n.value && (n.value.setDimensions({ width: t, height: e }), x(), n.value.renderAll()), b();
371
+ }, ve = (t) => {
372
+ l.value.backgroundColor = t, n.value && (n.value.backgroundColor = t, n.value.renderAll()), b();
373
+ }, X = (t) => {
374
+ !n.value || !t || pe.fromURL(t, {
375
+ crossOrigin: "anonymous"
376
+ }).then((e) => {
377
+ n.value && (n.value.backgroundImage = e, n.value.renderAll());
378
+ }).catch((e) => {
379
+ console.error("Failed to load background image:", e);
380
+ });
381
+ }, he = (t) => {
382
+ l.value.backgroundImage = t, t ? X(t) : n.value && (n.value.backgroundImage = void 0, n.value.renderAll()), b();
383
+ }, ge = () => {
384
+ C(), b();
385
+ }, me = () => {
386
+ C();
387
+ const t = JSON.stringify(l.value, null, 2), e = new Blob([t], { type: "application/json" }), o = URL.createObjectURL(e), a = document.createElement("a");
388
+ a.href = o, a.download = `poster-${Date.now()}.json`, document.body.appendChild(a), a.click(), document.body.removeChild(a), URL.revokeObjectURL(o);
389
+ };
390
+ return Ie(
391
+ l,
392
+ () => {
393
+ g();
394
+ },
395
+ { deep: !0 }
396
+ ), {
397
+ initCanvas: N,
398
+ destroy: se,
399
+ setCallbacks: oe,
400
+ addElement: Z,
401
+ deleteSelectedElements: $,
402
+ updateElementProperty: q,
403
+ alignElements: ne,
404
+ canMoveUp: G,
405
+ canMoveDown: Q,
406
+ canMoveToFront: ee,
407
+ canMoveToBack: te,
408
+ clearCanvas: ae,
409
+ loadData: le,
410
+ updateData: b,
411
+ canvas: n,
412
+ canvasData: l,
413
+ selectedElements: h,
414
+ canvasScale: B,
415
+ currentElement: R,
416
+ currentElementData: p,
417
+ currentElementConfig: ce,
418
+ hasMultipleSelection: re,
419
+ clearSelection: V,
420
+ updateCanvasSize: E,
421
+ setupAutoResize: S,
422
+ getSelectedElementProperty: ue,
423
+ selectedElementsData: ie,
424
+ syncAllFabricObjectsToData: C,
425
+ updateCanvasSettings: de,
426
+ updateCanvasBackground: ve,
427
+ updateCanvasBackgroundImage: he,
428
+ saveData: ge,
429
+ exportJson: me
430
+ };
431
+ }
432
+ export {
433
+ Me as usePosterEditor
434
+ };
@@ -0,0 +1,40 @@
1
+ import { defineComponent as o, createVNode as t } from "vue";
2
+ import { NTooltip as l, NButton as n } from "naive-ui";
3
+ import { elementConfigs as u } from "../elements/index.js";
4
+ const i = /* @__PURE__ */ o({
5
+ name: "LeftToolbar",
6
+ props: {
7
+ onAddElement: {
8
+ type: Function,
9
+ required: !0
10
+ },
11
+ canvasWidth: {
12
+ type: Number,
13
+ required: !0
14
+ },
15
+ canvasHeight: {
16
+ type: Number,
17
+ required: !0
18
+ }
19
+ },
20
+ setup(r) {
21
+ return () => t("div", {
22
+ class: "p-4 bg-default border-r border-default flex flex-col gap-6"
23
+ }, [u.map((e) => t(l, null, {
24
+ default: () => e.name,
25
+ trigger: () => t(n, {
26
+ key: e.type,
27
+ text: !0,
28
+ size: "large",
29
+ onClick: () => r.onAddElement(e.type)
30
+ }, {
31
+ icon: () => t("div", {
32
+ class: e.icon
33
+ }, null)
34
+ })
35
+ }))]);
36
+ }
37
+ });
38
+ export {
39
+ i as LeftToolbar
40
+ };
@@ -0,0 +1,31 @@
1
+ import { defineComponent as t, createVNode as e } from "vue";
2
+ import { NScrollbar as o } from "naive-ui";
3
+ const a = /* @__PURE__ */ t({
4
+ name: "Panel",
5
+ props: {
6
+ title: {
7
+ type: String,
8
+ required: !0
9
+ }
10
+ },
11
+ setup(r, {
12
+ slots: l
13
+ }) {
14
+ return () => e("div", {
15
+ class: "flex flex-col h-full"
16
+ }, [e("div", {
17
+ class: "font-medium p-3 border-b border-default"
18
+ }, [r.title]), e("div", {
19
+ class: " flex-1 min-h-0"
20
+ }, [e(o, null, {
21
+ default: () => [e("div", {
22
+ class: "p-3 flex flex-col gap-2"
23
+ }, [l.default?.()])]
24
+ })]), e("div", {
25
+ class: "border-t border-default p-3 flex flex-col gap-2"
26
+ }, [l.footer?.()])]);
27
+ }
28
+ });
29
+ export {
30
+ a as Panel
31
+ };
@@ -0,0 +1,22 @@
1
+ import { defineComponent as r, createVNode as e } from "vue";
2
+ const i = /* @__PURE__ */ r({
3
+ name: "PanelItem",
4
+ props: {
5
+ title: {
6
+ type: String,
7
+ required: !0
8
+ }
9
+ },
10
+ setup(t, {
11
+ slots: l
12
+ }) {
13
+ return () => e("div", {
14
+ class: "flex flex-col gap-1"
15
+ }, [e("div", {
16
+ class: "text-muted text-sm"
17
+ }, [t.title]), e("div", null, [l.default?.()])]);
18
+ }
19
+ });
20
+ export {
21
+ i as PanelItem
22
+ };