@snowcone-app/canvas 0.15.0 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/dist/{CanvasStateV1-BQD8fCBU.js → CanvasStateV1-C6i6vU6p.js} +63 -63
  2. package/dist/{CanvasStateV1-BQD8fCBU.js.map → CanvasStateV1-C6i6vU6p.js.map} +1 -1
  3. package/dist/EditorCanvasImpl-DkgE5-C2.js +68 -0
  4. package/dist/EditorCanvasImpl-DkgE5-C2.js.map +1 -0
  5. package/dist/EditorContext-CyanYzo2.js +1131 -0
  6. package/dist/EditorContext-CyanYzo2.js.map +1 -0
  7. package/dist/{ImportManager-eotl7r5d.js → ElementFactory-C05JJkRp.js} +1510 -5121
  8. package/dist/ElementFactory-C05JJkRp.js.map +1 -0
  9. package/dist/{HybridHistoryManager-NL3zyEl4.js → HybridHistoryManager-Bht98XRv.js} +98 -98
  10. package/dist/{HybridHistoryManager-NL3zyEl4.js.map → HybridHistoryManager-Bht98XRv.js.map} +1 -1
  11. package/dist/ImportManager-kRYfIX-D.js +3617 -0
  12. package/dist/ImportManager-kRYfIX-D.js.map +1 -0
  13. package/dist/SnowconeCanvas-C3eZ9PP8.js +1047 -0
  14. package/dist/SnowconeCanvas-C3eZ9PP8.js.map +1 -0
  15. package/dist/ThemeContext-Rjz25x9X.js +75 -0
  16. package/dist/ThemeContext-Rjz25x9X.js.map +1 -0
  17. package/dist/UnifiedFontService-BAtqqkU4.js +1478 -0
  18. package/dist/UnifiedFontService-BAtqqkU4.js.map +1 -0
  19. package/dist/advanced.mjs +210 -207
  20. package/dist/advanced.mjs.map +1 -1
  21. package/dist/api/embed.d.ts +8 -4
  22. package/dist/api/testing.d.ts +1 -0
  23. package/dist/components/editor/EditorBuy.d.ts +49 -0
  24. package/dist/components/editor/EditorCanvas.d.ts +30 -0
  25. package/dist/components/editor/EditorCanvasImpl.d.ts +33 -0
  26. package/dist/components/editor/EditorPreview.d.ts +39 -0
  27. package/dist/components/editor/EditorRoot.d.ts +86 -0
  28. package/dist/components/editor/EditorTextField.d.ts +22 -0
  29. package/dist/components/editor/RootInternals.d.ts +77 -0
  30. package/dist/components/editor/designStateStore.d.ts +45 -0
  31. package/dist/components/editor/index.d.ts +23 -0
  32. package/dist/components/embed-realtime/RealtimeCanvas.d.ts +1 -1
  33. package/dist/components/embed-realtime/RealtimeEmbed.d.ts +5 -78
  34. package/dist/components/embed-realtime/RealtimeMockup.d.ts +5 -34
  35. package/dist/components/embed-realtime/context.d.ts +12 -2
  36. package/dist/components/embed-realtime/validateEmbed.d.ts +17 -3
  37. package/dist/contexts/EditorContext.d.ts +1 -0
  38. package/dist/design/design-builder.d.ts +81 -6
  39. package/dist/editorError-DMENTZ-3.js +19 -0
  40. package/dist/editorError-DMENTZ-3.js.map +1 -0
  41. package/dist/editorErrors-DbIEtCTt.js +29 -0
  42. package/dist/editorErrors-DbIEtCTt.js.map +1 -0
  43. package/dist/embed-Bdj4PKUA.js +737 -0
  44. package/dist/embed-Bdj4PKUA.js.map +1 -0
  45. package/dist/embed.mjs +38 -230
  46. package/dist/embed.mjs.map +1 -1
  47. package/dist/errors/editorError.d.ts +57 -0
  48. package/dist/iconify-D6eVIEy4.js +1089 -0
  49. package/dist/iconify-D6eVIEy4.js.map +1 -0
  50. package/dist/index.mjs +48 -46
  51. package/dist/index.mjs.map +1 -1
  52. package/dist/internals.mjs +105 -104
  53. package/dist/internals.mjs.map +1 -1
  54. package/dist/rendering/PieceGuideRenderer.d.ts +2 -16
  55. package/dist/template-fields-GOM4MNfq.js +643 -0
  56. package/dist/template-fields-GOM4MNfq.js.map +1 -0
  57. package/dist/testing/editorErrors.d.ts +30 -0
  58. package/dist/testing.mjs +28 -23
  59. package/dist/testing.mjs.map +1 -1
  60. package/dist/{usePieceGuideBundle-Cyl695jv.js → usePieceGuideBundle-CGERAQJl.js} +2 -2
  61. package/dist/{usePieceGuideBundle-Cyl695jv.js.map → usePieceGuideBundle-CGERAQJl.js.map} +1 -1
  62. package/dist/utils/inkLuminance.d.ts +38 -0
  63. package/dist/validation-DEd6EOCP.js +19947 -0
  64. package/dist/validation-DEd6EOCP.js.map +1 -0
  65. package/dist/workers/export-worker.bundle.string.d.ts +1 -1
  66. package/package.json +9 -4
  67. package/dist/ImportManager-eotl7r5d.js.map +0 -1
  68. package/dist/ThemeContext-Cl1JPVLZ.js +0 -1158
  69. package/dist/ThemeContext-Cl1JPVLZ.js.map +0 -1
  70. package/dist/template-fields-coO73lV3.js +0 -1632
  71. package/dist/template-fields-coO73lV3.js.map +0 -1
  72. package/dist/validation-BahKiJWj.js +0 -22973
  73. package/dist/validation-BahKiJWj.js.map +0 -1
