@templatical/editor 0.43.1 → 0.43.3

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 (256) hide show
  1. package/README.md +1 -1
  2. package/dist/{AiChatSidebar-DOCvzGBe.js → AiChatSidebar-BAAypLEP.js} +7 -7
  3. package/dist/{AiFeatureMenu-xCJeD07B.js → AiFeatureMenu-CQcrDR-J.js} +4 -4
  4. package/dist/{BlockIssueBadge-BJ3A6mqh.js → BlockIssueBadge-DYI7ic1j.js} +2 -2
  5. package/dist/{BlockPreviewCanvas-BQXfqhzu.js → BlockPreviewCanvas-x5W-Sdhg.js} +2 -2
  6. package/dist/{CloudHeaderExtras-TFmBJ0Ry.js → CloudHeaderExtras-DnLaX4ea.js} +2 -2
  7. package/dist/{CloudPanels-BnSBbYnw.js → CloudPanels-BHPG3d1o.js} +4 -4
  8. package/dist/{CollaboratorBar-7ry8EdUh.js → CollaboratorBar-DG6KroMt.js} +2 -2
  9. package/dist/{CommentsPanel-CGEhbjx0.js → CommentsPanel-Bzk6VhJg.js} +1 -1
  10. package/dist/{CommentsSidebar-CUpst9ou.js → CommentsSidebar-CaRC3c1b.js} +10 -10
  11. package/dist/{CountdownToolbar-B1a_UIuB.js → CountdownToolbar-B-pAigUh.js} +3 -3
  12. package/dist/{DesignReferenceSidebar-DkAmsBgM.js → DesignReferenceSidebar-DfuJyDBz.js} +5 -5
  13. package/dist/{IssuesPanel-lTpsCV4a.js → IssuesPanel-vWhcDIvb.js} +5 -5
  14. package/dist/{LogicTagInsertButton-B5YymR4U.js → LogicTagInsertButton-D2Fjo444.js} +3 -3
  15. package/dist/{MediaEditModal-B1X8qtJb.js → MediaEditModal-BuP8SJrv.js} +270 -230
  16. package/dist/{MediaPanels-DO30L1KS.js → MediaPanels-BkcF0r_r.js} +1 -1
  17. package/dist/{MergeTagInput-B0M_-X0K.js → MergeTagInput-fEOOY7OU.js} +1 -1
  18. package/dist/{MergeTagModeToggle-B-8W1tK7.js → MergeTagModeToggle-BOeEL52u.js} +3 -3
  19. package/dist/{ParagraphEditor-DVGeU0Am.js → ParagraphEditor-BlJGeBRY.js} +22 -22
  20. package/dist/{RestoreVersionDialog-DOhgYkiA.js → RestoreVersionDialog-DYaoFk5G.js} +3 -3
  21. package/dist/{RichTextEditorContent-AaLAArA0.js → RichTextEditorContent-GacK8qwu.js} +4 -4
  22. package/dist/{SaveBlockDialog-36MzPD2S.js → SaveBlockDialog-DR1UCtQY.js} +8 -8
  23. package/dist/{SavedBlocksBrowserModal-B5nFKszf.js → SavedBlocksBrowserModal-q_-qYW9a.js} +9 -9
  24. package/dist/{SavedBlocksPanels-BZkbP7eB.js → SavedBlocksPanels-nTH8NTAT.js} +1 -1
  25. package/dist/{SavedBlocksPickBar-ChoCMdu7.js → SavedBlocksPickBar-C7vHmc5c.js} +2 -2
  26. package/dist/{TemplateScoringPanel-C6ellAcs.js → TemplateScoringPanel-D9jeQCYl.js} +11 -11
  27. package/dist/{TemplateSettings-C_0qK-zs.js → TemplateSettings-ClfHwxUa.js} +5 -5
  28. package/dist/{TestEmailModal-CKW-VArm.js → TestEmailModal-DEnvrv38.js} +6 -6
  29. package/dist/{TestEmailPanel-BylYzjyM.js → TestEmailPanel-Ca9t6KG7.js} +1 -1
  30. package/dist/{TitleEditor-DoQ286_n.js → TitleEditor-D7mNs3s5.js} +9 -9
  31. package/dist/{ToggleSwitch-CtZ6adlX.js → ToggleSwitch-Z-rqEcig.js} +1 -1
  32. package/dist/{Toolbar-B6dG5_IP.js → Toolbar-DUgyDBkz.js} +28 -28
  33. package/dist/{TplModal-DHwQXySQ.js → TplModal-CYyFAScB.js} +1 -1
  34. package/dist/{VersionHistoryMenu-DdspCRSA.js → VersionHistoryMenu-D42tGKM6.js} +5 -5
  35. package/dist/{VersionHistoryPanels-C6QxmRUH.js → VersionHistoryPanels-o0HGvQJX.js} +1 -1
  36. package/dist/{VersionPreviewBanner-XUuLe36h.js → VersionPreviewBanner-D5RZtvUf.js} +1 -1
  37. package/dist/{WrapperBlock-BumDudbj.js → WrapperBlock-B0_vSfSD.js} +1 -1
  38. package/dist/{blockTypeIcons-Sg8SY1NQ.js → blockTypeIcons-CEk_GHmU.js} +2 -2
  39. package/dist/bundle-stats.json +6 -6
  40. package/dist/{ca-BTf1Zbqb.js → ca-CYQH3J0b.js} +6 -2
  41. package/dist/{ca--zGWn9AU.js → ca-DSwai-th.js} +1 -4
  42. package/dist/cdn/chunks/{AiChatSidebar-DiG-EQ-E.js → AiChatSidebar-oFwacME4.js} +2 -2
  43. package/dist/cdn/chunks/{AiChatSidebar-DiG-EQ-E.js.map → AiChatSidebar-oFwacME4.js.map} +1 -1
  44. package/dist/cdn/chunks/{AiFeatureMenu-4TgzmLb3.js → AiFeatureMenu-BiHFJf9i.js} +3 -3
  45. package/dist/cdn/chunks/{AiFeatureMenu-4TgzmLb3.js.map → AiFeatureMenu-BiHFJf9i.js.map} +1 -1
  46. package/dist/cdn/chunks/{BlockIssueBadge-ChQ0mPf5.js → BlockIssueBadge-CWlcDBFm.js} +2 -2
  47. package/dist/cdn/chunks/{BlockIssueBadge-ChQ0mPf5.js.map → BlockIssueBadge-CWlcDBFm.js.map} +1 -1
  48. package/dist/cdn/chunks/{BlockPreviewCanvas-BpvK3Sh9.js → BlockPreviewCanvas-CIwIA3zq.js} +3 -3
  49. package/dist/cdn/chunks/{BlockPreviewCanvas-BpvK3Sh9.js.map → BlockPreviewCanvas-CIwIA3zq.js.map} +1 -1
  50. package/dist/cdn/chunks/{CloudHeaderExtras-DqgOaWym.js → CloudHeaderExtras-BgsjwWUQ.js} +3 -3
  51. package/dist/cdn/chunks/{CloudHeaderExtras-DqgOaWym.js.map → CloudHeaderExtras-BgsjwWUQ.js.map} +1 -1
  52. package/dist/cdn/chunks/{CloudPanels-INOiwkET.js → CloudPanels-DFCwq8_J.js} +4 -4
  53. package/dist/cdn/chunks/{CloudPanels-INOiwkET.js.map → CloudPanels-DFCwq8_J.js.map} +1 -1
  54. package/dist/cdn/chunks/{CollaboratorBar-CQ9EpYKQ.js → CollaboratorBar-CiMZfMwN.js} +3 -3
  55. package/dist/cdn/chunks/{CollaboratorBar-CQ9EpYKQ.js.map → CollaboratorBar-CiMZfMwN.js.map} +1 -1
  56. package/dist/cdn/chunks/{CommentsPanel-CjhxGMjL.js → CommentsPanel-CL4grbMp.js} +2 -2
  57. package/dist/cdn/chunks/{CommentsPanel-CjhxGMjL.js.map → CommentsPanel-CL4grbMp.js.map} +1 -1
  58. package/dist/cdn/chunks/{CommentsSidebar-D9bqMnlt.js → CommentsSidebar-tWYYKv1s.js} +2 -2
  59. package/dist/cdn/chunks/{CommentsSidebar-D9bqMnlt.js.map → CommentsSidebar-tWYYKv1s.js.map} +1 -1
  60. package/dist/cdn/chunks/{CountdownToolbar-CIRx5w1U.js → CountdownToolbar-DfyqIppF.js} +4 -4
  61. package/dist/cdn/chunks/{CountdownToolbar-CIRx5w1U.js.map → CountdownToolbar-DfyqIppF.js.map} +1 -1
  62. package/dist/cdn/chunks/{DesignReferenceSidebar-C1-SbE_R.js → DesignReferenceSidebar-C6O12hvt.js} +2 -2
  63. package/dist/cdn/chunks/{DesignReferenceSidebar-C1-SbE_R.js.map → DesignReferenceSidebar-C6O12hvt.js.map} +1 -1
  64. package/dist/cdn/chunks/{IssuesPanel-qKY6UDd-.js → IssuesPanel-DYJXIwnw.js} +2 -2
  65. package/dist/cdn/chunks/{IssuesPanel-qKY6UDd-.js.map → IssuesPanel-DYJXIwnw.js.map} +1 -1
  66. package/dist/cdn/chunks/{LogicTagInsertButton-CItDS_U1.js → LogicTagInsertButton-FNMVxm_V.js} +2 -2
  67. package/dist/cdn/chunks/{LogicTagInsertButton-CItDS_U1.js.map → LogicTagInsertButton-FNMVxm_V.js.map} +1 -1
  68. package/dist/cdn/chunks/{MediaEditModal-CzUtXkpk.js → MediaEditModal-C9yZ0AJv.js} +272 -232
  69. package/dist/cdn/chunks/MediaEditModal-C9yZ0AJv.js.map +1 -0
  70. package/dist/cdn/chunks/{MediaPanels-DOLsh7WC.js → MediaPanels-DiKU1r9P.js} +2 -2
  71. package/dist/cdn/chunks/{MediaPanels-DOLsh7WC.js.map → MediaPanels-DiKU1r9P.js.map} +1 -1
  72. package/dist/cdn/chunks/{MergeTagInput-B33u3nxj.js → MergeTagInput-CSC64xNL.js} +2 -2
  73. package/dist/cdn/chunks/{MergeTagInput-B33u3nxj.js.map → MergeTagInput-CSC64xNL.js.map} +1 -1
  74. package/dist/cdn/chunks/{MergeTagModeToggle-Bz1CH3NT.js → MergeTagModeToggle-027RMXDP.js} +2 -2
  75. package/dist/cdn/chunks/{MergeTagModeToggle-Bz1CH3NT.js.map → MergeTagModeToggle-027RMXDP.js.map} +1 -1
  76. package/dist/cdn/chunks/{ParagraphEditor-B6A4yQ0A.js → ParagraphEditor-0Z26-N5u.js} +19 -19
  77. package/dist/cdn/chunks/{ParagraphEditor-B6A4yQ0A.js.map → ParagraphEditor-0Z26-N5u.js.map} +1 -1
  78. package/dist/cdn/chunks/{RestoreVersionDialog-B9rujl9w.js → RestoreVersionDialog-Dd1v1KLK.js} +3 -3
  79. package/dist/cdn/chunks/{RestoreVersionDialog-B9rujl9w.js.map → RestoreVersionDialog-Dd1v1KLK.js.map} +1 -1
  80. package/dist/cdn/chunks/{RichTextEditorContent-dOg1xFqv.js → RichTextEditorContent-BOZ_5I76.js} +4 -4
  81. package/dist/cdn/chunks/{RichTextEditorContent-dOg1xFqv.js.map → RichTextEditorContent-BOZ_5I76.js.map} +1 -1
  82. package/dist/cdn/chunks/{SaveBlockDialog-BNAeb6--.js → SaveBlockDialog-B6WQwNJD.js} +6 -6
  83. package/dist/cdn/chunks/{SaveBlockDialog-BNAeb6--.js.map → SaveBlockDialog-B6WQwNJD.js.map} +1 -1
  84. package/dist/cdn/chunks/{SavedBlocksBrowserModal--FoVqEnT.js → SavedBlocksBrowserModal-C015fVMV.js} +6 -6
  85. package/dist/cdn/chunks/{SavedBlocksBrowserModal--FoVqEnT.js.map → SavedBlocksBrowserModal-C015fVMV.js.map} +1 -1
  86. package/dist/cdn/chunks/{SavedBlocksPanels-qKyPnVgk.js → SavedBlocksPanels-DZmfXW4x.js} +2 -2
  87. package/dist/cdn/chunks/{SavedBlocksPanels-qKyPnVgk.js.map → SavedBlocksPanels-DZmfXW4x.js.map} +1 -1
  88. package/dist/cdn/chunks/{SavedBlocksPickBar-BvLwca4B.js → SavedBlocksPickBar-DtCQFCCW.js} +3 -3
  89. package/dist/cdn/chunks/{SavedBlocksPickBar-BvLwca4B.js.map → SavedBlocksPickBar-DtCQFCCW.js.map} +1 -1
  90. package/dist/cdn/chunks/{TemplateScoringPanel-ebsrVge3.js → TemplateScoringPanel-CeCVyNV1.js} +2 -2
  91. package/dist/cdn/chunks/{TemplateScoringPanel-ebsrVge3.js.map → TemplateScoringPanel-CeCVyNV1.js.map} +1 -1
  92. package/dist/cdn/chunks/{TemplateSettings-BaEVdUTM.js → TemplateSettings-CuXwthI6.js} +4 -4
  93. package/dist/cdn/chunks/{TemplateSettings-BaEVdUTM.js.map → TemplateSettings-CuXwthI6.js.map} +1 -1
  94. package/dist/cdn/chunks/{TestEmailModal-DpYirvEL.js → TestEmailModal-DV1XKWRh.js} +6 -6
  95. package/dist/cdn/chunks/{TestEmailModal-DpYirvEL.js.map → TestEmailModal-DV1XKWRh.js.map} +1 -1
  96. package/dist/cdn/chunks/{TestEmailPanel-PAT70a2g.js → TestEmailPanel-CnVW00RI.js} +2 -2
  97. package/dist/cdn/chunks/{TestEmailPanel-PAT70a2g.js.map → TestEmailPanel-CnVW00RI.js.map} +1 -1
  98. package/dist/cdn/chunks/{TitleEditor-Dc7YB6Uy.js → TitleEditor-B9sKbRd4.js} +8 -8
  99. package/dist/cdn/chunks/{TitleEditor-Dc7YB6Uy.js.map → TitleEditor-B9sKbRd4.js.map} +1 -1
  100. package/dist/cdn/chunks/{ToggleSwitch-D-8dCEbI.js → ToggleSwitch-eHkFBx4o.js} +2 -2
  101. package/dist/cdn/chunks/{ToggleSwitch-D-8dCEbI.js.map → ToggleSwitch-eHkFBx4o.js.map} +1 -1
  102. package/dist/cdn/chunks/{Toolbar-BDzhrmGV.js → Toolbar-DeKbYejp.js} +15 -15
  103. package/dist/cdn/chunks/{Toolbar-BDzhrmGV.js.map → Toolbar-DeKbYejp.js.map} +1 -1
  104. package/dist/cdn/chunks/{TplModal-BbHRUc1Y.js → TplModal-Dqq-Ermd.js} +2 -2
  105. package/dist/cdn/chunks/{TplModal-BbHRUc1Y.js.map → TplModal-Dqq-Ermd.js.map} +1 -1
  106. package/dist/cdn/chunks/{VersionHistoryMenu-C_bBKOYU.js → VersionHistoryMenu-Kf4QFm7m.js} +2 -2
  107. package/dist/cdn/chunks/{VersionHistoryMenu-C_bBKOYU.js.map → VersionHistoryMenu-Kf4QFm7m.js.map} +1 -1
  108. package/dist/cdn/chunks/{VersionHistoryPanels-BoJsPIKa.js → VersionHistoryPanels-Cz8rde-s.js} +2 -2
  109. package/dist/cdn/chunks/{VersionHistoryPanels-BoJsPIKa.js.map → VersionHistoryPanels-Cz8rde-s.js.map} +1 -1
  110. package/dist/cdn/chunks/{VersionPreviewBanner-CKyrcgxJ.js → VersionPreviewBanner-DNYHqbj9.js} +2 -2
  111. package/dist/cdn/chunks/{VersionPreviewBanner-CKyrcgxJ.js.map → VersionPreviewBanner-DNYHqbj9.js.map} +1 -1
  112. package/dist/cdn/chunks/{WrapperBlock-CGg6rBnx.js → WrapperBlock-DIZHUwFn.js} +2 -2
  113. package/dist/cdn/chunks/{WrapperBlock-CGg6rBnx.js.map → WrapperBlock-DIZHUwFn.js.map} +1 -1
  114. package/dist/cdn/chunks/{blockTypeIcons-CdfCfqHE.js → blockTypeIcons-hgzxMFWX.js} +2 -2
  115. package/dist/cdn/chunks/{blockTypeIcons-CdfCfqHE.js.map → blockTypeIcons-hgzxMFWX.js.map} +1 -1
  116. package/dist/cdn/chunks/{ca-BTf1Zbqb.js → ca-CYQH3J0b.js} +7 -3
  117. package/dist/cdn/chunks/ca-CYQH3J0b.js.map +1 -0
  118. package/dist/cdn/chunks/{ca--zGWn9AU.js → ca-DSwai-th.js} +2 -5
  119. package/dist/cdn/chunks/ca-DSwai-th.js.map +1 -0
  120. package/dist/cdn/chunks/{de-BRNLKcDl.js → de-DOhKuphf.js} +2 -5
  121. package/dist/cdn/chunks/de-DOhKuphf.js.map +1 -0
  122. package/dist/cdn/chunks/{de-xzrh9PA3.js → de-JvCTMJPy.js} +7 -3
  123. package/dist/cdn/chunks/de-JvCTMJPy.js.map +1 -0
  124. package/dist/cdn/chunks/dist-BRZhN8qJ.js.map +1 -1
  125. package/dist/cdn/chunks/dist-CXB2_kBa.js.map +1 -1
  126. package/dist/cdn/chunks/draggable-IB4x6w2O.js.map +1 -1
  127. package/dist/cdn/chunks/{editor-modal-CZQArGNj.js → editor-modal-cKeJ4wC2.js} +472 -428
  128. package/dist/cdn/chunks/editor-modal-cKeJ4wC2.js.map +1 -0
  129. package/dist/cdn/chunks/{en-JJjqHMjy.js → en-BE28ZcUF.js} +2 -5
  130. package/dist/cdn/chunks/en-BE28ZcUF.js.map +1 -0
  131. package/dist/cdn/chunks/en-CoNe1psX.js +2 -0
  132. package/dist/cdn/chunks/{es-BT4LSpE2.js → es-CAv-Vldw.js} +7 -3
  133. package/dist/cdn/chunks/es-CAv-Vldw.js.map +1 -0
  134. package/dist/cdn/chunks/{es-BIh8BxV9.js → es-oQI-dfx2.js} +2 -5
  135. package/dist/cdn/chunks/es-oQI-dfx2.js.map +1 -0
  136. package/dist/cdn/chunks/{extensions-Dy251lPd.js → extensions-rPP7qRRm.js} +3 -3
  137. package/dist/cdn/chunks/{extensions-Dy251lPd.js.map → extensions-rPP7qRRm.js.map} +1 -1
  138. package/dist/{fr-CI7OJoql.js → cdn/chunks/fr-DVPtxpR6.js} +8 -2
  139. package/dist/cdn/chunks/fr-DVPtxpR6.js.map +1 -0
  140. package/dist/cdn/chunks/{fr-C5VUZogP.js → fr-rzLdCMSG.js} +2 -5
  141. package/dist/cdn/chunks/fr-rzLdCMSG.js.map +1 -0
  142. package/dist/cdn/chunks/htmlparser-ClUZ6waR.js.map +1 -1
  143. package/dist/cdn/chunks/{icons-CQnjugjy.js → icons-BF0mJX0V.js} +18 -18
  144. package/dist/cdn/chunks/{icons-CQnjugjy.js.map → icons-BF0mJX0V.js.map} +1 -1
  145. package/dist/{ja-DhlWUfke.js → cdn/chunks/ja-dcWzjStz.js} +8 -2
  146. package/dist/cdn/chunks/ja-dcWzjStz.js.map +1 -0
  147. package/dist/{ja-x5JYxaCW.js → cdn/chunks/ja-dyFc6Ghz.js} +3 -4
  148. package/dist/cdn/chunks/ja-dyFc6Ghz.js.map +1 -0
  149. package/dist/cdn/chunks/{liquid.browser-BypTT2oc.js → liquid.browser-DXPjcePu.js} +758 -719
  150. package/dist/cdn/chunks/liquid.browser-DXPjcePu.js.map +1 -0
  151. package/dist/cdn/chunks/{nl-UXxFyXV6.js → nl-BcQhRqKR.js} +2 -5
  152. package/dist/cdn/chunks/nl-BcQhRqKR.js.map +1 -0
  153. package/dist/{nl-D8y5OWGB.js → cdn/chunks/nl-LZNqQgE4.js} +8 -2
  154. package/dist/cdn/chunks/nl-LZNqQgE4.js.map +1 -0
  155. package/dist/cdn/chunks/{pt-BR-DMCbUBvJ.js → pt-BR-D6P_mNwA.js} +7 -3
  156. package/dist/cdn/chunks/pt-BR-D6P_mNwA.js.map +1 -0
  157. package/dist/cdn/chunks/{pt-BR-DHm3SP6W.js → pt-BR-UombhTMO.js} +2 -5
  158. package/dist/cdn/chunks/pt-BR-UombhTMO.js.map +1 -0
  159. package/dist/cdn/chunks/pusher-BbIHJKf3.js.map +1 -1
  160. package/dist/cdn/chunks/{src-BwsQ27UT.js → src-V9_ODH_1.js} +3 -3
  161. package/dist/cdn/chunks/{src-BwsQ27UT.js.map → src-V9_ODH_1.js.map} +1 -1
  162. package/dist/cdn/chunks/{tiptap-D1u8JIUW.js → tiptap-02G9FGkl.js} +3726 -3552
  163. package/dist/cdn/chunks/tiptap-02G9FGkl.js.map +1 -0
  164. package/dist/cdn/chunks/{useEditorCore-DoX2RgTl.js → useEditorCore-DWvAia8X.js} +14 -14
  165. package/dist/cdn/chunks/{useEditorCore-DoX2RgTl.js.map → useEditorCore-DWvAia8X.js.map} +1 -1
  166. package/dist/cdn/editor.css +1 -1
  167. package/dist/cdn/editor.js +337 -359
  168. package/dist/cdn/editor.js.map +1 -1
  169. package/dist/{check-BMx_TLAS.js → check-DEjsanPt.js} +1 -1
  170. package/dist/{chevron-down-KZf5mh9_.js → chevron-down-Cv11TeKQ.js} +1 -1
  171. package/dist/{chevron-right-BLZ60Vxw.js → chevron-right-R8dOpzBZ.js} +1 -1
  172. package/dist/{chevron-up-B9ynB8eU.js → chevron-up-DsDEytX1.js} +1 -1
  173. package/dist/{circle-alert-pjvFFDrF.js → circle-alert-B_NqWETg.js} +1 -1
  174. package/dist/{clock-CiiTBfF3.js → clock-CDGKPx_X.js} +1 -1
  175. package/dist/{copy-BF0_pQjH.js → copy-Dv2VltLv.js} +1 -1
  176. package/dist/{createLucideIcon-C2YOVVWx.js → createLucideIcon-MrFrvtkF.js} +5 -5
  177. package/dist/{de-BRNLKcDl.js → de-DOhKuphf.js} +1 -4
  178. package/dist/{de-xzrh9PA3.js → de-JvCTMJPy.js} +6 -2
  179. package/dist/{dist-CxmLZQso.js → dist-8By0p8ah.js} +5 -5
  180. package/dist/{dist-W_ERo6c_.js → dist-BYg1EL5g.js} +5 -5
  181. package/dist/{dist-C2Ge44fD.js → dist-BgSLW3Hn.js} +1704 -1303
  182. package/dist/{dist-B0dkvy7z.js → dist-CWc7nIkA.js} +5 -5
  183. package/dist/{dist-CIxmOOSG.js → dist-Ceew_u40.js} +448 -699
  184. package/dist/{dist-BwoEME8p.js → dist-CmwBvyW0.js} +172 -171
  185. package/dist/{dist-CJ7RZARo.js → dist-Czzst9ng.js} +302 -279
  186. package/dist/dist-D2m55Lvs.js +5 -0
  187. package/dist/{dist-p-LkiWIQ.js → dist-D4HP93ZF.js} +13 -13
  188. package/dist/{dist-BPWuzECC.js → dist-DdSWMtEP.js} +6 -6
  189. package/dist/{dist-DRmafAUz.js → dist-DmQckB4p.js} +29 -29
  190. package/dist/dist-Dw2_11LA.js +5 -0
  191. package/dist/{editor-modal-99FB40dl.js → editor-modal-DmgxKgII.js} +484 -440
  192. package/dist/{en-JJjqHMjy.js → en-BE28ZcUF.js} +1 -4
  193. package/dist/en-DXYNty6E.js +2 -0
  194. package/dist/{es-BT4LSpE2.js → es-CAv-Vldw.js} +6 -2
  195. package/dist/{es-BIh8BxV9.js → es-oQI-dfx2.js} +1 -4
  196. package/dist/{extensions-DqQXxrvP.js → extensions-CkwL1oWn.js} +61 -61
  197. package/dist/{eye-RdXYgrQZ.js → eye-BVxcDaZZ.js} +1 -1
  198. package/dist/{cdn/chunks/fr-CI7OJoql.js → fr-DVPtxpR6.js} +6 -4
  199. package/dist/{fr-C5VUZogP.js → fr-rzLdCMSG.js} +1 -4
  200. package/dist/{image-up-BwdoReQt.js → image-up-CnC4n-8q.js} +1 -1
  201. package/dist/index.d.ts +7 -1
  202. package/dist/{info-zFMSGrL1.js → info-q7gVjMBC.js} +1 -1
  203. package/dist/{cdn/chunks/ja-DhlWUfke.js → ja-dcWzjStz.js} +6 -4
  204. package/dist/{cdn/chunks/ja-x5JYxaCW.js → ja-dyFc6Ghz.js} +1 -6
  205. package/dist/{link-D7orqFBT.js → link-B1-UqOP6.js} +1 -1
  206. package/dist/{liquid.browser-wPG0n4Cs.js → liquid.browser-Cs4gOjeX.js} +757 -718
  207. package/dist/{list-BGt4Pgxc.js → list-BvlNrd6M.js} +1 -1
  208. package/dist/{loader-circle-BVBgkRGz.js → loader-circle-CJ8klGfl.js} +1 -1
  209. package/dist/{message-circle-D8YLsarv.js → message-circle-Bgepipq_.js} +1 -1
  210. package/dist/{nl-UXxFyXV6.js → nl-BcQhRqKR.js} +1 -4
  211. package/dist/{cdn/chunks/nl-D8y5OWGB.js → nl-LZNqQgE4.js} +6 -4
  212. package/dist/{package-CuFvk0L5.js → package-BYIdon2Q.js} +1 -1
  213. package/dist/{pencil-DRYbmZW7.js → pencil-Bhs9MNTT.js} +1 -1
  214. package/dist/{plus-Dv0b3kh0.js → plus-C0eGj8vT.js} +1 -1
  215. package/dist/{pt-BR-DMCbUBvJ.js → pt-BR-D6P_mNwA.js} +6 -2
  216. package/dist/{pt-BR-DHm3SP6W.js → pt-BR-UombhTMO.js} +1 -4
  217. package/dist/{refresh-cw-gYTIS5bJ.js → refresh-cw-BQTOIZKD.js} +1 -1
  218. package/dist/{search-D84_Ki_a.js → search-CeT7yRBa.js} +1 -1
  219. package/dist/{send-Cn-8_H_U.js → send-D7ck2xEq.js} +1 -1
  220. package/dist/{shield-check-BOoVWJtD.js → shield-check-CF_VbIbH.js} +1 -1
  221. package/dist/{smartphone-4Ej3PBw5.js → smartphone-CkVOj7Qn.js} +1 -1
  222. package/dist/{socialIcons-CzRJskEk.js → socialIcons-QYtdurnO.js} +1 -1
  223. package/dist/{sparkles-D3vnNe7O.js → sparkles-Cfb-Kkgv.js} +1 -1
  224. package/dist/style.css +1 -1
  225. package/dist/templatical-editor.js +475 -497
  226. package/dist/{text-align-start-Ci2h_Xly.js → text-align-start-CkFs2Zig.js} +13 -13
  227. package/dist/{trash-wmi4UKvv.js → trash-C2LPw5pa.js} +1 -1
  228. package/dist/{triangle-alert-DJ0r2wmQ.js → triangle-alert-gaUz4rum.js} +1 -1
  229. package/dist/{upload-XMde-TXf.js → upload-C_DYZD_p.js} +1 -1
  230. package/dist/{useEditorCore-CAhRAya8.js → useEditorCore-Cmv5ll-D.js} +20 -20
  231. package/dist/{useScrollToBlock-B4F7KCrf.js → useScrollToBlock-BsPYYJ8h.js} +1 -1
  232. package/dist/{x-BWrtpVl-.js → x-JhKma5YO.js} +1 -1
  233. package/package.json +25 -25
  234. package/dist/cdn/chunks/MediaEditModal-CzUtXkpk.js.map +0 -1
  235. package/dist/cdn/chunks/ca--zGWn9AU.js.map +0 -1
  236. package/dist/cdn/chunks/ca-BTf1Zbqb.js.map +0 -1
  237. package/dist/cdn/chunks/de-BRNLKcDl.js.map +0 -1
  238. package/dist/cdn/chunks/de-xzrh9PA3.js.map +0 -1
  239. package/dist/cdn/chunks/editor-modal-CZQArGNj.js.map +0 -1
  240. package/dist/cdn/chunks/en-9unxBjV8.js +0 -2
  241. package/dist/cdn/chunks/en-JJjqHMjy.js.map +0 -1
  242. package/dist/cdn/chunks/es-BIh8BxV9.js.map +0 -1
  243. package/dist/cdn/chunks/es-BT4LSpE2.js.map +0 -1
  244. package/dist/cdn/chunks/fr-C5VUZogP.js.map +0 -1
  245. package/dist/cdn/chunks/fr-CI7OJoql.js.map +0 -1
  246. package/dist/cdn/chunks/ja-DhlWUfke.js.map +0 -1
  247. package/dist/cdn/chunks/ja-x5JYxaCW.js.map +0 -1
  248. package/dist/cdn/chunks/liquid.browser-BypTT2oc.js.map +0 -1
  249. package/dist/cdn/chunks/nl-D8y5OWGB.js.map +0 -1
  250. package/dist/cdn/chunks/nl-UXxFyXV6.js.map +0 -1
  251. package/dist/cdn/chunks/pt-BR-DHm3SP6W.js.map +0 -1
  252. package/dist/cdn/chunks/pt-BR-DMCbUBvJ.js.map +0 -1
  253. package/dist/cdn/chunks/tiptap-D1u8JIUW.js.map +0 -1
  254. package/dist/dist-BUHovM4k.js +0 -5
  255. package/dist/dist-DdOAotfz.js +0 -5
  256. package/dist/en-BvOjRLiw.js +0 -2
