@layers-app/editor 0.7.51 → 0.7.52-beta.1

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 (219) hide show
  1. package/README.md +14 -4
  2. package/dist/index.cjs +2 -2
  3. package/dist/index.d.ts +11 -17
  4. package/dist/index.js +2 -2
  5. package/dist/{layers.Bx0Yxfrx.js → layers.-PRCq4Sw.js} +1 -1
  6. package/dist/{layers.VspcqTVQ.js → layers.-rNbz94U.js} +2 -2
  7. package/dist/{layers.D27wJW6b.js → layers.2WdZgwPZ.js} +1 -1
  8. package/dist/{layers.EZ5drvEI.js → layers.3OWGh2C8.js} +1 -1
  9. package/dist/{layers.YyS-HdiR.js → layers.4zAkrDVk.js} +3 -3
  10. package/dist/layers.7WKR6Yqu.js +6 -0
  11. package/dist/{layers.BpCWayXE.js → layers.9PJlzoZs.js} +1 -1
  12. package/dist/{layers.CMJ7Hp6Q.js → layers.B1VPCXte.js} +1 -1
  13. package/dist/{layers.BPznYB1Y.js → layers.B6P7tcZb.js} +1 -1
  14. package/dist/{layers.CWhs7Uxe.js → layers.B7U8unJv.js} +1 -1
  15. package/dist/{layers.BLcmLKBJ.js → layers.B9r91R7R.js} +1 -1
  16. package/dist/{layers.BPGBMw3I.js → layers.BAdbKbZ6.js} +1 -1
  17. package/dist/{layers.9ZYp4GzJ.js → layers.BBCo7mwS.js} +1 -1
  18. package/dist/{layers.BO2IVEkS.js → layers.BFG1BgAh.js} +1 -1
  19. package/dist/{layers.bgieHmEx.js → layers.BHOg2oEs.js} +1 -1
  20. package/dist/{layers.CQfVznmy.js → layers.BHaRpWeR.js} +5 -5
  21. package/dist/{layers.DVhv-hr4.js → layers.BIOVRvHb.js} +1 -1
  22. package/dist/{layers.CCEF4mnb.js → layers.BIkq08ss.js} +1 -1
  23. package/dist/{layers.DzLdUfDr.js → layers.BJI891RC.js} +1 -1
  24. package/dist/{layers.DlP98mnK.js → layers.BMC_V06e.js} +3 -3
  25. package/dist/{layers.Di5Z-lLB.js → layers.BMZoD6WL.js} +1 -1
  26. package/dist/{layers.DL44Lpba.js → layers.BOMhPSwU.js} +1 -1
  27. package/dist/{layers.CAKFm60z.js → layers.BPvs1Be8.js} +1 -1
  28. package/dist/{layers.edkx7Vvi.js → layers.BS31qBks.js} +4 -4
  29. package/dist/{layers.CdcC9q3P.js → layers.BS7jq_eu.js} +1 -1
  30. package/dist/{layers.BbIRtF65.js → layers.BSDlE1yY.js} +1 -1
  31. package/dist/{layers.BmSJZEk8.js → layers.BWTYipPg.js} +1 -1
  32. package/dist/{layers.BSNaTVFI.js → layers.BWdAHqjD.js} +2 -2
  33. package/dist/{layers.Cdl1eUPe.js → layers.BX-uiIXW.js} +1 -1
  34. package/dist/{layers.Dkw5mnGc.js → layers.BXdIUL5b.js} +1 -1
  35. package/dist/{layers.BRXDmf4d.js → layers.BZm0MA2q.js} +4 -4
  36. package/dist/{layers.BoDKMwyD.js → layers.BZnvAMJS.js} +1 -1
  37. package/dist/{layers.C87eMHsy.js → layers.B_-_a7UX.js} +1 -1
  38. package/dist/{layers.Doie2RkV.js → layers.BdYdKZfr.js} +1 -1
  39. package/dist/{layers.qb0cLya_.js → layers.BdmVKMFf.js} +1 -1
  40. package/dist/{layers.lc0UiWHk.js → layers.BfWNaOM7.js} +1 -1
  41. package/dist/{layers.DGFN-w77.js → layers.Bh4Ejh9x.js} +5 -5
  42. package/dist/{layers.C4eRzMId.js → layers.BhbvPhZY.js} +1 -1
  43. package/dist/{layers.RNm8NZlZ.js → layers.Bjm_xjwv.js} +1 -1
  44. package/dist/{layers.X89qTbkA.js → layers.Bl3cufnJ.js} +1 -1
  45. package/dist/{layers.BBRXG6V2.js → layers.Bm2Vhqve.js} +1 -1
  46. package/dist/{layers.DG4T1Jav.js → layers.BnZaSoDc.js} +1 -1
  47. package/dist/{layers.-bIAZO8X.js → layers.Bo_s24PZ.js} +1 -1
  48. package/dist/{layers.Cul1IJNM.js → layers.BohxiPGm.js} +1 -1
  49. package/dist/{layers.DDPDYBZJ.js → layers.BotnLo3_.js} +4 -4
  50. package/dist/{layers.DiuK9kyy.js → layers.Bpt9Xrsc.js} +1 -1
  51. package/dist/{layers.C4eaTZaS.js → layers.Bqhq78_B.js} +1 -1
  52. package/dist/{layers.CBvf-IJn.js → layers.BqiV1yuF.js} +1 -1
  53. package/dist/{layers.IJjSBz2t.js → layers.BrCX0O3O.js} +1 -1
  54. package/dist/{layers.CYLGH0gY.js → layers.BtRO7V4g.js} +1 -1
  55. package/dist/{layers.w-3WEq7J.js → layers.Bwsz1ULI.js} +1 -1
  56. package/dist/{layers.DzfadXo-.js → layers.BxP9qovG.js} +1 -1
  57. package/dist/{layers.D6s4k0Ie.js → layers.BxVToqBB.js} +1 -1
  58. package/dist/{layers.eic6_EdL.js → layers.C-vvGrGC.js} +1 -1
  59. package/dist/{layers.B-0S61CP.js → layers.C-zipGU4.js} +1 -1
  60. package/dist/{layers.CQXyaD7G.js → layers.C0LwUXS-.js} +1 -1
  61. package/dist/{layers.Crg2FbtB.js → layers.C161f2fo.js} +3 -3
  62. package/dist/{layers.CjiwmQuP.js → layers.C29SXnEL.js} +1 -1
  63. package/dist/{layers.CSiuR7kB.js → layers.C4n2nHUR.js} +1 -1
  64. package/dist/{layers.1zR-SkLn.js → layers.C4x0-6vc.js} +1 -1
  65. package/dist/{layers.BhHydzph.js → layers.C7SM3ZJp.js} +1 -1
  66. package/dist/{layers.CdbhiG5U.js → layers.C9aR5fKZ.js} +1 -1
  67. package/dist/{layers.DMRHi8e3.js → layers.C9uxm6AE.js} +4 -4
  68. package/dist/{layers.DwFZ2Siz.js → layers.CBEDwAyG.js} +1 -1
  69. package/dist/{layers.CpX3Ij_c.js → layers.CCAgRKoE.js} +1 -1
  70. package/dist/{layers.Dhje6bds.js → layers.CCjqpoTW.js} +1 -1
  71. package/dist/{layers.CS2O4AH3.js → layers.CGJqhLAF.js} +3 -3
  72. package/dist/layers.CHrcoRCF.js +1 -0
  73. package/dist/{layers.BLZTiPN1.js → layers.CIBaqI_d.js} +1 -1
  74. package/dist/{layers.B3E655QR.js → layers.CLm4UnLz.js} +1 -1
  75. package/dist/{layers.BPwzJvHF.js → layers.COEJVJfP.js} +1 -1
  76. package/dist/{layers.CSIj5guj.js → layers.CSIX4ko9.js} +1 -1
  77. package/dist/{layers.CGfXV-3z.js → layers.CT1n0qa2.js} +1 -1
  78. package/dist/{layers.C6jSpnIv.js → layers.CTUNkPQD.js} +6 -6
  79. package/dist/{layers.OuskwSfc.js → layers.CUUGtJL9.js} +1 -1
  80. package/dist/{layers.RjGbOi67.js → layers.CUqAe6Cl.js} +1 -1
  81. package/dist/{layers.DR7P02bg.js → layers.CV4Bt2uR.js} +1 -1
  82. package/dist/layers.CYDEmLV0.js +8 -0
  83. package/dist/layers.CZG1Fy8O.js +1 -0
  84. package/dist/{layers.DrvLsdyO.js → layers.CZk3Zy3l.js} +1 -1
  85. package/dist/{layers.BTkv_g9p.js → layers.C_Ac56ij.js} +1 -1
  86. package/dist/{layers.C3FHbaDM.js → layers.C_va8eLi.js} +4 -4
  87. package/dist/{layers.DG9SqpP0.js → layers.CaG2cXiT.js} +1 -1
  88. package/dist/{layers.uQeIpCwH.js → layers.CagseI7E.js} +1 -1
  89. package/dist/{layers.BHGFyRSD.js → layers.CanTRPJX.js} +1 -1
  90. package/dist/{layers.DJ5R5z0_.js → layers.CbgMOM82.js} +1 -1
  91. package/dist/{layers.uNhb3K7N.js → layers.Cc9DulkZ.js} +24 -24
  92. package/dist/{layers.CfsySopk.js → layers.CcbXhtsA.js} +1 -1
  93. package/dist/{layers.CCfSzSZV.js → layers.CflCVSJ1.js} +1 -1
  94. package/dist/{layers.BHUpdITA.js → layers.CgE4iMoi.js} +1 -1
  95. package/dist/{layers.C00zHL4k.js → layers.Cggpii7f.js} +1 -1
  96. package/dist/{layers.CBujEVgH.js → layers.CjuQkPDK.js} +1 -1
  97. package/dist/{layers.D3af6E4n.js → layers.Cle4M0CN.js} +1 -1
  98. package/dist/{layers.BP5l4293.js → layers.Cmj7hTqI.js} +1 -1
  99. package/dist/layers.CnnJO-BJ.js +1 -0
  100. package/dist/{layers.Br3HmYVi.js → layers.CoLrTEFD.js} +1 -1
  101. package/dist/{layers.BNm2y0oG.js → layers.Codcuyrl.js} +1 -1
  102. package/dist/{layers.DXHyHu-b.js → layers.CogXa2Ek.js} +1 -1
  103. package/dist/{layers.D0a78iEx.js → layers.CsED2oE9.js} +1 -1
  104. package/dist/{layers.DYr_E1W4.js → layers.Csd7LftL.js} +1 -1
  105. package/dist/{layers.Dv5C7WNu.js → layers.CtPgy-sM.js} +1 -1
  106. package/dist/{layers.DZxiGC6v.js → layers.CtgsFAmg.js} +1 -1
  107. package/dist/{layers.pyvai9GS.js → layers.CvAqScFV.js} +1 -1
  108. package/dist/{layers.esLeNsW9.js → layers.CvLrz9JC.js} +1 -1
  109. package/dist/{layers._9zx3xYo.js → layers.CwXYi4vM.js} +1 -1
  110. package/dist/{layers.BwWmI2Mt.js → layers.Cws_i4kB.js} +1 -1
  111. package/dist/{layers._oRtY_6o.js → layers.Cx4C_S26.js} +7 -7
  112. package/dist/{layers.BkuijRQg.js → layers.CxUPLlyG.js} +1 -1
  113. package/dist/{layers.BEY2VGDy.js → layers.CxxCDYgD.js} +3 -3
  114. package/dist/{layers.TDk_Bqjw.js → layers.Cz8D7EEk.js} +1 -1
  115. package/dist/{layers.UJAyomld.js → layers.D-JPcVNG.js} +1 -1
  116. package/dist/layers.D1-saL8X.js +30336 -0
  117. package/dist/{layers.DgoWSdZ6.js → layers.D2L1_tzY.js} +1 -1
  118. package/dist/{layers.DQdX_Zv2.js → layers.D6ur7TY1.js} +1 -1
  119. package/dist/{layers.mdcINxeJ.js → layers.D7UlZpct.js} +1 -1
  120. package/dist/{layers.D7ufm_Hh.js → layers.D9Eiz7rE.js} +1 -1
  121. package/dist/{layers.BsL2jZ--.js → layers.DBqt9_f0.js} +1 -1
  122. package/dist/{layers.df3BTmfR.js → layers.DCWaj5MG.js} +1 -1
  123. package/dist/{layers.Cc9Yhppy.js → layers.DDP4aJqy.js} +1 -1
  124. package/dist/{layers.BZW9UjGO.js → layers.DDhlfAxJ.js} +1 -1
  125. package/dist/{layers.DsbLewS3.js → layers.DF6cIY9B.js} +1 -1
  126. package/dist/{layers.BJGlitDj.js → layers.DFMjBNnj.js} +1 -1
  127. package/dist/{layers.luzG06ke.js → layers.DGSy6eNA.js} +1 -1
  128. package/dist/layers.DGejmsF9.js +297 -0
  129. package/dist/{layers.a3cK8fiA.js → layers.DGgQXFHn.js} +1 -1
  130. package/dist/{layers.DyLSB_8Q.js → layers.DLSJ0Npu.js} +1 -1
  131. package/dist/{layers.BJkyXsLU.js → layers.DN_fAECk.js} +1 -1
  132. package/dist/{layers.D-5VGMe5.js → layers.DNyhZVfn.js} +1 -1
  133. package/dist/{layers.DTMNLlzB.js → layers.DP7oOsqF.js} +1 -1
  134. package/dist/{layers.BEBX-ae2.js → layers.DRfPF62k.js} +3 -3
  135. package/dist/{layers.BG6LOj2y.js → layers.DSoWhsS5.js} +1 -1
  136. package/dist/{layers.DCqGQvy0.js → layers.DTGnEQSh.js} +1 -1
  137. package/dist/{layers.B69GQnne.js → layers.DVER_6-a.js} +1 -1
  138. package/dist/{layers.Bqx5zJ4-.js → layers.DVQXBP6g.js} +1 -1
  139. package/dist/{layers.BKrQPNFd.js → layers.DVcke6K_.js} +4 -4
  140. package/dist/{layers.BmlLEb0j.js → layers.DW4dKpsG.js} +1 -1
  141. package/dist/{layers.DZy3gGhN.js → layers.DWbbBYvM.js} +1 -1
  142. package/dist/{layers.DnV4hHEo.js → layers.DX75-jLe.js} +1 -1
  143. package/dist/{layers.hA9QVMnE.js → layers.DX_dn5vb.js} +1 -1
  144. package/dist/{layers.Boam9eMz.js → layers.DYnbWxLL.js} +3 -3
  145. package/dist/{layers.BI2Zo7Wm.js → layers.DZsOFs3s.js} +1 -1
  146. package/dist/{layers.DIhCYKkU.js → layers.DaNdGzZP.js} +1 -1
  147. package/dist/{layers.CU2Xuwwl.js → layers.DalL8jdn.js} +1 -1
  148. package/dist/{layers.B0hjpxl0.js → layers.Dce7HvBe.js} +1 -1
  149. package/dist/{layers.BVvekhLI.js → layers.DcfSQdxC.js} +1 -1
  150. package/dist/{layers.DRSrXX6q.js → layers.DdTy54pA.js} +2 -2
  151. package/dist/{layers.BG4jyqyu.js → layers.DfI1l74B.js} +2 -2
  152. package/dist/{layers.jJHRaniN.js → layers.DikD6jzz.js} +1 -1
  153. package/dist/{layers.BybF35QC.js → layers.DlSGO58_.js} +1 -1
  154. package/dist/{layers.CsDg-JiP.js → layers.Dmx8Q-LY.js} +2 -2
  155. package/dist/{layers.C4FUOCb-.js → layers.DpoLo2Z4.js} +4 -4
  156. package/dist/{layers.DcDGh2j-.js → layers.DrDpkyf3.js} +1 -1
  157. package/dist/{layers.CprqbTOj.js → layers.Drs15V18.js} +1 -1
  158. package/dist/{layers.DN9Hzulf.js → layers.DursL5N6.js} +2 -2
  159. package/dist/{layers.BPpuDweo.js → layers.Dvce6-lc.js} +1 -1
  160. package/dist/{layers.CYAwwzHi.js → layers.Dvk_3Jc-.js} +1 -1
  161. package/dist/{layers.BZBDOlHG.js → layers.DwQkQ5FD.js} +1 -1
  162. package/dist/{layers.B1hsQka7.js → layers.Dwfel_ZL.js} +1 -1
  163. package/dist/{layers.DBdkKrbg.js → layers.DxIDRCe8.js} +1 -1
  164. package/dist/{layers.CZen_IA0.js → layers.DyqR2R8E.js} +4 -4
  165. package/dist/{layers.BIpBJT6C.js → layers.DyqZkmAe.js} +1 -1
  166. package/dist/{layers.DR7Cdo_a.js → layers.E7D4c0JB.js} +1 -1
  167. package/dist/{layers.B-ETW4mS.js → layers.EOpKwWQ3.js} +1 -1
  168. package/dist/{layers.D6niyCD7.js → layers.EeNFFHxN.js} +1 -1
  169. package/dist/{layers.BbwRmvfU.js → layers.H4n5riuc.js} +1 -1
  170. package/dist/{layers.CSydI2WI.js → layers.HPTnJguH.js} +3 -3
  171. package/dist/{layers.awyi1EPB.js → layers.KNqM-XEB.js} +1 -1
  172. package/dist/{layers.C-FWAsXU.js → layers.KST53UdH.js} +1 -1
  173. package/dist/{layers.XVg6tbXV.js → layers.MfmChWCi.js} +3 -3
  174. package/dist/{layers.7IZHK7Tv.js → layers.Mg8GmHxy.js} +1 -1
  175. package/dist/{layers.GiXIAclg.js → layers.QTt26nef.js} +8 -8
  176. package/dist/{layers.Dib3S4BE.js → layers.Quu7nu5_.js} +3 -3
  177. package/dist/{layers.DwVJ5uKG.js → layers.RjvdjiHq.js} +1 -1
  178. package/dist/{layers.D4mY1Bns.js → layers.SKfQmkub.js} +1 -1
  179. package/dist/{layers.Bsu4KU17.js → layers.V84_5O09.js} +1 -1
  180. package/dist/{layers.33JruMb6.js → layers.VFvJDdAy.js} +1 -1
  181. package/dist/{layers._J5zNl8-.js → layers.Y7K9wZuA.js} +1 -1
  182. package/dist/{layers.DwQ4_M0U.js → layers.YJFE-CuV.js} +1 -1
  183. package/dist/{layers.CcGVIw1j.js → layers.Ymar6x99.js} +3 -3
  184. package/dist/{layers.6G0UV902.js → layers._X14NrCV.js} +1 -1
  185. package/dist/{layers.Ce1MGMBV.js → layers.bmbxlVi9.js} +1 -1
  186. package/dist/{layers.B4BaeuYN.js → layers.cu6MfZp0.js} +1 -1
  187. package/dist/{layers.CCi4l-Wq.js → layers.fXv27-XB.js} +4 -4
  188. package/dist/layers.hM-RATXp.js +304 -0
  189. package/dist/{layers.jnJUVTSY.js → layers.hxMLCDvD.js} +3 -3
  190. package/dist/{layers.Dr2uW6P7.js → layers.i98sL7MN.js} +1 -1
  191. package/dist/{layers.DON-BxXP.js → layers.jEsqZyie.js} +1 -1
  192. package/dist/{layers.CbflIVsG.js → layers.kCEvB9Ka.js} +1 -1
  193. package/dist/{layers.CSwoqAt9.js → layers.kHPfNtu9.js} +1 -1
  194. package/dist/{layers.0V2_Egi2.js → layers.mQ8HAFsm.js} +1 -1
  195. package/dist/{layers.x2khfcMi.js → layers.n789MEoo.js} +1 -1
  196. package/dist/{layers.DQ2n2GlH.js → layers.oDz_gbyC.js} +1 -1
  197. package/dist/{layers.Cy6Wwp0B.js → layers.qVpTNWaf.js} +1 -1
  198. package/dist/{layers.nSoXOZde.js → layers.rjGMU0wI.js} +1 -1
  199. package/dist/{layers.CC0mrSk2.js → layers.ruFCQ7JH.js} +1 -1
  200. package/dist/{layers.CLB26nL2.js → layers.uMjbFyiD.js} +1 -1
  201. package/dist/{layers.y8ga51a4.js → layers.uiSpGsXd.js} +1 -1
  202. package/dist/{layers.BUP52jCo.js → layers.umPWT3kn.js} +1 -1
  203. package/dist/{layers.DvGD0Hp6.js → layers.vkMihHPX.js} +1 -1
  204. package/dist/{layers.D8pXWL-E.js → layers.wMFmwcW5.js} +2 -2
  205. package/dist/{layers.9v4xAtk_.js → layers.xIWsHmzh.js} +1 -1
  206. package/dist/{layers.rhkfyIZH.js → layers.ycNaadQy.js} +1 -1
  207. package/dist/{layers.D6A8-LhT.js → layers.zXcyV8DS.js} +1 -1
  208. package/dist/{layers.CtdaORkh.js → layers.zxyxYLf0.js} +1 -1
  209. package/package.json +13 -7
  210. package/dist/layers.CGHR3Drm.js +0 -276
  211. package/dist/layers.CMRcQgEB.js +0 -1
  212. package/dist/layers.CSxjyXtJ.js +0 -1
  213. package/dist/layers.CrKIUrKa.js +0 -8
  214. package/dist/layers.D9PlOBVG.js +0 -28376
  215. package/dist/layers.DKHUBgX9.js +0 -296
  216. package/dist/layers.DYu-a1t6.js +0 -1
  217. package/dist/layers.djwwOKZL.js +0 -129
  218. package/dist/layers.y_PhQ9i6.js +0 -6
  219. package/dist/layers.ztU_R7LS.js +0 -1
