shipscreens 0.1.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 (605) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +27 -0
  3. package/bin/shipscreens.js +664 -0
  4. package/cli/assetRefs.js +33 -0
  5. package/cli/auth.js +454 -0
  6. package/cli/buildOutputs.js +146 -0
  7. package/cli/commands/auth.js +65 -0
  8. package/cli/commands/build.js +347 -0
  9. package/cli/commands/copyImport.js +263 -0
  10. package/cli/commands/exportFramefile.js +404 -0
  11. package/cli/commands/init.js +339 -0
  12. package/cli/commands/lock.js +144 -0
  13. package/cli/commands/plan.js +203 -0
  14. package/cli/commands/stage.js +318 -0
  15. package/cli/commands/validate.js +89 -0
  16. package/cli/commands/verify.js +659 -0
  17. package/cli/commands/wizard.js +266 -0
  18. package/cli/dataUrl.js +19 -0
  19. package/cli/fastlaneZip.js +115 -0
  20. package/cli/hash.js +13 -0
  21. package/cli/loadConfig.js +55 -0
  22. package/cli/outputPaths.js +24 -0
  23. package/cli/packageRoot.js +8 -0
  24. package/cli/pathUtils.js +25 -0
  25. package/cli/rendererServer.js +48 -0
  26. package/cli/repoRoot.js +23 -0
  27. package/cli/rootPolicy.js +17 -0
  28. package/cli/schema.js +290 -0
  29. package/cli/snapshotFromConfig.js +116 -0
  30. package/cli/staticServer.js +102 -0
  31. package/cli/templateConfig.js +51 -0
  32. package/cli/viteServer.js +40 -0
  33. package/dist/app/apple-touch-icon.png +0 -0
  34. package/dist/app/assets/AgentCli-8e28laT4.js +17 -0
  35. package/dist/app/assets/AgentCli-8e28laT4.js.map +1 -0
  36. package/dist/app/assets/App-DU0xew0e.js +13 -0
  37. package/dist/app/assets/App-DU0xew0e.js.map +1 -0
  38. package/dist/app/assets/AppReviewAso-OLwc4Rw_.js +4 -0
  39. package/dist/app/assets/AppReviewAso-OLwc4Rw_.js.map +1 -0
  40. package/dist/app/assets/Cancelled-BoeZQa1S.js +2 -0
  41. package/dist/app/assets/Cancelled-BoeZQa1S.js.map +1 -0
  42. package/dist/app/assets/CliPreflightCard-CxYyogdF.js +2 -0
  43. package/dist/app/assets/CliPreflightCard-CxYyogdF.js.map +1 -0
  44. package/dist/app/assets/CopyButton-CGfuSJtU.js +2 -0
  45. package/dist/app/assets/CopyButton-CGfuSJtU.js.map +1 -0
  46. package/dist/app/assets/FastlaneScreenshots-CFT6IiRb.js +52 -0
  47. package/dist/app/assets/FastlaneScreenshots-CFT6IiRb.js.map +1 -0
  48. package/dist/app/assets/FirstExport-B_UDacZm.js +6 -0
  49. package/dist/app/assets/FirstExport-B_UDacZm.js.map +1 -0
  50. package/dist/app/assets/FivePanelFramework-C1z_xUbe.js +60 -0
  51. package/dist/app/assets/FivePanelFramework-C1z_xUbe.js.map +1 -0
  52. package/dist/app/assets/ForgotPassword-ZQ8U3ejz.js +2 -0
  53. package/dist/app/assets/ForgotPassword-ZQ8U3ejz.js.map +1 -0
  54. package/dist/app/assets/Landing-DAIP71DD.js +2 -0
  55. package/dist/app/assets/Landing-DAIP71DD.js.map +1 -0
  56. package/dist/app/assets/LanguageSwitcher-D93nCuuR.js +2 -0
  57. package/dist/app/assets/LanguageSwitcher-D93nCuuR.js.map +1 -0
  58. package/dist/app/assets/Legal-Koe7vi6H.js +2 -0
  59. package/dist/app/assets/Legal-Koe7vi6H.js.map +1 -0
  60. package/dist/app/assets/NotFound-CfY31vMZ.js +2 -0
  61. package/dist/app/assets/NotFound-CfY31vMZ.js.map +1 -0
  62. package/dist/app/assets/Pricing-BQwtFVbj.js +2 -0
  63. package/dist/app/assets/Pricing-BQwtFVbj.js.map +1 -0
  64. package/dist/app/assets/Privacy-CaHf2UM7.js +2 -0
  65. package/dist/app/assets/Privacy-CaHf2UM7.js.map +1 -0
  66. package/dist/app/assets/SignIn-Cyi2_-Mn.js +2 -0
  67. package/dist/app/assets/SignIn-Cyi2_-Mn.js.map +1 -0
  68. package/dist/app/assets/SignUp-C9QH5po_.js +2 -0
  69. package/dist/app/assets/SignUp-C9QH5po_.js.map +1 -0
  70. package/dist/app/assets/SiteHeader-Dj3gDOnR.js +2 -0
  71. package/dist/app/assets/SiteHeader-Dj3gDOnR.js.map +1 -0
  72. package/dist/app/assets/StickyMobileCta-uyWGVhdc.js +2 -0
  73. package/dist/app/assets/StickyMobileCta-uyWGVhdc.js.map +1 -0
  74. package/dist/app/assets/StoreAssetsPipeline-BJlnD3kD.js +4 -0
  75. package/dist/app/assets/StoreAssetsPipeline-BJlnD3kD.js.map +1 -0
  76. package/dist/app/assets/Success-B7k7FvJj.js +2 -0
  77. package/dist/app/assets/Success-B7k7FvJj.js.map +1 -0
  78. package/dist/app/assets/Terms-DgJWOeUD.js +2 -0
  79. package/dist/app/assets/Terms-DgJWOeUD.js.map +1 -0
  80. package/dist/app/assets/ToolsIndex-xMPoFom9.js +6 -0
  81. package/dist/app/assets/ToolsIndex-xMPoFom9.js.map +1 -0
  82. package/dist/app/assets/WorkloadCalculator-Bdt6qPR3.js +5 -0
  83. package/dist/app/assets/WorkloadCalculator-Bdt6qPR3.js.map +1 -0
  84. package/dist/app/assets/calculator-CWfp5Day.js +2 -0
  85. package/dist/app/assets/calculator-CWfp5Day.js.map +1 -0
  86. package/dist/app/assets/check-BWCiUZ-C.js +2 -0
  87. package/dist/app/assets/check-BWCiUZ-C.js.map +1 -0
  88. package/dist/app/assets/chevron-down-DbSAem1L.js +2 -0
  89. package/dist/app/assets/chevron-down-DbSAem1L.js.map +1 -0
  90. package/dist/app/assets/circle-check-CeakjiXC.js +2 -0
  91. package/dist/app/assets/circle-check-CeakjiXC.js.map +1 -0
  92. package/dist/app/assets/clipboard-copy-DgTgnK84.js +2 -0
  93. package/dist/app/assets/clipboard-copy-DgTgnK84.js.map +1 -0
  94. package/dist/app/assets/copy-C9t_FzCZ.js +2 -0
  95. package/dist/app/assets/copy-C9t_FzCZ.js.map +1 -0
  96. package/dist/app/assets/crop-B7IxIx6D.js +2 -0
  97. package/dist/app/assets/crop-B7IxIx6D.js.map +1 -0
  98. package/dist/app/assets/download-65Zuvgwm.js +2 -0
  99. package/dist/app/assets/download-65Zuvgwm.js.map +1 -0
  100. package/dist/app/assets/eye-ouNo8Nv5.js +2 -0
  101. package/dist/app/assets/eye-ouNo8Nv5.js.map +1 -0
  102. package/dist/app/assets/grid-3x3-U1Nk_ppf.js +2 -0
  103. package/dist/app/assets/grid-3x3-U1Nk_ppf.js.map +1 -0
  104. package/dist/app/assets/hero/cli-build-tree-15s.mp4 +0 -0
  105. package/dist/app/assets/hero/cli-build-tree-15s.webm +0 -0
  106. package/dist/app/assets/hero/cli-build-tree-25s.mp4 +0 -0
  107. package/dist/app/assets/hero/cli-build-tree-25s.webm +0 -0
  108. package/dist/app/assets/hero/cli-build-tree-poster.png +0 -0
  109. package/dist/app/assets/hero/demo.gif +0 -0
  110. package/dist/app/assets/hero/demo.mp4 +0 -0
  111. package/dist/app/assets/hero/demo.webm +0 -0
  112. package/dist/app/assets/icons/apple-touch-icon.png +0 -0
  113. package/dist/app/assets/icons/device-base.png +0 -0
  114. package/dist/app/assets/icons/favicon-16x16.png +0 -0
  115. package/dist/app/assets/icons/favicon-32x32.png +0 -0
  116. package/dist/app/assets/icons/favicon.ico +0 -0
  117. package/dist/app/assets/icons/favicon.svg +1 -0
  118. package/dist/app/assets/index-B8Y8Y-Mi.js +180 -0
  119. package/dist/app/assets/index-B8Y8Y-Mi.js.map +1 -0
  120. package/dist/app/assets/index-hyiQFYGv.css +1 -0
  121. package/dist/app/assets/inter-cyrillic-400-normal-HOLc17fK.woff +0 -0
  122. package/dist/app/assets/inter-cyrillic-400-normal-obahsSVq.woff2 +0 -0
  123. package/dist/app/assets/inter-cyrillic-500-normal-BasfLYem.woff2 +0 -0
  124. package/dist/app/assets/inter-cyrillic-500-normal-CxZf_p3X.woff +0 -0
  125. package/dist/app/assets/inter-cyrillic-600-normal-4D_pXhcN.woff +0 -0
  126. package/dist/app/assets/inter-cyrillic-600-normal-CWCymEST.woff2 +0 -0
  127. package/dist/app/assets/inter-cyrillic-700-normal-CjBOestx.woff2 +0 -0
  128. package/dist/app/assets/inter-cyrillic-700-normal-DrXBdSj3.woff +0 -0
  129. package/dist/app/assets/inter-cyrillic-ext-400-normal-BQZuk6qB.woff2 +0 -0
  130. package/dist/app/assets/inter-cyrillic-ext-400-normal-DQukG94-.woff +0 -0
  131. package/dist/app/assets/inter-cyrillic-ext-500-normal-B0yAr1jD.woff2 +0 -0
  132. package/dist/app/assets/inter-cyrillic-ext-500-normal-BmqWE9Dz.woff +0 -0
  133. package/dist/app/assets/inter-cyrillic-ext-600-normal-Bcila6Z-.woff +0 -0
  134. package/dist/app/assets/inter-cyrillic-ext-600-normal-Dfes3d0z.woff2 +0 -0
  135. package/dist/app/assets/inter-cyrillic-ext-700-normal-BjwYoWNd.woff2 +0 -0
  136. package/dist/app/assets/inter-cyrillic-ext-700-normal-LO58E6JB.woff +0 -0
  137. package/dist/app/assets/inter-greek-400-normal-B4URO6DV.woff2 +0 -0
  138. package/dist/app/assets/inter-greek-400-normal-q2sYcFCs.woff +0 -0
  139. package/dist/app/assets/inter-greek-500-normal-BIZE56-Y.woff2 +0 -0
  140. package/dist/app/assets/inter-greek-500-normal-Xzm54t5V.woff +0 -0
  141. package/dist/app/assets/inter-greek-600-normal-BZpKdvQh.woff +0 -0
  142. package/dist/app/assets/inter-greek-600-normal-plRanbMR.woff2 +0 -0
  143. package/dist/app/assets/inter-greek-700-normal-BUv2fZ6O.woff +0 -0
  144. package/dist/app/assets/inter-greek-700-normal-C3JjAnD8.woff2 +0 -0
  145. package/dist/app/assets/inter-greek-ext-400-normal-DGGRlc-M.woff2 +0 -0
  146. package/dist/app/assets/inter-greek-ext-400-normal-KugGGMne.woff +0 -0
  147. package/dist/app/assets/inter-greek-ext-500-normal-2j5mBUwD.woff +0 -0
  148. package/dist/app/assets/inter-greek-ext-500-normal-C4iEst2y.woff2 +0 -0
  149. package/dist/app/assets/inter-greek-ext-600-normal-B8X0CLgF.woff +0 -0
  150. package/dist/app/assets/inter-greek-ext-600-normal-DRtmH8MT.woff2 +0 -0
  151. package/dist/app/assets/inter-greek-ext-700-normal-BoQ6DsYi.woff +0 -0
  152. package/dist/app/assets/inter-greek-ext-700-normal-qfdV9bQt.woff2 +0 -0
  153. package/dist/app/assets/inter-latin-400-normal-C38fXH4l.woff2 +0 -0
  154. package/dist/app/assets/inter-latin-400-normal-CyCys3Eg.woff +0 -0
  155. package/dist/app/assets/inter-latin-500-normal-BL9OpVg8.woff +0 -0
  156. package/dist/app/assets/inter-latin-500-normal-Cerq10X2.woff2 +0 -0
  157. package/dist/app/assets/inter-latin-600-normal-CiBQ2DWP.woff +0 -0
  158. package/dist/app/assets/inter-latin-600-normal-LgqL8muc.woff2 +0 -0
  159. package/dist/app/assets/inter-latin-700-normal-BLAVimhd.woff +0 -0
  160. package/dist/app/assets/inter-latin-700-normal-Yt3aPRUw.woff2 +0 -0
  161. package/dist/app/assets/inter-latin-ext-400-normal-77YHD8bZ.woff +0 -0
  162. package/dist/app/assets/inter-latin-ext-400-normal-C1nco2VV.woff2 +0 -0
  163. package/dist/app/assets/inter-latin-ext-500-normal-BxGbmqWO.woff +0 -0
  164. package/dist/app/assets/inter-latin-ext-500-normal-CV4jyFjo.woff2 +0 -0
  165. package/dist/app/assets/inter-latin-ext-600-normal-CIVaiw4L.woff +0 -0
  166. package/dist/app/assets/inter-latin-ext-600-normal-D2bJ5OIk.woff2 +0 -0
  167. package/dist/app/assets/inter-latin-ext-700-normal-Ca8adRJv.woff2 +0 -0
  168. package/dist/app/assets/inter-latin-ext-700-normal-TidjK2hL.woff +0 -0
  169. package/dist/app/assets/inter-vietnamese-400-normal-Bbgyi5SW.woff +0 -0
  170. package/dist/app/assets/inter-vietnamese-400-normal-DMkecbls.woff2 +0 -0
  171. package/dist/app/assets/inter-vietnamese-500-normal-DOriooB6.woff2 +0 -0
  172. package/dist/app/assets/inter-vietnamese-500-normal-mJboJaSs.woff +0 -0
  173. package/dist/app/assets/inter-vietnamese-600-normal-BuLX-rYi.woff +0 -0
  174. package/dist/app/assets/inter-vietnamese-600-normal-Cc8MFFhd.woff2 +0 -0
  175. package/dist/app/assets/inter-vietnamese-700-normal-BZaoP0fm.woff +0 -0
  176. package/dist/app/assets/inter-vietnamese-700-normal-DlLaEgI2.woff2 +0 -0
  177. package/dist/app/assets/layout-grid-X9Sgull2.js +2 -0
  178. package/dist/app/assets/layout-grid-X9Sgull2.js.map +1 -0
  179. package/dist/app/assets/merriweather-cyrillic-400-normal-AvfsDsMQ.woff2 +0 -0
  180. package/dist/app/assets/merriweather-cyrillic-400-normal-DAcQ8g-H.woff +0 -0
  181. package/dist/app/assets/merriweather-cyrillic-700-normal-CHCcU-4a.woff +0 -0
  182. package/dist/app/assets/merriweather-cyrillic-700-normal-wbY04GlL.woff2 +0 -0
  183. package/dist/app/assets/merriweather-cyrillic-ext-400-normal-D9NYhYTq.woff2 +0 -0
  184. package/dist/app/assets/merriweather-cyrillic-ext-400-normal-Di6yW_eE.woff +0 -0
  185. package/dist/app/assets/merriweather-cyrillic-ext-700-normal-Bk1p9YoV.woff2 +0 -0
  186. package/dist/app/assets/merriweather-cyrillic-ext-700-normal-DoooT6Vg.woff +0 -0
  187. package/dist/app/assets/merriweather-latin-400-normal-CvqO63Ah.woff +0 -0
  188. package/dist/app/assets/merriweather-latin-400-normal-G4kZaoXi.woff2 +0 -0
  189. package/dist/app/assets/merriweather-latin-700-normal-D4-nzrAh.woff +0 -0
  190. package/dist/app/assets/merriweather-latin-700-normal-DoUP8Ce-.woff2 +0 -0
  191. package/dist/app/assets/merriweather-latin-ext-400-normal-CLqijLtt.woff +0 -0
  192. package/dist/app/assets/merriweather-latin-ext-400-normal-CWVzVQq3.woff2 +0 -0
  193. package/dist/app/assets/merriweather-latin-ext-700-normal-CaBzXGOk.woff +0 -0
  194. package/dist/app/assets/merriweather-latin-ext-700-normal-jHnxg2Kc.woff2 +0 -0
  195. package/dist/app/assets/merriweather-vietnamese-400-normal-Dh8WVvgZ.woff +0 -0
  196. package/dist/app/assets/merriweather-vietnamese-400-normal-hNacsVs_.woff2 +0 -0
  197. package/dist/app/assets/merriweather-vietnamese-700-normal-Bp6kWjW5.woff2 +0 -0
  198. package/dist/app/assets/merriweather-vietnamese-700-normal-C7_HxHBa.woff +0 -0
  199. package/dist/app/assets/montserrat-cyrillic-400-normal-BPq32Q8K.woff2 +0 -0
  200. package/dist/app/assets/montserrat-cyrillic-400-normal-jEs4Tk-Z.woff +0 -0
  201. package/dist/app/assets/montserrat-cyrillic-700-normal-BvLYcGP1.woff +0 -0
  202. package/dist/app/assets/montserrat-cyrillic-700-normal-D-Pqjtdp.woff2 +0 -0
  203. package/dist/app/assets/montserrat-cyrillic-ext-400-normal-DRPPeomZ.woff +0 -0
  204. package/dist/app/assets/montserrat-cyrillic-ext-400-normal-Xqov12YL.woff2 +0 -0
  205. package/dist/app/assets/montserrat-cyrillic-ext-700-normal-D-Mk2xRJ.woff +0 -0
  206. package/dist/app/assets/montserrat-cyrillic-ext-700-normal-MyDreaeu.woff2 +0 -0
  207. package/dist/app/assets/montserrat-latin-400-normal-BLhwKU8k.woff2 +0 -0
  208. package/dist/app/assets/montserrat-latin-400-normal-xItZbAXg.woff +0 -0
  209. package/dist/app/assets/montserrat-latin-700-normal-BWkrl476.woff +0 -0
  210. package/dist/app/assets/montserrat-latin-700-normal-BdjcYUrC.woff2 +0 -0
  211. package/dist/app/assets/montserrat-latin-ext-400-normal-B8bwfy6Y.woff2 +0 -0
  212. package/dist/app/assets/montserrat-latin-ext-400-normal-BffdBkAA.woff +0 -0
  213. package/dist/app/assets/montserrat-latin-ext-700-normal-BOP2Nhf0.woff2 +0 -0
  214. package/dist/app/assets/montserrat-latin-ext-700-normal-DdDFr05Z.woff +0 -0
  215. package/dist/app/assets/montserrat-vietnamese-400-normal-BeEscFYY.woff +0 -0
  216. package/dist/app/assets/montserrat-vietnamese-400-normal-D4oHqQTd.woff2 +0 -0
  217. package/dist/app/assets/montserrat-vietnamese-700-normal-C0x1De3p.woff2 +0 -0
  218. package/dist/app/assets/montserrat-vietnamese-700-normal-DnwGT2D9.woff +0 -0
  219. package/dist/app/assets/playfair-display-cyrillic-400-normal-CjW2EstV.woff2 +0 -0
  220. package/dist/app/assets/playfair-display-cyrillic-400-normal-ZiRag6zj.woff +0 -0
  221. package/dist/app/assets/playfair-display-cyrillic-700-normal-Dk1mTcxf.woff +0 -0
  222. package/dist/app/assets/playfair-display-cyrillic-700-normal-Dw3uKy19.woff2 +0 -0
  223. package/dist/app/assets/playfair-display-latin-400-normal-CFtfchNt.woff2 +0 -0
  224. package/dist/app/assets/playfair-display-latin-400-normal-DHYHbkg3.woff +0 -0
  225. package/dist/app/assets/playfair-display-latin-700-normal-Bc_1Q1cG.woff +0 -0
  226. package/dist/app/assets/playfair-display-latin-700-normal-CuDiGg7c.woff2 +0 -0
  227. package/dist/app/assets/playfair-display-latin-ext-400-normal-BxlSGspa.woff2 +0 -0
  228. package/dist/app/assets/playfair-display-latin-ext-400-normal-qdZwdvNS.woff +0 -0
  229. package/dist/app/assets/playfair-display-latin-ext-700-normal-C58ejOkc.woff2 +0 -0
  230. package/dist/app/assets/playfair-display-latin-ext-700-normal-D5HUU8GT.woff +0 -0
  231. package/dist/app/assets/playfair-display-vietnamese-400-normal-BV2APVTb.woff2 +0 -0
  232. package/dist/app/assets/playfair-display-vietnamese-400-normal-BbvUAu4N.woff +0 -0
  233. package/dist/app/assets/playfair-display-vietnamese-700-normal-CaKJSIny.woff2 +0 -0
  234. package/dist/app/assets/playfair-display-vietnamese-700-normal-Cr1rw0mr.woff +0 -0
  235. package/dist/app/assets/proof/output-01.png +0 -0
  236. package/dist/app/assets/proof/output-02.png +0 -0
  237. package/dist/app/assets/proof/output-03.png +0 -0
  238. package/dist/app/assets/proof/output-04.png +0 -0
  239. package/dist/app/assets/roboto-cyrillic-400-normal-DAIM1_dR.woff2 +0 -0
  240. package/dist/app/assets/roboto-cyrillic-400-normal-DZJji7Rx.woff +0 -0
  241. package/dist/app/assets/roboto-cyrillic-500-normal-BI4HuXre.woff +0 -0
  242. package/dist/app/assets/roboto-cyrillic-500-normal-hCeO1jFL.woff2 +0 -0
  243. package/dist/app/assets/roboto-cyrillic-700-normal-BiSG5NnW.woff2 +0 -0
  244. package/dist/app/assets/roboto-cyrillic-700-normal-KqaQ5bNp.woff +0 -0
  245. package/dist/app/assets/roboto-cyrillic-ext-400-normal-DtZHuW6i.woff +0 -0
  246. package/dist/app/assets/roboto-cyrillic-ext-400-normal-DzMWdK87.woff2 +0 -0
  247. package/dist/app/assets/roboto-cyrillic-ext-500-normal-B7rQpwPu.woff2 +0 -0
  248. package/dist/app/assets/roboto-cyrillic-ext-500-normal-C927yMrb.woff +0 -0
  249. package/dist/app/assets/roboto-cyrillic-ext-700-normal-BuQgZIrO.woff +0 -0
  250. package/dist/app/assets/roboto-cyrillic-ext-700-normal-UFn0vR9r.woff2 +0 -0
  251. package/dist/app/assets/roboto-greek-400-normal-CcizSnRP.woff +0 -0
  252. package/dist/app/assets/roboto-greek-400-normal-jFM2czAU.woff2 +0 -0
  253. package/dist/app/assets/roboto-greek-500-normal-BJMS0heP.woff2 +0 -0
  254. package/dist/app/assets/roboto-greek-500-normal-BLLWU9W-.woff +0 -0
  255. package/dist/app/assets/roboto-greek-700-normal-BcGn9doz.woff2 +0 -0
  256. package/dist/app/assets/roboto-greek-700-normal-D3kmAf0K.woff +0 -0
  257. package/dist/app/assets/roboto-latin-400-normal-068yxgMN.woff +0 -0
  258. package/dist/app/assets/roboto-latin-400-normal-CNwBRw8h.woff2 +0 -0
  259. package/dist/app/assets/roboto-latin-500-normal-CC5nhZkh.woff +0 -0
  260. package/dist/app/assets/roboto-latin-500-normal-CkrA1NAy.woff2 +0 -0
  261. package/dist/app/assets/roboto-latin-700-normal-CXeAXeti.woff2 +0 -0
  262. package/dist/app/assets/roboto-latin-700-normal-DUekQERp.woff +0 -0
  263. package/dist/app/assets/roboto-latin-ext-400-normal-ZYmyxeOy.woff2 +0 -0
  264. package/dist/app/assets/roboto-latin-ext-400-normal-eTRLN0Nt.woff +0 -0
  265. package/dist/app/assets/roboto-latin-ext-500-normal-C_ARlJGk.woff2 +0 -0
  266. package/dist/app/assets/roboto-latin-ext-500-normal-FFcS8vBN.woff +0 -0
  267. package/dist/app/assets/roboto-latin-ext-700-normal-70GS1MYH.woff2 +0 -0
  268. package/dist/app/assets/roboto-latin-ext-700-normal-BS1OuQqR.woff +0 -0
  269. package/dist/app/assets/roboto-math-400-normal-B3wgz80t.woff2 +0 -0
  270. package/dist/app/assets/roboto-math-400-normal-rzxYvyVt.woff +0 -0
  271. package/dist/app/assets/roboto-math-500-normal-CFNaIMFC.woff2 +0 -0
  272. package/dist/app/assets/roboto-math-500-normal-DaFX-ZC8.woff +0 -0
  273. package/dist/app/assets/roboto-math-700-normal-VUAI6Bz2.woff2 +0 -0
  274. package/dist/app/assets/roboto-math-700-normal-pYD1nhov.woff +0 -0
  275. package/dist/app/assets/roboto-symbols-400-normal-Tzuungub.woff +0 -0
  276. package/dist/app/assets/roboto-symbols-400-normal-fF1SLJBj.woff2 +0 -0
  277. package/dist/app/assets/roboto-symbols-500-normal-BXFTxrNR.woff2 +0 -0
  278. package/dist/app/assets/roboto-symbols-500-normal-CAhAe-ik.woff +0 -0
  279. package/dist/app/assets/roboto-symbols-700-normal-CuuvBBxy.woff +0 -0
  280. package/dist/app/assets/roboto-symbols-700-normal-rJi6RjIy.woff2 +0 -0
  281. package/dist/app/assets/roboto-vietnamese-400-normal-CDDxGrUb.woff2 +0 -0
  282. package/dist/app/assets/roboto-vietnamese-400-normal-DmXaN3yE.woff +0 -0
  283. package/dist/app/assets/roboto-vietnamese-500-normal-DW96CsrR.woff +0 -0
  284. package/dist/app/assets/roboto-vietnamese-500-normal-HYpufUYk.woff2 +0 -0
  285. package/dist/app/assets/roboto-vietnamese-700-normal-Dz0HwF-w.woff +0 -0
  286. package/dist/app/assets/roboto-vietnamese-700-normal-iKxYNAzq.woff2 +0 -0
  287. package/dist/app/assets/rocket-BjOXauLe.js +2 -0
  288. package/dist/app/assets/rocket-BjOXauLe.js.map +1 -0
  289. package/dist/app/assets/shield-check-CFNhE_aD.js +2 -0
  290. package/dist/app/assets/shield-check-CFNhE_aD.js.map +1 -0
  291. package/dist/app/assets/signIn-CVoSzqCz.js +2 -0
  292. package/dist/app/assets/signIn-CVoSzqCz.js.map +1 -0
  293. package/dist/app/assets/smartphone-BcQB9gIh.js +2 -0
  294. package/dist/app/assets/smartphone-BcQB9gIh.js.map +1 -0
  295. package/dist/app/assets/terminal-CGhryJds.js +2 -0
  296. package/dist/app/assets/terminal-CGhryJds.js.map +1 -0
  297. package/dist/app/assets/useAuth-lZZC20Tl.js +4 -0
  298. package/dist/app/assets/useAuth-lZZC20Tl.js.map +1 -0
  299. package/dist/app/favicon-16x16.png +0 -0
  300. package/dist/app/favicon-32x32.png +0 -0
  301. package/dist/app/favicon.ico +0 -0
  302. package/dist/app/favicon.svg +10 -0
  303. package/dist/app/index.html +43 -0
  304. package/dist/apple-touch-icon.png +0 -0
  305. package/dist/assets/AgentCli-8e28laT4.js +17 -0
  306. package/dist/assets/AgentCli-8e28laT4.js.map +1 -0
  307. package/dist/assets/App-DU0xew0e.js +13 -0
  308. package/dist/assets/App-DU0xew0e.js.map +1 -0
  309. package/dist/assets/AppReviewAso-OLwc4Rw_.js +4 -0
  310. package/dist/assets/AppReviewAso-OLwc4Rw_.js.map +1 -0
  311. package/dist/assets/Cancelled-BoeZQa1S.js +2 -0
  312. package/dist/assets/Cancelled-BoeZQa1S.js.map +1 -0
  313. package/dist/assets/CliPreflightCard-CxYyogdF.js +2 -0
  314. package/dist/assets/CliPreflightCard-CxYyogdF.js.map +1 -0
  315. package/dist/assets/CopyButton-CGfuSJtU.js +2 -0
  316. package/dist/assets/CopyButton-CGfuSJtU.js.map +1 -0
  317. package/dist/assets/FastlaneScreenshots-CFT6IiRb.js +52 -0
  318. package/dist/assets/FastlaneScreenshots-CFT6IiRb.js.map +1 -0
  319. package/dist/assets/FirstExport-B_UDacZm.js +6 -0
  320. package/dist/assets/FirstExport-B_UDacZm.js.map +1 -0
  321. package/dist/assets/FivePanelFramework-C1z_xUbe.js +60 -0
  322. package/dist/assets/FivePanelFramework-C1z_xUbe.js.map +1 -0
  323. package/dist/assets/ForgotPassword-ZQ8U3ejz.js +2 -0
  324. package/dist/assets/ForgotPassword-ZQ8U3ejz.js.map +1 -0
  325. package/dist/assets/Landing-DAIP71DD.js +2 -0
  326. package/dist/assets/Landing-DAIP71DD.js.map +1 -0
  327. package/dist/assets/LanguageSwitcher-D93nCuuR.js +2 -0
  328. package/dist/assets/LanguageSwitcher-D93nCuuR.js.map +1 -0
  329. package/dist/assets/Legal-Koe7vi6H.js +2 -0
  330. package/dist/assets/Legal-Koe7vi6H.js.map +1 -0
  331. package/dist/assets/NotFound-CfY31vMZ.js +2 -0
  332. package/dist/assets/NotFound-CfY31vMZ.js.map +1 -0
  333. package/dist/assets/Pricing-BQwtFVbj.js +2 -0
  334. package/dist/assets/Pricing-BQwtFVbj.js.map +1 -0
  335. package/dist/assets/Privacy-CaHf2UM7.js +2 -0
  336. package/dist/assets/Privacy-CaHf2UM7.js.map +1 -0
  337. package/dist/assets/SignIn-Cyi2_-Mn.js +2 -0
  338. package/dist/assets/SignIn-Cyi2_-Mn.js.map +1 -0
  339. package/dist/assets/SignUp-C9QH5po_.js +2 -0
  340. package/dist/assets/SignUp-C9QH5po_.js.map +1 -0
  341. package/dist/assets/SiteHeader-Dj3gDOnR.js +2 -0
  342. package/dist/assets/SiteHeader-Dj3gDOnR.js.map +1 -0
  343. package/dist/assets/StickyMobileCta-uyWGVhdc.js +2 -0
  344. package/dist/assets/StickyMobileCta-uyWGVhdc.js.map +1 -0
  345. package/dist/assets/StoreAssetsPipeline-BJlnD3kD.js +4 -0
  346. package/dist/assets/StoreAssetsPipeline-BJlnD3kD.js.map +1 -0
  347. package/dist/assets/Success-B7k7FvJj.js +2 -0
  348. package/dist/assets/Success-B7k7FvJj.js.map +1 -0
  349. package/dist/assets/Terms-DgJWOeUD.js +2 -0
  350. package/dist/assets/Terms-DgJWOeUD.js.map +1 -0
  351. package/dist/assets/ToolsIndex-xMPoFom9.js +6 -0
  352. package/dist/assets/ToolsIndex-xMPoFom9.js.map +1 -0
  353. package/dist/assets/WorkloadCalculator-Bdt6qPR3.js +5 -0
  354. package/dist/assets/WorkloadCalculator-Bdt6qPR3.js.map +1 -0
  355. package/dist/assets/calculator-CWfp5Day.js +2 -0
  356. package/dist/assets/calculator-CWfp5Day.js.map +1 -0
  357. package/dist/assets/check-BWCiUZ-C.js +2 -0
  358. package/dist/assets/check-BWCiUZ-C.js.map +1 -0
  359. package/dist/assets/chevron-down-DbSAem1L.js +2 -0
  360. package/dist/assets/chevron-down-DbSAem1L.js.map +1 -0
  361. package/dist/assets/circle-check-CeakjiXC.js +2 -0
  362. package/dist/assets/circle-check-CeakjiXC.js.map +1 -0
  363. package/dist/assets/clipboard-copy-DgTgnK84.js +2 -0
  364. package/dist/assets/clipboard-copy-DgTgnK84.js.map +1 -0
  365. package/dist/assets/copy-C9t_FzCZ.js +2 -0
  366. package/dist/assets/copy-C9t_FzCZ.js.map +1 -0
  367. package/dist/assets/crop-B7IxIx6D.js +2 -0
  368. package/dist/assets/crop-B7IxIx6D.js.map +1 -0
  369. package/dist/assets/download-65Zuvgwm.js +2 -0
  370. package/dist/assets/download-65Zuvgwm.js.map +1 -0
  371. package/dist/assets/eye-ouNo8Nv5.js +2 -0
  372. package/dist/assets/eye-ouNo8Nv5.js.map +1 -0
  373. package/dist/assets/grid-3x3-U1Nk_ppf.js +2 -0
  374. package/dist/assets/grid-3x3-U1Nk_ppf.js.map +1 -0
  375. package/dist/assets/hero/cli-build-tree-15s.mp4 +0 -0
  376. package/dist/assets/hero/cli-build-tree-15s.webm +0 -0
  377. package/dist/assets/hero/cli-build-tree-25s.mp4 +0 -0
  378. package/dist/assets/hero/cli-build-tree-25s.webm +0 -0
  379. package/dist/assets/hero/cli-build-tree-poster.png +0 -0
  380. package/dist/assets/hero/demo.gif +0 -0
  381. package/dist/assets/hero/demo.mp4 +0 -0
  382. package/dist/assets/hero/demo.webm +0 -0
  383. package/dist/assets/icons/apple-touch-icon.png +0 -0
  384. package/dist/assets/icons/device-base.png +0 -0
  385. package/dist/assets/icons/favicon-16x16.png +0 -0
  386. package/dist/assets/icons/favicon-32x32.png +0 -0
  387. package/dist/assets/icons/favicon.ico +0 -0
  388. package/dist/assets/icons/favicon.svg +1 -0
  389. package/dist/assets/index-B8Y8Y-Mi.js +180 -0
  390. package/dist/assets/index-B8Y8Y-Mi.js.map +1 -0
  391. package/dist/assets/index-hyiQFYGv.css +1 -0
  392. package/dist/assets/inter-cyrillic-400-normal-HOLc17fK.woff +0 -0
  393. package/dist/assets/inter-cyrillic-400-normal-obahsSVq.woff2 +0 -0
  394. package/dist/assets/inter-cyrillic-500-normal-BasfLYem.woff2 +0 -0
  395. package/dist/assets/inter-cyrillic-500-normal-CxZf_p3X.woff +0 -0
  396. package/dist/assets/inter-cyrillic-600-normal-4D_pXhcN.woff +0 -0
  397. package/dist/assets/inter-cyrillic-600-normal-CWCymEST.woff2 +0 -0
  398. package/dist/assets/inter-cyrillic-700-normal-CjBOestx.woff2 +0 -0
  399. package/dist/assets/inter-cyrillic-700-normal-DrXBdSj3.woff +0 -0
  400. package/dist/assets/inter-cyrillic-ext-400-normal-BQZuk6qB.woff2 +0 -0
  401. package/dist/assets/inter-cyrillic-ext-400-normal-DQukG94-.woff +0 -0
  402. package/dist/assets/inter-cyrillic-ext-500-normal-B0yAr1jD.woff2 +0 -0
  403. package/dist/assets/inter-cyrillic-ext-500-normal-BmqWE9Dz.woff +0 -0
  404. package/dist/assets/inter-cyrillic-ext-600-normal-Bcila6Z-.woff +0 -0
  405. package/dist/assets/inter-cyrillic-ext-600-normal-Dfes3d0z.woff2 +0 -0
  406. package/dist/assets/inter-cyrillic-ext-700-normal-BjwYoWNd.woff2 +0 -0
  407. package/dist/assets/inter-cyrillic-ext-700-normal-LO58E6JB.woff +0 -0
  408. package/dist/assets/inter-greek-400-normal-B4URO6DV.woff2 +0 -0
  409. package/dist/assets/inter-greek-400-normal-q2sYcFCs.woff +0 -0
  410. package/dist/assets/inter-greek-500-normal-BIZE56-Y.woff2 +0 -0
  411. package/dist/assets/inter-greek-500-normal-Xzm54t5V.woff +0 -0
  412. package/dist/assets/inter-greek-600-normal-BZpKdvQh.woff +0 -0
  413. package/dist/assets/inter-greek-600-normal-plRanbMR.woff2 +0 -0
  414. package/dist/assets/inter-greek-700-normal-BUv2fZ6O.woff +0 -0
  415. package/dist/assets/inter-greek-700-normal-C3JjAnD8.woff2 +0 -0
  416. package/dist/assets/inter-greek-ext-400-normal-DGGRlc-M.woff2 +0 -0
  417. package/dist/assets/inter-greek-ext-400-normal-KugGGMne.woff +0 -0
  418. package/dist/assets/inter-greek-ext-500-normal-2j5mBUwD.woff +0 -0
  419. package/dist/assets/inter-greek-ext-500-normal-C4iEst2y.woff2 +0 -0
  420. package/dist/assets/inter-greek-ext-600-normal-B8X0CLgF.woff +0 -0
  421. package/dist/assets/inter-greek-ext-600-normal-DRtmH8MT.woff2 +0 -0
  422. package/dist/assets/inter-greek-ext-700-normal-BoQ6DsYi.woff +0 -0
  423. package/dist/assets/inter-greek-ext-700-normal-qfdV9bQt.woff2 +0 -0
  424. package/dist/assets/inter-latin-400-normal-C38fXH4l.woff2 +0 -0
  425. package/dist/assets/inter-latin-400-normal-CyCys3Eg.woff +0 -0
  426. package/dist/assets/inter-latin-500-normal-BL9OpVg8.woff +0 -0
  427. package/dist/assets/inter-latin-500-normal-Cerq10X2.woff2 +0 -0
  428. package/dist/assets/inter-latin-600-normal-CiBQ2DWP.woff +0 -0
  429. package/dist/assets/inter-latin-600-normal-LgqL8muc.woff2 +0 -0
  430. package/dist/assets/inter-latin-700-normal-BLAVimhd.woff +0 -0
  431. package/dist/assets/inter-latin-700-normal-Yt3aPRUw.woff2 +0 -0
  432. package/dist/assets/inter-latin-ext-400-normal-77YHD8bZ.woff +0 -0
  433. package/dist/assets/inter-latin-ext-400-normal-C1nco2VV.woff2 +0 -0
  434. package/dist/assets/inter-latin-ext-500-normal-BxGbmqWO.woff +0 -0
  435. package/dist/assets/inter-latin-ext-500-normal-CV4jyFjo.woff2 +0 -0
  436. package/dist/assets/inter-latin-ext-600-normal-CIVaiw4L.woff +0 -0
  437. package/dist/assets/inter-latin-ext-600-normal-D2bJ5OIk.woff2 +0 -0
  438. package/dist/assets/inter-latin-ext-700-normal-Ca8adRJv.woff2 +0 -0
  439. package/dist/assets/inter-latin-ext-700-normal-TidjK2hL.woff +0 -0
  440. package/dist/assets/inter-vietnamese-400-normal-Bbgyi5SW.woff +0 -0
  441. package/dist/assets/inter-vietnamese-400-normal-DMkecbls.woff2 +0 -0
  442. package/dist/assets/inter-vietnamese-500-normal-DOriooB6.woff2 +0 -0
  443. package/dist/assets/inter-vietnamese-500-normal-mJboJaSs.woff +0 -0
  444. package/dist/assets/inter-vietnamese-600-normal-BuLX-rYi.woff +0 -0
  445. package/dist/assets/inter-vietnamese-600-normal-Cc8MFFhd.woff2 +0 -0
  446. package/dist/assets/inter-vietnamese-700-normal-BZaoP0fm.woff +0 -0
  447. package/dist/assets/inter-vietnamese-700-normal-DlLaEgI2.woff2 +0 -0
  448. package/dist/assets/layout-grid-X9Sgull2.js +2 -0
  449. package/dist/assets/layout-grid-X9Sgull2.js.map +1 -0
  450. package/dist/assets/merriweather-cyrillic-400-normal-AvfsDsMQ.woff2 +0 -0
  451. package/dist/assets/merriweather-cyrillic-400-normal-DAcQ8g-H.woff +0 -0
  452. package/dist/assets/merriweather-cyrillic-700-normal-CHCcU-4a.woff +0 -0
  453. package/dist/assets/merriweather-cyrillic-700-normal-wbY04GlL.woff2 +0 -0
  454. package/dist/assets/merriweather-cyrillic-ext-400-normal-D9NYhYTq.woff2 +0 -0
  455. package/dist/assets/merriweather-cyrillic-ext-400-normal-Di6yW_eE.woff +0 -0
  456. package/dist/assets/merriweather-cyrillic-ext-700-normal-Bk1p9YoV.woff2 +0 -0
  457. package/dist/assets/merriweather-cyrillic-ext-700-normal-DoooT6Vg.woff +0 -0
  458. package/dist/assets/merriweather-latin-400-normal-CvqO63Ah.woff +0 -0
  459. package/dist/assets/merriweather-latin-400-normal-G4kZaoXi.woff2 +0 -0
  460. package/dist/assets/merriweather-latin-700-normal-D4-nzrAh.woff +0 -0
  461. package/dist/assets/merriweather-latin-700-normal-DoUP8Ce-.woff2 +0 -0
  462. package/dist/assets/merriweather-latin-ext-400-normal-CLqijLtt.woff +0 -0
  463. package/dist/assets/merriweather-latin-ext-400-normal-CWVzVQq3.woff2 +0 -0
  464. package/dist/assets/merriweather-latin-ext-700-normal-CaBzXGOk.woff +0 -0
  465. package/dist/assets/merriweather-latin-ext-700-normal-jHnxg2Kc.woff2 +0 -0
  466. package/dist/assets/merriweather-vietnamese-400-normal-Dh8WVvgZ.woff +0 -0
  467. package/dist/assets/merriweather-vietnamese-400-normal-hNacsVs_.woff2 +0 -0
  468. package/dist/assets/merriweather-vietnamese-700-normal-Bp6kWjW5.woff2 +0 -0
  469. package/dist/assets/merriweather-vietnamese-700-normal-C7_HxHBa.woff +0 -0
  470. package/dist/assets/montserrat-cyrillic-400-normal-BPq32Q8K.woff2 +0 -0
  471. package/dist/assets/montserrat-cyrillic-400-normal-jEs4Tk-Z.woff +0 -0
  472. package/dist/assets/montserrat-cyrillic-700-normal-BvLYcGP1.woff +0 -0
  473. package/dist/assets/montserrat-cyrillic-700-normal-D-Pqjtdp.woff2 +0 -0
  474. package/dist/assets/montserrat-cyrillic-ext-400-normal-DRPPeomZ.woff +0 -0
  475. package/dist/assets/montserrat-cyrillic-ext-400-normal-Xqov12YL.woff2 +0 -0
  476. package/dist/assets/montserrat-cyrillic-ext-700-normal-D-Mk2xRJ.woff +0 -0
  477. package/dist/assets/montserrat-cyrillic-ext-700-normal-MyDreaeu.woff2 +0 -0
  478. package/dist/assets/montserrat-latin-400-normal-BLhwKU8k.woff2 +0 -0
  479. package/dist/assets/montserrat-latin-400-normal-xItZbAXg.woff +0 -0
  480. package/dist/assets/montserrat-latin-700-normal-BWkrl476.woff +0 -0
  481. package/dist/assets/montserrat-latin-700-normal-BdjcYUrC.woff2 +0 -0
  482. package/dist/assets/montserrat-latin-ext-400-normal-B8bwfy6Y.woff2 +0 -0
  483. package/dist/assets/montserrat-latin-ext-400-normal-BffdBkAA.woff +0 -0
  484. package/dist/assets/montserrat-latin-ext-700-normal-BOP2Nhf0.woff2 +0 -0
  485. package/dist/assets/montserrat-latin-ext-700-normal-DdDFr05Z.woff +0 -0
  486. package/dist/assets/montserrat-vietnamese-400-normal-BeEscFYY.woff +0 -0
  487. package/dist/assets/montserrat-vietnamese-400-normal-D4oHqQTd.woff2 +0 -0
  488. package/dist/assets/montserrat-vietnamese-700-normal-C0x1De3p.woff2 +0 -0
  489. package/dist/assets/montserrat-vietnamese-700-normal-DnwGT2D9.woff +0 -0
  490. package/dist/assets/playfair-display-cyrillic-400-normal-CjW2EstV.woff2 +0 -0
  491. package/dist/assets/playfair-display-cyrillic-400-normal-ZiRag6zj.woff +0 -0
  492. package/dist/assets/playfair-display-cyrillic-700-normal-Dk1mTcxf.woff +0 -0
  493. package/dist/assets/playfair-display-cyrillic-700-normal-Dw3uKy19.woff2 +0 -0
  494. package/dist/assets/playfair-display-latin-400-normal-CFtfchNt.woff2 +0 -0
  495. package/dist/assets/playfair-display-latin-400-normal-DHYHbkg3.woff +0 -0
  496. package/dist/assets/playfair-display-latin-700-normal-Bc_1Q1cG.woff +0 -0
  497. package/dist/assets/playfair-display-latin-700-normal-CuDiGg7c.woff2 +0 -0
  498. package/dist/assets/playfair-display-latin-ext-400-normal-BxlSGspa.woff2 +0 -0
  499. package/dist/assets/playfair-display-latin-ext-400-normal-qdZwdvNS.woff +0 -0
  500. package/dist/assets/playfair-display-latin-ext-700-normal-C58ejOkc.woff2 +0 -0
  501. package/dist/assets/playfair-display-latin-ext-700-normal-D5HUU8GT.woff +0 -0
  502. package/dist/assets/playfair-display-vietnamese-400-normal-BV2APVTb.woff2 +0 -0
  503. package/dist/assets/playfair-display-vietnamese-400-normal-BbvUAu4N.woff +0 -0
  504. package/dist/assets/playfair-display-vietnamese-700-normal-CaKJSIny.woff2 +0 -0
  505. package/dist/assets/playfair-display-vietnamese-700-normal-Cr1rw0mr.woff +0 -0
  506. package/dist/assets/proof/output-01.png +0 -0
  507. package/dist/assets/proof/output-02.png +0 -0
  508. package/dist/assets/proof/output-03.png +0 -0
  509. package/dist/assets/proof/output-04.png +0 -0
  510. package/dist/assets/roboto-cyrillic-400-normal-DAIM1_dR.woff2 +0 -0
  511. package/dist/assets/roboto-cyrillic-400-normal-DZJji7Rx.woff +0 -0
  512. package/dist/assets/roboto-cyrillic-500-normal-BI4HuXre.woff +0 -0
  513. package/dist/assets/roboto-cyrillic-500-normal-hCeO1jFL.woff2 +0 -0
  514. package/dist/assets/roboto-cyrillic-700-normal-BiSG5NnW.woff2 +0 -0
  515. package/dist/assets/roboto-cyrillic-700-normal-KqaQ5bNp.woff +0 -0
  516. package/dist/assets/roboto-cyrillic-ext-400-normal-DtZHuW6i.woff +0 -0
  517. package/dist/assets/roboto-cyrillic-ext-400-normal-DzMWdK87.woff2 +0 -0
  518. package/dist/assets/roboto-cyrillic-ext-500-normal-B7rQpwPu.woff2 +0 -0
  519. package/dist/assets/roboto-cyrillic-ext-500-normal-C927yMrb.woff +0 -0
  520. package/dist/assets/roboto-cyrillic-ext-700-normal-BuQgZIrO.woff +0 -0
  521. package/dist/assets/roboto-cyrillic-ext-700-normal-UFn0vR9r.woff2 +0 -0
  522. package/dist/assets/roboto-greek-400-normal-CcizSnRP.woff +0 -0
  523. package/dist/assets/roboto-greek-400-normal-jFM2czAU.woff2 +0 -0
  524. package/dist/assets/roboto-greek-500-normal-BJMS0heP.woff2 +0 -0
  525. package/dist/assets/roboto-greek-500-normal-BLLWU9W-.woff +0 -0
  526. package/dist/assets/roboto-greek-700-normal-BcGn9doz.woff2 +0 -0
  527. package/dist/assets/roboto-greek-700-normal-D3kmAf0K.woff +0 -0
  528. package/dist/assets/roboto-latin-400-normal-068yxgMN.woff +0 -0
  529. package/dist/assets/roboto-latin-400-normal-CNwBRw8h.woff2 +0 -0
  530. package/dist/assets/roboto-latin-500-normal-CC5nhZkh.woff +0 -0
  531. package/dist/assets/roboto-latin-500-normal-CkrA1NAy.woff2 +0 -0
  532. package/dist/assets/roboto-latin-700-normal-CXeAXeti.woff2 +0 -0
  533. package/dist/assets/roboto-latin-700-normal-DUekQERp.woff +0 -0
  534. package/dist/assets/roboto-latin-ext-400-normal-ZYmyxeOy.woff2 +0 -0
  535. package/dist/assets/roboto-latin-ext-400-normal-eTRLN0Nt.woff +0 -0
  536. package/dist/assets/roboto-latin-ext-500-normal-C_ARlJGk.woff2 +0 -0
  537. package/dist/assets/roboto-latin-ext-500-normal-FFcS8vBN.woff +0 -0
  538. package/dist/assets/roboto-latin-ext-700-normal-70GS1MYH.woff2 +0 -0
  539. package/dist/assets/roboto-latin-ext-700-normal-BS1OuQqR.woff +0 -0
  540. package/dist/assets/roboto-math-400-normal-B3wgz80t.woff2 +0 -0
  541. package/dist/assets/roboto-math-400-normal-rzxYvyVt.woff +0 -0
  542. package/dist/assets/roboto-math-500-normal-CFNaIMFC.woff2 +0 -0
  543. package/dist/assets/roboto-math-500-normal-DaFX-ZC8.woff +0 -0
  544. package/dist/assets/roboto-math-700-normal-VUAI6Bz2.woff2 +0 -0
  545. package/dist/assets/roboto-math-700-normal-pYD1nhov.woff +0 -0
  546. package/dist/assets/roboto-symbols-400-normal-Tzuungub.woff +0 -0
  547. package/dist/assets/roboto-symbols-400-normal-fF1SLJBj.woff2 +0 -0
  548. package/dist/assets/roboto-symbols-500-normal-BXFTxrNR.woff2 +0 -0
  549. package/dist/assets/roboto-symbols-500-normal-CAhAe-ik.woff +0 -0
  550. package/dist/assets/roboto-symbols-700-normal-CuuvBBxy.woff +0 -0
  551. package/dist/assets/roboto-symbols-700-normal-rJi6RjIy.woff2 +0 -0
  552. package/dist/assets/roboto-vietnamese-400-normal-CDDxGrUb.woff2 +0 -0
  553. package/dist/assets/roboto-vietnamese-400-normal-DmXaN3yE.woff +0 -0
  554. package/dist/assets/roboto-vietnamese-500-normal-DW96CsrR.woff +0 -0
  555. package/dist/assets/roboto-vietnamese-500-normal-HYpufUYk.woff2 +0 -0
  556. package/dist/assets/roboto-vietnamese-700-normal-Dz0HwF-w.woff +0 -0
  557. package/dist/assets/roboto-vietnamese-700-normal-iKxYNAzq.woff2 +0 -0
  558. package/dist/assets/rocket-BjOXauLe.js +2 -0
  559. package/dist/assets/rocket-BjOXauLe.js.map +1 -0
  560. package/dist/assets/shield-check-CFNhE_aD.js +2 -0
  561. package/dist/assets/shield-check-CFNhE_aD.js.map +1 -0
  562. package/dist/assets/signIn-CVoSzqCz.js +2 -0
  563. package/dist/assets/signIn-CVoSzqCz.js.map +1 -0
  564. package/dist/assets/smartphone-BcQB9gIh.js +2 -0
  565. package/dist/assets/smartphone-BcQB9gIh.js.map +1 -0
  566. package/dist/assets/terminal-CGhryJds.js +2 -0
  567. package/dist/assets/terminal-CGhryJds.js.map +1 -0
  568. package/dist/assets/useAuth-lZZC20Tl.js +4 -0
  569. package/dist/assets/useAuth-lZZC20Tl.js.map +1 -0
  570. package/dist/cancelled/index.html +34 -0
  571. package/dist/downloads/shipscreens-agent-cli-config.yml +48 -0
  572. package/dist/downloads/shipscreens-agent-cli-copy.csv +2 -0
  573. package/dist/favicon-16x16.png +0 -0
  574. package/dist/favicon-32x32.png +0 -0
  575. package/dist/favicon.ico +0 -0
  576. package/dist/favicon.svg +10 -0
  577. package/dist/forgot-password/index.html +34 -0
  578. package/dist/index.html +42 -0
  579. package/dist/legal/index.html +33 -0
  580. package/dist/og-image.png +0 -0
  581. package/dist/pricing/index.html +33 -0
  582. package/dist/privacy/index.html +33 -0
  583. package/dist/robots.txt +11 -0
  584. package/dist/signin/index.html +34 -0
  585. package/dist/signup/index.html +34 -0
  586. package/dist/sitemap.xml +51 -0
  587. package/dist/success/index.html +34 -0
  588. package/dist/templates/clean_blue.png +0 -0
  589. package/dist/templates/minimal_dark.png +0 -0
  590. package/dist/templates/split_modern.png +0 -0
  591. package/dist/templates/vibrant_gradient.png +0 -0
  592. package/dist/terms/index.html +33 -0
  593. package/dist/tools/5-panel-screenshot-framework/index.html +33 -0
  594. package/dist/tools/agent-cli/index.html +33 -0
  595. package/dist/tools/app-review-aso/index.html +33 -0
  596. package/dist/tools/fastlane-screenshots/index.html +33 -0
  597. package/dist/tools/first-export/index.html +33 -0
  598. package/dist/tools/index.html +33 -0
  599. package/dist/tools/screenshot-workload-calculator/index.html +33 -0
  600. package/dist/tools/store-assets-pipeline/index.html +33 -0
  601. package/package.json +36 -0
  602. package/src/constants/devices.js +122 -0
  603. package/templates/agent/agent-prompt.txt +21 -0
  604. package/templates/agent/copy.csv +2 -0
  605. package/templates/agent/shipscreens.config.yml +48 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"App-DU0xew0e.js","sources":["../../node_modules/lucide-react/dist/esm/icons/align-end-horizontal.js","../../node_modules/lucide-react/dist/esm/icons/align-vertical-space-around.js","../../node_modules/lucide-react/dist/esm/icons/aperture.js","../../node_modules/lucide-react/dist/esm/icons/award.js","../../node_modules/lucide-react/dist/esm/icons/box.js","../../node_modules/lucide-react/dist/esm/icons/cloud-download.js","../../node_modules/lucide-react/dist/esm/icons/cloud-upload.js","../../node_modules/lucide-react/dist/esm/icons/cloud.js","../../node_modules/lucide-react/dist/esm/icons/credit-card.js","../../node_modules/lucide-react/dist/esm/icons/crown.js","../../node_modules/lucide-react/dist/esm/icons/database.js","../../node_modules/lucide-react/dist/esm/icons/file-braces.js","../../node_modules/lucide-react/dist/esm/icons/file-text.js","../../node_modules/lucide-react/dist/esm/icons/hard-drive.js","../../node_modules/lucide-react/dist/esm/icons/image.js","../../node_modules/lucide-react/dist/esm/icons/info.js","../../node_modules/lucide-react/dist/esm/icons/layout-template.js","../../node_modules/lucide-react/dist/esm/icons/loader-circle.js","../../node_modules/lucide-react/dist/esm/icons/lock.js","../../node_modules/lucide-react/dist/esm/icons/log-out.js","../../node_modules/lucide-react/dist/esm/icons/monitor.js","../../node_modules/lucide-react/dist/esm/icons/paint-bucket.js","../../node_modules/lucide-react/dist/esm/icons/pen-line.js","../../node_modules/lucide-react/dist/esm/icons/play.js","../../node_modules/lucide-react/dist/esm/icons/plus.js","../../node_modules/lucide-react/dist/esm/icons/refresh-cw.js","../../node_modules/lucide-react/dist/esm/icons/rotate-ccw.js","../../node_modules/lucide-react/dist/esm/icons/rotate-cw.js","../../node_modules/lucide-react/dist/esm/icons/save.js","../../node_modules/lucide-react/dist/esm/icons/search.js","../../node_modules/lucide-react/dist/esm/icons/settings.js","../../node_modules/lucide-react/dist/esm/icons/share-2.js","../../node_modules/lucide-react/dist/esm/icons/sparkles.js","../../node_modules/lucide-react/dist/esm/icons/star.js","../../node_modules/lucide-react/dist/esm/icons/trash-2.js","../../node_modules/lucide-react/dist/esm/icons/triangle-alert.js","../../node_modules/lucide-react/dist/esm/icons/upload.js","../../node_modules/lucide-react/dist/esm/icons/users.js","../../node_modules/lucide-react/dist/esm/icons/watch.js","../../node_modules/lucide-react/dist/esm/icons/zoom-in.js","../../src/components/UserMenu.jsx","../../src/constants/devices.js","../../src/constants/deviceFrames.js","../../src/lib/layoutUtils.js","../../src/components/MockupCanvas.jsx","../../src/components/UpgradeModal.jsx","../../src/components/CiQuickstartModal.jsx","../../node_modules/@stripe/stripe-js/dist/index.mjs","../../src/lib/apiClient.js","../../src/lib/stripeClient.js","../../src/lib/deviceLabels.js","../../src/hooks/useAssetExport.js","../../src/lib/sampleProjects.js","../../node_modules/papaparse/papaparse.min.js","../../src/components/LanguageSelector.jsx","../../src/components/editor/FontSelector.jsx","../../src/components/editor/TeamSyncPanel.jsx","../../src/components/editor/ControlsPanel.jsx","../../src/components/ProgressOverlay.jsx","../../src/components/editor/Storyboard.jsx","../../src/App.jsx"],"sourcesContent":["/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"rect\", { width: \"6\", height: \"16\", x: \"4\", y: \"2\", rx: \"2\", key: \"z5wdxg\" }],\n [\"rect\", { width: \"6\", height: \"9\", x: \"14\", y: \"9\", rx: \"2\", key: \"um7a8w\" }],\n [\"path\", { d: \"M22 22H2\", key: \"19qnx5\" }]\n];\nconst AlignEndHorizontal = createLucideIcon(\"align-end-horizontal\", __iconNode);\n\nexport { __iconNode, AlignEndHorizontal as default };\n//# sourceMappingURL=align-end-horizontal.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"rect\", { width: \"10\", height: \"6\", x: \"7\", y: \"9\", rx: \"2\", key: \"b1zbii\" }],\n [\"path\", { d: \"M22 20H2\", key: \"1p1f7z\" }],\n [\"path\", { d: \"M22 4H2\", key: \"1b7qnq\" }]\n];\nconst AlignVerticalSpaceAround = createLucideIcon(\"align-vertical-space-around\", __iconNode);\n\nexport { __iconNode, AlignVerticalSpaceAround as default };\n//# sourceMappingURL=align-vertical-space-around.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"m14.31 8 5.74 9.94\", key: \"1y6ab4\" }],\n [\"path\", { d: \"M9.69 8h11.48\", key: \"1wxppr\" }],\n [\"path\", { d: \"m7.38 12 5.74-9.94\", key: \"1grp0k\" }],\n [\"path\", { d: \"M9.69 16 3.95 6.06\", key: \"libnyf\" }],\n [\"path\", { d: \"M14.31 16H2.83\", key: \"x5fava\" }],\n [\"path\", { d: \"m16.62 12-5.74 9.94\", key: \"1vwawt\" }]\n];\nconst Aperture = createLucideIcon(\"aperture\", __iconNode);\n\nexport { __iconNode, Aperture as default };\n//# sourceMappingURL=aperture.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"m15.477 12.89 1.515 8.526a.5.5 0 0 1-.81.47l-3.58-2.687a1 1 0 0 0-1.197 0l-3.586 2.686a.5.5 0 0 1-.81-.469l1.514-8.526\",\n key: \"1yiouv\"\n }\n ],\n [\"circle\", { cx: \"12\", cy: \"8\", r: \"6\", key: \"1vp47v\" }]\n];\nconst Award = createLucideIcon(\"award\", __iconNode);\n\nexport { __iconNode, Award as default };\n//# sourceMappingURL=award.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M21 8a2 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 16Z\",\n key: \"hh9hay\"\n }\n ],\n [\"path\", { d: \"m3.3 7 8.7 5 8.7-5\", key: \"g66t2b\" }],\n [\"path\", { d: \"M12 22V12\", key: \"d0xqtd\" }]\n];\nconst Box = createLucideIcon(\"box\", __iconNode);\n\nexport { __iconNode, Box as default };\n//# sourceMappingURL=box.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 13v8l-4-4\", key: \"1f5nwf\" }],\n [\"path\", { d: \"m12 21 4-4\", key: \"1lfcce\" }],\n [\"path\", { d: \"M4.393 15.269A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 2.436 8.284\", key: \"ui1hmy\" }]\n];\nconst CloudDownload = createLucideIcon(\"cloud-download\", __iconNode);\n\nexport { __iconNode, CloudDownload as default };\n//# sourceMappingURL=cloud-download.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 13v8\", key: \"1l5pq0\" }],\n [\"path\", { d: \"M4 14.899A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 2.5 8.242\", key: \"1pljnt\" }],\n [\"path\", { d: \"m8 17 4-4 4 4\", key: \"1quai1\" }]\n];\nconst CloudUpload = createLucideIcon(\"cloud-upload\", __iconNode);\n\nexport { __iconNode, CloudUpload as default };\n//# sourceMappingURL=cloud-upload.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9Z\", key: \"p7xjir\" }]\n];\nconst Cloud = createLucideIcon(\"cloud\", __iconNode);\n\nexport { __iconNode, Cloud as default };\n//# sourceMappingURL=cloud.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"rect\", { width: \"20\", height: \"14\", x: \"2\", y: \"5\", rx: \"2\", key: \"ynyp8z\" }],\n [\"line\", { x1: \"2\", x2: \"22\", y1: \"10\", y2: \"10\", key: \"1b3vmo\" }]\n];\nconst CreditCard = createLucideIcon(\"credit-card\", __iconNode);\n\nexport { __iconNode, CreditCard as default };\n//# sourceMappingURL=credit-card.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M11.562 3.266a.5.5 0 0 1 .876 0L15.39 8.87a1 1 0 0 0 1.516.294L21.183 5.5a.5.5 0 0 1 .798.519l-2.834 10.246a1 1 0 0 1-.956.734H5.81a1 1 0 0 1-.957-.734L2.02 6.02a.5.5 0 0 1 .798-.519l4.276 3.664a1 1 0 0 0 1.516-.294z\",\n key: \"1vdc57\"\n }\n ],\n [\"path\", { d: \"M5 21h14\", key: \"11awu3\" }]\n];\nconst Crown = createLucideIcon(\"crown\", __iconNode);\n\nexport { __iconNode, Crown as default };\n//# sourceMappingURL=crown.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"ellipse\", { cx: \"12\", cy: \"5\", rx: \"9\", ry: \"3\", key: \"msslwz\" }],\n [\"path\", { d: \"M3 5V19A9 3 0 0 0 21 19V5\", key: \"1wlel7\" }],\n [\"path\", { d: \"M3 12A9 3 0 0 0 21 12\", key: \"mv7ke4\" }]\n];\nconst Database = createLucideIcon(\"database\", __iconNode);\n\nexport { __iconNode, Database as default };\n//# sourceMappingURL=database.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\",\n key: \"1oefj6\"\n }\n ],\n [\"path\", { d: \"M14 2v5a1 1 0 0 0 1 1h5\", key: \"wfsgrz\" }],\n [\n \"path\",\n { d: \"M10 12a1 1 0 0 0-1 1v1a1 1 0 0 1-1 1 1 1 0 0 1 1 1v1a1 1 0 0 0 1 1\", key: \"1oajmo\" }\n ],\n [\n \"path\",\n { d: \"M14 18a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1 1 1 0 0 1-1-1v-1a1 1 0 0 0-1-1\", key: \"mpwhp6\" }\n ]\n];\nconst FileBraces = createLucideIcon(\"file-braces\", __iconNode);\n\nexport { __iconNode, FileBraces as default };\n//# sourceMappingURL=file-braces.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\",\n key: \"1oefj6\"\n }\n ],\n [\"path\", { d: \"M14 2v5a1 1 0 0 0 1 1h5\", key: \"wfsgrz\" }],\n [\"path\", { d: \"M10 9H8\", key: \"b1mrlr\" }],\n [\"path\", { d: \"M16 13H8\", key: \"t4e002\" }],\n [\"path\", { d: \"M16 17H8\", key: \"z1uh3a\" }]\n];\nconst FileText = createLucideIcon(\"file-text\", __iconNode);\n\nexport { __iconNode, FileText as default };\n//# sourceMappingURL=file-text.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"line\", { x1: \"22\", x2: \"2\", y1: \"12\", y2: \"12\", key: \"1y58io\" }],\n [\n \"path\",\n {\n d: \"M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z\",\n key: \"oot6mr\"\n }\n ],\n [\"line\", { x1: \"6\", x2: \"6.01\", y1: \"16\", y2: \"16\", key: \"sgf278\" }],\n [\"line\", { x1: \"10\", x2: \"10.01\", y1: \"16\", y2: \"16\", key: \"1l4acy\" }]\n];\nconst HardDrive = createLucideIcon(\"hard-drive\", __iconNode);\n\nexport { __iconNode, HardDrive as default };\n//# sourceMappingURL=hard-drive.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"3\", rx: \"2\", ry: \"2\", key: \"1m3agn\" }],\n [\"circle\", { cx: \"9\", cy: \"9\", r: \"2\", key: \"af1f0g\" }],\n [\"path\", { d: \"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21\", key: \"1xmnt7\" }]\n];\nconst Image = createLucideIcon(\"image\", __iconNode);\n\nexport { __iconNode, Image as default };\n//# sourceMappingURL=image.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"M12 16v-4\", key: \"1dtifu\" }],\n [\"path\", { d: \"M12 8h.01\", key: \"e9boi3\" }]\n];\nconst Info = createLucideIcon(\"info\", __iconNode);\n\nexport { __iconNode, Info as default };\n//# sourceMappingURL=info.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"rect\", { width: \"18\", height: \"7\", x: \"3\", y: \"3\", rx: \"1\", key: \"f1a2em\" }],\n [\"rect\", { width: \"9\", height: \"7\", x: \"3\", y: \"14\", rx: \"1\", key: \"jqznyg\" }],\n [\"rect\", { width: \"5\", height: \"7\", x: \"16\", y: \"14\", rx: \"1\", key: \"q5h2i8\" }]\n];\nconst LayoutTemplate = createLucideIcon(\"layout-template\", __iconNode);\n\nexport { __iconNode, LayoutTemplate as default };\n//# sourceMappingURL=layout-template.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"M21 12a9 9 0 1 1-6.219-8.56\", key: \"13zald\" }]];\nconst LoaderCircle = createLucideIcon(\"loader-circle\", __iconNode);\n\nexport { __iconNode, LoaderCircle as default };\n//# sourceMappingURL=loader-circle.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"rect\", { width: \"18\", height: \"11\", x: \"3\", y: \"11\", rx: \"2\", ry: \"2\", key: \"1w4ew1\" }],\n [\"path\", { d: \"M7 11V7a5 5 0 0 1 10 0v4\", key: \"fwvmzm\" }]\n];\nconst Lock = createLucideIcon(\"lock\", __iconNode);\n\nexport { __iconNode, Lock as default };\n//# sourceMappingURL=lock.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"m16 17 5-5-5-5\", key: \"1bji2h\" }],\n [\"path\", { d: \"M21 12H9\", key: \"dn1m92\" }],\n [\"path\", { d: \"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\", key: \"1uf3rs\" }]\n];\nconst LogOut = createLucideIcon(\"log-out\", __iconNode);\n\nexport { __iconNode, LogOut as default };\n//# sourceMappingURL=log-out.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"rect\", { width: \"20\", height: \"14\", x: \"2\", y: \"3\", rx: \"2\", key: \"48i651\" }],\n [\"line\", { x1: \"8\", x2: \"16\", y1: \"21\", y2: \"21\", key: \"1svkeh\" }],\n [\"line\", { x1: \"12\", x2: \"12\", y1: \"17\", y2: \"21\", key: \"vw1qmm\" }]\n];\nconst Monitor = createLucideIcon(\"monitor\", __iconNode);\n\nexport { __iconNode, Monitor as default };\n//# sourceMappingURL=monitor.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M11 7 6 2\", key: \"1jwth8\" }],\n [\"path\", { d: \"M18.992 12H2.041\", key: \"xw1gg\" }],\n [\n \"path\",\n {\n d: \"M21.145 18.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.595\",\n key: \"1nkol4\"\n }\n ],\n [\n \"path\",\n {\n d: \"m8.5 4.5 2.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\",\n key: \"1nk1rd\"\n }\n ]\n];\nconst PaintBucket = createLucideIcon(\"paint-bucket\", __iconNode);\n\nexport { __iconNode, PaintBucket as default };\n//# sourceMappingURL=paint-bucket.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M13 21h8\", key: \"1jsn5i\" }],\n [\n \"path\",\n {\n d: \"M21.174 6.812a1 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\",\n key: \"1a8usu\"\n }\n ]\n];\nconst PenLine = createLucideIcon(\"pen-line\", __iconNode);\n\nexport { __iconNode, PenLine as default };\n//# sourceMappingURL=pen-line.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z\",\n key: \"10ikf1\"\n }\n ]\n];\nconst Play = createLucideIcon(\"play\", __iconNode);\n\nexport { __iconNode, Play as default };\n//# sourceMappingURL=play.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }],\n [\"path\", { d: \"M12 5v14\", key: \"s699le\" }]\n];\nconst Plus = createLucideIcon(\"plus\", __iconNode);\n\nexport { __iconNode, Plus as default };\n//# sourceMappingURL=plus.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\", key: \"v9h5vc\" }],\n [\"path\", { d: \"M21 3v5h-5\", key: \"1q7to0\" }],\n [\"path\", { d: \"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\", key: \"3uifl3\" }],\n [\"path\", { d: \"M8 16H3v5\", key: \"1cv678\" }]\n];\nconst RefreshCw = createLucideIcon(\"refresh-cw\", __iconNode);\n\nexport { __iconNode, RefreshCw as default };\n//# sourceMappingURL=refresh-cw.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\", key: \"1357e3\" }],\n [\"path\", { d: \"M3 3v5h5\", key: \"1xhq8a\" }]\n];\nconst RotateCcw = createLucideIcon(\"rotate-ccw\", __iconNode);\n\nexport { __iconNode, RotateCcw as default };\n//# sourceMappingURL=rotate-ccw.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8\", key: \"1p45f6\" }],\n [\"path\", { d: \"M21 3v5h-5\", key: \"1q7to0\" }]\n];\nconst RotateCw = createLucideIcon(\"rotate-cw\", __iconNode);\n\nexport { __iconNode, RotateCw as default };\n//# sourceMappingURL=rotate-cw.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z\",\n key: \"1c8476\"\n }\n ],\n [\"path\", { d: \"M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7\", key: \"1ydtos\" }],\n [\"path\", { d: \"M7 3v4a1 1 0 0 0 1 1h7\", key: \"t51u73\" }]\n];\nconst Save = createLucideIcon(\"save\", __iconNode);\n\nexport { __iconNode, Save as default };\n//# sourceMappingURL=save.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"m21 21-4.34-4.34\", key: \"14j7rj\" }],\n [\"circle\", { cx: \"11\", cy: \"11\", r: \"8\", key: \"4ej97u\" }]\n];\nconst Search = createLucideIcon(\"search\", __iconNode);\n\nexport { __iconNode, Search as default };\n//# sourceMappingURL=search.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.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\",\n key: \"1i5ecw\"\n }\n ],\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"3\", key: \"1v7zrd\" }]\n];\nconst Settings = createLucideIcon(\"settings\", __iconNode);\n\nexport { __iconNode, Settings as default };\n//# sourceMappingURL=settings.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"circle\", { cx: \"18\", cy: \"5\", r: \"3\", key: \"gq8acd\" }],\n [\"circle\", { cx: \"6\", cy: \"12\", r: \"3\", key: \"w7nqdw\" }],\n [\"circle\", { cx: \"18\", cy: \"19\", r: \"3\", key: \"1xt0gg\" }],\n [\"line\", { x1: \"8.59\", x2: \"15.42\", y1: \"13.51\", y2: \"17.49\", key: \"47mynk\" }],\n [\"line\", { x1: \"15.41\", x2: \"8.59\", y1: \"6.51\", y2: \"10.49\", key: \"1n3mei\" }]\n];\nconst Share2 = createLucideIcon(\"share-2\", __iconNode);\n\nexport { __iconNode, Share2 as default };\n//# sourceMappingURL=share-2.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n 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.594z\",\n key: \"1s2grr\"\n }\n ],\n [\"path\", { d: \"M20 2v4\", key: \"1rf3ol\" }],\n [\"path\", { d: \"M22 4h-4\", key: \"gwowj6\" }],\n [\"circle\", { cx: \"4\", cy: \"20\", r: \"2\", key: \"6kqj1y\" }]\n];\nconst Sparkles = createLucideIcon(\"sparkles\", __iconNode);\n\nexport { __iconNode, Sparkles as default };\n//# sourceMappingURL=sparkles.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z\",\n key: \"r04s7s\"\n }\n ]\n];\nconst Star = createLucideIcon(\"star\", __iconNode);\n\nexport { __iconNode, Star as default };\n//# sourceMappingURL=star.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M10 11v6\", key: \"nco0om\" }],\n [\"path\", { d: \"M14 11v6\", key: \"outv1u\" }],\n [\"path\", { d: \"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6\", key: \"miytrc\" }],\n [\"path\", { d: \"M3 6h18\", key: \"d0wm0j\" }],\n [\"path\", { d: \"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\", key: \"e791ji\" }]\n];\nconst Trash2 = createLucideIcon(\"trash-2\", __iconNode);\n\nexport { __iconNode, Trash2 as default };\n//# sourceMappingURL=trash-2.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\",\n key: \"wmoenq\"\n }\n ],\n [\"path\", { d: \"M12 9v4\", key: \"juzpu7\" }],\n [\"path\", { d: \"M12 17h.01\", key: \"p32p05\" }]\n];\nconst TriangleAlert = createLucideIcon(\"triangle-alert\", __iconNode);\n\nexport { __iconNode, TriangleAlert as default };\n//# sourceMappingURL=triangle-alert.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 3v12\", key: \"1x0j5s\" }],\n [\"path\", { d: \"m17 8-5-5-5 5\", key: \"7q97r8\" }],\n [\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\", key: \"ih7n3h\" }]\n];\nconst Upload = createLucideIcon(\"upload\", __iconNode);\n\nexport { __iconNode, Upload as default };\n//# sourceMappingURL=upload.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\", key: \"1yyitq\" }],\n [\"path\", { d: \"M16 3.128a4 4 0 0 1 0 7.744\", key: \"16gr8j\" }],\n [\"path\", { d: \"M22 21v-2a4 4 0 0 0-3-3.87\", key: \"kshegd\" }],\n [\"circle\", { cx: \"9\", cy: \"7\", r: \"4\", key: \"nufk8\" }]\n];\nconst Users = createLucideIcon(\"users\", __iconNode);\n\nexport { __iconNode, Users as default };\n//# sourceMappingURL=users.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 10v2.2l1.6 1\", key: \"n3r21l\" }],\n [\n \"path\",\n { d: \"m16.13 7.66-.81-4.05a2 2 0 0 0-2-1.61h-2.68a2 2 0 0 0-2 1.61l-.78 4.05\", key: \"18k57s\" }\n ],\n [\"path\", { d: \"m7.88 16.36.8 4a2 2 0 0 0 2 1.61h2.72a2 2 0 0 0 2-1.61l.81-4.05\", key: \"16ny36\" }],\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"6\", key: \"1vlfrh\" }]\n];\nconst Watch = createLucideIcon(\"watch\", __iconNode);\n\nexport { __iconNode, Watch as default };\n//# sourceMappingURL=watch.js.map\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"circle\", { cx: \"11\", cy: \"11\", r: \"8\", key: \"4ej97u\" }],\n [\"line\", { x1: \"21\", x2: \"16.65\", y1: \"21\", y2: \"16.65\", key: \"13gj7c\" }],\n [\"line\", { x1: \"11\", x2: \"11\", y1: \"8\", y2: \"14\", key: \"1vmskp\" }],\n [\"line\", { x1: \"8\", x2: \"14\", y1: \"11\", y2: \"11\", key: \"durymu\" }]\n];\nconst ZoomIn = createLucideIcon(\"zoom-in\", __iconNode);\n\nexport { __iconNode, ZoomIn as default };\n//# sourceMappingURL=zoom-in.js.map\n","import React, { useEffect, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { ChevronDown, CreditCard, Crown, LogOut } from 'lucide-react';\n\nconst UserMenu = ({ user, isPro, onUpgrade, onManageSubscription, onSignOut, isPortalLoading }) => {\n const { t } = useTranslation();\n const [isOpen, setIsOpen] = useState(false);\n const menuRef = useRef(null);\n\n useEffect(() => {\n const handleClickOutside = (event) => {\n if (menuRef.current && !menuRef.current.contains(event.target)) {\n setIsOpen(false);\n }\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n const initial = (user?.email || user?.username || '?').charAt(0).toUpperCase();\n\n return (\n <div className=\"relative\" ref={menuRef}>\n <button\n onClick={() => setIsOpen(!isOpen)}\n className=\"flex items-center gap-2 p-1 pl-2 pr-1 rounded-full border border-slate-200 hover:bg-slate-50 transition-colors\"\n title={user?.email || user?.username}\n >\n <div className=\"w-8 h-8 rounded-full bg-slate-800 text-white flex items-center justify-center text-sm font-bold\">\n {initial}\n </div>\n <ChevronDown size={14} className=\"text-slate-400 mr-1\" />\n </button>\n\n {isOpen && (\n <div className=\"absolute right-0 top-full mt-2 w-64 bg-white rounded-xl shadow-xl border border-slate-100 overflow-hidden z-50 animate-in fade-in slide-in-from-top-2 duration-200\">\n <div className=\"px-4 py-3 border-b border-slate-100 bg-slate-50/50\">\n <p className=\"text-xs text-slate-500\">{t('app.userMenu.signedInAs')}</p>\n <p className=\"text-sm font-bold text-slate-800 truncate\" title={user?.email}>\n {user?.email || user?.username}\n </p>\n </div>\n\n <div className=\"p-1\">\n {!isPro && (\n <button\n onClick={() => {\n setIsOpen(false);\n onUpgrade?.();\n }}\n className=\"w-full flex items-center gap-2 px-3 py-2 text-sm text-amber-700 hover:bg-amber-50 rounded-lg transition-colors\"\n >\n <Crown size={16} className=\"text-amber-500\" />\n {t('app.header.upgrade')}\n </button>\n )}\n {isPro && (\n <button\n onClick={() => {\n setIsOpen(false);\n onManageSubscription();\n }}\n disabled={isPortalLoading}\n className=\"w-full flex items-center gap-2 px-3 py-2 text-sm text-slate-700 hover:bg-slate-50 rounded-lg transition-colors disabled:opacity-50\"\n >\n <CreditCard size={16} className=\"text-slate-400\" />\n {t('app.header.manage')}\n </button>\n )}\n {isPro && (\n <p className=\"px-3 pb-2 text-[11px] text-slate-500 leading-snug\">\n {t('consent.billing')}{' '}\n <a href=\"/terms\" className=\"underline hover:text-slate-700\" target=\"_blank\" rel=\"noreferrer\">\n {t('landing.footer.terms')}\n </a>\n {' / '}\n <a href=\"/privacy\" className=\"underline hover:text-slate-700\" target=\"_blank\" rel=\"noreferrer\">\n {t('landing.footer.privacy')}\n </a>\n {' / '}\n <a href=\"/legal\" className=\"underline hover:text-slate-700\" target=\"_blank\" rel=\"noreferrer\">\n {t('landing.footer.legal')}\n </a>\n </p>\n )}\n\n <button\n onClick={() => {\n setIsOpen(false);\n onSignOut();\n }}\n className=\"w-full flex items-center gap-2 px-3 py-2 text-sm text-red-600 hover:bg-red-50 rounded-lg transition-colors\"\n >\n <LogOut size={16} />\n {t('auth.actions.signOut')}\n </button>\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport default UserMenu;\n","export const DEVICE_LIBRARY = {\n iphone69: { name: 'iPhone 6.9\" (16 Pro Max)', storeLabel: '6.9-inch Display', modelLabel: 'iPhone 16 Pro Max', width: 1290, height: 2796, type: 'iphone-island', radius: 55, bezel: 8, group: 'iPhone' },\n iphone65: { name: 'iPhone 6.5\" (XS Max)', storeLabel: '6.5-inch Display', modelLabel: 'iPhone XS Max', width: 1284, height: 2778, type: 'iphone-notch', radius: 50, bezel: 10, group: 'iPhone' },\n iphone63: { name: 'iPhone 6.3\" (16 Pro)', storeLabel: '6.3-inch Display', modelLabel: 'iPhone 16 Pro', width: 1179, height: 2556, type: 'iphone-island', radius: 55, bezel: 8, group: 'iPhone' },\n iphone61: { name: 'iPhone 13 Pro', storeLabel: '6.1-inch Display', modelLabel: 'iPhone 13 Pro', width: 1170, height: 2532, type: 'iphone-notch', radius: 48, bezel: 10, group: 'iPhone' },\n iphone55: { name: 'iPhone 5.5\" (8 Plus)', storeLabel: '5.5-inch Display', modelLabel: 'iPhone 8 Plus', width: 1242, height: 2208, type: 'iphone-classic-round', radius: 36, bezel: 4, group: 'iPhone Classic' },\n iphone47: { name: 'iPhone 4.7\" (SE)', storeLabel: '4.7-inch Display', modelLabel: 'iPhone SE', width: 750, height: 1334, type: 'iphone-classic-round', radius: 30, bezel: 4, group: 'iPhone Classic' },\n ipad13: { name: 'iPad Pro 13\" (M4)', storeLabel: '13-inch Display', modelLabel: 'iPad Pro (M4)', width: 2064, height: 2752, type: 'ipad-modern', radius: 24, bezel: 12, group: 'iPad' },\n ipad129old: { name: 'iPad Pro 12.9\" (2nd)', storeLabel: '12.9-inch Display', modelLabel: 'iPad Pro (2nd gen)', width: 2048, height: 2732, type: 'ipad-classic', radius: 18, bezel: 5, group: 'iPad' },\n ipad11: { name: 'iPad 11\" (Pro/Air)', storeLabel: '11-inch Display', modelLabel: 'iPad Pro/Air', width: 1488, height: 2266, type: 'ipad-modern', radius: 20, bezel: 12, group: 'iPad' },\n watch: { name: 'Apple Watch', storeLabel: 'Apple Watch', modelLabel: '', width: 422, height: 514, type: 'watch', radius: 40, bezel: 6, group: 'Watch' },\n pixel8pro: { name: 'Pixel 8 Pro', storeLabel: 'Android Phone', modelLabel: 'Pixel 8 Pro', width: 1344, height: 2992, type: 'android-punchhole', radius: 42, bezel: 8, group: 'Android' },\n pixel8: { name: 'Pixel 8', storeLabel: 'Android Phone', modelLabel: 'Pixel 8', width: 1080, height: 2400, type: 'android-punchhole', radius: 48, bezel: 9, group: 'Android' },\n galaxy24ultra: { name: 'Galaxy S24 Ultra', storeLabel: 'Android Phone', modelLabel: 'Galaxy S24 Ultra', width: 1440, height: 3120, type: 'android-punchhole', radius: 12, bezel: 6, group: 'Android' },\n pixeltablet: { name: 'Pixel Tablet', storeLabel: 'Android Tablet', modelLabel: 'Pixel Tablet', width: 2560, height: 1600, type: 'android-tablet', radius: 28, bezel: 16, group: 'Android Tablet' },\n};\n\nexport const DEVICE_GROUPS = {\n iPhone: ['iphone69', 'iphone65', 'iphone63', 'iphone61'],\n 'iPhone Classic': ['iphone55', 'iphone47'],\n iPad: ['ipad13', 'ipad129old', 'ipad11'],\n Android: ['pixel8pro', 'pixel8', 'galaxy24ultra'],\n 'Android Tablet': ['pixeltablet'],\n Watch: ['watch'],\n};\n\nexport const FRAME_COLORS = {\n black: '#1a1a1a',\n silver: '#e3e3e3',\n titanium: '#8a8a8a',\n blue: '#2f3c4e',\n gold: '#f9e5c9',\n};\n\nexport const SOLID_PRESETS = [\n '#ef4444',\n '#f97316',\n '#f59e0b',\n '#84cc16',\n '#10b981',\n '#06b6d4',\n '#3b82f6',\n '#6366f1',\n '#8b5cf6',\n '#d946ef',\n '#f43f5e',\n '#0f172a',\n '#ffffff',\n];\n\nexport const OFFICIAL_TEMPLATES = [\n {\n id: 'minimal_dark',\n name: 'Minimal Dark',\n thumbnail: '/templates/minimal_dark.png',\n tags: { layout: 'Top', font: 'Inter', bg: 'Dark' },\n settings: {\n bgType: 'solid',\n bgColor: '#0f172a',\n textColor: '#f8fafc',\n layoutMode: 'top',\n topSpacing: 15,\n deviceScale: 0.9,\n frameColor: 'titanium',\n selectedFont: 'Inter',\n badgeType: 'download',\n },\n },\n {\n id: 'clean_blue',\n name: 'Clean Blue',\n thumbnail: '/templates/clean_blue.png',\n tags: { layout: 'Top', font: 'Inter', bg: 'Blue' },\n settings: {\n bgType: 'solid',\n bgColor: '#eff6ff',\n textColor: '#1e3a8a',\n layoutMode: 'top',\n topSpacing: 10,\n deviceScale: 1.0,\n frameColor: 'blue',\n selectedFont: 'Inter',\n badgeType: 'stars',\n },\n },\n {\n id: 'vibrant_gradient',\n name: 'Vibrant Pop',\n thumbnail: '/templates/vibrant_gradient.png',\n tags: { layout: 'Bottom', font: 'Montserrat', bg: 'Gradient' },\n settings: {\n bgType: 'gradient',\n gradientStart: '#f472b6',\n gradientEnd: '#fdba74',\n gradientAngle: 135,\n textColor: '#ffffff',\n layoutMode: 'bottom',\n topSpacing: 8,\n deviceScale: 1.1,\n frameColor: 'silver',\n selectedFont: 'Montserrat',\n badgeType: 'award',\n },\n },\n {\n id: 'split_modern',\n name: 'Split Modern',\n thumbnail: '/templates/split_modern.png',\n tags: { layout: 'Split', font: 'Roboto', bg: 'Light' },\n settings: {\n bgType: 'solid',\n bgColor: '#f1f5f9',\n textColor: '#334155',\n layoutMode: 'split',\n topSpacing: 0,\n deviceScale: 1.0,\n frameColor: 'black',\n selectedFont: 'Roboto',\n badgeType: 'googleplay',\n },\n },\n];\n","// Device frame metadata keyed by DEVICE_LIBRARY.type\nexport const DEVICE_FRAMES = {\n // iPhone 16/15/14 Pro (Dynamic Island)\n 'iphone-island': {\n notch: {\n type: 'dynamicIsland',\n width: '30%',\n height: '3.5%',\n top: '2.5%',\n borderRadius: '20px',\n },\n },\n // iPhone 14/13/12 (Notch)\n 'iphone-notch': {\n notch: {\n type: 'notch',\n width: '40%',\n height: '3.5%',\n top: '10px',\n borderRadius: '0 0 20px 20px',\n },\n },\n // iPhone SE / Classic (Home Button)\n 'iphone-classic-round': {\n homeButton: {\n bottom: '5%',\n width: '12%',\n height: '12%',\n borderWidth: '2px',\n },\n },\n // Android (Punchhole)\n 'android-punchhole': {\n notch: {\n type: 'punchhole',\n width: '16px',\n height: '16px',\n top: '15px',\n },\n },\n // Others (no overrides yet)\n 'ipad-modern': {},\n 'ipad-classic': {\n homeButton: {\n bottom: '5%',\n width: '4%',\n height: '4%',\n borderWidth: '1px',\n },\n },\n 'android-tablet': {},\n watch: {},\n};\n\nexport default DEVICE_FRAMES;\n","import { DEVICE_LIBRARY } from '../constants/devices';\n\n/**\n * Calculate layout-related styles for a mockup canvas.\n * Returns only layout-specific values so background and typography can be applied separately.\n */\nexport const calculateLayoutStyles = ({\n deviceId,\n orientation,\n deviceScale,\n topSpacing,\n layoutMode,\n frameColor,\n isBatchMode = false,\n hasLogo = false,\n hasBadge = false,\n}) => {\n const currentDevice = DEVICE_LIBRARY[deviceId];\n if (!currentDevice) return {};\n\n const isWatch = currentDevice.type === 'watch';\n\n let effectiveLayoutMode = layoutMode;\n if (isBatchMode && (currentDevice.group?.includes('iPad') || currentDevice.group?.includes('Tablet'))) {\n effectiveLayoutMode = 'split';\n }\n\n let canvasWidth = currentDevice.width;\n let canvasHeight = currentDevice.height;\n if (orientation === 'landscape') {\n // Swapping dimensions for landscape mode is correct and complies with App Store / Google Play requirements (native resolution).\n canvasWidth = currentDevice.height;\n canvasHeight = currentDevice.width;\n }\n\n const cssDeviceWidth = orientation === 'landscape' ? currentDevice.height / 3 : currentDevice.width / 3;\n const cssDeviceHeight = orientation === 'landscape' ? currentDevice.width / 3 : currentDevice.height / 3;\n\n const isTablet = currentDevice.group === 'Android Tablet' || currentDevice.group === 'iPad';\n const isClassicPhone = currentDevice.group === 'iPhone Classic';\n const hasLogoAndBadge = hasLogo && hasBadge;\n let widthFactor = 1;\n let heightFactor = 1;\n if (hasLogoAndBadge) {\n if (isTablet) {\n if (effectiveLayoutMode === 'split') {\n widthFactor = 0.9;\n heightFactor = 0.9;\n } else {\n widthFactor = 0.85;\n heightFactor = 0.85;\n }\n }\n }\n\n const targetWidthRatio =\n effectiveLayoutMode === 'split'\n ? 0.45\n : isWatch\n ? 0.58\n : orientation === 'landscape'\n ? isTablet\n ? 0.68 // tablets landscape: larger but keep margin\n : isClassicPhone\n ? 0.6 // classic phones landscape:さらに縮める(SE/8 Plus対策)\n : 0.65 // phones landscape: 少し縮める(Pixel8/16 Pro/13 Pro対策)\n : isTablet\n ? 0.76 // tablets portrait: larger but keep headroom\n : isClassicPhone\n ? 0.7 // classic phones portrait:さらに縮める(SE対策)\n : 0.8;\n\n const adjustedWidthRatio = targetWidthRatio * widthFactor;\n\n const targetHeightRatio =\n isWatch\n ? 0.46\n : orientation === 'landscape'\n ? isTablet\n ? 0.52\n : isClassicPhone\n ? 0.42 // classic phones landscape:高さも縮める\n : 0.48 // phones landscape: 少し縮める\n : isTablet\n ? 0.62\n : isClassicPhone\n ? 0.55\n : 0.65;\n\n const adjustedHeightRatio = targetHeightRatio * heightFactor;\n\n const baseScale = Math.min((canvasHeight * adjustedHeightRatio) / cssDeviceHeight, (canvasWidth * adjustedWidthRatio) / cssDeviceWidth);\n\n const totalScale = deviceScale * baseScale;\n const layoutWidth = cssDeviceWidth * totalScale;\n const layoutHeight = cssDeviceHeight * totalScale;\n\n let paddingTop = '5%';\n let paddingBottom = '5%';\n let paddingLeft = '5%';\n let paddingRight = '5%';\n\n if (effectiveLayoutMode !== 'split') {\n if (effectiveLayoutMode === 'bottom') {\n paddingBottom = `${canvasHeight * (topSpacing / 100)}px`;\n paddingTop = `${canvasHeight * 0.05}px`;\n } else {\n paddingTop = `${canvasHeight * (topSpacing / 100)}px`;\n paddingBottom = `${canvasHeight * 0.05}px`;\n }\n }\n\n const containerStyle = {\n width: `${canvasWidth}px`,\n height: `${canvasHeight}px`,\n paddingTop,\n paddingBottom,\n paddingLeft,\n paddingRight,\n display: 'flex',\n flexDirection: effectiveLayoutMode === 'split' ? 'row' : effectiveLayoutMode === 'bottom' ? 'column-reverse' : 'column',\n alignItems: 'center',\n justifyContent: effectiveLayoutMode === 'split' ? 'center' : 'flex-start',\n gap: effectiveLayoutMode === 'split' ? '5%' : `${canvasHeight * 0.03}px`,\n };\n\n const deviceWrapperStyle = {\n width: effectiveLayoutMode === 'split' ? undefined : layoutWidth,\n height: layoutHeight,\n };\n\n const deviceInnerStyle = {\n width: cssDeviceWidth,\n height: cssDeviceHeight,\n transform: `scale(${totalScale})`,\n transformOrigin: 'center center',\n };\n\n return {\n effectiveLayoutMode,\n containerStyle,\n deviceWrapperStyle,\n deviceInnerStyle,\n canvasWidth,\n canvasHeight,\n frameColor,\n };\n};\n\nexport default calculateLayoutStyles;\n","import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Award, DownloadCloud, Play, Smartphone, Star, Watch } from 'lucide-react';\nimport { DEVICE_LIBRARY, FRAME_COLORS } from '../constants/devices';\nimport { DEVICE_FRAMES } from '../constants/deviceFrames';\nimport { calculateLayoutStyles } from '../lib/layoutUtils';\n\nconst getBrightness = (hexColor) => {\n if (!hexColor || typeof hexColor !== 'string' || !hexColor.startsWith('#')) return 255;\n const hex = hexColor.substring(1);\n if (hex.length === 3) {\n const r = parseInt(hex[0] + hex[0], 16);\n const g = parseInt(hex[1] + hex[1], 16);\n const b = parseInt(hex[2] + hex[2], 16);\n return ((r * 299) + (g * 587) + (b * 114)) / 1000;\n }\n if (hex.length === 6) {\n const r = parseInt(hex.substring(0, 2), 16);\n const g = parseInt(hex.substring(2, 4), 16);\n const b = parseInt(hex.substring(4, 6), 16);\n return ((r * 299) + (g * 587) + (b * 114)) / 1000;\n }\n return 255;\n};\n\nconst MockupCanvas = ({\n id,\n deviceId,\n orientation,\n deviceScale,\n topSpacing,\n layoutMode,\n bgType,\n bgColor,\n gradientStart,\n gradientEnd,\n gradientAngle,\n bgImage,\n bgBlur,\n bgOpacity,\n headerText,\n subHeaderText,\n textColor,\n headerSize,\n subHeaderSize,\n selectedFont,\n badgeType,\n screenshot,\n logoImage,\n frameColor,\n isBatchMode = false,\n isPro = false,\n}) => {\n const { t } = useTranslation();\n const currentDevice = DEVICE_LIBRARY[deviceId];\n const isWatch = currentDevice.type === 'watch';\n const effectiveOrientation = isWatch ? 'portrait' : orientation;\n\n const {\n effectiveLayoutMode,\n containerStyle: layoutContainerStyle,\n deviceWrapperStyle,\n deviceInnerStyle,\n canvasWidth,\n canvasHeight,\n } = calculateLayoutStyles({\n deviceId,\n orientation: effectiveOrientation,\n deviceScale,\n topSpacing,\n layoutMode,\n frameColor,\n isBatchMode,\n hasLogo: !!logoImage,\n hasBadge: badgeType && badgeType !== 'none',\n });\n\n const getBackgroundStyle = () => {\n const baseStyle = {};\n if (bgType === 'image' && bgImage) {\n baseStyle.backgroundImage = `url(${bgImage})`;\n baseStyle.backgroundSize = 'cover';\n baseStyle.backgroundPosition = 'center';\n } else if (bgType === 'transparent') {\n baseStyle.backgroundImage = 'url(\"https://www.transparenttextures.com/patterns/checkerboard.png\")';\n baseStyle.backgroundColor = 'transparent';\n } else if (bgType === 'gradient') {\n baseStyle.backgroundImage = `linear-gradient(${gradientAngle}deg, ${gradientStart}, ${gradientEnd})`;\n } else if (bgType === 'solid') {\n baseStyle.backgroundColor = bgColor;\n }\n return baseStyle;\n };\n\n const isDarkBg = (() => {\n if (bgType === 'solid') return getBrightness(bgColor) < 128;\n if (bgType === 'gradient') return getBrightness(gradientStart) < 128;\n if (bgType === 'image') return true;\n return false;\n })();\n\n const watermarkRepeatedTextColor = isDarkBg ? 'text-white/10' : 'text-slate-900 opacity-[0.05]';\n const frameConfig = DEVICE_FRAMES[currentDevice.type] || {};\n\n // --- 自動フォントサイズ調整ロジック(バッジ用・激辛設定) ---\n const getAdjustedFontSize = (text, baseSize, maxWeight = 8) => {\n if (!text) return baseSize;\n const weight = text.split('').reduce((acc, c) => acc + (c.match(/[ -~]/) ? 0.8 : 1.8), 0);\n if (weight <= maxWeight) return baseSize;\n const minScale = 0.20;\n const ratio = maxWeight / weight;\n return baseSize * Math.max(minScale, ratio);\n };\n\n // --- テキスト自動縮小ロジック(ヘッダー/サブヘッダー用) ---\n // キャンバス幅に収まるようにフォントサイズを計算します\n const maxTextWidth = effectiveLayoutMode === 'split' \n ? canvasWidth * 0.45 // Splitレイアウト時は約45%\n : canvasWidth * 0.90; // 通常時は左右パディング(5%*2)を引いた90%\n\n const getFitFontSize = (text, intendedSize, maxWidth, isBold = false) => {\n if (!text) return intendedSize;\n \n // 文字幅の概算(太字は係数を大きめに設定)\n const asciiFactor = isBold ? 0.65 : 0.55;\n const multiByteFactor = isBold ? 1.1 : 1.0;\n const estimatedEm = text.split('').reduce((acc, char) => {\n return acc + (char.match(/[ -~]/) ? asciiFactor : multiByteFactor);\n }, 0);\n\n const estimatedWidth = estimatedEm * intendedSize;\n\n // 収まる場合はそのままのサイズ\n if (estimatedWidth <= maxWidth) return intendedSize;\n\n // 収まらない場合は縮小(余裕を持って0.95倍)\n const scale = maxWidth / estimatedWidth;\n return intendedSize * scale * 0.95;\n };\n // -----------------------------------\n\n const baseSize = Math.min(canvasWidth, canvasHeight);\n // ロゴのサイズとマージンを短辺基準で計算 (15%幅, 5%マージン)\n const logoSize = baseSize * 0.15;\n const logoMargin = baseSize * 0.05;\n // ロゴを避けるための余白高さ(top/split時のみ): Landscape時は縮小\n const spacingRatio = isWatch ? 0.14 : orientation === 'landscape' ? 0.08 : 0.22;\n // ロゴのための余白\n // split: キャンバス高さベースの比率(従来のセンター基準に戻す)\n // top: ロゴ実サイズ+マージンを上限付きで回避(過大にならないよう制限)\n const logoBaseSize = canvasHeight;\n const spacingHeight = logoImage\n ? effectiveLayoutMode === 'split'\n ? logoBaseSize * spacingRatio\n : effectiveLayoutMode === 'top'\n ? Math.min(logoSize + logoMargin, logoBaseSize * 0.12)\n : 0\n : 0;\n // split+logo 時は spacer 分だけ押し下げた後、全量を持ち上げてキャンバス全体のセンターに寄せる\n const textLiftForLogo = logoImage && effectiveLayoutMode === 'split' ? spacingHeight : 0;\n // top レイアウトでロゴに重ならないようキャンバス上端から余白を取る\n const textMarginTopForLogo = logoImage && effectiveLayoutMode === 'top' ? spacingHeight : 0;\n // テキストエリアの最小高さを、設定フォントサイズを基準に確保して端末の位置ズレを防ぐ\n const reservedHeaderHeight = headerText ? headerSize * 1.1 : 0; // line-height 1.1\n const reservedSubHeight = subHeaderText ? subHeaderSize * 1.3 : 0; // line-height 1.3\n const badgeScale = isWatch ? 0.08 : orientation === 'landscape' ? 0.08 : 0.12;\n const reservedBadgeHeight = badgeType !== 'none' ? baseSize * badgeScale : 0; // バッジの概算高さ\n const gapSpace = headerText && subHeaderText ? 16 : 0;\n const textContainerMinHeight = effectiveLayoutMode === 'split'\n ? undefined\n : reservedHeaderHeight + reservedSubHeight + reservedBadgeHeight + gapSpace;\n\n const renderBadge = () => {\n if (badgeType === 'none') return null;\n const textCenterStyle = () => ({\n lineHeight: 1,\n display: 'block', \n });\n const iconStyle = { display: 'block', transform: 'translateY(-1px)' };\n\n const badgeStyle = {\n padding: `${baseSize * 0.018}px ${baseSize * 0.038}px`,\n borderRadius: `${baseSize * 0.018}px`,\n backgroundColor: '#fff',\n border: '1px solid rgba(15,23,42,0.08)',\n boxShadow: 'none',\n filter: 'none',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: `${baseSize * 0.014}px`,\n marginTop: `${baseSize * 0.015}px`,\n cursor: 'default',\n lineHeight: 1,\n width: 'fit-content',\n maxWidth: `${baseSize * 0.9}px`,\n overflow: 'hidden',\n };\n const iconSize = baseSize * 0.045;\n const textSize = baseSize * 0.028;\n \n const fluidTextStyle = {\n display: 'block',\n minWidth: 0,\n whiteSpace: 'nowrap',\n overflow: 'hidden', \n textOverflow: 'ellipsis', \n textAlign: 'left'\n };\n \n const textContainerStyle = {\n minWidth: 0,\n flex: 1,\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center'\n };\n \n const wrapperStyle = {\n width: '100%',\n display: 'flex',\n justifyContent: effectiveLayoutMode === 'split' ? 'flex-start' : 'center',\n alignItems: 'center'\n };\n const badgeContent = (() => {\n switch (badgeType) {\n case 'stars':\n return (\n <div data-badge=\"true\" style={{ ...badgeStyle, color: '#f59e0b', backgroundColor: '#fff', border: '1px solid rgba(245,158,11,0.15)' }}>\n <div className=\"flex gap-1 items-center h-full shrink-0\">\n {[1, 2, 3, 4, 5].map((i) => (\n <Star key={i} size={iconSize} fill=\"#f59e0b\" stroke=\"#f59e0b\" style={iconStyle} />\n ))}\n </div>\n <span\n data-badge-score=\"true\"\n style={{\n fontSize: textSize,\n fontWeight: 800,\n color: '#111827',\n letterSpacing: '0',\n whiteSpace: 'nowrap',\n ...textCenterStyle(),\n transform: 'translateY(1px)', // align baseline slightly lower for preview\n }}\n >\n 5.0\n </span>\n </div>\n );\n case 'award': {\n const awardText = t('app.canvas.badges.award');\n return (\n <div data-badge=\"true\" style={{ ...badgeStyle, color: '#ef4444', backgroundColor: '#fef2f2', border: '1px solid rgba(239,68,68,0.25)' }}>\n <Award size={iconSize} style={iconStyle} className=\"shrink-0\" />\n <div style={textContainerStyle} data-badge-text=\"true\">\n <span\n style={{\n ...fluidTextStyle,\n fontSize: getAdjustedFontSize(awardText, textSize, 8),\n fontWeight: 800,\n color: '#7f1d1d',\n letterSpacing: '0',\n ...textCenterStyle(),\n }}\n >\n {awardText}\n </span>\n </div>\n </div>\n );\n }\n case 'download': {\n const dlLine1 = t('app.canvas.badges.downloadLine1');\n const dlLine2 = t('app.canvas.badges.downloadLine2');\n return (\n <div data-badge=\"true\" style={{ ...badgeStyle, backgroundColor: '#000', color: '#fff', border: '1px solid rgba(255,255,255,0.12)', boxShadow: 'none' }}>\n <DownloadCloud size={iconSize} style={iconStyle} className=\"shrink-0\" />\n <div style={textContainerStyle} data-badge-text=\"true\">\n <span\n style={{\n ...fluidTextStyle,\n fontSize: getAdjustedFontSize(dlLine1, textSize * 0.6, 12),\n opacity: 0.8,\n ...textCenterStyle(),\n }}\n data-badge-line=\"1\"\n >\n {dlLine1}\n </span>\n <span\n style={{\n ...fluidTextStyle,\n fontSize: getAdjustedFontSize(dlLine2, textSize, 8),\n fontWeight: 800,\n letterSpacing: '0',\n ...textCenterStyle(),\n }}\n data-badge-line=\"2\"\n >\n {dlLine2}\n </span>\n </div>\n </div>\n );\n }\n case 'googleplay': {\n const gpLine1 = t('app.canvas.badges.googleLine1');\n const gpLine2 = t('app.canvas.badges.googleLine2');\n return (\n <div data-badge=\"true\" style={{ ...badgeStyle, backgroundColor: '#000', color: '#fff', border: '1px solid rgba(255,255,255,0.12)', boxShadow: 'none' }}>\n <Play size={iconSize} fill=\"#fff\" style={iconStyle} className=\"shrink-0\" />\n <div style={textContainerStyle} data-badge-text=\"true\">\n <span\n style={{\n ...fluidTextStyle,\n fontSize: getAdjustedFontSize(gpLine1, textSize * 0.6, 12),\n opacity: 0.8,\n ...textCenterStyle(),\n }}\n data-badge-line=\"1\"\n >\n {gpLine1}\n </span>\n <span\n style={{\n ...fluidTextStyle,\n fontSize: getAdjustedFontSize(gpLine2, textSize, 8),\n fontWeight: 800,\n letterSpacing: '0',\n ...textCenterStyle(),\n }}\n data-badge-line=\"2\"\n >\n {gpLine2}\n </span>\n </div>\n </div>\n );\n }\n default:\n return null;\n }\n })();\n\n return (\n <div style={wrapperStyle}>\n {badgeContent}\n </div>\n );\n };\n\n const renderNotch = () => {\n const notch = frameConfig.notch;\n if (!notch) return null;\n const isLandscape = effectiveOrientation === 'landscape';\n\n const baseStyle = {\n position: 'absolute',\n backgroundColor: 'black',\n zIndex: 20,\n };\n\n if (notch.type === 'dynamicIsland') {\n const style = isLandscape\n ? {\n left: notch.top,\n top: '50%',\n transform: 'translateY(-50%)',\n width: notch.height,\n height: notch.width,\n borderRadius: notch.borderRadius,\n }\n : {\n top: notch.top,\n left: '50%',\n transform: 'translateX(-50%)',\n width: notch.width,\n height: notch.height,\n borderRadius: notch.borderRadius,\n };\n return (\n <div style={{ ...baseStyle, ...style }} className=\"flex items-center justify-end pr-2\">\n <div\n className=\"absolute bg-[#1a1a1a] rounded-full\"\n style={\n isLandscape\n ? { bottom: '20%', left: '50%', transform: 'translateX(-50%)', width: '30%', height: '30%' }\n : { right: '20%', top: '50%', transform: 'translateY(-50%)', width: '12px', height: '12px' }\n }\n >\n <div className=\"absolute top-1 left-1 w-1 h-1 rounded-full bg-white/20 blur-[1px]\" />\n </div>\n </div>\n );\n }\n\n if (notch.type === 'notch') {\n const style = isLandscape\n ? {\n left: notch.top,\n top: '50%',\n transform: 'translateY(-50%)',\n width: notch.height,\n height: notch.width,\n borderTopRightRadius: '16px',\n borderBottomRightRadius: '16px',\n borderTopLeftRadius: '0',\n borderBottomLeftRadius: '0',\n }\n : {\n top: notch.top,\n left: '50%',\n transform: 'translateX(-50%)',\n width: notch.width,\n height: notch.height,\n borderBottomLeftRadius: '16px',\n borderBottomRightRadius: '16px',\n borderTopLeftRadius: '0',\n borderTopRightRadius: '0',\n };\n return <div style={{ ...baseStyle, ...style }} />;\n }\n\n if (notch.type === 'punchhole') {\n const style = isLandscape\n ? {\n left: notch.top,\n top: '50%',\n transform: 'translateY(-50%)',\n width: notch.width,\n height: notch.height,\n borderRadius: '50%',\n }\n : {\n top: notch.top,\n left: '50%',\n transform: 'translateX(-50%)',\n width: notch.width,\n height: notch.height,\n borderRadius: '50%',\n };\n return <div style={{ ...baseStyle, ...style }} />;\n }\n\n return null;\n };\n\n const renderHomeButton = () => {\n const btn = frameConfig.homeButton;\n if (!btn) return null;\n const isLandscape = effectiveOrientation === 'landscape';\n const size = btn.width || '12%';\n const borderWidth = btn.borderWidth || '2px';\n const positionOffset = btn.bottom || '5%';\n\n if (isLandscape) {\n return (\n <div\n style={{\n position: 'absolute',\n right: positionOffset,\n top: '50%',\n transform: 'translate(50%, -50%)',\n height: size,\n width: 'auto',\n aspectRatio: '1 / 1',\n borderRadius: '50%',\n border: `${borderWidth} solid #333`,\n backgroundColor: '#111',\n boxShadow: 'inset 0 0 4px rgba(0,0,0,0.5)',\n }}\n />\n );\n }\n\n return (\n <div\n style={{\n position: 'absolute',\n bottom: positionOffset,\n left: '50%',\n transform: 'translate(-50%, 50%)',\n width: size,\n height: 'auto',\n aspectRatio: '1 / 1',\n borderRadius: '50%',\n border: `${borderWidth} solid #333`,\n backgroundColor: '#111',\n boxShadow: 'inset 0 0 4px rgba(0,0,0,0.5)',\n }}\n />\n );\n };\n const currentFrameColor = FRAME_COLORS[frameColor] || FRAME_COLORS.black;\n const getFrameGradient = (colorKey) => {\n switch (colorKey) {\n case 'titanium':\n return 'linear-gradient(135deg, #706f6f 0%, #9e9e9e 25%, #5e5e5e 50%, #8a8a8a 75%, #666666 100%)';\n case 'silver':\n return 'linear-gradient(135deg, #e0e0e0 0%, #ffffff 30%, #c0c0c0 50%, #f5f5f5 80%, #dcdcdc 100%)';\n case 'gold':\n return 'linear-gradient(135deg, #e6cfa5 0%, #fff5e0 30%, #d4b585 50%, #faeacc 80%, #e0c598 100%)';\n case 'blue':\n return 'linear-gradient(135deg, #2b3a4a 0%, #4a5c70 30%, #1e2a38 50%, #3e4f63 80%, #24303d 100%)';\n default:\n return 'linear-gradient(135deg, #333333 0%, #555555 30%, #1a1a1a 50%, #444444 80%, #222222 100%)';\n }\n };\n const frameGradient = getFrameGradient(frameColor);\n const frameShadow = 'none';\n\n const containerStyle = {\n ...layoutContainerStyle,\n boxShadow: 'none',\n filter: 'none',\n fontFamily: selectedFont,\n backgroundColor: bgColor,\n ...getBackgroundStyle(),\n position: 'relative',\n };\n\n const textJustifyClass = logoImage && effectiveLayoutMode === 'top' ? 'justify-start' : 'justify-center';\n\n return (\n <div\n id={id}\n data-device-name={currentDevice.name}\n data-capture-target=\"true\"\n style={containerStyle}\n className={`relative shrink-0 overflow-visible bg-white ${isBatchMode ? '' : 'transition-all duration-300 ease-in-out'}`}\n >\n {bgType === 'image' && bgImage && (\n <div\n className=\"absolute inset-0 z-0\"\n style={{\n backgroundImage: `url(${bgImage})`,\n backgroundSize: 'cover',\n backgroundPosition: 'center',\n filter: `blur(${bgBlur}px) brightness(${1 - bgOpacity * 0.01})`,\n transform: 'scale(1.1)',\n }}\n />\n )}\n {!isPro && (\n <div className=\"absolute inset-0 z-40 pointer-events-none flex flex-col items-center justify-center overflow-hidden\">\n <div className={`absolute inset-0 flex flex-wrap content-center justify-center gap-32 -rotate-12 scale-150 ${watermarkRepeatedTextColor}`}>\n {Array.from({ length: 30 }).map((_, i) => (\n <span key={i} className=\"text-4xl font-black uppercase whitespace-nowrap\">\n {t('app.canvas.watermark')}\n </span>\n ))}\n </div>\n <div\n data-watermark-badge=\"true\"\n className=\"bg-white/60 backdrop-blur-md border border-white/50 px-4 py-2 rounded-xl shadow-lg flex items-center gap-3 opacity-80 leading-none\"\n >\n <div className=\"w-6 h-6 bg-slate-900 rounded-md flex items-center justify-center text-white shrink-0\">\n <Smartphone size={14} />\n </div>\n <div className=\"h-6 flex items-center justify-center leading-none\">\n <span className=\"text-[10px] font-bold text-slate-900 uppercase tracking-wider leading-none pb-0.5\">\n {t('app.canvas.watermark')}\n </span>\n </div>\n </div>\n </div>\n )}\n {logoImage && (\n <div\n className=\"absolute z-20\"\n style={{\n top: `${logoMargin}px`,\n left: `${logoMargin}px`,\n width: `${logoSize}px`,\n height: `${logoSize}px`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-start',\n backgroundImage: `url(${logoImage})`,\n backgroundSize: 'contain',\n backgroundPosition: 'left center',\n backgroundRepeat: 'no-repeat',\n }}\n >\n </div>\n )}\n\n <div\n className={`flex-none flex flex-col ${textJustifyClass} ${effectiveLayoutMode === 'split' ? 'items-start text-left w-[45%]' : 'items-center text-center w-full'} z-50`}\n style={{\n color: textColor,\n gap: '16px',\n minHeight: textContainerMinHeight ? `${textContainerMinHeight}px` : undefined,\n borderTop: logoImage && effectiveLayoutMode === 'split' ? `${spacingHeight}px solid transparent` : undefined,\n marginTop: textMarginTopForLogo ? `${textMarginTopForLogo}px` : textLiftForLogo ? `-${textLiftForLogo}px` : undefined,\n boxSizing: 'border-box',\n }}\n >\n <h1\n style={{\n fontSize: `${getFitFontSize(headerText, headerSize, maxTextWidth, true)}px`, // 自動縮小を適用(太字)\n lineHeight: 1.1,\n fontWeight: 700,\n letterSpacing: '-0.02em',\n whiteSpace: 'nowrap',\n wordBreak: 'keep-all',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n minHeight: '1em',\n display: 'block',\n margin: 0,\n padding: 0,\n }}\n >\n {headerText}\n </h1>\n <h2\n style={{\n fontSize: `${getFitFontSize(subHeaderText, subHeaderSize, maxTextWidth, false)}px`, // 自動縮小を適用(通常)\n lineHeight: 1.3,\n fontWeight: 500,\n opacity: 0.85,\n whiteSpace: 'nowrap',\n wordBreak: 'keep-all',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n minHeight: '1em',\n display: 'block',\n margin: 0,\n padding: 0,\n }}\n >\n {subHeaderText}\n </h2>\n {renderBadge()}\n </div>\n\n <div\n className={`flex-none relative z-10 flex items-center justify-center ${effectiveLayoutMode === 'split' ? 'w-[50%]' : 'w-full'}`}\n style={{\n ...deviceWrapperStyle,\n boxShadow: 'none',\n borderRadius: `${currentDevice.radius}px`,\n backgroundColor: 'transparent',\n overflow: 'visible',\n filter: 'none',\n }}\n data-device-wrapper=\"true\"\n data-device-name={currentDevice.name}\n data-shadow-style={frameShadow}\n >\n {/* ... (Device inner content remains the same) ... */}\n <div style={{ ...deviceInnerStyle, overflow: 'visible' }} data-device-inner=\"true\">\n <div\n className=\"relative\"\n data-frame-shadow=\"true\"\n data-shadow-style={frameShadow}\n style={{\n width: '100%',\n height: '100%',\n borderRadius: `${currentDevice.radius}px`,\n background: isWatch ? currentFrameColor : frameGradient,\n boxShadow: 'none',\n padding: isWatch ? undefined : '4px',\n }}\n >\n {!isWatch && !currentDevice.type.includes('android') && (\n <>\n {orientation === 'landscape' ? (\n <>\n <div className=\"absolute left-[18%] -top-[2px] w-[12%] h-[2px] bg-slate-600 rounded-b-sm z-0\" />\n <div className=\"absolute left-[10%] -bottom-[2px] w-[4%] h-[2px] bg-slate-600 rounded-t-sm z-0\" />\n <div className=\"absolute left-[18%] -bottom-[2px] w-[8%] h-[2px] bg-slate-600 rounded-t-sm z-0\" />\n <div className=\"absolute left-[28%] -bottom-[2px] w-[8%] h-[2px] bg-slate-600 rounded-t-sm z-0\" />\n </>\n ) : (\n <>\n <div className=\"absolute top-[10%] -left-[2px] w-[2px] h-[4%] bg-slate-600 rounded-l-sm z-0\" />\n <div className=\"absolute top-[18%] -left-[2px] w-[2px] h-[8%] bg-slate-600 rounded-l-sm z-0\" />\n <div className=\"absolute top-[28%] -left-[2px] w-[2px] h-[8%] bg-slate-600 rounded-l-sm z-0\" />\n <div className=\"absolute top-[18%] -right-[2px] w-[2px] h-[12%] bg-slate-600 rounded-r-sm z-0\" />\n </>\n )}\n </>\n )}\n <div\n className=\"absolute bg-black overflow-hidden\"\n style={{\n top: `${currentDevice.bezel}px`,\n bottom: `${currentDevice.bezel}px`,\n left: `${currentDevice.bezel}px`,\n right: `${currentDevice.bezel}px`,\n borderRadius: `${currentDevice.radius - 4}px`,\n }}\n >\n <div\n className=\"relative w-full h-full bg-slate-900\"\n style={{\n top: currentDevice.type.includes('classic') ? (orientation === 'landscape' ? '0' : '10%') : '0',\n height: currentDevice.type.includes('classic') ? (orientation === 'landscape' ? '100%' : '80%') : '100%',\n width: currentDevice.type.includes('classic') ? (orientation === 'landscape' ? '80%' : '100%') : '100%',\n left: currentDevice.type.includes('classic') ? (orientation === 'landscape' ? '10%' : '0') : '0',\n }}\n >\n {screenshot ? (\n <div\n data-type=\"screen-image\"\n className=\"w-full h-full bg-cover bg-center bg-no-repeat\"\n style={{ backgroundImage: `url(${screenshot})` }}\n role=\"img\"\n aria-label=\"Screen\"\n />\n ) : (\n <div className=\"w-full h-full flex flex-col items-center justify-center text-center p-4 bg-slate-800 text-white/20\">\n {isWatch ? <Watch size={32} /> : <Smartphone size={48} />}\n </div>\n )}\n </div>\n {currentDevice.type.includes('classic') && (\n <>\n <div\n className={`absolute flex justify-center items-center ${\n orientation === 'landscape'\n ? 'left-0 top-0 bottom-0 w-[10%] flex-col gap-2'\n : 'top-0 left-0 right-0 h-[10%] flex-row gap-2'\n }`}\n >\n {!currentDevice.type.includes('ipad') && (\n <div\n className={`bg-[#333] rounded-full ${\n orientation === 'landscape' ? 'w-1.5 h-12' : 'w-12 h-1.5'\n }`}\n />\n )}\n <div className=\"w-2 h-2 bg-[#222] rounded-full\" />\n </div>\n </>\n )}\n {currentDevice.type === 'android-tablet' && (\n <div\n className={`absolute ${\n orientation === 'landscape' ? 'top-[50%] -translate-y-1/2 right-2' : 'top-2 left-[50%] -translate-x-1/2'\n } w-3 h-3 bg-[#111] rounded-full ring-1 ring-[#333]`}\n ></div>\n )}\n </div>\n {renderNotch()}\n {renderHomeButton()}\n {isWatch && (\n <div\n className=\"absolute bg-[#333] rounded-r-md shadow-sm border border-l-0 border-black z-0\"\n style={{\n right: '-6px',\n top: '28%',\n width: '8px',\n height: '32px',\n borderTopRightRadius: '4px',\n borderBottomRightRadius: '4px',\n }}\n ></div>\n )}\n <div className=\"absolute inset-0 rounded-[inherit] pointer-events-none bg-gradient-to-tr from-transparent via-white/5 to-transparent opacity-50 z-30\"></div>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default MockupCanvas;\n","import React, { useRef } from 'react';\nimport { CheckCircle2, Crown } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport useModalA11y from '../hooks/useModalA11y';\n\nconst UpgradeModal = ({ isOpen, onClose, onUpgrade }) => {\n const { t } = useTranslation();\n const panelRef = useRef(null);\n const upgradeButtonRef = useRef(null);\n const features = t('upgrade.features', { returnObjects: true }) || [];\n\n useModalA11y({\n isOpen,\n onClose,\n panelRef,\n initialFocusRef: upgradeButtonRef,\n });\n\n if (!isOpen) return null;\n return (\n <div\n className=\"fixed inset-0 z-[2000] bg-slate-900/60 backdrop-blur-sm flex items-center justify-center p-4 animate-in fade-in duration-200\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={t('upgrade.title', { defaultValue: 'Upgrade' })}\n onMouseDown={(event) => {\n if (event.target === event.currentTarget) onClose?.();\n }}\n >\n <div ref={panelRef} className=\"bg-white rounded-2xl shadow-2xl max-w-md w-full overflow-hidden\">\n <div className=\"bg-gradient-to-br from-slate-900 to-slate-800 p-8 text-center text-white relative overflow-hidden\">\n <div className=\"absolute top-0 left-0 w-full h-full opacity-10 bg-[url('https://www.transparenttextures.com/patterns/cubes.png')]\" />\n <div className=\"relative z-10\">\n <div className=\"w-12 h-12 bg-blue-500 rounded-xl flex items-center justify-center mx-auto mb-4 shadow-lg shadow-blue-500/30\">\n <Crown size={24} fill=\"white\" />\n </div>\n <h2 className=\"text-2xl font-bold mb-2\">{t('upgrade.title')}</h2>\n <p className=\"text-slate-300 text-sm\">{t('upgrade.subtitle')}</p>\n </div>\n </div>\n <div className=\"p-8\">\n <div className=\"space-y-4 mb-8\">\n {features.map((text) => (\n <Feature key={text} text={text} />\n ))}\n </div>\n <button\n ref={upgradeButtonRef}\n onClick={onUpgrade}\n className=\"w-full py-3 bg-blue-600 hover:bg-blue-700 text-white rounded-xl font-bold shadow-lg shadow-blue-600/20 transition-all transform hover:scale-[1.02] active:scale-[0.98]\"\n >\n {t('upgrade.cta')}\n </button>\n <p className=\"mt-3 text-[11px] text-slate-500 text-center leading-relaxed\">\n {t('upgrade.legal')}\n <br />\n <a href=\"/terms\" className=\"underline hover:text-slate-700\" target=\"_blank\" rel=\"noreferrer\">\n {t('landing.footer.terms')}\n </a>\n {' / '}\n <a href=\"/privacy\" className=\"underline hover:text-slate-700\" target=\"_blank\" rel=\"noreferrer\">\n {t('landing.footer.privacy')}\n </a>\n {' / '}\n <a href=\"/legal\" className=\"underline hover:text-slate-700\" target=\"_blank\" rel=\"noreferrer\">\n {t('landing.footer.legal')}\n </a>\n </p>\n <button\n onClick={onClose}\n className=\"w-full mt-3 py-2 text-slate-400 hover:text-slate-600 text-xs font-medium\"\n >\n {t('upgrade.later')}\n </button>\n </div>\n </div>\n </div>\n );\n};\n\nconst Feature = ({ text }) => (\n <div className=\"flex items-center gap-3 text-sm text-slate-700\">\n <CheckCircle2 size={18} className=\"text-green-500 shrink-0\" />\n <span>{text}</span>\n </div>\n);\n\nexport default UpgradeModal;\n","import React, { useMemo, useRef } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { X } from 'lucide-react';\nimport useModalA11y from '../hooks/useModalA11y';\nimport CopyButton from './CopyButton';\n\nconst CiQuickstartModal = ({ isOpen, onClose }) => {\n const { t } = useTranslation();\n const closeButtonRef = useRef(null);\n const panelRef = useRef(null);\n\n const ci = useMemo(() => t('landing.ciQuickstart', { returnObjects: true }) || {}, [t]);\n\n const title =\n typeof ci.title === 'string'\n ? ci.title\n : t('app.header.ciQuickstart', { defaultValue: 'CI quickstart' });\n const desc = typeof ci.desc === 'string' ? ci.desc : '';\n const codeLabel = typeof ci.codeLabel === 'string' ? ci.codeLabel : '';\n const code = typeof ci.code === 'string' ? ci.code : '';\n const note = typeof ci.note === 'string' ? ci.note : '';\n\n useModalA11y({\n isOpen,\n onClose,\n panelRef,\n initialFocusRef: closeButtonRef,\n });\n\n if (!isOpen) return null;\n\n return (\n <div\n className=\"fixed inset-0 z-[2100] bg-slate-900/60 backdrop-blur-sm flex items-center justify-center p-4 animate-in fade-in duration-200\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={title}\n onMouseDown={(event) => {\n if (event.target === event.currentTarget) onClose?.();\n }}\n >\n <div\n ref={panelRef}\n className=\"bg-white rounded-2xl shadow-2xl max-w-2xl w-full overflow-hidden border border-slate-200\"\n >\n <div className=\"flex items-start justify-between gap-4 px-6 py-4 border-b border-slate-200\">\n <div className=\"min-w-0\">\n <h2 className=\"text-lg font-black text-slate-900\">{title}</h2>\n {desc && <p className=\"text-sm text-slate-600 mt-1\">{desc}</p>}\n </div>\n <button\n ref={closeButtonRef}\n type=\"button\"\n onClick={onClose}\n className=\"shrink-0 p-2 rounded-full border border-slate-200 text-slate-600 hover:bg-slate-50\"\n aria-label={t('common.close', { defaultValue: 'Close' })}\n title={t('common.close', { defaultValue: 'Close' })}\n >\n <X size={16} />\n </button>\n </div>\n\n <div className=\"p-6 space-y-4\">\n <div className=\"rounded-xl border border-slate-200 bg-slate-950 text-slate-100 overflow-hidden\">\n <div className=\"flex items-center justify-between gap-3 px-4 py-2 border-b border-slate-800 bg-slate-950/80\">\n <div className=\"text-[11px] uppercase tracking-[0.2em] text-slate-400\">\n {codeLabel || t('landing.ciQuickstart.codeLabel', { defaultValue: 'Commands' })}\n </div>\n <CopyButton\n value={code}\n className=\"text-[11px] px-2 py-1 rounded-md border border-slate-700 bg-slate-900/60 text-slate-100 hover:bg-slate-900 transition disabled:opacity-50 disabled:cursor-not-allowed\"\n />\n </div>\n <pre className=\"p-4 text-xs font-mono whitespace-pre overflow-auto max-h-[50vh] leading-relaxed\">\n {code}\n </pre>\n </div>\n\n {note && <p className=\"text-xs text-slate-500\">{note}</p>}\n </div>\n </div>\n </div>\n );\n};\n\nexport default CiQuickstartModal;\n","function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function (obj) {\n return typeof obj;\n };\n } else {\n _typeof = function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n}\n\nvar RELEASE_TRAIN = 'clover';\n\nvar runtimeVersionToUrlVersion = function runtimeVersionToUrlVersion(version) {\n return version === 3 ? 'v3' : version;\n};\n\nvar ORIGIN = 'https://js.stripe.com';\nvar STRIPE_JS_URL = \"\".concat(ORIGIN, \"/\").concat(RELEASE_TRAIN, \"/stripe.js\");\nvar V3_URL_REGEX = /^https:\\/\\/js\\.stripe\\.com\\/v3\\/?(\\?.*)?$/;\nvar STRIPE_JS_URL_REGEX = /^https:\\/\\/js\\.stripe\\.com\\/(v3|[a-z]+)\\/stripe\\.js(\\?.*)?$/;\nvar EXISTING_SCRIPT_MESSAGE = 'loadStripe.setLoadParameters was called but an existing Stripe.js script already exists in the document; existing script parameters will be used';\n\nvar isStripeJSURL = function isStripeJSURL(url) {\n return V3_URL_REGEX.test(url) || STRIPE_JS_URL_REGEX.test(url);\n};\n\nvar findScript = function findScript() {\n var scripts = document.querySelectorAll(\"script[src^=\\\"\".concat(ORIGIN, \"\\\"]\"));\n\n for (var i = 0; i < scripts.length; i++) {\n var script = scripts[i];\n\n if (!isStripeJSURL(script.src)) {\n continue;\n }\n\n return script;\n }\n\n return null;\n};\n\nvar injectScript = function injectScript(params) {\n var queryString = params && !params.advancedFraudSignals ? '?advancedFraudSignals=false' : '';\n var script = document.createElement('script');\n script.src = \"\".concat(STRIPE_JS_URL).concat(queryString);\n var headOrBody = document.head || document.body;\n\n if (!headOrBody) {\n throw new Error('Expected document.body not to be null. Stripe.js requires a <body> element.');\n }\n\n headOrBody.appendChild(script);\n return script;\n};\n\nvar registerWrapper = function registerWrapper(stripe, startTime) {\n if (!stripe || !stripe._registerWrapper) {\n return;\n }\n\n stripe._registerWrapper({\n name: 'stripe-js',\n version: \"8.7.0\",\n startTime: startTime\n });\n};\n\nvar stripePromise$1 = null;\nvar onErrorListener = null;\nvar onLoadListener = null;\n\nvar onError = function onError(reject) {\n return function (cause) {\n reject(new Error('Failed to load Stripe.js', {\n cause: cause\n }));\n };\n};\n\nvar onLoad = function onLoad(resolve, reject) {\n return function () {\n if (window.Stripe) {\n resolve(window.Stripe);\n } else {\n reject(new Error('Stripe.js not available'));\n }\n };\n};\n\nvar loadScript = function loadScript(params) {\n // Ensure that we only attempt to load Stripe.js at most once\n if (stripePromise$1 !== null) {\n return stripePromise$1;\n }\n\n stripePromise$1 = new Promise(function (resolve, reject) {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n // Resolve to null when imported server side. This makes the module\n // safe to import in an isomorphic code base.\n resolve(null);\n return;\n }\n\n if (window.Stripe && params) {\n console.warn(EXISTING_SCRIPT_MESSAGE);\n }\n\n if (window.Stripe) {\n resolve(window.Stripe);\n return;\n }\n\n try {\n var script = findScript();\n\n if (script && params) {\n console.warn(EXISTING_SCRIPT_MESSAGE);\n } else if (!script) {\n script = injectScript(params);\n } else if (script && onLoadListener !== null && onErrorListener !== null) {\n var _script$parentNode;\n\n // remove event listeners\n script.removeEventListener('load', onLoadListener);\n script.removeEventListener('error', onErrorListener); // if script exists, but we are reloading due to an error,\n // reload script to trigger 'load' event\n\n (_script$parentNode = script.parentNode) === null || _script$parentNode === void 0 ? void 0 : _script$parentNode.removeChild(script);\n script = injectScript(params);\n }\n\n onLoadListener = onLoad(resolve, reject);\n onErrorListener = onError(reject);\n script.addEventListener('load', onLoadListener);\n script.addEventListener('error', onErrorListener);\n } catch (error) {\n reject(error);\n return;\n }\n }); // Resets stripePromise on error\n\n return stripePromise$1[\"catch\"](function (error) {\n stripePromise$1 = null;\n return Promise.reject(error);\n });\n};\nvar initStripe = function initStripe(maybeStripe, args, startTime) {\n if (maybeStripe === null) {\n return null;\n }\n\n var pk = args[0];\n\n if (typeof pk !== 'string') {\n throw new Error(\"Expected publishable key to be of type string, got type \".concat(_typeof(pk), \" instead.\"));\n }\n\n var isTestKey = pk.match(/^pk_test/); // @ts-expect-error this is not publicly typed\n\n var version = runtimeVersionToUrlVersion(maybeStripe.version);\n var expectedVersion = RELEASE_TRAIN;\n\n if (isTestKey && version !== expectedVersion) {\n console.warn(\"Stripe.js@\".concat(version, \" was loaded on the page, but @stripe/stripe-js@\").concat(\"8.7.0\", \" expected Stripe.js@\").concat(expectedVersion, \". This may result in unexpected behavior. For more information, see https://docs.stripe.com/sdks/stripejs-versioning\"));\n }\n\n var stripe = maybeStripe.apply(undefined, args);\n registerWrapper(stripe, startTime);\n return stripe;\n}; // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\nvar stripePromise;\nvar loadCalled = false;\n\nvar getStripePromise = function getStripePromise() {\n if (stripePromise) {\n return stripePromise;\n }\n\n stripePromise = loadScript(null)[\"catch\"](function (error) {\n // clear cache on error\n stripePromise = null;\n return Promise.reject(error);\n });\n return stripePromise;\n}; // Execute our own script injection after a tick to give users time to do their\n// own script injection.\n\n\nPromise.resolve().then(function () {\n return getStripePromise();\n})[\"catch\"](function (error) {\n if (!loadCalled) {\n console.warn(error);\n }\n});\nvar loadStripe = function loadStripe() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n loadCalled = true;\n var startTime = Date.now(); // if previous attempts are unsuccessful, will re-load script\n\n return getStripePromise().then(function (maybeStripe) {\n return initStripe(maybeStripe, args, startTime);\n });\n};\n\nexport { loadStripe };\n","const API_BASE = import.meta.env.VITE_API_ENDPOINT || '';\n\nconst jsonHeaders = { 'Content-Type': 'application/json' };\nconst authHeaders = (token) => (token ? { Authorization: `Bearer ${token}` } : undefined);\n\nconst apiFetch = async (path, options = {}) => {\n const url = `${API_BASE}${path}`;\n const resp = await fetch(url, {\n ...options,\n headers: { ...jsonHeaders, ...(options.headers || {}) },\n });\n if (!resp.ok) {\n const message = await resp.text();\n if (resp.status === 401 && typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent('auth:unauthorized'));\n }\n throw new Error(`API error ${resp.status}: ${message}`);\n }\n if (resp.status === 204) return null;\n return resp.json();\n};\n\nexport const saveProject = (payload) => apiFetch('/projects', { method: 'POST', body: JSON.stringify(payload) });\nexport const loadProject = (id) => apiFetch(`/projects/${id}`, { method: 'GET' });\nexport const createCheckoutSession = (payload, token) =>\n apiFetch('/billing/checkout', {\n method: 'POST',\n body: JSON.stringify(payload),\n headers: authHeaders(token),\n });\nexport const getCurrentUserProfile = (token) =>\n apiFetch('/me', { method: 'GET', headers: authHeaders(token) });\nexport const createPortalSession = (token) =>\n apiFetch('/billing/portal', { method: 'POST', headers: authHeaders(token) });\n\n// --- Team (MVP) ---\nexport const listTeamWorkspaces = (token) => apiFetch('/team/workspaces', { method: 'GET', headers: authHeaders(token) });\nexport const createTeamWorkspace = (payload, token) =>\n apiFetch('/team/workspaces', { method: 'POST', body: JSON.stringify(payload), headers: authHeaders(token) });\nexport const getTeamWorkspace = (workspaceId, token) =>\n apiFetch(`/team/workspaces/${encodeURIComponent(workspaceId)}`, { method: 'GET', headers: authHeaders(token) });\nexport const listTeamProjects = (workspaceId, token) =>\n apiFetch(`/team/workspaces/${encodeURIComponent(workspaceId)}/projects`, { method: 'GET', headers: authHeaders(token) });\nexport const createTeamProject = (workspaceId, payload, token) =>\n apiFetch(`/team/workspaces/${encodeURIComponent(workspaceId)}/projects`, {\n method: 'POST',\n body: JSON.stringify(payload),\n headers: authHeaders(token),\n });\nexport const getTeamProject = (workspaceId, projectId, token) =>\n apiFetch(`/team/workspaces/${encodeURIComponent(workspaceId)}/projects/${encodeURIComponent(projectId)}`, {\n method: 'GET',\n headers: authHeaders(token),\n });\nexport const updateTeamProject = (workspaceId, projectId, payload, token) =>\n apiFetch(`/team/workspaces/${encodeURIComponent(workspaceId)}/projects/${encodeURIComponent(projectId)}`, {\n method: 'PUT',\n body: JSON.stringify(payload),\n headers: authHeaders(token),\n });\nexport const createTeamInvite = (workspaceId, payload, token) =>\n apiFetch(`/team/workspaces/${encodeURIComponent(workspaceId)}/invites`, {\n method: 'POST',\n body: JSON.stringify(payload),\n headers: authHeaders(token),\n });\nexport const acceptTeamInvite = (inviteToken, token) =>\n apiFetch(`/team/invites/${encodeURIComponent(inviteToken)}/accept`, { method: 'POST', headers: authHeaders(token) });\n\nexport default apiFetch;\n","import { loadStripe } from '@stripe/stripe-js';\nimport { createCheckoutSession } from './apiClient';\n\nexport const getStripePublicKey = () => import.meta.env.VITE_STRIPE_PUBLIC_KEY || '';\n\n// Stripe Checkout を開始: バックエンドで Session を作成し、Stripe.js でリダイレクト\nexport const createCheckout = async ({ priceId, email, token } = {}) => {\n const pk = getStripePublicKey();\n if (!pk) throw new Error('Stripe public key not configured');\n const stripe = await loadStripe(pk);\n if (!stripe) throw new Error('Stripe.js failed to load');\n\n const session = await createCheckoutSession({ priceId, email }, token);\n const sessionId = session?.sessionId || session?.id;\n\n if (sessionId) {\n const result = await stripe.redirectToCheckout({ sessionId });\n if (result?.error) throw new Error(result.error.message || 'Stripe redirect failed');\n return result;\n }\n\n if (session?.url) {\n window.location.assign(session.url);\n return null;\n }\n\n throw new Error('Invalid checkout session response');\n};\n","export const DEVICE_LABEL_MODES = {\n store: 'store',\n detailed: 'detailed',\n};\n\nexport const formatDeviceDimensions = (deviceDef) => {\n const width = deviceDef?.width;\n const height = deviceDef?.height;\n if (!width || !height) return '';\n return `${width}×${height}px`;\n};\n\nexport const getDeviceLabelParts = (deviceDef, { id = '', mode = DEVICE_LABEL_MODES.store } = {}) => {\n const storeLabel = deviceDef?.storeLabel || deviceDef?.name || id;\n const rawModelLabel = deviceDef?.modelLabel || '';\n const modelLabel = rawModelLabel && rawModelLabel !== storeLabel ? rawModelLabel : '';\n const dimensions = formatDeviceDimensions(deviceDef);\n\n const storeWithModel = modelLabel ? `${storeLabel} (${modelLabel})` : storeLabel;\n\n const primary = mode === DEVICE_LABEL_MODES.detailed ? modelLabel || storeLabel : storeLabel;\n const secondary =\n mode === DEVICE_LABEL_MODES.detailed\n ? [modelLabel ? storeLabel : null, dimensions].filter(Boolean).join(' • ')\n : [modelLabel || null, dimensions].filter(Boolean).join(' • ');\n\n const optionLabel =\n mode === DEVICE_LABEL_MODES.detailed\n ? [primary, dimensions, modelLabel ? storeLabel : null].filter(Boolean).join(' - ')\n : storeWithModel;\n\n return {\n storeLabel,\n modelLabel,\n dimensions,\n storeWithModel,\n optionLabel,\n primary,\n secondary,\n shortLabel: primary,\n };\n};\n\nexport const normalizeDeviceSearchQuery = (query = '') =>\n query\n .toLowerCase()\n .replace(/×/g, 'x')\n .replace(/[\"'()]/g, '')\n .trim();\n\nexport const deviceMatchesQuery = (deviceId, deviceDef, query) => {\n const normalized = normalizeDeviceSearchQuery(query);\n if (!normalized) return true;\n\n const tokens = normalized.split(/\\s+/).filter(Boolean);\n if (!tokens.length) return true;\n\n const { storeLabel, modelLabel } = getDeviceLabelParts(deviceDef, { id: deviceId, mode: DEVICE_LABEL_MODES.store });\n const width = deviceDef?.width;\n const height = deviceDef?.height;\n\n const haystack = [\n deviceId,\n deviceDef?.group,\n deviceDef?.type,\n storeLabel,\n modelLabel,\n deviceDef?.name,\n width && height ? `${width}x${height}` : null,\n width && height ? `${height}x${width}` : null,\n width && height ? `${width} ${height}` : null,\n ]\n .filter(Boolean)\n .join(' ')\n .toLowerCase()\n .replace(/×/g, 'x');\n\n return tokens.every((token) => haystack.includes(token));\n};\n","import { useCallback, useState } from 'react';\n\nconst throwIfAborted = (signal) => {\n if (signal?.aborted) {\n throw new Error('Aborted');\n }\n};\n\nconst loadScript = (src, globalKey) =>\n new Promise((resolve, reject) => {\n if (globalKey && window[globalKey]) return resolve(window[globalKey]);\n const script = document.createElement('script');\n script.src = src;\n script.onload = () => resolve(globalKey ? window[globalKey] : undefined);\n script.onerror = reject;\n document.head.appendChild(script);\n });\n\nconst elevateTextLayer = (root) => {\n const h1 = root.querySelector('h1');\n const h2 = root.querySelector('h2');\n const textContainer = h1?.parentElement || h2?.parentElement;\n if (textContainer) {\n textContainer.style.position = 'relative';\n textContainer.style.zIndex = '1000';\n }\n};\n\nconst normalizeBackground = (bgString, fallback) => {\n if (!bgString) return fallback;\n const trimmed = bgString.toLowerCase();\n if (trimmed === 'transparent' || trimmed === 'rgba(0, 0, 0, 0)') return fallback;\n if (trimmed.startsWith('rgba')) {\n const alpha = parseFloat(trimmed.split(',')[3]);\n if (!Number.isNaN(alpha) && alpha === 0) return fallback;\n }\n return bgString;\n};\n\nconst parseSingleShadow = (shadow) => {\n if (!shadow) return null;\n const tokens = shadow.split(/\\s+/);\n if (tokens.length < 3) return null;\n const color = tokens.pop();\n let spread = 0;\n if (tokens.length >= 4) {\n spread = parseFloat(tokens.pop()) || 0;\n }\n const [offsetX = '0px', offsetY = '16px', blur = '40px'] = tokens;\n return {\n offsetX: parseFloat(offsetX) || 0,\n offsetY: parseFloat(offsetY) || 0,\n blur: parseFloat(blur) || 0,\n spread,\n color,\n };\n};\n\n/**\n * Handles html2canvas capture and JSZip bundling for exports.\n */\nexport default function useAssetExport({ deviceLibrary, bgType, bgColor }) {\n const [isExporting, setIsExporting] = useState(false);\n const [progress, setProgress] = useState({ current: 0, total: 0 });\n\n const ensureHtml2Canvas = useCallback(() => loadScript('https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js', 'html2canvas'), []);\n const ensureJSZip = useCallback(() => loadScript('https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js', 'JSZip'), []);\n\n const parseBoxShadow = (shadow) => {\n if (!shadow) return null;\n const candidates = shadow\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s && !s.startsWith('inset'));\n if (!candidates.length) return null;\n\n let best = null;\n candidates.forEach((candidate) => {\n const parsed = parseSingleShadow(candidate);\n if (!parsed) return;\n if (!best || parsed.blur > best.blur) {\n best = parsed;\n }\n });\n return best;\n };\n\n const normalizeShadowColor = (color, minAlpha = 1) => {\n if (!color) return `rgba(0,0,0,${minAlpha})`;\n const clamp = (v, lo, hi) => Math.max(lo, Math.min(hi, v));\n if (color.startsWith('rgba')) {\n const parts = color.replace(/[^\\d.,]/g, '').split(',').map(Number);\n if (parts.length >= 4) {\n const alpha = clamp(parts[3], minAlpha, 1);\n return `rgba(${parts[0]},${parts[1]},${parts[2]},${alpha})`;\n }\n }\n if (color.startsWith('rgb(')) {\n const parts = color.replace(/[^\\d.,]/g, '').split(',').map(Number);\n if (parts.length >= 3) {\n return `rgba(${parts[0]},${parts[1]},${parts[2]},${Math.max(minAlpha, 0.6)})`;\n }\n }\n return color;\n };\n\n const drawRoundedRect = (ctx, x, y, w, h, r) => {\n const radius = Math.max(0, r || 0);\n ctx.beginPath();\n ctx.moveTo(x + radius, y);\n ctx.lineTo(x + w - radius, y);\n ctx.quadraticCurveTo(x + w, y, x + w, y + radius);\n ctx.lineTo(x + w, y + h - radius);\n ctx.quadraticCurveTo(x + w, y + h, x + w - radius, y + h);\n ctx.lineTo(x + radius, y + h);\n ctx.quadraticCurveTo(x, y + h, x, y + h - radius);\n ctx.lineTo(x, y + radius);\n ctx.quadraticCurveTo(x, y, x + radius, y);\n ctx.closePath();\n };\n\n const composeWithShadow = (canvas, backgroundColor = null) => {\n // html2canvas が描画したままを返す。背景色が明示されたときのみ塗る。\n if (!backgroundColor) return canvas;\n const out = document.createElement('canvas');\n out.width = canvas.width;\n out.height = canvas.height;\n const ctx = out.getContext('2d');\n ctx.fillStyle = backgroundColor;\n ctx.fillRect(0, 0, out.width, out.height);\n ctx.drawImage(canvas, 0, 0);\n return out;\n };\n\n const prepareCloneForCapture = useCallback((originalElement, currentBgType, explicitBgColor) => {\n let baseWidth = originalElement.offsetWidth;\n let baseHeight = originalElement.offsetHeight;\n\n if (originalElement.style.width && originalElement.style.width.endsWith('px')) {\n baseWidth = parseInt(originalElement.style.width, 10);\n }\n if (originalElement.style.height && originalElement.style.height.endsWith('px')) {\n baseHeight = parseInt(originalElement.style.height, 10);\n }\n // html2canvas の素の描画結果を使うためパディングは付けない\n const pad = 0;\n const targetWidth = baseWidth + pad * 2;\n const targetHeight = baseHeight + pad * 2;\n const solidBg = normalizeBackground(explicitBgColor, '#ffffff');\n const isSolid = currentBgType === 'solid';\n const baseBg = isSolid ? solidBg : currentBgType === 'transparent' ? 'transparent' : undefined;\n const captureBg = null;\n const outputBg = isSolid ? solidBg : null;\n\n const cs = window.getComputedStyle(originalElement);\n const computedBackground = cs.background && cs.background !== 'none' ? cs.background : undefined;\n const captureBackgroundStyle = baseBg ?? computedBackground ?? 'transparent';\n\n const clone = originalElement.cloneNode(true);\n clone.style.position = 'relative';\n clone.style.transform = 'none';\n clone.style.transformOrigin = 'top left';\n clone.style.width = `${baseWidth}px`;\n clone.style.height = `${baseHeight}px`;\n clone.style.overflow = 'visible';\n clone.style.margin = '0';\n if (baseBg !== undefined) {\n clone.style.background = baseBg;\n } else if (computedBackground) {\n clone.style.background = computedBackground;\n }\n\n const toDropShadowFilter = (shadow) => {\n if (!shadow) return '';\n const terms = shadow\n .split(',')\n .map((part) => part.trim())\n .filter((part) => part && !part.startsWith('inset'));\n if (!terms.length) return '';\n\n let best = '';\n let maxBlur = -1;\n terms.forEach((term) => {\n const parsed = parseSingleShadow(term.replace('inset', '').trim());\n if (parsed && parsed.blur > maxBlur) {\n maxBlur = parsed.blur;\n best = `${parsed.offsetX}px ${parsed.offsetY}px ${parsed.blur}px ${parsed.color}`;\n }\n });\n\n return best ? `drop-shadow(${best})` : '';\n };\n\n const shadowElements = clone.querySelectorAll('[data-frame-shadow=\"true\"], [data-device-wrapper=\"true\"]');\n shadowElements.forEach((node) => {\n const shadow = node?.dataset?.shadowStyle;\n const fallbackShadow = shadow || '0 40px 140px -28px rgba(0,0,0,0.6)';\n const dropShadow = toDropShadowFilter(fallbackShadow);\n node.style.boxShadow = fallbackShadow;\n if (dropShadow) {\n const existingFilter = node.style.filter === 'none' ? '' : (node.style.filter || '');\n node.style.filter = `${existingFilter} ${dropShadow}`.trim();\n }\n });\n\n // Tighten store badge text line spacing only for export to avoid preview layout changes\n const badgeTextContainers = clone.querySelectorAll('[data-badge-text=\"true\"]');\n badgeTextContainers.forEach((container) => {\n container.style.lineHeight = '0.55';\n container.style.gap = '0px';\n container.style.display = 'flex';\n container.style.flexDirection = 'column';\n container.style.justifyContent = 'center';\n });\n const badgeLines = clone.querySelectorAll('[data-badge-line]');\n badgeLines.forEach((span) => {\n const line = span.dataset.badgeLine;\n // tighten line spacing for export without affecting preview\n span.style.lineHeight = '0.55';\n span.style.display = 'block';\n span.style.transform = 'translateY(-3px)';\n if (line === '1') {\n span.style.marginBottom = '-8px';\n }\n if (line === '2') {\n span.style.marginTop = '-10px';\n }\n });\n\n const getNodeSize = (node) => {\n if (!node) return { width: 0, height: 0 };\n const rect = node.getBoundingClientRect();\n const cs = window.getComputedStyle(node);\n const width =\n node.offsetWidth ||\n rect.width ||\n parseFloat(cs.width) ||\n parseFloat(cs.maxWidth) ||\n parseFloat(cs.minWidth) ||\n 0;\n const height =\n node.offsetHeight ||\n rect.height ||\n parseFloat(cs.height) ||\n parseFloat(cs.maxHeight) ||\n parseFloat(cs.minHeight) ||\n 0;\n return { width, height };\n };\n\n // Prepare container before measuring shadow sizes.\n const shadowWrapper = document.createElement('div');\n shadowWrapper.style.position = 'absolute';\n shadowWrapper.style.top = `${pad}px`;\n shadowWrapper.style.left = `${pad}px`;\n shadowWrapper.style.background = captureBackgroundStyle;\n shadowWrapper.style.boxShadow = 'none';\n shadowWrapper.style.borderRadius = '48px';\n shadowWrapper.style.display = 'inline-block';\n shadowWrapper.style.overflow = 'visible';\n shadowWrapper.appendChild(clone);\n\n const container = document.createElement('div');\n container.style.position = 'fixed';\n container.style.top = '-10000px';\n container.style.left = '-10000px';\n container.style.width = `${targetWidth}px`;\n container.style.height = `${targetHeight}px`;\n container.style.zIndex = '-1000';\n container.style.background = captureBackgroundStyle;\n container.style.overflow = 'visible';\n container.appendChild(shadowWrapper);\n document.body.appendChild(container);\n\n // Collect shadow info directly from frame nodes to re-draw shadows.\n const manualShadowsRaw = [];\n const wrappers = clone.querySelectorAll('[data-device-wrapper=\"true\"]');\n wrappers.forEach((node) => {\n const frameNode = node.querySelector('[data-frame-shadow=\"true\"]');\n const frameRect = frameNode?.getBoundingClientRect();\n const shadow = frameNode?.dataset?.shadowStyle || node.dataset.shadowStyle || node.style.boxShadow || '0 40px 140px -28px rgba(0,0,0,0.6)';\n const radius = frameNode?.style?.borderRadius || node.style.borderRadius || '48px';\n const frameSize = getNodeSize(frameNode);\n const wrapperSize = getNodeSize(node);\n const fallbackWidth = wrapperSize.width || frameSize.width;\n const fallbackHeight = wrapperSize.height || frameSize.height;\n const containerRect = container.getBoundingClientRect();\n const targetRect = frameRect || node.getBoundingClientRect();\n const size = {\n width: targetRect.width || fallbackWidth || 0,\n height: targetRect.height || fallbackHeight || 0,\n };\n const x = targetRect.left - containerRect.left;\n const y = targetRect.top - containerRect.top;\n manualShadowsRaw.push({\n x,\n y,\n width: size.width,\n height: size.height,\n radius: parseFloat(radius) || 48,\n shadow,\n });\n });\n\n // manual shadow redraw は行わず、DOM の shadow をそのまま html2canvas に任せる\n const manualShadows = [];\n\n // Badge presence flag (used for conditional spacing/offset)\n const hasBadge = !!clone.querySelector('[data-badge=\"true\"]');\n\n // Detect device type (watch needs gentler adjustments)\n const detectDevice = () => {\n const wrapper = clone.querySelector('[data-device-wrapper=\"true\"]');\n const deviceName = wrapper?.dataset?.deviceName;\n if (!deviceName) return null;\n const match = Object.values(deviceLibrary || {}).find((d) => d.name === deviceName);\n return match || null;\n };\n const deviceInfo = detectDevice();\n const isWatch = deviceInfo?.type === 'watch';\n\n // Keep original shadows (avoid filter drop in html2canvas)\n const deviceWrapper = clone.querySelector('[data-device-wrapper=\"true\"]');\n if (deviceWrapper) {\n deviceWrapper.style.filter = 'none'; // allow box-shadow to be captured, avoid filter\n // Nudge device up (less for badge有り、強めに上げるのはバッジ無しのみ)\n const existingTransform = deviceWrapper.style.transform && deviceWrapper.style.transform !== 'none' ? deviceWrapper.style.transform + ' ' : '';\n const deviceLift = isWatch ? 0 : hasBadge ? -1 : -9;\n deviceWrapper.style.transform = `${existingTransform}translateY(${deviceLift}px)`.trim();\n }\n const badges = clone.querySelectorAll('[data-badge=\"true\"]');\n badges.forEach(badge => {\n const badgeShadow = badge?.dataset?.shadowStyle || badge.style.boxShadow || '0 6px 18px rgba(0,0,0,0.25)';\n const badgeDrop = toDropShadowFilter(badgeShadow);\n badge.style.filter = 'none'; // keep original box-shadow\n badge.style.boxShadow = badgeShadow;\n // サブテキストとの間隔をさらに詰める(追加で -2px、クランプなし)\n if (!isWatch) {\n const badgeCs = window.getComputedStyle(badge);\n const badgeMt = parseFloat(badgeCs.marginTop) || 0;\n badge.style.marginTop = `${badgeMt - 6}px`;\n }\n // 追加で視覚的に上に持ち上げる(marginだけで効かない場合の保険)\n const existingBadgeTransform = badge.style.transform && badge.style.transform !== 'none' ? badge.style.transform + ' ' : '';\n if (!isWatch) {\n badge.style.transform = `${existingBadgeTransform}translateY(-2px)`.trim();\n }\n // 事前のレイアウトサイズを固定し、エクスポート時に拡大・縮小しないようにする\n const badgeRect = badge.getBoundingClientRect();\n if (badgeRect?.width && badgeRect?.height) {\n badge.style.width = `${badgeRect.width}px`;\n badge.style.height = `${badgeRect.height}px`;\n }\n // enforce no-wrap styling for export to avoid unintended line breaks\n badge.style.whiteSpace = 'nowrap';\n badge.style.wordBreak = 'keep-all';\n badge.style.flexWrap = 'nowrap';\n badge.style.overflow = 'visible';\n badge.style.minWidth = 'max-content';\n // MockupCanvas 側の textContainerStyle で overflow hidden が効いているため、エクスポート時は解除して切れを防ぐ\n badge.querySelectorAll('div[data-badge-text=\"true\"]').forEach((div) => {\n div.style.overflow = 'visible';\n div.style.height = 'auto';\n div.style.display = 'flex';\n div.style.flexDirection = 'column';\n div.style.paddingBottom = '20px';\n div.style.marginBottom = '-20px';\n });\n // lift badge text slightly only for export (previewはそのまま)\n badge.querySelectorAll('span').forEach((span) => {\n const existing = span.style.transform && span.style.transform !== 'none' ? span.style.transform + ' ' : '';\n // html2canvas のベースラインずれ補正(さらに上げる)\n const isBadgeScore = span.dataset?.badgeScore === 'true';\n if (isBadgeScore) {\n // Override to absolute lift for rating score text (preview had +3px)\n span.style.transform = isWatch ? 'translateY(-8px)' : 'translateY(-12px)';\n } else if (isWatch) {\n // Watch はわずかにだけ持ち上げて中央寄せ\n span.style.transform = `${existing}translateY(-5px)`.trim();\n } else {\n span.style.transform = `${existing}translateY(-11px)`.trim();\n }\n // html2canvas の幅計算ずれを防ぐため letter-spacing をリセット\n span.style.letterSpacing = 'normal';\n span.style.whiteSpace = 'nowrap';\n span.style.wordBreak = 'keep-all';\n span.style.lineHeight = '1.2';\n span.style.paddingBottom = '0px';\n span.style.marginBottom = '0px';\n span.style.display = 'block';\n span.style.overflow = 'visible';\n });\n if (badgeDrop) {\n const existingFilter = badge.style.filter === 'none' ? '' : (badge.style.filter || '');\n badge.style.filter = `${existingFilter} ${badgeDrop}`.trim();\n }\n });\n\n // ウォーターマークバッジの沈み込み対策(エクスポート時のみ適用)\n const watermarkBadges = clone.querySelectorAll('[data-watermark-badge=\"true\"]');\n watermarkBadges.forEach((wb) => {\n wb.style.display = 'flex';\n wb.style.alignItems = 'center';\n wb.style.justifyContent = 'center';\n const spans = wb.querySelectorAll('span');\n spans.forEach((span) => {\n span.style.transform = 'translateY(-5.5px)'; // 1px下げて合計5.5px持ち上げ\n span.style.display = 'inline-block';\n span.style.lineHeight = '1';\n });\n });\n\n// --- テキストの下部切れ対策(エクスポート専用) ---\n clone.querySelectorAll('h1, h2').forEach((el) => {\n // 1. overflowをvisibleにし、切り落とし(clip)設定にする\n el.style.overflow = 'visible';\n el.style.textOverflow = 'clip';\n\n // 2. テキストシャドウは無効化(レイアウト計算への干渉防止)\n el.style.textShadow = 'none';\n\n // 3. 追加パディングで描画領域をさらに確保 (ディセンダー用)\n const paddingToAdd = isWatch ? 8 : 15;\n el.style.paddingBottom = `${paddingToAdd}px`;\n\n // 4. レイアウト崩れ防止と下部スペースの微調整\n const style = window.getComputedStyle(el);\n const currentMt = parseFloat(style.marginTop) || 0;\n const currentMb = parseFloat(style.marginBottom) || 0;\n if (!isWatch) {\n // キャンバス上端からの余白を少し広げる(-24px → -23px)\n el.style.marginTop = `${currentMt - 23}px`;\n }\n // h1-h2間のギャップを広げる(h1のみ +32px)(watchは微調整)\n if (el.tagName === 'H1') {\n if (!isWatch) {\n el.style.marginBottom = `${currentMb + 32}px`;\n } else {\n el.style.marginBottom = `${currentMb - 2}px`;\n }\n } else {\n // h2→バッジ間は固定で広げる(バッジ有りの場合のみ)\n if (!isWatch && hasBadge) {\n el.style.marginBottom = `-4px`;\n } else if (isWatch && hasBadge) {\n el.style.marginBottom = `${currentMb + 4}px`;\n } else {\n el.style.marginBottom = `${currentMb}px`;\n }\n }\n\n // 5. 視覚的な位置補正(エクスポート時のみ上に持ち上げる)\n if (el.tagName === 'H2') {\n if (!isWatch) {\n // バッジ無しのときはさらに持ち上げる\n const h2Lift = hasBadge ? -14 : -16;\n el.style.transform = `translateY(${h2Lift}px)`;\n }\n } else if (!isWatch) {\n el.style.transform = 'translateY(-13px)';\n }\n\n // 6. 安定描画のおまじない\n el.style.display = 'block';\n });\n\n // Text container-level adjustments (top offset and gap)\n const firstHeader = clone.querySelector('h1');\n if (firstHeader?.parentElement) {\n const container = firstHeader.parentElement;\n const cs = window.getComputedStyle(container);\n const rowGap = parseFloat(cs.rowGap || cs.gap) || 0;\n const mt = parseFloat(cs.marginTop) || 0;\n // move text stack up a bit to close the canvas top gap\n if (isWatch) {\n container.style.marginTop = `${mt - 18}px`;\n } else {\n container.style.marginTop = `${mt - 4}px`;\n }\n // gapはプレビューと同じ値を維持(badge有無に関わらず)\n const baseGap = rowGap || 16;\n container.style.rowGap = `${baseGap}px`;\n container.style.gap = `${baseGap}px`;\n }\n\n elevateTextLayer(clone);\n\n return {\n clone,\n container,\n width: targetWidth,\n height: targetHeight,\n backgroundColor: outputBg,\n captureBackground: captureBg,\n manualShadows,\n baseWidth,\n baseHeight,\n padTotal: pad,\n };\n }, [deviceLibrary]);\n\n const exportSingle = useCallback(\n async (element, filename) => {\n if (!element) return false;\n setIsExporting(true);\n setProgress({ current: 0, total: 0 });\n let captureTarget = null;\n let success = false;\n\n try {\n await ensureHtml2Canvas();\n const { container, width, height, backgroundColor, captureBackground, manualShadows, padTotal, baseWidth, baseHeight } = prepareCloneForCapture(element, bgType, bgColor);\n captureTarget = container;\n\n // 高解像度でキャプチャし、のちにリサイズして指定サイズに戻す\n const captureScale = 2;\n const rawCanvas = await window.html2canvas(container, {\n backgroundColor: captureBackground ?? null,\n scale: captureScale,\n logging: false,\n useCORS: true,\n allowTaint: true,\n scrollX: 0,\n scrollY: 0,\n width,\n height,\n windowWidth: width,\n windowHeight: height,\n });\n const canvas = composeWithShadow(rawCanvas, backgroundColor ?? '#ffffff', manualShadows, captureScale);\n\n // パディング付きの全体を元サイズにスケールダウン(影を含めて縮小)\n const finalCanvas = document.createElement('canvas');\n finalCanvas.width = baseWidth;\n finalCanvas.height = baseHeight;\n const fctx = finalCanvas.getContext('2d');\n fctx.drawImage(canvas, 0, 0, canvas.width, canvas.height, 0, 0, finalCanvas.width, finalCanvas.height);\n\n const link = document.createElement('a');\n link.download = filename;\n link.href = finalCanvas.toDataURL('image/png');\n link.click();\n success = true;\n } catch (e) {\n console.error('Export failed', e);\n } finally {\n if (captureTarget && captureTarget.parentNode) {\n captureTarget.parentNode.removeChild(captureTarget);\n }\n setIsExporting(false);\n setProgress({ current: 0, total: 0 });\n }\n return success;\n },\n [bgType, ensureHtml2Canvas, bgColor, prepareCloneForCapture]\n );\n\n const exportBatch = useCallback(\n async ({ locales, slides, selectedDeviceIds, getElementById, signal, onTaskStart, outputMode = 'locale' }) => {\n if (!locales?.length || !slides?.length || !selectedDeviceIds?.length) return;\n const assertNotAborted = () => throwIfAborted(signal);\n\n assertNotAborted();\n setIsExporting(true);\n const totalTasks = locales.length * slides.length * selectedDeviceIds.length;\n setProgress({ current: 0, total: totalTasks });\n let completed = 0;\n\n try {\n await Promise.all([ensureHtml2Canvas(), ensureJSZip()]);\n assertNotAborted();\n\n const zip = new window.JSZip();\n const fastlaneRoot = zip.folder('fastlane').folder('screenshots');\n const resolvedOutputMode = outputMode === 'device' ? 'device' : 'locale';\n\n const runTask = async ({ localeId, slideIndex, deviceId }) => {\n assertNotAborted();\n const el = getElementById(deviceId);\n if (!el) return;\n\n if (typeof onTaskStart === 'function') {\n try {\n onTaskStart({\n localeId,\n slideIndex,\n slideNumber: slideIndex + 1,\n deviceId,\n current: completed + 1,\n total: totalTasks,\n });\n } catch (e) {\n console.warn('onTaskStart failed', e);\n }\n }\n\n const slide = slides[slideIndex];\n const slideText = slide?.texts?.[localeId] || { header: '', sub: '' };\n const slidePrefix = (slideIndex + 1).toString();\n const { clone, container, width, height, backgroundColor, captureBackground, manualShadows, padTotal, baseWidth, baseHeight } = prepareCloneForCapture(el, bgType, bgColor);\n\n try {\n assertNotAborted();\n const h1 = clone.querySelector('h1');\n const h2 = clone.querySelector('h2');\n if (h1) h1.textContent = slideText.header;\n if (h2) h2.textContent = slideText.sub;\n\n const img = clone.querySelector('div[data-type=\"screen-image\"]');\n if (img) {\n const screenshot = slide?.screenshotsByLocale?.[localeId] || slide?.screenshot || null;\n img.style.backgroundImage = screenshot ? `url(${screenshot})` : 'none';\n }\n\n assertNotAborted();\n const captureScale = 2;\n const rawCanvas = await window.html2canvas(container, {\n scale: captureScale,\n backgroundColor: captureBackground ?? null,\n useCORS: true,\n scrollX: 0,\n scrollY: 0,\n width,\n height,\n windowWidth: width,\n windowHeight: height,\n });\n assertNotAborted();\n const canvas = composeWithShadow(rawCanvas, backgroundColor ?? '#ffffff', manualShadows, captureScale);\n\n const finalCanvas = document.createElement('canvas');\n finalCanvas.width = baseWidth;\n finalCanvas.height = baseHeight;\n const fctx = finalCanvas.getContext('2d');\n fctx.drawImage(canvas, 0, 0, canvas.width, canvas.height, 0, 0, finalCanvas.width, finalCanvas.height);\n\n assertNotAborted();\n const dataUrl = finalCanvas.toDataURL('image/png');\n const b64 = dataUrl.replace(/^data:image\\/(png|jpg);base64,/, '');\n // Keep filenames stable even if UI device labels change.\n const deviceSlug = String(deviceId).toLowerCase();\n\n if (resolvedOutputMode === 'device') {\n const deviceFolder = fastlaneRoot.folder(deviceSlug);\n deviceFolder.file(`${localeId}_${slidePrefix}.png`, b64, { base64: true });\n } else {\n const localeFolder = fastlaneRoot.folder(localeId);\n localeFolder.file(`${deviceSlug}_${slidePrefix}.png`, b64, { base64: true });\n }\n } finally {\n if (container.parentNode) {\n document.body.removeChild(container);\n }\n }\n\n completed += 1;\n setProgress({ current: completed, total: totalTasks });\n assertNotAborted();\n };\n\n if (resolvedOutputMode === 'device') {\n for (const devId of selectedDeviceIds) {\n assertNotAborted();\n for (const locale of locales) {\n assertNotAborted();\n for (let sIdx = 0; sIdx < slides.length; sIdx++) {\n await runTask({ localeId: locale.id, slideIndex: sIdx, deviceId: devId });\n }\n await new Promise((r) => setTimeout(r, 50));\n assertNotAborted();\n }\n }\n } else {\n for (const locale of locales) {\n assertNotAborted();\n for (let sIdx = 0; sIdx < slides.length; sIdx++) {\n assertNotAborted();\n for (const devId of selectedDeviceIds) {\n await runTask({ localeId: locale.id, slideIndex: sIdx, deviceId: devId });\n }\n }\n await new Promise((r) => setTimeout(r, 50));\n assertNotAborted();\n }\n }\n\n const manifest = {\n schemaVersion: 1,\n generatedAt: new Date().toISOString(),\n structure: {\n root: 'fastlane/screenshots',\n mode: resolvedOutputMode,\n filePattern:\n resolvedOutputMode === 'device'\n ? '{deviceId}/{locale}_{index}.png'\n : '{locale}/{deviceId}_{index}.png',\n },\n counts: {\n locales: locales.length,\n slides: slides.length,\n devices: selectedDeviceIds.length,\n images: totalTasks,\n },\n locales: locales.map((l) => ({ id: l.id, name: l.name || '' })),\n devices: selectedDeviceIds.map((id) => {\n const d = deviceLibrary?.[id] || {};\n return {\n id,\n group: d.group || '',\n storeLabel: d.storeLabel || d.name || id,\n modelLabel: d.modelLabel || '',\n width: d.width || null,\n height: d.height || null,\n };\n }),\n };\n zip.file('manifest.json', JSON.stringify(manifest, null, 2));\n\n const content = await zip.generateAsync({ type: 'blob' });\n assertNotAborted();\n const url = window.URL.createObjectURL(content);\n const link = document.createElement('a');\n link.href = url;\n link.download = 'fastlane_assets.zip';\n document.body.appendChild(link);\n link.click();\n setTimeout(() => {\n window.URL.revokeObjectURL(url);\n link.remove();\n }, 1500);\n } catch (err) {\n if (err?.message !== 'Aborted') {\n console.error(err);\n }\n throw err;\n } finally {\n setIsExporting(false);\n setProgress({ current: 0, total: 0 });\n }\n },\n [bgType, deviceLibrary, ensureHtml2Canvas, ensureJSZip, bgColor, prepareCloneForCapture]\n );\n\n return { exportSingle, exportBatch, isExporting, exportProgress: progress };\n}\n","export const FIVE_PANEL_SAMPLE_PROJECT = {\n bgType: 'solid',\n bgColor: '#0f172a',\n layoutMode: 'standard',\n textColor: '#f8fafc',\n locales: [\n { id: 'en-US', name: 'English (US)', flag: '🇺🇸' },\n { id: 'ja-JP', name: '日本語', flag: '🇯🇵' },\n ],\n currentLocaleId: 'en-US',\n selectedBatchDevices: ['iphone69'],\n slides: [\n {\n id: 1,\n screenshot: null,\n screenshotsByLocale: {},\n texts: {\n 'en-US': { header: 'Screenshots as a build step', sub: 'Master layout + CSV copy → rerun exports' },\n 'ja-JP': { header: 'スクショをビルドステップに', sub: 'master layout + CSV copy → 再実行' },\n },\n },\n {\n id: 2,\n screenshot: null,\n screenshotsByLocale: {},\n texts: {\n 'en-US': { header: 'The matrix explodes fast', sub: '5 shots × 10 locales × 4 sizes = 200 images' },\n 'ja-JP': { header: '端末×言語が爆発', sub: '5枚×10言語×4サイズ = 200枚' },\n },\n },\n {\n id: 3,\n screenshot: null,\n screenshotsByLocale: {},\n texts: {\n 'en-US': { header: 'Reproducible exports', sub: 'Fastlane-ready ZIP every release' },\n 'ja-JP': { header: '再現性のある出力', sub: 'Fastlane 対応 ZIP を再実行' },\n },\n },\n {\n id: 4,\n screenshot: null,\n screenshotsByLocale: {},\n texts: {\n 'en-US': { header: 'Bring your translations', sub: 'Keep layout stable across locales' },\n 'ja-JP': { header: '翻訳は外部でOK', sub: 'レイアウトは崩れない' },\n },\n },\n {\n id: 5,\n screenshot: null,\n screenshotsByLocale: {},\n texts: {\n 'en-US': { header: 'Try it free', sub: 'Sample → edit → export' },\n 'ja-JP': { header: '無料で試す', sub: 'サンプル → 編集 → Export' },\n },\n },\n ],\n};\n","/* @license\nPapa Parse\nv5.5.3\nhttps://github.com/mholt/PapaParse\nLicense: MIT\n*/\n((e,t)=>{\"function\"==typeof define&&define.amd?define([],t):\"object\"==typeof module&&\"undefined\"!=typeof exports?module.exports=t():e.Papa=t()})(this,function r(){var n=\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:void 0!==n?n:{};var d,s=!n.document&&!!n.postMessage,a=n.IS_PAPA_WORKER||!1,o={},h=0,v={};function u(e){this._handle=null,this._finished=!1,this._completed=!1,this._halted=!1,this._input=null,this._baseIndex=0,this._partialLine=\"\",this._rowCount=0,this._start=0,this._nextChunk=null,this.isFirstChunk=!0,this._completeResults={data:[],errors:[],meta:{}},function(e){var t=b(e);t.chunkSize=parseInt(t.chunkSize),e.step||e.chunk||(t.chunkSize=null);this._handle=new i(t),(this._handle.streamer=this)._config=t}.call(this,e),this.parseChunk=function(t,e){var i=parseInt(this._config.skipFirstNLines)||0;if(this.isFirstChunk&&0<i){let e=this._config.newline;e||(r=this._config.quoteChar||'\"',e=this._handle.guessLineEndings(t,r)),t=[...t.split(e).slice(i)].join(e)}this.isFirstChunk&&U(this._config.beforeFirstChunk)&&void 0!==(r=this._config.beforeFirstChunk(t))&&(t=r),this.isFirstChunk=!1,this._halted=!1;var i=this._partialLine+t,r=(this._partialLine=\"\",this._handle.parse(i,this._baseIndex,!this._finished));if(!this._handle.paused()&&!this._handle.aborted()){t=r.meta.cursor,i=(this._finished||(this._partialLine=i.substring(t-this._baseIndex),this._baseIndex=t),r&&r.data&&(this._rowCount+=r.data.length),this._finished||this._config.preview&&this._rowCount>=this._config.preview);if(a)n.postMessage({results:r,workerId:v.WORKER_ID,finished:i});else if(U(this._config.chunk)&&!e){if(this._config.chunk(r,this._handle),this._handle.paused()||this._handle.aborted())return void(this._halted=!0);this._completeResults=r=void 0}return this._config.step||this._config.chunk||(this._completeResults.data=this._completeResults.data.concat(r.data),this._completeResults.errors=this._completeResults.errors.concat(r.errors),this._completeResults.meta=r.meta),this._completed||!i||!U(this._config.complete)||r&&r.meta.aborted||(this._config.complete(this._completeResults,this._input),this._completed=!0),i||r&&r.meta.paused||this._nextChunk(),r}this._halted=!0},this._sendError=function(e){U(this._config.error)?this._config.error(e):a&&this._config.error&&n.postMessage({workerId:v.WORKER_ID,error:e,finished:!1})}}function f(e){var r;(e=e||{}).chunkSize||(e.chunkSize=v.RemoteChunkSize),u.call(this,e),this._nextChunk=s?function(){this._readChunk(),this._chunkLoaded()}:function(){this._readChunk()},this.stream=function(e){this._input=e,this._nextChunk()},this._readChunk=function(){if(this._finished)this._chunkLoaded();else{if(r=new XMLHttpRequest,this._config.withCredentials&&(r.withCredentials=this._config.withCredentials),s||(r.onload=y(this._chunkLoaded,this),r.onerror=y(this._chunkError,this)),r.open(this._config.downloadRequestBody?\"POST\":\"GET\",this._input,!s),this._config.downloadRequestHeaders){var e,t=this._config.downloadRequestHeaders;for(e in t)r.setRequestHeader(e,t[e])}var i;this._config.chunkSize&&(i=this._start+this._config.chunkSize-1,r.setRequestHeader(\"Range\",\"bytes=\"+this._start+\"-\"+i));try{r.send(this._config.downloadRequestBody)}catch(e){this._chunkError(e.message)}s&&0===r.status&&this._chunkError()}},this._chunkLoaded=function(){4===r.readyState&&(r.status<200||400<=r.status?this._chunkError():(this._start+=this._config.chunkSize||r.responseText.length,this._finished=!this._config.chunkSize||this._start>=(e=>null!==(e=e.getResponseHeader(\"Content-Range\"))?parseInt(e.substring(e.lastIndexOf(\"/\")+1)):-1)(r),this.parseChunk(r.responseText)))},this._chunkError=function(e){e=r.statusText||e;this._sendError(new Error(e))}}function l(e){(e=e||{}).chunkSize||(e.chunkSize=v.LocalChunkSize),u.call(this,e);var i,r,n=\"undefined\"!=typeof FileReader;this.stream=function(e){this._input=e,r=e.slice||e.webkitSlice||e.mozSlice,n?((i=new FileReader).onload=y(this._chunkLoaded,this),i.onerror=y(this._chunkError,this)):i=new FileReaderSync,this._nextChunk()},this._nextChunk=function(){this._finished||this._config.preview&&!(this._rowCount<this._config.preview)||this._readChunk()},this._readChunk=function(){var e=this._input,t=(this._config.chunkSize&&(t=Math.min(this._start+this._config.chunkSize,this._input.size),e=r.call(e,this._start,t)),i.readAsText(e,this._config.encoding));n||this._chunkLoaded({target:{result:t}})},this._chunkLoaded=function(e){this._start+=this._config.chunkSize,this._finished=!this._config.chunkSize||this._start>=this._input.size,this.parseChunk(e.target.result)},this._chunkError=function(){this._sendError(i.error)}}function c(e){var i;u.call(this,e=e||{}),this.stream=function(e){return i=e,this._nextChunk()},this._nextChunk=function(){var e,t;if(!this._finished)return e=this._config.chunkSize,i=e?(t=i.substring(0,e),i.substring(e)):(t=i,\"\"),this._finished=!i,this.parseChunk(t)}}function p(e){u.call(this,e=e||{});var t=[],i=!0,r=!1;this.pause=function(){u.prototype.pause.apply(this,arguments),this._input.pause()},this.resume=function(){u.prototype.resume.apply(this,arguments),this._input.resume()},this.stream=function(e){this._input=e,this._input.on(\"data\",this._streamData),this._input.on(\"end\",this._streamEnd),this._input.on(\"error\",this._streamError)},this._checkIsFinished=function(){r&&1===t.length&&(this._finished=!0)},this._nextChunk=function(){this._checkIsFinished(),t.length?this.parseChunk(t.shift()):i=!0},this._streamData=y(function(e){try{t.push(\"string\"==typeof e?e:e.toString(this._config.encoding)),i&&(i=!1,this._checkIsFinished(),this.parseChunk(t.shift()))}catch(e){this._streamError(e)}},this),this._streamError=y(function(e){this._streamCleanUp(),this._sendError(e)},this),this._streamEnd=y(function(){this._streamCleanUp(),r=!0,this._streamData(\"\")},this),this._streamCleanUp=y(function(){this._input.removeListener(\"data\",this._streamData),this._input.removeListener(\"end\",this._streamEnd),this._input.removeListener(\"error\",this._streamError)},this)}function i(m){var n,s,a,t,o=Math.pow(2,53),h=-o,u=/^\\s*-?(\\d+\\.?|\\.\\d+|\\d+\\.\\d+)([eE][-+]?\\d+)?\\s*$/,d=/^((\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+([+-][0-2]\\d:[0-5]\\d|Z))|(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z))|(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z)))$/,i=this,r=0,f=0,l=!1,e=!1,c=[],p={data:[],errors:[],meta:{}};function y(e){return\"greedy\"===m.skipEmptyLines?\"\"===e.join(\"\").trim():1===e.length&&0===e[0].length}function g(){if(p&&a&&(k(\"Delimiter\",\"UndetectableDelimiter\",\"Unable to auto-detect delimiting character; defaulted to '\"+v.DefaultDelimiter+\"'\"),a=!1),m.skipEmptyLines&&(p.data=p.data.filter(function(e){return!y(e)})),_()){if(p)if(Array.isArray(p.data[0])){for(var e=0;_()&&e<p.data.length;e++)p.data[e].forEach(t);p.data.splice(0,1)}else p.data.forEach(t);function t(e,t){U(m.transformHeader)&&(e=m.transformHeader(e,t)),c.push(e)}}function i(e,t){for(var i=m.header?{}:[],r=0;r<e.length;r++){var n=r,s=e[r],s=((e,t)=>(e=>(m.dynamicTypingFunction&&void 0===m.dynamicTyping[e]&&(m.dynamicTyping[e]=m.dynamicTypingFunction(e)),!0===(m.dynamicTyping[e]||m.dynamicTyping)))(e)?\"true\"===t||\"TRUE\"===t||\"false\"!==t&&\"FALSE\"!==t&&((e=>{if(u.test(e)){e=parseFloat(e);if(h<e&&e<o)return 1}})(t)?parseFloat(t):d.test(t)?new Date(t):\"\"===t?null:t):t)(n=m.header?r>=c.length?\"__parsed_extra\":c[r]:n,s=m.transform?m.transform(s,n):s);\"__parsed_extra\"===n?(i[n]=i[n]||[],i[n].push(s)):i[n]=s}return m.header&&(r>c.length?k(\"FieldMismatch\",\"TooManyFields\",\"Too many fields: expected \"+c.length+\" fields but parsed \"+r,f+t):r<c.length&&k(\"FieldMismatch\",\"TooFewFields\",\"Too few fields: expected \"+c.length+\" fields but parsed \"+r,f+t)),i}var r;p&&(m.header||m.dynamicTyping||m.transform)&&(r=1,!p.data.length||Array.isArray(p.data[0])?(p.data=p.data.map(i),r=p.data.length):p.data=i(p.data,0),m.header&&p.meta&&(p.meta.fields=c),f+=r)}function _(){return m.header&&0===c.length}function k(e,t,i,r){e={type:e,code:t,message:i};void 0!==r&&(e.row=r),p.errors.push(e)}U(m.step)&&(t=m.step,m.step=function(e){p=e,_()?g():(g(),0!==p.data.length&&(r+=e.data.length,m.preview&&r>m.preview?s.abort():(p.data=p.data[0],t(p,i))))}),this.parse=function(e,t,i){var r=m.quoteChar||'\"',r=(m.newline||(m.newline=this.guessLineEndings(e,r)),a=!1,m.delimiter?U(m.delimiter)&&(m.delimiter=m.delimiter(e),p.meta.delimiter=m.delimiter):((r=((e,t,i,r,n)=>{var s,a,o,h;n=n||[\",\",\"\\t\",\"|\",\";\",v.RECORD_SEP,v.UNIT_SEP];for(var u=0;u<n.length;u++){for(var d,f=n[u],l=0,c=0,p=0,g=(o=void 0,new E({comments:r,delimiter:f,newline:t,preview:10}).parse(e)),_=0;_<g.data.length;_++)i&&y(g.data[_])?p++:(d=g.data[_].length,c+=d,void 0===o?o=d:0<d&&(l+=Math.abs(d-o),o=d));0<g.data.length&&(c/=g.data.length-p),(void 0===a||l<=a)&&(void 0===h||h<c)&&1.99<c&&(a=l,s=f,h=c)}return{successful:!!(m.delimiter=s),bestDelimiter:s}})(e,m.newline,m.skipEmptyLines,m.comments,m.delimitersToGuess)).successful?m.delimiter=r.bestDelimiter:(a=!0,m.delimiter=v.DefaultDelimiter),p.meta.delimiter=m.delimiter),b(m));return m.preview&&m.header&&r.preview++,n=e,s=new E(r),p=s.parse(n,t,i),g(),l?{meta:{paused:!0}}:p||{meta:{paused:!1}}},this.paused=function(){return l},this.pause=function(){l=!0,s.abort(),n=U(m.chunk)?\"\":n.substring(s.getCharIndex())},this.resume=function(){i.streamer._halted?(l=!1,i.streamer.parseChunk(n,!0)):setTimeout(i.resume,3)},this.aborted=function(){return e},this.abort=function(){e=!0,s.abort(),p.meta.aborted=!0,U(m.complete)&&m.complete(p),n=\"\"},this.guessLineEndings=function(e,t){e=e.substring(0,1048576);var t=new RegExp(P(t)+\"([^]*?)\"+P(t),\"gm\"),i=(e=e.replace(t,\"\")).split(\"\\r\"),t=e.split(\"\\n\"),e=1<t.length&&t[0].length<i[0].length;if(1===i.length||e)return\"\\n\";for(var r=0,n=0;n<i.length;n++)\"\\n\"===i[n][0]&&r++;return r>=i.length/2?\"\\r\\n\":\"\\r\"}}function P(e){return e.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}function E(C){var S=(C=C||{}).delimiter,O=C.newline,x=C.comments,I=C.step,A=C.preview,T=C.fastMode,D=null,L=!1,F=null==C.quoteChar?'\"':C.quoteChar,j=F;if(void 0!==C.escapeChar&&(j=C.escapeChar),(\"string\"!=typeof S||-1<v.BAD_DELIMITERS.indexOf(S))&&(S=\",\"),x===S)throw new Error(\"Comment character same as delimiter\");!0===x?x=\"#\":(\"string\"!=typeof x||-1<v.BAD_DELIMITERS.indexOf(x))&&(x=!1),\"\\n\"!==O&&\"\\r\"!==O&&\"\\r\\n\"!==O&&(O=\"\\n\");var z=0,M=!1;this.parse=function(i,t,r){if(\"string\"!=typeof i)throw new Error(\"Input must be a string\");var n=i.length,e=S.length,s=O.length,a=x.length,o=U(I),h=[],u=[],d=[],f=z=0;if(!i)return w();if(T||!1!==T&&-1===i.indexOf(F)){for(var l=i.split(O),c=0;c<l.length;c++){if(d=l[c],z+=d.length,c!==l.length-1)z+=O.length;else if(r)return w();if(!x||d.substring(0,a)!==x){if(o){if(h=[],k(d.split(S)),R(),M)return w()}else k(d.split(S));if(A&&A<=c)return h=h.slice(0,A),w(!0)}}return w()}for(var p=i.indexOf(S,z),g=i.indexOf(O,z),_=new RegExp(P(j)+P(F),\"g\"),m=i.indexOf(F,z);;)if(i[z]===F)for(m=z,z++;;){if(-1===(m=i.indexOf(F,m+1)))return r||u.push({type:\"Quotes\",code:\"MissingQuotes\",message:\"Quoted field unterminated\",row:h.length,index:z}),E();if(m===n-1)return E(i.substring(z,m).replace(_,F));if(F===j&&i[m+1]===j)m++;else if(F===j||0===m||i[m-1]!==j){-1!==p&&p<m+1&&(p=i.indexOf(S,m+1));var y=v(-1===(g=-1!==g&&g<m+1?i.indexOf(O,m+1):g)?p:Math.min(p,g));if(i.substr(m+1+y,e)===S){d.push(i.substring(z,m).replace(_,F)),i[z=m+1+y+e]!==F&&(m=i.indexOf(F,z)),p=i.indexOf(S,z),g=i.indexOf(O,z);break}y=v(g);if(i.substring(m+1+y,m+1+y+s)===O){if(d.push(i.substring(z,m).replace(_,F)),b(m+1+y+s),p=i.indexOf(S,z),m=i.indexOf(F,z),o&&(R(),M))return w();if(A&&h.length>=A)return w(!0);break}u.push({type:\"Quotes\",code:\"InvalidQuotes\",message:\"Trailing quote on quoted field is malformed\",row:h.length,index:z}),m++}}else if(x&&0===d.length&&i.substring(z,z+a)===x){if(-1===g)return w();z=g+s,g=i.indexOf(O,z),p=i.indexOf(S,z)}else if(-1!==p&&(p<g||-1===g))d.push(i.substring(z,p)),z=p+e,p=i.indexOf(S,z);else{if(-1===g)break;if(d.push(i.substring(z,g)),b(g+s),o&&(R(),M))return w();if(A&&h.length>=A)return w(!0)}return E();function k(e){h.push(e),f=z}function v(e){var t=0;return t=-1!==e&&(e=i.substring(m+1,e))&&\"\"===e.trim()?e.length:t}function E(e){return r||(void 0===e&&(e=i.substring(z)),d.push(e),z=n,k(d),o&&R()),w()}function b(e){z=e,k(d),d=[],g=i.indexOf(O,z)}function w(e){if(C.header&&!t&&h.length&&!L){var s=h[0],a=Object.create(null),o=new Set(s);let n=!1;for(let r=0;r<s.length;r++){let i=s[r];if(a[i=U(C.transformHeader)?C.transformHeader(i,r):i]){let e,t=a[i];for(;e=i+\"_\"+t,t++,o.has(e););o.add(e),s[r]=e,a[i]++,n=!0,(D=null===D?{}:D)[e]=i}else a[i]=1,s[r]=i;o.add(i)}n&&console.warn(\"Duplicate headers found and renamed.\"),L=!0}return{data:h,errors:u,meta:{delimiter:S,linebreak:O,aborted:M,truncated:!!e,cursor:f+(t||0),renamedHeaders:D}}}function R(){I(w()),h=[],u=[]}},this.abort=function(){M=!0},this.getCharIndex=function(){return z}}function g(e){var t=e.data,i=o[t.workerId],r=!1;if(t.error)i.userError(t.error,t.file);else if(t.results&&t.results.data){var n={abort:function(){r=!0,_(t.workerId,{data:[],errors:[],meta:{aborted:!0}})},pause:m,resume:m};if(U(i.userStep)){for(var s=0;s<t.results.data.length&&(i.userStep({data:t.results.data[s],errors:t.results.errors,meta:t.results.meta},n),!r);s++);delete t.results}else U(i.userChunk)&&(i.userChunk(t.results,n,t.file),delete t.results)}t.finished&&!r&&_(t.workerId,t.results)}function _(e,t){var i=o[e];U(i.userComplete)&&i.userComplete(t),i.terminate(),delete o[e]}function m(){throw new Error(\"Not implemented.\")}function b(e){if(\"object\"!=typeof e||null===e)return e;var t,i=Array.isArray(e)?[]:{};for(t in e)i[t]=b(e[t]);return i}function y(e,t){return function(){e.apply(t,arguments)}}function U(e){return\"function\"==typeof e}return v.parse=function(e,t){var i=(t=t||{}).dynamicTyping||!1;U(i)&&(t.dynamicTypingFunction=i,i={});if(t.dynamicTyping=i,t.transform=!!U(t.transform)&&t.transform,!t.worker||!v.WORKERS_SUPPORTED)return i=null,v.NODE_STREAM_INPUT,\"string\"==typeof e?(e=(e=>65279!==e.charCodeAt(0)?e:e.slice(1))(e),i=new(t.download?f:c)(t)):!0===e.readable&&U(e.read)&&U(e.on)?i=new p(t):(n.File&&e instanceof File||e instanceof Object)&&(i=new l(t)),i.stream(e);(i=(()=>{var e;return!!v.WORKERS_SUPPORTED&&(e=(()=>{var e=n.URL||n.webkitURL||null,t=r.toString();return v.BLOB_URL||(v.BLOB_URL=e.createObjectURL(new Blob([\"var global = (function() { if (typeof self !== 'undefined') { return self; } if (typeof window !== 'undefined') { return window; } if (typeof global !== 'undefined') { return global; } return {}; })(); global.IS_PAPA_WORKER=true; \",\"(\",t,\")();\"],{type:\"text/javascript\"})))})(),(e=new n.Worker(e)).onmessage=g,e.id=h++,o[e.id]=e)})()).userStep=t.step,i.userChunk=t.chunk,i.userComplete=t.complete,i.userError=t.error,t.step=U(t.step),t.chunk=U(t.chunk),t.complete=U(t.complete),t.error=U(t.error),delete t.worker,i.postMessage({input:e,config:t,workerId:i.id})},v.unparse=function(e,t){var n=!1,_=!0,m=\",\",y=\"\\r\\n\",s='\"',a=s+s,i=!1,r=null,o=!1,h=((()=>{if(\"object\"==typeof t){if(\"string\"!=typeof t.delimiter||v.BAD_DELIMITERS.filter(function(e){return-1!==t.delimiter.indexOf(e)}).length||(m=t.delimiter),\"boolean\"!=typeof t.quotes&&\"function\"!=typeof t.quotes&&!Array.isArray(t.quotes)||(n=t.quotes),\"boolean\"!=typeof t.skipEmptyLines&&\"string\"!=typeof t.skipEmptyLines||(i=t.skipEmptyLines),\"string\"==typeof t.newline&&(y=t.newline),\"string\"==typeof t.quoteChar&&(s=t.quoteChar),\"boolean\"==typeof t.header&&(_=t.header),Array.isArray(t.columns)){if(0===t.columns.length)throw new Error(\"Option columns is empty\");r=t.columns}void 0!==t.escapeChar&&(a=t.escapeChar+s),t.escapeFormulae instanceof RegExp?o=t.escapeFormulae:\"boolean\"==typeof t.escapeFormulae&&t.escapeFormulae&&(o=/^[=+\\-@\\t\\r].*$/)}})(),new RegExp(P(s),\"g\"));\"string\"==typeof e&&(e=JSON.parse(e));if(Array.isArray(e)){if(!e.length||Array.isArray(e[0]))return u(null,e,i);if(\"object\"==typeof e[0])return u(r||Object.keys(e[0]),e,i)}else if(\"object\"==typeof e)return\"string\"==typeof e.data&&(e.data=JSON.parse(e.data)),Array.isArray(e.data)&&(e.fields||(e.fields=e.meta&&e.meta.fields||r),e.fields||(e.fields=Array.isArray(e.data[0])?e.fields:\"object\"==typeof e.data[0]?Object.keys(e.data[0]):[]),Array.isArray(e.data[0])||\"object\"==typeof e.data[0]||(e.data=[e.data])),u(e.fields||[],e.data||[],i);throw new Error(\"Unable to serialize unrecognized input\");function u(e,t,i){var r=\"\",n=(\"string\"==typeof e&&(e=JSON.parse(e)),\"string\"==typeof t&&(t=JSON.parse(t)),Array.isArray(e)&&0<e.length),s=!Array.isArray(t[0]);if(n&&_){for(var a=0;a<e.length;a++)0<a&&(r+=m),r+=k(e[a],a);0<t.length&&(r+=y)}for(var o=0;o<t.length;o++){var h=(n?e:t[o]).length,u=!1,d=n?0===Object.keys(t[o]).length:0===t[o].length;if(i&&!n&&(u=\"greedy\"===i?\"\"===t[o].join(\"\").trim():1===t[o].length&&0===t[o][0].length),\"greedy\"===i&&n){for(var f=[],l=0;l<h;l++){var c=s?e[l]:l;f.push(t[o][c])}u=\"\"===f.join(\"\").trim()}if(!u){for(var p=0;p<h;p++){0<p&&!d&&(r+=m);var g=n&&s?e[p]:p;r+=k(t[o][g],p)}o<t.length-1&&(!i||0<h&&!d)&&(r+=y)}}return r}function k(e,t){var i,r;return null==e?\"\":e.constructor===Date?JSON.stringify(e).slice(1,25):(r=!1,o&&\"string\"==typeof e&&o.test(e)&&(e=\"'\"+e,r=!0),i=e.toString().replace(h,a),(r=r||!0===n||\"function\"==typeof n&&n(e,t)||Array.isArray(n)&&n[t]||((e,t)=>{for(var i=0;i<t.length;i++)if(-1<e.indexOf(t[i]))return!0;return!1})(i,v.BAD_DELIMITERS)||-1<i.indexOf(m)||\" \"===i.charAt(0)||\" \"===i.charAt(i.length-1))?s+i+s:i)}},v.RECORD_SEP=String.fromCharCode(30),v.UNIT_SEP=String.fromCharCode(31),v.BYTE_ORDER_MARK=\"\\ufeff\",v.BAD_DELIMITERS=[\"\\r\",\"\\n\",'\"',v.BYTE_ORDER_MARK],v.WORKERS_SUPPORTED=!s&&!!n.Worker,v.NODE_STREAM_INPUT=1,v.LocalChunkSize=10485760,v.RemoteChunkSize=5242880,v.DefaultDelimiter=\",\",v.Parser=E,v.ParserHandle=i,v.NetworkStreamer=f,v.FileStreamer=l,v.StringStreamer=c,v.ReadableStreamStreamer=p,n.jQuery&&((d=n.jQuery).fn.parse=function(o){var i=o.config||{},h=[];return this.each(function(e){if(!(\"INPUT\"===d(this).prop(\"tagName\").toUpperCase()&&\"file\"===d(this).attr(\"type\").toLowerCase()&&n.FileReader)||!this.files||0===this.files.length)return!0;for(var t=0;t<this.files.length;t++)h.push({file:this.files[t],inputElem:this,instanceConfig:d.extend({},i)})}),e(),this;function e(){if(0===h.length)U(o.complete)&&o.complete();else{var e,t,i,r,n=h[0];if(U(o.before)){var s=o.before(n.file,n.inputElem);if(\"object\"==typeof s){if(\"abort\"===s.action)return e=\"AbortError\",t=n.file,i=n.inputElem,r=s.reason,void(U(o.error)&&o.error({name:e},t,i,r));if(\"skip\"===s.action)return void u();\"object\"==typeof s.config&&(n.instanceConfig=d.extend(n.instanceConfig,s.config))}else if(\"skip\"===s)return void u()}var a=n.instanceConfig.complete;n.instanceConfig.complete=function(e){U(a)&&a(e,n.file,n.inputElem),u()},v.parse(n.file,n.instanceConfig)}}function u(){h.splice(0,1),e()}}),a&&(n.onmessage=function(e){e=e.data;void 0===v.WORKER_ID&&e&&(v.WORKER_ID=e.workerId);\"string\"==typeof e.input?n.postMessage({workerId:v.WORKER_ID,results:v.parse(e.input,e.config),finished:!0}):(n.File&&e.input instanceof File||e.input instanceof Object)&&(e=v.parse(e.input,e.config))&&n.postMessage({workerId:v.WORKER_ID,results:e,finished:!0})}),(f.prototype=Object.create(u.prototype)).constructor=f,(l.prototype=Object.create(u.prototype)).constructor=l,(c.prototype=Object.create(c.prototype)).constructor=c,(p.prototype=Object.create(u.prototype)).constructor=p,v});","import React, { useState, useMemo, useRef, useEffect } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Plus, Search } from 'lucide-react';\n\nconst LANGUAGE_OPTIONS = [\n { id: 'en-US', name: 'English (US)', flag: '🇺🇸' },\n { id: 'ja-JP', name: '日本語', flag: '🇯🇵' },\n { id: 'es-ES', name: 'Español (España)', flag: '🇪🇸' },\n { id: 'fr-FR', name: 'Français', flag: '🇫🇷' },\n { id: 'de-DE', name: 'Deutsch', flag: '🇩🇪' },\n { id: 'it-IT', name: 'Italiano', flag: '🇮🇹' },\n { id: 'pt-BR', name: 'Português (Brasil)', flag: '🇧🇷' },\n { id: 'ko-KR', name: '한국어', flag: '🇰🇷' },\n { id: 'zh-CN', name: '简体中文', flag: '🇨🇳' },\n { id: 'zh-TW', name: '繁體中文', flag: '🇹🇼' },\n { id: 'ru-RU', name: 'Русский', flag: '🇷🇺' },\n { id: 'id-ID', name: 'Bahasa Indonesia', flag: '🇮🇩' },\n { id: 'th-TH', name: 'ไทย', flag: '🇹🇭' },\n { id: 'vi-VN', name: 'Tiếng Việt', flag: '🇻🇳' },\n { id: 'tr-TR', name: 'Türkçe', flag: '🇹🇷' },\n { id: 'ar-SA', name: 'العربية', flag: '🇸🇦' },\n];\n\nconst PRESETS = [\n { label: 'EFIGS', ids: ['en-US', 'fr-FR', 'it-IT', 'de-DE', 'es-ES'] },\n { label: 'CJK', ids: ['zh-CN', 'ja-JP', 'ko-KR'] },\n];\n\nconst LanguageSelector = ({ currentLocales, onAdd }) => {\n const { t } = useTranslation();\n const [isOpen, setIsOpen] = useState(false);\n const [search, setSearch] = useState('');\n const containerRef = useRef(null);\n\n useEffect(() => {\n const handleClickOutside = (event) => {\n if (containerRef.current && !containerRef.current.contains(event.target)) {\n setIsOpen(false);\n }\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n const filteredOptions = useMemo(() => {\n const lower = search.toLowerCase();\n return LANGUAGE_OPTIONS.filter(\n (opt) =>\n !currentLocales.some((l) => l.id === opt.id) &&\n (opt.name.toLowerCase().includes(lower) || opt.id.toLowerCase().includes(lower))\n );\n }, [search, currentLocales]);\n\n const handleAdd = (option) => {\n if (!option) return;\n onAdd([option]);\n setSearch('');\n setIsOpen(false);\n };\n\n const handleBulkAdd = (ids) => {\n const toAdd = LANGUAGE_OPTIONS.filter(\n (opt) => ids.includes(opt.id) && !currentLocales.some((l) => l.id === opt.id)\n );\n if (toAdd.length > 0) {\n onAdd(toAdd);\n setIsOpen(false);\n }\n };\n\n const addLabel = t('app.language.add', 'Add Language');\n const searchPlaceholder = t('app.language.searchPlaceholder', 'Search (e.g. ja, Japanese)');\n const presetsLabel = t('app.language.presets', 'Presets');\n const noResultsLabel = t('app.language.noResults', 'No languages found');\n\n return (\n <div className=\"relative\" ref={containerRef}>\n {!isOpen ? (\n <button\n onClick={() => setIsOpen(true)}\n className=\"flex items-center gap-1 px-3 py-1.5 rounded-lg border border-slate-200 bg-white text-xs font-medium text-slate-600 hover:bg-slate-50 hover:border-blue-300 transition-colors shadow-sm\"\n >\n <Plus size={14} />\n {addLabel}\n </button>\n ) : (\n <div className=\"absolute top-0 left-0 w-64 bg-white rounded-xl shadow-xl border border-slate-200 z-50 overflow-hidden animate-in fade-in zoom-in-95 duration-100 origin-top-left\">\n <div className=\"p-2 border-b border-slate-100\">\n <div className=\"relative\">\n <Search\n size={14}\n className=\"absolute left-2 top-1/2 -translate-y-1/2 text-slate-400\"\n />\n <input\n autoFocus\n type=\"text\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder={searchPlaceholder}\n className=\"w-full pl-7 pr-2 py-1.5 text-xs bg-slate-50 border border-slate-200 rounded-md focus:outline-none focus:border-blue-500 focus:ring-1 focus:ring-blue-500\"\n />\n </div>\n </div>\n\n {search === '' && (\n <div className=\"p-2 border-b border-slate-100 bg-slate-50/50\">\n <div className=\"text-[10px] font-bold text-slate-400 uppercase tracking-wider mb-1.5 px-1\">\n {presetsLabel}\n </div>\n <div className=\"flex gap-2\">\n {PRESETS.map((preset) => (\n <button\n key={preset.label}\n onClick={() => handleBulkAdd(preset.ids)}\n className=\"flex-1 py-1 px-2 bg-white border border-slate-200 rounded text-[10px] font-semibold text-slate-600 hover:border-blue-400 hover:text-blue-600 transition-colors\"\n >\n + {preset.label}\n </button>\n ))}\n </div>\n </div>\n )}\n\n <div className=\"max-h-48 overflow-y-auto p-1\">\n {filteredOptions.length === 0 ? (\n <div className=\"text-center py-4 text-xs text-slate-400\">{noResultsLabel}</div>\n ) : (\n filteredOptions.map((opt) => (\n <button\n key={opt.id}\n onClick={() => handleAdd(opt)}\n className=\"w-full flex items-center gap-2 px-2 py-1.5 rounded hover:bg-blue-50 text-left transition-colors group\"\n >\n <span className=\"text-base leading-none\">{opt.flag}</span>\n <div className=\"flex flex-col\">\n <span className=\"text-xs font-medium text-slate-700 group-hover:text-blue-700\">\n {opt.name}\n </span>\n <span className=\"text-[10px] text-slate-400 group-hover:text-blue-400\">{opt.id}</span>\n </div>\n </button>\n ))\n )}\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport default LanguageSelector;\n","import React, { useState, useRef, useEffect } from 'react';\nimport { ChevronDown, Check } from 'lucide-react';\n\nconst FontSelector = ({ selectedFont, setSelectedFont, fontOptions }) => {\n const [isOpen, setIsOpen] = useState(false);\n const containerRef = useRef(null);\n\n useEffect(() => {\n const handleClickOutside = (event) => {\n if (containerRef.current && !containerRef.current.contains(event.target)) {\n setIsOpen(false);\n }\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n const currentOption = fontOptions.find((f) => f.value === selectedFont) || fontOptions[0];\n\n return (\n <div className=\"relative w-full\" ref={containerRef}>\n <button\n onClick={() => setIsOpen(!isOpen)}\n className=\"w-full flex items-center justify-between px-3 py-2 bg-white border border-slate-200 rounded-lg text-xs hover:border-blue-400 transition-colors\"\n >\n <span style={{ fontFamily: currentOption?.family }} className=\"text-sm\">\n {currentOption?.name}\n </span>\n <ChevronDown size={14} className=\"text-slate-400\" />\n </button>\n\n {isOpen && (\n <div className=\"absolute top-full left-0 right-0 mt-1 bg-white border border-slate-200 rounded-lg shadow-xl z-50 max-h-60 overflow-y-auto\">\n {fontOptions.map((font) => (\n <button\n key={font.value}\n onClick={() => {\n setSelectedFont(font.value);\n setIsOpen(false);\n }}\n className=\"w-full flex items-center justify-between px-3 py-2.5 text-left hover:bg-slate-50 transition-colors border-b border-slate-50 last:border-0\"\n >\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-xs font-bold text-slate-700\">{font.name}</span>\n <span\n className=\"text-lg text-slate-900 leading-tight\"\n style={{ fontFamily: font.family }}\n >\n ShipScreens 123\n </span>\n </div>\n {selectedFont === font.value && <Check size={14} className=\"text-blue-600\" />}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n};\n\nexport default FontSelector;\n","import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Cloud, Copy, RefreshCw, Users } from 'lucide-react';\nimport CopyButton from '../CopyButton';\nimport { useToast } from '../../context/ToastContext';\nimport {\n acceptTeamInvite,\n createTeamInvite,\n createTeamProject,\n createTeamWorkspace,\n getTeamProject,\n listTeamProjects,\n listTeamWorkspaces,\n updateTeamProject,\n} from '../../lib/apiClient';\nimport { copyTextToClipboard } from '../../lib/clipboard';\n\nconst LOCAL_KEY = 'shipscreens_team_sync_v1';\n\nconst readLocal = () => {\n if (typeof window === 'undefined') return {};\n try {\n return JSON.parse(localStorage.getItem(LOCAL_KEY) || '{}') || {};\n } catch {\n return {};\n }\n};\n\nconst writeLocal = (patch) => {\n if (typeof window === 'undefined') return;\n const prev = readLocal();\n localStorage.setItem(LOCAL_KEY, JSON.stringify({ ...prev, ...patch }));\n};\n\nconst formatExpires = (expiresAt) => {\n if (!expiresAt) return '';\n try {\n return new Date(expiresAt * 1000).toISOString().replace('T', ' ').slice(0, 16) + ' UTC';\n } catch {\n return '';\n }\n};\n\nconst TeamSyncPanel = ({ token, captureTeamSpec, applyTeamSpec }) => {\n const { t } = useTranslation();\n const { addToast } = useToast();\n\n const saved = useMemo(() => readLocal(), []);\n const [workspaces, setWorkspaces] = useState([]);\n const [projects, setProjects] = useState([]);\n\n const [workspaceId, setWorkspaceId] = useState(saved.workspaceId || '');\n const [projectId, setProjectId] = useState(saved.projectId || '');\n\n const [headRev, setHeadRev] = useState(null);\n const [headSha, setHeadSha] = useState(null);\n\n const [inviteToken, setInviteToken] = useState('');\n const [lastCreatedInvite, setLastCreatedInvite] = useState(null);\n\n const [isLoading, setIsLoading] = useState(false);\n const [isRefreshing, setIsRefreshing] = useState(false);\n\n const refreshWorkspaces = useCallback(async () => {\n if (!token) return;\n setIsRefreshing(true);\n try {\n const resp = await listTeamWorkspaces(token);\n const list = resp?.workspaces || [];\n setWorkspaces(list);\n if (workspaceId && !list.some((w) => w.workspaceId === workspaceId)) {\n setWorkspaceId('');\n setProjectId('');\n writeLocal({ workspaceId: '', projectId: '' });\n }\n } catch (err) {\n addToast({ type: 'error', message: t('app.teamSync.errors.fetchWorkspaces') });\n console.error(err);\n } finally {\n setIsRefreshing(false);\n }\n }, [addToast, t, token, workspaceId]);\n\n const refreshProjects = useCallback(\n async (targetWorkspaceId) => {\n if (!token || !targetWorkspaceId) return;\n setIsRefreshing(true);\n try {\n const resp = await listTeamProjects(targetWorkspaceId, token);\n const list = resp?.projects || [];\n setProjects(list);\n if (projectId && !list.some((p) => p.projectId === projectId)) {\n setProjectId('');\n writeLocal({ projectId: '' });\n }\n } catch (err) {\n addToast({ type: 'error', message: t('app.teamSync.errors.fetchProjects') });\n console.error(err);\n } finally {\n setIsRefreshing(false);\n }\n },\n [addToast, projectId, t, token]\n );\n\n const refreshProjectHead = useCallback(async () => {\n if (!token || !workspaceId || !projectId) return;\n try {\n const resp = await getTeamProject(workspaceId, projectId, token);\n setHeadRev(typeof resp?.headRev === 'number' ? resp.headRev : null);\n setHeadSha(resp?.headSha || null);\n } catch {\n setHeadRev(null);\n setHeadSha(null);\n }\n }, [projectId, token, workspaceId]);\n\n useEffect(() => {\n if (!token) return;\n refreshWorkspaces();\n }, [refreshWorkspaces, token]);\n\n useEffect(() => {\n if (!token) return;\n if (!workspaceId) {\n setProjects([]);\n setProjectId('');\n writeLocal({ workspaceId: '', projectId: '' });\n return;\n }\n writeLocal({ workspaceId });\n refreshProjects(workspaceId);\n }, [refreshProjects, token, workspaceId]);\n\n useEffect(() => {\n if (!projectId) {\n setHeadRev(null);\n setHeadSha(null);\n writeLocal({ projectId: '' });\n return;\n }\n writeLocal({ projectId });\n refreshProjectHead();\n }, [projectId, refreshProjectHead]);\n\n const handleCreateWorkspace = async () => {\n if (!token) return;\n setIsLoading(true);\n try {\n const resp = await createTeamWorkspace({ name: 'Workspace' }, token);\n const newId = resp?.workspaceId;\n if (!newId) throw new Error('workspaceId missing');\n addToast({ type: 'success', message: t('app.teamSync.toasts.workspaceCreated') });\n await refreshWorkspaces();\n setWorkspaceId(newId);\n } catch (err) {\n addToast({ type: 'error', message: t('app.teamSync.errors.createWorkspace') });\n console.error(err);\n } finally {\n setIsLoading(false);\n }\n };\n\n const handleCreateProject = async () => {\n if (!token || !workspaceId) return;\n setIsLoading(true);\n try {\n const resp = await createTeamProject(workspaceId, { name: 'Project' }, token);\n const newId = resp?.projectId;\n if (!newId) throw new Error('projectId missing');\n addToast({ type: 'success', message: t('app.teamSync.toasts.projectCreated') });\n await refreshProjects(workspaceId);\n setProjectId(newId);\n setHeadRev(0);\n setHeadSha('');\n } catch (err) {\n addToast({ type: 'error', message: t('app.teamSync.errors.createProject') });\n console.error(err);\n } finally {\n setIsLoading(false);\n }\n };\n\n const handlePull = async () => {\n if (!token || !workspaceId || !projectId) return;\n setIsLoading(true);\n try {\n const resp = await getTeamProject(workspaceId, projectId, token);\n const spec = resp?.spec;\n if (!spec) {\n addToast({ type: 'info', message: t('app.teamSync.toasts.noRemoteSpec') });\n return;\n }\n applyTeamSpec?.(spec);\n setHeadRev(typeof resp?.headRev === 'number' ? resp.headRev : null);\n setHeadSha(resp?.headSha || null);\n addToast({ type: 'success', message: t('app.teamSync.toasts.pulled') });\n } catch (err) {\n addToast({ type: 'error', message: t('app.teamSync.errors.pull') });\n console.error(err);\n } finally {\n setIsLoading(false);\n }\n };\n\n const handlePush = async () => {\n if (!token || !workspaceId || !projectId) return;\n setIsLoading(true);\n try {\n const current = await getTeamProject(workspaceId, projectId, token);\n const baseRev = Number(current?.headRev || 0);\n const spec = captureTeamSpec?.();\n if (!spec) throw new Error('spec missing');\n\n const resp = await updateTeamProject(workspaceId, projectId, { baseRev, spec }, token);\n if (resp?.error === 'conflict') {\n addToast({ type: 'error', message: t('app.teamSync.errors.conflict') });\n return;\n }\n setHeadRev(typeof resp?.headRev === 'number' ? resp.headRev : null);\n setHeadSha(resp?.headSha || null);\n addToast({ type: 'success', message: t('app.teamSync.toasts.pushed') });\n } catch (err) {\n const msg = String(err?.message || '');\n if (msg.includes('409')) {\n addToast({ type: 'error', message: t('app.teamSync.errors.conflict') });\n } else {\n addToast({ type: 'error', message: t('app.teamSync.errors.push') });\n }\n console.error(err);\n } finally {\n setIsLoading(false);\n }\n };\n\n const handleCreateInvite = async () => {\n if (!token || !workspaceId) return;\n setIsLoading(true);\n try {\n const resp = await createTeamInvite(workspaceId, { role: 'editor' }, token);\n if (!resp?.token) throw new Error('invite token missing');\n setLastCreatedInvite(resp);\n addToast({\n type: 'success',\n message: t('app.teamSync.toasts.inviteCreated'),\n action: {\n label: t('app.teamSync.copy'),\n onClick: async () => {\n const result = await copyTextToClipboard(resp.token);\n addToast({\n type: result.ok ? 'success' : 'error',\n message: result.ok\n ? t('common.copied', { defaultValue: 'Copied' })\n : t('common.copyFailed', { defaultValue: 'Copy failed' }),\n });\n },\n },\n });\n } catch (err) {\n addToast({ type: 'error', message: t('app.teamSync.errors.invite') });\n console.error(err);\n } finally {\n setIsLoading(false);\n }\n };\n\n const handleAcceptInvite = async () => {\n if (!token || !inviteToken) return;\n setIsLoading(true);\n try {\n const resp = await acceptTeamInvite(inviteToken, token);\n if (!resp?.workspaceId) throw new Error('workspaceId missing');\n addToast({ type: 'success', message: t('app.teamSync.toasts.inviteAccepted') });\n setInviteToken('');\n await refreshWorkspaces();\n setWorkspaceId(resp.workspaceId);\n setProjectId('');\n } catch (err) {\n addToast({ type: 'error', message: t('app.teamSync.errors.inviteAccept') });\n console.error(err);\n } finally {\n setIsLoading(false);\n }\n };\n\n const canUse = !!token;\n\n return (\n <div className=\"bg-white p-4 rounded-xl border border-slate-200 shadow-sm space-y-3\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex items-center gap-2\">\n <div className=\"p-2 bg-slate-100 text-slate-700 rounded-lg border border-slate-200\">\n <Cloud size={18} />\n </div>\n <div>\n <h4 className=\"text-sm font-bold text-slate-800\">{t('app.teamSync.title')}</h4>\n <div className=\"text-[10px] text-slate-500\">{t('app.teamSync.subtitle')}</div>\n </div>\n </div>\n <button\n type=\"button\"\n onClick={refreshWorkspaces}\n disabled={!canUse || isRefreshing}\n className=\"px-2 py-1 text-[10px] font-bold rounded border border-slate-200 text-slate-600 hover:bg-slate-50 disabled:opacity-50\"\n title={t('app.teamSync.refresh')}\n >\n <span className=\"inline-flex items-center gap-1\">\n <RefreshCw size={12} /> {t('app.teamSync.refresh')}\n </span>\n </button>\n </div>\n\n <div className=\"flex gap-2 p-2 bg-slate-50 border border-slate-200 rounded text-[10px] text-slate-600 leading-tight\">\n <Users size={14} className=\"shrink-0 text-slate-400\" />\n <span>{t('app.teamSync.note')}</span>\n </div>\n\n {!canUse ? (\n <div className=\"text-xs text-slate-500\">{t('app.teamSync.signInRequired')}</div>\n ) : (\n <>\n <div className=\"grid grid-cols-1 gap-2\">\n <div className=\"flex items-center gap-2\">\n <select\n value={workspaceId}\n onChange={(e) => setWorkspaceId(e.target.value)}\n className=\"flex-1 px-2 py-2 rounded border border-slate-200 bg-white text-xs text-slate-700\"\n >\n <option value=\"\">{t('app.teamSync.selectWorkspace')}</option>\n {workspaces.map((w) => (\n <option key={w.workspaceId} value={w.workspaceId}>\n {w.name}\n </option>\n ))}\n </select>\n <button\n type=\"button\"\n onClick={handleCreateWorkspace}\n disabled={isLoading}\n className=\"px-3 py-2 rounded bg-slate-800 text-white text-xs font-bold hover:bg-slate-700 disabled:opacity-50\"\n >\n {t('app.teamSync.newWorkspace')}\n </button>\n </div>\n\n <div className=\"flex items-center gap-2\">\n <select\n value={projectId}\n onChange={(e) => setProjectId(e.target.value)}\n disabled={!workspaceId}\n className=\"flex-1 px-2 py-2 rounded border border-slate-200 bg-white text-xs text-slate-700 disabled:opacity-50\"\n >\n <option value=\"\">{t('app.teamSync.selectProject')}</option>\n {projects.map((p) => (\n <option key={p.projectId} value={p.projectId}>\n {p.name}\n </option>\n ))}\n </select>\n <button\n type=\"button\"\n onClick={handleCreateProject}\n disabled={isLoading || !workspaceId}\n className=\"px-3 py-2 rounded bg-white border border-slate-200 text-slate-700 text-xs font-bold hover:bg-slate-50 disabled:opacity-50\"\n >\n {t('app.teamSync.newProject')}\n </button>\n </div>\n </div>\n\n <div className=\"flex items-center justify-between text-[10px] text-slate-500\">\n <div>\n {headRev !== null && (\n <span className=\"tabular-nums\">\n {t('app.teamSync.head')}: r{headRev}\n {headSha ? ` (${headSha.slice(0, 7)})` : ''}\n </span>\n )}\n </div>\n {workspaceId && projectId && (\n <button\n type=\"button\"\n onClick={refreshProjectHead}\n className=\"text-[10px] font-bold text-slate-600 hover:underline\"\n >\n {t('app.teamSync.refreshHead')}\n </button>\n )}\n </div>\n\n <div className=\"grid grid-cols-2 gap-2\">\n <button\n type=\"button\"\n onClick={handlePull}\n disabled={isLoading || !workspaceId || !projectId}\n className=\"flex items-center justify-center gap-2 py-2 bg-white border border-slate-200 text-slate-700 rounded-lg hover:bg-slate-50 disabled:opacity-50\"\n >\n <span className=\"text-xs font-bold\">{t('app.teamSync.pull')}</span>\n </button>\n <button\n type=\"button\"\n onClick={handlePush}\n disabled={isLoading || !workspaceId || !projectId}\n className=\"flex items-center justify-center gap-2 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 disabled:opacity-50\"\n >\n <span className=\"text-xs font-bold\">{t('app.teamSync.push')}</span>\n </button>\n </div>\n\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <div className=\"text-xs font-bold text-slate-700\">{t('app.teamSync.invites')}</div>\n <button\n type=\"button\"\n onClick={handleCreateInvite}\n disabled={isLoading || !workspaceId}\n className=\"text-[10px] font-bold text-blue-600 hover:underline disabled:opacity-50\"\n >\n {t('app.teamSync.createInvite')}\n </button>\n </div>\n\n {lastCreatedInvite?.token && (\n <div className=\"flex items-center gap-2 p-2 bg-slate-50 border border-slate-200 rounded\">\n <code className=\"text-[10px] text-slate-700 break-all flex-1\">{lastCreatedInvite.token}</code>\n <CopyButton\n value={lastCreatedInvite.token}\n onCopied={() =>\n addToast({\n type: 'success',\n message: t('common.copied', { defaultValue: 'Copied' }),\n })\n }\n onCopyFailed={() =>\n addToast({\n type: 'error',\n message: t('common.copyFailed', { defaultValue: 'Copy failed' }),\n })\n }\n className=\"p-1.5 rounded border border-slate-200 bg-white text-slate-600 hover:bg-slate-50\"\n title={t('app.teamSync.copy')}\n aria-label={t('app.teamSync.copy')}\n >\n <Copy size={12} />\n </CopyButton>\n </div>\n )}\n\n {lastCreatedInvite?.expiresAt && (\n <div className=\"text-[10px] text-slate-500\">\n {t('app.teamSync.expires')}: {formatExpires(lastCreatedInvite.expiresAt)}\n </div>\n )}\n\n <div className=\"flex items-center gap-2\">\n <input\n value={inviteToken}\n onChange={(e) => setInviteToken(e.target.value)}\n placeholder={t('app.teamSync.invitePlaceholder')}\n className=\"flex-1 px-2 py-2 rounded border border-slate-200 bg-white text-xs text-slate-700\"\n />\n <button\n type=\"button\"\n onClick={handleAcceptInvite}\n disabled={isLoading || !inviteToken}\n className=\"px-3 py-2 rounded bg-white border border-slate-200 text-slate-700 text-xs font-bold hover:bg-slate-50 disabled:opacity-50\"\n >\n {t('app.teamSync.acceptInvite')}\n </button>\n </div>\n </div>\n </>\n )}\n </div>\n );\n};\n\nexport default TeamSyncPanel;\n","import React from 'react';\r\nimport { useMemo, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n Upload,\n X,\n ChevronDown,\n Smartphone,\r\n RotateCw,\n Image as ImageIcon,\n Aperture,\n AlignVerticalSpaceAround,\n AlignEndHorizontal,\n Star,\r\n Award,\r\n DownloadCloud,\r\n Play,\r\n Info,\r\n Trash2,\r\n Lock,\n HardDrive,\n Save,\n ArrowRight,\n Settings,\n Check,\n FileJson,\n Sparkles,\n UploadCloud,\n AlertTriangle,\n FileText,\n Terminal,\n ClipboardCopy,\n} from 'lucide-react';\nimport LanguageSelector from '../LanguageSelector';\nimport { DEVICE_LIBRARY, DEVICE_GROUPS, SOLID_PRESETS as solidPresets, OFFICIAL_TEMPLATES } from '../../constants/devices';\nimport { DEVICE_LABEL_MODES, deviceMatchesQuery, getDeviceLabelParts } from '../../lib/deviceLabels';\nimport FontSelector from './FontSelector';\nimport TeamSyncPanel from './TeamSyncPanel';\nimport CopyButton from '../CopyButton';\n\nconst ControlsPanel = ({\n\r\r\n activeTab,\r\n viewMode,\r\n isMobile,\r\n controlsVisible,\r\n controlsTranslation,\r\n isControlsDragging,\r\n currentHeaderText,\r\n currentSubText,\r\n currentLocaleId,\n updateSlideText,\n currentScreenshot,\n screenshotUploadScope = 'shared',\n setScreenshotUploadScope = () => {},\n hasCurrentLocaleScreenshotOverride = false,\n currentSlideScreenshotsByLocale = {},\n currentSlideLocaleScreenshotOverrideCount = 0,\n hasAnyLocaleScreenshotOverrides = false,\n hasSharedScreenshot = false,\n clearCurrentSlideScreenshot = () => {},\n clearAllCurrentSlideLocaleScreenshotOverrides = () => {},\n handleFileChange,\n fileInputRef,\n handleDropWrapper,\n handleDragOver,\n handleDragEnter,\n handleDragLeave,\r\n isDragging,\r\n locales,\r\n setCurrentLocaleId,\r\n removeLocale,\r\n handleAddLocales,\r\n deviceId,\n setDeviceId,\n deviceLabelMode = DEVICE_LABEL_MODES.store,\n setDeviceLabelMode = () => {},\n orientation,\n setOrientation,\n isWatchSelected,\n applyTheme,\r\n bgType,\r\n setBgType,\r\n bgInputRef,\r\n handleBgDropWrapper,\r\n handleBgDragOver,\r\n handleBgDragEnter,\r\n handleBgDragLeave,\r\n isBgDragging,\r\n handleBgFileChange,\r\n bgBlur,\r\n setBgBlur,\r\n bgOpacity,\r\n setBgOpacity,\r\n bgColor,\r\n setBgColor,\r\n gradientStart,\r\n setGradientStart,\r\n gradientEnd,\r\n setGradientEnd,\r\n frameColor,\r\n setFrameColor,\r\n logoImage,\r\n logoInputRef,\r\n handleLogoDropWrapper,\r\n handleLogoDragOver,\r\n handleLogoDragEnter,\r\n handleLogoDragLeave,\r\n isLogoDragging,\r\n handleLogoFileChange,\r\n handleLogoRemove,\r\n overrideActive,\r\n ensureSlideOverride,\r\n clearSlideOverride,\r\n updateSlideOverride,\r\n layoutMode,\r\n setLayoutMode,\r\n effectiveLayoutMode,\r\n selectedFont,\r\n setSelectedFont,\r\n fontOptions,\r\n textColor,\r\n setTextColor,\r\n recentColors = [],\r\n addRecentColor,\r\n effectiveTopSpacing,\r\n setTopSpacing,\r\n effectiveDeviceScale,\r\n setDeviceScale,\r\n badgeType,\r\n setBadgeType,\r\n applyPreset,\r\n myPresets,\r\n requirePro,\r\n openSavePresetDialog,\r\n deleteUserPreset,\r\n isPro,\r\n storageUsage,\n saveProject,\n loadProject,\n loadSampleProject = () => {},\n setConfirmDialog,\n saveStatus,\n statusMessage,\n handleExportJSON,\n jsonInputRef,\r\n handleImportJSON,\r\n isJsonDragging,\r\n handleJsonDragOver,\r\n handleJsonDragEnter,\r\n handleJsonDragLeave,\r\n handleJsonDropWrapper,\r\n isCsvDragging,\r\n handleCsvDropWrapper,\n handleCsvDragOver,\n handleCsvDragEnter,\n handleCsvDragLeave,\n openCsvTemplateDialog,\n csvInputRef,\n handleCsvImport,\n onImportLocaleScreenshots,\n selectedBatchDevices,\n setSelectedBatchDevices = () => {},\n toggleBatchDevice,\n exportStructureMode = 'locale',\n setExportStructureMode = () => {},\n teamSyncEnabled = false,\n teamSyncToken = null,\n captureTeamSpec = () => null,\n applyTeamSpec = () => {},\n onTouchStart,\n onTouchMove,\n onTouchEnd,\n i18n,\n}) => {\n const { t, i18n: i18nContext } = useTranslation();\n const i18next = i18n || i18nContext;\n const [deviceSearchQuery, setDeviceSearchQuery] = useState('');\n const [isLocaleScreenshotDragging, setIsLocaleScreenshotDragging] = useState(false);\n const localeScreenshotZipInputRef = useRef(null);\n const localeScreenshotFolderInputRef = useRef(null);\n const localeScreenshotFilesInputRef = useRef(null);\n\n const deviceGroupLabels = {\n iPhone: t('app.device.groups.iPhone'),\n 'iPhone Classic': t('app.device.groups.iphoneClassic'),\n iPad: t('app.device.groups.iPad'),\n Android: t('app.device.groups.android'),\n 'Android Tablet': t('app.device.groups.androidTablet'),\n Watch: t('app.device.groups.watch'),\n };\n const copyButtonLabel = t('common.copy', { defaultValue: 'Copy' });\n const cliQuickstart = t('app.data.cliCmd');\n\n const alwaysIncludeDeviceIds = useMemo(() => {\n if (viewMode === 'single') return new Set([deviceId]);\n return new Set(selectedBatchDevices || []);\n }, [deviceId, selectedBatchDevices, viewMode]);\n\n const filteredDeviceGroups = useMemo(() => {\n const result = {};\n\n Object.entries(DEVICE_GROUPS).forEach(([group, ids]) => {\n const filtered = deviceSearchQuery\n ? ids.filter((id) => alwaysIncludeDeviceIds.has(id) || deviceMatchesQuery(id, DEVICE_LIBRARY[id], deviceSearchQuery))\n : ids;\n if (filtered.length) result[group] = filtered;\n });\n\n // If ids are forced-in but their group ended up empty (edge), attach them.\n alwaysIncludeDeviceIds.forEach((id) => {\n const group = DEVICE_LIBRARY[id]?.group;\n if (!group) return;\n result[group] ||= [];\n if (!result[group].includes(id)) result[group] = [id, ...result[group]];\n });\n\n return result;\n }, [alwaysIncludeDeviceIds, deviceSearchQuery]);\n\n const DeviceLabelModeToggle = ({ className = '' }) => (\n <div className={`space-y-1 ${className}`}>\n <div className=\"flex gap-2 bg-slate-50 p-1 rounded-lg border border-slate-200\">\n <button\n type=\"button\"\n onClick={() => setDeviceLabelMode(DEVICE_LABEL_MODES.store)}\n className={`flex-1 py-1.5 rounded-md text-xs font-medium transition-colors ${\n deviceLabelMode === DEVICE_LABEL_MODES.store ? 'bg-white text-blue-600 shadow-sm' : 'text-slate-500 hover:text-slate-700'\n }`}\n >\n {t('app.device.labelMode.store')}\n </button>\n <button\n type=\"button\"\n onClick={() => setDeviceLabelMode(DEVICE_LABEL_MODES.detailed)}\n className={`flex-1 py-1.5 rounded-md text-xs font-medium transition-colors ${\n deviceLabelMode === DEVICE_LABEL_MODES.detailed ? 'bg-white text-blue-600 shadow-sm' : 'text-slate-500 hover:text-slate-700'\n }`}\n >\n {t('app.device.labelMode.detailed')}\n </button>\n </div>\n <div className=\"text-[10px] text-slate-400 leading-snug\">{t('app.device.labelModeHint')}</div>\n </div>\n );\n\n const batchPresets = useMemo(() => {\n const iosRequired = ['iphone69', 'iphone65', 'iphone55', 'ipad13'].filter((id) => DEVICE_LIBRARY[id]);\n const playPhone = (DEVICE_GROUPS.Android || []).filter((id) => DEVICE_LIBRARY[id]);\n const playTablet = (DEVICE_GROUPS['Android Tablet'] || []).filter((id) => DEVICE_LIBRARY[id]);\n const all = Object.values(DEVICE_GROUPS)\n .flat()\n .filter((id) => DEVICE_LIBRARY[id]);\n\n return { iosRequired, playPhone, playTablet, all };\n }, []);\n\n const applyBatchPreset = (ids) => {\n if (!Array.isArray(ids)) return;\n const unique = Array.from(new Set(ids));\n setSelectedBatchDevices(unique);\n };\n\n const ColorHistory = ({ onSelect }) => {\n if (!recentColors.length) return null;\n return (\n <div className=\"mt-2\">\n <div className=\"text-[10px] text-slate-400 mb-1\">Recent</div>\r\n <div className=\"flex flex-wrap gap-1\">\r\n {recentColors.map((c) => (\r\n <button\r\n key={c}\r\n onClick={() => onSelect(c)}\r\n className=\"w-5 h-5 rounded-full border border-slate-200 shadow-sm transition-transform hover:scale-110\"\r\n style={{ backgroundColor: c }}\r\n title={c}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n const getTemplateFallbackStyle = (template) => {\r\n const settings = template?.settings || {};\r\n if (settings.bgType === 'gradient') {\r\n const angle = typeof settings.gradientAngle === 'number' ? settings.gradientAngle : 135;\r\n return { backgroundImage: `linear-gradient(${angle}deg, ${settings.gradientStart || '#e0c3fc'}, ${settings.gradientEnd || '#8ec5fc'})` };\r\n }\r\n if (settings.bgColor) return { backgroundColor: settings.bgColor };\r\n return { backgroundColor: '#e2e8f0' };\r\n };\r\n\r\n return (\r\n <div\r\n className={`w-full md:w-80 ${isMobile && !controlsVisible ? 'max-h-0' : 'h-1/2'} md:h-full bg-white border-b md:border-b-0 md:border-r border-slate-200 flex flex-col overflow-y-auto shrink-0 z-[120] order-2 md:order-none shadow-inner md:shadow-none ${isMobile ? 'transition-all duration-300 max-h-[65vh] fixed inset-x-0 bottom-16' : ''} ${isMobile && !controlsVisible ? 'pointer-events-none opacity-0' : ''}`}\r\n style={{\r\n transform: isMobile ? `translateY(${controlsTranslation}px)` : undefined,\r\n transition: isControlsDragging ? 'none' : 'transform 220ms ease, opacity 200ms ease, max-height 200ms ease',\r\n }}\r\n onTouchStart={onTouchStart}\r\n onTouchMove={onTouchMove}\r\n onTouchEnd={onTouchEnd}\r\n >\r\n <div className=\"p-6 space-y-8\">\r\r\n {/* --- TAB: EDIT --- */}\r\n {activeTab === 'edit' && (\r\n <>\r\n <section className=\"space-y-3\">\n <h3 className=\"font-bold text-xs uppercase tracking-wider text-slate-400\">{t('app.content.title')}</h3>\n <div className=\"space-y-2\">\n <input type=\"text\" value={currentHeaderText} onChange={(e) => updateSlideText('header', e.target.value)} className=\"w-full px-2 py-1.5 border border-slate-200 rounded-lg text-xs font-medium\" placeholder={t('app.content.headerPlaceholder', { locale: currentLocaleId })} />\n <input type=\"text\" value={currentSubText} onChange={(e) => updateSlideText('sub', e.target.value)} className=\"w-full px-2 py-1.5 border border-slate-200 rounded-lg text-xs\" placeholder={t('app.content.subPlaceholder', { locale: currentLocaleId })} />\n </div>\n\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-[10px] font-semibold text-slate-500\">{t('app.content.screenshotScopeLabel')}</span>\n {hasCurrentLocaleScreenshotOverride && (\n <span className=\"text-[10px] font-bold px-1.5 py-0.5 rounded border bg-blue-50 text-blue-700 border-blue-100\">\n {t('app.content.screenshotScopeOverride')}\n </span>\n )}\n </div>\n <div className=\"inline-flex rounded-lg border border-slate-200 overflow-hidden bg-white shadow-sm\">\n <button\n type=\"button\"\n onClick={() => setScreenshotUploadScope('shared')}\n className={`px-2.5 py-1 text-[10px] font-bold transition-colors ${\n screenshotUploadScope === 'shared' ? 'bg-slate-900 text-white' : 'text-slate-600 hover:bg-slate-50'\n }`}\n >\n {t('app.content.screenshotScopeShared')}\n </button>\n <button\n type=\"button\"\n onClick={() => setScreenshotUploadScope('locale')}\n className={`px-2.5 py-1 text-[10px] font-bold transition-colors ${\n screenshotUploadScope === 'locale' ? 'bg-slate-900 text-white' : 'text-slate-600 hover:bg-slate-50'\n }`}\n >\n {t('app.content.screenshotScopeLocale')}\n </button>\n </div>\n </div>\n\n {(screenshotUploadScope === 'shared' && hasAnyLocaleScreenshotOverrides) && (\n <p className=\"text-[10px] text-slate-500 leading-snug\">\n {t('app.content.screenshotSharedOverridesHint', { count: currentSlideLocaleScreenshotOverrideCount })}\n </p>\n )}\n {(screenshotUploadScope === 'locale' && !hasCurrentLocaleScreenshotOverride && hasSharedScreenshot) && (\n <p className=\"text-[10px] text-slate-500 leading-snug\">\n {t('app.content.screenshotLocaleFallbackHint')}\n </p>\n )}\n {(screenshotUploadScope === 'locale' && !hasCurrentLocaleScreenshotOverride && !hasSharedScreenshot) && (\n <p className=\"text-[10px] text-slate-500 leading-snug\">\n {t('app.content.screenshotLocaleEmptyHint')}\n </p>\n )}\n\n {hasAnyLocaleScreenshotOverrides && (\n <button\n type=\"button\"\n onClick={() => {\n setConfirmDialog?.({\n message: t('app.content.clearAllOverridesConfirm'),\n onConfirm: () => clearAllCurrentSlideLocaleScreenshotOverrides(),\n onCancel: () => setConfirmDialog?.(null),\n });\n }}\n className=\"text-[10px] font-bold text-rose-600 hover:underline self-start\"\n >\n {t('app.content.clearAllOverrides')}\n </button>\n )}\n\n <div\n onClick={() => fileInputRef.current?.click?.()}\n onDrop={handleDropWrapper}\n onDragOver={handleDragOver}\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onKeyDown={(e) => {\n if (e.target !== e.currentTarget) return;\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n fileInputRef.current?.click?.();\n }\n }}\n role=\"button\"\n tabIndex={0}\n className={`border-2 border-dashed rounded-xl p-4 flex flex-col items-center justify-center transition-all cursor-pointer group relative overflow-hidden h-32 ${\n isDragging \n ? 'border-blue-500 bg-blue-100 text-blue-600 scale-[1.02]'\n : 'border-slate-200 text-slate-400 bg-slate-50/50 hover:border-blue-500 hover:text-blue-500 hover:bg-blue-50'\n }`}\n >\n {currentScreenshot ? <img src={currentScreenshot} alt=\"\" className=\"absolute inset-0 w-full h-full object-cover opacity-80 pointer-events-none\" /> : <Upload className=\"w-5 h-5 mb-1 group-hover:scale-110 transition-transform pointer-events-none\" />}\n {((screenshotUploadScope === 'shared' && !!currentScreenshot) || (screenshotUploadScope === 'locale' && hasCurrentLocaleScreenshotOverride)) && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n clearCurrentSlideScreenshot();\n }}\n className=\"absolute top-2 right-2 p-1 rounded-full bg-white/90 border border-slate-200 text-slate-600 hover:text-red-600 hover:border-red-200 hover:bg-red-50 shadow-sm\"\n title={t('app.content.screenshotClear')}\n >\n <X size={12} />\n </button>\n )}\n <span className=\"text-[10px] font-medium relative z-10 bg-white/80 px-2 rounded pointer-events-none\">\n {currentScreenshot\n ? screenshotUploadScope === 'locale'\n ? t('app.content.changeImageForLocale', { locale: currentLocaleId })\n : t('app.content.changeImage')\n : screenshotUploadScope === 'locale'\n ? t('app.content.uploadScreenshotForLocale', { locale: currentLocaleId })\n : t('app.content.uploadScreenshot')}\n </span>\n <input type=\"file\" ref={fileInputRef} className=\"hidden\" accept=\"image/*\" onChange={handleFileChange} />\n </div>\n <p className=\"text-[10px] text-slate-500 leading-snug\">{t('app.data.privacy')}</p>\n </section>\n <hr className=\"border-slate-100\" />\n\n <section className=\"space-y-3\">\n <div className=\"space-y-1\">\r\n <h3 className=\"font-bold text-xs uppercase tracking-wider text-slate-400\">{t('app.language.title')}</h3>\r\n <p className=\"text-xs text-slate-500 leading-relaxed\">\r\n {t('app.language.description')}\r\n </p>\r\n </div>\r\n\r\n <div className=\"flex flex-wrap gap-2\">\r\n {locales.map((l) => (\r\n <div\r\n key={l.id}\r\n onClick={() => setCurrentLocaleId(l.id)}\r\n className={`group relative px-3 py-2 rounded-lg text-xs font-medium cursor-pointer border transition-all select-none ${\r\n currentLocaleId === l.id \r\n ? 'bg-blue-50 border-blue-500 text-blue-700 shadow-sm' \r\n : 'bg-white border-slate-200 text-slate-600 hover:border-slate-300 hover:bg-slate-50'\r\n }`}\r\n >\r\n <div className=\"flex items-center gap-2\">\n <span className=\"text-base\">{l.flag ? `${l.flag}` : '??'}</span>\n <div className=\"flex flex-col\">\n <span className=\"font-bold\">{l.name || l.id}</span>\n <span className=\"text-[10px] opacity-70\">{l.id}</span>\n </div>\n </div>\n\n {!!currentSlideScreenshotsByLocale?.[l.id] && (\n <span\n className=\"absolute bottom-2 right-2 w-2 h-2 rounded-full bg-blue-500 border border-white shadow-sm\"\n title={t('app.content.screenshotScopeOverride')}\n />\n )}\n\n {locales.length > 1 && (\n <div className={`absolute -top-1.5 -right-1.5 flex gap-0.5 bg-white rounded-full shadow-sm border border-slate-100 ${currentLocaleId === l.id ? 'opacity-100' : 'opacity-0 group-hover:opacity-100'} transition-opacity`}>\n <button\n onClick={(e) => {\n e.stopPropagation();\r\n removeLocale(l.id);\r\n }}\r\n className=\"p-1 text-slate-400 hover:text-red-500 hover:bg-red-50 rounded-full\"\r\n title={t('app.language.remove')}\r\n >\r\n <X size={10} />\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n\r\n <div className=\"flex gap-2 p-2 bg-slate-50 rounded-xl border border-slate-200/60 mt-2 items-center\">\r\n <LanguageSelector currentLocales={locales} onAdd={handleAddLocales} />\r\n <span className=\"text-[11px] text-slate-500 hidden sm:block\">\r\n {t('app.language.presetsHint', 'EFIGS / CJK presets available')}\r\n </span>\r\n </div>\r\n </section>\r\n\r\n {viewMode === 'single' && (\r\n <>\r\n <hr className=\"border-slate-100\" />\r\n <section className=\"space-y-3\">\n <h3 className=\"font-bold text-xs uppercase tracking-wider text-slate-400\">{t('app.device.title')}</h3>\n <DeviceLabelModeToggle />\n <div className=\"relative\">\n <input\n type=\"text\"\n value={deviceSearchQuery}\n onChange={(e) => setDeviceSearchQuery(e.target.value)}\n className=\"w-full bg-slate-50 border border-slate-200 text-slate-700 text-sm rounded-xl px-4 py-2.5 pr-10 focus:outline-none focus:border-blue-500\"\n placeholder={t('app.device.searchPlaceholder')}\n spellCheck={false}\n />\n {deviceSearchQuery && (\n <button\n type=\"button\"\n onClick={() => setDeviceSearchQuery('')}\n className=\"absolute right-2.5 top-1/2 -translate-y-1/2 text-slate-400 hover:text-slate-600 p-1\"\n aria-label=\"Clear search\"\n >\n <X size={14} />\n </button>\n )}\n </div>\n <div className=\"relative\">\n <select value={deviceId} onChange={(e) => setDeviceId(e.target.value)} className=\"w-full appearance-none bg-slate-50 border border-slate-200 text-slate-700 text-sm rounded-xl px-4 py-3 pr-8 focus:outline-none focus:border-blue-500 font-medium\">\n {Object.entries(filteredDeviceGroups).map(([group, ids]) => {\n const groupLabel = deviceGroupLabels[group] || group;\n return (\n <optgroup key={group} label={groupLabel}>\n {ids.map((id) => {\n const parts = getDeviceLabelParts(DEVICE_LIBRARY[id], { id, mode: deviceLabelMode });\n return (\n <option key={id} value={id}>\n {parts.optionLabel}\n </option>\n );\n })}\n </optgroup>\n );\n })}\n </select>\n <ChevronDown className=\"absolute right-3 top-1/2 -translate-y-1/2 text-slate-400 pointer-events-none\" size={16} />\n </div>\n <div className=\"mt-2 flex gap-2 bg-slate-50 p-1 rounded-lg border border-slate-200\">\r\n <button onClick={() => setOrientation('portrait')} className={`flex-1 py-1.5 rounded-md text-xs font-medium flex items-center justify-center gap-2 transition-colors ${orientation === 'portrait' || isWatchSelected ? 'bg-white text-blue-600 shadow-sm' : 'text-slate-500 hover:text-slate-700'}`}>\r\n <Smartphone size={12} /> {t('app.device.portrait')}\r\n </button>\r\n <button onClick={() => setOrientation('landscape')} disabled={isWatchSelected} className={`flex-1 py-1.5 rounded-md text-xs font-medium flex items-center justify-center gap-2 transition-colors ${orientation === 'landscape' && !isWatchSelected ? 'bg-white text-blue-600 shadow-sm' : 'text-slate-500 hover:text-slate-700'} ${isWatchSelected ? 'opacity-30 cursor-not-allowed' : ''}`}>\r\n <RotateCw size={12} /> {t('app.device.landscape')}\r\n </button>\r\n </div>\r\n </section>\r\n </>\r\n )}\r\n </>\r\n )}\r\r\n {activeTab === 'style' && (\r\n <>\r\n <section className=\"space-y-3\">\r\n <h3 className=\"font-bold text-xs uppercase tracking-wider text-slate-400\">{t('app.theme.title')}</h3>\r\n <div className=\"flex gap-2\">\r\n <button onClick={() => applyTheme('clean')} className=\"flex-1 py-2 bg-slate-50 border border-slate-200 rounded-lg text-xs font-medium hover:bg-slate-100\">{t('app.theme.clean')}</button>\r\n <button onClick={() => applyTheme('dark')} className=\"flex-1 py-2 bg-slate-900 text-white border border-slate-800 rounded-lg text-xs font-medium hover:bg-slate-800\">{t('app.theme.dark')}</button>\r\n <button onClick={() => applyTheme('pop')} className=\"flex-1 py-2 bg-gradient-to-r from-pink-200 to-pink-300 border border-pink-200 text-pink-900 rounded-lg text-xs font-medium hover:opacity-90\">{t('app.theme.pop')}</button>\r\n </div>\r\n </section>\r\n\r\n <hr className=\"border-slate-100\" />\r\n\r\n <section className=\"space-y-4\">\r\n <h3 className=\"font-bold text-xs uppercase tracking-wider text-slate-400\">{t('app.background.title')}</h3>\r\n <div className=\"grid grid-cols-4 gap-2\">\r\n {['transparent', 'solid', 'gradient', 'image'].map(type => (\r\n <button\r\n key={type}\r\n onClick={() => setBgType(type)}\r\n className={`w-full px-1.5 py-1.5 rounded-md border text-[8px] leading-[11px] tracking-normal font-bold uppercase text-center whitespace-normal break-all flex flex-col items-center justify-center gap-1 transition-all ${\r\n bgType === type ? 'border-blue-500 text-blue-600 bg-blue-50 ring-1 ring-blue-500' : 'border-slate-200 text-slate-500 hover:border-slate-300'\r\n }`}\r\n >\r\n {type === 'image' ? <ImageIcon size={14} /> : t(`app.background.types.${type}`)}\r\n </button>\r\n ))}\r\n </div>\r\n {bgType === 'image' && (\r\n <div className=\"space-y-2\">\r\n <div\r\n onClick={() => bgInputRef.current.click()}\r\n onDrop={handleBgDropWrapper}\r\n onDragOver={handleBgDragOver}\r\n onDragEnter={handleBgDragEnter}\r\n onDragLeave={handleBgDragLeave}\r\n className={`h-16 w-full rounded-lg border-2 border-dashed flex items-center justify-center cursor-pointer text-xs transition-all ${\r\n isBgDragging\r\n ? 'border-blue-500 bg-blue-100 text-blue-600 scale-[1.01]'\r\n : 'border-slate-300 text-slate-400 hover:bg-slate-50 hover:border-blue-400 hover:text-blue-600'\r\n }`}\r\n >\r\n <Upload size={14} className=\"mr-1 pointer-events-none\"/> <span className=\"pointer-events-none\">{t('app.background.upload')}</span> <input type=\"file\" ref={bgInputRef} className=\"hidden\" accept=\"image/*\" onChange={handleBgFileChange} />\r\n </div>\r\n <div className=\"flex gap-2 pt-1\">\r\n <div className=\"flex-1\">\r\n <div className=\"flex justify-between text-[10px] text-slate-400\"><span>{t('app.background.blur')}</span><span>{bgBlur}px</span></div>\r\n <input type=\"range\" min=\"0\" max=\"20\" step=\"1\" value={bgBlur} onChange={(e) => setBgBlur(parseInt(e.target.value))} className=\"w-full accent-slate-800 h-1 bg-slate-200 rounded-lg\" />\r\n </div>\r\n <div className=\"flex-1\">\r\n <div className=\"flex justify-between text-[10px] text-slate-400\"><span>{t('app.background.dim')}</span><span>{bgOpacity}%</span></div>\r\n <input type=\"range\" min=\"0\" max=\"80\" step=\"5\" value={bgOpacity} onChange={(e) => setBgOpacity(parseInt(e.target.value))} className=\"w-full accent-slate-800 h-1 bg-slate-200 rounded-lg\" />\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n {bgType === 'solid' && (\r\n <div className=\"space-y-2\">\r\n <div className=\"flex gap-2\">\r\n <input\r\n type=\"color\"\r\n value={bgColor}\r\n onChange={(e) => setBgColor(e.target.value)}\r\n onBlur={(e) => addRecentColor && addRecentColor(e.target.value)}\r\n className=\"h-8 w-8 rounded cursor-pointer border border-slate-300\"\r\n />\r\n <div className=\"flex-1 flex flex-wrap gap-1\">\r\n {solidPresets.slice(0, 5).map((c) => (\r\n <div key={c} onClick={() => { setBgColor(c); addRecentColor && addRecentColor(c); }} className=\"w-6 h-6 rounded-full border cursor-pointer\" style={{ background: c }} />\r\n ))}\r\n </div>\r\n </div>\r\n <ColorHistory onSelect={(c) => { setBgColor(c); addRecentColor && addRecentColor(c); }} />\r\n </div>\r\n )}\r\n {bgType === 'gradient' && (\r\n <div className=\"space-y-2\">\r\n <div className=\"flex gap-2\">\r\n <input\r\n type=\"color\"\r\n value={gradientStart}\r\n onChange={(e) => setGradientStart(e.target.value)}\r\n onBlur={(e) => addRecentColor && addRecentColor(e.target.value)}\r\n className=\"h-8 w-8 rounded cursor-pointer border border-slate-300\"\r\n />\r\n <input\r\n type=\"color\"\r\n value={gradientEnd}\r\n onChange={(e) => setGradientEnd(e.target.value)}\r\n onBlur={(e) => addRecentColor && addRecentColor(e.target.value)}\r\n className=\"h-8 w-8 rounded cursor-pointer border border-slate-300\"\r\n />\r\n </div>\r\n <ColorHistory onSelect={(c) => { setGradientStart(c); addRecentColor && addRecentColor(c); }} />\r\n </div>\r\n )}\r\n </section>\r\n\r\n <hr className=\"border-slate-100\" />\r\n\r\n <section className=\"space-y-4\">\r\n <h3 className=\"font-bold text-xs uppercase tracking-wider text-slate-400\">{t('app.branding.title')}</h3>\r\n <div className=\"space-y-3\">\r\n <div>\r\n <label className=\"text-[10px] text-slate-500 mb-1 block\">{t('app.branding.frameColor')}</label>\r\n <div className=\"flex gap-2\">\r\n {['black', 'silver', 'titanium', 'blue', 'gold'].map(color => (\r\n <button key={color} onClick={() => setFrameColor(color)} className={`w-6 h-6 rounded-full border-2 transition-transform hover:scale-110 ${frameColor === color ? 'border-blue-500 scale-110' : 'border-slate-200'}`} style={{backgroundColor: color === 'titanium' ? '#8a8a8a' : color === 'blue' ? '#2f3c4e' : color === 'gold' ? '#f9e5c9' : color === 'silver' ? '#e3e3e3' : '#1a1a1a'}} title={color} />\r\n ))}\r\n </div>\r\n </div>\r\n {logoImage ? (\r\n <div\r\n onDrop={handleLogoDropWrapper}\r\n onDragOver={handleLogoDragOver}\r\n onDragEnter={handleLogoDragEnter}\r\n onDragLeave={handleLogoDragLeave}\r\n onClick={() => logoInputRef.current.click()}\r\n className={`flex items-center justify-between p-2 border rounded-lg cursor-pointer transition-all shadow-sm group ${\r\n isLogoDragging\r\n ? 'border-blue-500 bg-blue-50 ring-2 ring-blue-200'\r\n : 'border-slate-200 bg-white hover:border-blue-300'\r\n }`}\r\n >\r\n <div className=\"flex items-center gap-3 pointer-events-none\">\r\n <div className=\"w-10 h-10 rounded border border-slate-100 bg-slate-50 flex items-center justify-center p-1 overflow-hidden relative\">\r\n <div className=\"absolute inset-0 opacity-20 bg-[url('https://www.transparenttextures.com/patterns/checkerboard.png')]\" />\r\n <img src={logoImage} className=\"w-full h-full object-contain relative z-10\" />\r\n </div>\r\n <div className=\"flex flex-col\">\r\n <span className=\"text-[10px] font-bold text-slate-700 uppercase tracking-wider\">Logo</span>\r\n <span className=\"text-[10px] text-slate-400\">{isLogoDragging ? 'Drop to Change' : 'Set'}</span>\r\n </div>\r\n </div>\r\n <div className=\"flex items-center gap-1\">\r\n <button \r\n onClick={(e) => { e.stopPropagation(); logoInputRef.current.click(); }} \r\n className=\"p-1.5 text-slate-400 hover:text-blue-600 hover:bg-blue-50 rounded transition-colors\"\r\n title=\"Change Logo\"\r\n >\r\n <RotateCw size={14} />\r\n </button>\r\n <button \r\n onClick={(e) => { e.stopPropagation(); handleLogoRemove(); }} \r\n className=\"p-1.5 text-slate-400 hover:text-red-500 hover:bg-red-50 rounded transition-colors\"\r\n title=\"Remove Logo\"\r\n >\r\n <Trash2 size={14} />\r\n </button>\r\n </div>\r\n <input type=\"file\" ref={logoInputRef} className=\"hidden\" accept=\"image/*\" onChange={handleLogoFileChange} />\r\n </div>\r\n ) : (\r\n <div\r\n onClick={() => logoInputRef.current.click()}\r\n onDrop={handleLogoDropWrapper}\r\n onDragOver={handleLogoDragOver}\r\n onDragEnter={handleLogoDragEnter}\r\n onDragLeave={handleLogoDragLeave}\r\n className={`flex items-center justify-between p-3 border border-dashed rounded-lg cursor-pointer transition-all group ${\r\n isLogoDragging\r\n ? 'border-blue-500 bg-blue-50 text-blue-700'\r\n : 'border-slate-300 text-slate-500 hover:border-blue-400 hover:text-blue-600 hover:bg-slate-50'\r\n }`}\r\n >\r\n <span className=\"text-xs font-medium flex items-center gap-2 pointer-events-none\">\r\n <Aperture size={16} className=\"text-slate-400 group-hover:text-blue-500 transition-colors\"/> \r\n {t('app.branding.uploadLogo')}\r\n </span>\r\n <Upload size={14} className=\"text-slate-300 group-hover:text-blue-400 transition-colors\" />\r\n <input type=\"file\" ref={logoInputRef} className=\"hidden\" accept=\"image/*\" onChange={handleLogoFileChange} />\r\n </div>\r\n )}\r\n </div>\r\n </section>\r\n\r\n <hr className=\"border-slate-100\" />\r\n\r\n <section className=\"space-y-4\">\r\n <h3 className=\"font-bold text-xs uppercase tracking-wider text-slate-400\">{t('app.layout.title')}</h3>\r\n <div className=\"flex items-center justify-between text-xs text-slate-600\">\r\n <label className=\"flex items-center gap-2\">\r\n <input\r\n type=\"checkbox\"\r\n checked={overrideActive}\r\n onChange={(e) => (e.target.checked ? ensureSlideOverride() : clearSlideOverride())}\r\n className=\"rounded border-slate-300 text-blue-600 focus:ring-blue-500\"\r\n />\r\n <span>{t('app.layout.overrideToggle')}</span>\r\n </label>\r\n {overrideActive && (\r\n <button onClick={clearSlideOverride} className=\"text-[11px] text-blue-600 hover:underline\">\r\n {t('app.layout.overrideReset')}\r\n </button>\r\n )}\r\n </div>\r\n <div className=\"grid grid-cols-3 gap-2\">\r\n <button onClick={() => (overrideActive ? updateSlideOverride('layoutMode', 'top') : setLayoutMode('top'))} className={`py-2 rounded-md border text-[10px] font-bold flex flex-col items-center gap-1 ${effectiveLayoutMode === 'top' ? 'border-blue-500 bg-blue-50 text-blue-700' : 'border-slate-200 text-slate-500'}`}><AlignVerticalSpaceAround size={14} className=\"rotate-180\" />{t('app.layout.options.top')}</button>\r\n <button onClick={() => (overrideActive ? updateSlideOverride('layoutMode', 'bottom') : setLayoutMode('bottom'))} className={`py-2 rounded-md border text-[10px] font-bold flex flex-col items-center gap-1 ${effectiveLayoutMode === 'bottom' ? 'border-blue-500 bg-blue-50 text-blue-700' : 'border-slate-200 text-slate-500'}`}><AlignVerticalSpaceAround size={14} />{t('app.layout.options.bottom')}</button>\r\n <button onClick={() => (overrideActive ? updateSlideOverride('layoutMode', 'split') : setLayoutMode('split'))} className={`py-2 rounded-md border text-[10px] font-bold flex flex-col items-center gap-1 ${effectiveLayoutMode === 'split' ? 'border-blue-500 bg-blue-50 text-blue-700' : 'border-slate-200 text-slate-500'}`}><AlignEndHorizontal size={14} />{t('app.layout.options.split')}</button>\r\n </div>\r\n <div className=\"pt-2\">\r\n <label className=\"text-[10px] text-slate-500 mb-1 block\">Font Family</label>\r\n <FontSelector selectedFont={selectedFont} setSelectedFont={setSelectedFont} fontOptions={fontOptions} />\r\n </div>\r\n <div className=\"flex items-center justify-between pt-1\">\r\n <span className=\"text-xs text-slate-500\">{t('app.layout.textColor')}</span>\r\n <input\r\n type=\"color\"\r\n value={textColor}\r\n onChange={(e) => setTextColor(e.target.value)}\r\n onBlur={(e) => addRecentColor && addRecentColor(e.target.value)}\r\n className=\"w-6 h-6 rounded-full cursor-pointer border border-slate-200\"\r\n />\r\n </div>\r\n <ColorHistory onSelect={(c) => { setTextColor(c); addRecentColor && addRecentColor(c); }} />\r\n <div className=\"space-y-1 pt-2\"><div className=\"flex justify-between text-xs text-slate-500\"><span>{t('app.layout.topSpacing')}</span><span>{effectiveTopSpacing}%</span></div><input type=\"range\" min=\"0\" max=\"30\" step=\"1\" value={effectiveTopSpacing} onChange={(e) => (overrideActive ? updateSlideOverride('topSpacing', parseInt(e.target.value)) : setTopSpacing(parseInt(e.target.value)))} className=\"w-full accent-slate-800 h-1.5 bg-slate-200 rounded-lg appearance-none cursor-pointer\" /></div>\r\n <div className=\"space-y-1\"><div className=\"flex justify-between text-xs text-slate-500\"><span>{t('app.layout.scale')}</span><span>{Math.round(effectiveDeviceScale * 100)}%</span></div><input type=\"range\" min=\"0.5\" max=\"2.0\" step=\"0.05\" value={effectiveDeviceScale} onChange={(e) => (overrideActive ? updateSlideOverride('deviceScale', parseFloat(e.target.value)) : setDeviceScale(parseFloat(e.target.value)))} className=\"w-full accent-slate-800 h-1.5 bg-slate-200 rounded-lg appearance-none cursor-pointer\" /></div>\r\n </section>\r\n\r\n <section className=\"space-y-2 pt-2\">\r\n <h3 className=\"font-bold text-xs uppercase tracking-wider text-slate-400\">{t('app.badge.title')}</h3>\r\n <div className=\"grid grid-cols-5 gap-2\"><button onClick={() => setBadgeType('none')} className={`p-1.5 rounded-lg border flex justify-center ${badgeType === 'none' ? 'bg-blue-50 border-blue-500' : 'border-slate-200'}`}><X size={14} className=\"text-slate-400\"/></button><button onClick={() => setBadgeType('stars')} className={`p-1.5 rounded-lg border flex justify-center ${badgeType === 'stars' ? 'bg-blue-50 border-blue-500' : 'border-slate-200'}`}><Star size={14} className=\"text-yellow-500 fill-yellow-500\"/></button><button onClick={() => setBadgeType('award')} className={`p-1.5 rounded-lg border flex justify-center ${badgeType === 'award' ? 'bg-blue-50 border-blue-500' : 'border-slate-200'}`}><Award size={14} className=\"text-red-500\"/></button><button onClick={() => setBadgeType('download')} className={`p-1.5 rounded-lg border flex justify-center ${badgeType === 'download' ? 'bg-blue-50 border-blue-500' : 'border-slate-200'}`}><DownloadCloud size={14} className=\"text-slate-700\"/></button><button onClick={() => setBadgeType('googleplay')} className={`p-1.5 rounded-lg border flex justify-center ${badgeType === 'googleplay' ? 'bg-blue-50 border-blue-500' : 'border-slate-200'}`}><Play size={14} className=\"text-slate-700\" fill=\"currentColor\"/></button></div>\r\n </section>\r\n </>\r\n )}\r\r\n {activeTab === 'templates' && (\r\n <>\r\n <section className=\"space-y-3\">\r\n <h3 className=\"font-bold text-xs uppercase tracking-wider text-slate-400\">{t('app.templates.official')}</h3>\r\n <div className=\"grid grid-cols-1 gap-4\">\r\n {OFFICIAL_TEMPLATES.map(template => (\r\n <div \r\n key={template.id} \r\n onClick={() => applyPreset(template)} \r\n className=\"group cursor-pointer border border-slate-200 rounded-xl overflow-hidden hover:border-blue-400 hover:shadow-md transition-all bg-white\"\r\n >\r\n <div className=\"h-24 w-full relative overflow-hidden\" style={getTemplateFallbackStyle(template)}>\r\n <img \r\n src={template.thumbnail} \r\n alt={template.name}\r\n className=\"w-full h-full object-cover transition-transform duration-500 group-hover:scale-105\"\r\n onError={(e) => { e.currentTarget.style.display = 'none'; }}\r\n />\r\n <div className=\"absolute inset-0 pointer-events-none bg-gradient-to-t from-black/40 to-transparent\" />\r\n <div className=\"absolute bottom-0 left-0 right-0 p-2 flex items-center justify-between\">\r\n <span className=\"text-white text-xs font-bold drop-shadow\">{t(`app.templates.officialItems.${template.id}`, { defaultValue: template.name })}</span>\r\n {template.tags?.bg && (\r\n <span className=\"text-[10px] text-white/80 bg-black/40 px-2 py-0.5 rounded-full border border-white/10\">{template.tags.bg}</span>\r\n )}\r\n </div>\r\n </div>\r\n <div className=\"p-3 flex flex-wrap gap-2 bg-white\">\r\n {template.tags && Object.entries(template.tags).map(([key, val]) => (\r\n <span key={key} className=\"inline-flex items-center px-1.5 py-0.5 rounded text-[10px] font-medium bg-slate-100 text-slate-500 border border-slate-200\">\r\n {val}\r\n </span>\r\n ))}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n </section>\r\n\r\n <hr className=\"border-slate-100\" />\r\n\r\n <section className=\"space-y-3\">\r\n <div className=\"flex justify-between items-center\">\r\n <h3 className=\"font-bold text-xs uppercase tracking-wider text-slate-400\">{t('app.templates.mine')}</h3>\r\n <button onClick={() => requirePro(openSavePresetDialog)} className=\"text-[10px] text-blue-600 font-bold hover:underline\">{t('app.templates.saveCurrent')}</button>\r\n </div>\r\n <div className=\"flex gap-2 p-2 bg-blue-50/50 border border-blue-100 rounded text-[10px] text-slate-600 leading-tight\">\r\n <Info size={14} className=\"shrink-0 text-blue-400\" />\r\n <span>\n {i18next.language === 'ja'\n ? '背景・色・フォントなどのスタイルのみ保存されます。文字や画像は含まれません。'\n : 'Saves background, colors, fonts, and layout. Text and images are excluded.'}\n </span>\n </div>\r\n {myPresets.length === 0 ? (\r\n <div className=\"text-xs text-slate-400 text-center py-4 bg-slate-50 rounded-lg border border-dashed border-slate-200\">\r\n {t('app.templates.empty').split('\\n').map((line) => (<div key={line}>{line}</div>))}\r\n </div>\r\n ) : (\r\n <div className=\"space-y-2\">\r\n {myPresets.map(p => (\r\n <div key={p.id} className=\"flex items-center justify-between p-2 bg-white border border-slate-200 rounded-lg hover:border-blue-300 transition-colors group\">\r\n <span onClick={() => applyPreset(p)} className=\"text-xs font-medium text-slate-700 cursor-pointer flex-1 truncate\">{p.name}</span>\r\n <button onClick={() => deleteUserPreset(p.id)} className=\"text-slate-300 hover:text-red-500 p-1 opacity-0 group-hover:opacity-100 transition-opacity\"><Trash2 size={12}/></button>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n {!isPro && <div className=\"text-[10px] text-amber-600 bg-amber-50 p-2 rounded border border-amber-100 flex items-center gap-2\"><Lock size={10}/> {t('app.templates.proRequired')}</div>}\r\n </section>\r\n </>\r\n )}\r\n\r\n {activeTab === 'data' && (\r\n <>\r\n <section className=\"space-y-5\">\r\n <div className=\"space-y-2\">\r\n <h3 className=\"font-bold text-xs uppercase tracking-wider text-slate-400\">{t('app.data.title')}</h3>\r\n <div className=\"flex items-center gap-2 p-3 bg-blue-50/50 border border-blue-100 rounded-lg text-xs text-slate-600\">\n <Lock size={14} className=\"text-blue-500 shrink-0\" />\n <span className=\"font-medium\">{t('app.data.privacy')}</span>\n </div>\n </div>\n\n <div className=\"bg-white p-4 rounded-xl border border-slate-200 shadow-sm space-y-3 relative overflow-hidden\">\n <div className=\"absolute top-0 right-0 w-16 h-16 bg-gradient-to-br from-slate-100 to-transparent rounded-bl-full opacity-50 pointer-events-none\" />\n <div className=\"flex items-start justify-between relative z-10\">\n <div className=\"flex items-center gap-3\">\n <div className=\"p-2.5 bg-slate-100 text-slate-600 rounded-lg\">\n <Sparkles size={20} />\n </div>\n <div className=\"space-y-0.5\">\n <h4 className=\"text-sm font-bold text-slate-800\">{t('app.data.sampleTitle')}</h4>\n <p className=\"text-[10px] text-slate-500 leading-relaxed\">{t('app.data.sampleDesc')}</p>\n </div>\n </div>\n </div>\n\n <button\n type=\"button\"\n onClick={loadSampleProject}\n className=\"w-full flex items-center justify-center gap-2 py-2.5 bg-white border border-slate-300 rounded-lg text-xs font-bold text-slate-700 hover:bg-slate-50 transition-all shadow-sm active:scale-[0.98]\"\n >\n <Sparkles size={14} />\n <span>{t('app.data.sampleLoad')}</span>\n </button>\n </div>\n\n <div className=\"bg-white p-4 rounded-xl border border-slate-200 shadow-sm space-y-3\">\n <div className=\"flex items-start gap-3\">\n <div className=\"p-2 bg-slate-100 text-blue-600 rounded-lg border border-slate-200\">\n <Terminal size={18} />\n </div>\n <div className=\"space-y-1\">\n <h4 className=\"text-sm font-bold text-slate-800\">{t('app.data.cliTitle')}</h4>\n <p className=\"text-[10px] text-slate-500 leading-relaxed\">{t('app.data.cliDesc')}</p>\n </div>\n </div>\n <div className=\"rounded-lg border border-slate-200 bg-slate-950 p-3\">\n <pre className=\"text-[10px] text-slate-200 whitespace-pre-wrap\">{cliQuickstart}</pre>\n </div>\n <div className=\"flex flex-col gap-2\">\n <CopyButton\n value={cliQuickstart}\n className=\"inline-flex items-center justify-center gap-2 px-3 py-2 rounded-lg border border-slate-900 bg-slate-900 text-white hover:bg-slate-800 transition text-[11px] font-semibold\"\n >\n {({ copyLabel }) => (\n <>\n <ClipboardCopy size={12} />\n {copyLabel || copyButtonLabel}\n </>\n )}\n </CopyButton>\n <a\n href=\"/tools/agent-cli/\"\n className=\"inline-flex items-center justify-center gap-2 px-3 py-2 rounded-lg border border-slate-200 bg-white text-slate-700 hover:bg-slate-50 transition text-[11px] font-semibold\"\n >\n {t('app.data.cliLink')} <ArrowRight size={14} />\n </a>\n </div>\n </div>\n\n <div className=\"bg-white p-4 rounded-xl border border-slate-200 shadow-sm space-y-4 relative overflow-hidden\">\n <div className=\"absolute top-0 right-0 w-16 h-16 bg-gradient-to-br from-slate-100 to-transparent rounded-bl-full opacity-50 pointer-events-none\" />\n\n <div className=\"flex items-start justify-between relative z-10\">\n <div className=\"flex items-center gap-3\">\r\n <div className=\"p-2.5 bg-slate-100 text-slate-600 rounded-lg\">\r\n <HardDrive size={20} />\r\n </div>\r\n <div>\r\n <h4 className=\"text-sm font-bold text-slate-800\">{t('app.data.browserTitle')}</h4>\r\n <div className=\"flex items-center gap-2 mt-1\">\r\n <span className=\"text-[10px] font-medium px-1.5 py-0.5 bg-slate-100 text-slate-500 rounded border border-slate-200\">\r\n {t('app.data.limitInfo')}\r\n </span>\r\n <span className={`text-[10px] tabular-nums font-medium ${storageUsage.percent > 80 ? 'text-rose-500' : 'text-slate-400'}`}>\r\n {t('app.data.usageInfo', { used: storageUsage.used })}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {storageUsage.percent > 80 && (\r\n <div className=\"flex items-start gap-2 p-2 bg-rose-50 border border-rose-100 rounded text-[10px] text-rose-700 animate-in fade-in\">\r\n <AlertTriangle size={12} className=\"shrink-0 mt-0.5\" />\r\n <span>{t('app.data.quotaWarning')}</span>\r\n </div>\r\n )}\r\n\r\n <div className=\"flex flex-col gap-3\">\r\n <button\r\n onClick={() => saveProject(false)}\r\n className=\"w-full flex items-center justify-between px-4 py-3 bg-slate-800 text-white rounded-lg hover:bg-slate-700 transition-all shadow-sm active:scale-[0.98] group\"\r\n >\r\n <div className=\"flex items-center gap-3\">\r\n <Save size={18} />\r\n <div className=\"text-left\">\r\n <span className=\"block text-sm font-bold\">{t('app.data.overwrite')}</span>\r\n <span className=\"block text-[10px] opacity-70 font-medium\">{t('app.data.overwriteDesc')}</span>\r\n </div>\r\n </div>\r\n <ArrowRight size={16} className=\"opacity-50 group-hover:opacity-100 group-hover:translate-x-1 transition-all\" />\r\n </button>\r\n\r\n <div className=\"grid grid-cols-2 gap-2\">\r\n <button\r\n onClick={() => {\r\n setConfirmDialog({\r\n message: t('app.data.loadConfirm'),\r\n onConfirm: () => { setConfirmDialog(null); loadProject(); },\r\n onCancel: () => setConfirmDialog(null),\r\n });\r\n }}\r\n className=\"flex items-center justify-center gap-2 py-2 bg-white border border-slate-200 text-slate-600 rounded-lg hover:bg-slate-50 hover:text-slate-800 transition-colors\"\r\n >\r\n <RotateCw size={14} />\n <span className=\"text-xs font-bold\">{t('app.data.restore')}</span>\r\n </button>\r\n <button\r\n onClick={() => saveProject(true)}\r\n className=\"flex items-center justify-center gap-2 py-2 bg-white border border-slate-200 text-slate-400 rounded-lg hover:bg-slate-50 hover:text-slate-600 transition-colors\"\r\n title={t('app.data.saveSettingsOnly')}\r\n >\r\n <Settings size={14} />\r\n <span className=\"text-xs font-medium\">{t('app.data.settingsOnlyShort')}</span>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div className=\"h-0 relative\">\r\n {saveStatus && (\r\n <div className=\"absolute bottom-1 left-0 right-0 text-center\">\r\n <span className=\"inline-flex items-center gap-1.5 px-3 py-1 bg-emerald-100 text-emerald-700 text-[10px] font-bold rounded-full shadow-sm animate-in fade-in slide-in-from-bottom-2\">\r\n <Check size={10} strokeWidth={3} /> {statusMessage}\r\n </span>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n <div className=\"bg-gradient-to-br from-blue-50 to-indigo-50/50 p-4 rounded-xl border border-blue-100 space-y-3\">\r\n <div className=\"flex justify-between items-start\">\r\n <div className=\"flex items-center gap-2\">\r\n <div className=\"p-2 bg-white text-blue-600 rounded-lg shadow-sm border border-blue-100\">\r\n <FileJson size={20} />\r\n </div>\r\n <div>\r\n <h4 className=\"text-sm font-bold text-slate-800\">{t('app.data.fileExportTitle')}</h4>\r\n <span className=\"text-[10px] font-bold text-blue-600 bg-blue-100/50 px-1.5 py-0.5 rounded border border-blue-200/50 block w-fit mt-1\">\r\n {t('app.data.fileExportBadge')}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"space-y-2\">\r\n <p className=\"text-[10px] text-slate-600 leading-relaxed\" dangerouslySetInnerHTML={{ __html: t('app.data.fileExportDesc') }} />\r\n <div className=\"flex gap-2\">\r\n <div className=\"flex -space-x-1\">\r\n <div className=\"w-5 h-5 rounded-full bg-white border border-slate-200 flex items-center justify-center text-slate-500\" title={t('app.data.fileExportTitle')}><ImageIcon size={10} /></div>\r\n <div className=\"w-5 h-5 rounded-full bg-white border border-slate-200 flex items-center justify-center text-slate-500\" title={t('app.data.fileExportTitle')}><FileText size={10} /></div>\r\n <div className=\"w-5 h-5 rounded-full bg-white border border-slate-200 flex items-center justify-center text-slate-500\" title={t('app.data.fileExportTitle')}><Settings size={10} /></div>\r\n </div>\r\n <span className=\"text-[10px] text-slate-400 self-center\">{t('app.data.includeAll')}</span>\r\n </div>\r\n </div>\r\n\r\n <div className=\"grid grid-cols-1 gap-2 mt-2\">\r\n <button\r\n onClick={handleExportJSON}\r\n className=\"w-full flex items-center justify-center gap-2 py-2.5 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-all shadow-sm active:scale-[0.98]\"\r\n >\r\n <DownloadCloud size={16} />\r\n <span className=\"text-xs font-bold\">{t('app.data.export')}</span>\r\n </button>\r\n\r\n <div\r\n className={`relative border border-dashed rounded-lg p-2.5 flex items-center justify-center gap-2 transition-all cursor-pointer ${\r\n isJsonDragging\r\n ? 'border-blue-500 bg-blue-100 text-blue-700 scale-[1.01]'\r\n : 'border-blue-200 text-slate-500 bg-white/50 hover:border-blue-400 hover:text-blue-600 hover:bg-white'\r\n }`}\r\n onClick={() => jsonInputRef.current?.click()}\r\n onDragOver={handleJsonDragOver}\r\n onDragEnter={handleJsonDragEnter}\r\n onDragLeave={handleJsonDragLeave}\r\n onDrop={handleJsonDropWrapper}\r\n >\r\n <UploadCloud size={14} className=\"pointer-events-none\" />\r\n <span className=\"text-xs font-medium pointer-events-none\">{t('app.data.import')}</span>\r\n <input type=\"file\" ref={jsonInputRef} className=\"hidden\" accept=\".json,application/json\" onChange={handleImportJSON} />\r\n </div>\r\n </div>\n </div>\n </section>\n\n {teamSyncEnabled && (\n <TeamSyncPanel token={teamSyncToken} captureTeamSpec={captureTeamSpec} applyTeamSpec={applyTeamSpec} />\n )}\n\n <hr className=\"border-slate-100\" />\n\n <section className=\"space-y-3\">\n <h3 className=\"font-bold text-xs uppercase tracking-wider text-slate-400\">{t('app.importer.title')}</h3>\n <div\n className={`p-4 rounded-xl border space-y-3 relative overflow-hidden transition-all ${\n isCsvDragging\n ? 'border-blue-500 bg-blue-100/80'\r\n : 'bg-slate-50 border-slate-200'\r\n }`}\r\n onDrop={handleCsvDropWrapper}\r\n onDragOver={handleCsvDragOver}\r\n onDragEnter={handleCsvDragEnter}\r\n onDragLeave={handleCsvDragLeave}\r\n >\r\n {!isPro && <div className=\"absolute inset-0 bg-white/60 backdrop-blur-[1px] z-10 flex items-center justify-center pointer-events-none\"><Lock size={24} className=\"text-slate-400\" /></div>}\n <p className=\"text-xs text-slate-500 leading-relaxed\">{t('app.importer.description')}</p>\n <p className=\"text-[10px] text-slate-400\" dangerouslySetInnerHTML={{ __html: t('app.importer.hint') }} />\n\n <div className=\"flex gap-2\">\n <button onClick={() => requirePro(openCsvTemplateDialog)} className=\"flex-1 py-2 bg-white border border-slate-300 rounded-lg text-xs font-medium text-slate-600 hover:bg-slate-50\">{t('app.importer.downloadTemplate')}</button>\n <button onClick={() => requirePro(() => csvInputRef.current.click())} className=\"flex-1 py-2 bg-blue-600 text-white rounded-lg text-xs font-medium hover:bg-blue-700\">{t('app.importer.importCsv')}</button>\n </div>\n <input type=\"file\" ref={csvInputRef} className=\"hidden\" accept=\".csv\" onChange={handleCsvImport} />\n </div>\n </section>\n\n <hr className=\"border-slate-100\" />\n\n <section className=\"space-y-3\">\n <h3 className=\"font-bold text-xs uppercase tracking-wider text-slate-400\">{t('app.screenshotImporter.title')}</h3>\n <div\n className={`p-4 rounded-xl border space-y-3 relative overflow-hidden transition-all ${\n isLocaleScreenshotDragging\n ? 'border-blue-500 bg-blue-100/80'\n : 'bg-slate-50 border-slate-200'\n }`}\n onDragOver={(e) => {\n if (!e?.dataTransfer) return;\n if (!Array.from(e.dataTransfer.types || []).includes('Files')) return;\n e.preventDefault();\n setIsLocaleScreenshotDragging(true);\n }}\n onDragEnter={(e) => {\n if (!e?.dataTransfer) return;\n if (!Array.from(e.dataTransfer.types || []).includes('Files')) return;\n e.preventDefault();\n setIsLocaleScreenshotDragging(true);\n }}\n onDragLeave={(e) => {\n if (!e) return;\n e.preventDefault();\n if (e.currentTarget.contains(e.relatedTarget)) return;\n setIsLocaleScreenshotDragging(false);\n }}\n onDrop={(e) => {\n if (!e?.dataTransfer) return;\n e.preventDefault();\n setIsLocaleScreenshotDragging(false);\n onImportLocaleScreenshots?.(e.dataTransfer.files);\n }}\n >\n <p className=\"text-xs text-slate-500 leading-relaxed\">{t('app.screenshotImporter.description')}</p>\n <p className=\"text-[10px] text-slate-400\" dangerouslySetInnerHTML={{ __html: t('app.screenshotImporter.hint') }} />\n\n <div className=\"flex gap-2\">\n <button\n type=\"button\"\n onClick={() => localeScreenshotZipInputRef.current?.click()}\n className=\"flex-1 py-2 bg-white border border-slate-300 rounded-lg text-xs font-medium text-slate-600 hover:bg-slate-50\"\n >\n {t('app.screenshotImporter.importZip')}\n </button>\n <button\n type=\"button\"\n onClick={() => localeScreenshotFolderInputRef.current?.click()}\n className=\"flex-1 py-2 bg-white border border-slate-300 rounded-lg text-xs font-medium text-slate-600 hover:bg-slate-50\"\n >\n {t('app.screenshotImporter.importFolder')}\n </button>\n <button\n type=\"button\"\n onClick={() => localeScreenshotFilesInputRef.current?.click()}\n className=\"flex-1 py-2 bg-blue-600 text-white rounded-lg text-xs font-medium hover:bg-blue-700\"\n >\n {t('app.screenshotImporter.importFiles')}\n </button>\n </div>\n\n <input\n type=\"file\"\n ref={localeScreenshotZipInputRef}\n className=\"hidden\"\n accept=\".zip,application/zip,application/x-zip-compressed\"\n onChange={(e) => {\n onImportLocaleScreenshots?.(e.target.files);\n if (e?.target) e.target.value = '';\n }}\n />\n <input\n type=\"file\"\n ref={localeScreenshotFolderInputRef}\n className=\"hidden\"\n accept=\"image/*\"\n multiple\n webkitdirectory=\"\"\n onChange={(e) => {\n onImportLocaleScreenshots?.(e.target.files);\n if (e?.target) e.target.value = '';\n }}\n />\n <input\n type=\"file\"\n ref={localeScreenshotFilesInputRef}\n className=\"hidden\"\n accept=\"image/*\"\n multiple\n onChange={(e) => {\n onImportLocaleScreenshots?.(e.target.files);\n if (e?.target) e.target.value = '';\n }}\n />\n </div>\n </section>\n\n <hr className=\"border-slate-100\" />\n\n {viewMode === 'batch' && (\n <section className=\"space-y-3\">\n <div className=\"flex justify-between items-center\">\n <h3 className=\"font-bold text-xs uppercase tracking-wider text-slate-400\">{t('app.batch.title')}</h3>\n <span className=\"text-xs text-blue-600 font-medium\">{t('app.batch.selected', { count: selectedBatchDevices.length })}</span>\n </div>\n <div className=\"space-y-2\">\n <div className=\"text-[10px] font-bold text-slate-400 uppercase tracking-wider\">{t('app.batch.presets.title')}</div>\n <div className=\"flex flex-wrap gap-2\">\n <button\n type=\"button\"\n onClick={() => applyBatchPreset(batchPresets.iosRequired)}\n className=\"px-2.5 py-1.5 rounded-lg border border-slate-200 bg-white text-[11px] font-semibold text-slate-600 hover:border-blue-300 hover:text-blue-700 hover:bg-blue-50 transition-colors\"\n >\n {t('app.batch.presets.iosRequired')}\n </button>\n <button\n type=\"button\"\n onClick={() => applyBatchPreset(batchPresets.playPhone)}\n className=\"px-2.5 py-1.5 rounded-lg border border-slate-200 bg-white text-[11px] font-semibold text-slate-600 hover:border-blue-300 hover:text-blue-700 hover:bg-blue-50 transition-colors\"\n >\n {t('app.batch.presets.playPhone')}\n </button>\n <button\n type=\"button\"\n onClick={() => applyBatchPreset(batchPresets.playTablet)}\n className=\"px-2.5 py-1.5 rounded-lg border border-slate-200 bg-white text-[11px] font-semibold text-slate-600 hover:border-blue-300 hover:text-blue-700 hover:bg-blue-50 transition-colors\"\n >\n {t('app.batch.presets.playTablet')}\n </button>\n <button\n type=\"button\"\n onClick={() => applyBatchPreset(batchPresets.all)}\n className=\"px-2.5 py-1.5 rounded-lg border border-slate-200 bg-white text-[11px] font-semibold text-slate-600 hover:border-blue-300 hover:text-blue-700 hover:bg-blue-50 transition-colors\"\n >\n {t('app.batch.presets.all')}\n </button>\n <button\n type=\"button\"\n onClick={() => applyBatchPreset([])}\n className=\"px-2.5 py-1.5 rounded-lg border border-slate-200 bg-white text-[11px] font-semibold text-slate-500 hover:border-slate-300 hover:text-slate-700 hover:bg-slate-50 transition-colors\"\n >\n {t('app.batch.presets.clear')}\n </button>\n </div>\n </div>\n <div className=\"space-y-2\">\n <div className=\"text-[10px] font-bold text-slate-400 uppercase tracking-wider\">{t('app.batch.structure.title')}</div>\n <div className=\"relative\">\n <select\n value={exportStructureMode}\n onChange={(e) => setExportStructureMode(e.target.value === 'device' ? 'device' : 'locale')}\n className=\"w-full appearance-none bg-slate-50 border border-slate-200 text-slate-700 text-sm rounded-xl px-4 py-2.5 pr-8 focus:outline-none focus:border-blue-500\"\n >\n <option value=\"locale\">{t('app.batch.structure.byLocale')}</option>\n <option value=\"device\">{t('app.batch.structure.byDevice')}</option>\n </select>\n <ChevronDown className=\"absolute right-3 top-1/2 -translate-y-1/2 text-slate-400 pointer-events-none\" size={16} />\n </div>\n </div>\n <DeviceLabelModeToggle />\n <div className=\"relative\">\n <input\n type=\"text\"\n value={deviceSearchQuery}\n onChange={(e) => setDeviceSearchQuery(e.target.value)}\n className=\"w-full bg-slate-50 border border-slate-200 text-slate-700 text-sm rounded-xl px-4 py-2.5 pr-10 focus:outline-none focus:border-blue-500\"\n placeholder={t('app.device.searchPlaceholder')}\n spellCheck={false}\n />\n {deviceSearchQuery && (\n <button\n type=\"button\"\n onClick={() => setDeviceSearchQuery('')}\n className=\"absolute right-2.5 top-1/2 -translate-y-1/2 text-slate-400 hover:text-slate-600 p-1\"\n aria-label=\"Clear search\"\n >\n <X size={14} />\n </button>\n )}\n </div>\n <div className=\"space-y-4 max-h-[200px] overflow-y-auto pr-2 scrollbar-thin border border-slate-100 rounded-lg p-2\">\n {Object.entries(filteredDeviceGroups).map(([group, ids]) => {\n const groupLabel = deviceGroupLabels[group] || group;\n return (\n <div key={group} className=\"space-y-2\">\n <div className=\"text-xs font-semibold text-slate-900 bg-slate-50 p-1 px-2 rounded\">{groupLabel}</div>\n {ids.map((id) => {\n const parts = getDeviceLabelParts(DEVICE_LIBRARY[id], { id, mode: deviceLabelMode });\n return (\n <label\n key={id}\n className=\"flex items-center gap-3 p-2 rounded-lg hover:bg-slate-50 cursor-pointer transition-colors border border-transparent hover:border-slate-100\"\n onClick={() => toggleBatchDevice(id)}\n title={\n deviceLabelMode === DEVICE_LABEL_MODES.detailed\n ? parts.optionLabel\n : [parts.optionLabel, parts.dimensions].filter(Boolean).join(' - ')\n }\n >\n <div className={`w-4 h-4 rounded border flex items-center justify-center transition-colors ${selectedBatchDevices.includes(id) ? 'bg-blue-500 border-blue-500' : 'border-slate-300 bg-white'}`}>\n {selectedBatchDevices.includes(id) && <Check size={12} className=\"text-white\" />}\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-xs text-slate-700 font-medium truncate\">{parts.primary}</div>\n {parts.secondary && <div className=\"text-[10px] text-slate-400 truncate\">{parts.secondary}</div>}\n </div>\n </label>\n );\n })}\n </div>\n );\n })}\n </div>\n </section>\n )}\n </>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default ControlsPanel;\r\r\n\r\r\n","import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Loader2, X } from 'lucide-react';\n\nconst ProgressOverlay = ({ show, current, total, label, onCancel }) => {\n const { t } = useTranslation();\n if (!show) return null;\n const percent = total > 0 ? Math.round((current / total) * 100) : 0;\n const resolvedLabel = label || t('app.progress.generating');\n return (\n <div className=\"fixed inset-0 z-[100] bg-black/50 backdrop-blur-sm flex items-center justify-center\">\n <div className=\"bg-white p-8 rounded-2xl shadow-2xl flex flex-col items-center w-80\">\n <Loader2 size={48} className=\"text-blue-600 animate-spin mb-4\" />\n <h3 className=\"text-lg font-bold text-slate-800 mb-2\">{resolvedLabel}</h3>\n <div className=\"w-full bg-slate-100 rounded-full h-2 mb-2 overflow-hidden\">\n <div className=\"bg-blue-600 h-full transition-all duration-300\" style={{ width: `${percent}%` }}></div>\n </div>\n <p className=\"text-sm text-slate-500\">{t('app.progress.images', { current, total })}</p>\n {onCancel && (\n <button\n type=\"button\"\n onClick={onCancel}\n className=\"mt-4 inline-flex items-center gap-2 px-4 py-2 text-sm font-semibold text-slate-700 rounded-lg border border-slate-200 hover:bg-slate-50 transition\"\n >\n <X size={16} />\n {t('common.cancel', { defaultValue: 'Cancel' })}\n </button>\n )}\n </div>\n </div>\n );\n};\n\nexport default ProgressOverlay;\n","import React, { useState, useCallback } from 'react';\nimport { Plus, X, Image as ImageIcon } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\n\nconst Storyboard = ({\n slides,\n activeSlideIndex,\n setActiveSlideIndex,\n currentLocaleId,\n addSlide,\n removeSlide,\n onApplyFileToSlide,\n onOpenFilePickerForSlide,\n validateImageFile,\n onAddSlidesFromFiles,\n}) => {\n const { t } = useTranslation();\n const [isDraggingFile, setIsDraggingFile] = useState(false);\n const [dragOverIndex, setDragOverIndex] = useState(null);\n\n const handleDragOver = useCallback((e) => {\n if (!e?.dataTransfer) return;\n if (!Array.from(e.dataTransfer.types || []).includes('Files')) return;\n e.preventDefault();\n setIsDraggingFile(true);\n }, []);\n\n const handleDragLeave = useCallback((e) => {\n if (!e) return;\n e.preventDefault();\n if (e.currentTarget.contains(e.relatedTarget)) return;\n setIsDraggingFile(false);\n setDragOverIndex(null);\n }, []);\n\n const handleDropOnCard = useCallback((e, index) => {\n if (!e?.dataTransfer) return;\n e.preventDefault();\n e.stopPropagation();\n setIsDraggingFile(false);\n setDragOverIndex(null);\n setActiveSlideIndex(index);\n const files = Array.from(e.dataTransfer.files || []).filter((file) => file.type.startsWith('image/'));\n if (!files.length || !onApplyFileToSlide) return;\n const file = files[0]; // スライド置換は先頭だけ適用\n if (validateImageFile && !validateImageFile(file)) return;\n onApplyFileToSlide(file, index);\n }, [onApplyFileToSlide, setActiveSlideIndex, validateImageFile]);\n\n const handleDropOnAdder = useCallback((e) => {\n if (!e?.dataTransfer) return;\n e.preventDefault();\n setIsDraggingFile(false);\n setDragOverIndex(null);\n const files = Array.from(e.dataTransfer.files || []).filter((file) => file.type.startsWith('image/'));\n if (!files.length) return;\n if (onAddSlidesFromFiles) {\n onAddSlidesFromFiles(files);\n return;\n }\n files.forEach((file) => {\n if (validateImageFile && !validateImageFile(file)) return;\n const reader = new FileReader();\n reader.onload = (ev) => addSlide({ screenshot: ev.target?.result || null });\n reader.readAsDataURL(file);\n });\n }, [addSlide, onAddSlidesFromFiles, validateImageFile]);\n\n const openFilePickerForSlide = (index) => {\n setActiveSlideIndex(index);\n if (typeof onOpenFilePickerForSlide === 'function') {\n onOpenFilePickerForSlide(index);\n }\n };\n\n return (\n <div className=\"w-full flex justify-center absolute bottom-0 left-0 right-0 z-20 pointer-events-none\">\n <div\n className={`w-full max-w-[1200px] bg-white border-t border-slate-200 flex items-center px-6 gap-4 shadow-[0_-8px_20px_-12px_rgba(0,0,0,0.25)] overflow-x-auto py-4 rounded-t-xl pointer-events-auto transition-colors ${isDraggingFile ? 'bg-blue-50 ring-2 ring-blue-400 border-blue-300' : ''}`}\n onDragOver={handleDragOver}\n onDrop={handleDropOnAdder}\n >\n {isDraggingFile && (\n <div className=\"text-[11px] font-semibold text-blue-700 mr-2 whitespace-nowrap\">\n {t('app.storyboard.dropToAddSlides')}\n </div>\n )}\n {slides.map((slide, index) => {\n const effectiveScreenshot = slide?.screenshotsByLocale?.[currentLocaleId] || slide?.screenshot || null;\n const overrideCount = Object.keys(slide?.screenshotsByLocale || {}).length;\n\n return (\n <div\n key={slide.id}\n onClick={() => setActiveSlideIndex(index)}\n onDoubleClick={() => openFilePickerForSlide(index)}\n onKeyDown={(e) => {\n if (e.target !== e.currentTarget) return;\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n setActiveSlideIndex(index);\n }\n }}\n onDragOver={(e) => {\n handleDragOver(e);\n e.stopPropagation();\n }}\n onDragLeave={(e) => {\n handleDragLeave(e);\n e.stopPropagation();\n setDragOverIndex(null);\n }}\n onDragEnter={(e) => {\n handleDragOver(e);\n e.stopPropagation();\n setDragOverIndex(index);\n }}\n onDrop={(e) => handleDropOnCard(e, index)}\n role=\"button\"\n tabIndex={0}\n aria-pressed={index === activeSlideIndex}\n className={`relative w-20 h-24 rounded-lg border-2 cursor-pointer transition-all flex flex-col items-center justify-center bg-slate-50 hover:bg-slate-100 ${\n index === activeSlideIndex ? 'border-blue-500 ring-2 ring-blue-200' : 'border-slate-200'\n } ${dragOverIndex === index ? 'border-blue-400 bg-blue-50' : ''}`}\n >\n <span className=\"absolute top-1 left-2 text-[10px] font-bold text-slate-400\">#{index + 1}</span>\n {overrideCount > 0 && (\n <span\n className=\"absolute bottom-1 left-1 px-1.5 py-0.5 rounded-full bg-blue-600 text-white text-[9px] font-bold shadow-sm\"\n title={t('app.storyboard.localeOverrides', { count: overrideCount })}\n >\n {overrideCount}\n </span>\n )}\n {effectiveScreenshot ? (\n <img\n src={effectiveScreenshot}\n alt=\"\"\n className=\"w-12 h-16 object-cover rounded shadow-sm border border-slate-200\"\n />\n ) : (\n <div className=\"w-12 h-16 bg-slate-200 rounded flex items-center justify-center\">\n <ImageIcon size={16} className=\"text-slate-400\" />\n </div>\n )}\n {slides.length > 1 && (\n <button\n type=\"button\"\n onClick={(e) => removeSlide(index, e)}\n className=\"absolute -top-2 -right-2 bg-red-500 text-white rounded-full p-0.5 shadow-sm hover:scale-110 transition-transform\"\n aria-label={t('common.remove', { defaultValue: 'Remove' })}\n >\n <X size={10} />\n </button>\n )}\n </div>\n );\n })}\n <button\n onClick={() => addSlide()}\n onDragOver={handleDragOver}\n onDrop={handleDropOnAdder}\n className=\"w-20 h-24 rounded-lg border-2 border-dashed border-slate-300 flex flex-col items-center justify-center text-slate-400 hover:text-blue-500 hover:border-blue-400 hover:bg-blue-50 transition-all\"\n >\n <Plus size={24} />\n <span className=\"text-xs font-medium mt-1\">{t('app.storyboard.addSlide')}</span>\n </button>\n </div>\n </div>\n );\n};\n\nexport default Storyboard;\n","import React, { useState, useRef, useEffect, useCallback, useMemo } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Upload, Download, Smartphone, Tablet, Watch, X, Loader2, RotateCw, RotateCcw, Type, ZoomIn, Palette, Check, ChevronDown, ArrowUpFromLine, LayoutTemplate, Grid, Monitor, Image as ImageIcon, Layers, AlignVerticalSpaceAround, AlignEndHorizontal, Play, Globe, Plus, Trash2, FileText, FileSpreadsheet, Copy, Layout, Settings, Box, Sparkles, Edit3, PaintBucket, Database, Lock, Aperture, Droplet, Hexagon, Bookmark, Share2, ArrowRightLeft, Star, Award, DownloadCloud, Crown, CreditCard, LogOut, HardDrive, FileJson, UploadCloud, Save, ArrowRight, AlertTriangle, Info } from 'lucide-react';\nimport UserMenu from './components/UserMenu';\nimport MockupCanvas from './components/MockupCanvas';\nimport UpgradeModal from './components/UpgradeModal';\nimport CiQuickstartModal from './components/CiQuickstartModal';\nimport { DEVICE_LIBRARY, DEVICE_GROUPS, FRAME_COLORS } from './constants/devices';\nimport useAuth from './hooks/useAuth';\nimport { createCheckout } from './lib/stripeClient';\nimport { getCurrentUserProfile, createPortalSession } from './lib/apiClient';\nimport usePageTitle from './hooks/usePageTitle';\nimport useModalA11y from './hooks/useModalA11y';\nimport StagingBadge from './components/StagingBadge';\nimport LanguageSwitcher from './components/LanguageSwitcher';\nimport { calculateLayoutStyles } from './lib/layoutUtils';\nimport { DEVICE_LABEL_MODES, getDeviceLabelParts } from './lib/deviceLabels';\nimport { useToast } from './context/ToastContext';\nimport useAssetExport from './hooks/useAssetExport';\nimport { trackEvent } from './lib/analytics';\nimport { isTeamSyncEnabled } from './lib/env';\nimport { FIVE_PANEL_SAMPLE_PROJECT } from './lib/sampleProjects';\nimport { copyTextToClipboard } from './lib/clipboard';\nimport Papa from 'papaparse';\nimport ControlsPanel from './components/editor/ControlsPanel';\nimport ProgressOverlay from './components/ProgressOverlay';\nimport Storyboard from './components/editor/Storyboard';\n\n// 透かしをCanvasに焼き込むヘルパー(コンポーネント外に定義して再生成を防ぐ)\nconst drawWatermark = (canvas, text = 'ShipScreens Free') => {\n const ctx = canvas?.getContext?.('2d');\r\n if (!ctx) return;\r\n const w = canvas.width;\r\n const h = canvas.height;\r\n const size = Math.max(w, h) * 0.05;\r\n ctx.save();\r\n ctx.globalAlpha = 0.25;\r\n ctx.fillStyle = '#808080';\r\n ctx.font = `bold ${size}px sans-serif`;\r\n ctx.textAlign = 'center';\r\n ctx.textBaseline = 'middle';\r\n ctx.translate(w / 2, h / 2);\r\n ctx.rotate(-Math.PI / 4);\r\n const diag = Math.sqrt(w * w + h * h);\r\n const step = size * 6;\r\n for (let y = -diag; y <= diag; y += step) {\r\n for (let x = -diag; x <= diag; x += step) {\r\n ctx.fillText(text, x, y);\r\n }\r\n }\r\n ctx.restore();\n};\n\nconst UPSELL_WATERMARK_TOAST_STORAGE_KEY = 'shipScreensUpsellWatermarkToastLastShownAt';\nconst SAMPLE_WELCOME_PROMPT_STORAGE_KEY = 'shipscreensSampleWelcomePromptShownV1';\n\n// --- MAIN APP COMPONENT ---\nconst App = () => {\n const { t, i18n } = useTranslation();\n const { addToast } = useToast();\n usePageTitle('titles.editor');\n const teamSyncEnabled = isTeamSyncEnabled();\n const [viewMode, setViewMode] = useState('single'); \n const isCliMode = typeof window !== 'undefined' && window.__SHIPSCREENS_CLI === true;\n useEffect(() => {\n if (isCliMode) setViewMode('batch');\n }, [isCliMode]);\n const [activeTab, setActiveTab] = useState('edit'); \n const [deviceLabelMode, setDeviceLabelMode] = useState(() => {\n if (typeof window === 'undefined') return DEVICE_LABEL_MODES.store;\n const saved = localStorage.getItem('shipScreensDeviceLabelMode');\n return saved === DEVICE_LABEL_MODES.detailed ? DEVICE_LABEL_MODES.detailed : DEVICE_LABEL_MODES.store;\n });\n const [exportStructureMode, setExportStructureMode] = useState(() => {\n if (typeof window === 'undefined') return 'locale';\n const saved = localStorage.getItem('shipScreensExportStructureMode');\n return saved === 'device' ? 'device' : 'locale';\n });\n \n // 課金状態(デフォルトは非Pro)\n const [isPro, setIsPro] = useState(false); \n const [showUpgradeModal, setShowUpgradeModal] = useState(false);\n const [showCiQuickstartModal, setShowCiQuickstartModal] = useState(false);\n const upgradeModalSourceRef = useRef(null);\n const hadUpgradeParamRef = useRef(false);\n const [hasStripeCustomer, setHasStripeCustomer] = useState(false);\n const [subscriptionStatus, setSubscriptionStatus] = useState(null);\n const { user, isAuthenticated, isLoading: authLoading, signIn, signUp, signOut } = useAuth();\n const cliAuthToken =\n isCliMode && typeof window !== 'undefined' ? window.__SHIPSCREENS_CLI_AUTH?.token || null : null;\n const effectiveToken = user?.token || cliAuthToken;\n const isEffectiveAuthenticated = Boolean(effectiveToken);\n const [checkoutStatus, setCheckoutStatus] = useState('');\n const [checkoutAttempts, setCheckoutAttempts] = useState(0);\r\n const [sessionExpired, setSessionExpired] = useState(false);\r\n const [pan, setPan] = useState({ x: 0, y: 0 });\r\n const [isPanning, setIsPanning] = useState(false);\r\n const panStartRef = useRef({ x: 0, y: 0 });\r\n\r\n const isPastDue = subscriptionStatus === 'past_due' || subscriptionStatus === 'unpaid';\r\n\r\n const [selectedBatchDevices, setSelectedBatchDevices] = useState(['iphone69', 'iphone65', 'iphone55', 'pixel8', 'ipad13']);\r\n const toggleBatchDevice = useCallback((id) => {\r\n setSelectedBatchDevices((prev) =>\r\n prev.includes(id) ? prev.filter((d) => d !== id) : [...prev, id]\r\n );\r\n }, []);\r\n\r\n // --- STATE (All visual props) ---\r\n const [bgType, setBgType] = useState('solid'); \r\n const [bgColor, setBgColor] = useState('#ffffff');\r\n const [bgImage, setBgImage] = useState(null);\r\n const [bgBlur, setBgBlur] = useState(0);\r\n const [bgOpacity, setBgOpacity] = useState(0);\n const [gradientStart, setGradientStart] = useState('#e0c3fc');\n const [gradientEnd, setGradientEnd] = useState('#8ec5fc');\n const [gradientAngle, setGradientAngle] = useState(135);\n \n const [deviceScale, setDeviceScale] = useState(1.0); \n const [previewZoom, setPreviewZoom] = useState(0.25); \n const [orientation, setOrientation] = useState('portrait'); \n const [deviceId, setDeviceId] = useState('iphone69'); \n const [frameColor, setFrameColor] = useState('black');\n const [topSpacing, setTopSpacing] = useState(8); \n const [layoutMode, setLayoutMode] = useState('top'); \n\r\n const [badgeType, setBadgeType] = useState('none'); \r\n const [logoImage, setLogoImage] = useState(null);\n const [textColor, setTextColor] = useState('#1e293b');\n const [headerSize, setHeaderSize] = useState(96); \n const [subHeaderSize, setSubHeaderSize] = useState(48);\n // デバイス種別ごとに最後に使用したテキストサイズと余白を記憶(バッチ時の混在サイズ崩れを防ぐ)\n const [lastWatchHeaderSize, setLastWatchHeaderSize] = useState(40);\n const [lastWatchSubHeaderSize, setLastWatchSubHeaderSize] = useState(24);\n const [lastWatchTopSpacing, setLastWatchTopSpacing] = useState(5);\n const [lastNonWatchHeaderSize, setLastNonWatchHeaderSize] = useState(96);\n const [lastNonWatchSubHeaderSize, setLastNonWatchSubHeaderSize] = useState(48);\n const [lastNonWatchTopSpacing, setLastNonWatchTopSpacing] = useState(8);\n const [selectedFont, setSelectedFont] = useState('Inter');\n\n // --- Color History State ---\n const [recentColors, setRecentColors] = useState(() => {\n if (typeof window !== 'undefined') {\n const saved = localStorage.getItem('shipScreensRecentColors');\n return saved ? JSON.parse(saved) : [];\n }\n return [];\n });\n\n useEffect(() => {\n localStorage.setItem('shipScreensRecentColors', JSON.stringify(recentColors));\n }, [recentColors]);\n\n useEffect(() => {\n localStorage.setItem('shipScreensDeviceLabelMode', deviceLabelMode);\n }, [deviceLabelMode]);\n\n useEffect(() => {\n localStorage.setItem('shipScreensExportStructureMode', exportStructureMode);\n }, [exportStructureMode]);\n\n const trackProjectCreated = useCallback((source, extra = {}) => {\n if (hasTrackedProjectCreatedRef.current) return;\n hasTrackedProjectCreatedRef.current = true;\n trackEvent('project_created', { source, ...extra });\n }, []);\n\n const trackBaseScreenshotUpload = useCallback(\n (payload = {}) => {\n if (hasTrackedBaseScreenshotUploadedRef.current) return;\n hasTrackedBaseScreenshotUploadedRef.current = true;\n trackProjectCreated('screenshot_upload');\n trackEvent('base_screenshots_uploaded', payload);\n },\n [trackProjectCreated]\n );\n\n const addRecentColor = useCallback((color) => {\n if (!color) return;\n setRecentColors((prev) => {\n const next = [color, ...prev.filter((c) => c !== color)].slice(0, 10);\n return next;\n });\n }, []);\n\n const handleDeviceChange = (newDeviceId) => {\n setDeviceId(newDeviceId);\n const newDevice = DEVICE_LIBRARY[newDeviceId];\n if (newDevice?.type === 'watch') {\n setHeaderSize(lastWatchHeaderSize);\n setSubHeaderSize(lastWatchSubHeaderSize);\n setTopSpacing(lastWatchTopSpacing);\n } else if (DEVICE_LIBRARY[deviceId]?.type === 'watch') {\n setHeaderSize(lastNonWatchHeaderSize);\n setSubHeaderSize(lastNonWatchSubHeaderSize);\n setTopSpacing(lastNonWatchTopSpacing);\n }\n };\n\r\n // --- SLIDE & LOCALIZATION ---\r\n const LANGUAGE_OPTIONS = [\r\n { id: 'en-US', name: 'English (US)', flag: '🇺🇸', defaults: { header: 'New App', sub: 'Available Now' } },\r\n { id: 'ja-JP', name: '日本語', flag: '🇯🇵', defaults: { header: '新作アプリ', sub: '好評配信中' } },\r\n { id: 'es-ES', name: 'Espanol (Espana)', flag: '🇪🇸', defaults: { header: 'Nueva app', sub: 'Disponible ahora' } },\r\n { id: 'fr-FR', name: 'Francais', flag: '🇫🇷', defaults: { header: 'Nouvelle appli', sub: 'Disponible maintenant' } },\r\n { id: 'de-DE', name: 'Deutsch', flag: '🇩🇪', defaults: { header: 'Neue App', sub: 'Jetzt verfügbar' } },\r\n { id: 'ko-KR', name: '한국어', flag: '🇰🇷', defaults: { header: '새로운 앱', sub: '지금 이용 가능' } },\r\n { id: 'zh-CN', name: '简体中文', flag: '🇨🇳', defaults: { header: '新应用', sub: '现已发布' } },\r\n { id: 'zh-TW', name: '繁體中文', flag: '🇹🇼', defaults: { header: '新應用', sub: '現已發布' } },\r\n { id: 'it-IT', name: 'Italiano', flag: '🇮🇹', defaults: { header: 'Nuova app', sub: 'Disponibile ora' } },\r\n { id: 'pt-BR', name: 'Portugues (Brasil)', flag: '🇧🇷', defaults: { header: 'Novo app', sub: 'Disponível agora' } },\r\n ];\r\n\r\n const [locales, setLocales] = useState([{ id: 'en-US', name: 'English (US)', flag: '🇺🇸' }, { id: 'ja-JP', name: '日本語', flag: '🇯🇵' }]);\r\n const [currentLocaleId, setCurrentLocaleId] = useState('en-US');\r\n const [slides, setSlides] = useState([\n {\n id: 1,\n screenshot: null,\n screenshotsByLocale: {},\n texts: { 'en-US': { header: 'New App', sub: 'Available Now' }, 'ja-JP': { header: '新作アプリ', sub: '好評配信中' } },\n },\n ]);\n const [activeSlideIndex, setActiveSlideIndex] = useState(0);\n const [screenshotUploadScope, setScreenshotUploadScope] = useState('shared'); // shared | locale\n\r\n // --- USER PRESETS ---\r\n const [myPresets, setMyPresets] = useState([]);\r\n\r\n const [saveStatus, setSaveStatus] = useState(''); \r\n const [isDownloading, setIsDownloading] = useState(false);\r\n const [downloadProgress, setDownloadProgress] = useState({ current: 0, total: 0 });\n const [storageUsage, setStorageUsage] = useState({ used: '0.00', percent: 0 });\n const [isPortalLoading, setIsPortalLoading] = useState(false);\n const [history, setHistory] = useState({ past: [], future: [] });\n const [confirmDialog, setConfirmDialog] = useState(null);\n const [presetDialog, setPresetDialog] = useState(null);\n const [csvPreview, setCsvPreview] = useState(null);\n const [csvImportMode, setCsvImportMode] = useState('merge');\n const [isCsvTemplateDialogOpen, setIsCsvTemplateDialogOpen] = useState(false);\n const [csvTemplatePreset, setCsvTemplatePreset] = useState('current');\n const [csvTemplateCustomCount, setCsvTemplateCustomCount] = useState('5');\n const [localeScreenshotImportPreview, setLocaleScreenshotImportPreview] = useState(null);\n const [localeScreenshotImportProgress, setLocaleScreenshotImportProgress] = useState({ current: 0, total: 0 });\n const [isLocaleScreenshotImportApplying, setIsLocaleScreenshotImportApplying] = useState(false);\n const [downloadDetail, setDownloadDetail] = useState('');\n const [isMobile, setIsMobile] = useState(() => (typeof window !== 'undefined' ? window.innerWidth < 768 : false));\n const [isControlsOpen, setIsControlsOpen] = useState(() => (typeof window !== 'undefined' ? window.innerWidth >= 768 : false));\n const [controlsDragOffset, setControlsDragOffset] = useState(0);\n const [isControlsDragging, setIsControlsDragging] = useState(false);\n const [isDragging, setIsDragging] = useState(false);\r\n const [isBgDragging, setIsBgDragging] = useState(false);\r\n const [isLogoDragging, setIsLogoDragging] = useState(false);\n const [isJsonDragging, setIsJsonDragging] = useState(false);\n const [isCsvDragging, setIsCsvDragging] = useState(false);\n const autoSignInAttempted = useRef(false);\n const hasTrackedProjectCreatedRef = useRef(false);\n const hasTrackedBaseScreenshotUploadedRef = useRef(false);\n const hasTrackedMultiLocalePreviewedRef = useRef(false);\n\n const presetDialogPanelRef = useRef(null);\n const presetNameInputRef = useRef(null);\n const csvTemplateDialogPanelRef = useRef(null);\n const csvTemplateDialogFirstRadioRef = useRef(null);\n const csvPreviewDialogPanelRef = useRef(null);\n const csvPreviewCancelButtonRef = useRef(null);\n const localeScreenshotImportDialogPanelRef = useRef(null);\n const localeScreenshotImportCancelButtonRef = useRef(null);\n const confirmDialogPanelRef = useRef(null);\n const confirmDialogCancelButtonRef = useRef(null);\n\n const closePresetDialog = useCallback(() => setPresetDialog(null), []);\n const closeCsvTemplateDialog = useCallback(() => {\n setIsCsvTemplateDialogOpen(false);\n setCsvTemplatePreset('current');\n setCsvTemplateCustomCount(String(Math.max(1, slides.length)));\n }, [slides.length]);\n const closeCsvPreviewDialog = useCallback(() => {\n setCsvPreview(null);\n setCsvImportMode('merge');\n }, []);\n const closeConfirmDialog = useCallback(() => {\n confirmDialog?.onCancel?.();\n setConfirmDialog(null);\n }, [confirmDialog]);\n\n useModalA11y({\n isOpen: Boolean(presetDialog),\n onClose: closePresetDialog,\n panelRef: presetDialogPanelRef,\n initialFocusRef: presetNameInputRef,\n });\n useModalA11y({\n isOpen: isCsvTemplateDialogOpen,\n onClose: closeCsvTemplateDialog,\n panelRef: csvTemplateDialogPanelRef,\n initialFocusRef: csvTemplateDialogFirstRadioRef,\n });\n useModalA11y({\n isOpen: Boolean(csvPreview),\n onClose: closeCsvPreviewDialog,\n panelRef: csvPreviewDialogPanelRef,\n initialFocusRef: csvPreviewCancelButtonRef,\n });\n useModalA11y({\n isOpen: Boolean(confirmDialog),\n onClose: closeConfirmDialog,\n panelRef: confirmDialogPanelRef,\n initialFocusRef: confirmDialogCancelButtonRef,\n });\n\n const fileInputRef = useRef(null);\n const storyboardFileInputRef = useRef(null);\n const storyboardReplaceTargetIndexRef = useRef(null);\n const bgInputRef = useRef(null);\n const logoInputRef = useRef(null);\n const csvInputRef = useRef(null); \n const jsonInputRef = useRef(null);\n const containerRef = useRef(null); \n const canvasWrapperRef = useRef(null);\n const skipHistoryRef = useRef(false);\n const lastSnapshotHashRef = useRef('');\n const historyInitializedRef = useRef(false);\n const controlsTouchStartRef = useRef(0);\n const exportAbortControllerRef = useRef(null);\n const localeScreenshotImportItemsRef = useRef([]);\n const localeScreenshotImportZipRef = useRef(null);\n const { exportSingle, exportBatch, isExporting, exportProgress } = useAssetExport({\n deviceLibrary: DEVICE_LIBRARY,\n bgType,\n bgColor,\n });\n\n useEffect(() => {\n const el = canvasWrapperRef.current;\n if (!el) return;\n\n const onWheel = (e) => {\n if (e.ctrlKey || e.metaKey) {\n e.preventDefault();\n const step = 0.05;\n setPreviewZoom((prev) => {\n const next = e.deltaY < 0 ? prev + step : prev - step;\n return Math.min(1, Math.max(0.05, next));\n });\n }\n };\n\n el.addEventListener('wheel', onWheel, { passive: false });\n return () => {\n el.removeEventListener('wheel', onWheel);\n };\n }, []);\n\r\n // --- HELPERS ---\r\n const activeSlide = slides[activeSlideIndex];\n const currentLocaleName = locales.find(l => l.id === currentLocaleId)?.name || currentLocaleId;\n const currentHeaderText = activeSlide.texts[currentLocaleId]?.header || '';\n const currentSubText = activeSlide.texts[currentLocaleId]?.sub || '';\n const currentScreenshot = activeSlide.screenshotsByLocale?.[currentLocaleId] || activeSlide.screenshot;\n const hasCurrentLocaleScreenshotOverride = !!activeSlide.screenshotsByLocale?.[currentLocaleId];\n const currentUploadScreenshot = screenshotUploadScope === 'shared' ? activeSlide.screenshot : currentScreenshot;\n const currentSlideScreenshotsByLocale = activeSlide?.screenshotsByLocale || {};\n const currentSlideLocaleScreenshotOverrideCount = Object.keys(currentSlideScreenshotsByLocale).length;\n const hasAnyLocaleScreenshotOverrides = currentSlideLocaleScreenshotOverrideCount > 0;\n const hasSharedScreenshot = !!activeSlide?.screenshot;\n const currentDeviceDef = DEVICE_LIBRARY[deviceId];\n const isWatchSelected = currentDeviceDef?.type === 'watch';\r\n const effectiveOrientation = isWatchSelected ? 'portrait' : orientation;\r\n const activeOverride = activeSlide.layoutOverride || null;\r\n const overrideActive = !!activeOverride;\r\n const effectiveTopSpacing = activeOverride?.topSpacing ?? topSpacing;\r\n const effectiveDeviceScale = activeOverride?.deviceScale ?? deviceScale;\r\n const effectiveLayoutMode = activeOverride?.layoutMode ?? layoutMode;\n const { canvasWidth = 1200, canvasHeight = 2200 } = useMemo(\n () =>\n calculateLayoutStyles({\n deviceId,\n orientation: effectiveOrientation,\r\n deviceScale: effectiveDeviceScale,\r\n topSpacing: effectiveTopSpacing,\r\n layoutMode: effectiveLayoutMode,\r\n }) || {},\n [deviceId, effectiveOrientation, effectiveDeviceScale, effectiveTopSpacing, effectiveLayoutMode]\n );\n\n useEffect(() => {\n if (isWatchSelected) {\n setLastWatchHeaderSize(headerSize);\n setLastWatchSubHeaderSize(subHeaderSize);\n setLastWatchTopSpacing(topSpacing);\n } else {\n setLastNonWatchHeaderSize(headerSize);\n setLastNonWatchSubHeaderSize(subHeaderSize);\n setLastNonWatchTopSpacing(topSpacing);\n }\n }, [isWatchSelected, headerSize, subHeaderSize, topSpacing]);\n\r\n const fontOptions = [\r\n { name: t('app.fonts.inter'), value: 'Inter', family: \"'Inter', sans-serif\" },\r\n { name: t('app.fonts.roboto'), value: 'Roboto', family: \"'Roboto', sans-serif\" },\r\n { name: t('app.fonts.montserrat'), value: 'Montserrat', family: \"'Montserrat', sans-serif\" },\r\n { name: t('app.fonts.playfair'), value: 'Playfair Display', family: \"'Playfair Display', serif\" },\r\n { name: t('app.fonts.merriweather'), value: 'Merriweather', family: \"'Merriweather', serif\" },\r\n { name: t('app.fonts.system'), value: 'System', family: \"system-ui, -apple-system, sans-serif\" },\r\n ];\r\n const getTemplateFallbackStyle = (template) => {\r\n const settings = template?.settings || {};\r\n if (settings.bgType === 'gradient') {\r\n const angle = typeof settings.gradientAngle === 'number' ? settings.gradientAngle : 135;\r\n return { backgroundImage: `linear-gradient(${angle}deg, ${settings.gradientStart || '#e0c3fc'}, ${settings.gradientEnd || '#8ec5fc'})` };\r\n }\r\n if (settings.bgColor) return { backgroundColor: settings.bgColor };\r\n return { backgroundColor: '#e2e8f0' };\r\n };\r\n\r\n const calculateStorageUsage = useCallback(() => {\n if (typeof localStorage === 'undefined') {\r\n setStorageUsage({ used: '0.00', percent: 0 });\r\n return;\r\n }\r\n\r\n try {\r\n let total = 0;\r\n for (let i = 0; i < localStorage.length; i++) {\r\n const key = localStorage.key(i);\r\n if (!key) continue;\r\n const value = localStorage.getItem(key);\r\n if (value !== null) {\r\n total += (key.length + value.length) * 2;\r\n }\r\n }\r\n const usedMB = total / 1024 / 1024;\r\n const percent = Math.min((total / (5 * 1024 * 1024)) * 100, 100);\r\n setStorageUsage({ used: usedMB.toFixed(2), percent });\r\n } catch (error) {\r\n console.error('Failed to calculate storage usage', error);\r\n setStorageUsage({ used: '0.00', percent: 0 });\r\n }\r\n }, []);\r\n const captureSnapshot = useCallback(() => {\r\n return {\r\n // isPro intentionally omitted to avoid privilege changes on import/load\r\n bgType,\r\n bgColor,\r\n gradientStart,\r\n gradientEnd,\r\n gradientAngle,\r\n bgBlur,\r\n bgOpacity,\r\n deviceScale,\r\n orientation,\r\n deviceId,\r\n topSpacing,\r\n badgeType,\r\n layoutMode,\r\n frameColor,\r\n locales,\r\n currentLocaleId,\r\n activeSlideIndex,\r\n slides,\r\n textColor,\r\n headerSize,\r\n subHeaderSize,\r\n selectedFont,\r\n selectedBatchDevices,\r\n bgImage,\r\n logoImage,\r\n };\r\n }, [\r\n bgType,\r\n bgColor,\r\n gradientStart,\r\n gradientEnd,\r\n gradientAngle,\r\n bgBlur,\r\n bgOpacity,\r\n deviceScale,\r\n orientation,\r\n deviceId,\r\n topSpacing,\r\n badgeType,\r\n layoutMode,\r\n frameColor,\r\n locales,\r\n currentLocaleId,\r\n slides,\r\n textColor,\r\n headerSize,\r\n subHeaderSize,\r\n selectedFont,\r\n selectedBatchDevices,\r\n bgImage,\r\n logoImage,\r\n activeSlideIndex,\r\n ]);\r\n const restoreSnapshot = useCallback((snap) => {\r\n if (!snap) return;\r\n skipHistoryRef.current = true;\r\n setBgType(snap.bgType ?? 'solid');\r\n setBgColor(snap.bgColor ?? '#ffffff');\r\n setGradientStart(snap.gradientStart ?? '#e0c3fc');\r\n setGradientEnd(snap.gradientEnd ?? '#8ec5fc');\r\n setGradientAngle(snap.gradientAngle ?? 135);\r\n setBgBlur(snap.bgBlur ?? 0);\r\n setBgOpacity(snap.bgOpacity ?? 0);\r\n setDeviceScale(snap.deviceScale ?? 1.0);\r\n setPreviewZoom((value) => snap.previewZoom ?? value ?? 0.25);\r\n setOrientation(snap.orientation ?? 'portrait');\r\n setDeviceId(snap.deviceId ?? 'iphone69');\r\n setFrameColor(snap.frameColor ?? 'black');\r\n setTopSpacing(snap.topSpacing ?? 8);\r\n setBadgeType(snap.badgeType ?? 'none');\r\n setLayoutMode(snap.layoutMode ?? 'top');\r\n setLocales(Array.isArray(snap.locales) ? snap.locales : []);\r\n setCurrentLocaleId(snap.currentLocaleId ?? 'en-US');\r\n const newSlides = Array.isArray(snap.slides) ? snap.slides : [];\r\n setSlides(newSlides);\r\n const nextIndex = typeof snap.activeSlideIndex === 'number' ? snap.activeSlideIndex : 0;\r\n setActiveSlideIndex(newSlides.length ? Math.min(Math.max(nextIndex, 0), newSlides.length - 1) : 0);\r\n setTextColor(snap.textColor ?? '#1e293b');\r\n setHeaderSize(snap.headerSize ?? 96);\r\n setSubHeaderSize(snap.subHeaderSize ?? 48);\r\n setSelectedFont(snap.selectedFont ?? 'Inter');\r\n setSelectedBatchDevices(Array.isArray(snap.selectedBatchDevices) ? snap.selectedBatchDevices : []);\r\n setBgImage(snap.bgImage ?? null);\r\n setLogoImage(snap.logoImage ?? null);\r\n }, []);\r\n const undo = useCallback(() => {\r\n setHistory((prev) => {\r\n if (!prev.past.length) return prev;\r\n const past = [...prev.past];\r\n const previous = past.pop();\r\n const future = [captureSnapshot(), ...prev.future].slice(0, 20);\r\n restoreSnapshot(previous);\r\n return { past, future };\r\n });\r\n }, [captureSnapshot, restoreSnapshot]);\r\n\r\n const redo = useCallback(() => {\r\n setHistory((prev) => {\r\n if (!prev.future.length) return prev;\r\n const [next, ...rest] = prev.future;\r\n const past = [...prev.past, captureSnapshot()].slice(-20);\r\n restoreSnapshot(next);\r\n return { past, future: rest };\r\n });\r\n }, [captureSnapshot, restoreSnapshot]);\r\n\r\n // --- EFFECTS ---\r\n useEffect(() => {\r\n const handleResize = () => {\r\n const vh = window.innerHeight;\r\n const mobile = window.innerWidth < 768;\r\n setIsMobile(mobile);\r\n setIsControlsOpen(!mobile);\r\n if (viewMode === 'single') {\r\n if (vh < 800) setPreviewZoom(0.2);\r\n else if (vh < 1000) setPreviewZoom(0.25);\r\n else setPreviewZoom(0.35);\r\n }\r\n };\r\n handleResize();\r\n window.addEventListener('resize', handleResize);\r\n return () => window.removeEventListener('resize', handleResize);\r\n }, [viewMode]);\r\n\r\n useEffect(() => {\r\n if (saveStatus) {\r\n const timer = setTimeout(() => setSaveStatus(''), 2000);\r\n return () => clearTimeout(timer);\r\n }\r\n }, [saveStatus]);\r\n\r\n useEffect(() => {\r\n setIsDownloading(isExporting);\r\n setDownloadProgress(exportProgress);\r\n }, [isExporting, exportProgress]);\r\n\r\n useEffect(() => {\r\n if (viewMode === 'single') {\r\n const target = document.getElementById('single-canvas') || document.querySelector('[data-capture-target=\"true\"]');\r\n if (target) {\r\n containerRef.current = target;\r\n }\r\n }\r\n }, [viewMode]);\r\n\r\n useEffect(() => {\r\n if (activeTab === 'data') {\r\n calculateStorageUsage();\r\n }\r\n }, [activeTab, calculateStorageUsage]);\r\n\r\n useEffect(() => {\r\n if (historyInitializedRef.current) return;\r\n historyInitializedRef.current = true;\r\n const snapshot = captureSnapshot();\r\n const hash = JSON.stringify(snapshot);\r\n lastSnapshotHashRef.current = hash;\r\n }, [captureSnapshot]);\r\n\r\n useEffect(() => {\r\n if (skipHistoryRef.current) {\r\n skipHistoryRef.current = false;\r\n return;\r\n }\r\n const snapshot = captureSnapshot();\r\n const hash = JSON.stringify(snapshot);\r\n if (hash === lastSnapshotHashRef.current) return;\r\n lastSnapshotHashRef.current = hash;\r\n setHistory((prev) => {\r\n const past = [...prev.past, snapshot].slice(-20);\r\n return { past, future: [] };\r\n });\r\n }, [captureSnapshot]);\r\n\r\n useEffect(() => {\r\n const loadedPresets = localStorage.getItem('mockupStudioUserPresets');\r\n if (loadedPresets) {\r\n setMyPresets(JSON.parse(loadedPresets));\r\n }\r\n }, []);\r\n\r\n // 認証済みなら API から購読状態を取得\r\n useEffect(() => {\n const loadProfile = async () => {\n if (!effectiveToken) {\n setIsPro(false);\n setSubscriptionStatus(null);\n setHasStripeCustomer(false);\n return;\n }\n try {\n const profile = await getCurrentUserProfile(effectiveToken);\n if (profile?.isPro !== undefined) {\n setIsPro(!!profile.isPro);\n }\n if (profile?.subscriptionStatus !== undefined) {\n setSubscriptionStatus(profile.subscriptionStatus || null);\n }\n setHasStripeCustomer(!!profile?.stripeCustomerId);\n } catch (err) {\n console.error('Failed to load profile', err);\n setIsPro(false);\n setSubscriptionStatus(null);\n setHasStripeCustomer(false);\n }\n };\n loadProfile();\n }, [effectiveToken]);\n\r\n useEffect(() => {\n const refreshProfileOnFocus = async () => {\n if (!effectiveToken) return;\n try {\n const profile = await getCurrentUserProfile(effectiveToken);\n if (profile?.isPro !== undefined) {\n setIsPro(!!profile.isPro);\n }\n if (profile?.subscriptionStatus !== undefined) {\n setSubscriptionStatus(profile.subscriptionStatus || null);\n }\n if (profile?.stripeCustomerId !== undefined) {\n setHasStripeCustomer(!!profile.stripeCustomerId);\n }\n } catch (err) {\n console.error('Failed to refresh profile on focus', err);\n }\n };\n\n const onFocus = () => { refreshProfileOnFocus(); };\n window.addEventListener('focus', onFocus);\n return () => window.removeEventListener('focus', onFocus);\n }, [effectiveToken]);\n\r\n useEffect(() => {\n if (authLoading || isCliMode) return;\n\n const params = new URLSearchParams(window.location.search);\n const storedSessionId = localStorage.getItem('pendingCheckoutSessionId');\n const sessionId = params.get('session_id') || storedSessionId;\n if (!sessionId || sessionId === 'cli') return;\n const clearSessionParam = () => {\r\n if (params.has('session_id')) {\r\n params.delete('session_id');\r\n const rest = params.toString();\r\n const newUrl = `${window.location.pathname}${rest ? `?${rest}` : ''}${window.location.hash || ''}`;\r\n window.history.replaceState({}, '', newUrl);\r\n }\r\n };\r\n\r\n const startPoll = async (attempt = 1, maxAttempts = 6) => {\r\n if (!isAuthenticated || !user?.token) {\r\n setCheckoutStatus('signin');\r\n localStorage.setItem('pendingCheckoutSessionId', sessionId);\r\n if (!autoSignInAttempted.current) {\r\n autoSignInAttempted.current = true;\r\n signIn();\r\n }\r\n return;\r\n }\r\n localStorage.removeItem('pendingCheckoutSessionId');\r\n setCheckoutStatus('pending');\r\n setCheckoutAttempts(attempt);\r\n try {\r\n const profile = await getCurrentUserProfile(user.token);\r\n if (profile?.isPro) {\r\n setIsPro(true);\r\n if (profile?.subscriptionStatus !== undefined) {\r\n setSubscriptionStatus(profile.subscriptionStatus || null);\r\n }\r\n if (profile?.stripeCustomerId) setHasStripeCustomer(true);\r\n setCheckoutStatus('success');\r\n return;\r\n }\r\n } catch (err) {\r\n console.error('Failed to refresh after checkout', err);\r\n }\r\n if (attempt >= maxAttempts) {\r\n setCheckoutStatus('retry');\r\n return;\r\n }\r\n setTimeout(() => startPoll(attempt + 1, maxAttempts), 1500);\r\n };\r\n\r\n startPoll();\r\n clearSessionParam();\r\n }, [isAuthenticated, user?.token, authLoading, signIn, isCliMode]);\n\r\n useEffect(() => {\n const onUnauthorized = () => {\n setSessionExpired(true);\n if (!isCliMode) {\n signOut();\n }\n setIsPro(false);\n setSubscriptionStatus(null);\n setHasStripeCustomer(false);\n };\n window.addEventListener('auth:unauthorized', onUnauthorized);\n return () => window.removeEventListener('auth:unauthorized', onUnauthorized);\n }, [signOut, isCliMode]);\n\r\n const validateImageFile = (file) => {\n if (!file) return false;\n if (!file.type?.startsWith('image/')) {\n addToast({ type: 'error', message: t('app.alerts.fileType') });\n return false;\n }\r\n if (file.size > 20 * 1024 * 1024) {\r\n addToast({ type: 'error', message: t('app.alerts.fileSize') });\r\n return false;\r\n }\r\n return true;\n };\n\n const readFileAsDataUrl = (file) => new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = (event) => resolve(event.target.result);\n reader.onerror = reject;\n reader.readAsDataURL(file);\n });\n\n // --- SHARE HANDLER ---\n const handleShare = async () => {\n const shareData = {\n bgType, bgColor, gradientStart, gradientEnd, gradientAngle, bgBlur, bgOpacity,\n deviceScale, orientation, deviceId, topSpacing, layoutMode, badgeType, frameColor,\n locales, currentLocaleId,\n slides: slides.map((s) => ({ ...s, screenshot: null, screenshotsByLocale: {} })),\n textColor, headerSize, subHeaderSize, selectedFont, selectedBatchDevices\n };\n try {\r\n const jsonString = JSON.stringify(shareData);\r\n if (jsonString.length > 6000) {\r\n addToast({ type: 'error', message: t('app.alerts.shareTooLarge') });\r\n return;\r\n }\n const base64Data = btoa(encodeURIComponent(jsonString).replace(/%([0-9A-F]{2})/g, (match, p1) => String.fromCharCode('0x' + p1)));\n const url = `${window.location.origin}${window.location.pathname}?project=${base64Data}`;\n\n const result = await copyTextToClipboard(url);\n if (result.ok) {\n setSaveStatus('shared');\n addToast({\n type: 'success',\n message:\n result.method === 'execCommand' ? t('app.share.fallbackSuccess') : t('app.share.copySuccess'),\n });\n } else {\n addToast({ type: 'info', message: t('app.share.manualCopy') });\n }\n } catch (e) {\n console.error(\"Share failed\", e);\n addToast({ type: 'error', message: t('app.alerts.shareTooLarge') });\n }\n };\n\r\n useEffect(() => {\n const params = new URLSearchParams(window.location.search);\n const projectData = params.get('project');\n if (projectData) {\n try {\n const jsonString = decodeURIComponent(atob(projectData).split('').map(c => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)).join(''));\r\n const data = JSON.parse(jsonString);\r\n if(data.bgType) setBgType(data.bgType);\r\n if(data.bgColor) setBgColor(data.bgColor);\r\n if(data.gradientStart) setGradientStart(data.gradientStart);\r\n if(data.gradientEnd) setGradientEnd(data.gradientEnd);\r\n if(data.gradientAngle) setGradientAngle(data.gradientAngle);\r\n if(data.deviceScale) setDeviceScale(data.deviceScale);\r\n if(data.orientation) setOrientation(data.orientation);\r\n if(data.deviceId) setDeviceId(data.deviceId);\r\n if(data.topSpacing) setTopSpacing(data.topSpacing);\r\n if(data.layoutMode) setLayoutMode(data.layoutMode);\r\n if(data.badgeType) setBadgeType(data.badgeType);\r\n if(data.locales) setLocales(data.locales);\r\n if(data.currentLocaleId) setCurrentLocaleId(data.currentLocaleId);\r\n if(data.slides) { setSlides(data.slides); setActiveSlideIndex(0); }\r\n if(data.textColor) setTextColor(data.textColor);\r\n if(data.headerSize) setHeaderSize(data.headerSize);\r\n if(data.subHeaderSize) setSubHeaderSize(data.subHeaderSize);\r\n if(data.selectedFont) setSelectedFont(data.selectedFont);\r\n if(data.selectedBatchDevices) setSelectedBatchDevices(data.selectedBatchDevices);\r\n if(data.frameColor) setFrameColor(data.frameColor);\r\n } catch (e) { console.error(\"Failed to load project from URL\", e); }\n }\n }, []);\n\n useEffect(() => {\n if (typeof window === 'undefined') return;\n const params = new URLSearchParams(window.location.search);\n const raw = (params.get('upgrade') || '').trim().toLowerCase();\n if (!raw) return;\n hadUpgradeParamRef.current = true;\n\n const wantsUpgrade = raw === '1' || raw === 'true' || raw === 'yes' || raw === 'on';\n if (wantsUpgrade && !isPro) {\n upgradeModalSourceRef.current = 'url_param';\n trackEvent('upgrade_modal_opened', {\n source: 'url_param',\n is_pro: isPro,\n is_authenticated: Boolean(isEffectiveAuthenticated),\n });\n setShowUpgradeModal(true);\n }\n\n params.delete('upgrade');\n const rest = params.toString();\n const nextUrl = `${window.location.pathname}${rest ? `?${rest}` : ''}${window.location.hash || ''}`;\n window.history.replaceState(window.history.state, '', nextUrl);\n }, [isEffectiveAuthenticated, isPro]);\n\n // --- HANDLERS ---\n const openUpgradeModal = useCallback(\n (source = 'unknown') => {\n if (showUpgradeModal) return;\n upgradeModalSourceRef.current = source;\n trackEvent('upgrade_modal_opened', {\n source,\n is_pro: isPro,\n is_authenticated: Boolean(isEffectiveAuthenticated),\n });\n setShowUpgradeModal(true);\n },\n [isEffectiveAuthenticated, isPro, showUpgradeModal]\n );\n\n const buildNextPath = () => {\n if (typeof window === 'undefined') return '/app/';\n const next = `${window.location.pathname}${window.location.search}${window.location.hash || ''}`;\n return next.length > 1200 ? '/app/' : next;\n };\n\n const buildNextPathWithUpgrade = () => {\n if (typeof window === 'undefined') return '/app/?upgrade=1';\n try {\n const url = new URL(window.location.href);\n url.searchParams.set('upgrade', '1');\n const next = `${url.pathname}${url.search}${url.hash || ''}`;\n return next.length > 1200 ? '/app/?upgrade=1' : next;\n } catch {\n return '/app/?upgrade=1';\n }\n };\n\n const handleSignIn = async () => {\n window.location.href = `/signin?next=${encodeURIComponent(buildNextPath())}`;\n };\n\n const handleSignUp = async () => {\n window.location.href = `/signup?next=${encodeURIComponent(buildNextPath())}`;\n };\n\r\n const handleSignOut = async () => {\r\n try {\r\n await signOut();\r\n setIsPro(false);\r\n setSubscriptionStatus(null);\r\n setCheckoutStatus('');\r\n } catch (err) {\r\n console.error('Sign out failed', err);\r\n }\r\n };\r\n\r\n const handleUpgrade = async () => {\n const source = upgradeModalSourceRef.current || 'unknown';\n try {\n trackEvent('upgrade_cta_clicked', {\n source,\n is_pro: isPro,\n is_authenticated: Boolean(isEffectiveAuthenticated),\n });\n if (!isEffectiveAuthenticated) {\n saveProject(true);\n trackEvent('upgrade_signin_redirected', { source });\n window.location.href = `/signin?next=${encodeURIComponent(buildNextPathWithUpgrade())}`;\n return;\n }\n // Save current work before redirecting to Stripe to avoid losing edits on return\n saveProject();\n const priceId = import.meta.env.VITE_STRIPE_PRICE_ID;\n if (!priceId) throw new Error(t('app.alerts.priceMissing'));\n const waitForAnalytics = (name, params = {}, timeoutMs = 1200) =>\n new Promise((resolve) => {\n let finished = false;\n const finish = () => {\n if (finished) return;\n finished = true;\n resolve();\n };\n trackEvent(name, { ...params, event_callback: finish, event_timeout: timeoutMs });\n setTimeout(finish, timeoutMs + 150);\n });\n let checkoutStarted = false;\n const startCheckout = async () => {\n if (checkoutStarted) return;\n checkoutStarted = true;\n try {\n await createCheckout({ priceId, email: user?.email, token: effectiveToken });\n } catch (err) {\n console.error(err);\n trackEvent('checkout_failed', { source });\n addToast({ type: 'error', message: t('app.alerts.checkoutFailed') });\n }\n };\n await waitForAnalytics('checkout_started', { source, transport_type: 'beacon' });\n startCheckout();\n setShowUpgradeModal(false);\n } catch (err) {\n console.error(err);\n trackEvent('checkout_failed', { source });\n addToast({ type: 'error', message: t('app.alerts.checkoutFailed') });\n }\n };\n const requirePro = (action) => {\n if (isPro) {\n action();\n return;\n }\n openUpgradeModal('require_pro');\n };\n const retryCheckoutStatus = () => {\r\n setCheckoutStatus('pending');\r\n setCheckoutAttempts(0);\r\n const params = new URLSearchParams(window.location.search);\r\n const hasSession = params.get('session_id');\r\n if (hasSession) {\r\n params.delete('session_id');\r\n const rest = params.toString();\r\n const newUrl = `${window.location.pathname}${rest ? `?${rest}` : ''}${window.location.hash || ''}`;\r\n window.history.replaceState({}, '', newUrl);\r\n }\r\n if (isEffectiveAuthenticated && effectiveToken) {\n // kick off a fresh check\r\n const startPoll = async (attempt = 1, maxAttempts = 6) => {\r\n setCheckoutStatus('pending');\r\n setCheckoutAttempts(attempt);\r\n try {\r\n const profile = await getCurrentUserProfile(effectiveToken);\n if (profile?.isPro) {\r\n setIsPro(true);\r\n setCheckoutStatus('success');\r\n return;\r\n }\r\n } catch (err) {\r\n console.error('Failed to refresh after checkout', err);\r\n }\r\n if (attempt >= maxAttempts) {\r\n setCheckoutStatus('retry');\r\n return;\r\n }\r\n setTimeout(() => startPoll(attempt + 1, maxAttempts), 1500);\r\n };\r\n startPoll();\r\n } else {\r\n setCheckoutStatus('signin');\r\n }\r\n };\r\n const handleManageSubscription = async () => {\r\n try {\r\n if (!isEffectiveAuthenticated || !effectiveToken) {\n addToast({ type: 'error', message: t('app.alerts.signInManage') });\r\n return;\r\n }\r\n setIsPortalLoading(true);\r\n\r\n // Refresh profile to ensure Stripe customer exists\r\n let customerExists = hasStripeCustomer;\r\n try {\r\n const profile = await getCurrentUserProfile(effectiveToken);\n if (profile?.isPro !== undefined) setIsPro(!!profile.isPro);\r\n if (profile?.subscriptionStatus !== undefined) {\r\n setSubscriptionStatus(profile.subscriptionStatus || null);\r\n }\r\n customerExists = !!profile?.stripeCustomerId;\r\n setHasStripeCustomer(customerExists);\r\n } catch (err) {\r\n console.error('Failed to refresh profile before portal', err);\r\n }\r\n\r\n if (!customerExists) {\r\n addToast({ type: 'error', message: t('app.alerts.portalNoCustomer') });\r\n return;\r\n }\r\n\r\n const res = await createPortalSession(effectiveToken);\n if (res?.url) {\r\n window.location.assign(res.url);\r\n } else {\r\n addToast({ type: 'error', message: t('app.alerts.portalUnavailable') });\r\n }\r\n } catch (err) {\r\n console.error(err);\r\n addToast({ type: 'error', message: t('app.alerts.portalFailed') });\r\n } finally {\r\n setIsPortalLoading(false);\r\n }\r\n };\r\n\r\n const addSlide = (initialData = {}) => {\n // React onClick passes SyntheticEvent; ignore it\n if (initialData?.nativeEvent) {\n initialData = {};\n }\n if (slides.length >= 50) {\n addToast({ type: 'error', message: t('app.alerts.slideLimit') });\n return;\n }\n trackProjectCreated('add_slide', { slide_count: slides.length + 1 });\n const newId = slides.length ? Math.max(...slides.map(s => s.id)) + 1 : 1;\n const newTexts = {};\n locales.forEach(l => { newTexts[l.id] = { header: t('app.defaults.newSlideTitle'), sub: t('app.defaults.newSlideDesc') }; });\n const newSlide = {\n screenshot: null,\n screenshotsByLocale: {},\n texts: newTexts,\n ...initialData,\n id: newId,\n };\n setSlides([...slides, newSlide]);\n setActiveSlideIndex(slides.length);\n };\n\n const addSlidesFromFiles = async (files) => {\n if (!files?.length) return;\n const validFiles = files.filter((file) => validateImageFile ? validateImageFile(file) : true);\n if (!validFiles.length) return;\n const totalBytes = validFiles.reduce((sum, file) => sum + (file.size || 0), 0);\n trackBaseScreenshotUpload({\n source: 'bulk_upload',\n file_count: validFiles.length,\n total_bytes: totalBytes,\n scope: 'shared',\n slide_count: Math.min(50, slides.length + validFiles.length),\n });\n const newSlides = [...slides];\n const remainingFiles = [...validFiles];\n\n // まず空スライドがあれば最初のファイルで置換する\n const blankIndex = newSlides.findIndex((s) => !s.screenshot);\n if (blankIndex !== -1 && remainingFiles.length) {\n const file = remainingFiles.shift();\n const dataUrl = await readFileAsDataUrl(file);\n newSlides[blankIndex] = { ...newSlides[blankIndex], screenshot: dataUrl, screenshotsByLocale: newSlides[blankIndex]?.screenshotsByLocale || {} };\n }\n\n let currentMaxId = newSlides.length ? Math.max(...newSlides.map((s) => s.id || 0)) : 0;\n for (const file of remainingFiles) {\n if (newSlides.length >= 50) break;\n const dataUrl = await readFileAsDataUrl(file);\n const newTexts = {};\n locales.forEach((l) => { newTexts[l.id] = { header: t('app.defaults.newSlideTitle'), sub: t('app.defaults.newSlideDesc') }; });\n newSlides.push({\n screenshot: dataUrl,\n screenshotsByLocale: {},\n texts: newTexts,\n id: ++currentMaxId,\n });\n }\n setSlides(newSlides);\n setActiveSlideIndex(newSlides.length - 1);\n };\n\n const removeSlide = (index, e) => {\r\n e.stopPropagation();\r\n if (slides.length > 1) {\r\n const newSlides = slides.filter((_, i) => i !== index);\r\n setSlides(newSlides);\r\n if (activeSlideIndex >= index && activeSlideIndex > 0) {\r\n setActiveSlideIndex(activeSlideIndex - 1);\r\n }\r\n }\r\n };\r\n\r\n const updateSlideText = (key, value) => {\r\n const newSlides = [...slides];\r\n const currentTexts = newSlides[activeSlideIndex].texts;\r\n if (!currentTexts[currentLocaleId]) currentTexts[currentLocaleId] = { header: '', sub: '' };\r\n currentTexts[currentLocaleId][key] = value;\r\n setSlides(newSlides);\r\n };\r\n\r\n const updateSlideScreenshotAt = (index, dataUrl, options = {}) => {\n const newSlides = [...slides];\n if (!newSlides[index]) return;\n const scope = options?.scope ?? screenshotUploadScope;\n const localeId = options?.localeId ?? currentLocaleId;\n\n if (scope === 'locale') {\n const nextScreenshotsByLocale = { ...(newSlides[index].screenshotsByLocale || {}) };\n nextScreenshotsByLocale[localeId] = dataUrl;\n newSlides[index] = { ...newSlides[index], screenshotsByLocale: nextScreenshotsByLocale };\n } else {\n newSlides[index] = { ...newSlides[index], screenshot: dataUrl };\n }\n setSlides(newSlides);\n };\n\n const clearSlideScreenshotAt = (index, options = {}) => {\n const newSlides = [...slides];\n if (!newSlides[index]) return;\n const scope = options?.scope ?? screenshotUploadScope;\n const localeId = options?.localeId ?? currentLocaleId;\n\n if (scope === 'locale') {\n const existing = newSlides[index].screenshotsByLocale || {};\n if (!(localeId in existing)) return;\n const nextScreenshotsByLocale = { ...existing };\n delete nextScreenshotsByLocale[localeId];\n newSlides[index] = { ...newSlides[index], screenshotsByLocale: nextScreenshotsByLocale };\n } else {\n newSlides[index] = { ...newSlides[index], screenshot: null };\n }\n\n setSlides(newSlides);\n };\n\n const clearAllLocaleScreenshotOverridesAt = (index) => {\n const newSlides = [...slides];\n if (!newSlides[index]) return;\n const existing = newSlides[index].screenshotsByLocale || {};\n if (!Object.keys(existing).length) return;\n newSlides[index] = { ...newSlides[index], screenshotsByLocale: {} };\n setSlides(newSlides);\n };\n\n const updateSlideScreenshot = (dataUrl) => {\n updateSlideScreenshotAt(activeSlideIndex, dataUrl);\n };\n\r\n const ensureSlideOverride = () => {\r\n const newSlides = [...slides];\r\n if (!newSlides[activeSlideIndex].layoutOverride) {\r\n newSlides[activeSlideIndex].layoutOverride = {\r\n deviceScale,\r\n topSpacing,\r\n layoutMode,\r\n };\r\n }\r\n setSlides(newSlides);\r\n };\r\n\r\n const updateSlideOverride = (key, value) => {\r\n const newSlides = [...slides];\r\n if (!newSlides[activeSlideIndex].layoutOverride) {\r\n newSlides[activeSlideIndex].layoutOverride = {};\r\n }\r\n newSlides[activeSlideIndex].layoutOverride[key] = value;\r\n setSlides(newSlides);\r\n };\r\n\r\n const clearSlideOverride = () => {\r\n const newSlides = [...slides];\r\n delete newSlides[activeSlideIndex].layoutOverride;\r\n setSlides(newSlides);\r\n };\r\n\r\n const setSlideScreenshotFromFile = (file, targetIndex = activeSlideIndex) => {\n if (!validateImageFile(file)) return;\n const scope = screenshotUploadScope;\n const localeId = currentLocaleId;\n const uploadPayload = {\n source: 'single_upload',\n file_count: 1,\n total_bytes: file.size || 0,\n scope,\n slide_count: slides.length,\n };\n if (scope === 'locale') {\n uploadPayload.locale_id = localeId;\n }\n trackBaseScreenshotUpload(uploadPayload);\n const reader = new FileReader();\n reader.onload = (event) => updateSlideScreenshotAt(targetIndex, event.target.result, { scope, localeId });\n reader.readAsDataURL(file);\n };\n\n const setSlideSharedScreenshotFromFile = (file, targetIndex = activeSlideIndex) => {\n if (!validateImageFile(file)) return;\n trackBaseScreenshotUpload({\n source: 'single_upload',\n file_count: 1,\n total_bytes: file.size || 0,\n scope: 'shared',\n slide_count: slides.length,\n });\n const reader = new FileReader();\n reader.onload = (event) => updateSlideScreenshotAt(targetIndex, event.target.result, { scope: 'shared' });\n reader.readAsDataURL(file);\n };\n\n const handleStoryboardFileChange = (e) => {\n const file = e?.target?.files?.[0];\n const targetIndex =\n typeof storyboardReplaceTargetIndexRef.current === 'number'\n ? storyboardReplaceTargetIndexRef.current\n : activeSlideIndex;\n\n if (file) {\n setSlideSharedScreenshotFromFile(file, targetIndex);\n }\n\n storyboardReplaceTargetIndexRef.current = null;\n if (e?.target) e.target.value = '';\n };\n\n const openStoryboardFilePickerForSlide = (index) => {\n storyboardReplaceTargetIndexRef.current = index;\n if (!storyboardFileInputRef.current) return;\n try { storyboardFileInputRef.current.value = null; } catch (err) { /* ignore */ }\n storyboardFileInputRef.current.click();\n };\n\n const handleFileChange = (e, targetIndex = activeSlideIndex) => {\n const file = e.target.files[0];\n if (!file) return;\n setSlideScreenshotFromFile(file, targetIndex);\n };\n\r\n const handleDragEnter = (e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setIsDragging(true);\r\n };\r\n\r\n const handleDragLeave = (e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setIsDragging(false);\r\n };\r\n\r\n const handleDragOver = (e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n };\r\n\r\n const handleDropWrapper = (e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setIsDragging(false);\r\n handleDrop(e);\r\n };\r\n\r\n const handleDrop = (e, targetIndex = activeSlideIndex) => {\n e.preventDefault();\n const file = e.dataTransfer.files[0];\n if (!file) return;\n setSlideScreenshotFromFile(file, targetIndex);\n };\n\r\n const handleBgDrop = (e) => {\r\n e.preventDefault();\r\n const file = e.dataTransfer.files[0];\r\n if (!validateImageFile(file)) return;\r\n const reader = new FileReader();\r\n reader.onload = (event) => {\r\n setBgImage(event.target.result);\r\n setBgType('image');\r\n };\r\n reader.readAsDataURL(file);\r\n };\r\n\r\n const handleBgDragEnter = (e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setIsBgDragging(true);\r\n };\r\n\r\n const handleBgDragLeave = (e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setIsBgDragging(false);\r\n };\r\n\r\n const handleBgDragOver = (e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n };\r\n\r\n const handleBgDropWrapper = (e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setIsBgDragging(false);\r\n handleBgDrop(e);\r\n };\r\n\r\n const handleBgFileChange = (e) => {\r\n const file = e.target.files?.[0];\r\n if (!validateImageFile(file)) return;\r\n const reader = new FileReader();\r\n reader.onload = (event) => {\r\n setBgImage(event.target.result);\r\n setBgType('image');\r\n };\r\n reader.readAsDataURL(file);\r\n };\r\n\r\n const handleLogoDrop = (e) => {\r\n e.preventDefault();\r\n const file = e.dataTransfer.files[0];\r\n if (!validateImageFile(file)) return;\r\n const reader = new FileReader();\r\n reader.onload = (event) => setLogoImage(event.target.result);\r\n reader.readAsDataURL(file);\r\n };\r\n\r\n const handleLogoDragEnter = (e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setIsLogoDragging(true);\r\n };\r\n\r\n const handleLogoDragLeave = (e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setIsLogoDragging(false);\r\n };\r\n\r\n const handleLogoDragOver = (e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n };\r\n\r\n const handleLogoDropWrapper = (e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setIsLogoDragging(false);\r\n handleLogoDrop(e);\r\n };\r\n\r\n const handleLogoFileChange = (e) => {\n const file = e.target.files?.[0];\n if (!validateImageFile(file)) return;\n const reader = new FileReader();\n reader.onload = (event) => setLogoImage(event.target.result);\n reader.readAsDataURL(file);\n };\n\n const handleLogoRemove = useCallback(() => {\n setLogoImage(null);\n }, []);\n\r\n const handleAddLocales = (newLocales) => {\n if (!Array.isArray(newLocales) || newLocales.length === 0) return;\n setLocales((prev) => {\n const existingIds = new Set(prev.map((l) => l.id));\n const merged = [...prev];\n newLocales.forEach((loc) => {\r\n if (!existingIds.has(loc.id)) {\r\n merged.push(loc);\r\n existingIds.add(loc.id);\r\n }\r\n });\r\n return merged;\r\n });\r\n\r\n setSlides((prevSlides) =>\r\n prevSlides.map((slide) => {\r\n const updatedTexts = { ...slide.texts };\r\n newLocales.forEach((loc) => {\r\n if (!updatedTexts[loc.id]) {\r\n const defaults = LANGUAGE_OPTIONS.find((l) => l.id === loc.id)?.defaults || { header: '', sub: '' };\r\n updatedTexts[loc.id] = { header: defaults.header, sub: defaults.sub };\r\n }\r\n });\r\n return { ...slide, texts: updatedTexts };\r\n })\r\n );\r\n\n if (newLocales[0]?.id) {\n setCurrentLocaleId(newLocales[0].id);\n }\n };\n\n const handleLocaleChange = useCallback(\n (nextLocaleId) => {\n setCurrentLocaleId(nextLocaleId);\n if (hasTrackedMultiLocalePreviewedRef.current) return;\n if (locales.length > 1 && nextLocaleId && nextLocaleId !== currentLocaleId) {\n hasTrackedMultiLocalePreviewedRef.current = true;\n trackEvent('multi_locale_previewed', {\n locale_count: locales.length,\n from: currentLocaleId,\n to: nextLocaleId,\n });\n }\n },\n [currentLocaleId, locales.length]\n );\n\n const removeLocale = (localeId) => {\n setLocales((prev) => {\n if (prev.length <= 1) return prev;\n const next = prev.filter((l) => l.id !== localeId);\n if (!next.length) return prev;\n if (currentLocaleId === localeId) {\n setCurrentLocaleId(next[0].id);\n }\n setSlides((slidesPrev) =>\n slidesPrev.map((slide) => {\n const updatedTexts = { ...slide.texts };\n delete updatedTexts[localeId];\n if (!slide?.screenshotsByLocale || !(localeId in slide.screenshotsByLocale)) {\n return { ...slide, texts: updatedTexts };\n }\n const nextScreenshotsByLocale = { ...slide.screenshotsByLocale };\n delete nextScreenshotsByLocale[localeId];\n return { ...slide, texts: updatedTexts, screenshotsByLocale: nextScreenshotsByLocale };\n })\n );\n return next;\n });\n };\n\n const handleExportJSON = () => {\n const snapshot = captureSnapshot();\n const payload = {\n version: '1.0',\n savedAt: new Date().toISOString(),\n data: snapshot,\r\n };\r\n const blob = new Blob([JSON.stringify(payload, null, 2)], { type: 'application/json' });\r\n const url = URL.createObjectURL(blob);\r\n const link = document.createElement('a');\r\n link.href = url;\r\n link.download = 'shipscreens-project.json';\r\n document.body.appendChild(link);\r\n link.click();\r\n link.remove();\r\n URL.revokeObjectURL(url);\r\n };\r\n\r\n const handleImportJSON = (e) => {\r\n const file = e?.target?.files?.[0] || e?.dataTransfer?.files?.[0];\r\n if (!file) return;\r\n const reader = new FileReader();\r\n reader.onload = (event) => {\r\n try {\n const parsed = JSON.parse(event.target.result);\n const data = parsed?.data || parsed;\n restoreSnapshot(data);\n const localeCount = Array.isArray(data?.locales) ? data.locales.length : 0;\n addToast({ type: 'success', message: t('app.alerts.importSuccess', { count: localeCount }) });\n trackProjectCreated('json_import', { locale_count: localeCount });\n } catch (err) {\n console.error('Failed to import JSON', err);\n addToast({ type: 'error', message: t('app.data.importError') });\n }\n };\r\n reader.onerror = () => addToast({ type: 'error', message: t('app.data.importError') });\r\n reader.readAsText(file);\r\n if (e?.target) e.target.value = '';\r\n };\r\n\r\n const handleJsonDragEnter = (e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setIsJsonDragging(true);\r\n };\r\n\r\n const handleJsonDragLeave = (e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setIsJsonDragging(false);\r\n };\r\n\r\n const handleJsonDragOver = (e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n };\r\n\r\n const handleJsonDropWrapper = (e) => {\n e.preventDefault();\n e.stopPropagation();\n setIsJsonDragging(false);\n handleImportJSON(e);\n };\n\n const normalizeCsvCell = (value) => (value === undefined || value === null ? '' : value.toString()).trim();\n const toCompactCsvKey = (value) => normalizeCsvCell(value).toLowerCase().replace(/[^a-z0-9]/g, '');\n const detectCsvSlideCount = (fields) => {\n if (!Array.isArray(fields) || !fields.length) return 0;\n let max = 0;\n fields.forEach((field) => {\n const key = toCompactCsvKey(field);\n if (!key) return;\n const numbered = key.match(/^(header|headline|title|subtitle|sub)(\\d+)$/);\n if (numbered) {\n const idx = parseInt(numbered[2], 10);\n if (!Number.isNaN(idx)) max = Math.max(max, idx);\n return;\n }\n if (key === 'header' || key === 'subtitle' || key === 'sub') {\n max = Math.max(max, 1);\n }\n });\n return max;\n };\n\n const processCsvFile = (file) => {\n const reader = new FileReader();\n reader.onload = (event) => {\n const text = event.target.result;\n const parsed = Papa.parse(text, {\n header: true,\n skipEmptyLines: true,\n transformHeader: (h) => (h || '').replace(/^\\ufeff/, '').trim(),\n });\n\n const rows = Array.isArray(parsed.data) ? parsed.data : [];\n const newLocales = [];\n const seen = new Set();\n const slideCount = detectCsvSlideCount(parsed?.meta?.fields || Object.keys(rows[0] || {}));\n if (!slideCount) {\n addToast({ type: 'error', message: t('app.alerts.importInvalidCsvColumns') });\n return;\n }\n if (slideCount > 50) {\n addToast({ type: 'error', message: t('app.alerts.slideLimit') });\n return;\n }\n const slidesTexts = Array.from({ length: slideCount }, () => ({}));\n\n rows.forEach((row, idx) => {\n const keyMap = new Map();\n Object.entries(row || {}).forEach(([key, value]) => {\n const compact = toCompactCsvKey(key);\n if (compact) keyMap.set(compact, value);\n });\n\n const langIdRaw =\n keyMap.get('locale') ??\n keyMap.get('language') ??\n keyMap.get('lang') ??\n keyMap.get('id') ??\n '';\n const langId = normalizeCsvCell(langIdRaw);\n\n const perSlideTexts = Array.from({ length: slideCount }, (_, sIdx) => {\n const slideNumber = sIdx + 1;\n const headerRaw =\n keyMap.get(`header${slideNumber}`) ??\n keyMap.get(`headline${slideNumber}`) ??\n keyMap.get(`title${slideNumber}`) ??\n (slideNumber === 1 ? (keyMap.get('header') ?? keyMap.get('headline') ?? keyMap.get('title')) : undefined) ??\n '';\n const subRaw =\n keyMap.get(`subtitle${slideNumber}`) ??\n keyMap.get(`sub${slideNumber}`) ??\n (slideNumber === 1 ? (keyMap.get('subtitle') ?? keyMap.get('sub')) : undefined) ??\n '';\n return {\n header: normalizeCsvCell(headerRaw),\n sub: normalizeCsvCell(subRaw),\n };\n });\n\n const hasAnyText = perSlideTexts.some((t) => t.header || t.sub);\n if (!langId && !hasAnyText) return;\n\n const localeId = langId || `lang-${idx + 1}`;\n if (seen.has(localeId)) return;\n const knownLang = LANGUAGE_OPTIONS.find((opt) => opt.id.toLowerCase() === localeId.toLowerCase());\n newLocales.push({\n id: localeId,\n name: knownLang ? knownLang.name : localeId,\n flag: knownLang ? knownLang.flag : '??',\n });\n perSlideTexts.forEach((slideText, sIdx) => {\n slidesTexts[sIdx][localeId] = slideText;\n });\n seen.add(localeId);\n });\n\n const parseErrors = parsed.errors?.filter((e) => e.type !== 'FieldMismatch') || [];\n\n if (!newLocales.length) {\n addToast({ type: 'error', message: rows.length ? t('app.alerts.importCsvNoRows') : t('app.alerts.importInvalidCsv') });\n return;\n }\n\n setCsvImportMode('merge');\n setCsvPreview({\n locales: newLocales,\n slideCount,\n slidesTexts,\n texts: slidesTexts[0] || {},\n errors: parseErrors.length,\n });\n };\n reader.onerror = () => addToast({ type: 'error', message: t('app.alerts.importInvalidCsv') });\n reader.readAsText(file);\n };\n\r\n const handleCsvImport = (e) => {\r\n const file = e.target.files?.[0];\r\n if (file) {\r\n processCsvFile(file);\r\n }\r\n if (e?.target) e.target.value = '';\r\n };\r\n\r\n const handleCsvDragEnter = (e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setIsCsvDragging(true);\r\n };\r\n\r\n const handleCsvDragLeave = (e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setIsCsvDragging(false);\r\n };\r\n\r\n const handleCsvDragOver = (e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n };\r\n\r\n const handleCsvDropWrapper = (e) => {\n e.preventDefault();\n e.stopPropagation();\n setIsCsvDragging(false);\n if (!isPro) {\n openUpgradeModal('csv_drop');\n return;\n }\n const file = e.dataTransfer?.files?.[0];\n if (file) processCsvFile(file);\n };\n\n const openCsvTemplateDialog = () => {\n setCsvTemplatePreset('current');\n setCsvTemplateCustomCount(String(Math.max(1, slides.length)));\n setIsCsvTemplateDialogOpen(true);\n };\n\n const downloadCsvTemplate = (templateSlideCount = Math.max(1, slides.length)) => {\n const fallback = Math.max(1, slides.length);\n const normalizedCount = Number.isFinite(templateSlideCount) ? templateSlideCount : fallback;\n const slideCount = Math.min(50, Math.max(1, normalizedCount));\n const headerCells = ['Locale'];\n for (let i = 1; i <= slideCount; i += 1) {\n headerCells.push(`Header_${i}`, `Subtitle_${i}`);\n }\n const enRow = ['en-US'];\n const jaRow = ['ja-JP'];\n for (let i = 1; i <= slideCount; i += 1) {\n enRow.push(`Headline ${i}`, `Subtitle ${i}`);\n jaRow.push(`ヘッドライン${i}`, `サブタイトル${i}`);\n }\n\n const csvLines = [headerCells.join(','), enRow.join(','), jaRow.join(',')];\n const csvContent = `\\ufeff${csvLines.join('\\n')}`;\n const csv = `data:text/csv;charset=utf-8,${encodeURIComponent(csvContent)}`;\n const link = document.createElement('a');\n link.href = csv;\n link.download = 'shipscreens-copy-template.csv';\n document.body.appendChild(link);\r\n link.click();\n document.body.removeChild(link);\n };\n\n const confirmDownloadCsvTemplate = () => {\n const currentSlideCount = Math.max(1, slides.length);\n\n let resolvedCount = currentSlideCount;\n if (csvTemplatePreset === 'current') {\n resolvedCount = currentSlideCount;\n } else if (csvTemplatePreset === 'custom') {\n const customParsed = parseInt(csvTemplateCustomCount, 10);\n resolvedCount = Number.isFinite(customParsed) ? customParsed : currentSlideCount;\n } else {\n const parsed = parseInt(csvTemplatePreset, 10);\n resolvedCount = Number.isFinite(parsed) ? parsed : currentSlideCount;\n }\n\n downloadCsvTemplate(resolvedCount);\n setIsCsvTemplateDialogOpen(false);\n setCsvTemplatePreset('current');\n setCsvTemplateCustomCount(String(currentSlideCount));\n };\n\r\n const applyCsvPreview = () => {\n if (!csvPreview) return;\n\n let nextLocales = csvPreview.locales;\n const existingLocaleIds = new Set(locales.map((l) => l.id));\n if (csvImportMode === 'merge') {\n const existingMap = new Map(locales.map((l) => [l.id, l]));\n const merged = [...locales];\n csvPreview.locales.forEach((l) => {\n if (existingMap.has(l.id)) {\n const idx = merged.findIndex((m) => m.id === l.id);\r\n merged[idx] = { ...existingMap.get(l.id), ...l };\r\n } else {\r\n merged.push(l);\r\n }\r\n });\n nextLocales = merged;\n }\n\n const requiredSlides = Math.max(slides.length, csvPreview.slideCount || 1);\n if (requiredSlides > 50) {\n addToast({ type: 'error', message: t('app.alerts.slideLimit') });\n return;\n }\n\n const nextLocaleIds = new Set(nextLocales.map((l) => l.id));\n const addedLocaleCount = nextLocales.filter((l) => !existingLocaleIds.has(l.id)).length;\n const removedLocaleCount = Array.from(existingLocaleIds).filter((id) => !nextLocaleIds.has(id)).length;\n const baseSlides = [...slides];\n let maxId = baseSlides.length ? Math.max(...baseSlides.map((s) => s.id || 0)) : 0;\n while (baseSlides.length < requiredSlides) {\n maxId += 1;\n baseSlides.push({ id: maxId, screenshot: null, screenshotsByLocale: {}, texts: {} });\n }\n\n const slidesTexts = Array.isArray(csvPreview.slidesTexts) ? csvPreview.slidesTexts : [];\n const mergedSlides = baseSlides.map((slide, idx) => {\n const baseTexts = { ...(slide?.texts || {}) };\n const nextTexts =\n csvImportMode === 'replace'\n ? Object.fromEntries(Object.entries(baseTexts).filter(([localeId]) => nextLocaleIds.has(localeId)))\n : baseTexts;\n\n nextLocales.forEach((loc) => {\n if (!nextTexts[loc.id]) {\n nextTexts[loc.id] = { header: '', sub: '' };\n }\n });\n\n const incomingByLocale = slidesTexts[idx] || {};\n Object.entries(incomingByLocale).forEach(([localeId, incomingText]) => {\n if (!nextLocaleIds.has(localeId)) return;\n const header = normalizeCsvCell(incomingText?.header);\n const sub = normalizeCsvCell(incomingText?.sub);\n if (csvImportMode === 'merge') {\n const existing = nextTexts[localeId] || { header: '', sub: '' };\n if (header) existing.header = header;\n if (sub) existing.sub = sub;\n nextTexts[localeId] = existing;\n } else {\n nextTexts[localeId] = { header, sub };\n }\n });\n\n return { ...slide, texts: nextTexts };\n });\n\n setSlides(mergedSlides);\n setLocales(nextLocales);\n if (nextLocales.length) {\n setCurrentLocaleId(nextLocales[0].id);\n }\n addToast({ type: 'success', message: t('app.alerts.importSuccess', { count: csvPreview.locales.length }) });\n trackProjectCreated('csv_import', { locale_count: nextLocales.length, slide_count: requiredSlides });\n trackEvent('copy_imported', {\n locale_count: nextLocales.length,\n slide_count: requiredSlides,\n import_mode: csvImportMode,\n added_locale_count: addedLocaleCount,\n removed_locale_count: removedLocaleCount,\n });\n setCsvPreview(null);\n setCsvImportMode('merge');\n };\n\n const loadScriptOnce = (src, globalKey) =>\n new Promise((resolve, reject) => {\n if (globalKey && window[globalKey]) return resolve(window[globalKey]);\n const script = document.createElement('script');\n script.src = src;\n script.onload = () => resolve(globalKey ? window[globalKey] : undefined);\n script.onerror = reject;\n document.head.appendChild(script);\n });\n\n const ensureJSZip = async () => {\n if (window.JSZip) return window.JSZip;\n await loadScriptOnce('https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js', 'JSZip');\n return window.JSZip;\n };\n\n const readBlobAsDataUrl = (blob) =>\n new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = (event) => resolve(event.target.result);\n reader.onerror = reject;\n reader.readAsDataURL(blob);\n });\n\n const normalizeLocaleIdForImport = (value) => {\n const raw = (value === undefined || value === null ? '' : value.toString()).trim();\n if (!raw) return '';\n const cleaned = raw.replace(/_/g, '-');\n const parts = cleaned.split('-').filter(Boolean);\n if (!parts.length) return cleaned;\n const normalized = parts\n .map((part, idx) => {\n if (idx === 0) return part.toLowerCase();\n if (part.length === 2 && /^[a-zA-Z]{2}$/.test(part)) return part.toUpperCase();\n if (part.length === 4 && /^[a-zA-Z]{4}$/.test(part)) return `${part[0].toUpperCase()}${part.slice(1).toLowerCase()}`;\n return part;\n })\n .join('-');\n return normalized;\n };\n\n const resolveLocaleIdForImport = (candidate) => {\n const normalized = normalizeLocaleIdForImport(candidate);\n if (!normalized) return '';\n const existing = locales.find((l) => l.id.toLowerCase() === normalized.toLowerCase());\n if (existing) return existing.id;\n const knownLang = LANGUAGE_OPTIONS.find((opt) => opt.id.toLowerCase() === normalized.toLowerCase());\n return knownLang ? knownLang.id : normalized;\n };\n\n const extractLocaleScreenshotKeyFromPath = (path) => {\n const safePath = (path === undefined || path === null ? '' : path.toString()).trim();\n if (!safePath) return null;\n const normalizedPath = safePath.replace(/\\\\/g, '/');\n const segments = normalizedPath.split('/').filter(Boolean);\n const fileName = segments.length ? segments[segments.length - 1] : normalizedPath;\n const baseName = fileName.replace(/\\.[^.]+$/, '');\n\n const localeCandidates = [];\n const knownLocaleIds = new Set([\n ...locales.map((l) => l.id.toLowerCase()),\n ...LANGUAGE_OPTIONS.map((l) => l.id.toLowerCase()),\n ]);\n const segmentLocalePattern = /^[A-Za-z]{2,3}(?:-[A-Za-z0-9]{2,8})+$/;\n segments.slice(0, -1).forEach((seg) => {\n const trimmed = seg.trim();\n if (!trimmed) return;\n const lower = trimmed.toLowerCase();\n if (knownLocaleIds.has(lower)) {\n localeCandidates.push(trimmed);\n return;\n }\n if (segmentLocalePattern.test(trimmed)) {\n localeCandidates.push(trimmed);\n return;\n }\n if (trimmed.length === 2 && /^[A-Za-z]{2}$/.test(trimmed)) {\n localeCandidates.push(trimmed);\n }\n });\n\n let localeRaw = '';\n let remainder = baseName;\n const basePrefixMatch = baseName.match(/^([A-Za-z]{2,3}(?:-[A-Za-z0-9]{2,8})*)(?:[ _-]+)(.+)$/);\n if (basePrefixMatch) {\n localeRaw = basePrefixMatch[1];\n remainder = basePrefixMatch[2] || '';\n } else if (localeCandidates.length) {\n localeRaw = localeCandidates[localeCandidates.length - 1];\n }\n\n const localeId = resolveLocaleIdForImport(localeRaw);\n if (!localeId) return null;\n\n const numberMatches = (remainder || baseName).match(/\\d+/g);\n if (!numberMatches?.length) return null;\n const slideNumber = parseInt(numberMatches[numberMatches.length - 1], 10);\n if (!Number.isFinite(slideNumber)) return null;\n return { localeId, slideNumber };\n };\n\n const closeLocaleScreenshotImportDialog = () => {\n setLocaleScreenshotImportPreview(null);\n setLocaleScreenshotImportProgress({ current: 0, total: 0 });\n setIsLocaleScreenshotImportApplying(false);\n localeScreenshotImportItemsRef.current = [];\n localeScreenshotImportZipRef.current = null;\n };\n\n useModalA11y({\n isOpen: Boolean(localeScreenshotImportPreview),\n onClose: isLocaleScreenshotImportApplying ? undefined : closeLocaleScreenshotImportDialog,\n panelRef: localeScreenshotImportDialogPanelRef,\n initialFocusRef: isLocaleScreenshotImportApplying ? undefined : localeScreenshotImportCancelButtonRef,\n closeOnEscape: !isLocaleScreenshotImportApplying,\n });\n\n const startLocaleScreenshotImport = async (fileList) => {\n const files = Array.from(fileList || []);\n if (!files.length) return;\n\n try {\n closeLocaleScreenshotImportDialog();\n\n const isZip = (file) => {\n const name = (file?.name || '').toLowerCase();\n return name.endsWith('.zip') || file?.type === 'application/zip' || file?.type === 'application/x-zip-compressed';\n };\n const zipFile = files.find(isZip) || null;\n if (zipFile) {\n const JSZip = await ensureJSZip();\n const zip = await JSZip.loadAsync(zipFile);\n localeScreenshotImportZipRef.current = zip;\n\n const items = [];\n const duplicates = new Set();\n const seenKeys = new Set();\n let skipped = 0;\n let skippedNotImage = 0;\n let skippedOutOfRange = 0;\n let maxSlide = 0;\n\n Object.values(zip.files || {}).forEach((entry) => {\n if (!entry || entry.dir) return;\n const entryName = entry.name || '';\n if (!/\\.(png|jpe?g|webp)$/i.test(entryName)) {\n skippedNotImage += 1;\n return;\n }\n const key = extractLocaleScreenshotKeyFromPath(entryName);\n if (!key) {\n skipped += 1;\n return;\n }\n if (key.slideNumber < 1 || key.slideNumber > 50) {\n skippedOutOfRange += 1;\n return;\n }\n const slideIndex = key.slideNumber - 1;\n maxSlide = Math.max(maxSlide, key.slideNumber);\n const uniqueKey = `${key.localeId}#${slideIndex}`;\n if (seenKeys.has(uniqueKey)) {\n duplicates.add(uniqueKey);\n }\n seenKeys.add(uniqueKey);\n items.push({ kind: 'zip', entryName, localeId: key.localeId, slideIndex });\n });\n\n localeScreenshotImportItemsRef.current = items;\n if (!items.length) {\n addToast({ type: 'error', message: t('app.screenshotImporter.noMatches') });\n return;\n }\n\n const localeIds = Array.from(new Set(items.map((i) => i.localeId)));\n const existingLocaleIds = new Set(locales.map((l) => l.id.toLowerCase()));\n const newLocaleIds = localeIds.filter((id) => !existingLocaleIds.has(id.toLowerCase()));\n const requiredSlides = Math.max(slides.length, maxSlide);\n const addedSlides = Math.max(0, requiredSlides - slides.length);\n\n setLocaleScreenshotImportPreview({\n source: { type: 'zip', name: zipFile.name || 'screenshots.zip' },\n totalFound: items.length,\n localeCount: localeIds.length,\n newLocaleCount: newLocaleIds.length,\n slideCount: maxSlide,\n addedSlideCount: addedSlides,\n skipped,\n skippedNotImage,\n skippedOutOfRange,\n duplicateCount: duplicates.size,\n });\n return;\n }\n\n const imageFiles = files.filter((file) => file?.type?.startsWith('image/') || /\\.(png|jpe?g|webp)$/i.test(file?.name || ''));\n if (!imageFiles.length) {\n addToast({ type: 'error', message: t('app.screenshotImporter.noFiles') });\n return;\n }\n\n const items = [];\n const duplicates = new Set();\n const seenKeys = new Set();\n let skipped = 0;\n let skippedOutOfRange = 0;\n let maxSlide = 0;\n\n imageFiles.forEach((file) => {\n const path = file?.webkitRelativePath || file?.name || '';\n const key = extractLocaleScreenshotKeyFromPath(path);\n if (!key) {\n skipped += 1;\n return;\n }\n if (key.slideNumber < 1 || key.slideNumber > 50) {\n skippedOutOfRange += 1;\n return;\n }\n const slideIndex = key.slideNumber - 1;\n maxSlide = Math.max(maxSlide, key.slideNumber);\n const uniqueKey = `${key.localeId}#${slideIndex}`;\n if (seenKeys.has(uniqueKey)) {\n duplicates.add(uniqueKey);\n }\n seenKeys.add(uniqueKey);\n items.push({ kind: 'file', file, localeId: key.localeId, slideIndex, path });\n });\n\n localeScreenshotImportItemsRef.current = items;\n if (!items.length) {\n addToast({ type: 'error', message: t('app.screenshotImporter.noMatches') });\n return;\n }\n\n const localeIds = Array.from(new Set(items.map((i) => i.localeId)));\n const existingLocaleIds = new Set(locales.map((l) => l.id.toLowerCase()));\n const newLocaleIds = localeIds.filter((id) => !existingLocaleIds.has(id.toLowerCase()));\n const requiredSlides = Math.max(slides.length, maxSlide);\n const addedSlides = Math.max(0, requiredSlides - slides.length);\n\n setLocaleScreenshotImportPreview({\n source: { type: 'files', name: t('app.screenshotImporter.filesLabel', { count: imageFiles.length }) },\n totalFound: items.length,\n localeCount: localeIds.length,\n newLocaleCount: newLocaleIds.length,\n slideCount: maxSlide,\n addedSlideCount: addedSlides,\n skipped,\n skippedOutOfRange,\n duplicateCount: duplicates.size,\n });\n } catch (err) {\n console.error('Locale screenshot import failed', err);\n addToast({ type: 'error', message: t('app.screenshotImporter.failed') });\n }\n };\n\n const applyLocaleScreenshotImport = async () => {\n if (!localeScreenshotImportPreview) return;\n const items = localeScreenshotImportItemsRef.current || [];\n if (!items.length) {\n closeLocaleScreenshotImportDialog();\n return;\n }\n\n if (isLocaleScreenshotImportApplying) return;\n setIsLocaleScreenshotImportApplying(true);\n setLocaleScreenshotImportProgress({ current: 0, total: items.length });\n\n let failures = 0;\n\n try {\n const discoveredLocaleIds = Array.from(new Set(items.map((i) => i.localeId)));\n const existingLocaleIds = new Set(locales.map((l) => l.id.toLowerCase()));\n const nextLocales = [...locales];\n discoveredLocaleIds.forEach((localeId) => {\n if (existingLocaleIds.has(localeId.toLowerCase())) return;\n const knownLang = LANGUAGE_OPTIONS.find((opt) => opt.id.toLowerCase() === localeId.toLowerCase());\n nextLocales.push({\n id: knownLang ? knownLang.id : localeId,\n name: knownLang ? knownLang.name : localeId,\n flag: knownLang ? knownLang.flag : '??',\n });\n existingLocaleIds.add(localeId.toLowerCase());\n });\n\n const maxSlideIndex = Math.max(0, ...items.map((i) => i.slideIndex));\n const requiredSlides = Math.max(slides.length, maxSlideIndex + 1);\n if (requiredSlides > 50) {\n addToast({ type: 'error', message: t('app.alerts.slideLimit') });\n setIsLocaleScreenshotImportApplying(false);\n return;\n }\n\n const baseSlides = [...slides].map((slide) => ({\n ...slide,\n screenshot: slide?.screenshot ?? null,\n screenshotsByLocale: { ...(slide?.screenshotsByLocale || {}) },\n texts: { ...(slide?.texts || {}) },\n }));\n\n baseSlides.forEach((slide) => {\n nextLocales.forEach((loc) => {\n if (slide.texts?.[loc.id]) return;\n const defaults = LANGUAGE_OPTIONS.find((l) => l.id === loc.id)?.defaults || { header: '', sub: '' };\n slide.texts[loc.id] = { header: defaults.header || '', sub: defaults.sub || '' };\n });\n });\n\n let maxId = baseSlides.length ? Math.max(...baseSlides.map((s) => s.id || 0)) : 0;\n while (baseSlides.length < requiredSlides) {\n maxId += 1;\n const newTexts = {};\n nextLocales.forEach((l) => {\n newTexts[l.id] = { header: t('app.defaults.newSlideTitle'), sub: t('app.defaults.newSlideDesc') };\n });\n baseSlides.push({ id: maxId, screenshot: null, screenshotsByLocale: {}, texts: newTexts });\n }\n\n const zip = localeScreenshotImportZipRef.current;\n\n for (let idx = 0; idx < items.length; idx += 1) {\n const item = items[idx];\n const slide = baseSlides[item.slideIndex];\n if (!slide) {\n failures += 1;\n setLocaleScreenshotImportProgress({ current: idx + 1, total: items.length });\n continue;\n }\n\n try {\n let blob = null;\n if (item.kind === 'file') {\n blob = item.file;\n } else if (item.kind === 'zip' && zip) {\n const entry = zip.file(item.entryName);\n if (entry) blob = await entry.async('blob');\n }\n\n if (!blob) {\n failures += 1;\n setLocaleScreenshotImportProgress({ current: idx + 1, total: items.length });\n continue;\n }\n\n const dataUrl = await readBlobAsDataUrl(blob);\n slide.screenshotsByLocale[item.localeId] = dataUrl;\n } catch (e) {\n failures += 1;\n }\n\n setLocaleScreenshotImportProgress({ current: idx + 1, total: items.length });\n }\n\n setSlides(baseSlides);\n setLocales(nextLocales);\n if (nextLocales.length && !nextLocales.some((l) => l.id === currentLocaleId)) {\n setCurrentLocaleId(nextLocales[0].id);\n }\n\n addToast({\n type: failures ? 'info' : 'success',\n message: failures\n ? t('app.screenshotImporter.appliedWithErrors', { count: items.length - failures, errors: failures })\n : t('app.screenshotImporter.applied', { count: items.length }),\n });\n\n closeLocaleScreenshotImportDialog();\n } catch (err) {\n console.error('Failed to apply locale screenshots', err);\n addToast({ type: 'error', message: t('app.screenshotImporter.failed') });\n setIsLocaleScreenshotImportApplying(false);\n }\n };\n\r\n function applyTheme(type) {\n // Hoisted to avoid TDZ in minified bundle\r\n switch (type) {\r\n case 'dark':\r\n setBgType('solid');\r\n setBgColor('#0f172a');\r\n setTextColor('#f8fafc');\r\n setFrameColor('black');\r\n break;\r\n case 'clean':\r\n setBgType('solid');\r\n setBgColor('#f8fafc');\r\n setTextColor('#1e293b');\r\n setFrameColor('silver');\r\n break;\r\n case 'pop':\r\n setBgType('gradient');\r\n setGradientStart('#ff9a9e');\r\n setGradientEnd('#fecfef');\r\n setGradientAngle(135);\r\n setTextColor('#ffffff');\r\n setFrameColor('titanium');\r\n break;\r\n default:\r\n break;\r\n }\r\n }\n\n const maybeShowUpsellAfterExport = useCallback(\n (exportType) => {\n if (isPro) return;\n if (typeof window === 'undefined') return;\n\n const now = Date.now();\n const ONE_DAY_MS = 24 * 60 * 60 * 1000;\n\n try {\n const lastShownAt = Number(localStorage.getItem(UPSELL_WATERMARK_TOAST_STORAGE_KEY) || 0);\n if (lastShownAt && now - lastShownAt < ONE_DAY_MS) return;\n localStorage.setItem(UPSELL_WATERMARK_TOAST_STORAGE_KEY, String(now));\n } catch {\n // localStorage may be blocked; still show the toast.\n }\n\n trackEvent('upsell_toast_shown', {\n surface: 'export',\n export_type: exportType,\n is_pro: isPro,\n is_authenticated: Boolean(isEffectiveAuthenticated),\n });\n\n addToast({\n type: 'info',\n message: t('app.upsell.watermarkToast.message', {\n defaultValue: 'Exported with watermark. Upgrade to remove it.',\n }),\n duration: 9000,\n action: {\n label: t('app.upsell.watermarkToast.action', { defaultValue: 'Remove watermark' }),\n onClick: () => {\n trackEvent('upsell_toast_clicked', { surface: 'export', export_type: exportType });\n openUpgradeModal('upsell_toast');\n },\n },\n });\n },\n [addToast, isEffectiveAuthenticated, isPro, openUpgradeModal, t]\n );\n\n const handleDownload = useCallback(\n async (element, filename) => {\n if (!element) return;\n const success = await exportSingle(element, filename);\n if (!success) return;\n trackEvent('export_completed', {\n export_type: 'single',\n device_count: 1,\n locale_count: 1,\n slide_count: 1,\n device_id: deviceId,\n locale_id: currentLocaleId,\n slide_index: activeSlideIndex + 1,\n is_pro: isPro,\n });\n maybeShowUpsellAfterExport('single');\n },\n [activeSlideIndex, currentLocaleId, deviceId, exportSingle, isPro, maybeShowUpsellAfterExport]\n );\n\n const handleCancelExport = useCallback(() => {\n const controller = exportAbortControllerRef.current;\n if (controller) {\n controller.abort();\n setDownloadDetail(t('app.progress.cancelling', { defaultValue: 'Cancelling...' }));\n }\n }, [t]);\n\n const handleBatchDownload = useCallback(async () => {\n const isFreeBundlePreview = !isPro && !isCliMode;\n const maxFreeSlides = 5;\n\n const exportLocales = (() => {\n if (!isFreeBundlePreview) return locales;\n const match = locales.find((l) => l.id === currentLocaleId);\n return match ? [match] : locales.slice(0, 1);\n })();\n\n const exportSlides = isFreeBundlePreview ? slides.slice(0, maxFreeSlides) : slides;\n\n const exportDeviceIds = (() => {\n if (!isFreeBundlePreview) return selectedBatchDevices;\n const ids = Array.isArray(selectedBatchDevices) ? selectedBatchDevices : [];\n const idSet = new Set(ids);\n const current = idSet.has(deviceId) ? deviceId : null;\n const ios = [];\n const android = [];\n ids.forEach((id) => {\n const group = String(DEVICE_LIBRARY[id]?.group || '').toLowerCase();\n if (group.includes('android')) android.push(id);\n else ios.push(id);\n });\n const next = [];\n const currentGroup = current ? String(DEVICE_LIBRARY[current]?.group || '').toLowerCase() : '';\n const preferAndroid = current ? currentGroup.includes('android') : false;\n const preferredIos = current && !preferAndroid ? current : ios[0];\n const preferredAndroid = current && preferAndroid ? current : android[0];\n if (preferredIos) next.push(preferredIos);\n if (preferredAndroid && preferredAndroid !== preferredIos) next.push(preferredAndroid);\n if (!next.length && ids.length) next.push(ids[0]);\n return next;\n })();\n\n if (!exportDeviceIds?.length) {\n addToast({ type: 'error', message: t('app.batch.noDevices', { defaultValue: 'Select at least one device.' }) });\n return;\n }\n if (!exportLocales?.length) {\n addToast({ type: 'error', message: t('app.locale.none', { defaultValue: 'Add at least one locale.' }) });\n return;\n }\n if (!exportSlides?.length) {\n addToast({ type: 'error', message: t('app.slides.none', { defaultValue: 'Add at least one slide.' }) });\n return;\n }\n setDownloadDetail(t('app.progress.preparingBundle', { defaultValue: 'Preparing Fastlane ZIP...' }));\n const controller = new AbortController();\n exportAbortControllerRef.current = controller;\n try {\n await exportBatch({\n locales: exportLocales,\n slides: exportSlides,\n selectedDeviceIds: exportDeviceIds,\n getElementById: (devId) => document.getElementById(`batch-canvas-${devId}`),\n signal: controller.signal,\n outputMode: exportStructureMode,\n onTaskStart: ({ localeId, slideNumber, deviceId: devId }) => {\n const deviceLabel = getDeviceLabelParts(DEVICE_LIBRARY[devId], { id: devId, mode: deviceLabelMode }).optionLabel;\n setDownloadDetail(t('app.progress.detail', { device: deviceLabel, locale: localeId, index: slideNumber }));\n },\n });\n trackEvent('export_completed', {\n export_type: 'batch',\n device_count: exportDeviceIds.length,\n locale_count: exportLocales.length,\n slide_count: exportSlides.length,\n total_images: exportLocales.length * exportSlides.length * exportDeviceIds.length,\n output_mode: exportStructureMode,\n is_pro: isPro,\n });\n addToast({ type: 'success', message: t('app.alerts.downloadSuccess', { defaultValue: 'Export completed' }) });\n maybeShowUpsellAfterExport('batch');\n } catch (err) {\n if (err?.message === 'Aborted') {\n addToast({ type: 'info', message: t('app.alerts.downloadCancelled', { defaultValue: 'エクスポートをキャンセルしました' }) });\n } else {\n console.error('Batch download failed', err);\n addToast({ type: 'error', message: t('app.alerts.downloadError', { defaultValue: 'Failed to export' }) });\n }\n } finally {\n exportAbortControllerRef.current = null;\n setDownloadDetail('');\n }\n }, [exportBatch, locales, slides, selectedBatchDevices, addToast, t, deviceLabelMode, exportStructureMode, isPro, isCliMode, currentLocaleId, deviceId, maybeShowUpsellAfterExport]);\n\n useEffect(() => {\n if (!isCliMode) return;\n window.__shipscreensCli = {\n exportBundle: () => handleBatchDownload(),\n };\n return () => {\n try {\n delete window.__shipscreensCli;\n } catch (err) {\n void err;\n }\n };\n }, [isCliMode, handleBatchDownload]);\n\n const applyPreset = (preset) => {\n if (!preset?.settings) return;\n const previousSnapshot = captureSnapshot();\n setHistory((prev) => {\r\n const past = [...prev.past, previousSnapshot].slice(-20);\r\n return { past, future: [] };\r\n });\r\n skipHistoryRef.current = true;\r\n\r\n const s = preset.settings;\r\n if (s.bgType) setBgType(s.bgType);\r\n if (s.bgColor) setBgColor(s.bgColor);\r\n if (s.gradientStart) setGradientStart(s.gradientStart);\r\n if (s.gradientEnd) setGradientEnd(s.gradientEnd);\r\n if (typeof s.gradientAngle === 'number') setGradientAngle(s.gradientAngle);\r\n if (s.layoutMode) setLayoutMode(s.layoutMode);\r\n if (typeof s.topSpacing === 'number') setTopSpacing(s.topSpacing);\r\n if (typeof s.deviceScale === 'number') setDeviceScale(s.deviceScale);\r\n if (s.frameColor) setFrameColor(s.frameColor);\r\n if (s.textColor) setTextColor(s.textColor);\r\n if (s.selectedFont) setSelectedFont(s.selectedFont);\r\n if (s.badgeType) setBadgeType(s.badgeType);\r\n if (s.deviceId) setDeviceId(s.deviceId);\r\n\r\n addToast({\r\n type: 'info',\r\n message: t('app.templates.applied', { name: preset.name, defaultValue: `${preset.name} applied` }),\r\n duration: 4000,\r\n action: {\r\n label: t('app.history.undo'),\r\n onClick: undo,\r\n },\r\n });\r\n };\r\n\r\n const openSavePresetDialog = useCallback(() => {\r\n setPresetDialog({ value: '' });\r\n }, []);\r\n\r\n const confirmSaveUserPreset = useCallback(() => {\r\n const name = presetDialog?.value?.trim();\r\n if (!name) return;\r\n const newPreset = {\r\n id: Date.now().toString(),\r\n name,\r\n settings: {\r\n bgType,\r\n bgColor,\r\n gradientStart,\r\n gradientEnd,\r\n gradientAngle,\r\n layoutMode,\r\n topSpacing,\r\n deviceScale,\r\n frameColor,\r\n textColor,\r\n selectedFont,\r\n badgeType,\r\n deviceId,\r\n },\r\n };\r\n const updatedPresets = [...myPresets, newPreset];\r\n setMyPresets(updatedPresets);\r\n localStorage.setItem('mockupStudioUserPresets', JSON.stringify(updatedPresets));\r\n setPresetDialog(null);\r\n addToast({ type: 'success', message: t('app.templates.saved', { defaultValue: 'Preset saved' }) });\r\n }, [\r\n addToast,\r\n badgeType,\r\n bgColor,\r\n bgType,\r\n deviceId,\r\n deviceScale,\r\n frameColor,\r\n gradientAngle,\r\n gradientEnd,\r\n gradientStart,\r\n layoutMode,\r\n myPresets,\r\n presetDialog?.value,\r\n selectedFont,\r\n textColor,\r\n t,\r\n topSpacing,\r\n ]);\r\n\r\n const deleteUserPreset = useCallback(\r\n (id) => {\r\n const updated = myPresets.filter((p) => p.id !== id);\r\n setMyPresets(updated);\r\n localStorage.setItem('mockupStudioUserPresets', JSON.stringify(updated));\r\n addToast({ type: 'info', message: t('app.templates.deleted', { defaultValue: 'Preset deleted' }) });\r\n },\r\n [addToast, myPresets, t]\r\n );\r\n\r\n \r\n const LOCAL_STORAGE_KEY = 'shipscreens_project';\n\n const saveProject = useCallback((settingsOnly = false) => {\n try {\n const snapshot = captureSnapshot();\n const data = settingsOnly\n ? { ...snapshot, slides: snapshot.slides.map((s) => ({ ...s, screenshot: null, screenshotsByLocale: {} })) }\n : snapshot;\n const payload = { version: '1.0', savedAt: new Date().toISOString(), data };\n localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(payload));\n setSaveStatus('saved');\n setTimeout(() => setSaveStatus(''), 2000);\n addToast({ type: 'success', message: t('app.data.saved') });\n } catch (err) {\n console.error('Failed to save project', err);\n setSaveStatus('error');\n addToast({ type: 'error', message: t('app.data.saveError') });\n }\n }, [captureSnapshot, addToast, t]);\n\n const loadProject = useCallback(() => {\n try {\n const raw = localStorage.getItem(LOCAL_STORAGE_KEY);\n if (!raw) {\n addToast({ type: 'error', message: t('app.data.noSavedProject') });\n return;\n }\n const parsed = JSON.parse(raw);\n const data = parsed?.data || parsed;\n restoreSnapshot(data);\n setSaveStatus('loaded');\n setTimeout(() => setSaveStatus(''), 2000);\n addToast({ type: 'success', message: t('app.data.loaded') });\n } catch (err) {\n console.error('Failed to load project', err);\n setSaveStatus('error');\n addToast({ type: 'error', message: t('app.data.loadError') });\n }\n }, [restoreSnapshot, addToast, t]);\n\n const loadSampleProject = useCallback((source = 'data_panel') => {\n setConfirmDialog({\n message: t('app.data.sampleConfirm'),\n onConfirm: () => {\n restoreSnapshot(FIVE_PANEL_SAMPLE_PROJECT);\n setSaveStatus('loaded');\n setTimeout(() => setSaveStatus(''), 2000);\n addToast({ type: 'success', message: t('app.data.sampleLoaded') });\n trackEvent('sample_project_loaded', { source });\n },\n });\n }, [addToast, restoreSnapshot, setConfirmDialog, t]);\n\n const captureTeamSpec = useCallback(() => {\n const snapshot = captureSnapshot();\n return {\n ...snapshot,\n bgImage: null,\n logoImage: null,\n slides: (snapshot.slides || []).map((s) => ({ ...s, screenshot: null, screenshotsByLocale: {} })),\n };\n }, [captureSnapshot]);\n\n const applyTeamSpec = useCallback(\n (spec) => {\n if (!spec) return;\n const current = captureSnapshot();\n const currentSlides = Array.isArray(current.slides) ? current.slides : [];\n const nextSlides = Array.isArray(spec.slides) ? spec.slides : [];\n const mergedSlides = nextSlides.map((slide, idx) => {\n const match = currentSlides.find((s) => s.id === slide.id) || currentSlides[idx] || null;\n return { ...slide, screenshot: match?.screenshot ?? null, screenshotsByLocale: match?.screenshotsByLocale ?? {} };\n });\n restoreSnapshot({\n ...spec,\n bgImage: current.bgImage ?? null,\n logoImage: current.logoImage ?? null,\n slides: mergedSlides,\n });\n },\n [captureSnapshot, restoreSnapshot]\n );\n\n // Restore local snapshot automatically when returning from Stripe checkout\n useEffect(() => {\n const params = new URLSearchParams(window.location.search);\n if (params.get('session_id') && localStorage.getItem(LOCAL_STORAGE_KEY)) {\n loadProject();\n }\n }, [loadProject]);\n\n const hasProcessedSampleParamRef = useRef(false);\n useEffect(() => {\n if (hasProcessedSampleParamRef.current) return;\n hasProcessedSampleParamRef.current = true;\n\n const params = new URLSearchParams(window.location.search);\n if (params.get('session_id')) return;\n\n const sample = params.get('sample');\n if (!sample) return;\n\n const normalized = sample.trim().toLowerCase();\n const isFivePanelSample = ['5panel', 'fivepanel', 'five-panel', 'five_panel', '5-panel', '5_panel'].includes(normalized);\n if (!isFivePanelSample) return;\n\n params.delete('sample');\n const nextSearch = params.toString();\n const nextUrl = `${window.location.pathname}${nextSearch ? `?${nextSearch}` : ''}${window.location.hash || ''}`;\n window.history.replaceState(null, '', nextUrl);\n\n const existingProject = localStorage.getItem(LOCAL_STORAGE_KEY);\n if (!existingProject) {\n restoreSnapshot(FIVE_PANEL_SAMPLE_PROJECT);\n setSaveStatus('loaded');\n setTimeout(() => setSaveStatus(''), 2000);\n addToast({ type: 'success', message: t('app.data.sampleLoaded') });\n trackEvent('sample_project_loaded', { source: 'url_param_auto' });\n return;\n }\n\n // Avoid stacking confirm dialogs when the visitor arrived via a pricing/upgrade link.\n // If they already have a saved project, keep it and let them load the sample from the UI when needed.\n if (hadUpgradeParamRef.current) return;\n\n loadSampleProject('url_param');\n }, [addToast, loadSampleProject, restoreSnapshot, t]);\n\n const hasProcessedSampleWelcomePromptRef = useRef(false);\n useEffect(() => {\n if (hasProcessedSampleWelcomePromptRef.current) return;\n hasProcessedSampleWelcomePromptRef.current = true;\n if (typeof window === 'undefined') return;\n\n const params = new URLSearchParams(window.location.search);\n if (params.get('session_id')) return;\n if (params.get('project')) return;\n if (params.get('sample')) return;\n if (params.get('upgrade')) return;\n\n let existingProject = null;\n try {\n existingProject = localStorage.getItem(LOCAL_STORAGE_KEY);\n } catch {\n return;\n }\n if (existingProject) return;\n\n try {\n if (localStorage.getItem(SAMPLE_WELCOME_PROMPT_STORAGE_KEY) === '1') return;\n localStorage.setItem(SAMPLE_WELCOME_PROMPT_STORAGE_KEY, '1');\n } catch {\n return;\n }\n\n trackEvent('sample_prompt_shown', { source: 'app_start' });\n setConfirmDialog({\n title: t('app.data.sampleWelcomeTitle', { defaultValue: 'Quick start' }),\n message: t('app.data.sampleWelcomeBody', {\n defaultValue: 'New here? Load a sample project to see the workflow (recommended).',\n }),\n cancelLabel: t('app.data.sampleWelcomeBlank', { defaultValue: 'Start blank' }),\n confirmLabel: t('app.data.sampleWelcomeLoad', { defaultValue: 'Load sample' }),\n onCancel: () => trackEvent('sample_prompt_dismissed', { source: 'app_start' }),\n onConfirm: () => {\n restoreSnapshot(FIVE_PANEL_SAMPLE_PROJECT);\n setSaveStatus('loaded');\n setTimeout(() => setSaveStatus(''), 2000);\n addToast({ type: 'success', message: t('app.data.sampleLoaded') });\n trackEvent('sample_project_loaded', { source: 'welcome_prompt' });\n },\n });\n }, [addToast, restoreSnapshot, setConfirmDialog, t]);\n\n const currentFontFamily = fontOptions.find(f => f.value === selectedFont)?.family || 'sans-serif';\n const statusMessage = saveStatus ? t(`app.statuses.${saveStatus}`) : '';\n\r\n const previewContainerRef = useRef(null);\n const isExportOverlayActive = isDownloading && downloadProgress.total > 0;\n\r\n const centerPan = useCallback(() => {\r\n // Grid centering handles baseline alignment; reset pan to center.\r\n setPan({ x: 0, y: 0 });\r\n }, []);\r\n\r\n const isBatchView = viewMode === 'batch';\n const batchViewDeviceIds = (() => {\n if (!isBatchView) return selectedBatchDevices;\n if (isPro || isCliMode) return selectedBatchDevices;\n const ids = Array.isArray(selectedBatchDevices) ? selectedBatchDevices : [];\n const idSet = new Set(ids);\n const current = idSet.has(deviceId) ? deviceId : null;\n const ios = [];\n const android = [];\n ids.forEach((id) => {\n const group = String(DEVICE_LIBRARY[id]?.group || '').toLowerCase();\n if (group.includes('android')) android.push(id);\n else ios.push(id);\n });\n const next = [];\n const currentGroup = current ? String(DEVICE_LIBRARY[current]?.group || '').toLowerCase() : '';\n const preferAndroid = current ? currentGroup.includes('android') : false;\n const preferredIos = current && !preferAndroid ? current : ios[0];\n const preferredAndroid = current && preferAndroid ? current : android[0];\n if (preferredIos) next.push(preferredIos);\n if (preferredAndroid && preferredAndroid !== preferredIos) next.push(preferredAndroid);\n if (!next.length && ids.length) next.push(ids[0]);\n return next;\n })();\n\n const handlePanTouchStart = (e) => {\n if (isBatchView) return;\n if (e.touches.length !== 1) return;\n const touch = e.touches[0];\n setIsPanning(true);\n panStartRef.current = { x: touch.clientX - pan.x, y: touch.clientY - pan.y };\n };\n\n const handlePanTouchMove = (e) => {\n if (isBatchView || !isPanning) return;\n e.preventDefault();\n const touch = e.touches[0];\n const damping = isMobile ? 0.85 : 1;\n const newX = (touch.clientX - panStartRef.current.x) * damping;\n const newY = (touch.clientY - panStartRef.current.y) * damping;\n setPan({ x: newX, y: newY });\r\n };\r\n\r\n const handlePanTouchEnd = () => setIsPanning(false);\r\n\r\n const toggleControlsPanel = () => setIsControlsOpen((prev) => !prev);\r\n const controlsVisible = !isMobile || isControlsOpen;\r\n const controlsTranslation = isMobile ? (controlsVisible ? Math.min(controlsDragOffset, 240) : 520) : 0;\r\n\r\n const handleControlsTouchStart = (e) => {\r\n if (!isMobile) return;\r\n controlsTouchStartRef.current = e.touches[0]?.clientY || 0;\r\n setIsControlsDragging(true);\r\n };\r\n\r\n const handleControlsTouchMove = (e) => {\r\n if (!isMobile || !isControlsDragging) return;\r\n const delta = (e.touches[0]?.clientY || 0) - controlsTouchStartRef.current;\r\n setControlsDragOffset(Math.max(0, delta));\r\n };\r\n\r\n const handleControlsTouchEnd = () => {\r\n if (!isMobile) {\r\n setControlsDragOffset(0);\r\n setIsControlsDragging(false);\r\n return;\r\n }\r\n if (controlsDragOffset > 80) {\r\n setIsControlsOpen(false);\r\n }\r\n setControlsDragOffset(0);\r\n setIsControlsDragging(false);\r\n };\r\n\r\n const handlePanMouseDown = (e) => {\n if (isBatchView) return;\n e.preventDefault();\n setIsPanning(true);\n panStartRef.current = { x: e.clientX - pan.x, y: e.clientY - pan.y };\n };\n\n const handlePanMouseMove = (e) => {\n if (isBatchView || !isPanning) return;\n e.preventDefault();\n const newX = e.clientX - panStartRef.current.x;\n const newY = e.clientY - panStartRef.current.y;\n setPan({ x: newX, y: newY });\n };\n\r\n const handlePanMouseUp = () => setIsPanning(false);\r\n\r\n useEffect(() => {\n // layout計測後に中央寄せを再計算\n requestAnimationFrame(() => centerPan());\n }, [viewMode, deviceId, orientation, previewZoom, canvasWidth, centerPan]);\n useEffect(() => {\n if (isBatchView) {\n setPan({ x: 0, y: 0 });\n setIsPanning(false);\n }\n }, [isBatchView]);\n\r\n return (\r\n <div className=\"h-screen bg-gray-100 font-sans flex flex-col overflow-hidden text-slate-800 relative\">\r\n <StagingBadge />\r\n {isPastDue && (\r\n <div className=\"mx-4 md:mx-6 lg:mx-10 mt-2 bg-amber-100 border border-amber-200 text-amber-800 text-sm rounded-lg px-4 py-3 flex items-center gap-3 justify-between\">\r\n <span className=\"leading-snug\">\r\n 決済に問題があります。Pro機能を継続するにはカード情報を更新してください。\r\n </span>\r\n <button\r\n onClick={handleManageSubscription}\r\n className=\"shrink-0 px-3 py-1.5 bg-amber-500 text-white text-xs font-semibold rounded hover:bg-amber-600 transition\"\r\n >\r\n カードを更新\r\n </button>\r\n </div>\r\n )}\n {/* Upgrade Modal */}\n <UpgradeModal isOpen={showUpgradeModal} onClose={() => setShowUpgradeModal(false)} onUpgrade={handleUpgrade} />\n <CiQuickstartModal isOpen={showCiQuickstartModal} onClose={() => setShowCiQuickstartModal(false)} />\n\n <ProgressOverlay\n show={isDownloading && downloadProgress.total > 0}\n current={downloadProgress.current}\n total={downloadProgress.total}\n label={downloadDetail}\n onCancel={isDownloading ? handleCancelExport : null}\n />\n\n {checkoutStatus && (\n <div className={`absolute top-0 left-0 right-0 z-50 border-b text-sm text-center py-2 px-4 flex flex-wrap items-center justify-center gap-3 shadow-md ${\n checkoutStatus === 'success'\n ? 'bg-green-50 border-green-100 text-green-800'\n : checkoutStatus === 'pending'\n ? 'bg-amber-50 border-amber-100 text-amber-800'\n : checkoutStatus === 'retry'\n ? 'bg-amber-50 border-amber-100 text-amber-800'\r\n : 'bg-blue-50 border-blue-100 text-blue-800'\r\n }`}>\r\n <span>\r\n {checkoutStatus === 'success' && t('app.checkout.success')}\r\n {checkoutStatus === 'pending' && t('app.checkout.pending', { count: checkoutAttempts })}\r\n {checkoutStatus === 'retry' && t('app.checkout.retry')}\r\n {checkoutStatus === 'signin' && t('app.checkout.signin')}\r\n </span>\r\n {(checkoutStatus === 'pending' || checkoutStatus === 'retry') && (\r\n <button onClick={retryCheckoutStatus} className=\"px-3 py-1.5 rounded-full border border-amber-200 bg-white text-xs font-semibold text-amber-700 hover:bg-amber-100\">\r\n Check status again\r\n </button>\r\n )}\r\n {checkoutStatus === 'signin' && !isAuthenticated && (\r\n <button onClick={handleSignIn} className=\"px-3 py-1.5 rounded-full border border-blue-200 bg-white text-xs font-semibold text-blue-700 hover:bg-blue-100\">\r\n {t('auth.actions.signIn')}\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n {sessionExpired && (\r\n <div className=\"bg-amber-50 border-b border-amber-100 text-amber-800 text-sm text-center py-2 px-4 flex items-center justify-center gap-3\">\r\n <span>{t('app.sessionExpired.message')}</span>\r\n <button onClick={handleSignIn} className=\"px-3 py-1.5 rounded-full border border-amber-200 bg-white text-xs font-semibold text-amber-700 hover:bg-amber-100\">\r\n {t('auth.actions.signIn')}\r\n </button>\r\n <button onClick={() => setSessionExpired(false)} className=\"px-2 py-1 rounded-full text-xs text-amber-700 hover:bg-amber-100\">\r\n {t('app.sessionExpired.dismiss')}\r\n </button>\r\n </div>\r\n )}\r\n\r\n {/* Header */}\r\n <header className=\"bg-white border-b border-slate-200 flex flex-wrap items-center justify-between gap-3 px-4 sm:px-8 py-3 shrink-0 z-20\">\r\n <div className=\"flex items-center gap-3 min-w-0\">\n <div className=\"w-8 h-8 rounded-lg border border-slate-200 bg-slate-950 p-1 flex items-center justify-center overflow-hidden shadow-sm\">\n <img\n src=\"/app/assets/icons/favicon-32x32.png?v=3\"\n alt=\"ShipScreens\"\n className=\"w-full h-full object-contain\"\n loading=\"lazy\"\n />\n </div>\n <h1 className=\"font-bold text-lg text-slate-900 hidden sm:flex items-center gap-2\">\r\n ShipScreens\r\n {isPro && (\r\n <span className=\"px-1.5 py-0.5 rounded text-[10px] font-black bg-amber-100 text-amber-700 border border-amber-200 tracking-wider\">\r\n PRO\r\n </span>\r\n )}\r\n </h1>\r\n <div className=\"ml-4 flex bg-slate-100 rounded-lg p-1\">\n <button onClick={() => setViewMode('single')} className={`flex items-center gap-2 px-3 py-1.5 rounded-md text-xs font-bold transition-all ${viewMode === 'single' ? 'bg-white text-blue-600 shadow-sm' : 'text-slate-500 hover:text-slate-700'}`}><Monitor size={14} /> {t('app.header.editor')}</button>\n <button\n onClick={() => {\n setViewMode('batch');\n if (!isPro && !isCliMode) {\n trackEvent('free_bundle_preview_opened', { surface: 'header_toggle' });\n }\n }}\n className={`flex items-center gap-2 px-3 py-1.5 rounded-md text-xs font-bold transition-all ${viewMode === 'batch' ? 'bg-white text-blue-600 shadow-sm' : 'text-slate-500 hover:text-slate-700'}`}\n >\n <Grid size={14} /> {t('app.header.batch')}\n {!isPro && !isCliMode && (\n <span className=\"ml-1 px-1.5 py-0.5 rounded bg-slate-200 text-slate-700 text-[10px] font-black tracking-wide\">\n {t('app.batch.freePreview.badge', { defaultValue: 'Free preview' })}\n </span>\n )}\n </button>\n </div>\n </div>\n <div className=\"flex items-center gap-2 sm:gap-4 flex-wrap justify-end min-w-[220px]\">\n <a\n href=\"https://x.com/shipscreenscom\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"p-2 rounded-full border border-slate-200 text-slate-600 hover:bg-slate-50\"\n aria-label=\"ShipScreens on X (opens in new tab)\"\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path d=\"M20.5 3h-2.4L12 9.6 6.9 3H3l7.2 9.1L3.2 21h2.4L12 14l6.6 7h3.1l-7.7-9.5L20.5 3Z\" />\n </svg>\n </a>\n <a\n href=\"/tools/\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"hidden lg:inline text-xs font-semibold text-slate-600 hover:text-slate-900 transition-colors\"\n >\n {t('landing.nav.tools')}\n </a>\n <button\n type=\"button\"\n onClick={() => {\n setShowCiQuickstartModal(true);\n trackEvent('ci_quickstart_opened', { surface: 'app_header' });\n }}\n className=\"md:hidden p-2 rounded-full border border-slate-200 text-slate-600 hover:bg-slate-50\"\n aria-label={t('app.header.ciQuickstart', { defaultValue: 'CI quickstart' })}\n title={t('app.header.ciQuickstart', { defaultValue: 'CI quickstart' })}\n >\n <Info size={14} />\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setShowCiQuickstartModal(true);\n trackEvent('ci_quickstart_opened', { surface: 'app_header' });\n }}\n className=\"hidden md:flex items-center gap-2 px-3 py-1.5 bg-slate-50 text-slate-700 rounded-full text-xs font-bold hover:bg-slate-100 transition-colors border border-slate-200\"\n >\n <Info size={14} />\n {t('app.header.ciQuickstart', { defaultValue: 'CI quickstart' })}\n </button>\n <div className=\"flex items-center gap-1\">\n <button\n onClick={undo}\n disabled={history.past.length === 0}\n className=\"p-2 rounded-full border border-slate-200 text-slate-600 hover:bg-slate-50 disabled:opacity-40 disabled:cursor-not-allowed\"\n title=\"Undo (Ctrl/Cmd + Z)\"\r\n >\r\n <RotateCcw size={14} />\r\n </button>\r\n <button\r\n onClick={redo}\r\n disabled={history.future.length === 0}\r\n className=\"p-2 rounded-full border border-slate-200 text-slate-600 hover:bg-slate-50 disabled:opacity-40 disabled:cursor-not-allowed\"\r\n title=\"Redo (Ctrl/Cmd + Shift + Z)\"\r\n >\r\n <RotateCw size={14} />\r\n </button>\r\n </div>\r\n <LanguageSwitcher />\r\n {!isAuthenticated && (\r\n <div className=\"flex items-center gap-2\">\r\n <button onClick={handleSignIn} disabled={authLoading} className=\"px-3 py-1.5 rounded-full border border-slate-200 text-xs font-semibold text-slate-700 hover:bg-slate-50 disabled:opacity-50\">{t('auth.actions.signIn')}</button>\r\n <button onClick={handleSignUp} disabled={authLoading} className=\"px-3 py-1.5 rounded-full border border-blue-200 bg-blue-50 text-xs font-semibold text-blue-700 hover:bg-blue-100 disabled:opacity-50\">{t('auth.actions.signUp')}</button>\r\n </div>\r\n )}\r\n {isAuthenticated && (\n <UserMenu\n user={user}\n isPro={isPro}\n onUpgrade={() => openUpgradeModal('user_menu')}\n onManageSubscription={handleManageSubscription}\n onSignOut={handleSignOut}\n isPortalLoading={isPortalLoading}\n />\n )}\n <button onClick={handleShare} className=\"hidden md:flex items-center gap-2 px-3 py-1.5 bg-slate-50 text-slate-700 rounded-full text-xs font-bold hover:bg-slate-100 transition-colors border border-slate-200\"><Share2 size={14} /> {t('app.header.share')}</button>\n {!isPro && <button onClick={() => openUpgradeModal('header_button')} className=\"hidden md:flex items-center gap-2 px-3 py-1.5 bg-amber-100 text-amber-700 rounded-full text-xs font-bold hover:bg-amber-200 transition-colors\"><Crown size={14} /> {t('app.header.upgrade')}</button>}\n <button onClick={() => viewMode === 'single' ? handleDownload(document.getElementById('single-canvas') || containerRef.current, `${currentLocaleId}_${deviceId}_${activeSlideIndex + 1}.png`) : handleBatchDownload()} disabled={isDownloading} className={`px-4 py-2 text-white rounded-lg font-semibold shadow-lg hover:scale-[1.02] active:scale-[0.98] transition-all flex items-center justify-center gap-2 disabled:opacity-70 disabled:cursor-not-allowed text-sm ${viewMode === 'batch' ? 'bg-gradient-to-r from-blue-600 to-indigo-600 shadow-blue-500/30' : 'bg-slate-900 shadow-slate-900/10 hover:bg-slate-800'}`}>\n {isDownloading && downloadProgress.total === 0 ? <Loader2 size={16} className=\"animate-spin\" /> : (viewMode === 'batch' ? <Box size={16} /> : <Download size={16} />)}\n <span className=\"hidden sm:inline\">\n {viewMode === 'single' ? (isPro ? t('app.header.downloadPro') : t('app.header.downloadWatermark')) : t('app.header.exportBundle')}\n </span>\n </button>\n </div>\n </header>\n\r\n <div className=\"flex-1 flex flex-col md:flex-row overflow-hidden relative\">\r\n {isMobile && controlsVisible && (\r\n <div\r\n className=\"fixed inset-0 bg-black/40 backdrop-blur-[1px] z-[110]\"\r\n onClick={() => setIsControlsOpen(false)}\r\n ></div>\r\n )}\r\n \r\n {/* Icon Sidebar (responsive: bottom bar on mobile, left rail on desktop) */}\r\n <div className={`w-full md:w-16 h-16 md:h-full bg-white border-t md:border-t-0 md:border-r border-slate-200 flex flex-row md:flex-col items-center justify-around md:justify-start py-2 md:py-4 shrink-0 z-30 order-last md:order-first transition-opacity ${isExportOverlayActive ? 'opacity-0 pointer-events-none' : ''}`}>\n <button onClick={() => setActiveTab('edit')} className={`p-3 rounded-xl md:mb-2 transition-all ${activeTab === 'edit' ? 'bg-blue-50 text-blue-600' : 'text-slate-400 hover:bg-slate-50'}`} title={t('app.tabs.edit')}><Edit3 size={20} /></button>\n <button onClick={() => setActiveTab('style')} className={`p-3 rounded-xl md:mb-2 transition-all ${activeTab === 'style' ? 'bg-blue-50 text-blue-600' : 'text-slate-400 hover:bg-slate-50'}`} title={t('app.tabs.style')}><PaintBucket size={20} /></button>\n <button onClick={() => setActiveTab('templates')} className={`p-3 rounded-xl md:mb-2 transition-all ${activeTab === 'templates' ? 'bg-blue-50 text-blue-600' : 'text-slate-400 hover:bg-slate-50'}`} title={t('app.tabs.templates')}><LayoutTemplate size={20} /></button>\n <button onClick={() => setActiveTab('data')} className={`p-3 rounded-xl md:mb-2 transition-all ${activeTab === 'data' ? 'bg-blue-50 text-blue-600' : 'text-slate-400 hover:bg-slate-50'}`} title={t('app.tabs.data')}><Database size={20} /></button>\n </div>\n\r\n {/* Extended Controls Panel */}\r\n <div className={`${isExportOverlayActive ? 'pointer-events-none opacity-0' : ''} transition-opacity`}>\n <ControlsPanel\n activeTab={activeTab}\n viewMode={viewMode}\n isMobile={isMobile}\n controlsVisible={controlsVisible}\n controlsTranslation={controlsTranslation}\n isControlsDragging={isControlsDragging}\n currentHeaderText={currentHeaderText}\n currentSubText={currentSubText}\n currentLocaleId={currentLocaleId}\n updateSlideText={updateSlideText}\n currentScreenshot={currentUploadScreenshot}\n screenshotUploadScope={screenshotUploadScope}\n setScreenshotUploadScope={setScreenshotUploadScope}\n hasCurrentLocaleScreenshotOverride={hasCurrentLocaleScreenshotOverride}\n currentSlideScreenshotsByLocale={currentSlideScreenshotsByLocale}\n currentSlideLocaleScreenshotOverrideCount={currentSlideLocaleScreenshotOverrideCount}\n hasAnyLocaleScreenshotOverrides={hasAnyLocaleScreenshotOverrides}\n hasSharedScreenshot={hasSharedScreenshot}\n clearCurrentSlideScreenshot={() => clearSlideScreenshotAt(activeSlideIndex)}\n clearAllCurrentSlideLocaleScreenshotOverrides={() => clearAllLocaleScreenshotOverridesAt(activeSlideIndex)}\n handleFileChange={handleFileChange}\n fileInputRef={fileInputRef}\n handleDropWrapper={handleDropWrapper}\r\n handleDragOver={handleDragOver}\r\n handleDragEnter={handleDragEnter}\r\n handleDragLeave={handleDragLeave}\n isDragging={isDragging}\n locales={locales}\n setCurrentLocaleId={handleLocaleChange}\n removeLocale={removeLocale}\n handleAddLocales={handleAddLocales}\n deviceId={deviceId}\n setDeviceId={handleDeviceChange}\n deviceLabelMode={deviceLabelMode}\n setDeviceLabelMode={setDeviceLabelMode}\n exportStructureMode={exportStructureMode}\n setExportStructureMode={setExportStructureMode}\n teamSyncEnabled={teamSyncEnabled}\n teamSyncToken={user?.token || null}\n captureTeamSpec={captureTeamSpec}\n applyTeamSpec={applyTeamSpec}\n orientation={orientation}\n setOrientation={setOrientation}\n isWatchSelected={isWatchSelected}\n applyTheme={applyTheme}\n bgType={bgType}\r\n setBgType={setBgType}\r\n bgInputRef={bgInputRef}\r\n handleBgDropWrapper={handleBgDropWrapper}\r\n handleBgDragOver={handleBgDragOver}\r\n handleBgDragEnter={handleBgDragEnter}\r\n handleBgDragLeave={handleBgDragLeave}\r\n isBgDragging={isBgDragging}\r\n handleBgFileChange={handleBgFileChange}\r\n bgBlur={bgBlur}\r\n setBgBlur={setBgBlur}\r\n bgOpacity={bgOpacity}\r\n setBgOpacity={setBgOpacity}\r\n bgColor={bgColor}\r\n setBgColor={setBgColor}\r\n gradientStart={gradientStart}\r\n setGradientStart={setGradientStart}\r\n gradientEnd={gradientEnd}\r\n setGradientEnd={setGradientEnd}\r\n frameColor={frameColor}\r\n setFrameColor={setFrameColor}\r\n logoImage={logoImage}\r\n logoInputRef={logoInputRef}\r\n handleLogoDropWrapper={handleLogoDropWrapper}\r\n handleLogoDragOver={handleLogoDragOver}\n handleLogoDragEnter={handleLogoDragEnter}\n handleLogoDragLeave={handleLogoDragLeave}\n isLogoDragging={isLogoDragging}\n handleLogoFileChange={handleLogoFileChange}\n handleLogoRemove={handleLogoRemove}\n overrideActive={overrideActive}\n ensureSlideOverride={ensureSlideOverride}\n clearSlideOverride={clearSlideOverride}\n updateSlideOverride={updateSlideOverride}\n layoutMode={layoutMode}\n setLayoutMode={setLayoutMode}\r\n effectiveLayoutMode={effectiveLayoutMode}\r\n selectedFont={selectedFont}\r\n setSelectedFont={setSelectedFont}\r\n fontOptions={fontOptions}\n textColor={textColor}\n setTextColor={setTextColor}\n recentColors={recentColors}\n addRecentColor={addRecentColor}\n effectiveTopSpacing={effectiveTopSpacing}\n setTopSpacing={setTopSpacing}\n effectiveDeviceScale={effectiveDeviceScale}\n setDeviceScale={setDeviceScale}\n badgeType={badgeType}\r\n setBadgeType={setBadgeType}\r\n applyPreset={applyPreset}\r\n myPresets={myPresets}\r\n requirePro={requirePro}\r\n openSavePresetDialog={openSavePresetDialog}\r\n deleteUserPreset={deleteUserPreset}\r\n isPro={isPro}\r\n storageUsage={storageUsage}\r\n saveProject={saveProject}\r\n loadProject={loadProject}\n loadSampleProject={loadSampleProject}\n setConfirmDialog={setConfirmDialog}\n saveStatus={saveStatus}\n statusMessage={statusMessage}\n handleExportJSON={handleExportJSON}\n jsonInputRef={jsonInputRef}\r\n handleImportJSON={handleImportJSON}\r\n isJsonDragging={isJsonDragging}\r\n handleJsonDragOver={handleJsonDragOver}\r\n handleJsonDragEnter={handleJsonDragEnter}\r\n handleJsonDragLeave={handleJsonDragLeave}\r\n handleJsonDropWrapper={handleJsonDropWrapper}\r\n isCsvDragging={isCsvDragging}\r\n handleCsvDropWrapper={handleCsvDropWrapper}\r\n handleCsvDragOver={handleCsvDragOver}\n handleCsvDragEnter={handleCsvDragEnter}\n handleCsvDragLeave={handleCsvDragLeave}\n openCsvTemplateDialog={openCsvTemplateDialog}\n csvInputRef={csvInputRef}\n handleCsvImport={handleCsvImport}\n onImportLocaleScreenshots={startLocaleScreenshotImport}\n selectedBatchDevices={selectedBatchDevices}\n setSelectedBatchDevices={setSelectedBatchDevices}\n toggleBatchDevice={toggleBatchDevice}\n onTouchStart={handleControlsTouchStart}\n onTouchMove={handleControlsTouchMove}\n onTouchEnd={handleControlsTouchEnd}\n />\n </div>\n\r\n{/* Canvas Area */}\r\n <div\n ref={canvasWrapperRef}\n className={`${isMobile ? 'h-full' : 'h-1/2'} md:h-full flex-1 md:flex-auto bg-slate-200/50 relative overflow-visible flex flex-col order-1 md:order-none border-b md:border-b-0 border-slate-200`}\n style={{ minHeight: 0, ...(isBatchView ? { touchAction: 'auto' } : {}) }}\n >\n <div className=\"w-full flex justify-end pointer-events-none\">\n <div className={`fixed top-20 right-8 z-[400] flex flex-col items-end gap-1 pointer-events-auto transition-opacity ${isExportOverlayActive ? 'opacity-0 pointer-events-none' : ''}`}>\n <div className=\"flex items-center gap-3 bg-white/90 backdrop-blur shadow-sm border border-slate-200 rounded-full px-4 py-2\">\n <ZoomIn size={14} className=\"text-slate-400\" />\n <input type=\"range\" min=\"0.05\" max=\"1.0\" step=\"0.05\" value={previewZoom} onChange={(e) => setPreviewZoom(parseFloat(e.target.value))} className=\"w-24 accent-slate-800 h-1.5 bg-slate-200 rounded-lg appearance-none cursor-pointer\" />\n <span className=\"text-xs font-mono text-slate-500 w-8\">{Math.round(previewZoom * 100)}%</span>\n {viewMode === 'single' && (\n <button onClick={centerPan} className=\"text-[10px] text-blue-600 font-bold hover:underline px-2 border-l border-slate-200 ml-1\">\n {t('app.canvas.center')}\n </button>\n )}\n </div>\n </div>\n </div>\n\r\n <div className=\"flex-1 w-full flex flex-col overflow-visible\" style={{ minHeight: 0 }}>\n <div\n className=\"flex-1 w-full pb-48\"\n style={{\n overflowY: isBatchView ? 'auto' : 'auto',\n overflowX: 'hidden',\n }}\n >\n <div\n className=\"flex flex-col items-center gap-12 p-12\"\n style={{\n touchAction: isBatchView ? 'auto' : 'pan-y pinch-zoom',\n }}\n >\n <div\n className=\"grid place-items-center w-full pb-12 overflow-visible\"\n ref={previewContainerRef}\n onMouseDown={isBatchView ? undefined : handlePanMouseDown}\n onMouseMove={isBatchView ? undefined : handlePanMouseMove}\n onMouseUp={isBatchView ? undefined : handlePanMouseUp}\n onMouseLeave={isBatchView ? undefined : handlePanMouseUp}\n onTouchStart={isBatchView ? undefined : handlePanTouchStart}\n onTouchMove={isBatchView ? undefined : handlePanTouchMove}\n onTouchEnd={isBatchView ? undefined : handlePanTouchEnd}\n onTouchCancel={isBatchView ? undefined : handlePanTouchEnd}\n style={{\n cursor: isBatchView ? 'default' : isPanning ? 'grabbing' : 'grab',\n userSelect: 'none',\n touchAction: isBatchView ? 'auto' : 'none',\n }}\n >\n {viewMode === 'single' && (\r\n <div\r\n style={{\r\n width: canvasWidth * previewZoom,\r\n height: canvasHeight * previewZoom,\r\n flexShrink: 0,\r\n marginLeft: 'auto',\r\n marginRight: 'auto',\r\n }}\r\n >\r\n <div\r\n style={{\r\n transform: `translate(${pan.x}px, ${pan.y}px) scale(${previewZoom})`,\r\n transformOrigin: 'top left',\r\n width: canvasWidth,\r\n height: canvasHeight,\r\n transition: isPanning ? 'none' : 'transform 0.1s ease-out',\r\n willChange: 'transform',\r\n }}\r\n >\r\n <MockupCanvas \r\n id=\"single-canvas\" deviceId={deviceId} orientation={effectiveOrientation} deviceScale={effectiveDeviceScale} topSpacing={effectiveTopSpacing} layoutMode={effectiveLayoutMode} \r\n bgType={bgType} bgColor={bgColor} gradientStart={gradientStart} gradientEnd={gradientEnd} gradientAngle={gradientAngle} bgImage={bgImage} bgBlur={bgBlur} bgOpacity={bgOpacity}\r\n headerText={currentHeaderText} subHeaderText={currentSubText} textColor={textColor} headerSize={headerSize} subHeaderSize={subHeaderSize} selectedFont={currentFontFamily} badgeType={badgeType} screenshot={currentScreenshot} logoImage={logoImage} frameColor={frameColor} isPro={isPro} \r\n />\r\n </div>\r\n </div>\r\n )}\r\n {/* Batch Mode: タイル状に並べる */}\n {viewMode === 'batch' && (\n <div \n style={{ \n transform: isBatchView ? undefined : `translate(${pan.x}px, ${pan.y}px)`,\n transition: isBatchView || isPanning ? 'none' : 'transform 0.1s ease-out',\n willChange: isBatchView ? undefined : 'transform'\n }} \n className=\"flex flex-wrap justify-center items-start content-start py-10\"\n >\n {!isPro && !isCliMode && (\n <div className=\"w-full px-4 pb-6\">\n <div className=\"max-w-3xl mx-auto rounded-2xl border border-amber-200 bg-amber-50 text-amber-900 p-4 flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3\">\n <div className=\"space-y-1\">\n <div className=\"text-sm font-black\">{t('app.batch.freePreview.title', { defaultValue: 'Free bundle preview' })}</div>\n <div className=\"text-xs text-amber-800\">\n {t('app.batch.freePreview.body', {\n defaultValue:\n 'Limited to 1 locale × 5 slides × 1 iOS + 1 Android device (watermarked). Upgrade for full matrix exports.',\n })}\n </div>\n </div>\n <button\n type=\"button\"\n onClick={() => openUpgradeModal('free_bundle_banner')}\n className=\"inline-flex items-center justify-center gap-2 px-4 py-2 rounded-xl bg-white text-amber-900 border border-amber-200 text-xs font-bold hover:bg-amber-100 transition\"\n >\n {t('app.batch.freePreview.cta', { defaultValue: 'Upgrade' })}\n </button>\n </div>\n </div>\n )}\n {batchViewDeviceIds.map(id => {\n const devDef = DEVICE_LIBRARY[id];\n const effOrientation = devDef?.type === 'watch' ? 'portrait' : orientation;\n const isDevWatch = devDef?.type === 'watch';\n const devHeaderSize = isDevWatch ? lastWatchHeaderSize : lastNonWatchHeaderSize;\n const devSubHeaderSize = isDevWatch ? lastWatchSubHeaderSize : lastNonWatchSubHeaderSize;\n const devTopSpacing = isDevWatch ? lastWatchTopSpacing : lastNonWatchTopSpacing;\n \n const { canvasWidth, canvasHeight } = calculateLayoutStyles({\n deviceId: id,\n orientation: effOrientation,\n deviceScale: deviceScale,\n topSpacing: devTopSpacing,\n layoutMode: layoutMode,\n isBatchMode: true\n });\n\n const scaledWidth = canvasWidth * previewZoom;\n const scaledHeight = canvasHeight * previewZoom;\r\n\r\n return (\r\n <div key={id} className=\"flex flex-col items-center m-4 group\">\r\n <div className=\"mb-2\">\n <span className=\"text-xs font-bold text-slate-500 uppercase tracking-widest bg-white/90 px-3 py-1 rounded-full shadow-sm border border-slate-100 whitespace-nowrap\">\n {getDeviceLabelParts(DEVICE_LIBRARY[id], { id, mode: deviceLabelMode }).optionLabel}\n </span>\n </div>\n \n <div style={{ width: scaledWidth, height: scaledHeight }}>\n <div style={{ \r\n transform: `scale(${previewZoom})`, \r\n transformOrigin: 'top left',\r\n width: canvasWidth,\r\n height: canvasHeight\r\n }}>\r\n <div id={`batch-canvas-${id}`}>\r\n <MockupCanvas \r\n id={`canvas-${id}`} \r\n deviceId={id} \r\n orientation={effOrientation} \n deviceScale={deviceScale} \n topSpacing={devTopSpacing} \n layoutMode={layoutMode} \n bgType={bgType} \n bgColor={bgColor} \n gradientStart={gradientStart} \n gradientEnd={gradientEnd} \n gradientAngle={gradientAngle} \n bgImage={bgImage} \n bgBlur={bgBlur} \n bgOpacity={bgOpacity}\n headerText={currentHeaderText} \n subHeaderText={currentSubText} \n textColor={textColor} \n headerSize={devHeaderSize} \n subHeaderSize={devSubHeaderSize} \n selectedFont={currentFontFamily} \n badgeType={badgeType} \n screenshot={currentScreenshot} \n logoImage={logoImage} \n frameColor={frameColor} \n isBatchMode={true} \r\n isPro={isPro} \r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n\n <input\n type=\"file\"\n ref={storyboardFileInputRef}\n className=\"hidden\"\n accept=\"image/*\"\n onChange={handleStoryboardFileChange}\n />\n\n <Storyboard\n slides={slides}\n activeSlideIndex={activeSlideIndex}\n setActiveSlideIndex={setActiveSlideIndex}\n currentLocaleId={currentLocaleId}\n addSlide={addSlide}\n removeSlide={removeSlide}\n onApplyFileToSlide={setSlideSharedScreenshotFromFile}\n onOpenFilePickerForSlide={openStoryboardFilePickerForSlide}\n validateImageFile={validateImageFile}\n onAddSlidesFromFiles={addSlidesFromFiles}\n />\n </div>\n\r\n </div>\r\n </div>\r\n\r\n {presetDialog && (\n <div\n className=\"fixed inset-0 z-[1250] bg-black/40 backdrop-blur-sm flex items-center justify-center px-4\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={t('app.templates.saveCurrent')}\n onMouseDown={(event) => {\n if (event.target === event.currentTarget) closePresetDialog();\n }}\n >\n <div ref={presetDialogPanelRef} className=\"bg-white rounded-xl shadow-xl border border-slate-200 w-full max-w-sm p-5 space-y-4\">\n <h3 className=\"text-base font-semibold text-slate-800\">{t('app.templates.saveCurrent')}</h3>\n <div className=\"space-y-2\">\n <label className=\"block text-xs font-medium text-slate-600\" htmlFor=\"preset-name-input\">\n {t('app.prompts.presetName')}\n </label>\n <input\n id=\"preset-name-input\"\n ref={presetNameInputRef}\n value={presetDialog.value}\n onChange={(e) => setPresetDialog({ value: e.target.value })}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && presetDialog.value.trim()) {\n confirmSaveUserPreset();\n }\n if (e.key === 'Escape') {\n closePresetDialog();\n }\n }}\n placeholder={t('app.prompts.presetDefault')}\n className=\"w-full rounded-lg border border-slate-300 px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n autoFocus\n />\n </div>\n <div className=\"flex justify-end gap-2\">\n <button\n className=\"px-3 py-1.5 text-sm rounded-lg border border-slate-200 text-slate-600 hover:bg-slate-50\"\n onClick={closePresetDialog}\n >\n {t('auth.actions.cancel') || 'Cancel'}\n </button>\n <button\n disabled={!presetDialog.value.trim()}\n className=\"px-3 py-1.5 text-sm rounded-lg bg-blue-600 text-white hover:bg-blue-700 disabled:opacity-60 disabled:cursor-not-allowed\"\r\n onClick={confirmSaveUserPreset}\r\n >\r\n {t('app.header.confirm') || 'OK'}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n\r\n {isMobile && (\r\n <>\r\n {controlsVisible && (\r\n <div\r\n className=\"fixed inset-0 z-[90] bg-black/20 backdrop-blur-[1px] md:hidden\"\r\n onClick={() => setIsControlsOpen(false)}\r\n />\r\n )}\r\n <button\r\n onClick={toggleControlsPanel}\r\n className=\"fixed bottom-20 right-4 z-[110] md:hidden px-4 py-2 rounded-full shadow-lg bg-white border border-slate-200 text-sm font-semibold text-slate-700 flex items-center gap-2\"\r\n >\r\n <Settings size={16} />\r\n {controlsVisible ? t('app.mobile.closeControls') : t('app.mobile.openControls')}\r\n </button>\r\n </>\r\n )}\r\n\r\n <footer className=\"border-t border-slate-200 bg-white text-[11px] text-slate-500 py-3 px-4 md:px-8 flex flex-col md:flex-row items-center justify-between gap-2\">\r\n <span className=\"font-medium\">© {new Date().getFullYear()} ShipScreens</span>\r\n <div className=\"flex items-center gap-3\">\r\n <a href=\"/terms\" className=\"hover:text-slate-700 underline-offset-2 hover:underline\">\r\n {t('landing.footer.terms')}\r\n </a>\r\n <a href=\"/privacy\" className=\"hover:text-slate-700 underline-offset-2 hover:underline\">\r\n {t('landing.footer.privacy')}\r\n </a>\r\n <a href=\"/legal\" className=\"hover:text-slate-700 underline-offset-2 hover:underline\">\r\n {t('landing.footer.legal')}\r\n </a>\r\n </div>\r\n </footer>\n\n {isCsvTemplateDialogOpen && (\n <div\n className=\"fixed inset-0 z-[1220] bg-black/40 backdrop-blur-sm flex items-center justify-center px-4\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={t('app.importer.templateDialog.title')}\n onMouseDown={(event) => {\n if (event.target === event.currentTarget) closeCsvTemplateDialog();\n }}\n >\n <div ref={csvTemplateDialogPanelRef} className=\"bg-white rounded-xl shadow-xl border border-slate-200 w-full max-w-sm p-5 space-y-4\">\n <h3 className=\"text-base font-semibold text-slate-800\">{t('app.importer.templateDialog.title')}</h3>\n <p className=\"text-sm text-slate-600\">{t('app.importer.templateDialog.description')}</p>\n <div className=\"rounded-lg border border-slate-200 bg-slate-50/60 p-3 space-y-2\">\n <label className=\"flex items-start gap-2 text-sm text-slate-700\">\n <input\n ref={csvTemplateDialogFirstRadioRef}\n type=\"radio\"\n name=\"csv-template-slide-count\"\n value=\"current\"\n checked={csvTemplatePreset === 'current'}\n onChange={() => setCsvTemplatePreset('current')}\n className=\"mt-1 accent-blue-600\"\n />\n <div>\n <div className=\"font-semibold text-sm\">{t('app.importer.templateDialog.optionCurrent', { count: Math.max(1, slides.length) })}</div>\n <div className=\"text-[11px] text-slate-500\">{t('app.importer.templateDialog.optionCurrentDesc')}</div>\n </div>\n </label>\n <label className=\"flex items-start gap-2 text-sm text-slate-700\">\n <input\n type=\"radio\"\n name=\"csv-template-slide-count\"\n value=\"custom\"\n checked={csvTemplatePreset === 'custom'}\n onChange={() => {\n setCsvTemplatePreset('custom');\n setCsvTemplateCustomCount((prev) => (prev ? prev : String(Math.max(1, slides.length))));\n }}\n className=\"mt-1 accent-blue-600\"\n />\n <div className=\"flex-1\">\n <div className=\"font-semibold text-sm\">{t('app.importer.templateDialog.optionCustom')}</div>\n <div className=\"mt-1 flex items-center gap-2\">\n <input\n type=\"number\"\n min={1}\n max={50}\n step={1}\n value={csvTemplateCustomCount}\n onChange={(e) => {\n setCsvTemplatePreset('custom');\n setCsvTemplateCustomCount(e.target.value);\n }}\n className={`w-20 rounded-lg border px-2 py-1 text-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 ${\n csvTemplatePreset === 'custom' ? 'bg-white border-slate-300 text-slate-900' : 'bg-slate-100 border-slate-200 text-slate-500'\n }`}\n disabled={csvTemplatePreset !== 'custom'}\n />\n <span className=\"text-[11px] text-slate-500\">{t('app.importer.templateDialog.optionCustomUnit')}</span>\n </div>\n <div className=\"text-[11px] text-slate-500\">{t('app.importer.templateDialog.optionCustomDesc')}</div>\n </div>\n </label>\n {[5, 7, 10].map((count) => (\n <label key={count} className=\"flex items-start gap-2 text-sm text-slate-700\">\n <input\n type=\"radio\"\n name=\"csv-template-slide-count\"\n value={String(count)}\n checked={csvTemplatePreset === String(count)}\n onChange={() => setCsvTemplatePreset(String(count))}\n className=\"mt-1 accent-blue-600\"\n />\n <div>\n <div className=\"font-semibold text-sm\">{t('app.importer.templateDialog.optionPreset', { count })}</div>\n <div className=\"text-[11px] text-slate-500\">{t('app.importer.templateDialog.optionPresetDesc')}</div>\n </div>\n </label>\n ))}\n </div>\n <div className=\"flex justify-end gap-2\">\n <button\n className=\"px-3 py-1.5 text-sm rounded-lg border border-slate-200 text-slate-600 hover:bg-slate-50\"\n onClick={closeCsvTemplateDialog}\n >\n {t('auth.actions.cancel') || 'Cancel'}\n </button>\n <button\n className=\"px-3 py-1.5 text-sm rounded-lg bg-blue-600 text-white hover:bg-blue-700\"\n onClick={confirmDownloadCsvTemplate}\n disabled={(() => {\n if (csvTemplatePreset !== 'custom') return false;\n const customParsed = parseInt(csvTemplateCustomCount, 10);\n return !Number.isFinite(customParsed) || customParsed < 1 || customParsed > 50;\n })()}\n >\n {t('app.importer.templateDialog.download')}\n </button>\n </div>\n </div>\n </div>\n )}\n\n {csvPreview && (\n <div\n className=\"fixed inset-0 z-[1225] bg-black/40 backdrop-blur-sm flex items-center justify-center px-4\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={t('app.importer.previewTitle')}\n onMouseDown={(event) => {\n if (event.target === event.currentTarget) closeCsvPreviewDialog();\n }}\n >\n <div ref={csvPreviewDialogPanelRef} className=\"bg-white rounded-xl shadow-xl border border-slate-200 w-full max-w-md p-5 space-y-4\">\n <h3 className=\"text-base font-semibold text-slate-800\">{t('app.importer.previewTitle')}</h3>\n <p className=\"text-sm text-slate-600\">{t('app.importer.previewSummary', { count: csvPreview.locales.length, slides: csvPreview.slideCount || 1 })}</p>\n {csvPreview.errors > 0 && (\n <p className=\"text-xs text-amber-600 bg-amber-50 border border-amber-100 rounded-lg p-2\">\n {t('app.importer.previewWarning', { count: csvPreview.errors })}\n </p>\n )}\n {(() => {\n const projectSlideCount = slides.length;\n const csvSlideCount = csvPreview.slideCount || 1;\n if (csvSlideCount > projectSlideCount) {\n return (\n <p className=\"text-xs text-blue-700 bg-blue-50 border border-blue-100 rounded-lg p-2\">\n {t('app.importer.previewSlideNoteAdd', { count: csvSlideCount - projectSlideCount })}\n </p>\n );\n }\n if (csvSlideCount < projectSlideCount) {\n return (\n <p className=\"text-xs text-slate-600 bg-slate-50 border border-slate-100 rounded-lg p-2\">\n {t('app.importer.previewSlideNotePartial', { count: csvSlideCount, from: csvSlideCount + 1 })}\n </p>\n );\n }\n return null;\n })()}\n {(() => {\n const existingLocaleIds = new Set(locales.map((l) => l.id));\n const csvLocaleIds = new Set(csvPreview.locales.map((l) => l.id));\n const addedLocaleCount = Array.from(csvLocaleIds).filter((id) => !existingLocaleIds.has(id)).length;\n const removedLocaleCount = Array.from(existingLocaleIds).filter((id) => !csvLocaleIds.has(id)).length;\n const matchedLocaleCount = Array.from(csvLocaleIds).filter((id) => existingLocaleIds.has(id)).length;\n const unchangedLocaleCount = existingLocaleIds.size - matchedLocaleCount;\n\n const projectSlideCount = slides.length;\n const csvSlideCount = csvPreview.slideCount || 1;\n const addedSlideCount = Math.max(0, csvSlideCount - projectSlideCount);\n const untouchedSlideCount = Math.max(0, projectSlideCount - csvSlideCount);\n\n const chips = [];\n if (addedLocaleCount > 0) {\n chips.push({ key: 'loc-add', tone: 'good', label: t('app.importer.delta.localesAdded', { count: addedLocaleCount }) });\n }\n if (csvImportMode === 'replace') {\n if (removedLocaleCount > 0) {\n chips.push({ key: 'loc-remove', tone: 'bad', label: t('app.importer.delta.localesRemoved', { count: removedLocaleCount }) });\n }\n if (matchedLocaleCount > 0) {\n chips.push({ key: 'loc-kept', tone: 'neutral', label: t('app.importer.delta.localesKept', { count: matchedLocaleCount }) });\n }\n } else {\n if (matchedLocaleCount > 0) {\n chips.push({ key: 'loc-update', tone: 'info', label: t('app.importer.delta.localesUpdated', { count: matchedLocaleCount }) });\n }\n if (unchangedLocaleCount > 0) {\n chips.push({ key: 'loc-unchanged', tone: 'neutral', label: t('app.importer.delta.localesUnchanged', { count: unchangedLocaleCount }) });\n }\n }\n if (addedSlideCount > 0) {\n chips.push({ key: 'slide-add', tone: 'good', label: t('app.importer.delta.slidesAdded', { count: addedSlideCount }) });\n }\n if (untouchedSlideCount > 0) {\n chips.push({ key: 'slide-unchanged', tone: 'neutral', label: t('app.importer.delta.slidesUnchanged', { count: untouchedSlideCount }) });\n }\n\n if (!chips.length) return null;\n return (\n <div className=\"rounded-lg border border-slate-200 bg-slate-50/60 p-3 space-y-2\">\n <div className=\"text-xs font-semibold text-slate-700\">{t('app.importer.previewChangesTitle')}</div>\n <div className=\"flex flex-wrap gap-2\">\n {chips.map((chip) => {\n const toneClass =\n chip.tone === 'bad'\n ? 'bg-rose-50 text-rose-700 border-rose-100'\n : chip.tone === 'good'\n ? 'bg-emerald-50 text-emerald-700 border-emerald-100'\n : chip.tone === 'info'\n ? 'bg-blue-50 text-blue-700 border-blue-100'\n : 'bg-white text-slate-700 border-slate-200';\n return (\n <span key={chip.key} className={`px-2 py-1 rounded-full border text-[11px] font-semibold ${toneClass}`}>\n {chip.label}\n </span>\n );\n })}\n </div>\n </div>\n );\n })()}\n <div className=\"border border-slate-200 rounded-lg divide-y divide-slate-100 max-h-60 overflow-auto\">\n {csvPreview.locales.slice(0, 4).map((l) => {\n const slideCount = csvPreview.slideCount || 1;\n const previewSlideCount = Math.min(2, slideCount);\n const previewSlides = Array.from({ length: previewSlideCount }, (_, idx) => idx);\n return (\n <div key={l.id} className=\"p-3\">\n <div className=\"text-xs font-semibold text-slate-700 flex justify-between\">\n <span>{l.name}</span>\n <span className=\"text-slate-400\">{l.id}</span>\n </div>\n <div className=\"mt-1 text-[11px] text-slate-600 space-y-1\">\n {previewSlides.map((sIdx) => {\n const text = csvPreview.slidesTexts?.[sIdx]?.[l.id] || {};\n return (\n <div key={`${l.id}-${sIdx}`}>\n <span className=\"font-semibold text-slate-500\">#{sIdx + 1}</span>{' '}\n {text.header || '-'} <span className=\"text-slate-400\">/</span> {text.sub || '-'}\n </div>\n );\n })}\n {slideCount > previewSlideCount && (\n <div className=\"text-[10px] text-slate-400\">\n {t('app.importer.previewMoreSlides', { extra: slideCount - previewSlideCount })}\n </div>\n )}\n </div>\n </div>\n );\n })}\n {csvPreview.locales.length > 4 && (\r\n <div className=\"p-2 text-[11px] text-slate-500 text-center\">\r\n {t('app.importer.previewMore', { extra: csvPreview.locales.length - 4 })}\r\n </div>\r\n )}\r\n </div>\r\n <div className=\"rounded-lg border border-slate-200 bg-slate-50/60 p-3 space-y-2\">\r\n <div className=\"text-xs font-semibold text-slate-700\">{t('app.importer.mode.label')}</div>\r\n <label className=\"flex items-start gap-2 text-sm text-slate-700\">\r\n <input\r\n type=\"radio\"\r\n name=\"csv-apply-mode\"\r\n value=\"merge\"\r\n checked={csvImportMode === 'merge'}\r\n onChange={() => setCsvImportMode('merge')}\r\n className=\"mt-1 accent-blue-600\"\r\n />\r\n <div>\r\n <div className=\"font-semibold text-sm\">{t('app.importer.mode.merge')}</div>\r\n <div className=\"text-[11px] text-slate-500\">{t('app.importer.mode.mergeDesc')}</div>\r\n </div>\r\n </label>\r\n <label className=\"flex items-start gap-2 text-sm text-slate-700\">\r\n <input\r\n type=\"radio\"\r\n name=\"csv-apply-mode\"\r\n value=\"replace\"\r\n checked={csvImportMode === 'replace'}\r\n onChange={() => setCsvImportMode('replace')}\r\n className=\"mt-1 accent-blue-600\"\r\n />\r\n <div>\r\n <div className=\"font-semibold text-sm\">{t('app.importer.mode.replace')}</div>\r\n <div className=\"text-[11px] text-slate-500\">{t('app.importer.mode.replaceDesc')}</div>\r\n </div>\r\n </label>\r\n </div>\r\n <div className=\"flex justify-end gap-2\">\n <button\n ref={csvPreviewCancelButtonRef}\n className=\"px-3 py-1.5 text-sm rounded-lg border border-slate-200 text-slate-600 hover:bg-slate-50\"\n onClick={closeCsvPreviewDialog}\n >\n {t('auth.actions.cancel') || 'Cancel'}\n </button>\n <button\n className=\"px-3 py-1.5 text-sm rounded-lg bg-blue-600 text-white hover:bg-blue-700\"\n onClick={applyCsvPreview}\n >\n {t('app.importer.previewApply')}\n </button>\n </div>\n </div>\n </div>\n )}\n\n {localeScreenshotImportPreview && (\n <div\n className=\"fixed inset-0 z-[1230] bg-black/40 backdrop-blur-sm flex items-center justify-center px-4\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={t('app.screenshotImporter.dialog.title')}\n onMouseDown={(event) => {\n if (isLocaleScreenshotImportApplying) return;\n if (event.target === event.currentTarget) closeLocaleScreenshotImportDialog();\n }}\n >\n <div ref={localeScreenshotImportDialogPanelRef} className=\"bg-white rounded-xl shadow-xl border border-slate-200 w-full max-w-md p-5 space-y-4\">\n <h3 className=\"text-base font-semibold text-slate-800\">{t('app.screenshotImporter.dialog.title')}</h3>\n <p className=\"text-sm text-slate-600\">\n {t('app.screenshotImporter.dialog.summary', {\n count: localeScreenshotImportPreview.totalFound,\n locales: localeScreenshotImportPreview.localeCount,\n slides: localeScreenshotImportPreview.slideCount,\n })}\n </p>\n <p className=\"text-xs text-slate-500\">\n {t('app.screenshotImporter.dialog.source', { source: localeScreenshotImportPreview.source?.name || '' })}\n </p>\n\n {(localeScreenshotImportPreview.newLocaleCount > 0 || localeScreenshotImportPreview.addedSlideCount > 0) && (\n <div className=\"text-xs text-blue-700 bg-blue-50 border border-blue-100 rounded-lg p-2 space-y-1\">\n {localeScreenshotImportPreview.newLocaleCount > 0 && (\n <div>{t('app.screenshotImporter.dialog.noteAddLocales', { count: localeScreenshotImportPreview.newLocaleCount })}</div>\n )}\n {localeScreenshotImportPreview.addedSlideCount > 0 && (\n <div>{t('app.screenshotImporter.dialog.noteAddSlides', { count: localeScreenshotImportPreview.addedSlideCount })}</div>\n )}\n </div>\n )}\n\n {(localeScreenshotImportPreview.skipped > 0 ||\n localeScreenshotImportPreview.skippedNotImage > 0 ||\n localeScreenshotImportPreview.skippedOutOfRange > 0) && (\n <div className=\"text-xs text-amber-700 bg-amber-50 border border-amber-100 rounded-lg p-2 space-y-1\">\n {localeScreenshotImportPreview.skipped > 0 && (\n <div>{t('app.screenshotImporter.dialog.warnSkipped', { count: localeScreenshotImportPreview.skipped })}</div>\n )}\n {localeScreenshotImportPreview.skippedNotImage > 0 && (\n <div>{t('app.screenshotImporter.dialog.warnNotImages', { count: localeScreenshotImportPreview.skippedNotImage })}</div>\n )}\n {localeScreenshotImportPreview.skippedOutOfRange > 0 && (\n <div>{t('app.screenshotImporter.dialog.warnOutOfRange', { count: localeScreenshotImportPreview.skippedOutOfRange })}</div>\n )}\n </div>\n )}\n\n {localeScreenshotImportPreview.duplicateCount > 0 && (\n <div className=\"text-xs text-slate-600 bg-slate-50 border border-slate-100 rounded-lg p-2\">\n {t('app.screenshotImporter.dialog.noteDuplicates', { count: localeScreenshotImportPreview.duplicateCount })}\n </div>\n )}\n\n {isLocaleScreenshotImportApplying && (\n <div className=\"text-xs text-slate-600 bg-slate-50 border border-slate-100 rounded-lg p-2\">\n {t('app.screenshotImporter.dialog.progress', {\n current: localeScreenshotImportProgress.current,\n total: localeScreenshotImportProgress.total,\n })}\n </div>\n )}\n\n <div className=\"flex justify-end gap-2\">\n <button\n ref={localeScreenshotImportCancelButtonRef}\n className=\"px-3 py-1.5 text-sm rounded-lg border border-slate-200 text-slate-600 hover:bg-slate-50 disabled:opacity-60 disabled:cursor-not-allowed\"\n onClick={closeLocaleScreenshotImportDialog}\n disabled={isLocaleScreenshotImportApplying}\n >\n {t('auth.actions.cancel') || 'Cancel'}\n </button>\n <button\n className=\"px-3 py-1.5 text-sm rounded-lg bg-blue-600 text-white hover:bg-blue-700 disabled:opacity-60 disabled:cursor-not-allowed\"\n onClick={applyLocaleScreenshotImport}\n disabled={isLocaleScreenshotImportApplying}\n >\n {isLocaleScreenshotImportApplying\n ? t('app.screenshotImporter.dialog.applying')\n : t('app.screenshotImporter.dialog.apply')}\n </button>\n </div>\n </div>\n </div>\n )}\n\n {confirmDialog && (\n <div\n className=\"fixed inset-0 z-[1200] bg-black/40 backdrop-blur-sm flex items-center justify-center px-4\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={confirmDialog.title || t('app.data.title')}\n onMouseDown={(event) => {\n if (event.target === event.currentTarget) closeConfirmDialog();\n }}\n >\n <div ref={confirmDialogPanelRef} className=\"bg-white rounded-xl shadow-xl border border-slate-200 w-full max-w-sm p-4 space-y-4\">\n <h3 className=\"text-sm font-semibold text-slate-800\">{confirmDialog.title || t('app.data.title')}</h3>\n <p className=\"text-sm text-slate-600\">{confirmDialog.message}</p>\n <div className=\"flex justify-end gap-2\">\n <button\n ref={confirmDialogCancelButtonRef}\n className=\"px-3 py-1.5 text-sm rounded-lg border border-slate-200 text-slate-600 hover:bg-slate-50\"\n onClick={closeConfirmDialog}\n >\n {confirmDialog.cancelLabel || t('auth.actions.cancel') || 'Cancel'}\n </button>\n <button\n className=\"px-3 py-1.5 text-sm rounded-lg bg-blue-600 text-white hover:bg-blue-700\"\n onClick={() => {\n confirmDialog.onConfirm?.();\n setConfirmDialog(null);\n }}\n >\n {confirmDialog.confirmLabel || t('app.header.confirm') || 'OK'}\n </button>\n </div>\n </div>\n </div>\n )}\n\r\n </div>\r\n );\r\n};\r\n\r\nexport default App;\r\n"],"names":["__iconNode","AlignEndHorizontal","createLucideIcon","AlignVerticalSpaceAround","Aperture","Award","Box","CloudDownload","CloudUpload","Cloud","CreditCard","Crown","Database","FileBraces","FileText","HardDrive","Image","Info","LayoutTemplate","LoaderCircle","Lock","LogOut","Monitor","PaintBucket","PenLine","Play","Plus","RefreshCw","RotateCcw","RotateCw","Save","Search","Settings","Share2","Sparkles","Star","Trash2","TriangleAlert","Upload","Users","Watch","ZoomIn","UserMenu","user","isPro","onUpgrade","onManageSubscription","onSignOut","isPortalLoading","t","useTranslation","isOpen","setIsOpen","useState","menuRef","useRef","useEffect","handleClickOutside","event","initial","jsxs","jsx","ChevronDown","DEVICE_LIBRARY","DEVICE_GROUPS","FRAME_COLORS","SOLID_PRESETS","OFFICIAL_TEMPLATES","DEVICE_FRAMES","calculateLayoutStyles","deviceId","orientation","deviceScale","topSpacing","layoutMode","frameColor","isBatchMode","hasLogo","hasBadge","currentDevice","isWatch","effectiveLayoutMode","canvasWidth","canvasHeight","cssDeviceWidth","cssDeviceHeight","isTablet","isClassicPhone","hasLogoAndBadge","widthFactor","heightFactor","adjustedWidthRatio","adjustedHeightRatio","baseScale","totalScale","layoutWidth","layoutHeight","paddingTop","paddingBottom","paddingLeft","paddingRight","containerStyle","deviceWrapperStyle","deviceInnerStyle","getBrightness","hexColor","hex","r","g","b","MockupCanvas","id","bgType","bgColor","gradientStart","gradientEnd","gradientAngle","bgImage","bgBlur","bgOpacity","headerText","subHeaderText","textColor","headerSize","subHeaderSize","selectedFont","badgeType","screenshot","logoImage","effectiveOrientation","layoutContainerStyle","getBackgroundStyle","baseStyle","watermarkRepeatedTextColor","frameConfig","getAdjustedFontSize","text","baseSize","maxWeight","weight","acc","c","minScale","ratio","maxTextWidth","getFitFontSize","intendedSize","maxWidth","isBold","asciiFactor","multiByteFactor","estimatedWidth","char","scale","logoSize","logoMargin","spacingRatio","logoBaseSize","spacingHeight","textLiftForLogo","textMarginTopForLogo","reservedHeaderHeight","reservedSubHeight","reservedBadgeHeight","gapSpace","textContainerMinHeight","renderBadge","textCenterStyle","iconStyle","badgeStyle","iconSize","textSize","fluidTextStyle","textContainerStyle","wrapperStyle","badgeContent","i","awardText","dlLine1","dlLine2","DownloadCloud","gpLine1","gpLine2","renderNotch","notch","isLandscape","style","renderHomeButton","btn","size","borderWidth","positionOffset","currentFrameColor","frameGradient","colorKey","frameShadow","textJustifyClass","_","Smartphone","Fragment","UpgradeModal","onClose","panelRef","upgradeButtonRef","features","useModalA11y","Feature","CheckCircle2","CiQuickstartModal","closeButtonRef","ci","useMemo","title","desc","codeLabel","code","note","X","CopyButton","RELEASE_TRAIN","ORIGIN","STRIPE_JS_URL","V3_URL_REGEX","STRIPE_JS_URL_REGEX","isStripeJSURL","url","findScript","scripts","script","injectScript","params","queryString","headOrBody","stripePromise$1","onErrorListener","onLoadListener","onError","reject","cause","onLoad","resolve","loadScript","_script$parentNode","error","stripePromise","getStripePromise","API_BASE","jsonHeaders","authHeaders","token","apiFetch","path","options","resp","message","getCurrentUserProfile","createPortalSession","listTeamWorkspaces","createTeamWorkspace","payload","listTeamProjects","workspaceId","createTeamProject","getTeamProject","projectId","updateTeamProject","createTeamInvite","acceptTeamInvite","inviteToken","createCheckout","priceId","email","DEVICE_LABEL_MODES","formatDeviceDimensions","deviceDef","width","height","getDeviceLabelParts","mode","storeLabel","rawModelLabel","modelLabel","dimensions","storeWithModel","primary","secondary","optionLabel","normalizeDeviceSearchQuery","query","deviceMatchesQuery","normalized","tokens","haystack","throwIfAborted","signal","src","globalKey","elevateTextLayer","root","h1","h2","textContainer","normalizeBackground","bgString","fallback","trimmed","alpha","parseSingleShadow","shadow","color","spread","offsetX","offsetY","blur","useAssetExport","deviceLibrary","isExporting","setIsExporting","progress","setProgress","ensureHtml2Canvas","useCallback","ensureJSZip","composeWithShadow","canvas","backgroundColor","out","ctx","prepareCloneForCapture","originalElement","currentBgType","explicitBgColor","baseWidth","baseHeight","pad","targetWidth","targetHeight","solidBg","isSolid","baseBg","captureBg","outputBg","cs","computedBackground","captureBackgroundStyle","clone","toDropShadowFilter","terms","part","best","maxBlur","term","parsed","node","fallbackShadow","dropShadow","existingFilter","container","span","line","getNodeSize","rect","shadowWrapper","frameNode","frameRect","frameSize","wrapperSize","fallbackWidth","fallbackHeight","containerRect","targetRect","manualShadows","deviceName","d","deviceWrapper","existingTransform","deviceLift","badge","badgeShadow","badgeDrop","badgeCs","badgeMt","existingBadgeTransform","badgeRect","div","existing","wb","el","paddingToAdd","currentMt","currentMb","h2Lift","firstHeader","rowGap","mt","baseGap","exportSingle","element","filename","captureTarget","success","captureBackground","padTotal","captureScale","rawCanvas","finalCanvas","link","e","exportBatch","locales","slides","selectedDeviceIds","getElementById","onTaskStart","outputMode","assertNotAborted","totalTasks","completed","zip","fastlaneRoot","resolvedOutputMode","runTask","localeId","slideIndex","slide","slideText","slidePrefix","img","b64","deviceSlug","devId","locale","sIdx","manifest","l","content","err","FIVE_PANEL_SAMPLE_PROJECT","module","this","n","s","a","o","h","u","U","f","y","p","m","k","E","P","C","S","O","x","I","A","T","D","L","F","j","z","M","w","R","v","LANGUAGE_OPTIONS","PRESETS","LanguageSelector","currentLocales","onAdd","search","setSearch","containerRef","filteredOptions","lower","opt","handleAdd","option","handleBulkAdd","ids","toAdd","addLabel","searchPlaceholder","presetsLabel","noResultsLabel","preset","FontSelector","setSelectedFont","fontOptions","currentOption","font","Check","LOCAL_KEY","readLocal","writeLocal","patch","prev","formatExpires","expiresAt","TeamSyncPanel","captureTeamSpec","applyTeamSpec","addToast","useToast","saved","workspaces","setWorkspaces","projects","setProjects","setWorkspaceId","setProjectId","headRev","setHeadRev","headSha","setHeadSha","setInviteToken","lastCreatedInvite","setLastCreatedInvite","isLoading","setIsLoading","isRefreshing","setIsRefreshing","refreshWorkspaces","list","refreshProjects","targetWorkspaceId","refreshProjectHead","handleCreateWorkspace","newId","handleCreateProject","handlePull","spec","handlePush","current","baseRev","handleCreateInvite","result","copyTextToClipboard","handleAcceptInvite","canUse","Copy","ControlsPanel","activeTab","viewMode","isMobile","controlsVisible","controlsTranslation","isControlsDragging","currentHeaderText","currentSubText","currentLocaleId","updateSlideText","currentScreenshot","screenshotUploadScope","setScreenshotUploadScope","hasCurrentLocaleScreenshotOverride","currentSlideScreenshotsByLocale","currentSlideLocaleScreenshotOverrideCount","hasAnyLocaleScreenshotOverrides","hasSharedScreenshot","clearCurrentSlideScreenshot","clearAllCurrentSlideLocaleScreenshotOverrides","handleFileChange","fileInputRef","handleDropWrapper","handleDragOver","handleDragEnter","handleDragLeave","isDragging","setCurrentLocaleId","removeLocale","handleAddLocales","setDeviceId","deviceLabelMode","setDeviceLabelMode","setOrientation","isWatchSelected","applyTheme","setBgType","bgInputRef","handleBgDropWrapper","handleBgDragOver","handleBgDragEnter","handleBgDragLeave","isBgDragging","handleBgFileChange","setBgBlur","setBgOpacity","setBgColor","setGradientStart","setGradientEnd","setFrameColor","logoInputRef","handleLogoDropWrapper","handleLogoDragOver","handleLogoDragEnter","handleLogoDragLeave","isLogoDragging","handleLogoFileChange","handleLogoRemove","overrideActive","ensureSlideOverride","clearSlideOverride","updateSlideOverride","setLayoutMode","setTextColor","recentColors","addRecentColor","effectiveTopSpacing","setTopSpacing","effectiveDeviceScale","setDeviceScale","setBadgeType","applyPreset","myPresets","requirePro","openSavePresetDialog","deleteUserPreset","storageUsage","saveProject","loadProject","loadSampleProject","setConfirmDialog","saveStatus","statusMessage","handleExportJSON","jsonInputRef","handleImportJSON","isJsonDragging","handleJsonDragOver","handleJsonDragEnter","handleJsonDragLeave","handleJsonDropWrapper","isCsvDragging","handleCsvDropWrapper","handleCsvDragOver","handleCsvDragEnter","handleCsvDragLeave","openCsvTemplateDialog","csvInputRef","handleCsvImport","onImportLocaleScreenshots","selectedBatchDevices","setSelectedBatchDevices","toggleBatchDevice","exportStructureMode","setExportStructureMode","teamSyncEnabled","teamSyncToken","onTouchStart","onTouchMove","onTouchEnd","i18n","i18nContext","i18next","deviceSearchQuery","setDeviceSearchQuery","isLocaleScreenshotDragging","setIsLocaleScreenshotDragging","localeScreenshotZipInputRef","localeScreenshotFolderInputRef","localeScreenshotFilesInputRef","deviceGroupLabels","copyButtonLabel","cliQuickstart","alwaysIncludeDeviceIds","filteredDeviceGroups","group","filtered","DeviceLabelModeToggle","className","batchPresets","iosRequired","playPhone","playTablet","all","applyBatchPreset","unique","ColorHistory","onSelect","getTemplateFallbackStyle","template","settings","groupLabel","parts","type","ImageIcon","key","val","Terminal","copyLabel","ClipboardCopy","ArrowRight","AlertTriangle","FileJson","UploadCloud","ProgressOverlay","show","total","label","onCancel","percent","resolvedLabel","Loader2","Storyboard","activeSlideIndex","setActiveSlideIndex","addSlide","removeSlide","onApplyFileToSlide","onOpenFilePickerForSlide","validateImageFile","onAddSlidesFromFiles","isDraggingFile","setIsDraggingFile","dragOverIndex","setDragOverIndex","handleDropOnCard","index","files","file","handleDropOnAdder","reader","ev","openFilePickerForSlide","effectiveScreenshot","overrideCount","UPSELL_WATERMARK_TOAST_STORAGE_KEY","SAMPLE_WELCOME_PROMPT_STORAGE_KEY","App","usePageTitle","isTeamSyncEnabled","setViewMode","isCliMode","setActiveTab","setIsPro","showUpgradeModal","setShowUpgradeModal","showCiQuickstartModal","setShowCiQuickstartModal","upgradeModalSourceRef","hadUpgradeParamRef","hasStripeCustomer","setHasStripeCustomer","subscriptionStatus","setSubscriptionStatus","isAuthenticated","authLoading","signIn","signOut","useAuth","cliAuthToken","effectiveToken","isEffectiveAuthenticated","checkoutStatus","setCheckoutStatus","checkoutAttempts","setCheckoutAttempts","sessionExpired","setSessionExpired","pan","setPan","isPanning","setIsPanning","panStartRef","isPastDue","setBgImage","setGradientAngle","previewZoom","setPreviewZoom","setLogoImage","setHeaderSize","setSubHeaderSize","lastWatchHeaderSize","setLastWatchHeaderSize","lastWatchSubHeaderSize","setLastWatchSubHeaderSize","lastWatchTopSpacing","setLastWatchTopSpacing","lastNonWatchHeaderSize","setLastNonWatchHeaderSize","lastNonWatchSubHeaderSize","setLastNonWatchSubHeaderSize","lastNonWatchTopSpacing","setLastNonWatchTopSpacing","setRecentColors","trackProjectCreated","source","extra","hasTrackedProjectCreatedRef","trackEvent","trackBaseScreenshotUpload","hasTrackedBaseScreenshotUploadedRef","handleDeviceChange","newDeviceId","setLocales","setSlides","setMyPresets","setSaveStatus","isDownloading","setIsDownloading","downloadProgress","setDownloadProgress","setStorageUsage","setIsPortalLoading","history","setHistory","confirmDialog","presetDialog","setPresetDialog","csvPreview","setCsvPreview","csvImportMode","setCsvImportMode","isCsvTemplateDialogOpen","setIsCsvTemplateDialogOpen","csvTemplatePreset","setCsvTemplatePreset","csvTemplateCustomCount","setCsvTemplateCustomCount","localeScreenshotImportPreview","setLocaleScreenshotImportPreview","localeScreenshotImportProgress","setLocaleScreenshotImportProgress","isLocaleScreenshotImportApplying","setIsLocaleScreenshotImportApplying","downloadDetail","setDownloadDetail","setIsMobile","isControlsOpen","setIsControlsOpen","controlsDragOffset","setControlsDragOffset","setIsControlsDragging","setIsDragging","setIsBgDragging","setIsLogoDragging","setIsJsonDragging","setIsCsvDragging","autoSignInAttempted","hasTrackedMultiLocalePreviewedRef","presetDialogPanelRef","presetNameInputRef","csvTemplateDialogPanelRef","csvTemplateDialogFirstRadioRef","csvPreviewDialogPanelRef","csvPreviewCancelButtonRef","localeScreenshotImportDialogPanelRef","localeScreenshotImportCancelButtonRef","confirmDialogPanelRef","confirmDialogCancelButtonRef","closePresetDialog","closeCsvTemplateDialog","closeCsvPreviewDialog","closeConfirmDialog","storyboardFileInputRef","storyboardReplaceTargetIndexRef","canvasWrapperRef","skipHistoryRef","lastSnapshotHashRef","historyInitializedRef","controlsTouchStartRef","exportAbortControllerRef","localeScreenshotImportItemsRef","localeScreenshotImportZipRef","exportProgress","onWheel","step","next","activeSlide","currentUploadScreenshot","activeOverride","calculateStorageUsage","value","usedMB","captureSnapshot","restoreSnapshot","snap","newSlides","nextIndex","undo","past","previous","future","redo","rest","handleResize","vh","mobile","timer","target","snapshot","hash","loadedPresets","profile","refreshProfileOnFocus","onFocus","storedSessionId","sessionId","clearSessionParam","newUrl","startPoll","attempt","maxAttempts","onUnauthorized","readFileAsDataUrl","handleShare","shareData","jsonString","base64Data","match","p1","projectData","data","raw","nextUrl","openUpgradeModal","buildNextPath","buildNextPathWithUpgrade","handleSignIn","handleSignUp","handleSignOut","handleUpgrade","waitForAnalytics","name","timeoutMs","finished","finish","checkoutStarted","startCheckout","action","retryCheckoutStatus","handleManageSubscription","customerExists","res","initialData","newTexts","newSlide","addSlidesFromFiles","validFiles","totalBytes","sum","remainingFiles","blankIndex","dataUrl","currentMaxId","currentTexts","updateSlideScreenshotAt","scope","nextScreenshotsByLocale","clearSlideScreenshotAt","clearAllLocaleScreenshotOverridesAt","setSlideScreenshotFromFile","targetIndex","uploadPayload","setSlideSharedScreenshotFromFile","handleStoryboardFileChange","openStoryboardFilePickerForSlide","handleDrop","handleBgDrop","handleLogoDrop","newLocales","existingIds","merged","loc","prevSlides","updatedTexts","defaults","handleLocaleChange","nextLocaleId","slidesPrev","blob","localeCount","normalizeCsvCell","toCompactCsvKey","detectCsvSlideCount","fields","max","field","numbered","idx","processCsvFile","Papa","rows","seen","slideCount","slidesTexts","row","keyMap","compact","langIdRaw","langId","perSlideTexts","slideNumber","headerRaw","subRaw","hasAnyText","knownLang","parseErrors","downloadCsvTemplate","templateSlideCount","normalizedCount","headerCells","enRow","jaRow","csvContent","csv","confirmDownloadCsvTemplate","currentSlideCount","resolvedCount","customParsed","applyCsvPreview","nextLocales","existingLocaleIds","existingMap","requiredSlides","nextLocaleIds","addedLocaleCount","removedLocaleCount","baseSlides","maxId","mergedSlides","baseTexts","nextTexts","incomingByLocale","incomingText","header","sub","loadScriptOnce","readBlobAsDataUrl","normalizeLocaleIdForImport","cleaned","resolveLocaleIdForImport","candidate","extractLocaleScreenshotKeyFromPath","safePath","normalizedPath","segments","baseName","localeCandidates","knownLocaleIds","segmentLocalePattern","seg","localeRaw","remainder","basePrefixMatch","numberMatches","closeLocaleScreenshotImportDialog","startLocaleScreenshotImport","fileList","isZip","zipFile","items","duplicates","seenKeys","skipped","skippedNotImage","skippedOutOfRange","maxSlide","entry","entryName","uniqueKey","localeIds","newLocaleIds","addedSlides","imageFiles","applyLocaleScreenshotImport","failures","discoveredLocaleIds","maxSlideIndex","item","maybeShowUpsellAfterExport","exportType","now","ONE_DAY_MS","lastShownAt","handleDownload","handleCancelExport","controller","handleBatchDownload","isFreeBundlePreview","maxFreeSlides","exportLocales","exportSlides","exportDeviceIds","ios","android","currentGroup","preferAndroid","preferredIos","preferredAndroid","deviceLabel","previousSnapshot","confirmSaveUserPreset","newPreset","updatedPresets","updated","LOCAL_STORAGE_KEY","settingsOnly","currentSlides","hasProcessedSampleParamRef","sample","nextSearch","hasProcessedSampleWelcomePromptRef","existingProject","currentFontFamily","previewContainerRef","isExportOverlayActive","centerPan","isBatchView","batchViewDeviceIds","handlePanTouchStart","touch","handlePanTouchMove","damping","newX","newY","handlePanTouchEnd","toggleControlsPanel","handleControlsTouchStart","handleControlsTouchMove","delta","handleControlsTouchEnd","handlePanMouseDown","handlePanMouseMove","handlePanMouseUp","StagingBadge","Grid","LanguageSwitcher","Download","Edit3","devDef","effOrientation","isDevWatch","devHeaderSize","devSubHeaderSize","devTopSpacing","scaledWidth","scaledHeight","count","projectSlideCount","csvSlideCount","csvLocaleIds","matchedLocaleCount","unchangedLocaleCount","addedSlideCount","untouchedSlideCount","chips","chip","toneClass","previewSlideCount","previewSlides"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,47,53]}