geoiq-frontend-ui-kit 2.0.2 → 2.0.4

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 (217) hide show
  1. package/dist/components/organisms/image-editor/components/line-session-bar.d.ts +20 -0
  2. package/dist/components/organisms/image-editor/components/line-session-bar.d.ts.map +1 -0
  3. package/dist/components/organisms/image-editor/components/panel-insert.d.ts.map +1 -1
  4. package/dist/components/organisms/image-editor/components/panel-selected.d.ts.map +1 -1
  5. package/dist/components/organisms/image-editor/components/panel.d.ts.map +1 -1
  6. package/dist/components/organisms/image-editor/components/saved-layers-list.d.ts +9 -0
  7. package/dist/components/organisms/image-editor/components/saved-layers-list.d.ts.map +1 -0
  8. package/dist/components/organisms/image-editor/image-editor-modal.d.ts.map +1 -1
  9. package/dist/components/organisms/image-editor/image-editor.types.d.ts +73 -0
  10. package/dist/components/organisms/image-editor/image-editor.types.d.ts.map +1 -1
  11. package/dist/components/organisms/image-editor/use-image-editor.d.ts.map +1 -1
  12. package/dist/components/ui/request-credits-view/component/request-credit-dialog.d.ts.map +1 -1
  13. package/dist/index.es100.js +147 -120
  14. package/dist/index.es100.js.map +1 -1
  15. package/dist/index.es101.js +16 -11
  16. package/dist/index.es101.js.map +1 -1
  17. package/dist/index.es102.js +7 -41
  18. package/dist/index.es102.js.map +1 -1
  19. package/dist/index.es103.js +21 -10
  20. package/dist/index.es103.js.map +1 -1
  21. package/dist/index.es104.js +7 -74
  22. package/dist/index.es104.js.map +1 -1
  23. package/dist/index.es105.js +177 -30
  24. package/dist/index.es105.js.map +1 -1
  25. package/dist/index.es106.js +45 -16
  26. package/dist/index.es106.js.map +1 -1
  27. package/dist/index.es107.js +42 -20
  28. package/dist/index.es107.js.map +1 -1
  29. package/dist/index.es108.js +22 -12
  30. package/dist/index.es108.js.map +1 -1
  31. package/dist/index.es109.js +122 -98
  32. package/dist/index.es109.js.map +1 -1
  33. package/dist/index.es11.js +1 -1
  34. package/dist/index.es110.js +33 -62
  35. package/dist/index.es110.js.map +1 -1
  36. package/dist/index.es111.js +60 -52
  37. package/dist/index.es111.js.map +1 -1
  38. package/dist/index.es112.js +10 -41
  39. package/dist/index.es112.js.map +1 -1
  40. package/dist/index.es113.js +21 -11
  41. package/dist/index.es113.js.map +1 -1
  42. package/dist/index.es114.js +42 -92
  43. package/dist/index.es114.js.map +1 -1
  44. package/dist/index.es115.js +37 -16
  45. package/dist/index.es115.js.map +1 -1
  46. package/dist/index.es116.js +12 -99
  47. package/dist/index.es116.js.map +1 -1
  48. package/dist/index.es117.js +92 -13
  49. package/dist/index.es117.js.map +1 -1
  50. package/dist/index.es118.js +13 -101
  51. package/dist/index.es118.js.map +1 -1
  52. package/dist/index.es119.js +71 -20
  53. package/dist/index.es119.js.map +1 -1
  54. package/dist/index.es12.js +1 -1
  55. package/dist/index.es120.js +34 -25
  56. package/dist/index.es120.js.map +1 -1
  57. package/dist/index.es121.js +20 -22
  58. package/dist/index.es121.js.map +1 -1
  59. package/dist/index.es122.js +16 -45
  60. package/dist/index.es122.js.map +1 -1
  61. package/dist/index.es123.js +11 -34
  62. package/dist/index.es123.js.map +1 -1
  63. package/dist/index.es124.js +96 -61
  64. package/dist/index.es124.js.map +1 -1
  65. package/dist/index.es125.js +57 -174
  66. package/dist/index.es125.js.map +1 -1
  67. package/dist/index.es126.js +50 -17
  68. package/dist/index.es126.js.map +1 -1
  69. package/dist/index.es127.js +2 -2
  70. package/dist/index.es128.js +2 -2
  71. package/dist/index.es129.js +1 -1
  72. package/dist/index.es130.js +1 -1
  73. package/dist/index.es131.js +2 -2
  74. package/dist/index.es132.js +35 -38
  75. package/dist/index.es132.js.map +1 -1
  76. package/dist/index.es133.js +41 -7
  77. package/dist/index.es133.js.map +1 -1
  78. package/dist/index.es134.js +88 -7
  79. package/dist/index.es134.js.map +1 -1
  80. package/dist/index.es135.js +14 -34
  81. package/dist/index.es135.js.map +1 -1
  82. package/dist/index.es136.js +269 -35
  83. package/dist/index.es136.js.map +1 -1
  84. package/dist/index.es137.js +7 -2
  85. package/dist/index.es137.js.map +1 -1
  86. package/dist/index.es138.js +23 -25
  87. package/dist/index.es138.js.map +1 -1
  88. package/dist/index.es139.js +169 -15
  89. package/dist/index.es139.js.map +1 -1
  90. package/dist/index.es140.js +82 -7
  91. package/dist/index.es140.js.map +1 -1
  92. package/dist/index.es141.js +73 -21
  93. package/dist/index.es141.js.map +1 -1
  94. package/dist/index.es142.js +3 -168
  95. package/dist/index.es142.js.map +1 -1
  96. package/dist/index.es143.js +56 -82
  97. package/dist/index.es143.js.map +1 -1
  98. package/dist/index.es144.js +119 -4
  99. package/dist/index.es144.js.map +1 -1
  100. package/dist/index.es145.js +405 -56
  101. package/dist/index.es145.js.map +1 -1
  102. package/dist/index.es146.js +25 -110
  103. package/dist/index.es146.js.map +1 -1
  104. package/dist/index.es147.js +60 -314
  105. package/dist/index.es147.js.map +1 -1
  106. package/dist/index.es148.js +29 -24
  107. package/dist/index.es148.js.map +1 -1
  108. package/dist/index.es149.js +21 -64
  109. package/dist/index.es149.js.map +1 -1
  110. package/dist/index.es150.js +36 -30
  111. package/dist/index.es150.js.map +1 -1
  112. package/dist/index.es151.js +211 -24
  113. package/dist/index.es151.js.map +1 -1
  114. package/dist/index.es152.js +141 -35
  115. package/dist/index.es152.js.map +1 -1
  116. package/dist/index.es153.js +141 -140
  117. package/dist/index.es153.js.map +1 -1
  118. package/dist/index.es154.js +45 -142
  119. package/dist/index.es154.js.map +1 -1
  120. package/dist/index.es155.js +353 -45
  121. package/dist/index.es155.js.map +1 -1
  122. package/dist/index.es156.js +14 -10
  123. package/dist/index.es156.js.map +1 -1
  124. package/dist/index.es157.js +10 -42
  125. package/dist/index.es157.js.map +1 -1
  126. package/dist/index.es158.js +44 -5
  127. package/dist/index.es158.js.map +1 -1
  128. package/dist/index.es159.js +5 -11
  129. package/dist/index.es159.js.map +1 -1
  130. package/dist/index.es16.js +1 -1
  131. package/dist/index.es160.js +10 -10
  132. package/dist/index.es160.js.map +1 -1
  133. package/dist/index.es161.js +11 -2
  134. package/dist/index.es161.js.map +1 -1
  135. package/dist/index.es162.js +2 -91
  136. package/dist/index.es162.js.map +1 -1
  137. package/dist/index.es163.js +2 -213
  138. package/dist/index.es163.js.map +1 -1
  139. package/dist/index.es164.js +23 -52
  140. package/dist/index.es164.js.map +1 -1
  141. package/dist/index.es165.js +88 -33
  142. package/dist/index.es165.js.map +1 -1
  143. package/dist/index.es166.js +52 -31
  144. package/dist/index.es166.js.map +1 -1
  145. package/dist/index.es167.js +32 -29
  146. package/dist/index.es167.js.map +1 -1
  147. package/dist/index.es168.js +26 -84
  148. package/dist/index.es168.js.map +1 -1
  149. package/dist/index.es169.js +27 -111
  150. package/dist/index.es169.js.map +1 -1
  151. package/dist/index.es170.js +97 -285
  152. package/dist/index.es170.js.map +1 -1
  153. package/dist/index.es171.js +251 -30
  154. package/dist/index.es171.js.map +1 -1
  155. package/dist/index.es172.js +63 -11
  156. package/dist/index.es172.js.map +1 -1
  157. package/dist/index.es173.js +284 -82
  158. package/dist/index.es173.js.map +1 -1
  159. package/dist/index.es174.js +29 -70
  160. package/dist/index.es174.js.map +1 -1
  161. package/dist/index.es175.js +10 -114
  162. package/dist/index.es175.js.map +1 -1
  163. package/dist/index.es176.js +23 -106
  164. package/dist/index.es176.js.map +1 -1
  165. package/dist/index.es177.js +19 -82
  166. package/dist/index.es177.js.map +1 -1
  167. package/dist/index.es178.js +63 -109
  168. package/dist/index.es178.js.map +1 -1
  169. package/dist/index.es179.js +63 -117
  170. package/dist/index.es179.js.map +1 -1
  171. package/dist/index.es180.js +112 -23
  172. package/dist/index.es180.js.map +1 -1
  173. package/dist/index.es181.js +103 -18
  174. package/dist/index.es181.js.map +1 -1
  175. package/dist/index.es182.js +86 -5
  176. package/dist/index.es182.js.map +1 -1
  177. package/dist/index.es183.js +133 -0
  178. package/dist/index.es183.js.map +1 -0
  179. package/dist/index.es184.js +133 -0
  180. package/dist/index.es184.js.map +1 -0
  181. package/dist/index.es185.js +9 -0
  182. package/dist/index.es185.js.map +1 -0
  183. package/dist/index.es19.js +1 -1
  184. package/dist/index.es2.js +21 -21
  185. package/dist/index.es2.js.map +1 -1
  186. package/dist/index.es20.js +1 -1
  187. package/dist/index.es21.js +3 -3
  188. package/dist/index.es22.js +1 -1
  189. package/dist/index.es25.js +1 -1
  190. package/dist/index.es27.js +1 -1
  191. package/dist/index.es28.js +2 -2
  192. package/dist/index.es30.js +1 -1
  193. package/dist/index.es32.js +1 -1
  194. package/dist/index.es33.js +1 -1
  195. package/dist/index.es45.js +48 -46
  196. package/dist/index.es45.js.map +1 -1
  197. package/dist/index.es46.js +2 -2
  198. package/dist/index.es47.js +1 -1
  199. package/dist/index.es48.js +1 -1
  200. package/dist/index.es53.js +1 -1
  201. package/dist/index.es54.js +1 -1
  202. package/dist/index.es57.js +1 -1
  203. package/dist/index.es59.js +1 -1
  204. package/dist/index.es67.js +2 -2
  205. package/dist/index.es68.js +1 -1
  206. package/dist/index.es71.js +1 -1
  207. package/dist/index.es72.js +7 -7
  208. package/dist/index.es73.js +2 -2
  209. package/dist/index.es85.js +1 -1
  210. package/dist/index.es97.js +16 -11
  211. package/dist/index.es97.js.map +1 -1
  212. package/dist/index.es98.js +89 -262
  213. package/dist/index.es98.js.map +1 -1
  214. package/dist/index.es99.js +13 -87
  215. package/dist/index.es99.js.map +1 -1
  216. package/dist/styles.css +55 -0
  217. package/package.json +2 -1