package/README.md CHANGED
@@ -153,6 +153,7 @@ Use **StylesProvider** to add styling to your HTML content.
153
153
 
154
154
  To start working with image uploads, use the **fetchUploadMedia** function, which takes three parameters: **file**, **success**, and **error**. After successfully uploading the image to your service, you should call the **success** function and pass two required arguments: the **URL** of the image and its **ID**.
155
155
  Optional: You can also pass two optional parameters: **signal** and **onProgress**. The **signal** allows you to cancel an ongoing upload using an AbortController, and **onProgress** provides the current upload progress in percent — useful for displaying a progress bar or loading state.
156
+
156
157
  ```
157
158
  const fetchUploadMedia = async (
158
159
  file: File,
@@ -370,8 +371,8 @@ For uploading a file or audio, you might need the third parameter "data".
370
371
  }
371
372
  };
372
373
  ```
373
- </details>
374
374
 
375
+ </details>
375
376
 
376
377
  <details>
377
378
  <summary>
@@ -380,7 +381,6 @@ For uploading a file or audio, you might need the third parameter "data".
380
381
 
381
382
  ## Connect AI
382
383
 
383
-
384
384
  ```
385
385
  const fetchPromptResult = async (
386
386
  prompt: string,
@@ -423,8 +423,8 @@ For uploading a file or audio, you might need the third parameter "data".
423
423
  fetchPromptResult={fetchPromptResult}
424
424
  />
425
425
  ```