@@ -0,0 +1,1478 @@
1
+ import { jsx as Pe } from "react/jsx-runtime";
2
+ import { useMemo as Y, useContext as Ge, createContext as Be, useRef as le, useState as K, useCallback as f, useEffect as be } from "react";
3
+ import { u as fe } from "./EditorContext-CyanYzo2.js";
4
+ import { G, c as Q, C as ce } from "./HybridHistoryManager-Bht98XRv.js";
5
+ import { E as se } from "./ElementFactory-C05JJkRp.js";
6
+ const Ue = {
7
+ "eos-icons:loading": {
8
+ body: '<path fill="currentColor" d="M12 2A10 10 0 1 0 22 12A10 10 0 0 0 12 2Zm0 18a8 8 0 1 1 8-8A8 8 0 0 1 12 20Z" opacity=".5"/><path fill="currentColor" d="M20 12h2A10 10 0 0 0 12 2V4A8 8 0 0 1 20 12Z"><animateTransform attributeName="transform" dur="1s" from="0 12 12" repeatCount="indefinite" to="360 12 12" type="rotate"/></path>',
9
+ width: 24,
10
+ height: 24
11
+ },
12
+ "fa6-solid:icons": {
13
+ body: '<path fill="currentColor" d="M500.3 7.3c7.4 6 11.7 15.1 11.7 24.7v144c0 26.5-28.7 48-64 48s-64-21.5-64-48s28.7-48 64-48V71l-96 19.2V208c0 26.5-28.7 48-64 48s-64-21.5-64-48s28.7-48 64-48V64c0-15.3 10.8-28.4 25.7-31.4l160-32c9.4-1.9 19.1.6 26.6 6.6zM74.7 304l11.8-17.8c5.9-8.9 15.9-14.2 26.6-14.2h61.7c10.7 0 20.7 5.3 26.6 14.2l11.9 17.8H240c26.5 0 48 21.5 48 48v112c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V352c0-26.5 21.5-48 48-48zM192 408a48 48 0 1 0-96 0a48 48 0 1 0 96 0m286.7-129.7L440.3 368H496c6.7 0 12.6 4.1 15 10.4s.6 13.3-4.4 17.7l-128 112c-5.6 4.9-13.9 5.3-19.9.9s-8.2-12.4-5.3-19.2l38.3-89.8H336c-6.7 0-12.6-4.1-15-10.4s-.6-13.3 4.4-17.7l128-112c5.6-4.9 13.9-5.3 19.9-.9s8.2 12.4 5.3 19.2zm-339-59.2c-6.5 6.5-17 6.5-23 0l-96.8-99.9c-28-29-26.5-76.9 5-103.9c27-23.5 68.4-19 93.4 6.5l10 10.5l9.5-10.5c25-25.5 65.9-30 93.9-6.5c31 27 32.5 74.9 4.5 103.9l-96.4 99.9z"/>',
14
+ width: 512,
15
+ height: 512
16
+ },
17
+ "gravity-ui:arrow-down-to-square": {
18
+ body: '<path fill="currentColor" fill-rule="evenodd" d="M8.53 11.78a.75.75 0 0 1-1.06 0l-2.5-2.5a.75.75 0 0 1 1.06-1.06l1.22 1.22V1.75a.75.75 0 0 1 1.5 0v7.69l1.22-1.22a.75.75 0 1 1 1.06 1.06zM4.25 4a.75.75 0 1 1 0 1.5H4A1.5 1.5 0 0 0 2.5 7v5A1.5 1.5 0 0 0 4 13.5h8a1.5 1.5 0 0 0 1.5-1.5V7A1.5 1.5 0 0 0 12 5.5h-.25a.75.75 0 0 1 0-1.5H12a3 3 0 0 1 3 3v5a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V7a3 3 0 0 1 3-3z" clip-rule="evenodd"/>',
19
+ width: 24,
20
+ height: 24
21
+ },
22
+ "gravity-ui:arrow-left": {
23
+ body: '<path fill="currentColor" fill-rule="evenodd" d="M14.75 8a.75.75 0 0 1-.75.75H3.81l2.72 2.72a.75.75 0 1 1-1.06 1.06l-4-4a.75.75 0 0 1 0-1.06l4-4a.75.75 0 0 1 1.06 1.06L3.81 7.25H14a.75.75 0 0 1 .75.75" clip-rule="evenodd"/>',
24
+ width: 24,
25
+ height: 24
26
+ },
27
+ "gravity-ui:arrow-rotate-left": {
28
+ body: '<path fill="currentColor" fill-rule="evenodd" d="M8 1.5a6.5 6.5 0 1 1-6.445 7.348a.75.75 0 1 1 1.487-.194A5.001 5.001 0 1 0 4.43 4.5h1.32a.75.75 0 0 1 0 1.5h-3A.75.75 0 0 1 2 5.25v-3a.75.75 0 0 1 1.5 0v1.06A6.48 6.48 0 0 1 8 1.5" clip-rule="evenodd"/>',
29
+ width: 24,
30
+ height: 24
31
+ },
32
+ "gravity-ui:bars": {
33
+ body: '<path fill="currentColor" fill-rule="evenodd" d="M1.25 3.25A.75.75 0 0 1 2 2.5h12A.75.75 0 0 1 14 4H2a.75.75 0 0 1-.75-.75m0 4.75A.75.75 0 0 1 2 7.25h12a.75.75 0 0 1 0 1.5H2A.75.75 0 0 1 1.25 8M2 12a.75.75 0 0 0 0 1.5h12a.75.75 0 0 0 0-1.5z" clip-rule="evenodd"/>',
34
+ width: 24,
35
+ height: 24
36
+ },
37
+ "gravity-ui:bold": {
38
+ body: '<path fill="currentColor" fill-rule="evenodd" d="M4.25 2.25A.75.75 0 0 0 3.5 3v10c0 .414.336.75.75.75H9.5a3.25 3.25 0 0 0 1.477-6.146A3.25 3.25 0 0 0 8.5 2.25zm3.5 5a1.75 1.75 0 1 0 0-3.5h-2v3.5zm-2 1.5v3.5h3a1.75 1.75 0 1 0 0-3.5z" clip-rule="evenodd"/>',
39
+ width: 24,
40
+ height: 24
41
+ },
42
+ "gravity-ui:check": {
43
+ body: '<path fill="currentColor" fill-rule="evenodd" d="M13.488 3.43a.75.75 0 0 1 .081 1.058l-6 7a.75.75 0 0 1-1.1.042l-3.5-3.5A.75.75 0 0 1 4.03 6.97l2.928 2.927l5.473-6.385a.75.75 0 0 1 1.057-.081" clip-rule="evenodd"/>',
44
+ width: 24,
45
+ height: 24
46
+ },
47
+ "gravity-ui:chevron-down": {
48
+ body: '<path fill="currentColor" fill-rule="evenodd" d="M2.97 5.47a.75.75 0 0 1 1.06 0L8 9.44l3.97-3.97a.75.75 0 1 1 1.06 1.06l-4.5 4.5a.75.75 0 0 1-1.06 0l-4.5-4.5a.75.75 0 0 1 0-1.06" clip-rule="evenodd"/>',
49
+ width: 24,
50
+ height: 24
51
+ },
52
+ "gravity-ui:chevron-right": {
53
+ body: '<path fill="currentColor" fill-rule="evenodd" d="M5.47 13.03a.75.75 0 0 1 0-1.06L9.44 8L5.47 4.03a.75.75 0 0 1 1.06-1.06l4.5 4.5a.75.75 0 0 1 0 1.06l-4.5 4.5a.75.75 0 0 1-1.06 0" clip-rule="evenodd"/>',
54
+ width: 24,
55
+ height: 24
56
+ },
57
+ "gravity-ui:chevron-up": {
58
+ body: '<path fill="currentColor" fill-rule="evenodd" d="M13.03 10.53a.75.75 0 0 1-1.06 0L8 6.56l-3.97 3.97a.75.75 0 1 1-1.06-1.06l4.5-4.5a.75.75 0 0 1 1.06 0l4.5 4.5a.75.75 0 0 1 0 1.06" clip-rule="evenodd"/>',
59
+ width: 24,
60
+ height: 24
61
+ },
62
+ "gravity-ui:circle-fill": {
63
+ body: '<path fill="currentColor" fill-rule="evenodd" d="M8 15A7 7 0 1 0 8 1a7 7 0 0 0 0 14" clip-rule="evenodd"/>',
64
+ width: 24,
65
+ height: 24
66
+ },
67
+ "gravity-ui:copy": {
68
+ body: '<path fill="currentColor" fill-rule="evenodd" d="M12 2.5H8A1.5 1.5 0 0 0 6.5 4v1H8a3 3 0 0 1 3 3v1.5h1A1.5 1.5 0 0 0 13.5 8V4A1.5 1.5 0 0 0 12 2.5M11 11h1a3 3 0 0 0 3-3V4a3 3 0 0 0-3-3H8a3 3 0 0 0-3 3v1H4a3 3 0 0 0-3 3v4a3 3 0 0 0 3 3h4a3 3 0 0 0 3-3zM4 6.5h4A1.5 1.5 0 0 1 9.5 8v4A1.5 1.5 0 0 1 8 13.5H4A1.5 1.5 0 0 1 2.5 12V8A1.5 1.5 0 0 1 4 6.5" clip-rule="evenodd"/>',
69
+ width: 24,
70
+ height: 24
71
+ },
72
+ "gravity-ui:italic": {
73
+ body: '<path fill="currentColor" fill-rule="evenodd" d="M7.25 2a.75.75 0 0 0 0 1.5h1.317l-2.7 9H4.25a.75.75 0 1 0 0 1.5h4.5a.75.75 0 0 0 0-1.5H7.433l2.7-9h1.617a.75.75 0 0 0 0-1.5z" clip-rule="evenodd"/>',
74
+ width: 24,
75
+ height: 24
76
+ },
77
+ "gravity-ui:layers": {
78
+ body: '<path fill="currentColor" fill-rule="evenodd" d="m2.789 5.283l4.037-2.02A2.5 2.5 0 0 1 7.944 3h.112c.388 0 .77.09 1.118.264l4.037 2.019a.522.522 0 0 1 0 .934l-4.037 2.02a2.5 2.5 0 0 1-1.118.263h-.112a2.5 2.5 0 0 1-1.118-.264L2.79 6.217a.523.523 0 0 1 0-.934M1 5.75c0-.766.433-1.466 1.118-1.809l4.037-2.019a4 4 0 0 1 1.79-.422h.11a4 4 0 0 1 1.79.422l4.037 2.019a2.023 2.023 0 0 1 0 3.618l-.882.44l.882.442a2.023 2.023 0 0 1 0 3.618l-4.037 2.019a4 4 0 0 1-1.79.422h-.11a4 4 0 0 1-1.79-.422l-4.037-2.02a2.023 2.023 0 0 1 0-3.617L3 8l-.882-.441A2.02 2.02 0 0 1 1 5.75m3.677 3.088l-1.888.945a.523.523 0 0 0 0 .934l4.037 2.019A2.5 2.5 0 0 0 7.944 13h.112a2.5 2.5 0 0 0 1.118-.264l4.037-2.019a.523.523 0 0 0 0-.934l-1.888-.945l-1.478.74a4 4 0 0 1-1.79.422h-.11a4 4 0 0 1-1.79-.422z" clip-rule="evenodd"/>',
79
+ width: 24,
80
+ height: 24
81
+ },
82
+ "gravity-ui:magic-wand": {
83
+ body: '<path fill="currentColor" fill-rule="evenodd" d="m11.1 5.894l-.412.903l.671.732l1.356 1.48l-1.994-.227l-.986-.113l-.49.864l-.987 1.747l-.4-1.967l-.198-.972l-.973-.198l-1.966-.4l1.746-.989l.864-.489l-.112-.986l-.227-1.994L8.47 4.641l.732.67l.903-.411l1.826-.832zM7.02 1.276l2.465 2.26l3.043-1.387c.842-.384 1.708.483 1.325 1.324l-1.387 3.043l2.259 2.465c.625.682.069 1.774-.85 1.67l-3.323-.38l-1.646 2.911c-.456.805-1.666.613-1.85-.293l-.667-3.277l-3.277-.666c-.906-.185-1.098-1.395-.293-1.85l2.91-1.647l-.378-3.322c-.105-.92.987-1.476 1.669-.85M5.53 11.53a.75.75 0 1 0-1.06-1.06l-3.5 3.5a.75.75 0 1 0 1.06 1.06z" clip-rule="evenodd"/>',
84
+ width: 24,
85
+ height: 24
86
+ },
87
+ "gravity-ui:magnifier": {
88
+ body: '<path fill="currentColor" fill-rule="evenodd" d="M11.5 7a4.5 4.5 0 1 1-9 0a4.5 4.5 0 0 1 9 0m-.82 4.74a6 6 0 1 1 1.06-1.06l2.79 2.79a.75.75 0 1 1-1.06 1.06z" clip-rule="evenodd"/>',
89
+ width: 24,
90
+ height: 24
91
+ },
92
+ "gravity-ui:minus": {
93
+ body: '<path fill="currentColor" fill-rule="evenodd" d="M1.75 8a.75.75 0 0 1 .75-.75h11a.75.75 0 0 1 0 1.5h-11A.75.75 0 0 1 1.75 8" clip-rule="evenodd"/>',
94
+ width: 24,
95
+ height: 24
96
+ },
97
+ "gravity-ui:pencil": {
98
+ body: '<path fill="currentColor" fill-rule="evenodd" d="M11.423 1A3.577 3.577 0 0 1 15 4.577c0 .27-.108.53-.3.722l-.528.529l-1.971 1.971l-5.059 5.059a3 3 0 0 1-1.533.82l-2.638.528a1 1 0 0 1-1.177-1.177l.528-2.638a3 3 0 0 1 .82-1.533l5.059-5.059l2.5-2.5c.191-.191.451-.299.722-.299m-2.31 4.009l-4.91 4.91a1.5 1.5 0 0 0-.41.766l-.38 1.903l1.902-.38a1.5 1.5 0 0 0 .767-.41l4.91-4.91a2.08 2.08 0 0 0-1.88-1.88m3.098.658a3.6 3.6 0 0 0-1.878-1.879l1.28-1.28c.995.09 1.788.884 1.878 1.88z" clip-rule="evenodd"/>',
99
+ width: 24,
100
+ height: 24
101
+ },
102
+ "gravity-ui:picture": {
103
+ body: '<path fill="currentColor" fill-rule="evenodd" d="M11.5 3h-7A1.5 1.5 0 0 0 3 4.5v5.027l.962-.7a1.75 1.75 0 0 1 2.079.016l.928.696l2.368-2.03a1.75 1.75 0 0 1 2.325.043L13 8.787V4.5A1.5 1.5 0 0 0 11.5 3m3 7.498V4.5a3 3 0 0 0-3-3h-7a3 3 0 0 0-3 3v7a3 3 0 0 0 3 3h7a3 3 0 0 0 3-3zm-1.5.33l-2.355-2.174a.25.25 0 0 0-.332-.006L7.488 11.07l-.457.392l-.481-.361l-1.41-1.057a.25.25 0 0 0-.296-.002L3 11.381v.119A1.5 1.5 0 0 0 4.5 13h7a1.5 1.5 0 0 0 1.5-1.5zM7.5 6a1.5 1.5 0 1 1-3 0a1.5 1.5 0 0 1 3 0" clip-rule="evenodd"/>',
104
+ width: 24,
105
+ height: 24
106
+ },
107
+ "gravity-ui:plus": {
108
+ body: '<path fill="currentColor" fill-rule="evenodd" d="M8 1.75a.75.75 0 0 1 .75.75v4.75h4.75a.75.75 0 0 1 0 1.5H8.75v4.75a.75.75 0 0 1-1.5 0V8.75H2.5a.75.75 0 0 1 0-1.5h4.75V2.5A.75.75 0 0 1 8 1.75" clip-rule="evenodd"/>',
109
+ width: 24,
110
+ height: 24
111
+ },
112
+ "gravity-ui:scissors": {
113
+ body: '<path fill="currentColor" fill-rule="evenodd" d="M4.5 6a1.5 1.5 0 1 0 0-3a1.5 1.5 0 0 0 0 3m-3-1.5a3 3 0 0 0 4.524 2.585L6.939 8l-.915.915a3 3 0 1 0 1.06 1.06L8.122 8.94l5.501 3.209a.75.75 0 1 0 .756-1.296L9.488 8l4.89-2.852a.75.75 0 0 0-.756-1.296l-5.5 3.209l-1.037-1.037A3 3 0 1 0 1.5 4.5m3 5.5a1.5 1.5 0 1 1 0 3a1.5 1.5 0 0 1 0-3" clip-rule="evenodd"/>',
114
+ width: 24,
115
+ height: 24
116
+ },
117
+ "gravity-ui:sparkles": {
118
+ body: '<path fill="currentColor" d="M13 10a.75.75 0 0 1 .725.556a2.37 2.37 0 0 0 1.72 1.72a.75.75 0 0 1 0 1.449a2.37 2.37 0 0 0-1.72 1.72a.75.75 0 0 1-1.45 0a2.37 2.37 0 0 0-1.72-1.72a.75.75 0 0 1 0-1.45a2.37 2.37 0 0 0 1.72-1.72l.043-.117A.75.75 0 0 1 13 10M7 0a1.5 1.5 0 0 1 1.48 1.253c.242 1.455.696 2.364 1.3 2.968c.603.603 1.512 1.057 2.967 1.3a1.5 1.5 0 0 1 0 2.958c-1.455.243-2.364.697-2.968 1.3c-.603.604-1.057 1.513-1.3 2.968a1.5 1.5 0 0 1-2.958 0c-.243-1.455-.697-2.364-1.3-2.968c-.604-.603-1.513-1.057-2.968-1.3a1.5 1.5 0 0 1 0-2.958c1.455-.243 2.364-.697 2.968-1.3c.603-.604 1.057-1.513 1.3-2.968l.028-.133A1.5 1.5 0 0 1 7 0m0 1.5C6.45 4.8 4.8 6.45 1.5 7c3.3.55 4.95 2.2 5.5 5.5c.55-3.3 2.2-4.95 5.5-5.5C9.2 6.45 7.55 4.8 7 1.5"/>',
119
+ width: 24,
120
+ height: 24
121
+ },
122
+ "gravity-ui:text": {
123
+ body: '<path fill="currentColor" fill-rule="evenodd" d="M3.279 2.544A.75.75 0 0 1 4 2h8a.75.75 0 0 1 .721.544l.5 1.75a.75.75 0 1 1-1.442.412L11.434 3.5H8.75l-.004 9H9.5a.75.75 0 0 1 0 1.5h-3a.75.75 0 0 1 0-1.5h.746l.004-9H4.566L4.22 4.706a.75.75 0 1 1-1.442-.412z" clip-rule="evenodd"/>',
124
+ width: 24,
125
+ height: 24
126
+ },
127
+ "gravity-ui:text-align-center": {
128
+ body: '<path fill="currentColor" fill-rule="evenodd" d="M2.75 2a.75.75 0 0 0 0 1.5h10.5a.75.75 0 0 0 0-1.5zm0 7a.75.75 0 0 0 0 1.5h10.5a.75.75 0 0 0 0-1.5zm2 3.5a.75.75 0 0 0 0 1.5h6.5a.75.75 0 0 0 0-1.5zM4 6.25a.75.75 0 0 1 .75-.75h6.5a.75.75 0 0 1 0 1.5h-6.5A.75.75 0 0 1 4 6.25" clip-rule="evenodd"/>',
129
+ width: 24,
130
+ height: 24
131
+ },
132
+ "gravity-ui:text-align-justify": {
133
+ body: '<path fill="currentColor" fill-rule="evenodd" d="M2.75 2a.75.75 0 0 0 0 1.5h10.5a.75.75 0 0 0 0-1.5zM2 6.25a.75.75 0 0 1 .75-.75h10.5a.75.75 0 0 1 0 1.5H2.75A.75.75 0 0 1 2 6.25M2.75 9a.75.75 0 0 0 0 1.5h10.5a.75.75 0 0 0 0-1.5zm0 3.5a.75.75 0 0 0 0 1.5h10.5a.75.75 0 0 0 0-1.5z" clip-rule="evenodd"/>',
134
+ width: 24,
135
+ height: 24
136
+ },
137
+ "gravity-ui:text-align-left": {
138
+ body: '<path fill="currentColor" fill-rule="evenodd" d="M2.75 2a.75.75 0 0 0 0 1.5h10.5a.75.75 0 0 0 0-1.5zm0 7a.75.75 0 0 0 0 1.5h10.5a.75.75 0 0 0 0-1.5zm0 3.5a.75.75 0 0 0 0 1.5h6.5a.75.75 0 0 0 0-1.5zM2 6.25a.75.75 0 0 1 .75-.75h6.5a.75.75 0 0 1 0 1.5h-6.5A.75.75 0 0 1 2 6.25" clip-rule="evenodd"/>',
139
+ width: 24,
140
+ height: 24
141
+ },
142
+ "gravity-ui:text-align-right": {
143
+ body: '<path fill="currentColor" fill-rule="evenodd" d="M2.75 2a.75.75 0 0 0 0 1.5h10.5a.75.75 0 0 0 0-1.5zM6 6.25a.75.75 0 0 1 .75-.75h6.5a.75.75 0 0 1 0 1.5h-6.5A.75.75 0 0 1 6 6.25M2.75 9a.75.75 0 0 0 0 1.5h10.5a.75.75 0 0 0 0-1.5zm4 3.5a.75.75 0 0 0 0 1.5h6.5a.75.75 0 0 0 0-1.5z" clip-rule="evenodd"/>',
144
+ width: 24,
145
+ height: 24
146
+ },
147
+ "gravity-ui:underline": {
148
+ body: '<path fill="currentColor" fill-rule="evenodd" d="M5 2.75a.75.75 0 0 0-1.5 0V7a4.5 4.5 0 0 0 9 0V2.75a.75.75 0 0 0-1.5 0V7a3 3 0 0 1-6 0zm-.75 9.75a.75.75 0 0 0 0 1.5h7.5a.75.75 0 0 0 0-1.5z" clip-rule="evenodd"/>',
149
+ width: 24,
150
+ height: 24
151
+ },
152
+ "healthicons:polygon": {
153
+ body: '<path fill="currentColor" fill-rule="evenodd" d="M28 10c0 .507-.094.992-.266 1.438l7.696 5.497a4 4 0 1 1 2.706 7.063l-2.32 10.437A4 4 0 1 1 30.126 39H17.874A4.002 4.002 0 0 1 10 38a4 4 0 0 1 2.184-3.565l-2.32-10.437a4 4 0 1 1 2.706-7.063l7.696-5.497A4 4 0 1 1 28 10m-6.57 3.065l-7.696 5.497a4 4 0 0 1-1.917 5.003l2.319 10.437A4 4 0 0 1 17.874 37h12.252a4 4 0 0 1 3.738-2.998l2.32-10.437a4 4 0 0 1-1.918-5.003l-7.695-5.497A3.98 3.98 0 0 1 24 14a3.98 3.98 0 0 1-2.57-.935" clip-rule="evenodd"/>',
154
+ width: 48,
155
+ height: 48
156
+ },
157
+ "heroicons:swatch": {
158
+ body: '<path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M4.098 19.902a3.75 3.75 0 0 0 5.304 0l6.401-6.402M6.75 21A3.75 3.75 0 0 1 3 17.25V4.125C3 3.504 3.504 3 4.125 3h5.25c.621 0 1.125.504 1.125 1.125v4.072M6.75 21a3.75 3.75 0 0 0 3.75-3.75V8.197M6.75 21h13.125c.621 0 1.125-.504 1.125-1.125v-5.25c0-.621-.504-1.125-1.125-1.125h-4.072M10.5 8.197l2.88-2.88a1.124 1.124 0 0 1 1.59 0l3.712 3.713c.44.44.44 1.152 0 1.59l-2.879 2.88M6.75 17.25h.008v.008H6.75z"/>',
159
+ width: 24,
160
+ height: 24
161
+ },
162
+ "hugeicons:layer-bring-forward": {
163
+ body: '<path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="m15.89 11.5l3.397 1.56C21.096 13.892 22 14.308 22 15s-.904 1.109-2.713 1.94l-4.893 2.247c-1.18.542-1.77.813-2.394.813s-1.214-.271-2.394-.813l-4.893-2.248C2.904 16.11 2 15.693 2 15s.904-1.109 2.713-1.94L8.11 11.5m3.89-7V15m3-8c-.59-.607-2.16-3-3-3S9.59 6.393 9 7"/>',
164
+ width: 24,
165
+ height: 24
166
+ },
167
+ "hugeicons:layer-send-backward": {
168
+ body: '<path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="m15.89 12.5l3.397-1.56C21.096 10.108 22 9.692 22 9s-.904-1.109-2.713-1.94l-4.893-2.247C13.214 4.271 12.624 4 12 4s-1.214.271-2.394.813L4.713 7.061C2.904 7.89 2 8.307 2 9s.904 1.109 2.713 1.94L8.11 12.5m3.89 7V9m3 8c-.59.607-2.16 3-3 3s-2.41-2.393-3-3"/>',
169
+ width: 24,
170
+ height: 24
171
+ },
172
+ "lucide:a-large-small": {
173
+ body: '<path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m15 16l2.536-7.328a1.02 1.02 1 0 1 1.928 0L22 16m-6.303-2h5.606M2 16l4.039-9.69a.5.5 0 0 1 .923 0L11 16m-7.696-3h6.392"/>',
174
+ width: 24,
175
+ height: 24
176
+ },
177
+ "lucide:aperture": {
178
+ body: '<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><circle cx="12" cy="12" r="10"/><path d="m14.31 8l5.74 9.94M9.69 8h11.48M7.38 12l5.74-9.94M9.69 16L3.95 6.06M14.31 16H2.83m13.79-4l-5.74 9.94"/></g>',
179
+ width: 24,
180
+ height: 24
181
+ },
182
+ "lucide:arrow-left": {
183
+ body: '<path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m12 19l-7-7l7-7m7 7H5"/>',
184
+ width: 24,
185
+ height: 24
186
+ },
187
+ "lucide:arrow-up-from-dot": {
188
+ body: '<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="m5 9l7-7l7 7m-7 7V2"/><circle cx="12" cy="21" r="1"/></g>',
189
+ width: 24,
190
+ height: 24
191
+ },
192
+ "lucide:blend": {
193
+ body: '<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><circle cx="9" cy="9" r="7"/><circle cx="15" cy="15" r="7"/></g>',
194
+ width: 24,
195
+ height: 24
196
+ },
197
+ "lucide:case-upper": {
198
+ body: '<path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 11h4.5a1 1 0 0 1 0 5h-4a.5.5 0 0 1-.5-.5v-9a.5.5 0 0 1 .5-.5h3a1 1 0 0 1 0 5M2 16l4.039-9.69a.5.5 0 0 1 .923 0L11 16m-7.696-3h6.392"/>',
199
+ width: 24,
200
+ height: 24
201
+ },
202
+ "lucide:circle": {
203
+ body: '<circle cx="12" cy="12" r="10" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>',
204
+ width: 24,
205
+ height: 24
206
+ },
207
+ "lucide:circle-dashed": {
208
+ body: '<path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10.1 2.182a10 10 0 0 1 3.8 0m0 19.636a10 10 0 0 1-3.8 0m7.509-18.097a10 10 0 0 1 2.69 2.7M2.182 13.9a10 10 0 0 1 0-3.8m18.097 7.509a10 10 0 0 1-2.7 2.69M21.818 10.1a10 10 0 0 1 0 3.8M3.721 6.391a10 10 0 0 1 2.7-2.69m-.03 16.578a10 10 0 0 1-2.69-2.7"/>',
209
+ width: 24,
210
+ height: 24
211
+ },
212
+ "lucide:cloud": {
213
+ body: '<path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9"/>',
214
+ width: 24,
215
+ height: 24
216
+ },
217
+ "lucide:copy": {
218
+ body: '<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><rect width="14" height="14" x="8" y="8" rx="2" ry="2"/><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"/></g>',
219
+ width: 24,
220
+ height: 24
221
+ },
222
+ "lucide:credit-card": {
223
+ body: '<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><rect width="20" height="14" x="2" y="5" rx="2"/><path d="M2 10h20"/></g>',
224
+ width: 24,
225
+ height: 24
226
+ },
227
+ "lucide:crop": {
228
+ body: '<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M6 2v14a2 2 0 0 0 2 2h14"/><path d="M18 22V8a2 2 0 0 0-2-2H2"/></g>',
229
+ width: 24,
230
+ height: 24
231
+ },
232
+ "lucide:ellipsis-vertical": {
233
+ body: '<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><circle cx="12" cy="12" r="1"/><circle cx="12" cy="5" r="1"/><circle cx="12" cy="19" r="1"/></g>',
234
+ width: 24,
235
+ height: 24
236
+ },
237
+ "lucide:flag": {
238
+ body: '<path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 22V4a1 1 0 0 1 .4-.8A6 6 0 0 1 8 2c3 0 5 2 7.333 2q2 0 3.067-.8A1 1 0 0 1 20 4v10a1 1 0 0 1-.4.8A6 6 0 0 1 16 16c-3 0-5-2-8-2a6 6 0 0 0-4 1.528"/>',
239
+ width: 24,
240
+ height: 24
241
+ },
242
+ "lucide:flip-horizontal-2": {
243
+ body: '<path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m3 7l5 5l-5 5zm18 0l-5 5l5 5zm-9 13v2m0-8v2m0-8v2m0-8v2"/>',
244
+ width: 24,
245
+ height: 24
246
+ },
247
+ "lucide:flip-vertical-2": {
248
+ body: '<path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m17 3l-5 5l-5-5zm0 18l-5-5l-5 5zM4 12H2m8 0H8m8 0h-2m8 0h-2"/>',
249
+ width: 24,
250
+ height: 24
251
+ },
252
+ "lucide:folder-open": {
253
+ body: '<path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m6 14l1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2"/>',
254
+ width: 24,
255
+ height: 24
256
+ },
257
+ "lucide:folder-plus": {
258
+ body: '<path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 10v6m-3-3h6m5 7a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z"/>',
259
+ width: 24,
260
+ height: 24
261
+ },
262
+ "lucide:grid-2x2": {
263
+ body: '<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M12 3v18m-9-9h18"/><rect width="18" height="18" x="3" y="3" rx="2"/></g>',
264
+ width: 24,
265
+ height: 24
266
+ },
267
+ "lucide:grid-3x3": {
268
+ body: '<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><rect width="18" height="18" x="3" y="3" rx="2"/><path d="M3 9h18M3 15h18M9 3v18m6-18v18"/></g>',
269
+ width: 24,
270
+ height: 24
271
+ },
272
+ "lucide:grip-vertical": {
273
+ body: '<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><circle cx="9" cy="12" r="1"/><circle cx="9" cy="5" r="1"/><circle cx="9" cy="19" r="1"/><circle cx="15" cy="12" r="1"/><circle cx="15" cy="5" r="1"/><circle cx="15" cy="19" r="1"/></g>',
274
+ width: 24,
275
+ height: 24
276
+ },
277
+ "lucide:hexagon": {
278
+ body: '<path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16"/>',
279
+ width: 24,
280
+ height: 24
281
+ },
282
+ "lucide:image": {
283
+ body: '<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><rect width="18" height="18" x="3" y="3" rx="2" ry="2"/><circle cx="9" cy="9" r="2"/><path d="m21 15l-3.086-3.086a2 2 0 0 0-2.828 0L6 21"/></g>',
284
+ width: 24,
285
+ height: 24
286
+ },
287
+ "lucide:italic": {
288
+ body: '<path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 4h-9m4 16H5M15 4L9 20"/>',
289
+ width: 24,
290
+ height: 24
291
+ },
292
+ "lucide:layout-grid": {
293
+ body: '<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><rect width="7" height="7" x="3" y="3" rx="1"/><rect width="7" height="7" x="14" y="3" rx="1"/><rect width="7" height="7" x="14" y="14" rx="1"/><rect width="7" height="7" x="3" y="14" rx="1"/></g>',
294
+ width: 24,
295
+ height: 24
296
+ },
297
+ "lucide:lightbulb": {
298
+ body: '<path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 14c.2-1 .7-1.7 1.5-2.5c1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5c.7.7 1.3 1.5 1.5 2.5m0 4h6m-5 4h4"/>',
299
+ width: 24,
300
+ height: 24
301
+ },
302
+ "lucide:loader-circle": {
303
+ body: '<path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 12a9 9 0 1 1-6.219-8.56"/>',
304
+ width: 24,
305
+ height: 24
306
+ },
307
+ "lucide:minus": {
308
+ body: '<path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 12h14"/>',
309
+ width: 24,
310
+ height: 24
311
+ },
312
+ "lucide:moon": {
313
+ body: '<path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401"/>',
314
+ width: 24,
315
+ height: 24
316
+ },
317
+ "lucide:move-vertical": {
318
+ body: '<path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 2v20m-4-4l4 4l4-4M8 6l4-4l4 4"/>',
319
+ width: 24,
320
+ height: 24
321
+ },
322
+ "lucide:paint-bucket": {
323
+ body: '<path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11 7L6 2m12.992 10H2.041m19.104 6.38A3.34 3.34 0 0 1 20 16.5a3.3 3.3 0 0 1-1.145 1.88c-.575.46-.855 1.02-.855 1.595A2 2 0 0 0 20 22a2 2 0 0 0 2-2.025c0-.58-.285-1.13-.855-1.595M8.5 4.5l2.148-2.148a1.205 1.205 0 0 1 1.704 0l7.296 7.296a1.205 1.205 0 0 1 0 1.704l-7.592 7.592a3.615 3.615 0 0 1-5.112 0l-3.888-3.888a3.615 3.615 0 0 1 0-5.112L5.67 7.33"/>',
324
+ width: 24,
325
+ height: 24
326
+ },
327
+ "lucide:palette": {
328
+ body: '<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M12 22a1 1 0 0 1 0-20a10 9 0 0 1 10 9a5 5 0 0 1-5 5h-2.25a1.75 1.75 0 0 0-1.4 2.8l.3.4a1.75 1.75 0 0 1-1.4 2.8z"/><circle cx="13.5" cy="6.5" r=".5" fill="currentColor"/><circle cx="17.5" cy="10.5" r=".5" fill="currentColor"/><circle cx="6.5" cy="12.5" r=".5" fill="currentColor"/><circle cx="8.5" cy="7.5" r=".5" fill="currentColor"/></g>',
329
+ width: 24,
330
+ height: 24
331
+ },
332
+ "lucide:pen-line": {
333
+ body: '<path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 21h8m.174-14.188a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z"/>',
334
+ width: 24,
335
+ height: 24
336
+ },
337
+ "lucide:pen-tool": {
338
+ body: '<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M15.707 21.293a1 1 0 0 1-1.414 0l-1.586-1.586a1 1 0 0 1 0-1.414l5.586-5.586a1 1 0 0 1 1.414 0l1.586 1.586a1 1 0 0 1 0 1.414z"/><path d="m18 13l-1.375-6.874a1 1 0 0 0-.746-.776L3.235 2.028a1 1 0 0 0-1.207 1.207L5.35 15.879a1 1 0 0 0 .776.746L13 18M2.3 2.3l7.286 7.286"/><circle cx="11" cy="11" r="2"/></g>',
339
+ width: 24,
340
+ height: 24
341
+ },
342
+ "lucide:redo-2": {
343
+ body: '<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="m15 14l5-5l-5-5"/><path d="M20 9H9.5A5.5 5.5 0 0 0 4 14.5A5.5 5.5 0 0 0 9.5 20H13"/></g>',
344
+ width: 24,
345
+ height: 24
346
+ },
347
+ "lucide:rotate-ccw": {
348
+ body: '<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M3 12a9 9 0 1 0 9-9a9.75 9.75 0 0 0-6.74 2.74L3 8"/><path d="M3 3v5h5"/></g>',
349
+ width: 24,
350
+ height: 24
351
+ },
352
+ "lucide:rotate-cw": {
353
+ body: '<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8"/><path d="M21 3v5h-5"/></g>',
354
+ width: 24,
355
+ height: 24
356
+ },
357
+ "lucide:scissors": {
358
+ body: '<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><circle cx="6" cy="6" r="3"/><path d="M8.12 8.12L12 12m8-8L8.12 15.88"/><circle cx="6" cy="18" r="3"/><path d="M14.8 14.8L20 20"/></g>',
359
+ width: 24,
360
+ height: 24
361
+ },
362
+ "lucide:settings": {
363
+ body: '<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M9.671 4.136a2.34 2.34 0 0 1 4.659 0a2.34 2.34 0 0 0 3.319 1.915a2.34 2.34 0 0 1 2.33 4.033a2.34 2.34 0 0 0 0 3.831a2.34 2.34 0 0 1-2.33 4.033a2.34 2.34 0 0 0-3.319 1.915a2.34 2.34 0 0 1-4.659 0a2.34 2.34 0 0 0-3.32-1.915a2.34 2.34 0 0 1-2.33-4.033a2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915"/><circle cx="12" cy="12" r="3"/></g>',
364
+ width: 24,
365
+ height: 24
366
+ },
367
+ "lucide:shapes": {
368
+ body: '<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M8.3 10a.7.7 0 0 1-.626-1.079L11.4 3a.7.7 0 0 1 1.198-.043L16.3 8.9a.7.7 0 0 1-.572 1.1Z"/><rect width="7" height="7" x="3" y="14" rx="1"/><circle cx="17.5" cy="17.5" r="3.5"/></g>',
369
+ width: 24,
370
+ height: 24
371
+ },
372
+ "lucide:sparkles": {
373
+ body: '<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594zM20 2v4m2-2h-4"/><circle cx="4" cy="20" r="2"/></g>',
374
+ width: 24,
375
+ height: 24
376
+ },
377
+ "lucide:square": {
378
+ body: '<rect width="18" height="18" x="3" y="3" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" rx="2"/>',
379
+ width: 24,
380
+ height: 24
381
+ },
382
+ "lucide:square-round-corner": {
383
+ body: '<path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 11a8 8 0 0 0-8-8m8 12v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"/>',
384
+ width: 24,
385
+ height: 24
386
+ },
387
+ "lucide:stamp": {
388
+ body: '<path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 13V8.5C14 7 15 7 15 5a3 3 0 0 0-6 0c0 2 1 2 1 3.5V13m10 2.5a2.5 2.5 0 0 0-2.5-2.5h-11A2.5 2.5 0 0 0 4 15.5V17a1 1 0 0 0 1 1h14a1 1 0 0 0 1-1zM5 22h14"/>',
389
+ width: 24,
390
+ height: 24
391
+ },
392
+ "lucide:star": {
393
+ body: '<path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.12 2.12 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.12 2.12 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.12 2.12 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.12 2.12 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.12 2.12 0 0 0 1.597-1.16z"/>',
394
+ width: 24,
395
+ height: 24
396
+ },
397
+ "lucide:sun": {
398
+ body: '<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><circle cx="12" cy="12" r="4"/><path d="M12 2v2m0 16v2M4.93 4.93l1.41 1.41m11.32 11.32l1.41 1.41M2 12h2m16 0h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41"/></g>',
399
+ width: 24,
400
+ height: 24
401
+ },
402
+ "lucide:text-cursor": {
403
+ body: '<path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 22h-1a4 4 0 0 1-4-4V6a4 4 0 0 1 4-4h1M7 22h1a4 4 0 0 0 4-4M7 2h1a4 4 0 0 1 4 4"/>',
404
+ width: 24,
405
+ height: 24
406
+ },
407
+ "lucide:trash": {
408
+ body: '<path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6M3 6h18M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"/>',
409
+ width: 24,
410
+ height: 24
411
+ },
412
+ "lucide:trending-up": {
413
+ body: '<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M16 7h6v6"/><path d="m22 7l-8.5 8.5l-5-5L2 17"/></g>',
414
+ width: 24,
415
+ height: 24
416
+ },
417
+ "lucide:triangle": {
418
+ body: '<path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13.73 4a2 2 0 0 0-3.46 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z"/>',
419
+ width: 24,
420
+ height: 24
421
+ },
422
+ "lucide:type": {
423
+ body: '<path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 4v16M4 7V5a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v2M9 20h6"/>',
424
+ width: 24,
425
+ height: 24
426
+ },
427
+ "lucide:undo-2": {
428
+ body: '<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M9 14L4 9l5-5"/><path d="M4 9h10.5a5.5 5.5 0 0 1 5.5 5.5a5.5 5.5 0 0 1-5.5 5.5H11"/></g>',
429
+ width: 24,
430
+ height: 24
431
+ },
432
+ "lucide:venetian-mask": {
433
+ body: '<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M18 11c-1.5 0-2.5.5-3 2"/><path d="M4 6a2 2 0 0 0-2 2v4a5 5 0 0 0 5 5a8 8 0 0 1 5 2a8 8 0 0 1 5-2a5 5 0 0 0 5-5V8a2 2 0 0 0-2-2h-3a8 8 0 0 0-5 2a8 8 0 0 0-5-2z"/><path d="M6 11c1.5 0 2.5.5 3 2"/></g>',
434
+ width: 24,
435
+ height: 24
436
+ },
437
+ "lucide:waves": {
438
+ body: '<path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M2 6c.6.5 1.2 1 2.5 1C7 7 7 5 9.5 5c2.6 0 2.4 2 5 2c2.5 0 2.5-2 5-2c1.3 0 1.9.5 2.5 1M2 12c.6.5 1.2 1 2.5 1c2.5 0 2.5-2 5-2c2.6 0 2.4 2 5 2c2.5 0 2.5-2 5-2c1.3 0 1.9.5 2.5 1M2 18c.6.5 1.2 1 2.5 1c2.5 0 2.5-2 5-2c2.6 0 2.4 2 5 2c2.5 0 2.5-2 5-2c1.3 0 1.9.5 2.5 1"/>',
439
+ width: 24,
440
+ height: 24
441
+ },
442
+ "material-symbols:award-star-outline": {
443
+ body: '<path fill="currentColor" d="M9.075 16.25L12 14.475l2.925 1.775l-.775-3.325l2.6-2.25l-3.425-.275L12 7.25l-1.325 3.15l-3.425.275l2.6 2.25zM12 23.3L8.65 20H4v-4.65L.7 12L4 8.65V4h4.65L12 .7L15.35 4H20v4.65L23.3 12L20 15.35V20h-4.65zm0-2.8l2.5-2.5H18v-3.5l2.5-2.5L18 9.5V6h-3.5L12 3.5L9.5 6H6v3.5L3.5 12L6 14.5V18h3.5zm0-8.5"/>',
444
+ width: 24,
445
+ height: 24
446
+ },
447
+ "mdi:cube-outline": {
448
+ body: '<path fill="currentColor" d="M21 16.5c0 .38-.21.71-.53.88l-7.9 4.44c-.16.12-.36.18-.57.18s-.41-.06-.57-.18l-7.9-4.44A.99.99 0 0 1 3 16.5v-9c0-.38.21-.71.53-.88l7.9-4.44c.16-.12.36-.18.57-.18s.41.06.57.18l7.9 4.44c.32.17.53.5.53.88zM12 4.15L6.04 7.5L12 10.85l5.96-3.35zM5 15.91l6 3.38v-6.71L5 9.21zm14 0v-6.7l-6 3.37v6.71z"/>',
449
+ width: 24,
450
+ height: 24
451
+ },
452
+ "mdi:format-color-fill": {
453
+ body: '<path fill="currentColor" d="M19 11.5s-2 2.17-2 3.5a2 2 0 0 0 2 2a2 2 0 0 0 2-2c0-1.33-2-3.5-2-3.5M5.21 10L10 5.21L14.79 10m1.77-1.06L7.62 0L6.21 1.41l2.38 2.38l-5.15 5.15c-.59.56-.59 1.53 0 2.12l5.5 5.5c.29.29.68.44 1.06.44s.77-.15 1.06-.44l5.5-5.5c.59-.59.59-1.56 0-2.12"/>',
454
+ width: 24,
455
+ height: 24
456
+ },
457
+ "mdi:image-remove": {
458
+ body: '<path fill="currentColor" d="M13.3 21H5c-1.1 0-2-.9-2-2V5c0-1.1.9-2 2-2h14c1.1 0 2 .9 2 2v8.3c-.6-.2-1.3-.3-2-.3c-1.1 0-2.2.3-3.1.9L14.5 12L11 16.5l-2.5-3L5 18h8.1c-.1.3-.1.7-.1 1c0 .7.1 1.4.3 2m7.1-2l2.1 2.1l-1.4 1.4l-2.1-2.1l-2.1 2.1l-1.4-1.4l2.1-2.1l-2.1-2.1l1.4-1.4l2.1 2.1l2.1-2.1l1.4 1.4z"/>',
459
+ width: 24,
460
+ height: 24
461
+ },
462
+ "ph:monitor-fill": {
463
+ body: '<path fill="currentColor" d="M232 64v112a24 24 0 0 1-24 24H48a24 24 0 0 1-24-24V64a24 24 0 0 1 24-24h160a24 24 0 0 1 24 24m-72 152H96a8 8 0 0 0 0 16h64a8 8 0 0 0 0-16"/>',
464
+ width: 256,
465
+ height: 256
466
+ },
467
+ "radix-icons:font-size": {
468
+ body: '<path fill="currentColor" d="M2.5 2.1a.4.4 0 0 1 .283.117l2 2l.05.064a.4.4 0 0 1-.05.503a.4.4 0 0 1-.503.05l-.063-.05L2.9 3.467v8.067l1.317-1.317a.4.4 0 0 1 .566.566l-2 2a.4.4 0 0 1-.566 0l-2-2l-.051-.063a.4.4 0 0 1 .554-.554l.063.051l1.316 1.316V3.467L.783 4.784a.401.401 0 0 1-.566-.567l2-2l.061-.05A.4.4 0 0 1 2.5 2.1m5.47 9.64a.501.501 0 0 1-.94-.34zm2.53-8.99a.5.5 0 0 1 .47.33l3 8.32a.5.5 0 0 1-.94.34l-.983-2.724H8.953l-.982 2.724l-.471-.17l-.47-.17l3-8.32l.031-.07a.5.5 0 0 1 .439-.26M9.259 8.166h2.482L10.5 4.725z"/>',
469
+ width: 15,
470
+ height: 15
471
+ }
472
+ }, Ce = typeof window < "u";
473
+ async function Ie() {
474
+ if (!Ce) return;
475
+ const { addIcon: e } = await import("./iconify-D6eVIEy4.js");
476
+ for (const [t, r] of Object.entries(Ue))
477
+ e(t, r);
478
+ }
479
+ let he = !1;
480
+ function lt() {
481
+ he || !Ce || (he = !0, Ie().catch(() => {
482
+ he = !1;
483
+ }));
484
+ }
485
+ async function Ae(e, t) {
486
+ try {
487
+ const r = await e.json();
488
+ if (r && typeof r == "object") {
489
+ const i = r;
490
+ if (typeof i.error == "string" && i.error) return i.error;
491
+ if (typeof i.message == "string" && i.message) return i.message;
492
+ }
493
+ } catch {
494
+ }
495
+ return t;
496
+ }
497
+ function Re(e) {
498
+ return {
499
+ async search({ query: t, page: r, perPage: i = 30 }) {
500
+ const c = new URLSearchParams({
501
+ query: t,
502
+ page: String(r),
503
+ perPage: String(i)
504
+ }), a = e.includes("?") ? "&" : "?", l = await fetch(`${e}${a}${c.toString()}`, {
505
+ method: "GET",
506
+ credentials: "same-origin"
507
+ });
508
+ if (!l.ok)
509
+ throw new Error(await Ae(l, `Image search failed (${l.status})`));
510
+ return await l.json();
511
+ },
512
+ trackSelect(t) {
513
+ fetch(e, {
514
+ method: "POST",
515
+ credentials: "same-origin",
516
+ headers: { "Content-Type": "application/json" },
517
+ body: JSON.stringify({
518
+ action: "track-select",
519
+ id: t.id,
520
+ source: t.source,
521
+ ...t.downloadLocation ? { downloadLocation: t.downloadLocation } : {}
522
+ })
523
+ }).catch(() => {
524
+ });
525
+ }
526
+ };
527
+ }
528
+ function Oe(e) {
529
+ return {
530
+ async generate({ prompt: t, width: r, height: i, numberResults: c }) {
531
+ const a = await fetch(e, {
532
+ method: "POST",
533
+ credentials: "same-origin",
534
+ headers: { "Content-Type": "application/json" },
535
+ body: JSON.stringify({ prompt: t, width: r, height: i, numberResults: c })
536
+ });
537
+ if (!a.ok)
538
+ throw new Error(await Ae(a, `Image generation failed (${a.status})`));
539
+ const l = await a.json();
540
+ return { images: l.images ?? (l.imageUrl ? [{ imageUrl: l.imageUrl }] : []) };
541
+ }
542
+ };
543
+ }
544
+ function Ne(e) {
545
+ const t = "/api/image-proxy?url=";
546
+ if (!e || !e.startsWith(t)) return e;
547
+ try {
548
+ return decodeURIComponent(e.slice(t.length));
549
+ } catch {
550
+ return e;
551
+ }
552
+ }
553
+ function We(e) {
554
+ return async function(r) {
555
+ const i = Ne(r);
556
+ if (!/^https?:\/\//.test(i))
557
+ throw new Error("Background removal isn't available for this image yet");
558
+ const c = await fetch(e, {
559
+ method: "POST",
560
+ credentials: "same-origin",
561
+ headers: { "Content-Type": "application/json" },
562
+ body: JSON.stringify({ imageUrl: i })
563
+ }), a = await c.json().catch(() => null);
564
+ if (!c.ok || !(a != null && a.imageUrl))
565
+ throw new Error((a == null ? void 0 : a.error) || (a == null ? void 0 : a.message) || `Background removal failed (${c.status})`);
566
+ return a.imageUrl;
567
+ };
568
+ }
569
+ const Me = {}, xe = Be(Me);
570
+ function at({ services: e, children: t }) {
571
+ const r = Y(() => e ? {
572
+ imageSearch: e.imageSearch ?? (e.imageSearchUrl ? Re(e.imageSearchUrl) : void 0),
573
+ generate: e.generate ?? (e.generateUrl ? Oe(e.generateUrl) : void 0),
574
+ vectors: e.vectors,
575
+ removeBackground: e.removeBackground ?? (e.bgRemoveUrl ? We(e.bgRemoveUrl) : void 0)
576
+ } : Me, [
577
+ e == null ? void 0 : e.imageSearch,
578
+ e == null ? void 0 : e.imageSearchUrl,
579
+ e == null ? void 0 : e.generate,
580
+ e == null ? void 0 : e.generateUrl,
581
+ e == null ? void 0 : e.vectors,
582
+ e == null ? void 0 : e.bgRemoveUrl,
583
+ e == null ? void 0 : e.removeBackground
584
+ ]);
585
+ return /* @__PURE__ */ Pe(xe.Provider, { value: r, children: t });
586
+ }
587
+ function dt() {
588
+ return Ge(xe);
589
+ }
590
+ const De = Q("ElementPreviewRenderer"), _e = {
591
+ width: 40,
592
+ height: 40,
593
+ padding: 4,
594
+ backgroundColor: "transparent"
595
+ };
596
+ function Ze(e, t = {}) {
597
+ const r = { ..._e, ...t }, i = document.createElement("canvas");
598
+ i.width = r.width, i.height = r.height;
599
+ const c = i.getContext("2d");
600
+ if (!c)
601
+ return "";
602
+ r.backgroundColor !== "transparent" && (c.fillStyle = r.backgroundColor, c.fillRect(0, 0, r.width, r.height)), c.save();
603
+ try {
604
+ e instanceof G ? Ye(c, e, r) : Je(c, e, r);
605
+ } catch (a) {
606
+ De.warn("Failed to generate preview:", a);
607
+ }
608
+ return c.restore(), i.toDataURL("image/png");
609
+ }
610
+ function Je(e, t, r) {
611
+ var j;
612
+ const i = ((j = t.getBoundingBox) == null ? void 0 : j.call(t)) || { x: 0, y: 0, width: 100, height: 100 }, c = i.width, a = i.height;
613
+ if (c === 0 || a === 0) {
614
+ me(e, t, r);
615
+ return;
616
+ }
617
+ const l = r.width - r.padding * 2, S = r.height - r.padding * 2, h = Math.min(
618
+ l / c,
619
+ S / a,
620
+ 1
621
+ // Don't scale up, only down
622
+ ), p = c * h, y = a * h, b = r.padding + (l - p) / 2, E = r.padding + (S - y) / 2;
623
+ e.save(), e.translate(b - i.x * h, E - i.y * h), e.scale(h, h), typeof t.render == "function" ? t.render(e, !1, !1) : me(e, t, r), e.restore();
624
+ }
625
+ function me(e, t, r) {
626
+ e.fillStyle = "#888888", e.font = "10px Arial", e.textAlign = "center", e.textBaseline = "middle";
627
+ const i = t.transformType || "Element";
628
+ e.fillText(i, r.width / 2, r.height / 2);
629
+ }
630
+ function Ye(e, t, r) {
631
+ const i = r.width - r.padding * 2, c = r.height - r.padding * 2, a = r.padding, l = r.padding;
632
+ e.fillStyle = "#888888", e.strokeStyle = "#666666", e.lineWidth = 1;
633
+ const S = c * 0.7, h = l + c * 0.3, p = i * 0.4, y = c * 0.2;
634
+ e.fillRect(a, h, i, S), e.fillRect(a, h - y, p, y), t.children && t.children.length > 0 && (e.fillStyle = "#FFFFFF", e.font = "bold 10px Arial", e.textAlign = "center", e.textBaseline = "middle", e.fillText(
635
+ t.children.length.toString(),
636
+ a + i / 2,
637
+ h + S / 2
638
+ ));
639
+ }
640
+ const M = Q("Layers"), qe = 150;
641
+ async function we(e, t = 64, r = "transparent") {
642
+ try {
643
+ return Ze(e, {
644
+ width: t,
645
+ height: t,
646
+ padding: 8,
647
+ backgroundColor: r
648
+ }) || null;
649
+ } catch (i) {
650
+ return M.error("Failed to generate preview:", i), null;
651
+ }
652
+ }
653
+ function Le(e, t, r, i, c, a = 0, l = null) {
654
+ return (a > 0 ? e : e.filter((h) => {
655
+ const p = h.parentId ?? null;
656
+ return h instanceof G, p === null;
657
+ })).map((h) => {
658
+ const p = h instanceof G, y = t === h.id || r.includes(h.id), b = {
659
+ id: h.id,
660
+ name: h.name || `Layer ${h.id.slice(0, 8)}`,
661
+ type: h.transformType,
662
+ visible: h.visible ?? !0,
663
+ locked: h.locked ?? !1,
664
+ isSelected: y,
665
+ isGroup: p,
666
+ depth: a,
667
+ parentId: l,
668
+ previewUrl: i.get(h.id) || null,
669
+ refreshPreview: async () => {
670
+ await c(h.id);
671
+ }
672
+ };
673
+ return p && h instanceof G && (b.children = Le(
674
+ h.children,
675
+ t,
676
+ r,
677
+ i,
678
+ c,
679
+ a + 1,
680
+ h.id
681
+ )), b;
682
+ });
683
+ }
684
+ function Ee(e) {
685
+ const t = [];
686
+ for (const r of e)
687
+ t.push(r), r.children && t.push(...Ee(r.children));
688
+ return t;
689
+ }
690
+ function ct(e = {}) {
691
+ var pe;
692
+ const {
693
+ artboardId: t,
694
+ includeHidden: r = !0,
695
+ previewSize: i = 64,
696
+ previewBackgroundColor: c,
697
+ autoRefreshPreviews: a = !1
698
+ } = e, {
699
+ elements: l,
700
+ selectedId: S,
701
+ multiSelection: h,
702
+ artboardManager: p,
703
+ handleSelectionChange: y,
704
+ handleElementUpdate: b,
705
+ setMultiSelection: E,
706
+ executeAddElement: j,
707
+ executeRemoveElement: H,
708
+ executeReorderElement: R
709
+ } = fe(), u = le(/* @__PURE__ */ new Map()), [g, C] = K(0), B = p.getActiveArtboardId(), I = t !== void 0 ? t : B, ee = I ? (pe = p.getArtboard) == null ? void 0 : pe.call(p, I) : null, O = c ?? (ee == null ? void 0 : ee.backgroundColor) ?? "transparent", ie = f(async (o) => {
710
+ const n = l.find((s) => s.id === o);
711
+ if (!n) return;
712
+ const d = await we(n, i, O);
713
+ u.current.set(o, d), C((s) => s + 1);
714
+ }, [l, i, O]), w = Y(() => {
715
+ let o = l;
716
+ if (I) {
717
+ const n = p.getElementsOnArtboard(I);
718
+ o = o.filter((d) => n.includes(d.id));
719
+ }
720
+ return r || (o = o.filter((n) => n.visible !== !1)), o;
721
+ }, [l, I, r, p]), F = Y(() => Le(
722
+ w,
723
+ S,
724
+ h,
725
+ u.current,
726
+ ie
727
+ ), [w, S, h, ie, g]), v = Y(() => Ee(F), [F]), V = Y(() => v.filter((o) => o.isSelected), [v]), k = f((o, n = !1) => {
728
+ n ? h.includes(o) ? E(h.filter((d) => d !== o)) : E([...h, o]) : y(o);
729
+ }, [h, E, y]), z = f((o) => {
730
+ E(o);
731
+ }, [E]), U = f(() => {
732
+ y(null), E([]);
733
+ }, [y, E]), _ = f((o) => {
734
+ const n = l.find((s) => s.id === o);
735
+ if (!n) return;
736
+ const d = n.clone();
737
+ d.visible = !(n.visible ?? !0), b(d);
738
+ }, [l, b]), N = f((o) => {
739
+ const n = l.find((s) => s.id === o);
740
+ if (!n) return;
741
+ const d = n.clone();
742
+ d.locked = !(n.locked ?? !1), b(d);
743
+ }, [l, b]), q = f((o, n) => {
744
+ const d = l.find((A) => A.id === o);
745
+ if (!d) return;
746
+ const s = d.clone();
747
+ s.name = n, b(s);
748
+ }, [l, b]), $ = f((o) => {
749
+ const n = l.find((d) => d.id === o);
750
+ if (!n) {
751
+ M.warn(`Element ${o} not found for deletion`);
752
+ return;
753
+ }
754
+ H(n), (S === o || h.includes(o)) && (y(null), E(h.filter((d) => d !== o)));
755
+ }, [l, H, S, h, y, E]), T = f((o) => {
756
+ const n = l.find((P) => P.id === o);
757
+ if (!n) {
758
+ M.warn(`Element ${o} not found for duplication`);
759
+ return;
760
+ }
761
+ const s = n.clone().toJSON();
762
+ delete s.id;
763
+ const A = n.constructor, m = new A(s);
764
+ m.x = n.x + 20, m.y = n.y + 20;
765
+ const x = p.getArtboardIdForElement(o);
766
+ if (!x) {
767
+ M.warn(`Element ${o} not associated with any artboard`);
768
+ return;
769
+ }
770
+ j(m, x, o), y(m.id);
771
+ }, [l, p, j, y]), Z = f((o, n) => {
772
+ if (o === n) return;
773
+ if (o < 0 || o >= w.length) {
774
+ M.warn(`Invalid fromIndex: ${o}`);
775
+ return;
776
+ }
777
+ if (n < 0 || n >= w.length) {
778
+ M.warn(`Invalid toIndex: ${n}`);
779
+ return;
780
+ }
781
+ const d = w[o], s = w[n], A = o < n ? "after" : "before";
782
+ R(d.id, s.id, A);
783
+ }, [w, R]), te = f((o) => {
784
+ const n = v.findIndex((d) => d.id === o);
785
+ if (n < 0) {
786
+ M.warn(`Layer ${o} not found`);
787
+ return;
788
+ }
789
+ n >= v.length - 1 || Z(n, n + 1);
790
+ }, [v, Z]), W = f((o) => {
791
+ const n = v.findIndex((d) => d.id === o);
792
+ if (n < 0) {
793
+ M.warn(`Layer ${o} not found`);
794
+ return;
795
+ }
796
+ n <= 0 || Z(n, n - 1);
797
+ }, [v, Z]), re = f((o) => {
798
+ if (o.length < 2) {
799
+ M.warn("Need at least 2 elements to create a group");
800
+ return;
801
+ }
802
+ const n = l.filter(
803
+ (L) => o.includes(L.id) && L.transformType !== "shape"
804
+ );
805
+ if (n.length < 2) {
806
+ M.warn("Need at least 2 groupable elements (shapes cannot be grouped)");
807
+ return;
808
+ }
809
+ const d = n.map((L) => p.getArtboardIdForElement(L.id)), s = [...new Set(d)];
810
+ if (s.length !== 1 || !s[0]) {
811
+ M.warn("All elements must be on the same artboard to group");
812
+ return;
813
+ }
814
+ const A = s[0], m = n.map((L) => L.getBoundingBox()).filter(Boolean);
815
+ if (m.length === 0) {
816
+ M.warn("Could not calculate bounding boxes for group");
817
+ return;
818
+ }
819
+ const x = Math.min(...m.map((L) => L.x)), P = Math.min(...m.map((L) => L.y)), D = new G({
820
+ x,
821
+ y: P
822
+ });
823
+ D.children = n.map((L) => {
824
+ const oe = L.clone();
825
+ return oe.x = L.x - x, oe.y = L.y - P, oe;
826
+ }), n.forEach((L) => H(L)), j(D, A), y(D.id), E([]);
827
+ }, [l, p, H, j, y, E]), Fe = f((o) => {
828
+ const n = l.find((m) => m.id === o);
829
+ if (!n) {
830
+ M.warn(`Element ${o} not found for ungrouping`);
831
+ return;
832
+ }
833
+ if (!(n instanceof G)) {
834
+ M.warn(`Element ${o} is not a group`);
835
+ return;
836
+ }
837
+ const d = n;
838
+ if (!d.children || d.children.length === 0) {
839
+ M.warn(`Group ${o} has no children`);
840
+ return;
841
+ }
842
+ const s = p.getArtboardIdForElement(o);
843
+ if (!s) {
844
+ M.warn(`Group ${o} not associated with any artboard`);
845
+ return;
846
+ }
847
+ const A = d.children.map((m) => {
848
+ const x = m.clone();
849
+ return x.x = m.x + d.x, x.y = m.y + d.y, x;
850
+ });
851
+ H(d), A.forEach((m) => j(m, s)), A.length > 0 && y(A[0].id), E([]);
852
+ }, [l, p, H, j, y, E]), ae = f(async (o = i) => {
853
+ const n = async (d) => {
854
+ for (const s of d) {
855
+ const A = await we(s, o, O);
856
+ u.current.set(s.id, A), s instanceof G && s.children.length > 0 && await n(s.children);
857
+ }
858
+ };
859
+ await n(w), C((d) => d + 1);
860
+ }, [i, O, w]);
861
+ be(() => {
862
+ if (!a) return;
863
+ const o = setTimeout(() => {
864
+ ae();
865
+ }, qe);
866
+ return () => clearTimeout(o);
867
+ }, [a, ae]);
868
+ const je = f(() => {
869
+ u.current.clear();
870
+ }, []), Se = f(
871
+ (o, n, d) => {
872
+ R(o, n, d);
873
+ },
874
+ [R]
875
+ ), ze = f(
876
+ (o, n, d, s) => {
877
+ const A = l.find((J) => J.id === s);
878
+ if (!A || !(A instanceof G)) {
879
+ M.warn(`Group ${s} not found for reorder`);
880
+ return;
881
+ }
882
+ const m = A.clone(), x = m.children.findIndex((J) => J.id === o), P = m.children.findIndex((J) => J.id === n);
883
+ if (x === -1 || P === -1) {
884
+ M.warn(`Children not found in group for reorder: ${o}, ${n}`);
885
+ return;
886
+ }
887
+ const [D] = m.children.splice(x, 1), L = m.children.findIndex((J) => J.id === n), oe = d === "before" ? L : L + 1;
888
+ m.children.splice(oe, 0, D), b(m);
889
+ },
890
+ [l, b]
891
+ ), He = f(
892
+ (o) => {
893
+ for (const n of l) {
894
+ if (n.id === o) return n;
895
+ if (n instanceof G) {
896
+ const d = n.children.find((s) => s.id === o);
897
+ if (d) return d;
898
+ }
899
+ }
900
+ return null;
901
+ },
902
+ [l]
903
+ ), de = f(
904
+ (o) => {
905
+ for (const n of l)
906
+ if (n instanceof G && n.children.some((d) => d.id === o))
907
+ return n;
908
+ return null;
909
+ },
910
+ [l]
911
+ ), Ve = f(
912
+ (o, n) => {
913
+ const d = l.find((P) => P.id === o), s = l.find((P) => P.id === n);
914
+ if (!d || !s || !(s instanceof G)) {
915
+ M.warn(`Cannot add ${o} to group ${n}`);
916
+ return;
917
+ }
918
+ if (!p.getArtboardIdForElement(o)) return;
919
+ const m = s.clone(), x = d.clone();
920
+ x.x = d.x, x.y = d.y, m.addChild(x), H(d), b(m);
921
+ },
922
+ [l, p, H, b]
923
+ ), $e = f(
924
+ (o, n, d) => {
925
+ const s = de(o);
926
+ if (!s) {
927
+ M.warn(`Element ${o} is not inside a group`);
928
+ return;
929
+ }
930
+ const A = s.children.find((D) => D.id === o);
931
+ if (!A) return;
932
+ const m = p.getArtboardIdForElement(s.id);
933
+ if (!m) return;
934
+ const x = A.clone(), P = s.clone();
935
+ P.removeChild(o), b(P), n && d ? j(x, m, d === "after" ? n : void 0, d === "before" ? n : void 0) : j(x, m, void 0, s.id), y(x.id);
936
+ },
937
+ [de, p, H, b, j, y]
938
+ ), Te = f(() => {
939
+ const o = p.getActiveArtboardId();
940
+ if (!o) {
941
+ M.warn("No active artboard for creating a group");
942
+ return;
943
+ }
944
+ const n = new G({
945
+ x: 0,
946
+ y: 0,
947
+ name: "New Group"
948
+ });
949
+ j(n, o), y(n.id);
950
+ }, [p, j, y]);
951
+ return {
952
+ layers: F,
953
+ flatLayers: v,
954
+ selectedLayers: V,
955
+ selectLayer: k,
956
+ selectMultipleLayers: z,
957
+ clearSelection: U,
958
+ toggleVisibility: _,
959
+ toggleLock: N,
960
+ renameLayer: q,
961
+ deleteLayer: $,
962
+ duplicateLayer: T,
963
+ reorderLayers: Z,
964
+ reorderById: Se,
965
+ reorderWithinGroup: ze,
966
+ moveLayerForward: te,
967
+ moveLayerBackward: W,
968
+ groupLayers: re,
969
+ ungroupLayer: Fe,
970
+ addToGroup: Ve,
971
+ removeFromGroup: $e,
972
+ createEmptyGroup: Te,
973
+ findElementById: He,
974
+ findParentGroup: de,
975
+ generateAllPreviews: ae,
976
+ clearPreviewCache: je,
977
+ artboardId: I,
978
+ artboardManager: p,
979
+ layerCount: v.length
980
+ };
981
+ }
982
+ const ue = Q("useArtboards"), st = () => {
983
+ const {
984
+ artboards: e,
985
+ artboardManager: t,
986
+ refreshArtboards: r,
987
+ setSelectedId: i,
988
+ setMultiSelection: c
989
+ } = fe(), a = t.getActiveArtboardId(), l = t.getActiveArtboard(), S = Y(() => e.map((u) => {
990
+ const C = t.getElementsOnArtboard(u.id).length;
991
+ return {
992
+ id: u.id,
993
+ name: u.name,
994
+ x: u.x,
995
+ y: u.y,
996
+ width: u.width,
997
+ height: u.height,
998
+ backgroundColor: u.backgroundColor,
999
+ clipShape: u.clipShape,
1000
+ isActive: u.id === a,
1001
+ elementCount: C
1002
+ };
1003
+ }), [e, t, a]), h = Y(() => {
1004
+ if (!l) return null;
1005
+ const g = t.getElementsOnArtboard(l.id).length;
1006
+ return {
1007
+ id: l.id,
1008
+ name: l.name,
1009
+ x: l.x,
1010
+ y: l.y,
1011
+ width: l.width,
1012
+ height: l.height,
1013
+ backgroundColor: l.backgroundColor,
1014
+ clipShape: l.clipShape,
1015
+ isActive: !0,
1016
+ elementCount: g
1017
+ };
1018
+ }, [l, t]), p = f((u = 1200, g = 1200, C) => {
1019
+ const B = {
1020
+ width: u,
1021
+ height: g,
1022
+ ...C
1023
+ };
1024
+ t.createArtboard(B), r();
1025
+ }, [t, r]), y = f((u) => {
1026
+ t.deleteArtboard(u), r();
1027
+ }, [t, r]), b = f((u) => {
1028
+ const g = e.find((C) => C.id === u);
1029
+ if (!g) {
1030
+ ue.warn(`[useArtboards] Artboard ${u} not found`);
1031
+ return;
1032
+ }
1033
+ t.createArtboard({
1034
+ width: g.width,
1035
+ height: g.height,
1036
+ name: `${g.name} Copy`,
1037
+ backgroundColor: g.backgroundColor,
1038
+ clipShape: g.clipShape
1039
+ }), r();
1040
+ }, [e, t, r]), E = f((u, g) => {
1041
+ const C = e.find((B) => B.id === u);
1042
+ if (!C) {
1043
+ ue.warn(`[useArtboards] Artboard ${u} not found`);
1044
+ return;
1045
+ }
1046
+ C.name = g, r();
1047
+ }, [e, r]), j = f((u, g) => {
1048
+ const C = e.find((B) => B.id === u);
1049
+ if (!C) {
1050
+ ue.warn(`[useArtboards] Artboard ${u} not found`);
1051
+ return;
1052
+ }
1053
+ g.name !== void 0 && (C.name = g.name), g.width !== void 0 && (C.width = g.width), g.height !== void 0 && (C.height = g.height), g.backgroundColor !== void 0 && (C.backgroundColor = g.backgroundColor), g.clipShape !== void 0 && (C.clipShape = g.clipShape), "distressTexture" in g && (C.distressTexture = g.distressTexture ? { ...g.distressTexture } : void 0), r();
1054
+ }, [e, r]), H = f((u) => {
1055
+ i(null), c([]), t.setActiveArtboard(u), r();
1056
+ }, [t, r, i, c]), R = f((u, g) => {
1057
+ u !== g && (u < 0 || u >= e.length || g < 0 || g >= e.length || ([...e], t.reorderArtboards(u, g), r()));
1058
+ }, [e, t, r]);
1059
+ return {
1060
+ artboards: e,
1061
+ artboardsInfo: S,
1062
+ activeArtboard: l,
1063
+ activeArtboardId: a,
1064
+ activeArtboardInfo: h,
1065
+ createArtboard: p,
1066
+ deleteArtboard: y,
1067
+ duplicateArtboard: b,
1068
+ renameArtboard: E,
1069
+ updateArtboard: j,
1070
+ selectArtboard: H,
1071
+ reorderArtboards: R,
1072
+ count: e.length
1073
+ };
1074
+ }, Ke = Q("useExport");
1075
+ function ht() {
1076
+ const {
1077
+ artboards: e,
1078
+ artboardManager: t,
1079
+ elements: r,
1080
+ canvasRef: i
1081
+ } = fe(), [c, a] = K(!1), [l, S] = K(!1), [h, p] = K([]), [y, b] = K({}), [E, j] = K({
1082
+ totalExports: 0,
1083
+ avgExportTime: 0,
1084
+ isWorkerActive: !1
1085
+ }), H = le(0), R = le(null), u = se.supportsWorkerExport(), g = f(async (w, F = {}) => {
1086
+ const v = e.find((k) => k.id === w);
1087
+ if (!v)
1088
+ throw new Error(`[useExport] Artboard ${w} not found`);
1089
+ if (!i.current)
1090
+ throw new Error("[useExport] Canvas ref not available");
1091
+ a(!0);
1092
+ const V = {
1093
+ artboardId: w,
1094
+ artboardName: v.name,
1095
+ status: "rendering",
1096
+ progress: 0,
1097
+ timestamp: Date.now()
1098
+ };
1099
+ p((k) => [...k, V]);
1100
+ try {
1101
+ const k = Date.now(), z = B.current, U = t.getElementsOnArtboard(w), _ = z.filter(($) => U.includes($.id)), N = await se.exportArtboardToDataURL(
1102
+ v,
1103
+ _,
1104
+ i.current,
1105
+ {
1106
+ format: F.format || "png",
1107
+ scale: F.scale || 3,
1108
+ transparentBackground: F.transparentBackground ?? !0,
1109
+ ...F
1110
+ }
1111
+ ), q = Date.now() - k;
1112
+ return p(($) => $.map(
1113
+ (T) => T.artboardId === w ? { ...T, status: "complete", progress: 100, dataUrl: N, timestamp: Date.now() } : T
1114
+ )), b(($) => ({ ...$, [w]: N })), j(($) => ({
1115
+ totalExports: $.totalExports + 1,
1116
+ avgExportTime: ($.avgExportTime * $.totalExports + q) / ($.totalExports + 1),
1117
+ isWorkerActive: u
1118
+ })), N;
1119
+ } catch (k) {
1120
+ throw p((z) => z.map(
1121
+ (U) => U.artboardId === w ? { ...U, status: "error", error: k, timestamp: Date.now() } : U
1122
+ )), k;
1123
+ } finally {
1124
+ a(!1);
1125
+ }
1126
+ }, [e, t, r, i, u]), C = f(async (w = {}) => {
1127
+ a(!0);
1128
+ try {
1129
+ const F = e.map(async (k) => {
1130
+ const z = await g(k.id, w);
1131
+ return { id: k.id, dataUrl: z };
1132
+ }), v = await Promise.all(F), V = {};
1133
+ for (const { id: k, dataUrl: z } of v)
1134
+ V[k] = z;
1135
+ return V;
1136
+ } finally {
1137
+ a(!1);
1138
+ }
1139
+ }, [e, g]), B = le(r);
1140
+ B.current = r;
1141
+ const I = f(async (w, F = {}) => {
1142
+ const v = e.find((V) => V.id === w);
1143
+ if (!v)
1144
+ throw new Error(`[useExport] Artboard ${w} not found`);
1145
+ if (!i.current)
1146
+ throw new Error("[useExport] Canvas ref not available");
1147
+ a(!0);
1148
+ try {
1149
+ const V = B.current, k = t.getElementsOnArtboard(w), z = V.filter((_) => k.includes(_.id));
1150
+ return await se.exportArtboardToBlob(
1151
+ v,
1152
+ z,
1153
+ i.current,
1154
+ {
1155
+ format: F.format || "png",
1156
+ scale: F.scale || 3,
1157
+ transparentBackground: F.transparentBackground ?? !0,
1158
+ ...F
1159
+ }
1160
+ );
1161
+ } finally {
1162
+ a(!1);
1163
+ }
1164
+ }, [e, t, r, i]), ee = f(async (w = {}) => {
1165
+ a(!0);
1166
+ try {
1167
+ const F = e.map(async (k) => {
1168
+ const z = await I(k.id, w);
1169
+ return { id: k.id, blob: z };
1170
+ }), v = await Promise.all(F), V = {};
1171
+ for (const { id: k, blob: z } of v)
1172
+ V[k] = z;
1173
+ return V;
1174
+ } finally {
1175
+ a(!1);
1176
+ }
1177
+ }, [e, I]), O = f(() => {
1178
+ H.current++, S(!1), R.current = null;
1179
+ }, []), ie = f((w) => {
1180
+ H.current++;
1181
+ const F = H.current;
1182
+ R.current = w, S(!0);
1183
+ const {
1184
+ artboardIds: v,
1185
+ interval: V = 500,
1186
+ scale: k = 3,
1187
+ format: z = "png",
1188
+ onChange: U
1189
+ } = w, _ = v ? e.filter((T) => v.includes(T.id)) : e, N = () => H.current === F, q = async () => {
1190
+ try {
1191
+ const T = _.map(async (W) => {
1192
+ const re = await g(W.id, {
1193
+ scale: k,
1194
+ format: z,
1195
+ transparentBackground: !0
1196
+ });
1197
+ return { id: W.id, dataUrl: re };
1198
+ }), Z = await Promise.all(T), te = {};
1199
+ for (const { id: W, dataUrl: re } of Z)
1200
+ te[W] = re;
1201
+ b((W) => ({ ...W, ...te })), U && U(te);
1202
+ } catch (T) {
1203
+ Ke.error("[useExport] Continuous export error:", T);
1204
+ }
1205
+ };
1206
+ (async () => {
1207
+ for (await q(); N() && (await new Promise((T) => setTimeout(T, V)), !!N()); )
1208
+ await q();
1209
+ })();
1210
+ }, [e, g]);
1211
+ return be(() => () => {
1212
+ O();
1213
+ }, [O]), {
1214
+ exportArtboard: g,
1215
+ exportArtboardAsBlob: I,
1216
+ exportAllArtboards: C,
1217
+ exportAllArtboardsAsBlobs: ee,
1218
+ startContinuousExport: ie,
1219
+ stopContinuousExport: O,
1220
+ isExporting: c,
1221
+ isContinuousExporting: l,
1222
+ progress: h,
1223
+ latestExports: y,
1224
+ supportsWorkerExport: u,
1225
+ workerStats: E
1226
+ };
1227
+ }
1228
+ const ye = Q("GoogleFontsService");
1229
+ let X = [], ne = null;
1230
+ async function Xe() {
1231
+ return X.length > 0 ? X : ne || (ne = fetch("/google-fonts.json").then((e) => {
1232
+ if (!e.ok)
1233
+ throw new Error(`HTTP error! status: ${e.status}`);
1234
+ return e.json();
1235
+ }).then((e) => (Array.isArray(e) ? X = e.map((t) => ({
1236
+ family: t.family,
1237
+ category: t.category || "sans-serif",
1238
+ subsets: t.subsets || [],
1239
+ variants: t.variants || [],
1240
+ popularity: t.popularity
1241
+ })) : ye.error("Unexpected API response structure:", e), X)).catch((e) => (ye.error("Error fetching Google Fonts:", e), ne = null, [])), ne);
1242
+ }
1243
+ function ge() {
1244
+ return X;
1245
+ }
1246
+ function Qe() {
1247
+ return X.length > 0;
1248
+ }
1249
+ function ke(e) {
1250
+ return {
1251
+ "sans serif": "sans-serif",
1252
+ serif: "serif",
1253
+ display: "display",
1254
+ handwriting: "script",
1255
+ monospace: "monospace"
1256
+ }[e.toLowerCase()] || "display";
1257
+ }
1258
+ const ve = Q("UnifiedFontService");
1259
+ class et {
1260
+ constructor() {
1261
+ this.searchCache = /* @__PURE__ */ new Map(), this.previewFontLinks = /* @__PURE__ */ new Set();
1262
+ }
1263
+ // ========================================
1264
+ // Initialization
1265
+ // ========================================
1266
+ /**
1267
+ * Initialize Google Fonts
1268
+ */
1269
+ async initialize() {
1270
+ try {
1271
+ await Xe();
1272
+ } catch (t) {
1273
+ ve.error("Failed to initialize UnifiedFontService:", t);
1274
+ }
1275
+ }
1276
+ /**
1277
+ * Check if fonts are loaded
1278
+ */
1279
+ isFontsLoaded() {
1280
+ return Qe();
1281
+ }
1282
+ // ========================================
1283
+ // Font Retrieval
1284
+ // ========================================
1285
+ /**
1286
+ * Get all fonts.
1287
+ * Returns system fonts + Google Fonts (deduplicated)
1288
+ */
1289
+ getAllFonts() {
1290
+ const t = ce.filter((i) => !i.googleFont), r = this.mapGoogleFonts(ge());
1291
+ return this.mergeFonts([...t, ...r]);
1292
+ }
1293
+ /**
1294
+ * Get recommended fonts (TSHIRT_FONTS curated list)
1295
+ */
1296
+ getRecommendedFonts() {
1297
+ return ce;
1298
+ }
1299
+ // ========================================
1300
+ // Dual Search Strategy
1301
+ // ========================================
1302
+ /**
1303
+ * Search fonts by name (text search)
1304
+ */
1305
+ async searchFontsByName(t) {
1306
+ if (!t.trim())
1307
+ return this.getAllFonts();
1308
+ const r = `search:${t.toLowerCase()}`;
1309
+ if (this.searchCache.has(r))
1310
+ return this.searchCache.get(r);
1311
+ const i = t.toLowerCase().trim(), c = ge().filter((l) => l.family.toLowerCase().includes(i)).map((l) => this.mapGoogleFont(l)), a = this.mergeFonts(c);
1312
+ return this.searchCache.set(r, a), a;
1313
+ }
1314
+ /**
1315
+ * Filter fonts by category
1316
+ */
1317
+ async filterFontsByCategory(t) {
1318
+ if (t === "system")
1319
+ return ce.filter((a) => !a.googleFont);
1320
+ const r = `category:${t}`;
1321
+ if (this.searchCache.has(r))
1322
+ return this.searchCache.get(r);
1323
+ const i = ge().filter((a) => ke(a.category) === t).map((a) => this.mapGoogleFont(a)), c = this.mergeFonts(i);
1324
+ return this.searchCache.set(r, c), c;
1325
+ }
1326
+ /**
1327
+ * Combined search: text search + category filter
1328
+ * Option A: Search overrides category (simpler UX)
1329
+ */
1330
+ async searchAndFilterFonts(t, r) {
1331
+ return t.trim() ? this.searchFontsByName(t) : r !== "all" ? this.filterFontsByCategory(r) : this.getAllFonts();
1332
+ }
1333
+ // ========================================
1334
+ // Font Loading
1335
+ // ========================================
1336
+ /**
1337
+ * Load a font. All exposed fonts are Google fonts; the picker no
1338
+ * longer offers true "system" fonts that aren't on Google Fonts
1339
+ * because Android lacks them and we'd render inconsistently across
1340
+ * platforms.
1341
+ */
1342
+ async loadFont(t) {
1343
+ try {
1344
+ t.googleFont && this.loadGoogleFont(t.name);
1345
+ } catch (r) {
1346
+ ve.error(`Failed to load font ${t.name}:`, r);
1347
+ }
1348
+ }
1349
+ /**
1350
+ * Load a Google Font by family name alone (full font, link injection).
1351
+ * For callers that only have a family string — e.g. `useFontBinding`
1352
+ * applying a template's designer-curated font option — not a full
1353
+ * {@link FontDefinition}. Idempotent per family.
1354
+ */
1355
+ loadGoogleFontByName(t) {
1356
+ this.loadGoogleFont(t);
1357
+ }
1358
+ /**
1359
+ * Load Google Font via CSS link injection (full font)
1360
+ */
1361
+ loadGoogleFont(t) {
1362
+ const r = `font-${t.replace(/\s+/g, "-").toLowerCase()}`;
1363
+ if (document.getElementById(r)) return;
1364
+ const i = document.createElement("link");
1365
+ i.id = r, i.rel = "stylesheet", i.href = `https://fonts.googleapis.com/css2?family=${t.replace(/\s+/g, "+")}:wght@400;700&display=swap`, document.head.appendChild(i);
1366
+ }
1367
+ /**
1368
+ * Load Google Font with only specific characters (for previews)
1369
+ * Uses the text= parameter to load minimal glyphs (~99.9% smaller than full font)
1370
+ * See: https://developers.google.com/fonts/docs/getting_started#optimizing_your_font_requests
1371
+ *
1372
+ * @param fontName - Font family name
1373
+ * @param text - Text to render (only these characters will be loaded)
1374
+ */
1375
+ loadGoogleFontForPreview(t, r) {
1376
+ const i = encodeURIComponent(r), c = `font-preview-${t.replace(/\s+/g, "-").toLowerCase()}`;
1377
+ if (document.getElementById(c)) return;
1378
+ const a = document.createElement("link");
1379
+ a.id = c, a.rel = "stylesheet", a.href = `https://fonts.googleapis.com/css2?family=${t.replace(/\s+/g, "+")}&display=swap&text=${i}`, document.head.appendChild(a), this.previewFontLinks.add(c);
1380
+ }
1381
+ /**
1382
+ * Clear all preview font links from DOM
1383
+ * Call this when closing the font browser to free memory
1384
+ */
1385
+ clearPreviewFonts() {
1386
+ this.previewFontLinks.forEach((t) => {
1387
+ const r = document.getElementById(t);
1388
+ r && r.remove();
1389
+ }), this.previewFontLinks.clear();
1390
+ }
1391
+ /**
1392
+ * Get count of loaded preview fonts
1393
+ */
1394
+ getPreviewFontCount() {
1395
+ return this.previewFontLinks.size;
1396
+ }
1397
+ // ========================================
1398
+ // Font Mapping & Merging
1399
+ // ========================================
1400
+ /**
1401
+ * Map Google Font metadata to FontDefinition
1402
+ */
1403
+ mapGoogleFont(t) {
1404
+ var r;
1405
+ return {
1406
+ name: t.family,
1407
+ category: ke(t.category),
1408
+ googleFont: !0,
1409
+ source: "google",
1410
+ weights: ((r = t.variants) == null ? void 0 : r.map((i) => {
1411
+ const c = i.match(/\d+/);
1412
+ return c ? parseInt(c[0], 10) : i === "regular" ? 400 : null;
1413
+ }).filter((i) => i !== null)) || [400]
1414
+ };
1415
+ }
1416
+ /**
1417
+ * Map Google Fonts array to FontDefinitions
1418
+ */
1419
+ mapGoogleFonts(t) {
1420
+ return t.map((r) => this.mapGoogleFont(r));
1421
+ }
1422
+ /**
1423
+ * Merge fonts from multiple sources and deduplicate by family name
1424
+ */
1425
+ mergeFonts(t) {
1426
+ const r = /* @__PURE__ */ new Map();
1427
+ return t.forEach((i) => {
1428
+ const c = i.name.toLowerCase().trim();
1429
+ r.has(c) || r.set(c, i);
1430
+ }), Array.from(r.values()).sort((i, c) => i.name.localeCompare(c.name));
1431
+ }
1432
+ // ========================================
1433
+ // Cache Management
1434
+ // ========================================
1435
+ /**
1436
+ * Clear search cache
1437
+ */
1438
+ clearSearchCache() {
1439
+ this.searchCache.clear();
1440
+ }
1441
+ /**
1442
+ * Clear all caches
1443
+ */
1444
+ clearAllCaches() {
1445
+ this.clearSearchCache();
1446
+ }
1447
+ // ========================================
1448
+ // Stats & Debugging
1449
+ // ========================================
1450
+ /**
1451
+ * Get service stats for debugging
1452
+ */
1453
+ getStats() {
1454
+ const t = this.getAllFonts(), r = t.filter((c) => c.googleFont), i = t.filter((c) => !c.googleFont);
1455
+ return {
1456
+ initialized: this.isFontsLoaded(),
1457
+ totalFonts: t.length,
1458
+ googleFontsCount: r.length,
1459
+ systemFontsCount: i.length,
1460
+ searchCacheSize: this.searchCache.size
1461
+ };
1462
+ }
1463
+ }
1464
+ const ut = new et();
1465
+ export {
1466
+ at as C,
1467
+ ut as U,
1468
+ Oe as a,
1469
+ Re as b,
1470
+ We as c,
1471
+ dt as d,
1472
+ lt as e,
1473
+ ht as f,
1474
+ ct as g,
1475
+ Ze as h,
1476
+ st as u
1477
+ };
1478
+ //# sourceMappingURL=UnifiedFontService-BAtqqkU4.js.map