@@ -1,28 +1,26 @@
1
- import { cva as e } from "class-variance-authority";
2
- const t = e(
3
- "w-auto min-w-[50px] h-5 flex items-center justify-center gap-2 px-1 py-0.5 rounded-[4px]",
4
- {
5
- variants: {
6
- trend: {
7
- 1: "bg-success-1 border border-success-1",
8
- "-1": "bg-danger-1 border border-danger-1",
9
- 0: "",
10
- null: ""
11
- }
12
- }
13
- }
14
- ), s = e("text-sm", {
15
- variants: {
16
- trend: {
17
- 1: "text-success-1",
18
- "-1": "text-danger-1",
19
- 0: "",
20
- null: ""
21
- }
22
- }
23
- });
1
+ import t from "react";
2
+ import { LayersList as l } from "./index.es167.js";
3
+ import { PanelAdjust as o } from "./index.es168.js";
4
+ import { PanelCrop as s } from "./index.es169.js";
5
+ import { PanelInsert as m } from "./index.es170.js";
6
+ import { PanelSelected as c } from "./index.es171.js";
7
+ import { SavedLayersList as d } from "./index.es172.js";
8
+ const n = {
9
+ select: {
10
+ title: "Adjust & layers",
11
+ sub: "Adjust the photo, or click a layer"
12
+ },
13
+ crop: { title: "Crop", sub: "Trim to a region" },
14
+ text: { title: "Add text", sub: "Click on the image to place" },
15
+ draw: { title: "Draw", sub: "Freehand — becomes a layer" },
16
+ shape: { title: "Shape", sub: "Drag to draw — becomes a layer" },
17
+ sticker: { title: "Stickers", sub: "Click a sticker to drop it in" }
18
+ };
19
+ function k({ ui: e, engine: a }) {
20
+ const r = n[e.mode];
21
+ return /* @__PURE__ */ t.createElement("aside", { className: "image-editor-panel shrink-0 touch-pan-y overflow-y-auto overscroll-y-contain bg-light-3 p-4" }, /* @__PURE__ */ t.createElement("h3", { className: "mb-1 text-base font-semibold" }, r.title), /* @__PURE__ */ t.createElement("p", { className: "mb-3.5 text-xs text-light-4" }, r.sub), e.mode === "select" && e.selected == null && /* @__PURE__ */ t.createElement(o, { adjustments: e.adjustments, engine: a }), e.mode === "select" && e.selected != null && /* @__PURE__ */ t.createElement(c, { selected: e.selected, engine: a }), e.mode === "crop" && /* @__PURE__ */ t.createElement(s, { ui: e, engine: a }), (e.mode === "text" || e.mode === "draw" || e.mode === "shape" || e.mode === "sticker") && /* @__PURE__ */ t.createElement(m, { ui: e, engine: a }), /* @__PURE__ */ t.createElement(d, { ui: e, engine: a }), e.hasImage && /* @__PURE__ */ t.createElement(l, { ui: e, engine: a }));
22
+ }
24
23
  export {
25
- t as trendBoxStyles,
26
- s as trendValueStyles
24
+ k as Panel
27
25
  };
28
26
  //# sourceMappingURL=index.es138.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.es138.js","sources":["../src/components/ui/report-snippet-view/report-snippet-view-style.ts"],"sourcesContent":["import { cva } from 'class-variance-authority'\n\nexport const trendBoxStyles = cva(\n 'w-auto min-w-[50px] h-5 flex items-center justify-center gap-2 px-1 py-0.5 rounded-[4px]',\n {\n variants: {\n trend: {\n '1': 'bg-success-1 border border-success-1',\n '-1': 'bg-danger-1 border border-danger-1',\n '0': '',\n null: '',\n },\n },\n }\n)\n\nexport const trendValueStyles = cva('text-sm', {\n variants: {\n trend: {\n '1': 'text-success-1',\n '-1': 'text-danger-1',\n '0': '',\n null: '',\n },\n },\n})\n"],"names":["trendBoxStyles","cva","trendValueStyles"],"mappings":";AAEO,MAAMA,IAAiBC;AAAA,EAC5B;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,OAAO;AAAA,QACL,GAAK;AAAA,QACL,MAAM;AAAA,QACN,GAAK;AAAA,QACL,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,EACF;AAEJ,GAEaC,IAAmBD,EAAI,WAAW;AAAA,EAC7C,UAAU;AAAA,IACR,OAAO;AAAA,MACL,GAAK;AAAA,MACL,MAAM;AAAA,MACN,GAAK;AAAA,MACL,MAAM;AAAA,IAAA;AAAA,EACR;AAEJ,CAAC;"}