426
- </details>
427
426
 
427
+ </details>
428
428
 
429
429
  <details>
430
430
  <summary>
@@ -622,6 +622,7 @@ npm run test-unit-watch
622
622
  ```
623
623
 
624
624
  ### Unit Test Files Location
625
+
625
626
  - `__tests__/unit/` - Unit test files
626
627
  - Test files follow the pattern: `*.test.ts` or `*.test.tsx`
627
628
 
@@ -646,11 +647,13 @@ npm run test:e2e:headed
646
647
  ```
647
648
 
648
649
  ### E2E Test Files Location
650
+
649
651
  - `__tests__/e2e/` - End-to-end test files
650
652
  - `__tests__/regression/` - Regression test files
651
653
  - Test files follow the pattern: `*.spec.js`, `*.spec.mjs`, or `*.spec.ts`
652
654
 
653
655
  ### Browser Support
656
+
654
657
  - **WebKit** (Safari) - Primary browser for CI/CD
655
658
  - **Chromium** and **Firefox** - Available for local testing
656
659
 
@@ -670,6 +673,7 @@ npm run start-test-server
670
673
  ## Test Configuration
671
674
 
672
675
  ### Playwright Configuration
676
+
673
677
  - **Config file**: `playwright.config.js`
674
678
  - **Test directory**: `./__tests__/e2e/`