@@ -1,7 +1,7 @@
1
1
  import { A as e, B as t, H as n, N as r, Q as i, S as a, U as ee, at as o, b as s, ct as c, f as te, g as l, h as u, lt as d, m as ne, n as re, o as ie, p as f, ut as p, y as m } from "./draggable-IB4x6w2O.js";
2
2
  import { $ as h, g as ae, i as oe } from "./keys-DCWeHkSF.js";
3
3
  import "./timeouts-DHPZQ0G3.js";
4
- import { Ct as se, Nt as ce, St as g, mt as _, n as v, s as le } from "./icons-CQnjugjy.js";
4
+ import { Ct as se, Nt as ce, St as g, mt as _, n as v, s as le } from "./icons-BF0mJX0V.js";
5
5
  import { t as ue } from "./LoadingTrack-_7DH_5aw.js";
6
6
  import { t as y } from "./_plugin-vue_export-helper-B3ysoDQm.js";
7
7
  import { n as de } from "./useCloudI18n-CrjWbpbu.js";
@@ -227,4 +227,4 @@ var pe = ["aria-label"], me = { class: "tpl:flex tpl:items-center tpl:justify-be
227
227
  //#endregion
228
228
  export { R as default };
229
229
 
230
- //# sourceMappingURL=DesignReferenceSidebar-C1-SbE_R.js.map
230
+ //# sourceMappingURL=DesignReferenceSidebar-C6O12hvt.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DesignReferenceSidebar-C1-SbE_R.js","names":["_openBlock","_createBlock","_Transition","_withCtx","_createElementBlock","_unref","_createElementVNode","_createVNode","_toDisplayString","LoadingTrack","_normalizeStyle","_createTextVNode","_withDirectives","_normalizeClass","_vModelText","_createCommentVNode","_sfc_main","onBeforeUnmount","watch","withCtx","openBlock","ref","defineComponent","withDirectives","unref","createVNode","normalizeClass","computed","createElementBlock","createCommentVNode","normalizeStyle","createBlock","Transition","vModelText","createBaseVNode","toDisplayString","createTextVNode","requireInject","EDITOR_KEY","AUTH_MANAGER_KEY","FileImage","CircleAlert","FileText","ImageUp","X","Upload","LoadingTrack_default","_plugin_vue_export_helper_default","useCloudI18nStrict","primaryBtnClass","useDesignReference","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","DesignReferenceSidebar_default","__emit","props","__props","emit","cloudT","editor","authManager","designReference","content","fileInput","activeTab","selectedFile","prompt","filePreviewUrl","showConfirmation","isDragging","canGenerate","selectTab","tab","clearFile","handleFileSelect","input","event","file","setFile","handleDragOver","handleDragLeave","handleDrop","handleGenerate","cancelConfirmation","isVisible","_cache","$event"],"sources":["../../../src/cloud/components/DesignReferenceSidebar.vue","../../../src/cloud/components/DesignReferenceSidebar.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { MAX_UPLOAD_SIZE_BYTES } from \"../../constants/timeouts\";\nimport { primaryBtnClass } from \"../../constants/styleConstants\";\nimport LoadingTrack from \"../../components/LoadingTrack.vue\";\nimport { useDesignReference } from \"@templatical/core/cloud\";\nimport { EDITOR_KEY, AUTH_MANAGER_KEY, requireInject } from \"../../keys\";\nimport { useCloudI18nStrict } from \"../../composables/useCloudI18n\";\nimport type { TemplateContent } from \"@templatical/types\";\nimport {\n CircleAlert,\n FileImage,\n FileText,\n ImageUp,\n Upload,\n X,\n} from \"@lucide/vue\";\nimport { computed, onBeforeUnmount, ref, watch } from \"vue\";\n\nconst props = defineProps<{\n visible: boolean;\n hasExistingBlocks: boolean;\n}>();\n\nconst emit = defineEmits<{\n (e: \"close\"): void;\n (e: \"apply\", content: TemplateContent): void;\n}>();\n\nconst { t: cloudT } = useCloudI18nStrict();\nconst editor = requireInject(EDITOR_KEY, \"DesignReferenceSidebar\");\nconst authManager = requireInject(AUTH_MANAGER_KEY, \"DesignReferenceSidebar\");\n\nconst designReference = useDesignReference({\n authManager,\n getTemplateId: () => editor.state.template?.id ?? null,\n onApply: (content) => emit(\"apply\", content),\n});\n\nconst fileInput = ref<HTMLInputElement | null>(null);\n\ntype SourceTab = \"image\" | \"pdf\";\n\nconst activeTab = ref<SourceTab>(\"image\");\nconst selectedFile = ref<File | null>(null);\nconst prompt = ref(\"\");\nconst filePreviewUrl = ref<string | null>(null);\nconst showConfirmation = ref(false);\nconst isDragging = ref(false);\n\nconst canGenerate = computed(() => {\n if (designReference.isGenerating.value) {\n return false;\n }\n\n return selectedFile.value !== null;\n});\n\nfunction selectTab(tab: SourceTab): void {\n activeTab.value = tab;\n clearFile();\n}\n\nfunction handleFileSelect(event: Event): void {\n const input = event.target as HTMLInputElement;\n const file = input.files?.[0];\n if (file) {\n setFile(file);\n }\n // Reset input so same file can be selected again\n input.value = \"\";\n}\n\nfunction setFile(file: File): void {\n // Validate file size (10MB)\n if (file.size > MAX_UPLOAD_SIZE_BYTES) {\n designReference.error.value = cloudT.designReference.fileTooLarge;\n return;\n }\n\n // Validate file type\n if (activeTab.value === \"image\") {\n const validTypes = [\"image/png\", \"image/jpeg\", \"image/jpg\", \"image/webp\"];\n if (!validTypes.includes(file.type)) {\n designReference.error.value = cloudT.designReference.invalidFileType;\n return;\n }\n } else if (activeTab.value === \"pdf\") {\n if (file.type !== \"application/pdf\") {\n designReference.error.value = cloudT.designReference.invalidFileType;\n return;\n }\n }\n\n selectedFile.value = file;\n designReference.error.value = null;\n\n // Create preview URL for images\n if (filePreviewUrl.value) {\n URL.revokeObjectURL(filePreviewUrl.value);\n }\n if (file.type.startsWith(\"image/\")) {\n filePreviewUrl.value = URL.createObjectURL(file);\n } else {\n filePreviewUrl.value = null;\n }\n}\n\nfunction clearFile(): void {\n if (filePreviewUrl.value) {\n URL.revokeObjectURL(filePreviewUrl.value);\n filePreviewUrl.value = null;\n }\n selectedFile.value = null;\n}\n\nfunction handleDragOver(event: DragEvent): void {\n event.preventDefault();\n isDragging.value = true;\n}\n\nfunction handleDragLeave(): void {\n isDragging.value = false;\n}\n\nfunction handleDrop(event: DragEvent): void {\n event.preventDefault();\n isDragging.value = false;\n\n const file = event.dataTransfer?.files?.[0];\n if (file) {\n setFile(file);\n }\n}\n\nfunction handleGenerate(): void {\n if (!canGenerate.value) {\n return;\n }\n\n // Show confirmation if there are existing blocks\n if (props.hasExistingBlocks && !showConfirmation.value) {\n showConfirmation.value = true;\n return;\n }\n\n showConfirmation.value = false;\n\n const input: {\n prompt?: string;\n imageUpload?: File;\n pdfUpload?: File;\n } = {};\n\n if (prompt.value.trim()) {\n input.prompt = prompt.value.trim();\n }\n\n if (activeTab.value === \"image\" && selectedFile.value) {\n input.imageUpload = selectedFile.value;\n } else if (activeTab.value === \"pdf\" && selectedFile.value) {\n input.pdfUpload = selectedFile.value;\n }\n\n designReference.generate(input);\n}\n\nfunction cancelConfirmation(): void {\n showConfirmation.value = false;\n}\n\n// Reset state when panel closes\nwatch(\n () => props.visible,\n (isVisible) => {\n if (!isVisible) {\n showConfirmation.value = false;\n }\n },\n);\n\nonBeforeUnmount(() => {\n if (filePreviewUrl.value) {\n URL.revokeObjectURL(filePreviewUrl.value);\n filePreviewUrl.value = null;\n }\n});\n</script>\n\n<template>\n <Transition\n enter-active-class=\"tpl-design-slide-enter-active\"\n enter-from-class=\"tpl:translate-x-full\"\n enter-to-class=\"tpl:translate-x-0\"\n leave-active-class=\"tpl-design-slide-leave-active\"\n leave-from-class=\"tpl:translate-x-0\"\n leave-to-class=\"tpl:translate-x-full\"\n >\n <div\n v-if=\"visible\"\n role=\"complementary\"\n :aria-label=\"cloudT.designReference.title\"\n class=\"tpl-design-sidebar tpl:absolute tpl:top-14 tpl:right-0 tpl:bottom-0 tpl:flex tpl:w-[360px] tpl:flex-col tpl:border-l tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg-elevated)]\"\n >\n <!-- Header -->\n <div\n class=\"tpl:flex tpl:items-center tpl:justify-between tpl:border-b tpl:border-[var(--tpl-border)] tpl:px-4 tpl:py-3\"\n >\n <div\n class=\"tpl:flex tpl:items-center tpl:gap-1.5 tpl:text-sm tpl:font-medium tpl:text-[var(--tpl-primary)]\"\n >\n <ImageUp :size=\"13\" :stroke-width=\"2\" />\n <span>{{ cloudT.designReference.title }}</span>\n </div>\n <button\n type=\"button\"\n class=\"tpl:rounded-md tpl:p-0.5 tpl:transition-colors tpl:text-[var(--tpl-text-muted)]\"\n :aria-label=\"cloudT.designReference.close\"\n @click=\"emit('close')\"\n >\n <X :size=\"14\" :stroke-width=\"2\" />\n </button>\n </div>\n\n <!-- Content -->\n <div class=\"tpl:flex-1 tpl:overflow-y-auto tpl:p-4\">\n <!-- Loading state -->\n <div\n v-if=\"designReference.isGenerating.value\"\n class=\"tpl:flex tpl:h-full tpl:flex-col tpl:items-center tpl:justify-center tpl:gap-3 tpl:text-center\"\n >\n <div\n class=\"tpl:flex tpl:w-full tpl:flex-col tpl:items-center tpl:gap-3\"\n >\n <LoadingTrack />\n <p class=\"tpl:text-sm tpl:text-[var(--tpl-text-muted)]\">\n {{ cloudT.designReference.generating }}\n </p>\n </div>\n </div>\n\n <!-- Input form -->\n <div v-else class=\"tpl:flex tpl:flex-col tpl:gap-4\">\n <!-- Source tabs -->\n <div\n class=\"tpl:flex tpl:gap-1 tpl:rounded-[var(--tpl-radius-sm)] tpl:p-1 tpl:bg-[var(--tpl-bg-hover)]\"\n >\n <button\n class=\"tpl:flex tpl:flex-1 tpl:items-center tpl:justify-center tpl:gap-1.5 tpl:rounded-[var(--tpl-radius-sm)] tpl:px-2 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:transition-all\"\n :style=\"{\n backgroundColor:\n activeTab === 'image' ? 'var(--tpl-bg)' : 'transparent',\n color:\n activeTab === 'image'\n ? 'var(--tpl-primary)'\n : 'var(--tpl-text-muted)',\n boxShadow: activeTab === 'image' ? 'var(--tpl-shadow)' : 'none',\n }\"\n @click=\"selectTab('image')\"\n >\n <FileImage :size=\"12\" :stroke-width=\"2\" />\n {{ cloudT.designReference.uploadImage }}\n </button>\n <button\n class=\"tpl:flex tpl:flex-1 tpl:items-center tpl:justify-center tpl:gap-1.5 tpl:rounded-[var(--tpl-radius-sm)] tpl:px-2 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:transition-all\"\n :style=\"{\n backgroundColor:\n activeTab === 'pdf' ? 'var(--tpl-bg)' : 'transparent',\n color:\n activeTab === 'pdf'\n ? 'var(--tpl-primary)'\n : 'var(--tpl-text-muted)',\n boxShadow: activeTab === 'pdf' ? 'var(--tpl-shadow)' : 'none',\n }\"\n @click=\"selectTab('pdf')\"\n >\n <FileText :size=\"12\" :stroke-width=\"2\" />\n {{ cloudT.designReference.uploadPdf }}\n </button>\n </div>\n\n <!-- File upload area (image or pdf) -->\n <div>\n <!-- Preview -->\n <div v-if=\"selectedFile\" class=\"tpl:flex tpl:flex-col tpl:gap-2\">\n <div\n class=\"tpl:relative tpl:overflow-hidden tpl:rounded-[var(--tpl-radius)] tpl:border tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg)]\"\n >\n <!-- Image preview -->\n <img\n v-if=\"filePreviewUrl\"\n :src=\"filePreviewUrl\"\n :alt=\"selectedFile.name\"\n class=\"tpl:h-auto tpl:max-h-48 tpl:w-full tpl:object-contain\"\n />\n <!-- PDF preview (icon-based) -->\n <div\n v-else\n class=\"tpl:flex tpl:h-32 tpl:flex-col tpl:items-center tpl:justify-center tpl:gap-2\"\n >\n <FileText\n :size=\"32\"\n :stroke-width=\"1.5\"\n class=\"tpl:text-[var(--tpl-text-dim)]\"\n />\n <span class=\"tpl:text-xs tpl:text-[var(--tpl-text-muted)]\">\n {{ selectedFile.name }}\n </span>\n </div>\n <!-- Remove button -->\n <button\n class=\"tpl:absolute tpl:top-2 tpl:right-2 tpl:rounded-full tpl:p-1 tpl:transition-colors tpl:bg-[var(--tpl-bg)] tpl:text-[var(--tpl-text-muted)] tpl:shadow-[var(--tpl-shadow)]\"\n @click=\"clearFile\"\n >\n <X :size=\"12\" :stroke-width=\"2\" />\n </button>\n </div>\n </div>\n\n <!-- Drop zone -->\n <div\n v-else\n class=\"tpl-design-dropzone tpl:flex tpl:cursor-pointer tpl:flex-col tpl:items-center tpl:justify-center tpl:gap-2 tpl:rounded-[var(--tpl-radius)] tpl:border-2 tpl:border-dashed tpl:px-4 tpl:py-8 tpl:transition-colors\"\n :style=\"{\n borderColor: isDragging\n ? 'var(--tpl-primary)'\n : 'var(--tpl-border-light)',\n backgroundColor: isDragging\n ? 'var(--tpl-primary-light)'\n : 'var(--tpl-bg)',\n }\"\n @click=\"fileInput?.click()\"\n @dragover=\"handleDragOver\"\n @dragleave=\"handleDragLeave\"\n @drop=\"handleDrop\"\n >\n <Upload\n :size=\"24\"\n :stroke-width=\"1.5\"\n class=\"tpl:text-[var(--tpl-text-dim)]\"\n />\n <span\n class=\"tpl:text-center tpl:text-xs tpl:text-[var(--tpl-text-muted)]\"\n >\n {{ cloudT.designReference.dropHint }}\n </span>\n <span\n class=\"tpl:text-center tpl:text-[10px] tpl:text-[var(--tpl-text-dim)]\"\n >\n {{\n activeTab === \"image\"\n ? cloudT.designReference.acceptedImages\n : cloudT.designReference.acceptedPdf\n }}\n </span>\n </div>\n <input\n ref=\"fileInput\"\n type=\"file\"\n class=\"tpl:hidden\"\n :accept=\"\n activeTab === 'image'\n ? 'image/png,image/jpeg,image/webp'\n : 'application/pdf'\n \"\n @change=\"handleFileSelect\"\n />\n </div>\n\n <!-- Prompt textarea -->\n <div class=\"tpl:flex tpl:flex-col tpl:gap-1.5\">\n <label\n class=\"tpl:text-xs tpl:font-medium tpl:text-[var(--tpl-text-muted)]\"\n >\n {{ cloudT.designReference.promptLabel }}\n </label>\n <textarea\n v-model=\"prompt\"\n class=\"tpl:min-h-[72px] tpl:w-full tpl:resize-none tpl:rounded-[var(--tpl-radius-sm)] tpl:border tpl:px-3 tpl:py-2 tpl:font-sans tpl:text-sm tpl:outline-none tpl:transition-colors tpl:border-[var(--tpl-border)] tpl:text-[var(--tpl-text)] tpl:bg-[var(--tpl-bg)] tpl:focus:border-[var(--tpl-primary)] tpl:focus:shadow-[var(--tpl-ring)]\"\n :class=\"['tpl-design-prompt-input']\"\n :placeholder=\"cloudT.designReference.promptPlaceholder\"\n rows=\"3\"\n />\n </div>\n\n <!-- Confirmation overlay -->\n <div\n v-if=\"showConfirmation\"\n class=\"tpl:flex tpl:flex-col tpl:gap-2 tpl:rounded-[var(--tpl-radius)] tpl:px-3 tpl:py-3 tpl:bg-[var(--tpl-warning-light)] tpl:border tpl:border-[var(--tpl-warning)]\"\n >\n <p class=\"tpl:text-xs tpl:leading-snug tpl:text-[var(--tpl-text)]\">\n {{ cloudT.designReference.replaceWarning }}\n </p>\n <div class=\"tpl:flex tpl:gap-2\">\n <button\n class=\"tpl:flex-1 tpl:rounded-[var(--tpl-radius-sm)] tpl:px-3 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:transition-all tpl:text-[var(--tpl-text-muted)] tpl:border tpl:border-[var(--tpl-border)]\"\n style=\"background-color: transparent\"\n @click=\"cancelConfirmation\"\n >\n {{ cloudT.designReference.replaceCancel }}\n </button>\n <button\n type=\"button\"\n :class=\"[primaryBtnClass, 'tpl:flex-1']\"\n @click=\"handleGenerate\"\n >\n {{ cloudT.designReference.replaceConfirm }}\n </button>\n </div>\n </div>\n\n <!-- Error message -->\n <div\n v-if=\"designReference.error.value\"\n class=\"tpl:flex tpl:items-start tpl:gap-2 tpl:rounded-lg tpl:px-3 tpl:py-2 tpl:text-xs tpl:bg-[var(--tpl-danger-light)] tpl:text-[var(--tpl-danger)]\"\n >\n <CircleAlert\n :size=\"14\"\n :stroke-width=\"2\"\n class=\"tpl:mt-0.5 tpl:shrink-0\"\n />\n <span>{{ cloudT.designReference.error }}</span>\n </div>\n\n <!-- Generate button -->\n <button\n v-if=\"!showConfirmation\"\n type=\"button\"\n :class=\"[primaryBtnClass, 'tpl:w-full']\"\n :disabled=\"!canGenerate\"\n @click=\"handleGenerate\"\n >\n <ImageUp :size=\"16\" :stroke-width=\"2\" />\n {{ cloudT.designReference.generate }}\n </button>\n\n <!-- AI disclaimer -->\n <p\n class=\"tpl:m-0 tpl:pt-1 tpl:text-center tpl:text-[10px] tpl:text-[var(--tpl-text-dim)]\"\n >\n {{ cloudT.aiMenu.disclaimer }}\n </p>\n </div>\n </div>\n </div>\n </Transition>\n</template>\n\n<style scoped>\n.tpl-design-slide-enter-active {\n transition: transform 280ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n.tpl-design-slide-leave-active {\n transition: transform 200ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n.tpl-design-prompt-input:focus {\n border-color: var(--tpl-primary);\n box-shadow: var(--tpl-ring);\n}\n\n.tpl-design-dropzone:hover {\n border-color: var(--tpl-primary) !important;\n background-color: var(--tpl-primary-light) !important;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { MAX_UPLOAD_SIZE_BYTES } from \"../../constants/timeouts\";\nimport { primaryBtnClass } from \"../../constants/styleConstants\";\nimport LoadingTrack from \"../../components/LoadingTrack.vue\";\nimport { useDesignReference } from \"@templatical/core/cloud\";\nimport { EDITOR_KEY, AUTH_MANAGER_KEY, requireInject } from \"../../keys\";\nimport { useCloudI18nStrict } from \"../../composables/useCloudI18n\";\nimport type { TemplateContent } from \"@templatical/types\";\nimport {\n CircleAlert,\n FileImage,\n FileText,\n ImageUp,\n Upload,\n X,\n} from \"@lucide/vue\";\nimport { computed, onBeforeUnmount, ref, watch } from \"vue\";\n\nconst props = defineProps<{\n visible: boolean;\n hasExistingBlocks: boolean;\n}>();\n\nconst emit = defineEmits<{\n (e: \"close\"): void;\n (e: \"apply\", content: TemplateContent): void;\n}>();\n\nconst { t: cloudT } = useCloudI18nStrict();\nconst editor = requireInject(EDITOR_KEY, \"DesignReferenceSidebar\");\nconst authManager = requireInject(AUTH_MANAGER_KEY, \"DesignReferenceSidebar\");\n\nconst designReference = useDesignReference({\n authManager,\n getTemplateId: () => editor.state.template?.id ?? null,\n onApply: (content) => emit(\"apply\", content),\n});\n\nconst fileInput = ref<HTMLInputElement | null>(null);\n\ntype SourceTab = \"image\" | \"pdf\";\n\nconst activeTab = ref<SourceTab>(\"image\");\nconst selectedFile = ref<File | null>(null);\nconst prompt = ref(\"\");\nconst filePreviewUrl = ref<string | null>(null);\nconst showConfirmation = ref(false);\nconst isDragging = ref(false);\n\nconst canGenerate = computed(() => {\n if (designReference.isGenerating.value) {\n return false;\n }\n\n return selectedFile.value !== null;\n});\n\nfunction selectTab(tab: SourceTab): void {\n activeTab.value = tab;\n clearFile();\n}\n\nfunction handleFileSelect(event: Event): void {\n const input = event.target as HTMLInputElement;\n const file = input.files?.[0];\n if (file) {\n setFile(file);\n }\n // Reset input so same file can be selected again\n input.value = \"\";\n}\n\nfunction setFile(file: File): void {\n // Validate file size (10MB)\n if (file.size > MAX_UPLOAD_SIZE_BYTES) {\n designReference.error.value = cloudT.designReference.fileTooLarge;\n return;\n }\n\n // Validate file type\n if (activeTab.value === \"image\") {\n const validTypes = [\"image/png\", \"image/jpeg\", \"image/jpg\", \"image/webp\"];\n if (!validTypes.includes(file.type)) {\n designReference.error.value = cloudT.designReference.invalidFileType;\n return;\n }\n } else if (activeTab.value === \"pdf\") {\n if (file.type !== \"application/pdf\") {\n designReference.error.value = cloudT.designReference.invalidFileType;\n return;\n }\n }\n\n selectedFile.value = file;\n designReference.error.value = null;\n\n // Create preview URL for images\n if (filePreviewUrl.value) {\n URL.revokeObjectURL(filePreviewUrl.value);\n }\n if (file.type.startsWith(\"image/\")) {\n filePreviewUrl.value = URL.createObjectURL(file);\n } else {\n filePreviewUrl.value = null;\n }\n}\n\nfunction clearFile(): void {\n if (filePreviewUrl.value) {\n URL.revokeObjectURL(filePreviewUrl.value);\n filePreviewUrl.value = null;\n }\n selectedFile.value = null;\n}\n\nfunction handleDragOver(event: DragEvent): void {\n event.preventDefault();\n isDragging.value = true;\n}\n\nfunction handleDragLeave(): void {\n isDragging.value = false;\n}\n\nfunction handleDrop(event: DragEvent): void {\n event.preventDefault();\n isDragging.value = false;\n\n const file = event.dataTransfer?.files?.[0];\n if (file) {\n setFile(file);\n }\n}\n\nfunction handleGenerate(): void {\n if (!canGenerate.value) {\n return;\n }\n\n // Show confirmation if there are existing blocks\n if (props.hasExistingBlocks && !showConfirmation.value) {\n showConfirmation.value = true;\n return;\n }\n\n showConfirmation.value = false;\n\n const input: {\n prompt?: string;\n imageUpload?: File;\n pdfUpload?: File;\n } = {};\n\n if (prompt.value.trim()) {\n input.prompt = prompt.value.trim();\n }\n\n if (activeTab.value === \"image\" && selectedFile.value) {\n input.imageUpload = selectedFile.value;\n } else if (activeTab.value === \"pdf\" && selectedFile.value) {\n input.pdfUpload = selectedFile.value;\n }\n\n designReference.generate(input);\n}\n\nfunction cancelConfirmation(): void {\n showConfirmation.value = false;\n}\n\n// Reset state when panel closes\nwatch(\n () => props.visible,\n (isVisible) => {\n if (!isVisible) {\n showConfirmation.value = false;\n }\n },\n);\n\nonBeforeUnmount(() => {\n if (filePreviewUrl.value) {\n URL.revokeObjectURL(filePreviewUrl.value);\n filePreviewUrl.value = null;\n }\n});\n</script>\n\n<template>\n <Transition\n enter-active-class=\"tpl-design-slide-enter-active\"\n enter-from-class=\"tpl:translate-x-full\"\n enter-to-class=\"tpl:translate-x-0\"\n leave-active-class=\"tpl-design-slide-leave-active\"\n leave-from-class=\"tpl:translate-x-0\"\n leave-to-class=\"tpl:translate-x-full\"\n >\n <div\n v-if=\"visible\"\n role=\"complementary\"\n :aria-label=\"cloudT.designReference.title\"\n class=\"tpl-design-sidebar tpl:absolute tpl:top-14 tpl:right-0 tpl:bottom-0 tpl:flex tpl:w-[360px] tpl:flex-col tpl:border-l tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg-elevated)]\"\n >\n <!-- Header -->\n <div\n class=\"tpl:flex tpl:items-center tpl:justify-between tpl:border-b tpl:border-[var(--tpl-border)] tpl:px-4 tpl:py-3\"\n >\n <div\n class=\"tpl:flex tpl:items-center tpl:gap-1.5 tpl:text-sm tpl:font-medium tpl:text-[var(--tpl-primary)]\"\n >\n <ImageUp :size=\"13\" :stroke-width=\"2\" />\n <span>{{ cloudT.designReference.title }}</span>\n </div>\n <button\n type=\"button\"\n class=\"tpl:rounded-md tpl:p-0.5 tpl:transition-colors tpl:text-[var(--tpl-text-muted)]\"\n :aria-label=\"cloudT.designReference.close\"\n @click=\"emit('close')\"\n >\n <X :size=\"14\" :stroke-width=\"2\" />\n </button>\n </div>\n\n <!-- Content -->\n <div class=\"tpl:flex-1 tpl:overflow-y-auto tpl:p-4\">\n <!-- Loading state -->\n <div\n v-if=\"designReference.isGenerating.value\"\n class=\"tpl:flex tpl:h-full tpl:flex-col tpl:items-center tpl:justify-center tpl:gap-3 tpl:text-center\"\n >\n <div\n class=\"tpl:flex tpl:w-full tpl:flex-col tpl:items-center tpl:gap-3\"\n >\n <LoadingTrack />\n <p class=\"tpl:text-sm tpl:text-[var(--tpl-text-muted)]\">\n {{ cloudT.designReference.generating }}\n </p>\n </div>\n </div>\n\n <!-- Input form -->\n <div v-else class=\"tpl:flex tpl:flex-col tpl:gap-4\">\n <!-- Source tabs -->\n <div\n class=\"tpl:flex tpl:gap-1 tpl:rounded-[var(--tpl-radius-sm)] tpl:p-1 tpl:bg-[var(--tpl-bg-hover)]\"\n >\n <button\n class=\"tpl:flex tpl:flex-1 tpl:items-center tpl:justify-center tpl:gap-1.5 tpl:rounded-[var(--tpl-radius-sm)] tpl:px-2 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:transition-all\"\n :style=\"{\n backgroundColor:\n activeTab === 'image' ? 'var(--tpl-bg)' : 'transparent',\n color:\n activeTab === 'image'\n ? 'var(--tpl-primary)'\n : 'var(--tpl-text-muted)',\n boxShadow: activeTab === 'image' ? 'var(--tpl-shadow)' : 'none',\n }\"\n @click=\"selectTab('image')\"\n >\n <FileImage :size=\"12\" :stroke-width=\"2\" />\n {{ cloudT.designReference.uploadImage }}\n </button>\n <button\n class=\"tpl:flex tpl:flex-1 tpl:items-center tpl:justify-center tpl:gap-1.5 tpl:rounded-[var(--tpl-radius-sm)] tpl:px-2 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:transition-all\"\n :style=\"{\n backgroundColor:\n activeTab === 'pdf' ? 'var(--tpl-bg)' : 'transparent',\n color:\n activeTab === 'pdf'\n ? 'var(--tpl-primary)'\n : 'var(--tpl-text-muted)',\n boxShadow: activeTab === 'pdf' ? 'var(--tpl-shadow)' : 'none',\n }\"\n @click=\"selectTab('pdf')\"\n >\n <FileText :size=\"12\" :stroke-width=\"2\" />\n {{ cloudT.designReference.uploadPdf }}\n </button>\n </div>\n\n <!-- File upload area (image or pdf) -->\n <div>\n <!-- Preview -->\n <div v-if=\"selectedFile\" class=\"tpl:flex tpl:flex-col tpl:gap-2\">\n <div\n class=\"tpl:relative tpl:overflow-hidden tpl:rounded-[var(--tpl-radius)] tpl:border tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg)]\"\n >\n <!-- Image preview -->\n <img\n v-if=\"filePreviewUrl\"\n :src=\"filePreviewUrl\"\n :alt=\"selectedFile.name\"\n class=\"tpl:h-auto tpl:max-h-48 tpl:w-full tpl:object-contain\"\n />\n <!-- PDF preview (icon-based) -->\n <div\n v-else\n class=\"tpl:flex tpl:h-32 tpl:flex-col tpl:items-center tpl:justify-center tpl:gap-2\"\n >\n <FileText\n :size=\"32\"\n :stroke-width=\"1.5\"\n class=\"tpl:text-[var(--tpl-text-dim)]\"\n />\n <span class=\"tpl:text-xs tpl:text-[var(--tpl-text-muted)]\">\n {{ selectedFile.name }}\n </span>\n </div>\n <!-- Remove button -->\n <button\n class=\"tpl:absolute tpl:top-2 tpl:right-2 tpl:rounded-full tpl:p-1 tpl:transition-colors tpl:bg-[var(--tpl-bg)] tpl:text-[var(--tpl-text-muted)] tpl:shadow-[var(--tpl-shadow)]\"\n @click=\"clearFile\"\n >\n <X :size=\"12\" :stroke-width=\"2\" />\n </button>\n </div>\n </div>\n\n <!-- Drop zone -->\n <div\n v-else\n class=\"tpl-design-dropzone tpl:flex tpl:cursor-pointer tpl:flex-col tpl:items-center tpl:justify-center tpl:gap-2 tpl:rounded-[var(--tpl-radius)] tpl:border-2 tpl:border-dashed tpl:px-4 tpl:py-8 tpl:transition-colors\"\n :style=\"{\n borderColor: isDragging\n ? 'var(--tpl-primary)'\n : 'var(--tpl-border-light)',\n backgroundColor: isDragging\n ? 'var(--tpl-primary-light)'\n : 'var(--tpl-bg)',\n }\"\n @click=\"fileInput?.click()\"\n @dragover=\"handleDragOver\"\n @dragleave=\"handleDragLeave\"\n @drop=\"handleDrop\"\n >\n <Upload\n :size=\"24\"\n :stroke-width=\"1.5\"\n class=\"tpl:text-[var(--tpl-text-dim)]\"\n />\n <span\n class=\"tpl:text-center tpl:text-xs tpl:text-[var(--tpl-text-muted)]\"\n >\n {{ cloudT.designReference.dropHint }}\n </span>\n <span\n class=\"tpl:text-center tpl:text-[10px] tpl:text-[var(--tpl-text-dim)]\"\n >\n {{\n activeTab === \"image\"\n ? cloudT.designReference.acceptedImages\n : cloudT.designReference.acceptedPdf\n }}\n </span>\n </div>\n <input\n ref=\"fileInput\"\n type=\"file\"\n class=\"tpl:hidden\"\n :accept=\"\n activeTab === 'image'\n ? 'image/png,image/jpeg,image/webp'\n : 'application/pdf'\n \"\n @change=\"handleFileSelect\"\n />\n </div>\n\n <!-- Prompt textarea -->\n <div class=\"tpl:flex tpl:flex-col tpl:gap-1.5\">\n <label\n class=\"tpl:text-xs tpl:font-medium tpl:text-[var(--tpl-text-muted)]\"\n >\n {{ cloudT.designReference.promptLabel }}\n </label>\n <textarea\n v-model=\"prompt\"\n class=\"tpl:min-h-[72px] tpl:w-full tpl:resize-none tpl:rounded-[var(--tpl-radius-sm)] tpl:border tpl:px-3 tpl:py-2 tpl:font-sans tpl:text-sm tpl:outline-none tpl:transition-colors tpl:border-[var(--tpl-border)] tpl:text-[var(--tpl-text)] tpl:bg-[var(--tpl-bg)] tpl:focus:border-[var(--tpl-primary)] tpl:focus:shadow-[var(--tpl-ring)]\"\n :class=\"['tpl-design-prompt-input']\"\n :placeholder=\"cloudT.designReference.promptPlaceholder\"\n rows=\"3\"\n />\n </div>\n\n <!-- Confirmation overlay -->\n <div\n v-if=\"showConfirmation\"\n class=\"tpl:flex tpl:flex-col tpl:gap-2 tpl:rounded-[var(--tpl-radius)] tpl:px-3 tpl:py-3 tpl:bg-[var(--tpl-warning-light)] tpl:border tpl:border-[var(--tpl-warning)]\"\n >\n <p class=\"tpl:text-xs tpl:leading-snug tpl:text-[var(--tpl-text)]\">\n {{ cloudT.designReference.replaceWarning }}\n </p>\n <div class=\"tpl:flex tpl:gap-2\">\n <button\n class=\"tpl:flex-1 tpl:rounded-[var(--tpl-radius-sm)] tpl:px-3 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:transition-all tpl:text-[var(--tpl-text-muted)] tpl:border tpl:border-[var(--tpl-border)]\"\n style=\"background-color: transparent\"\n @click=\"cancelConfirmation\"\n >\n {{ cloudT.designReference.replaceCancel }}\n </button>\n <button\n type=\"button\"\n :class=\"[primaryBtnClass, 'tpl:flex-1']\"\n @click=\"handleGenerate\"\n >\n {{ cloudT.designReference.replaceConfirm }}\n </button>\n </div>\n </div>\n\n <!-- Error message -->\n <div\n v-if=\"designReference.error.value\"\n class=\"tpl:flex tpl:items-start tpl:gap-2 tpl:rounded-lg tpl:px-3 tpl:py-2 tpl:text-xs tpl:bg-[var(--tpl-danger-light)] tpl:text-[var(--tpl-danger)]\"\n >\n <CircleAlert\n :size=\"14\"\n :stroke-width=\"2\"\n class=\"tpl:mt-0.5 tpl:shrink-0\"\n />\n <span>{{ cloudT.designReference.error }}</span>\n </div>\n\n <!-- Generate button -->\n <button\n v-if=\"!showConfirmation\"\n type=\"button\"\n :class=\"[primaryBtnClass, 'tpl:w-full']\"\n :disabled=\"!canGenerate\"\n @click=\"handleGenerate\"\n >\n <ImageUp :size=\"16\" :stroke-width=\"2\" />\n {{ cloudT.designReference.generate }}\n </button>\n\n <!-- AI disclaimer -->\n <p\n class=\"tpl:m-0 tpl:pt-1 tpl:text-center tpl:text-[10px] tpl:text-[var(--tpl-text-dim)]\"\n >\n {{ cloudT.aiMenu.disclaimer }}\n </p>\n </div>\n </div>\n </div>\n </Transition>\n</template>\n\n<style scoped>\n.tpl-design-slide-enter-active {\n transition: transform 280ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n.tpl-design-slide-leave-active {\n transition: transform 200ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n.tpl-design-prompt-input:focus {\n border-color: var(--tpl-primary);\n box-shadow: var(--tpl-ring);\n}\n\n.tpl-design-dropzone:hover {\n border-color: var(--tpl-primary) !important;\n background-color: var(--tpl-primary-light) !important;\n}\n</style>\n"],"mappings":"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"}
1
+ {"version":3,"file":"DesignReferenceSidebar-C6O12hvt.js","names":["_openBlock","_createBlock","_Transition","_withCtx","_createElementBlock","_unref","_createElementVNode","_createVNode","_toDisplayString","LoadingTrack","_normalizeStyle","_createTextVNode","_withDirectives","_normalizeClass","_vModelText","_createCommentVNode","_sfc_main","onBeforeUnmount","watch","withCtx","openBlock","ref","defineComponent","withDirectives","unref","createVNode","normalizeClass","computed","createElementBlock","createCommentVNode","normalizeStyle","createBlock","Transition","vModelText","createBaseVNode","toDisplayString","createTextVNode","requireInject","EDITOR_KEY","AUTH_MANAGER_KEY","FileImage","CircleAlert","FileText","ImageUp","X","Upload","LoadingTrack_default","_plugin_vue_export_helper_default","useCloudI18nStrict","primaryBtnClass","useDesignReference","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","DesignReferenceSidebar_default","__emit","props","__props","emit","cloudT","editor","authManager","designReference","content","fileInput","activeTab","selectedFile","prompt","filePreviewUrl","showConfirmation","isDragging","canGenerate","selectTab","tab","clearFile","handleFileSelect","input","event","file","setFile","handleDragOver","handleDragLeave","handleDrop","handleGenerate","cancelConfirmation","isVisible","_cache","$event"],"sources":["../../../src/cloud/components/DesignReferenceSidebar.vue","../../../src/cloud/components/DesignReferenceSidebar.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { MAX_UPLOAD_SIZE_BYTES } from \"../../constants/timeouts\";\nimport { primaryBtnClass } from \"../../constants/styleConstants\";\nimport LoadingTrack from \"../../components/LoadingTrack.vue\";\nimport { useDesignReference } from \"@templatical/core/cloud\";\nimport { EDITOR_KEY, AUTH_MANAGER_KEY, requireInject } from \"../../keys\";\nimport { useCloudI18nStrict } from \"../../composables/useCloudI18n\";\nimport type { TemplateContent } from \"@templatical/types\";\nimport {\n CircleAlert,\n FileImage,\n FileText,\n ImageUp,\n Upload,\n X,\n} from \"@lucide/vue\";\nimport { computed, onBeforeUnmount, ref, watch } from \"vue\";\n\nconst props = defineProps<{\n visible: boolean;\n hasExistingBlocks: boolean;\n}>();\n\nconst emit = defineEmits<{\n (e: \"close\"): void;\n (e: \"apply\", content: TemplateContent): void;\n}>();\n\nconst { t: cloudT } = useCloudI18nStrict();\nconst editor = requireInject(EDITOR_KEY, \"DesignReferenceSidebar\");\nconst authManager = requireInject(AUTH_MANAGER_KEY, \"DesignReferenceSidebar\");\n\nconst designReference = useDesignReference({\n authManager,\n getTemplateId: () => editor.state.template?.id ?? null,\n onApply: (content) => emit(\"apply\", content),\n});\n\nconst fileInput = ref<HTMLInputElement | null>(null);\n\ntype SourceTab = \"image\" | \"pdf\";\n\nconst activeTab = ref<SourceTab>(\"image\");\nconst selectedFile = ref<File | null>(null);\nconst prompt = ref(\"\");\nconst filePreviewUrl = ref<string | null>(null);\nconst showConfirmation = ref(false);\nconst isDragging = ref(false);\n\nconst canGenerate = computed(() => {\n if (designReference.isGenerating.value) {\n return false;\n }\n\n return selectedFile.value !== null;\n});\n\nfunction selectTab(tab: SourceTab): void {\n activeTab.value = tab;\n clearFile();\n}\n\nfunction handleFileSelect(event: Event): void {\n const input = event.target as HTMLInputElement;\n const file = input.files?.[0];\n if (file) {\n setFile(file);\n }\n // Reset input so same file can be selected again\n input.value = \"\";\n}\n\nfunction setFile(file: File): void {\n // Validate file size (10MB)\n if (file.size > MAX_UPLOAD_SIZE_BYTES) {\n designReference.error.value = cloudT.designReference.fileTooLarge;\n return;\n }\n\n // Validate file type\n if (activeTab.value === \"image\") {\n const validTypes = [\"image/png\", \"image/jpeg\", \"image/jpg\", \"image/webp\"];\n if (!validTypes.includes(file.type)) {\n designReference.error.value = cloudT.designReference.invalidFileType;\n return;\n }\n } else if (activeTab.value === \"pdf\") {\n if (file.type !== \"application/pdf\") {\n designReference.error.value = cloudT.designReference.invalidFileType;\n return;\n }\n }\n\n selectedFile.value = file;\n designReference.error.value = null;\n\n // Create preview URL for images\n if (filePreviewUrl.value) {\n URL.revokeObjectURL(filePreviewUrl.value);\n }\n if (file.type.startsWith(\"image/\")) {\n filePreviewUrl.value = URL.createObjectURL(file);\n } else {\n filePreviewUrl.value = null;\n }\n}\n\nfunction clearFile(): void {\n if (filePreviewUrl.value) {\n URL.revokeObjectURL(filePreviewUrl.value);\n filePreviewUrl.value = null;\n }\n selectedFile.value = null;\n}\n\nfunction handleDragOver(event: DragEvent): void {\n event.preventDefault();\n isDragging.value = true;\n}\n\nfunction handleDragLeave(): void {\n isDragging.value = false;\n}\n\nfunction handleDrop(event: DragEvent): void {\n event.preventDefault();\n isDragging.value = false;\n\n const file = event.dataTransfer?.files?.[0];\n if (file) {\n setFile(file);\n }\n}\n\nfunction handleGenerate(): void {\n if (!canGenerate.value) {\n return;\n }\n\n // Show confirmation if there are existing blocks\n if (props.hasExistingBlocks && !showConfirmation.value) {\n showConfirmation.value = true;\n return;\n }\n\n showConfirmation.value = false;\n\n const input: {\n prompt?: string;\n imageUpload?: File;\n pdfUpload?: File;\n } = {};\n\n if (prompt.value.trim()) {\n input.prompt = prompt.value.trim();\n }\n\n if (activeTab.value === \"image\" && selectedFile.value) {\n input.imageUpload = selectedFile.value;\n } else if (activeTab.value === \"pdf\" && selectedFile.value) {\n input.pdfUpload = selectedFile.value;\n }\n\n designReference.generate(input);\n}\n\nfunction cancelConfirmation(): void {\n showConfirmation.value = false;\n}\n\n// Reset state when panel closes\nwatch(\n () => props.visible,\n (isVisible) => {\n if (!isVisible) {\n showConfirmation.value = false;\n }\n },\n);\n\nonBeforeUnmount(() => {\n if (filePreviewUrl.value) {\n URL.revokeObjectURL(filePreviewUrl.value);\n filePreviewUrl.value = null;\n }\n});\n</script>\n\n<template>\n <Transition\n enter-active-class=\"tpl-design-slide-enter-active\"\n enter-from-class=\"tpl:translate-x-full\"\n enter-to-class=\"tpl:translate-x-0\"\n leave-active-class=\"tpl-design-slide-leave-active\"\n leave-from-class=\"tpl:translate-x-0\"\n leave-to-class=\"tpl:translate-x-full\"\n >\n <div\n v-if=\"visible\"\n role=\"complementary\"\n :aria-label=\"cloudT.designReference.title\"\n class=\"tpl-design-sidebar tpl:absolute tpl:top-14 tpl:right-0 tpl:bottom-0 tpl:flex tpl:w-[360px] tpl:flex-col tpl:border-l tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg-elevated)]\"\n >\n <!-- Header -->\n <div\n class=\"tpl:flex tpl:items-center tpl:justify-between tpl:border-b tpl:border-[var(--tpl-border)] tpl:px-4 tpl:py-3\"\n >\n <div\n class=\"tpl:flex tpl:items-center tpl:gap-1.5 tpl:text-sm tpl:font-medium tpl:text-[var(--tpl-primary)]\"\n >\n <ImageUp :size=\"13\" :stroke-width=\"2\" />\n <span>{{ cloudT.designReference.title }}</span>\n </div>\n <button\n type=\"button\"\n class=\"tpl:rounded-md tpl:p-0.5 tpl:transition-colors tpl:text-[var(--tpl-text-muted)]\"\n :aria-label=\"cloudT.designReference.close\"\n @click=\"emit('close')\"\n >\n <X :size=\"14\" :stroke-width=\"2\" />\n </button>\n </div>\n\n <!-- Content -->\n <div class=\"tpl:flex-1 tpl:overflow-y-auto tpl:p-4\">\n <!-- Loading state -->\n <div\n v-if=\"designReference.isGenerating.value\"\n class=\"tpl:flex tpl:h-full tpl:flex-col tpl:items-center tpl:justify-center tpl:gap-3 tpl:text-center\"\n >\n <div\n class=\"tpl:flex tpl:w-full tpl:flex-col tpl:items-center tpl:gap-3\"\n >\n <LoadingTrack />\n <p class=\"tpl:text-sm tpl:text-[var(--tpl-text-muted)]\">\n {{ cloudT.designReference.generating }}\n </p>\n </div>\n </div>\n\n <!-- Input form -->\n <div v-else class=\"tpl:flex tpl:flex-col tpl:gap-4\">\n <!-- Source tabs -->\n <div\n class=\"tpl:flex tpl:gap-1 tpl:rounded-[var(--tpl-radius-sm)] tpl:p-1 tpl:bg-[var(--tpl-bg-hover)]\"\n >\n <button\n class=\"tpl:flex tpl:flex-1 tpl:items-center tpl:justify-center tpl:gap-1.5 tpl:rounded-[var(--tpl-radius-sm)] tpl:px-2 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:transition-all\"\n :style=\"{\n backgroundColor:\n activeTab === 'image' ? 'var(--tpl-bg)' : 'transparent',\n color:\n activeTab === 'image'\n ? 'var(--tpl-primary)'\n : 'var(--tpl-text-muted)',\n boxShadow: activeTab === 'image' ? 'var(--tpl-shadow)' : 'none',\n }\"\n @click=\"selectTab('image')\"\n >\n <FileImage :size=\"12\" :stroke-width=\"2\" />\n {{ cloudT.designReference.uploadImage }}\n </button>\n <button\n class=\"tpl:flex tpl:flex-1 tpl:items-center tpl:justify-center tpl:gap-1.5 tpl:rounded-[var(--tpl-radius-sm)] tpl:px-2 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:transition-all\"\n :style=\"{\n backgroundColor:\n activeTab === 'pdf' ? 'var(--tpl-bg)' : 'transparent',\n color:\n activeTab === 'pdf'\n ? 'var(--tpl-primary)'\n : 'var(--tpl-text-muted)',\n boxShadow: activeTab === 'pdf' ? 'var(--tpl-shadow)' : 'none',\n }\"\n @click=\"selectTab('pdf')\"\n >\n <FileText :size=\"12\" :stroke-width=\"2\" />\n {{ cloudT.designReference.uploadPdf }}\n </button>\n </div>\n\n <!-- File upload area (image or pdf) -->\n <div>\n <!-- Preview -->\n <div v-if=\"selectedFile\" class=\"tpl:flex tpl:flex-col tpl:gap-2\">\n <div\n class=\"tpl:relative tpl:overflow-hidden tpl:rounded-[var(--tpl-radius)] tpl:border tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg)]\"\n >\n <!-- Image preview -->\n <img\n v-if=\"filePreviewUrl\"\n :src=\"filePreviewUrl\"\n :alt=\"selectedFile.name\"\n class=\"tpl:h-auto tpl:max-h-48 tpl:w-full tpl:object-contain\"\n />\n <!-- PDF preview (icon-based) -->\n <div\n v-else\n class=\"tpl:flex tpl:h-32 tpl:flex-col tpl:items-center tpl:justify-center tpl:gap-2\"\n >\n <FileText\n :size=\"32\"\n :stroke-width=\"1.5\"\n class=\"tpl:text-[var(--tpl-text-dim)]\"\n />\n <span class=\"tpl:text-xs tpl:text-[var(--tpl-text-muted)]\">\n {{ selectedFile.name }}\n </span>\n </div>\n <!-- Remove button -->\n <button\n class=\"tpl:absolute tpl:top-2 tpl:right-2 tpl:rounded-full tpl:p-1 tpl:transition-colors tpl:bg-[var(--tpl-bg)] tpl:text-[var(--tpl-text-muted)] tpl:shadow-[var(--tpl-shadow)]\"\n @click=\"clearFile\"\n >\n <X :size=\"12\" :stroke-width=\"2\" />\n </button>\n </div>\n </div>\n\n <!-- Drop zone -->\n <div\n v-else\n class=\"tpl-design-dropzone tpl:flex tpl:cursor-pointer tpl:flex-col tpl:items-center tpl:justify-center tpl:gap-2 tpl:rounded-[var(--tpl-radius)] tpl:border-2 tpl:border-dashed tpl:px-4 tpl:py-8 tpl:transition-colors\"\n :style=\"{\n borderColor: isDragging\n ? 'var(--tpl-primary)'\n : 'var(--tpl-border-light)',\n backgroundColor: isDragging\n ? 'var(--tpl-primary-light)'\n : 'var(--tpl-bg)',\n }\"\n @click=\"fileInput?.click()\"\n @dragover=\"handleDragOver\"\n @dragleave=\"handleDragLeave\"\n @drop=\"handleDrop\"\n >\n <Upload\n :size=\"24\"\n :stroke-width=\"1.5\"\n class=\"tpl:text-[var(--tpl-text-dim)]\"\n />\n <span\n class=\"tpl:text-center tpl:text-xs tpl:text-[var(--tpl-text-muted)]\"\n >\n {{ cloudT.designReference.dropHint }}\n </span>\n <span\n class=\"tpl:text-center tpl:text-[10px] tpl:text-[var(--tpl-text-dim)]\"\n >\n {{\n activeTab === \"image\"\n ? cloudT.designReference.acceptedImages\n : cloudT.designReference.acceptedPdf\n }}\n </span>\n </div>\n <input\n ref=\"fileInput\"\n type=\"file\"\n class=\"tpl:hidden\"\n :accept=\"\n activeTab === 'image'\n ? 'image/png,image/jpeg,image/webp'\n : 'application/pdf'\n \"\n @change=\"handleFileSelect\"\n />\n </div>\n\n <!-- Prompt textarea -->\n <div class=\"tpl:flex tpl:flex-col tpl:gap-1.5\">\n <label\n class=\"tpl:text-xs tpl:font-medium tpl:text-[var(--tpl-text-muted)]\"\n >\n {{ cloudT.designReference.promptLabel }}\n </label>\n <textarea\n v-model=\"prompt\"\n class=\"tpl:min-h-[72px] tpl:w-full tpl:resize-none tpl:rounded-[var(--tpl-radius-sm)] tpl:border tpl:px-3 tpl:py-2 tpl:font-sans tpl:text-sm tpl:outline-none tpl:transition-colors tpl:border-[var(--tpl-border)] tpl:text-[var(--tpl-text)] tpl:bg-[var(--tpl-bg)] tpl:focus:border-[var(--tpl-primary)] tpl:focus:shadow-[var(--tpl-ring)]\"\n :class=\"['tpl-design-prompt-input']\"\n :placeholder=\"cloudT.designReference.promptPlaceholder\"\n rows=\"3\"\n />\n </div>\n\n <!-- Confirmation overlay -->\n <div\n v-if=\"showConfirmation\"\n class=\"tpl:flex tpl:flex-col tpl:gap-2 tpl:rounded-[var(--tpl-radius)] tpl:px-3 tpl:py-3 tpl:bg-[var(--tpl-warning-light)] tpl:border tpl:border-[var(--tpl-warning)]\"\n >\n <p class=\"tpl:text-xs tpl:leading-snug tpl:text-[var(--tpl-text)]\">\n {{ cloudT.designReference.replaceWarning }}\n </p>\n <div class=\"tpl:flex tpl:gap-2\">\n <button\n class=\"tpl:flex-1 tpl:rounded-[var(--tpl-radius-sm)] tpl:px-3 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:transition-all tpl:text-[var(--tpl-text-muted)] tpl:border tpl:border-[var(--tpl-border)]\"\n style=\"background-color: transparent\"\n @click=\"cancelConfirmation\"\n >\n {{ cloudT.designReference.replaceCancel }}\n </button>\n <button\n type=\"button\"\n :class=\"[primaryBtnClass, 'tpl:flex-1']\"\n @click=\"handleGenerate\"\n >\n {{ cloudT.designReference.replaceConfirm }}\n </button>\n </div>\n </div>\n\n <!-- Error message -->\n <div\n v-if=\"designReference.error.value\"\n class=\"tpl:flex tpl:items-start tpl:gap-2 tpl:rounded-lg tpl:px-3 tpl:py-2 tpl:text-xs tpl:bg-[var(--tpl-danger-light)] tpl:text-[var(--tpl-danger)]\"\n >\n <CircleAlert\n :size=\"14\"\n :stroke-width=\"2\"\n class=\"tpl:mt-0.5 tpl:shrink-0\"\n />\n <span>{{ cloudT.designReference.error }}</span>\n </div>\n\n <!-- Generate button -->\n <button\n v-if=\"!showConfirmation\"\n type=\"button\"\n :class=\"[primaryBtnClass, 'tpl:w-full']\"\n :disabled=\"!canGenerate\"\n @click=\"handleGenerate\"\n >\n <ImageUp :size=\"16\" :stroke-width=\"2\" />\n {{ cloudT.designReference.generate }}\n </button>\n\n <!-- AI disclaimer -->\n <p\n class=\"tpl:m-0 tpl:pt-1 tpl:text-center tpl:text-[10px] tpl:text-[var(--tpl-text-dim)]\"\n >\n {{ cloudT.aiMenu.disclaimer }}\n </p>\n </div>\n </div>\n </div>\n </Transition>\n</template>\n\n<style scoped>\n.tpl-design-slide-enter-active {\n transition: transform 280ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n.tpl-design-slide-leave-active {\n transition: transform 200ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n.tpl-design-prompt-input:focus {\n border-color: var(--tpl-primary);\n box-shadow: var(--tpl-ring);\n}\n\n.tpl-design-dropzone:hover {\n border-color: var(--tpl-primary) !important;\n background-color: var(--tpl-primary-light) !important;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { MAX_UPLOAD_SIZE_BYTES } from \"../../constants/timeouts\";\nimport { primaryBtnClass } from \"../../constants/styleConstants\";\nimport LoadingTrack from \"../../components/LoadingTrack.vue\";\nimport { useDesignReference } from \"@templatical/core/cloud\";\nimport { EDITOR_KEY, AUTH_MANAGER_KEY, requireInject } from \"../../keys\";\nimport { useCloudI18nStrict } from \"../../composables/useCloudI18n\";\nimport type { TemplateContent } from \"@templatical/types\";\nimport {\n CircleAlert,\n FileImage,\n FileText,\n ImageUp,\n Upload,\n X,\n} from \"@lucide/vue\";\nimport { computed, onBeforeUnmount, ref, watch } from \"vue\";\n\nconst props = defineProps<{\n visible: boolean;\n hasExistingBlocks: boolean;\n}>();\n\nconst emit = defineEmits<{\n (e: \"close\"): void;\n (e: \"apply\", content: TemplateContent): void;\n}>();\n\nconst { t: cloudT } = useCloudI18nStrict();\nconst editor = requireInject(EDITOR_KEY, \"DesignReferenceSidebar\");\nconst authManager = requireInject(AUTH_MANAGER_KEY, \"DesignReferenceSidebar\");\n\nconst designReference = useDesignReference({\n authManager,\n getTemplateId: () => editor.state.template?.id ?? null,\n onApply: (content) => emit(\"apply\", content),\n});\n\nconst fileInput = ref<HTMLInputElement | null>(null);\n\ntype SourceTab = \"image\" | \"pdf\";\n\nconst activeTab = ref<SourceTab>(\"image\");\nconst selectedFile = ref<File | null>(null);\nconst prompt = ref(\"\");\nconst filePreviewUrl = ref<string | null>(null);\nconst showConfirmation = ref(false);\nconst isDragging = ref(false);\n\nconst canGenerate = computed(() => {\n if (designReference.isGenerating.value) {\n return false;\n }\n\n return selectedFile.value !== null;\n});\n\nfunction selectTab(tab: SourceTab): void {\n activeTab.value = tab;\n clearFile();\n}\n\nfunction handleFileSelect(event: Event): void {\n const input = event.target as HTMLInputElement;\n const file = input.files?.[0];\n if (file) {\n setFile(file);\n }\n // Reset input so same file can be selected again\n input.value = \"\";\n}\n\nfunction setFile(file: File): void {\n // Validate file size (10MB)\n if (file.size > MAX_UPLOAD_SIZE_BYTES) {\n designReference.error.value = cloudT.designReference.fileTooLarge;\n return;\n }\n\n // Validate file type\n if (activeTab.value === \"image\") {\n const validTypes = [\"image/png\", \"image/jpeg\", \"image/jpg\", \"image/webp\"];\n if (!validTypes.includes(file.type)) {\n designReference.error.value = cloudT.designReference.invalidFileType;\n return;\n }\n } else if (activeTab.value === \"pdf\") {\n if (file.type !== \"application/pdf\") {\n designReference.error.value = cloudT.designReference.invalidFileType;\n return;\n }\n }\n\n selectedFile.value = file;\n designReference.error.value = null;\n\n // Create preview URL for images\n if (filePreviewUrl.value) {\n URL.revokeObjectURL(filePreviewUrl.value);\n }\n if (file.type.startsWith(\"image/\")) {\n filePreviewUrl.value = URL.createObjectURL(file);\n } else {\n filePreviewUrl.value = null;\n }\n}\n\nfunction clearFile(): void {\n if (filePreviewUrl.value) {\n URL.revokeObjectURL(filePreviewUrl.value);\n filePreviewUrl.value = null;\n }\n selectedFile.value = null;\n}\n\nfunction handleDragOver(event: DragEvent): void {\n event.preventDefault();\n isDragging.value = true;\n}\n\nfunction handleDragLeave(): void {\n isDragging.value = false;\n}\n\nfunction handleDrop(event: DragEvent): void {\n event.preventDefault();\n isDragging.value = false;\n\n const file = event.dataTransfer?.files?.[0];\n if (file) {\n setFile(file);\n }\n}\n\nfunction handleGenerate(): void {\n if (!canGenerate.value) {\n return;\n }\n\n // Show confirmation if there are existing blocks\n if (props.hasExistingBlocks && !showConfirmation.value) {\n showConfirmation.value = true;\n return;\n }\n\n showConfirmation.value = false;\n\n const input: {\n prompt?: string;\n imageUpload?: File;\n pdfUpload?: File;\n } = {};\n\n if (prompt.value.trim()) {\n input.prompt = prompt.value.trim();\n }\n\n if (activeTab.value === \"image\" && selectedFile.value) {\n input.imageUpload = selectedFile.value;\n } else if (activeTab.value === \"pdf\" && selectedFile.value) {\n input.pdfUpload = selectedFile.value;\n }\n\n designReference.generate(input);\n}\n\nfunction cancelConfirmation(): void {\n showConfirmation.value = false;\n}\n\n// Reset state when panel closes\nwatch(\n () => props.visible,\n (isVisible) => {\n if (!isVisible) {\n showConfirmation.value = false;\n }\n },\n);\n\nonBeforeUnmount(() => {\n if (filePreviewUrl.value) {\n URL.revokeObjectURL(filePreviewUrl.value);\n filePreviewUrl.value = null;\n }\n});\n</script>\n\n<template>\n <Transition\n enter-active-class=\"tpl-design-slide-enter-active\"\n enter-from-class=\"tpl:translate-x-full\"\n enter-to-class=\"tpl:translate-x-0\"\n leave-active-class=\"tpl-design-slide-leave-active\"\n leave-from-class=\"tpl:translate-x-0\"\n leave-to-class=\"tpl:translate-x-full\"\n >\n <div\n v-if=\"visible\"\n role=\"complementary\"\n :aria-label=\"cloudT.designReference.title\"\n class=\"tpl-design-sidebar tpl:absolute tpl:top-14 tpl:right-0 tpl:bottom-0 tpl:flex tpl:w-[360px] tpl:flex-col tpl:border-l tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg-elevated)]\"\n >\n <!-- Header -->\n <div\n class=\"tpl:flex tpl:items-center tpl:justify-between tpl:border-b tpl:border-[var(--tpl-border)] tpl:px-4 tpl:py-3\"\n >\n <div\n class=\"tpl:flex tpl:items-center tpl:gap-1.5 tpl:text-sm tpl:font-medium tpl:text-[var(--tpl-primary)]\"\n >\n <ImageUp :size=\"13\" :stroke-width=\"2\" />\n <span>{{ cloudT.designReference.title }}</span>\n </div>\n <button\n type=\"button\"\n class=\"tpl:rounded-md tpl:p-0.5 tpl:transition-colors tpl:text-[var(--tpl-text-muted)]\"\n :aria-label=\"cloudT.designReference.close\"\n @click=\"emit('close')\"\n >\n <X :size=\"14\" :stroke-width=\"2\" />\n </button>\n </div>\n\n <!-- Content -->\n <div class=\"tpl:flex-1 tpl:overflow-y-auto tpl:p-4\">\n <!-- Loading state -->\n <div\n v-if=\"designReference.isGenerating.value\"\n class=\"tpl:flex tpl:h-full tpl:flex-col tpl:items-center tpl:justify-center tpl:gap-3 tpl:text-center\"\n >\n <div\n class=\"tpl:flex tpl:w-full tpl:flex-col tpl:items-center tpl:gap-3\"\n >\n <LoadingTrack />\n <p class=\"tpl:text-sm tpl:text-[var(--tpl-text-muted)]\">\n {{ cloudT.designReference.generating }}\n </p>\n </div>\n </div>\n\n <!-- Input form -->\n <div v-else class=\"tpl:flex tpl:flex-col tpl:gap-4\">\n <!-- Source tabs -->\n <div\n class=\"tpl:flex tpl:gap-1 tpl:rounded-[var(--tpl-radius-sm)] tpl:p-1 tpl:bg-[var(--tpl-bg-hover)]\"\n >\n <button\n class=\"tpl:flex tpl:flex-1 tpl:items-center tpl:justify-center tpl:gap-1.5 tpl:rounded-[var(--tpl-radius-sm)] tpl:px-2 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:transition-all\"\n :style=\"{\n backgroundColor:\n activeTab === 'image' ? 'var(--tpl-bg)' : 'transparent',\n color:\n activeTab === 'image'\n ? 'var(--tpl-primary)'\n : 'var(--tpl-text-muted)',\n boxShadow: activeTab === 'image' ? 'var(--tpl-shadow)' : 'none',\n }\"\n @click=\"selectTab('image')\"\n >\n <FileImage :size=\"12\" :stroke-width=\"2\" />\n {{ cloudT.designReference.uploadImage }}\n </button>\n <button\n class=\"tpl:flex tpl:flex-1 tpl:items-center tpl:justify-center tpl:gap-1.5 tpl:rounded-[var(--tpl-radius-sm)] tpl:px-2 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:transition-all\"\n :style=\"{\n backgroundColor:\n activeTab === 'pdf' ? 'var(--tpl-bg)' : 'transparent',\n color:\n activeTab === 'pdf'\n ? 'var(--tpl-primary)'\n : 'var(--tpl-text-muted)',\n boxShadow: activeTab === 'pdf' ? 'var(--tpl-shadow)' : 'none',\n }\"\n @click=\"selectTab('pdf')\"\n >\n <FileText :size=\"12\" :stroke-width=\"2\" />\n {{ cloudT.designReference.uploadPdf }}\n </button>\n </div>\n\n <!-- File upload area (image or pdf) -->\n <div>\n <!-- Preview -->\n <div v-if=\"selectedFile\" class=\"tpl:flex tpl:flex-col tpl:gap-2\">\n <div\n class=\"tpl:relative tpl:overflow-hidden tpl:rounded-[var(--tpl-radius)] tpl:border tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg)]\"\n >\n <!-- Image preview -->\n <img\n v-if=\"filePreviewUrl\"\n :src=\"filePreviewUrl\"\n :alt=\"selectedFile.name\"\n class=\"tpl:h-auto tpl:max-h-48 tpl:w-full tpl:object-contain\"\n />\n <!-- PDF preview (icon-based) -->\n <div\n v-else\n class=\"tpl:flex tpl:h-32 tpl:flex-col tpl:items-center tpl:justify-center tpl:gap-2\"\n >\n <FileText\n :size=\"32\"\n :stroke-width=\"1.5\"\n class=\"tpl:text-[var(--tpl-text-dim)]\"\n />\n <span class=\"tpl:text-xs tpl:text-[var(--tpl-text-muted)]\">\n {{ selectedFile.name }}\n </span>\n </div>\n <!-- Remove button -->\n <button\n class=\"tpl:absolute tpl:top-2 tpl:right-2 tpl:rounded-full tpl:p-1 tpl:transition-colors tpl:bg-[var(--tpl-bg)] tpl:text-[var(--tpl-text-muted)] tpl:shadow-[var(--tpl-shadow)]\"\n @click=\"clearFile\"\n >\n <X :size=\"12\" :stroke-width=\"2\" />\n </button>\n </div>\n </div>\n\n <!-- Drop zone -->\n <div\n v-else\n class=\"tpl-design-dropzone tpl:flex tpl:cursor-pointer tpl:flex-col tpl:items-center tpl:justify-center tpl:gap-2 tpl:rounded-[var(--tpl-radius)] tpl:border-2 tpl:border-dashed tpl:px-4 tpl:py-8 tpl:transition-colors\"\n :style=\"{\n borderColor: isDragging\n ? 'var(--tpl-primary)'\n : 'var(--tpl-border-light)',\n backgroundColor: isDragging\n ? 'var(--tpl-primary-light)'\n : 'var(--tpl-bg)',\n }\"\n @click=\"fileInput?.click()\"\n @dragover=\"handleDragOver\"\n @dragleave=\"handleDragLeave\"\n @drop=\"handleDrop\"\n >\n <Upload\n :size=\"24\"\n :stroke-width=\"1.5\"\n class=\"tpl:text-[var(--tpl-text-dim)]\"\n />\n <span\n class=\"tpl:text-center tpl:text-xs tpl:text-[var(--tpl-text-muted)]\"\n >\n {{ cloudT.designReference.dropHint }}\n </span>\n <span\n class=\"tpl:text-center tpl:text-[10px] tpl:text-[var(--tpl-text-dim)]\"\n >\n {{\n activeTab === \"image\"\n ? cloudT.designReference.acceptedImages\n : cloudT.designReference.acceptedPdf\n }}\n </span>\n </div>\n <input\n ref=\"fileInput\"\n type=\"file\"\n class=\"tpl:hidden\"\n :accept=\"\n activeTab === 'image'\n ? 'image/png,image/jpeg,image/webp'\n : 'application/pdf'\n \"\n @change=\"handleFileSelect\"\n />\n </div>\n\n <!-- Prompt textarea -->\n <div class=\"tpl:flex tpl:flex-col tpl:gap-1.5\">\n <label\n class=\"tpl:text-xs tpl:font-medium tpl:text-[var(--tpl-text-muted)]\"\n >\n {{ cloudT.designReference.promptLabel }}\n </label>\n <textarea\n v-model=\"prompt\"\n class=\"tpl:min-h-[72px] tpl:w-full tpl:resize-none tpl:rounded-[var(--tpl-radius-sm)] tpl:border tpl:px-3 tpl:py-2 tpl:font-sans tpl:text-sm tpl:outline-none tpl:transition-colors tpl:border-[var(--tpl-border)] tpl:text-[var(--tpl-text)] tpl:bg-[var(--tpl-bg)] tpl:focus:border-[var(--tpl-primary)] tpl:focus:shadow-[var(--tpl-ring)]\"\n :class=\"['tpl-design-prompt-input']\"\n :placeholder=\"cloudT.designReference.promptPlaceholder\"\n rows=\"3\"\n />\n </div>\n\n <!-- Confirmation overlay -->\n <div\n v-if=\"showConfirmation\"\n class=\"tpl:flex tpl:flex-col tpl:gap-2 tpl:rounded-[var(--tpl-radius)] tpl:px-3 tpl:py-3 tpl:bg-[var(--tpl-warning-light)] tpl:border tpl:border-[var(--tpl-warning)]\"\n >\n <p class=\"tpl:text-xs tpl:leading-snug tpl:text-[var(--tpl-text)]\">\n {{ cloudT.designReference.replaceWarning }}\n </p>\n <div class=\"tpl:flex tpl:gap-2\">\n <button\n class=\"tpl:flex-1 tpl:rounded-[var(--tpl-radius-sm)] tpl:px-3 tpl:py-1.5 tpl:text-xs tpl:font-medium tpl:transition-all tpl:text-[var(--tpl-text-muted)] tpl:border tpl:border-[var(--tpl-border)]\"\n style=\"background-color: transparent\"\n @click=\"cancelConfirmation\"\n >\n {{ cloudT.designReference.replaceCancel }}\n </button>\n <button\n type=\"button\"\n :class=\"[primaryBtnClass, 'tpl:flex-1']\"\n @click=\"handleGenerate\"\n >\n {{ cloudT.designReference.replaceConfirm }}\n </button>\n </div>\n </div>\n\n <!-- Error message -->\n <div\n v-if=\"designReference.error.value\"\n class=\"tpl:flex tpl:items-start tpl:gap-2 tpl:rounded-lg tpl:px-3 tpl:py-2 tpl:text-xs tpl:bg-[var(--tpl-danger-light)] tpl:text-[var(--tpl-danger)]\"\n >\n <CircleAlert\n :size=\"14\"\n :stroke-width=\"2\"\n class=\"tpl:mt-0.5 tpl:shrink-0\"\n />\n <span>{{ cloudT.designReference.error }}</span>\n </div>\n\n <!-- Generate button -->\n <button\n v-if=\"!showConfirmation\"\n type=\"button\"\n :class=\"[primaryBtnClass, 'tpl:w-full']\"\n :disabled=\"!canGenerate\"\n @click=\"handleGenerate\"\n >\n <ImageUp :size=\"16\" :stroke-width=\"2\" />\n {{ cloudT.designReference.generate }}\n </button>\n\n <!-- AI disclaimer -->\n <p\n class=\"tpl:m-0 tpl:pt-1 tpl:text-center tpl:text-[10px] tpl:text-[var(--tpl-text-dim)]\"\n >\n {{ cloudT.aiMenu.disclaimer }}\n </p>\n </div>\n </div>\n </div>\n </Transition>\n</template>\n\n<style scoped>\n.tpl-design-slide-enter-active {\n transition: transform 280ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n.tpl-design-slide-leave-active {\n transition: transform 200ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n.tpl-design-prompt-input:focus {\n border-color: var(--tpl-primary);\n box-shadow: var(--tpl-ring);\n}\n\n.tpl-design-dropzone:hover {\n border-color: var(--tpl-primary) !important;\n background-color: var(--tpl-primary-light) !important;\n}\n</style>\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { E as e, F as t, N as n, R as r, S as i, at as a, b as o, ct as s, f as c, g as l, h as u, m as d, p as f, u as p, ut as m, y as h } from "./draggable-IB4x6w2O.js";
2
2
  import { K as g, g as _ } from "./keys-DCWeHkSF.js";
3
3
  import { t as v } from "./useI18n-CyO_Nmca.js";
4
- import { Nt as y, Ut as b, ct as x, d as S, ft as C, r as w } from "./icons-CQnjugjy.js";
4
+ import { Nt as y, Ut as b, ct as x, d as S, ft as C, r as w } from "./icons-BF0mJX0V.js";
5
5
  import { t as T } from "./useScrollToBlock-DgHZJvID.js";
6
6
  //#region src/components/sidebar/IssuesPanel.vue?vue&type=script&setup=true&lang.ts
7
7
  var E = { class: "tpl:flex tpl:flex-col tpl:gap-4 tpl:p-4" }, D = { class: "tpl:flex tpl:items-center tpl:gap-2" }, O = { class: "tpl:m-0 tpl:text-sm tpl:font-semibold tpl:text-[var(--tpl-text)]" }, k = ["title"], A = {
@@ -97,4 +97,4 @@ var E = { class: "tpl:flex tpl:flex-col tpl:gap-4 tpl:p-4" }, D = { class: "tpl:
97
97
  //#endregion
98
98
  export { z as default };
99
99
 
100
- //# sourceMappingURL=IssuesPanel-qKY6UDd-.js.map
100
+ //# sourceMappingURL=IssuesPanel-DYJXIwnw.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"IssuesPanel-qKY6UDd-.js","names":["_openBlock","_createElementBlock","_createElementVNode","_createVNode","_unref","_toDisplayString","_createCommentVNode","_Fragment","_renderList","AlertCircle","AlertTriangle","_normalizeClass","_createBlock","_resolveDynamicComponent","_createTextVNode","_sfc_main","inject","renderList","openBlock","resolveDynamicComponent","defineComponent","unref","createVNode","normalizeClass","computed","createElementBlock","createCommentVNode","createBlock","createBaseVNode","Fragment","toDisplayString","createTextVNode","TEMPLATE_LINT_KEY","EDITOR_KEY","useI18n","CircleAlert","ArrowRight","ListChecks","TriangleAlert","Info","Wrench","useScrollToBlock","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","IssuesPanel_default","lint","editor","scrollToBlock","errors","i","warnings","infos","totalCount","jumpTo","issue","applyFix","t","format","group"],"sources":["../../../src/components/sidebar/IssuesPanel.vue","../../../src/components/sidebar/IssuesPanel.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, inject } from \"vue\";\nimport {\n ListChecks,\n AlertCircle,\n AlertTriangle,\n Info,\n ArrowRight,\n Wrench,\n} from \"@lucide/vue\";\nimport { useI18n } from \"../../composables/useI18n\";\nimport { useScrollToBlock } from \"../../composables/useScrollToBlock\";\nimport { TEMPLATE_LINT_KEY, EDITOR_KEY } from \"../../keys\";\nimport type { LintIssue } from \"../../composables/useTemplateLint\";\n\nconst { t, format } = useI18n();\nconst lint = inject(TEMPLATE_LINT_KEY, null);\nconst editor = inject(EDITOR_KEY, null);\nconst scrollToBlock = useScrollToBlock();\n\nconst errors = computed(() =>\n (lint?.issues.value ?? []).filter((i) => i.severity === \"error\"),\n);\nconst warnings = computed(() =>\n (lint?.issues.value ?? []).filter((i) => i.severity === \"warning\"),\n);\nconst infos = computed(() =>\n (lint?.issues.value ?? []).filter((i) => i.severity === \"info\"),\n);\n\nconst totalCount = computed(\n () => errors.value.length + warnings.value.length + infos.value.length,\n);\n\nfunction jumpTo(issue: LintIssue): void {\n if (!editor) return;\n if (!issue.blockId) return;\n editor.selectBlock(issue.blockId);\n // Selecting is invisible on its own — on a long template the block sits\n // below the fold and the canvas stays put, so \"Jump\" appears to do nothing.\n scrollToBlock(issue.blockId);\n}\n\nfunction applyFix(issue: LintIssue): void {\n lint?.applyFix(issue);\n}\n</script>\n\n<template>\n <div class=\"tpl:flex tpl:flex-col tpl:gap-4 tpl:p-4\">\n <header class=\"tpl:flex tpl:items-center tpl:gap-2\">\n <ListChecks :size=\"16\" :stroke-width=\"1.5\" />\n <h3\n class=\"tpl:m-0 tpl:text-sm tpl:font-semibold tpl:text-[var(--tpl-text)]\"\n >\n {{ t.issues.panelTitle }}\n </h3>\n <span\n v-if=\"totalCount > 0\"\n class=\"tpl:ml-auto tpl:rounded-full tpl:bg-[var(--tpl-bg-hover)] tpl:px-2 tpl:py-0.5 tpl:text-[10px] tpl:text-[var(--tpl-text-muted)]\"\n :title=\"format(t.issues.issueCountTooltip, { count: totalCount })\"\n >\n {{ totalCount }}\n </span>\n </header>\n\n <div\n v-if=\"!lint || lint.unavailable.value\"\n class=\"tpl:text-xs tpl:text-[var(--tpl-text-muted)]\"\n >\n <!-- Quality package not available; render nothing visible beyond a hint. -->\n </div>\n\n <div\n v-else-if=\"totalCount === 0\"\n class=\"tpl:rounded-md tpl:border tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg)] tpl:p-3 tpl:text-xs tpl:text-[var(--tpl-text-muted)]\"\n >\n {{ t.issues.emptyState }}\n </div>\n\n <template v-else>\n <section\n v-for=\"group in [\n {\n key: 'errors',\n title: t.issues.groupErrors,\n icon: AlertCircle,\n items: errors,\n tone: 'tpl:text-[var(--tpl-danger)]',\n },\n {\n key: 'warnings',\n title: t.issues.groupWarnings,\n icon: AlertTriangle,\n items: warnings,\n tone: 'tpl:text-[var(--tpl-warning)]',\n },\n {\n key: 'info',\n title: t.issues.groupInfo,\n icon: Info,\n items: infos,\n tone: 'tpl:text-[var(--tpl-text-muted)]',\n },\n ]\"\n :key=\"group.key\"\n >\n <header\n v-if=\"group.items.length > 0\"\n class=\"tpl:mb-2 tpl:flex tpl:items-center tpl:gap-1.5 tpl:text-xs tpl:font-semibold tpl:uppercase tpl:tracking-wide\"\n :class=\"group.tone\"\n >\n <component :is=\"group.icon\" :size=\"12\" :stroke-width=\"2\" />\n {{ group.title }}\n <span class=\"tpl:ml-auto tpl:font-normal tpl:opacity-70\">\n {{ group.items.length }}\n </span>\n </header>\n <ul\n v-if=\"group.items.length > 0\"\n class=\"tpl:m-0 tpl:mb-3 tpl:flex tpl:list-none tpl:flex-col tpl:gap-2 tpl:p-0\"\n >\n <li\n v-for=\"issue in group.items\"\n :key=\"`${issue.ruleId}-${issue.blockId ?? 'template'}`\"\n class=\"tpl:rounded-md tpl:border tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg)] tpl:p-3\"\n >\n <p class=\"tpl:m-0 tpl:mb-2 tpl:text-xs tpl:text-[var(--tpl-text)]\">\n {{ issue.message }}\n </p>\n <p\n class=\"tpl:m-0 tpl:mb-2 tpl:font-mono tpl:text-[10px] tpl:text-[var(--tpl-text-dim)]\"\n >\n {{ issue.ruleId }}\n </p>\n <div class=\"tpl:flex tpl:gap-1.5\">\n <button\n v-if=\"issue.blockId\"\n type=\"button\"\n data-testid=\"issue-jump\"\n class=\"tpl:flex tpl:items-center tpl:gap-1 tpl:rounded-md tpl:border tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg-hover)] tpl:px-2 tpl:py-1 tpl:text-xs tpl:font-medium tpl:text-[var(--tpl-text)]\"\n @click=\"jumpTo(issue)\"\n >\n <ArrowRight :size=\"10\" :stroke-width=\"2\" />\n {{ t.issues.jump }}\n </button>\n <button\n v-if=\"issue.fix\"\n type=\"button\"\n class=\"tpl:flex tpl:items-center tpl:gap-1 tpl:rounded-md tpl:bg-[var(--tpl-primary)] tpl:px-2 tpl:py-1 tpl:text-xs tpl:font-medium tpl:text-[var(--tpl-on-primary)]\"\n :title=\"issue.fix.description\"\n @click=\"applyFix(issue)\"\n >\n <Wrench :size=\"10\" :stroke-width=\"2\" />\n {{ t.issues.fix }}\n </button>\n </div>\n </li>\n </ul>\n </section>\n </template>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, inject } from \"vue\";\nimport {\n ListChecks,\n AlertCircle,\n AlertTriangle,\n Info,\n ArrowRight,\n Wrench,\n} from \"@lucide/vue\";\nimport { useI18n } from \"../../composables/useI18n\";\nimport { useScrollToBlock } from \"../../composables/useScrollToBlock\";\nimport { TEMPLATE_LINT_KEY, EDITOR_KEY } from \"../../keys\";\nimport type { LintIssue } from \"../../composables/useTemplateLint\";\n\nconst { t, format } = useI18n();\nconst lint = inject(TEMPLATE_LINT_KEY, null);\nconst editor = inject(EDITOR_KEY, null);\nconst scrollToBlock = useScrollToBlock();\n\nconst errors = computed(() =>\n (lint?.issues.value ?? []).filter((i) => i.severity === \"error\"),\n);\nconst warnings = computed(() =>\n (lint?.issues.value ?? []).filter((i) => i.severity === \"warning\"),\n);\nconst infos = computed(() =>\n (lint?.issues.value ?? []).filter((i) => i.severity === \"info\"),\n);\n\nconst totalCount = computed(\n () => errors.value.length + warnings.value.length + infos.value.length,\n);\n\nfunction jumpTo(issue: LintIssue): void {\n if (!editor) return;\n if (!issue.blockId) return;\n editor.selectBlock(issue.blockId);\n // Selecting is invisible on its own — on a long template the block sits\n // below the fold and the canvas stays put, so \"Jump\" appears to do nothing.\n scrollToBlock(issue.blockId);\n}\n\nfunction applyFix(issue: LintIssue): void {\n lint?.applyFix(issue);\n}\n</script>\n\n<template>\n <div class=\"tpl:flex tpl:flex-col tpl:gap-4 tpl:p-4\">\n <header class=\"tpl:flex tpl:items-center tpl:gap-2\">\n <ListChecks :size=\"16\" :stroke-width=\"1.5\" />\n <h3\n class=\"tpl:m-0 tpl:text-sm tpl:font-semibold tpl:text-[var(--tpl-text)]\"\n >\n {{ t.issues.panelTitle }}\n </h3>\n <span\n v-if=\"totalCount > 0\"\n class=\"tpl:ml-auto tpl:rounded-full tpl:bg-[var(--tpl-bg-hover)] tpl:px-2 tpl:py-0.5 tpl:text-[10px] tpl:text-[var(--tpl-text-muted)]\"\n :title=\"format(t.issues.issueCountTooltip, { count: totalCount })\"\n >\n {{ totalCount }}\n </span>\n </header>\n\n <div\n v-if=\"!lint || lint.unavailable.value\"\n class=\"tpl:text-xs tpl:text-[var(--tpl-text-muted)]\"\n >\n <!-- Quality package not available; render nothing visible beyond a hint. -->\n </div>\n\n <div\n v-else-if=\"totalCount === 0\"\n class=\"tpl:rounded-md tpl:border tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg)] tpl:p-3 tpl:text-xs tpl:text-[var(--tpl-text-muted)]\"\n >\n {{ t.issues.emptyState }}\n </div>\n\n <template v-else>\n <section\n v-for=\"group in [\n {\n key: 'errors',\n title: t.issues.groupErrors,\n icon: AlertCircle,\n items: errors,\n tone: 'tpl:text-[var(--tpl-danger)]',\n },\n {\n key: 'warnings',\n title: t.issues.groupWarnings,\n icon: AlertTriangle,\n items: warnings,\n tone: 'tpl:text-[var(--tpl-warning)]',\n },\n {\n key: 'info',\n title: t.issues.groupInfo,\n icon: Info,\n items: infos,\n tone: 'tpl:text-[var(--tpl-text-muted)]',\n },\n ]\"\n :key=\"group.key\"\n >\n <header\n v-if=\"group.items.length > 0\"\n class=\"tpl:mb-2 tpl:flex tpl:items-center tpl:gap-1.5 tpl:text-xs tpl:font-semibold tpl:uppercase tpl:tracking-wide\"\n :class=\"group.tone\"\n >\n <component :is=\"group.icon\" :size=\"12\" :stroke-width=\"2\" />\n {{ group.title }}\n <span class=\"tpl:ml-auto tpl:font-normal tpl:opacity-70\">\n {{ group.items.length }}\n </span>\n </header>\n <ul\n v-if=\"group.items.length > 0\"\n class=\"tpl:m-0 tpl:mb-3 tpl:flex tpl:list-none tpl:flex-col tpl:gap-2 tpl:p-0\"\n >\n <li\n v-for=\"issue in group.items\"\n :key=\"`${issue.ruleId}-${issue.blockId ?? 'template'}`\"\n class=\"tpl:rounded-md tpl:border tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg)] tpl:p-3\"\n >\n <p class=\"tpl:m-0 tpl:mb-2 tpl:text-xs tpl:text-[var(--tpl-text)]\">\n {{ issue.message }}\n </p>\n <p\n class=\"tpl:m-0 tpl:mb-2 tpl:font-mono tpl:text-[10px] tpl:text-[var(--tpl-text-dim)]\"\n >\n {{ issue.ruleId }}\n </p>\n <div class=\"tpl:flex tpl:gap-1.5\">\n <button\n v-if=\"issue.blockId\"\n type=\"button\"\n data-testid=\"issue-jump\"\n class=\"tpl:flex tpl:items-center tpl:gap-1 tpl:rounded-md tpl:border tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg-hover)] tpl:px-2 tpl:py-1 tpl:text-xs tpl:font-medium tpl:text-[var(--tpl-text)]\"\n @click=\"jumpTo(issue)\"\n >\n <ArrowRight :size=\"10\" :stroke-width=\"2\" />\n {{ t.issues.jump }}\n </button>\n <button\n v-if=\"issue.fix\"\n type=\"button\"\n class=\"tpl:flex tpl:items-center tpl:gap-1 tpl:rounded-md tpl:bg-[var(--tpl-primary)] tpl:px-2 tpl:py-1 tpl:text-xs tpl:font-medium tpl:text-[var(--tpl-on-primary)]\"\n :title=\"issue.fix.description\"\n @click=\"applyFix(issue)\"\n >\n <Wrench :size=\"10\" :stroke-width=\"2\" />\n {{ t.issues.fix }}\n </button>\n </div>\n </li>\n </ul>\n </section>\n </template>\n </div>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"IssuesPanel-DYJXIwnw.js","names":["_openBlock","_createElementBlock","_createElementVNode","_createVNode","_unref","_toDisplayString","_createCommentVNode","_Fragment","_renderList","AlertCircle","AlertTriangle","_normalizeClass","_createBlock","_resolveDynamicComponent","_createTextVNode","_sfc_main","inject","renderList","openBlock","resolveDynamicComponent","defineComponent","unref","createVNode","normalizeClass","computed","createElementBlock","createCommentVNode","createBlock","createBaseVNode","Fragment","toDisplayString","createTextVNode","TEMPLATE_LINT_KEY","EDITOR_KEY","useI18n","CircleAlert","ArrowRight","ListChecks","TriangleAlert","Info","Wrench","useScrollToBlock","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","IssuesPanel_default","lint","editor","scrollToBlock","errors","i","warnings","infos","totalCount","jumpTo","issue","applyFix","t","format","group"],"sources":["../../../src/components/sidebar/IssuesPanel.vue","../../../src/components/sidebar/IssuesPanel.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, inject } from \"vue\";\nimport {\n ListChecks,\n AlertCircle,\n AlertTriangle,\n Info,\n ArrowRight,\n Wrench,\n} from \"@lucide/vue\";\nimport { useI18n } from \"../../composables/useI18n\";\nimport { useScrollToBlock } from \"../../composables/useScrollToBlock\";\nimport { TEMPLATE_LINT_KEY, EDITOR_KEY } from \"../../keys\";\nimport type { LintIssue } from \"../../composables/useTemplateLint\";\n\nconst { t, format } = useI18n();\nconst lint = inject(TEMPLATE_LINT_KEY, null);\nconst editor = inject(EDITOR_KEY, null);\nconst scrollToBlock = useScrollToBlock();\n\nconst errors = computed(() =>\n (lint?.issues.value ?? []).filter((i) => i.severity === \"error\"),\n);\nconst warnings = computed(() =>\n (lint?.issues.value ?? []).filter((i) => i.severity === \"warning\"),\n);\nconst infos = computed(() =>\n (lint?.issues.value ?? []).filter((i) => i.severity === \"info\"),\n);\n\nconst totalCount = computed(\n () => errors.value.length + warnings.value.length + infos.value.length,\n);\n\nfunction jumpTo(issue: LintIssue): void {\n if (!editor) return;\n if (!issue.blockId) return;\n editor.selectBlock(issue.blockId);\n // Selecting is invisible on its own — on a long template the block sits\n // below the fold and the canvas stays put, so \"Jump\" appears to do nothing.\n scrollToBlock(issue.blockId);\n}\n\nfunction applyFix(issue: LintIssue): void {\n lint?.applyFix(issue);\n}\n</script>\n\n<template>\n <div class=\"tpl:flex tpl:flex-col tpl:gap-4 tpl:p-4\">\n <header class=\"tpl:flex tpl:items-center tpl:gap-2\">\n <ListChecks :size=\"16\" :stroke-width=\"1.5\" />\n <h3\n class=\"tpl:m-0 tpl:text-sm tpl:font-semibold tpl:text-[var(--tpl-text)]\"\n >\n {{ t.issues.panelTitle }}\n </h3>\n <span\n v-if=\"totalCount > 0\"\n class=\"tpl:ml-auto tpl:rounded-full tpl:bg-[var(--tpl-bg-hover)] tpl:px-2 tpl:py-0.5 tpl:text-[10px] tpl:text-[var(--tpl-text-muted)]\"\n :title=\"format(t.issues.issueCountTooltip, { count: totalCount })\"\n >\n {{ totalCount }}\n </span>\n </header>\n\n <div\n v-if=\"!lint || lint.unavailable.value\"\n class=\"tpl:text-xs tpl:text-[var(--tpl-text-muted)]\"\n >\n <!-- Quality package not available; render nothing visible beyond a hint. -->\n </div>\n\n <div\n v-else-if=\"totalCount === 0\"\n class=\"tpl:rounded-md tpl:border tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg)] tpl:p-3 tpl:text-xs tpl:text-[var(--tpl-text-muted)]\"\n >\n {{ t.issues.emptyState }}\n </div>\n\n <template v-else>\n <section\n v-for=\"group in [\n {\n key: 'errors',\n title: t.issues.groupErrors,\n icon: AlertCircle,\n items: errors,\n tone: 'tpl:text-[var(--tpl-danger)]',\n },\n {\n key: 'warnings',\n title: t.issues.groupWarnings,\n icon: AlertTriangle,\n items: warnings,\n tone: 'tpl:text-[var(--tpl-warning)]',\n },\n {\n key: 'info',\n title: t.issues.groupInfo,\n icon: Info,\n items: infos,\n tone: 'tpl:text-[var(--tpl-text-muted)]',\n },\n ]\"\n :key=\"group.key\"\n >\n <header\n v-if=\"group.items.length > 0\"\n class=\"tpl:mb-2 tpl:flex tpl:items-center tpl:gap-1.5 tpl:text-xs tpl:font-semibold tpl:uppercase tpl:tracking-wide\"\n :class=\"group.tone\"\n >\n <component :is=\"group.icon\" :size=\"12\" :stroke-width=\"2\" />\n {{ group.title }}\n <span class=\"tpl:ml-auto tpl:font-normal tpl:opacity-70\">\n {{ group.items.length }}\n </span>\n </header>\n <ul\n v-if=\"group.items.length > 0\"\n class=\"tpl:m-0 tpl:mb-3 tpl:flex tpl:list-none tpl:flex-col tpl:gap-2 tpl:p-0\"\n >\n <li\n v-for=\"issue in group.items\"\n :key=\"`${issue.ruleId}-${issue.blockId ?? 'template'}`\"\n class=\"tpl:rounded-md tpl:border tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg)] tpl:p-3\"\n >\n <p class=\"tpl:m-0 tpl:mb-2 tpl:text-xs tpl:text-[var(--tpl-text)]\">\n {{ issue.message }}\n </p>\n <p\n class=\"tpl:m-0 tpl:mb-2 tpl:font-mono tpl:text-[10px] tpl:text-[var(--tpl-text-dim)]\"\n >\n {{ issue.ruleId }}\n </p>\n <div class=\"tpl:flex tpl:gap-1.5\">\n <button\n v-if=\"issue.blockId\"\n type=\"button\"\n data-testid=\"issue-jump\"\n class=\"tpl:flex tpl:items-center tpl:gap-1 tpl:rounded-md tpl:border tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg-hover)] tpl:px-2 tpl:py-1 tpl:text-xs tpl:font-medium tpl:text-[var(--tpl-text)]\"\n @click=\"jumpTo(issue)\"\n >\n <ArrowRight :size=\"10\" :stroke-width=\"2\" />\n {{ t.issues.jump }}\n </button>\n <button\n v-if=\"issue.fix\"\n type=\"button\"\n class=\"tpl:flex tpl:items-center tpl:gap-1 tpl:rounded-md tpl:bg-[var(--tpl-primary)] tpl:px-2 tpl:py-1 tpl:text-xs tpl:font-medium tpl:text-[var(--tpl-on-primary)]\"\n :title=\"issue.fix.description\"\n @click=\"applyFix(issue)\"\n >\n <Wrench :size=\"10\" :stroke-width=\"2\" />\n {{ t.issues.fix }}\n </button>\n </div>\n </li>\n </ul>\n </section>\n </template>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, inject } from \"vue\";\nimport {\n ListChecks,\n AlertCircle,\n AlertTriangle,\n Info,\n ArrowRight,\n Wrench,\n} from \"@lucide/vue\";\nimport { useI18n } from \"../../composables/useI18n\";\nimport { useScrollToBlock } from \"../../composables/useScrollToBlock\";\nimport { TEMPLATE_LINT_KEY, EDITOR_KEY } from \"../../keys\";\nimport type { LintIssue } from \"../../composables/useTemplateLint\";\n\nconst { t, format } = useI18n();\nconst lint = inject(TEMPLATE_LINT_KEY, null);\nconst editor = inject(EDITOR_KEY, null);\nconst scrollToBlock = useScrollToBlock();\n\nconst errors = computed(() =>\n (lint?.issues.value ?? []).filter((i) => i.severity === \"error\"),\n);\nconst warnings = computed(() =>\n (lint?.issues.value ?? []).filter((i) => i.severity === \"warning\"),\n);\nconst infos = computed(() =>\n (lint?.issues.value ?? []).filter((i) => i.severity === \"info\"),\n);\n\nconst totalCount = computed(\n () => errors.value.length + warnings.value.length + infos.value.length,\n);\n\nfunction jumpTo(issue: LintIssue): void {\n if (!editor) return;\n if (!issue.blockId) return;\n editor.selectBlock(issue.blockId);\n // Selecting is invisible on its own — on a long template the block sits\n // below the fold and the canvas stays put, so \"Jump\" appears to do nothing.\n scrollToBlock(issue.blockId);\n}\n\nfunction applyFix(issue: LintIssue): void {\n lint?.applyFix(issue);\n}\n</script>\n\n<template>\n <div class=\"tpl:flex tpl:flex-col tpl:gap-4 tpl:p-4\">\n <header class=\"tpl:flex tpl:items-center tpl:gap-2\">\n <ListChecks :size=\"16\" :stroke-width=\"1.5\" />\n <h3\n class=\"tpl:m-0 tpl:text-sm tpl:font-semibold tpl:text-[var(--tpl-text)]\"\n >\n {{ t.issues.panelTitle }}\n </h3>\n <span\n v-if=\"totalCount > 0\"\n class=\"tpl:ml-auto tpl:rounded-full tpl:bg-[var(--tpl-bg-hover)] tpl:px-2 tpl:py-0.5 tpl:text-[10px] tpl:text-[var(--tpl-text-muted)]\"\n :title=\"format(t.issues.issueCountTooltip, { count: totalCount })\"\n >\n {{ totalCount }}\n </span>\n </header>\n\n <div\n v-if=\"!lint || lint.unavailable.value\"\n class=\"tpl:text-xs tpl:text-[var(--tpl-text-muted)]\"\n >\n <!-- Quality package not available; render nothing visible beyond a hint. -->\n </div>\n\n <div\n v-else-if=\"totalCount === 0\"\n class=\"tpl:rounded-md tpl:border tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg)] tpl:p-3 tpl:text-xs tpl:text-[var(--tpl-text-muted)]\"\n >\n {{ t.issues.emptyState }}\n </div>\n\n <template v-else>\n <section\n v-for=\"group in [\n {\n key: 'errors',\n title: t.issues.groupErrors,\n icon: AlertCircle,\n items: errors,\n tone: 'tpl:text-[var(--tpl-danger)]',\n },\n {\n key: 'warnings',\n title: t.issues.groupWarnings,\n icon: AlertTriangle,\n items: warnings,\n tone: 'tpl:text-[var(--tpl-warning)]',\n },\n {\n key: 'info',\n title: t.issues.groupInfo,\n icon: Info,\n items: infos,\n tone: 'tpl:text-[var(--tpl-text-muted)]',\n },\n ]\"\n :key=\"group.key\"\n >\n <header\n v-if=\"group.items.length > 0\"\n class=\"tpl:mb-2 tpl:flex tpl:items-center tpl:gap-1.5 tpl:text-xs tpl:font-semibold tpl:uppercase tpl:tracking-wide\"\n :class=\"group.tone\"\n >\n <component :is=\"group.icon\" :size=\"12\" :stroke-width=\"2\" />\n {{ group.title }}\n <span class=\"tpl:ml-auto tpl:font-normal tpl:opacity-70\">\n {{ group.items.length }}\n </span>\n </header>\n <ul\n v-if=\"group.items.length > 0\"\n class=\"tpl:m-0 tpl:mb-3 tpl:flex tpl:list-none tpl:flex-col tpl:gap-2 tpl:p-0\"\n >\n <li\n v-for=\"issue in group.items\"\n :key=\"`${issue.ruleId}-${issue.blockId ?? 'template'}`\"\n class=\"tpl:rounded-md tpl:border tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg)] tpl:p-3\"\n >\n <p class=\"tpl:m-0 tpl:mb-2 tpl:text-xs tpl:text-[var(--tpl-text)]\">\n {{ issue.message }}\n </p>\n <p\n class=\"tpl:m-0 tpl:mb-2 tpl:font-mono tpl:text-[10px] tpl:text-[var(--tpl-text-dim)]\"\n >\n {{ issue.ruleId }}\n </p>\n <div class=\"tpl:flex tpl:gap-1.5\">\n <button\n v-if=\"issue.blockId\"\n type=\"button\"\n data-testid=\"issue-jump\"\n class=\"tpl:flex tpl:items-center tpl:gap-1 tpl:rounded-md tpl:border tpl:border-[var(--tpl-border)] tpl:bg-[var(--tpl-bg-hover)] tpl:px-2 tpl:py-1 tpl:text-xs tpl:font-medium tpl:text-[var(--tpl-text)]\"\n @click=\"jumpTo(issue)\"\n >\n <ArrowRight :size=\"10\" :stroke-width=\"2\" />\n {{ t.issues.jump }}\n </button>\n <button\n v-if=\"issue.fix\"\n type=\"button\"\n class=\"tpl:flex tpl:items-center tpl:gap-1 tpl:rounded-md tpl:bg-[var(--tpl-primary)] tpl:px-2 tpl:py-1 tpl:text-xs tpl:font-medium tpl:text-[var(--tpl-on-primary)]\"\n :title=\"issue.fix.description\"\n @click=\"applyFix(issue)\"\n >\n <Wrench :size=\"10\" :stroke-width=\"2\" />\n {{ t.issues.fix }}\n </button>\n </div>\n </li>\n </ul>\n </section>\n </template>\n </div>\n</template>\n"],"mappings":"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"}
@@ -4,7 +4,7 @@ import { t as ee } from "./dist-CXB2_kBa.js";
4
4
  import { J as te, Y as M, Z as ne, d as re } from "./keys-DCWeHkSF.js";
5
5
  import { t as N } from "./useI18n-CyO_Nmca.js";
6
6
  import { a as ie, i as ae, n as oe, o as se, r as ce, t as le } from "./usePopoverPosition-DGXjXKjM.js";
7
- import { F as P, n as ue, q as F, zt as I } from "./icons-CQnjugjy.js";
7
+ import { F as P, n as ue, q as F, zt as I } from "./icons-BF0mJX0V.js";
8
8
  import { t as L } from "./useMergeTag-C5MyHYxJ.js";
9
9
  import { t as de } from "./useLogicTag-J_i_hvZg.js";
10
10
  import { u as fe } from "./styleConstants-C_YAPdQS.js";
@@ -1056,4 +1056,4 @@ var ft = ["aria-label"], pt = [
1056
1056
  //#endregion
1057
1057
  export { it as a, qe as c, dt as i, St as n, nt as o, yt as r, rt as s, Tt as t };
1058
1058
 
1059
- //# sourceMappingURL=LogicTagInsertButton-CItDS_U1.js.map
1059
+ //# sourceMappingURL=LogicTagInsertButton-FNMVxm_V.js.map