1
+ {"version":3,"file":"index.es138.js","sources":["../src/components/organisms/image-editor/components/panel.tsx"],"sourcesContent":["import React from 'react'\n\nimport {\n ImageEditorEngine,\n ImageEditorMode,\n ImageEditorUiState,\n} from '../image-editor.types'\nimport { LayersList } from './layers-list'\nimport { PanelAdjust } from './panel-adjust'\nimport { PanelCrop } from './panel-crop'\nimport { PanelInsert } from './panel-insert'\nimport { PanelSelected } from './panel-selected'\nimport { SavedLayersList } from './saved-layers-list'\n\ninterface PanelProps {\n ui: ImageEditorUiState\n engine: ImageEditorEngine\n}\n\nconst PANEL_HEADERS: Record<ImageEditorMode, { title: string; sub: string }> = {\n select: {\n title: 'Adjust & layers',\n sub: 'Adjust the photo, or click a layer',\n },\n crop: { title: 'Crop', sub: 'Trim to a region' },\n text: { title: 'Add text', sub: 'Click on the image to place' },\n draw: { title: 'Draw', sub: 'Freehand — becomes a layer' },\n shape: { title: 'Shape', sub: 'Drag to draw — becomes a layer' },\n sticker: { title: 'Stickers', sub: 'Click a sticker to drop it in' },\n}\n\nexport function Panel({ ui, engine }: PanelProps) {\n const header = PANEL_HEADERS[ui.mode]\n\n return (\n <aside className=\"image-editor-panel shrink-0 touch-pan-y overflow-y-auto overscroll-y-contain bg-light-3 p-4\">\n <h3 className=\"mb-1 text-base font-semibold\">{header.title}</h3>\n <p className=\"mb-3.5 text-xs text-light-4\">{header.sub}</p>\n\n {ui.mode === 'select' && ui.selected == null && (\n <PanelAdjust adjustments={ui.adjustments} engine={engine} />\n )}\n {ui.mode === 'select' && ui.selected != null && (\n <PanelSelected selected={ui.selected} engine={engine} />\n )}\n {ui.mode === 'crop' && <PanelCrop ui={ui} engine={engine} />}\n {(ui.mode === 'text' ||\n ui.mode === 'draw' ||\n ui.mode === 'shape' ||\n ui.mode === 'sticker') && <PanelInsert ui={ui} engine={engine} />}\n\n <SavedLayersList ui={ui} engine={engine} />\n\n {ui.hasImage && <LayersList ui={ui} engine={engine} />}\n </aside>\n )\n}\n"],"names":["PANEL_HEADERS","Panel","ui","engine","header","React","PanelAdjust","PanelSelected","PanelCrop","PanelInsert","SavedLayersList","LayersList"],"mappings":";;;;;;;AAmBA,MAAMA,IAAyE;AAAA,EAC7E,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,EAAA;AAAA,EAEP,MAAM,EAAE,OAAO,QAAQ,KAAK,mBAAA;AAAA,EAC5B,MAAM,EAAE,OAAO,YAAY,KAAK,8BAAA;AAAA,EAChC,MAAM,EAAE,OAAO,QAAQ,KAAK,6BAAA;AAAA,EAC5B,OAAO,EAAE,OAAO,SAAS,KAAK,iCAAA;AAAA,EAC9B,SAAS,EAAE,OAAO,YAAY,KAAK,gCAAA;AACrC;AAEO,SAASC,EAAM,EAAE,IAAAC,GAAI,QAAAC,KAAsB;AAChD,QAAMC,IAASJ,EAAcE,EAAG,IAAI;AAEpC,yCACG,SAAA,EAAM,WAAU,8FAAA,GACfG,gBAAAA,EAAA,cAAC,QAAG,WAAU,+BAAA,GAAgCD,EAAO,KAAM,GAC3DC,gBAAAA,EAAA,cAAC,KAAA,EAAE,WAAU,iCAA+BD,EAAO,GAAI,GAEtDF,EAAG,SAAS,YAAYA,EAAG,YAAY,QACtCG,gBAAAA,EAAA,cAACC,GAAA,EAAY,aAAaJ,EAAG,aAAa,QAAAC,GAAgB,GAE3DD,EAAG,SAAS,YAAYA,EAAG,YAAY,wCACrCK,GAAA,EAAc,UAAUL,EAAG,UAAU,QAAAC,GAAgB,GAEvDD,EAAG,SAAS,0CAAWM,GAAA,EAAU,IAAAN,GAAQ,QAAAC,EAAA,CAAgB,IACxDD,EAAG,SAAS,UACZA,EAAG,SAAS,UACZA,EAAG,SAAS,WACZA,EAAG,SAAS,cAAcG,gBAAAA,EAAA,cAACI,GAAA,EAAY,IAAAP,GAAQ,QAAAC,GAAgB,GAEjEE,gBAAAA,EAAA,cAACK,GAAA,EAAgB,IAAAR,GAAQ,QAAAC,EAAA,CAAgB,GAExCD,EAAG,4CAAaS,GAAA,EAAW,IAAAT,GAAQ,QAAAC,GAAgB,CACtD;AAEJ;"}
@@ -1,19 +1,173 @@
1
- import { cva as r } from "class-variance-authority";
2
- import { StepItemStatus as e } from "./index.es31.js";
3
- const o = r(
4
- "h-8 w-8 border-2 flex items-center justify-center rounded-full cursor-pointer trasnition-all",
5
- {
6
- variants: {
7
- variant: {
8
- pending: "border-neutral-2 ",
9
- current: "bg-primary-1 border-primary-2 hover:bg-hover-t1 active:bg-click-t1",
10
- completed: "bg-rest-p1 hover:bg-hover-p1 active:bg-click-p1 border-none"
11
- }
1
+ import { ImagePlus as s, Undo2 as i, Redo2 as d, RefreshCcw as b, RotateCcw as p, RotateCw as h, FlipHorizontal2 as E, FlipVertical2 as u, MousePointer2 as w, Crop as f, Type as N, Pen as x, Shapes as v, Sticker as C, ZoomOut as g, ZoomIn as k } from "lucide-react";
2
+ import e from "react";
3
+ import { Button as R } from "./index.es9.js";
4
+ import { cn as y } from "./index.es89.js";
5
+ function c({
6
+ icon: a,
7
+ label: t,
8
+ active: r,
9
+ disabled: o,
10
+ onClick: l
11
+ }) {
12
+ return /* @__PURE__ */ e.createElement(
13
+ R,
14
+ {
15
+ variant: "secondary",
16
+ size: "sm",
17
+ disabled: o,
18
+ onClick: l,
19
+ className: y(
20
+ "w-auto flex-col gap-0.5 h-auto min-w-[52px] border-neutral-1 px-2 py-1.5 text-[10.5px]",
21
+ r && "border-rest-p1 bg-rest-p1 text-white hover:bg-hover-p1"
22
+ )
23
+ },
24
+ a,
25
+ t
26
+ );
27
+ }
28
+ function Z({
29
+ zoomPercent: a,
30
+ canZoomIn: t,
31
+ canZoomOut: r,
32
+ disabled: o,
33
+ onZoomIn: l,
34
+ onZoomOut: n,
35
+ onZoomReset: m
36
+ }) {
37
+ return /* @__PURE__ */ e.createElement("div", { className: "flex items-center gap-0.5 rounded-lg border border-neutral-1 bg-white p-0.5" }, /* @__PURE__ */ e.createElement(
38
+ "button",
39
+ {
40
+ type: "button",
41
+ title: "Zoom out",
42
+ disabled: o || !r,
43
+ onClick: n,
44
+ className: "flex h-7 w-7 items-center justify-center rounded-md text-light-2 hover:bg-light-2 disabled:pointer-events-none disabled:opacity-40"
45
+ },
46
+ /* @__PURE__ */ e.createElement(g, { className: "h-4 w-4" })
47
+ ), /* @__PURE__ */ e.createElement(
48
+ "button",
49
+ {
50
+ type: "button",
51
+ title: "Reset zoom to fit",
52
+ disabled: o,
53
+ onClick: m,
54
+ className: "min-w-[38px] rounded-md py-1 text-[11px] font-medium text-light-2 hover:bg-light-2 disabled:pointer-events-none disabled:opacity-40"
12
55
  },
13
- defaultVariants: { variant: e.PENDING }
14
- }
15
- );
56
+ a,
57
+ "%"
58
+ ), /* @__PURE__ */ e.createElement(
59
+ "button",
60
+ {
61
+ type: "button",
62
+ title: "Zoom in",
63
+ disabled: o || !t,
64
+ onClick: l,
65
+ className: "flex h-7 w-7 items-center justify-center rounded-md text-light-2 hover:bg-light-2 disabled:pointer-events-none disabled:opacity-40"
66
+ },
67
+ /* @__PURE__ */ e.createElement(k, { className: "h-4 w-4" })
68
+ ));
69
+ }
70
+ const O = [
71
+ {
72
+ mode: "select",
73
+ label: "Select",
74
+ icon: /* @__PURE__ */ e.createElement(w, { className: "h-4 w-4" })
75
+ },
76
+ { mode: "crop", label: "Crop", icon: /* @__PURE__ */ e.createElement(f, { className: "h-4 w-4" }) },
77
+ { mode: "text", label: "Text", icon: /* @__PURE__ */ e.createElement(N, { className: "h-4 w-4" }) },
78
+ { mode: "draw", label: "Draw", icon: /* @__PURE__ */ e.createElement(x, { className: "h-4 w-4" }) },
79
+ { mode: "shape", label: "Shape", icon: /* @__PURE__ */ e.createElement(v, { className: "h-4 w-4" }) },
80
+ { mode: "sticker", label: "Sticker", icon: /* @__PURE__ */ e.createElement(C, { className: "h-4 w-4" }) }
81
+ ];
82
+ function F({ ui: a, engine: t, onOpenFile: r }) {
83
+ const o = !a.hasImage;
84
+ return /* @__PURE__ */ e.createElement("div", { className: "flex items-stretch gap-2 overflow-x-auto overscroll-x-contain border-b border-neutral-1 bg-light-3 p-2" }, a.canOpenImage && /* @__PURE__ */ e.createElement("div", { className: "flex items-center gap-1.5 border-r border-neutral-1 pr-2" }, /* @__PURE__ */ e.createElement(
85
+ c,
86
+ {
87
+ icon: /* @__PURE__ */ e.createElement(s, { className: "h-4 w-4" }),
88
+ label: "Open",
89
+ onClick: r
90
+ }
91
+ )), /* @__PURE__ */ e.createElement("div", { className: "mr-auto flex items-center gap-1.5" }, O.map((l) => /* @__PURE__ */ e.createElement(
92
+ c,
93
+ {
94
+ key: l.mode,
95
+ icon: l.icon,
96
+ label: l.label,
97
+ disabled: o,
98
+ active: a.mode === l.mode,
99
+ onClick: () => t.setMode(l.mode)
100
+ }
101
+ ))), /* @__PURE__ */ e.createElement("div", { className: "ml-auto flex items-center" }, /* @__PURE__ */ e.createElement(
102
+ Z,
103
+ {
104
+ zoomPercent: a.zoomPercent,
105
+ canZoomIn: a.canZoomIn,
106
+ canZoomOut: a.canZoomOut,
107
+ disabled: o,
108
+ onZoomIn: t.zoomIn,
109
+ onZoomOut: t.zoomOut,
110
+ onZoomReset: t.zoomToFit
111
+ }
112
+ )), /* @__PURE__ */ e.createElement("div", { className: "ml-auto flex items-center gap-1.5 border-l border-neutral-1 pl-2" }, /* @__PURE__ */ e.createElement(
113
+ c,
114
+ {
115
+ icon: /* @__PURE__ */ e.createElement(i, { className: "h-4 w-4" }),
116
+ label: "Undo",
117
+ disabled: !a.canUndo,
118
+ onClick: t.undo
119
+ }
120
+ ), /* @__PURE__ */ e.createElement(
121
+ c,
122
+ {
123
+ icon: /* @__PURE__ */ e.createElement(d, { className: "h-4 w-4" }),
124
+ label: "Redo",
125
+ disabled: !a.canRedo,
126
+ onClick: t.redo
127
+ }
128
+ ), /* @__PURE__ */ e.createElement(
129
+ c,
130
+ {
131
+ icon: /* @__PURE__ */ e.createElement(b, { className: "h-4 w-4" }),
132
+ label: "Reset",
133
+ disabled: !a.canReset,
134
+ onClick: t.resetToOriginal
135
+ }
136
+ )), /* @__PURE__ */ e.createElement("div", { className: "flex items-center gap-1.5 border-l border-neutral-1 pl-2" }, /* @__PURE__ */ e.createElement(
137
+ c,
138
+ {
139
+ icon: /* @__PURE__ */ e.createElement(p, { className: "h-4 w-4" }),
140
+ label: "Rotate L",
141
+ disabled: o,
142
+ onClick: () => t.rotate(-90)
143
+ }
144
+ ), /* @__PURE__ */ e.createElement(
145
+ c,
146
+ {
147
+ icon: /* @__PURE__ */ e.createElement(h, { className: "h-4 w-4" }),
148
+ label: "Rotate R",
149
+ disabled: o,
150
+ onClick: () => t.rotate(90)
151
+ }
152
+ ), /* @__PURE__ */ e.createElement(
153
+ c,
154
+ {
155
+ icon: /* @__PURE__ */ e.createElement(E, { className: "h-4 w-4" }),
156
+ label: "Flip H",
157
+ disabled: o,
158
+ onClick: () => t.flip(!0)
159
+ }
160
+ ), /* @__PURE__ */ e.createElement(
161
+ c,
162
+ {
163
+ icon: /* @__PURE__ */ e.createElement(u, { className: "h-4 w-4" }),
164
+ label: "Flip V",
165
+ disabled: o,
166
+ onClick: () => t.flip(!1)
167
+ }
168
+ )));
169
+ }
16
170
  export {
17
- o as StepItemVariants
171
+ F as Ribbon
18
172
  };
19
173
  //# sourceMappingURL=index.es139.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.es139.js","sources":["../src/components/molecules/stepper/stepper.styles.ts"],"sourcesContent":["import { cva } from 'class-variance-authority'\nimport { StepItemStatus } from './stepper.type'\nexport const StepItemVariants = cva(\n 'h-8 w-8 border-2 flex items-center justify-center rounded-full cursor-pointer trasnition-all',\n {\n variants: {\n variant: {\n pending: 'border-neutral-2 ',\n current:\n 'bg-primary-1 border-primary-2 hover:bg-hover-t1 active:bg-click-t1',\n completed:\n 'bg-rest-p1 hover:bg-hover-p1 active:bg-click-p1 border-none',\n },\n },\n defaultVariants: { variant: StepItemStatus.PENDING },\n }\n)\n"],"names":["StepItemVariants","cva","StepItemStatus"],"mappings":";;AAEO,MAAMA,IAAmBC;AAAA,EAC9B;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SAAS;AAAA,QACT,SACE;AAAA,QACF,WACE;AAAA,MAAA;AAAA,IACJ;AAAA,IAEF,iBAAiB,EAAE,SAASC,EAAe,QAAA;AAAA,EAAQ;AAEvD;"}
1
+ {"version":3,"file":"index.es139.js","sources":["../src/components/organisms/image-editor/components/ribbon.tsx"],"sourcesContent":["import {\n Crop,\n FlipHorizontal2,\n FlipVertical2,\n ImagePlus,\n MousePointer2,\n Pen,\n Redo2,\n RefreshCcw,\n RotateCcw,\n RotateCw,\n Shapes,\n Sticker,\n Type,\n Undo2,\n ZoomIn,\n ZoomOut,\n} from 'lucide-react'\nimport React from 'react'\n\nimport { Button } from '@/components/atoms/button'\nimport { cn } from '@/lib/utils'\n\nimport {\n ImageEditorEngine,\n ImageEditorMode,\n ImageEditorUiState,\n} from '../image-editor.types'\n\ninterface ToolButtonProps {\n icon: React.ReactNode\n label: string\n active?: boolean\n disabled?: boolean\n onClick: () => void\n}\n\nfunction ToolButton({\n icon,\n label,\n active,\n disabled,\n onClick,\n}: ToolButtonProps) {\n return (\n <Button\n variant=\"secondary\"\n size=\"sm\"\n disabled={disabled}\n onClick={onClick}\n className={cn(\n 'w-auto flex-col gap-0.5 h-auto min-w-[52px] border-neutral-1 px-2 py-1.5 text-[10.5px]',\n active && 'border-rest-p1 bg-rest-p1 text-white hover:bg-hover-p1'\n )}\n >\n {icon}\n {label}\n </Button>\n )\n}\n\ninterface ZoomControlProps {\n zoomPercent: number\n canZoomIn: boolean\n canZoomOut: boolean\n disabled: boolean\n onZoomIn: () => void\n onZoomOut: () => void\n onZoomReset: () => void\n}\n\nfunction ZoomControl({\n zoomPercent,\n canZoomIn,\n canZoomOut,\n disabled,\n onZoomIn,\n onZoomOut,\n onZoomReset,\n}: ZoomControlProps) {\n return (\n <div className=\"flex items-center gap-0.5 rounded-lg border border-neutral-1 bg-white p-0.5\">\n <button\n type=\"button\"\n title=\"Zoom out\"\n disabled={disabled || !canZoomOut}\n onClick={onZoomOut}\n className=\"flex h-7 w-7 items-center justify-center rounded-md text-light-2 hover:bg-light-2 disabled:pointer-events-none disabled:opacity-40\"\n >\n <ZoomOut className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n title=\"Reset zoom to fit\"\n disabled={disabled}\n onClick={onZoomReset}\n className=\"min-w-[38px] rounded-md py-1 text-[11px] font-medium text-light-2 hover:bg-light-2 disabled:pointer-events-none disabled:opacity-40\"\n >\n {zoomPercent}%\n </button>\n <button\n type=\"button\"\n title=\"Zoom in\"\n disabled={disabled || !canZoomIn}\n onClick={onZoomIn}\n className=\"flex h-7 w-7 items-center justify-center rounded-md text-light-2 hover:bg-light-2 disabled:pointer-events-none disabled:opacity-40\"\n >\n <ZoomIn className=\"h-4 w-4\" />\n </button>\n </div>\n )\n}\n\nexport interface RibbonProps {\n ui: ImageEditorUiState\n engine: ImageEditorEngine\n onOpenFile: () => void\n}\n\nconst MODE_TOOLS: {\n mode: ImageEditorMode\n label: string\n icon: React.ReactNode\n}[] = [\n {\n mode: 'select',\n label: 'Select',\n icon: <MousePointer2 className=\"h-4 w-4\" />,\n },\n { mode: 'crop', label: 'Crop', icon: <Crop className=\"h-4 w-4\" /> },\n { mode: 'text', label: 'Text', icon: <Type className=\"h-4 w-4\" /> },\n { mode: 'draw', label: 'Draw', icon: <Pen className=\"h-4 w-4\" /> },\n { mode: 'shape', label: 'Shape', icon: <Shapes className=\"h-4 w-4\" /> },\n { mode: 'sticker', label: 'Sticker', icon: <Sticker className=\"h-4 w-4\" /> },\n]\n\nexport function Ribbon({ ui, engine, onOpenFile }: RibbonProps) {\n const disabled = !ui.hasImage\n\n return (\n <div className=\"flex items-stretch gap-2 overflow-x-auto overscroll-x-contain border-b border-neutral-1 bg-light-3 p-2\">\n {ui.canOpenImage && (\n <div className=\"flex items-center gap-1.5 border-r border-neutral-1 pr-2\">\n <ToolButton\n icon={<ImagePlus className=\"h-4 w-4\" />}\n label=\"Open\"\n onClick={onOpenFile}\n />\n </div>\n )}\n\n <div className=\"mr-auto flex items-center gap-1.5\">\n {MODE_TOOLS.map((t) => (\n <ToolButton\n key={t.mode}\n icon={t.icon}\n label={t.label}\n disabled={disabled}\n active={ui.mode === t.mode}\n onClick={() => engine.setMode(t.mode)}\n />\n ))}\n </div>\n\n <div className=\"ml-auto flex items-center\">\n <ZoomControl\n zoomPercent={ui.zoomPercent}\n canZoomIn={ui.canZoomIn}\n canZoomOut={ui.canZoomOut}\n disabled={disabled}\n onZoomIn={engine.zoomIn}\n onZoomOut={engine.zoomOut}\n onZoomReset={engine.zoomToFit}\n />\n </div>\n\n <div className=\"ml-auto flex items-center gap-1.5 border-l border-neutral-1 pl-2\">\n <ToolButton\n icon={<Undo2 className=\"h-4 w-4\" />}\n label=\"Undo\"\n disabled={!ui.canUndo}\n onClick={engine.undo}\n />\n <ToolButton\n icon={<Redo2 className=\"h-4 w-4\" />}\n label=\"Redo\"\n disabled={!ui.canRedo}\n onClick={engine.redo}\n />\n <ToolButton\n icon={<RefreshCcw className=\"h-4 w-4\" />}\n label=\"Reset\"\n disabled={!ui.canReset}\n onClick={engine.resetToOriginal}\n />\n </div>\n\n <div className=\"flex items-center gap-1.5 border-l border-neutral-1 pl-2\">\n <ToolButton\n icon={<RotateCcw className=\"h-4 w-4\" />}\n label=\"Rotate L\"\n disabled={disabled}\n onClick={() => engine.rotate(-90)}\n />\n <ToolButton\n icon={<RotateCw className=\"h-4 w-4\" />}\n label=\"Rotate R\"\n disabled={disabled}\n onClick={() => engine.rotate(90)}\n />\n <ToolButton\n icon={<FlipHorizontal2 className=\"h-4 w-4\" />}\n label=\"Flip H\"\n disabled={disabled}\n onClick={() => engine.flip(true)}\n />\n <ToolButton\n icon={<FlipVertical2 className=\"h-4 w-4\" />}\n label=\"Flip V\"\n disabled={disabled}\n onClick={() => engine.flip(false)}\n />\n </div>\n </div>\n )\n}\n"],"names":["ToolButton","icon","label","active","disabled","onClick","React","Button","cn","ZoomControl","zoomPercent","canZoomIn","canZoomOut","onZoomIn","onZoomOut","onZoomReset","ZoomOut","ZoomIn","MODE_TOOLS","MousePointer2","Crop","Type","Pen","Shapes","Sticker","Ribbon","ui","engine","onOpenFile","ImagePlus","t","Undo2","Redo2","RefreshCcw","RotateCcw","RotateCw","FlipHorizontal2","FlipVertical2"],"mappings":"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"}
@@ -1,10 +1,85 @@
1
- import { createContext as t, useContext as o } from "react";
2
- const e = t(null);
3
- function n() {
4
- return o(e);
5
- }
1
+ import { ImageUp as x, Loader2 as d } from "lucide-react";
2
+ import e, { forwardRef as E } from "react";
3
+ import { cn as g } from "./index.es89.js";
4
+ const v = {
5
+ backgroundImage: "linear-gradient(45deg,#e2e0d9 25%,transparent 25%),linear-gradient(-45deg,#e2e0d9 25%,transparent 25%),linear-gradient(45deg,transparent 75%,#e2e0d9 75%),linear-gradient(-45deg,transparent 75%,#e2e0d9 75%)",
6
+ backgroundSize: "22px 22px",
7
+ backgroundPosition: "0 0, 0 11px, 11px -11px, -11px 0",
8
+ backgroundColor: "#eceae4"
9
+ }, R = E(function({ ui: t, onChooseImage: f, onDropFile: p }, u) {
10
+ const l = e.useRef(null), s = e.useRef(null), o = e.useRef(null), c = e.useRef(null), r = e.useRef(null);
11
+ return e.useImperativeHandle(u, () => ({
12
+ stage: l.current,
13
+ cwrap: s.current,
14
+ canvas: o.current,
15
+ overlay: c.current,
16
+ textEditor: r.current
17
+ })), e.useEffect(() => {
18
+ if (!t.isEditingText) return;
19
+ const a = r.current;
20
+ if (!a) return;
21
+ let n = 0, i = 0;
22
+ const m = () => {
23
+ document.activeElement !== a && (a.focus(), t.editingSelectAll && a.select()), n += 1, n < 3 && (i = requestAnimationFrame(m));
24
+ };
25
+ return m(), () => cancelAnimationFrame(i);
26
+ }, [t.isEditingText, t.editingSelectAll]), /* @__PURE__ */ e.createElement(
27
+ "div",
28
+ {
29
+ ref: l,
30
+ className: "relative flex flex-1 touch-none overflow-auto overscroll-contain",
31
+ style: v,
32
+ onDragOver: (a) => a.preventDefault(),
33
+ onDragEnter: (a) => a.preventDefault(),
34
+ onDrop: (a) => {
35
+ if (a.preventDefault(), !t.canOpenImage) return;
36
+ const n = a.dataTransfer.files[0];
37
+ n && n.type.startsWith("image/") && p(n);
38
+ }
39
+ },
40
+ !t.hasImage && !t.isLoadingImage && t.canOpenImage && /* @__PURE__ */ e.createElement("div", { className: "m-auto max-w-[340px] px-8 text-center text-light-4" }, /* @__PURE__ */ e.createElement(x, { className: "mx-auto mb-3 h-14 w-14 stroke-[1.2]" }), /* @__PURE__ */ e.createElement("h2", { className: "mb-2 text-lg font-semibold text-light-2" }, "Drop a picture in"), /* @__PURE__ */ e.createElement("p", { className: "text-sm leading-relaxed" }, "Open an image to crop, filter, rotate, and annotate. Text, shapes, and drawings become movable layers."), /* @__PURE__ */ e.createElement(
41
+ "button",
42
+ {
43
+ type: "button",
44
+ onClick: f,
45
+ className: "mt-4 inline-block rounded-lg bg-rest-p1 px-5 py-2 text-sm text-white hover:bg-hover-p1"
46
+ },
47
+ "Choose an image"
48
+ )),
49
+ !t.hasImage && t.isLoadingImage && /* @__PURE__ */ e.createElement("div", { className: "m-auto flex flex-col items-center gap-3 text-light-4" }, /* @__PURE__ */ e.createElement(d, { className: "h-10 w-10 animate-spin" }), /* @__PURE__ */ e.createElement("p", { className: "text-sm" }, "Loading image…")),
50
+ /* @__PURE__ */ e.createElement(
51
+ "div",
52
+ {
53
+ ref: s,
54
+ className: g(
55
+ "relative m-auto bg-white shadow-lg",
56
+ !t.hasImage && "hidden"
57
+ )
58
+ },
59
+ /* @__PURE__ */ e.createElement("canvas", { ref: o, className: "image-editor-canvas block" }),
60
+ /* @__PURE__ */ e.createElement(
61
+ "canvas",
62
+ {
63
+ ref: c,
64
+ className: "image-editor-canvas absolute inset-0"
65
+ }
66
+ ),
67
+ /* @__PURE__ */ e.createElement(
68
+ "textarea",
69
+ {
70
+ ref: r,
71
+ rows: 1,
72
+ className: g(
73
+ "absolute z-30 resize-none overflow-hidden rounded-md border border-rest-p1 bg-white px-1.5 py-1 leading-[1.1] shadow-lg outline-none",
74
+ !t.isEditingText && "hidden"
75
+ )
76
+ }
77
+ ),
78
+ t.isLoadingImage && /* @__PURE__ */ e.createElement("div", { className: "absolute inset-0 z-40 flex flex-col items-center justify-center gap-3 bg-white text-light-4" }, /* @__PURE__ */ e.createElement(d, { className: "h-10 w-10 animate-spin" }), /* @__PURE__ */ e.createElement("p", { className: "text-sm" }, "Loading image…"))
79
+ )
80
+ );
81
+ });
6
82
  export {
7
- e as ImageEditorPortalContext,
8
- n as useImageEditorPortalContainer
83
+ R as Stage
9
84
  };
10
85
  //# sourceMappingURL=index.es140.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.es140.js","sources":["../src/components/organisms/image-editor/components/portal-context.tsx"],"sourcesContent":["import { createContext, useContext } from 'react'\n\nexport const ImageEditorPortalContext = createContext<HTMLElement | null>(null)\n\nexport function useImageEditorPortalContainer() {\n return useContext(ImageEditorPortalContext)\n}\n"],"names":["ImageEditorPortalContext","createContext","useImageEditorPortalContainer","useContext"],"mappings":";AAEO,MAAMA,IAA2BC,EAAkC,IAAI;AAEvE,SAASC,IAAgC;AAC9C,SAAOC,EAAWH,CAAwB;AAC5C;"}
1
+ {"version":3,"file":"index.es140.js","sources":["../src/components/organisms/image-editor/components/stage.tsx"],"sourcesContent":["import { ImageUp, Loader2 } from 'lucide-react'\nimport React, { forwardRef } from 'react'\n\nimport { cn } from '@/lib/utils'\n\nimport { ImageEditorUiState } from '../image-editor.types'\n\nexport interface StageHandle {\n stage: HTMLDivElement | null\n cwrap: HTMLDivElement | null\n canvas: HTMLCanvasElement | null\n overlay: HTMLCanvasElement | null\n textEditor: HTMLTextAreaElement | null\n}\n\ninterface StageProps {\n ui: ImageEditorUiState\n onChooseImage: () => void\n onDropFile: (file: File) => void\n}\n\nconst CHECKERBOARD_STYLE: React.CSSProperties = {\n backgroundImage:\n 'linear-gradient(45deg,#e2e0d9 25%,transparent 25%),linear-gradient(-45deg,#e2e0d9 25%,transparent 25%),linear-gradient(45deg,transparent 75%,#e2e0d9 75%),linear-gradient(-45deg,transparent 75%,#e2e0d9 75%)',\n backgroundSize: '22px 22px',\n backgroundPosition: '0 0, 0 11px, 11px -11px, -11px 0',\n backgroundColor: '#eceae4',\n}\n\nexport const Stage = forwardRef<StageHandle, StageProps>(function Stage(\n { ui, onChooseImage, onDropFile },\n ref\n) {\n const stageElRef = React.useRef<HTMLDivElement>(null)\n const cwrapElRef = React.useRef<HTMLDivElement>(null)\n const canvasElRef = React.useRef<HTMLCanvasElement>(null)\n const overlayElRef = React.useRef<HTMLCanvasElement>(null)\n const textEditorElRef = React.useRef<HTMLTextAreaElement>(null)\n\n React.useImperativeHandle(ref, () => ({\n stage: stageElRef.current,\n cwrap: cwrapElRef.current,\n canvas: canvasElRef.current,\n overlay: overlayElRef.current,\n textEditor: textEditorElRef.current,\n }))\n\n React.useEffect(() => {\n if (!ui.isEditingText) return\n const el = textEditorElRef.current\n if (!el) return\n let attempts = 0\n let raf = 0\n const tryFocus = () => {\n if (document.activeElement !== el) {\n el.focus()\n if (ui.editingSelectAll) el.select()\n }\n attempts += 1\n if (attempts < 3) raf = requestAnimationFrame(tryFocus)\n }\n tryFocus()\n return () => cancelAnimationFrame(raf)\n }, [ui.isEditingText, ui.editingSelectAll])\n\n return (\n <div\n ref={stageElRef}\n className=\"relative flex flex-1 touch-none overflow-auto overscroll-contain\"\n style={CHECKERBOARD_STYLE}\n onDragOver={(e) => e.preventDefault()}\n onDragEnter={(e) => e.preventDefault()}\n onDrop={(e) => {\n e.preventDefault()\n if (!ui.canOpenImage) return\n const file = e.dataTransfer.files[0]\n if (file && file.type.startsWith('image/')) onDropFile(file)\n }}\n >\n {!ui.hasImage && !ui.isLoadingImage && ui.canOpenImage && (\n <div className=\"m-auto max-w-[340px] px-8 text-center text-light-4\">\n <ImageUp className=\"mx-auto mb-3 h-14 w-14 stroke-[1.2]\" />\n <h2 className=\"mb-2 text-lg font-semibold text-light-2\">\n Drop a picture in\n </h2>\n <p className=\"text-sm leading-relaxed\">\n Open an image to crop, filter, rotate, and annotate. Text, shapes,\n and drawings become movable layers.\n </p>\n <button\n type=\"button\"\n onClick={onChooseImage}\n className=\"mt-4 inline-block rounded-lg bg-rest-p1 px-5 py-2 text-sm text-white hover:bg-hover-p1\"\n >\n Choose an image\n </button>\n </div>\n )}\n {!ui.hasImage && ui.isLoadingImage && (\n <div className=\"m-auto flex flex-col items-center gap-3 text-light-4\">\n <Loader2 className=\"h-10 w-10 animate-spin\" />\n <p className=\"text-sm\">Loading image…</p>\n </div>\n )}\n <div\n ref={cwrapElRef}\n className={cn(\n 'relative m-auto bg-white shadow-lg',\n !ui.hasImage && 'hidden'\n )}\n >\n <canvas ref={canvasElRef} className=\"image-editor-canvas block\" />\n <canvas\n ref={overlayElRef}\n className=\"image-editor-canvas absolute inset-0\"\n />\n <textarea\n ref={textEditorElRef}\n rows={1}\n className={cn(\n 'absolute z-30 resize-none overflow-hidden rounded-md border border-rest-p1 bg-white px-1.5 py-1 leading-[1.1] shadow-lg outline-none',\n !ui.isEditingText && 'hidden'\n )}\n />\n {ui.isLoadingImage && (\n <div className=\"absolute inset-0 z-40 flex flex-col items-center justify-center gap-3 bg-white text-light-4\">\n <Loader2 className=\"h-10 w-10 animate-spin\" />\n <p className=\"text-sm\">Loading image…</p>\n </div>\n )}\n </div>\n </div>\n )\n})\n"],"names":["CHECKERBOARD_STYLE","Stage","forwardRef","ui","onChooseImage","onDropFile","ref","stageElRef","React","cwrapElRef","canvasElRef","overlayElRef","textEditorElRef","el","attempts","raf","tryFocus","e","file","ImageUp","Loader2","cn"],"mappings":"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"}
@@ -1,25 +1,77 @@
1
- import t from "react";
2
- import { LayersList as l } from "./index.es165.js";
3
- import { PanelAdjust as o } from "./index.es166.js";
4
- import { PanelCrop as s } from "./index.es167.js";
5
- import { PanelInsert as m } from "./index.es168.js";
6
- import { PanelSelected as c } from "./index.es169.js";
7
- const d = {
8
- select: {
9
- title: "Adjust & layers",
10
- sub: "Adjust the photo, or click a layer"
11
- },
12
- crop: { title: "Crop", sub: "Trim to a region" },
13
- text: { title: "Add text", sub: "Click on the image to place" },
14
- draw: { title: "Draw", sub: "Freehand — becomes a layer" },
15
- shape: { title: "Shape", sub: "Drag to draw — becomes a layer" },
16
- sticker: { title: "Stickers", sub: "Click a sticker to drop it in" }
17
- };
18
- function f({ ui: e, engine: a }) {
19
- const r = d[e.mode];
20
- return /* @__PURE__ */ t.createElement("aside", { className: "image-editor-panel shrink-0 touch-pan-y overflow-y-auto overscroll-y-contain bg-light-3 p-4" }, /* @__PURE__ */ t.createElement("h3", { className: "mb-1 text-base font-semibold" }, r.title), /* @__PURE__ */ t.createElement("p", { className: "mb-3.5 text-xs text-light-4" }, r.sub), e.mode === "select" && e.selected == null && /* @__PURE__ */ t.createElement(o, { adjustments: e.adjustments, engine: a }), e.mode === "select" && e.selected != null && /* @__PURE__ */ t.createElement(c, { selected: e.selected, engine: a }), e.mode === "crop" && /* @__PURE__ */ t.createElement(s, { ui: e, engine: a }), (e.mode === "text" || e.mode === "draw" || e.mode === "shape" || e.mode === "sticker") && /* @__PURE__ */ t.createElement(m, { ui: e, engine: a }), e.hasImage && /* @__PURE__ */ t.createElement(l, { ui: e, engine: a }));
1
+ import { Spline as r, CornerUpLeft as c, Check as m, X as p } from "lucide-react";
2
+ import e from "react";
3
+ function u({ ui: a, engine: t }) {
4
+ if (!a.poly?.active) return null;
5
+ const { pointCount: n, canFinish: l, canClose: i } = a.poly;
6
+ return /* @__PURE__ */ e.createElement(
7
+ "div",
8
+ {
9
+ className: "pointer-events-none absolute inset-x-0 bottom-3 z-20 flex justify-center px-3",
10
+ role: "toolbar",
11
+ "aria-label": "Multi-point line controls"
12
+ },
13
+ /* @__PURE__ */ e.createElement("div", { className: "pointer-events-auto flex max-w-full items-center gap-1 overflow-x-auto rounded-xl bg-dark-2/95 p-1.5 shadow-lg backdrop-blur" }, /* @__PURE__ */ e.createElement("span", { className: "flex shrink-0 items-center gap-1.5 px-2 text-xs font-medium text-white/70" }, /* @__PURE__ */ e.createElement(r, { className: "h-3.5 w-3.5" }), n, " ", n === 1 ? "point" : "points"), /* @__PURE__ */ e.createElement("span", { className: "h-6 w-px shrink-0 bg-white/15" }), /* @__PURE__ */ e.createElement(
14
+ o,
15
+ {
16
+ onClick: t.undoLinePoint,
17
+ icon: /* @__PURE__ */ e.createElement(c, { className: "h-4 w-4" }),
18
+ label: "Undo point"
19
+ }
20
+ ), /* @__PURE__ */ e.createElement(
21
+ o,
22
+ {
23
+ onClick: t.closeLine,
24
+ icon: /* @__PURE__ */ e.createElement(r, { className: "h-4 w-4" }),
25
+ label: "Close shape",
26
+ disabled: !i
27
+ }
28
+ ), /* @__PURE__ */ e.createElement(
29
+ o,
30
+ {
31
+ onClick: t.finishLine,
32
+ icon: /* @__PURE__ */ e.createElement(m, { className: "h-4 w-4" }),
33
+ label: "Done",
34
+ disabled: !l,
35
+ primary: !0
36
+ }
37
+ ), /* @__PURE__ */ e.createElement(
38
+ o,
39
+ {
40
+ onClick: t.cancelLine,
41
+ icon: /* @__PURE__ */ e.createElement(p, { className: "h-4 w-4" }),
42
+ label: "Cancel"
43
+ }
44
+ ))
45
+ );
46
+ }
47
+ function o({
48
+ onClick: a,
49
+ icon: t,
50
+ label: n,
51
+ disabled: l,
52
+ primary: i
53
+ }) {
54
+ return /* @__PURE__ */ e.createElement(
55
+ "button",
56
+ {
57
+ type: "button",
58
+ onPointerDown: (s) => s.stopPropagation(),
59
+ onClick: (s) => {
60
+ s.stopPropagation(), a();
61
+ },
62
+ disabled: l,
63
+ "aria-label": n,
64
+ className: [
65
+ "flex min-h-9 shrink-0 items-center gap-1.5 rounded-lg px-2.5 text-xs font-medium transition-colors",
66
+ "disabled:pointer-events-none disabled:opacity-40",
67
+ i ? "bg-rest-p1 text-white hover:bg-hover-p1" : "text-white/85 hover:bg-white/10"
68
+ ].join(" ")
69
+ },
70
+ t,
71
+ /* @__PURE__ */ e.createElement("span", { className: "hidden sm:inline" }, n)
72
+ );
21
73
  }
22
74
  export {
23
- f as Panel
75
+ u as LineSessionBar
24
76
  };
25
77
  //# sourceMappingURL=index.es141.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.es141.js","sources":["../src/components/organisms/image-editor/components/panel.tsx"],"sourcesContent":["import React from 'react'\n\nimport {\n ImageEditorEngine,\n ImageEditorMode,\n ImageEditorUiState,\n} from '../image-editor.types'\nimport { LayersList } from './layers-list'\nimport { PanelAdjust } from './panel-adjust'\nimport { PanelCrop } from './panel-crop'\nimport { PanelInsert } from './panel-insert'\nimport { PanelSelected } from './panel-selected'\n\ninterface PanelProps {\n ui: ImageEditorUiState\n engine: ImageEditorEngine\n}\n\nconst PANEL_HEADERS: Record<ImageEditorMode, { title: string; sub: string }> = {\n select: {\n title: 'Adjust & layers',\n sub: 'Adjust the photo, or click a layer',\n },\n crop: { title: 'Crop', sub: 'Trim to a region' },\n text: { title: 'Add text', sub: 'Click on the image to place' },\n draw: { title: 'Draw', sub: 'Freehand — becomes a layer' },\n shape: { title: 'Shape', sub: 'Drag to draw — becomes a layer' },\n sticker: { title: 'Stickers', sub: 'Click a sticker to drop it in' },\n}\n\nexport function Panel({ ui, engine }: PanelProps) {\n const header = PANEL_HEADERS[ui.mode]\n\n return (\n <aside className=\"image-editor-panel shrink-0 touch-pan-y overflow-y-auto overscroll-y-contain bg-light-3 p-4\">\n <h3 className=\"mb-1 text-base font-semibold\">{header.title}</h3>\n <p className=\"mb-3.5 text-xs text-light-4\">{header.sub}</p>\n\n {ui.mode === 'select' && ui.selected == null && (\n <PanelAdjust adjustments={ui.adjustments} engine={engine} />\n )}\n {ui.mode === 'select' && ui.selected != null && (\n <PanelSelected selected={ui.selected} engine={engine} />\n )}\n {ui.mode === 'crop' && <PanelCrop ui={ui} engine={engine} />}\n {(ui.mode === 'text' ||\n ui.mode === 'draw' ||\n ui.mode === 'shape' ||\n ui.mode === 'sticker') && <PanelInsert ui={ui} engine={engine} />}\n\n {ui.hasImage && <LayersList ui={ui} engine={engine} />}\n </aside>\n )\n}\n"],"names":["PANEL_HEADERS","Panel","ui","engine","header","React","PanelAdjust","PanelSelected","PanelCrop","PanelInsert","LayersList"],"mappings":";;;;;;AAkBA,MAAMA,IAAyE;AAAA,EAC7E,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,EAAA;AAAA,EAEP,MAAM,EAAE,OAAO,QAAQ,KAAK,mBAAA;AAAA,EAC5B,MAAM,EAAE,OAAO,YAAY,KAAK,8BAAA;AAAA,EAChC,MAAM,EAAE,OAAO,QAAQ,KAAK,6BAAA;AAAA,EAC5B,OAAO,EAAE,OAAO,SAAS,KAAK,iCAAA;AAAA,EAC9B,SAAS,EAAE,OAAO,YAAY,KAAK,gCAAA;AACrC;AAEO,SAASC,EAAM,EAAE,IAAAC,GAAI,QAAAC,KAAsB;AAChD,QAAMC,IAASJ,EAAcE,EAAG,IAAI;AAEpC,SACEG,gBAAAA,EAAA,cAAC,SAAA,EAAM,WAAU,iIACd,MAAA,EAAG,WAAU,+BAAA,GAAgCD,EAAO,KAAM,GAC3DC,gBAAAA,EAAA,cAAC,KAAA,EAAE,WAAU,iCAA+BD,EAAO,GAAI,GAEtDF,EAAG,SAAS,YAAYA,EAAG,YAAY,wCACrCI,GAAA,EAAY,aAAaJ,EAAG,aAAa,QAAAC,GAAgB,GAE3DD,EAAG,SAAS,YAAYA,EAAG,YAAY,QACtCG,gBAAAA,EAAA,cAACE,GAAA,EAAc,UAAUL,EAAG,UAAU,QAAAC,GAAgB,GAEvDD,EAAG,SAAS,UAAUG,gBAAAA,EAAA,cAACG,GAAA,EAAU,IAAAN,GAAQ,QAAAC,EAAA,CAAgB,IACxDD,EAAG,SAAS,UACZA,EAAG,SAAS,UACZA,EAAG,SAAS,WACZA,EAAG,SAAS,8CAAeO,GAAA,EAAY,IAAAP,GAAQ,QAAAC,GAAgB,GAEhED,EAAG,YAAYG,gBAAAA,EAAA,cAACK,GAAA,EAAW,IAAAR,GAAQ,QAAAC,GAAgB,CACtD;AAEJ;"}
1
+ {"version":3,"file":"index.es141.js","sources":["../src/components/organisms/image-editor/components/line-session-bar.tsx"],"sourcesContent":["import { Check, CornerUpLeft, Spline, X } from 'lucide-react'\nimport React from 'react'\n\nimport { ImageEditorEngine, ImageEditorUiState } from '../image-editor.types'\n\ninterface LineSessionBarProps {\n ui: ImageEditorUiState\n engine: ImageEditorEngine\n}\n\n/**\n * On-screen controls for a live multi-point line.\n *\n * Touch has no Shift, Backspace, Enter or Escape, double-tap is unreliable\n * (and often zooms), and there is no hover to preview with -- so on a phone\n * these buttons are the *only* way to undo a corner or finish a line. They\n * show on every device rather than only small screens, because the same\n * ambiguity (\"how do I stop drawing?\") exists with a mouse.\n *\n * Rendered over the stage, bottom-centre, clear of the toolbar and panel.\n */\nexport function LineSessionBar({ ui, engine }: LineSessionBarProps) {\n if (!ui.poly?.active) return null\n const { pointCount, canFinish, canClose } = ui.poly\n\n return (\n <div\n className=\"pointer-events-none absolute inset-x-0 bottom-3 z-20 flex justify-center px-3\"\n role=\"toolbar\"\n aria-label=\"Multi-point line controls\"\n >\n <div className=\"pointer-events-auto flex max-w-full items-center gap-1 overflow-x-auto rounded-xl bg-dark-2/95 p-1.5 shadow-lg backdrop-blur\">\n <span className=\"flex shrink-0 items-center gap-1.5 px-2 text-xs font-medium text-white/70\">\n <Spline className=\"h-3.5 w-3.5\" />\n {pointCount} {pointCount === 1 ? 'point' : 'points'}\n </span>\n\n <span className=\"h-6 w-px shrink-0 bg-white/15\" />\n\n <SessionButton\n onClick={engine.undoLinePoint}\n icon={<CornerUpLeft className=\"h-4 w-4\" />}\n label=\"Undo point\"\n />\n <SessionButton\n onClick={engine.closeLine}\n icon={<Spline className=\"h-4 w-4\" />}\n label=\"Close shape\"\n disabled={!canClose}\n />\n <SessionButton\n onClick={engine.finishLine}\n icon={<Check className=\"h-4 w-4\" />}\n label=\"Done\"\n disabled={!canFinish}\n primary\n />\n <SessionButton\n onClick={engine.cancelLine}\n icon={<X className=\"h-4 w-4\" />}\n label=\"Cancel\"\n />\n </div>\n </div>\n )\n}\n\ninterface SessionButtonProps {\n onClick: () => void\n icon: React.ReactNode\n label: string\n disabled?: boolean\n primary?: boolean\n}\n\nfunction SessionButton({\n onClick,\n icon,\n label,\n disabled,\n primary,\n}: SessionButtonProps) {\n return (\n <button\n type=\"button\"\n // Pointer events would reach the canvas underneath and place a stray\n // point, so the press is stopped here before it can bubble to the stage.\n onPointerDown={(e) => e.stopPropagation()}\n onClick={(e) => {\n e.stopPropagation()\n onClick()\n }}\n disabled={disabled}\n aria-label={label}\n className={[\n 'flex min-h-9 shrink-0 items-center gap-1.5 rounded-lg px-2.5 text-xs font-medium transition-colors',\n 'disabled:pointer-events-none disabled:opacity-40',\n primary\n ? 'bg-rest-p1 text-white hover:bg-hover-p1'\n : 'text-white/85 hover:bg-white/10',\n ].join(' ')}\n >\n {icon}\n <span className=\"hidden sm:inline\">{label}</span>\n </button>\n )\n}\n"],"names":["LineSessionBar","ui","engine","pointCount","canFinish","canClose","React","Spline","SessionButton","CornerUpLeft","Check","X","onClick","icon","label","disabled","primary","e"],"mappings":";;AAqBO,SAASA,EAAe,EAAE,IAAAC,GAAI,QAAAC,KAA+B;AAClE,MAAI,CAACD,EAAG,MAAM,OAAQ,QAAO;AAC7B,QAAM,EAAE,YAAAE,GAAY,WAAAC,GAAW,UAAAC,EAAA,IAAaJ,EAAG;AAE/C,SACEK,gBAAAA,EAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,MAAK;AAAA,MACL,cAAW;AAAA,IAAA;AAAA,IAEXA,gBAAAA,EAAA,cAAC,OAAA,EAAI,WAAU,+HAAA,GACbA,gBAAAA,EAAA,cAAC,UAAK,WAAU,4EAAA,GACdA,gBAAAA,EAAA,cAACC,GAAA,EAAO,WAAU,cAAA,CAAc,GAC/BJ,GAAW,KAAEA,MAAe,IAAI,UAAU,QAC7C,GAEAG,gBAAAA,EAAA,cAAC,QAAA,EAAK,WAAU,gCAAA,CAAgC,GAEhDA,gBAAAA,EAAA;AAAA,MAACE;AAAA,MAAA;AAAA,QACC,SAASN,EAAO;AAAA,QAChB,MAAMI,gBAAAA,EAAA,cAACG,GAAA,EAAa,WAAU,WAAU;AAAA,QACxC,OAAM;AAAA,MAAA;AAAA,IAAA,GAERH,gBAAAA,EAAA;AAAA,MAACE;AAAA,MAAA;AAAA,QACC,SAASN,EAAO;AAAA,QAChB,MAAMI,gBAAAA,EAAA,cAACC,GAAA,EAAO,WAAU,WAAU;AAAA,QAClC,OAAM;AAAA,QACN,UAAU,CAACF;AAAA,MAAA;AAAA,IAAA,GAEbC,gBAAAA,EAAA;AAAA,MAACE;AAAA,MAAA;AAAA,QACC,SAASN,EAAO;AAAA,QAChB,MAAMI,gBAAAA,EAAA,cAACI,GAAA,EAAM,WAAU,WAAU;AAAA,QACjC,OAAM;AAAA,QACN,UAAU,CAACN;AAAA,QACX,SAAO;AAAA,MAAA;AAAA,IAAA,GAETE,gBAAAA,EAAA;AAAA,MAACE;AAAA,MAAA;AAAA,QACC,SAASN,EAAO;AAAA,QAChB,MAAMI,gBAAAA,EAAA,cAACK,GAAA,EAAE,WAAU,WAAU;AAAA,QAC7B,OAAM;AAAA,MAAA;AAAA,IAAA,CAEV;AAAA,EAAA;AAGN;AAUA,SAASH,EAAc;AAAA,EACrB,SAAAI;AAAA,EACA,MAAAC;AAAA,EACA,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,SAAAC;AACF,GAAuB;AACrB,SACEV,gBAAAA,EAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MAGL,eAAe,CAACW,MAAMA,EAAE,gBAAA;AAAA,MACxB,SAAS,CAACA,MAAM;AACd,QAAAA,EAAE,gBAAA,GACFL,EAAA;AAAA,MACF;AAAA,MACA,UAAAG;AAAA,MACA,cAAYD;AAAA,MACZ,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACAE,IACI,4CACA;AAAA,MAAA,EACJ,KAAK,GAAG;AAAA,IAAA;AAAA,IAETH;AAAA,IACDP,gBAAAA,EAAA,cAAC,QAAA,EAAK,WAAU,mBAAA,GAAoBQ,CAAM;AAAA,EAAA;AAGhD;"}