675
679
  - **Browser**: WebKit (optimized for CI)
@@ -678,6 +682,7 @@ npm run start-test-server
678
682
  - **Retries**: 2 retries in CI, 0 locally
679
683
 
680
684
  ### Vitest Configuration
685
+
681
686
  - **Config file**: `vitest.config.mts`
682
687
  - **Environment**: jsdom
683
688
  - **Setup file**: `vitest.setup.mts`
@@ -686,11 +691,13 @@ npm run start-test-server
686
691
  ## CI/CD Testing
687
692
 
688
693
  Tests run automatically on:
694
+
689
695
  - **Push** to `main` or `dev` branches
690
696
  - **Pull requests** to `main` or `dev` branches
691
697
  - **Manual trigger** via GitHub Actions
692
698
 
693
699
  ### GitHub Actions Workflow
700
+
694
701
  - **File**: `.github/workflows/tests.yml`
695
702
  - **Runner**: Ubuntu Latest
696
703
  - **Node.js**: Version 20
@@ -703,7 +710,8 @@ Tests run automatically on:
703
710
 
704
711
  ```javascript
705
712
  // __tests__/e2e/example.spec.mjs
706
- import { test, expect } from '@playwright/test';
713
+ import { expect, test } from '@playwright/test';
714
+
707
715
  import { focusEditor } from '../utils/index.mjs';
708
716
 
709
717
  test('Can type text in editor', async ({ page }) => {
@@ -771,11 +779,13 @@ Common test utilities are available in `__tests__/utils/index.mjs`:
771
779
  ## Performance
772
780
 
773
781
  ### Test Execution Times
782
+
774
783
  - **Unit Tests**: ~10-30 seconds
775
784
  - **E2E Tests (first run)**: ~3-4 minutes (includes browser installation)
776
785
  - **E2E Tests (cached)**: ~1-2 minutes (uses cached browsers)
777
786
 
778
787
  ### Optimization Features
788
+
779
789
  - **Browser Caching**: Playwright browsers cached in CI
780
790
  - **Single Worker**: Prevents race conditions in CI
781
791
  - **WebKit Only**: Faster than multi-browser matrix