@mhmo91/schmancy 0.10.4 → 0.10.6

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 (478) hide show
  1. package/custom-elements.json +43 -949
  2. package/dist/agent/{flow-CaPi2G8y.js.map → flow-3RrZM-e7.js.map} +1 -1
  3. package/dist/agent/schmancy.agent.js +3817 -6527
  4. package/dist/agent/schmancy.agent.js.map +1 -1
  5. package/dist/agent/schmancy.manifest.json +10 -680
  6. package/dist/agent/{vendor-jsqr-r7GNh4P3.js.map → vendor-jsqr-BUVwyoGC.js.map} +1 -1
  7. package/dist/agent/{vendor-material-color-Be96dpGE.js.map → vendor-material-color-33Mj762T.js.map} +1 -1
  8. package/dist/{area-DHVANBbr.js → area-CIZZ5tbB.js} +1 -1
  9. package/dist/{area-DHVANBbr.js.map → area-CIZZ5tbB.js.map} +1 -1
  10. package/dist/{area-ZupIezvU.cjs → area-oZjYJlUy.cjs} +1 -1
  11. package/dist/{area-ZupIezvU.cjs.map → area-oZjYJlUy.cjs.map} +1 -1
  12. package/dist/area.cjs +1 -1
  13. package/dist/area.js +1 -1
  14. package/dist/{autocomplete-pHvsyfbH.js → autocomplete-C1oDLuol.js} +2 -2
  15. package/dist/{autocomplete-pHvsyfbH.js.map → autocomplete-C1oDLuol.js.map} +1 -1
  16. package/dist/{autocomplete-Bn525CTp.cjs → autocomplete-X20i6D62.cjs} +1 -1
  17. package/dist/{autocomplete-Bn525CTp.cjs.map → autocomplete-X20i6D62.cjs.map} +1 -1
  18. package/dist/autocomplete.cjs +1 -1
  19. package/dist/autocomplete.js +1 -1
  20. package/dist/avatar.cjs +1 -1
  21. package/dist/avatar.js +2 -2
  22. package/dist/badge.cjs +1 -1
  23. package/dist/badge.js +1 -1
  24. package/dist/{boat-IyEtsNI4.cjs → boat-CUx58Gwe.cjs} +1 -1
  25. package/dist/{boat-IyEtsNI4.cjs.map → boat-CUx58Gwe.cjs.map} +1 -1
  26. package/dist/{boat-_Yv3M6YM.js → boat-CpE0yAlK.js} +2 -2
  27. package/dist/{boat-_Yv3M6YM.js.map → boat-CpE0yAlK.js.map} +1 -1
  28. package/dist/boat.cjs +1 -1
  29. package/dist/boat.js +1 -1
  30. package/dist/breadcrumb.cjs +1 -1
  31. package/dist/breadcrumb.js +1 -1
  32. package/dist/{busy-Ck2IXJ4r.js → busy-C9n-DUY4.js} +1 -1
  33. package/dist/{busy-Ck2IXJ4r.js.map → busy-C9n-DUY4.js.map} +1 -1
  34. package/dist/{busy-CjM39APN.cjs → busy-D1DKZhgV.cjs} +1 -1
  35. package/dist/{busy-CjM39APN.cjs.map → busy-D1DKZhgV.cjs.map} +1 -1
  36. package/dist/busy.cjs +1 -1
  37. package/dist/busy.js +1 -1
  38. package/dist/button.cjs +1 -1
  39. package/dist/button.js +3 -3
  40. package/dist/{card-DUWZmMHc.js → card-B3hN-qzk.js} +1 -1
  41. package/dist/{card-DUWZmMHc.js.map → card-B3hN-qzk.js.map} +1 -1
  42. package/dist/{card-DIxDuuth.cjs → card-DZJ7qjf2.cjs} +1 -1
  43. package/dist/{card-DIxDuuth.cjs.map → card-DZJ7qjf2.cjs.map} +1 -1
  44. package/dist/card.cjs +1 -1
  45. package/dist/card.js +1 -1
  46. package/dist/charts.cjs +1 -1
  47. package/dist/charts.js +1 -1
  48. package/dist/{checkbox-DPS1mWG-.js → checkbox-CvmB1ev9.js} +1 -1
  49. package/dist/{checkbox-DPS1mWG-.js.map → checkbox-CvmB1ev9.js.map} +1 -1
  50. package/dist/{checkbox-CGdFXuWQ.cjs → checkbox-DapdzDow.cjs} +1 -1
  51. package/dist/{checkbox-CGdFXuWQ.cjs.map → checkbox-DapdzDow.cjs.map} +1 -1
  52. package/dist/checkbox.cjs +1 -1
  53. package/dist/checkbox.js +1 -1
  54. package/dist/{chips-UoFbwmlG.cjs → chips-7g6mWRuh.cjs} +1 -1
  55. package/dist/{chips-UoFbwmlG.cjs.map → chips-7g6mWRuh.cjs.map} +1 -1
  56. package/dist/{chips-BnnXQSA-.js → chips-C8Y3_3ke.js} +4 -4
  57. package/dist/{chips-BnnXQSA-.js.map → chips-C8Y3_3ke.js.map} +1 -1
  58. package/dist/chips.cjs +1 -1
  59. package/dist/chips.js +2 -2
  60. package/dist/connectivity.cjs +1 -1
  61. package/dist/connectivity.js +1 -1
  62. package/dist/content-drawer.cjs +1 -1
  63. package/dist/content-drawer.js +1 -1
  64. package/dist/{context-daN5G6HS.cjs.map → context-BpCETidA.cjs.map} +1 -1
  65. package/dist/{context-Bdu1xt0W.js.map → context-DJTJnSK4.js.map} +1 -1
  66. package/dist/{date-range-DOstCIg8.js → date-range-DdcaPX7C.js} +99 -113
  67. package/dist/date-range-DdcaPX7C.js.map +1 -0
  68. package/dist/date-range-ZfUl4duV.cjs +131 -0
  69. package/dist/date-range-ZfUl4duV.cjs.map +1 -0
  70. package/dist/{date-range-inline-4P7zqeVe.cjs → date-range-inline-D-d7N6bh.cjs} +1 -1
  71. package/dist/{date-range-inline-4P7zqeVe.cjs.map → date-range-inline-D-d7N6bh.cjs.map} +1 -1
  72. package/dist/{date-range-inline-BVycTWLb.js → date-range-inline-QQmIWhZ4.js} +1 -1
  73. package/dist/{date-range-inline-BVycTWLb.js.map → date-range-inline-QQmIWhZ4.js.map} +1 -1
  74. package/dist/date-range-inline.cjs +1 -1
  75. package/dist/date-range-inline.js +1 -1
  76. package/dist/date-range.cjs +1 -1
  77. package/dist/date-range.js +1 -1
  78. package/dist/delay.cjs +1 -1
  79. package/dist/delay.js +2 -2
  80. package/dist/{details-BJBbZOO6.cjs → details-3rL6UQU8.cjs} +1 -1
  81. package/dist/{details-BJBbZOO6.cjs.map → details-3rL6UQU8.cjs.map} +1 -1
  82. package/dist/{details-DPc5GxPa.js → details-Dpjh-XnJ.js} +2 -2
  83. package/dist/{details-DPc5GxPa.js.map → details-Dpjh-XnJ.js.map} +1 -1
  84. package/dist/details.cjs +1 -1
  85. package/dist/details.js +1 -1
  86. package/dist/directives.cjs +1 -1
  87. package/dist/directives.js +2 -2
  88. package/dist/{divider-BvJsmSPH.js → divider-BdfEKQsH.js} +1 -1
  89. package/dist/{divider-BvJsmSPH.js.map → divider-BdfEKQsH.js.map} +1 -1
  90. package/dist/{divider-DPT3XnG5.cjs → divider-CutXDz3F.cjs} +1 -1
  91. package/dist/{divider-DPT3XnG5.cjs.map → divider-CutXDz3F.cjs.map} +1 -1
  92. package/dist/divider.cjs +1 -1
  93. package/dist/divider.js +1 -1
  94. package/dist/dropdown.cjs +1 -1
  95. package/dist/dropdown.js +1 -1
  96. package/dist/{expand-CTqBWVXo.cjs → expand-DM6zfZf7.cjs} +1 -1
  97. package/dist/{expand-CTqBWVXo.cjs.map → expand-DM6zfZf7.cjs.map} +1 -1
  98. package/dist/{expand-BMzocdtj.js → expand-DrgMPJbu.js} +2 -2
  99. package/dist/{expand-BMzocdtj.js.map → expand-DrgMPJbu.js.map} +1 -1
  100. package/dist/expand.cjs +1 -1
  101. package/dist/expand.js +1 -1
  102. package/dist/{extra-BeHlUhzv.js → extra-B6gFu4_1.js} +1 -1
  103. package/dist/{extra-BeHlUhzv.js.map → extra-B6gFu4_1.js.map} +1 -1
  104. package/dist/{extra-h_cuxRII.cjs → extra-DJRYaOXe.cjs} +1 -1
  105. package/dist/{extra-h_cuxRII.cjs.map → extra-DJRYaOXe.cjs.map} +1 -1
  106. package/dist/extra.cjs +1 -1
  107. package/dist/extra.js +1 -1
  108. package/dist/{float-CTc1xxqH.js → float-1iihPek5.js} +1 -1
  109. package/dist/{float-CTc1xxqH.js.map → float-1iihPek5.js.map} +1 -1
  110. package/dist/{float-CwVBs11k.cjs → float-Ckyk85XG.cjs} +1 -1
  111. package/dist/{float-CwVBs11k.cjs.map → float-Ckyk85XG.cjs.map} +1 -1
  112. package/dist/float.cjs +1 -1
  113. package/dist/float.js +1 -1
  114. package/dist/{form-BtwOBMZ9.js.map → form-BF1c3Dk1.js.map} +1 -1
  115. package/dist/{form-CSJp687X.cjs.map → form-DeO5XX3b.cjs.map} +1 -1
  116. package/dist/form.cjs +1 -1
  117. package/dist/form.js +1 -1
  118. package/dist/handover/agent-runtime-followups.md +1 -1
  119. package/dist/handover/agent-runtime-v1.md +3 -3
  120. package/dist/{hashContent-1ARKIsx9.js.map → hashContent-BU6jl5ih.js.map} +1 -1
  121. package/dist/{hashContent-Bp5S6T4U.cjs.map → hashContent-Bobsobip.cjs.map} +1 -1
  122. package/dist/{icons-qEQW4pjM.cjs → icons-CV-fiGcW.cjs} +1 -1
  123. package/dist/{icons-qEQW4pjM.cjs.map → icons-CV-fiGcW.cjs.map} +1 -1
  124. package/dist/{icons-BbCVrcas.js → icons-DUkcTZAY.js} +2 -2
  125. package/dist/{icons-BbCVrcas.js.map → icons-DUkcTZAY.js.map} +1 -1
  126. package/dist/icons.cjs +1 -1
  127. package/dist/icons.js +1 -1
  128. package/dist/{iframe-BJfDIEJf.js → iframe-C9tj7F6Y.js} +1 -1
  129. package/dist/{iframe-BJfDIEJf.js.map → iframe-C9tj7F6Y.js.map} +1 -1
  130. package/dist/{iframe-D6HTruav.cjs → iframe-DF97oGtZ.cjs} +1 -1
  131. package/dist/{iframe-D6HTruav.cjs.map → iframe-DF97oGtZ.cjs.map} +1 -1
  132. package/dist/iframe.cjs +1 -1
  133. package/dist/iframe.js +1 -1
  134. package/dist/index.cjs +1 -1
  135. package/dist/index.js +70 -76
  136. package/dist/{input-LTK3cctF.js → input-DE7x223Y.js} +1 -1
  137. package/dist/{input-LTK3cctF.js.map → input-DE7x223Y.js.map} +1 -1
  138. package/dist/{input-U26axtcs.cjs → input-TW9G3n7X.cjs} +1 -1
  139. package/dist/{input-U26axtcs.cjs.map → input-TW9G3n7X.cjs.map} +1 -1
  140. package/dist/{input-chip-Ch-aCs3c.js → input-chip-BdoaVw_D.js} +1 -1
  141. package/dist/{input-chip-Ch-aCs3c.js.map → input-chip-BdoaVw_D.js.map} +1 -1
  142. package/dist/{input-chip-CADXt0X5.cjs → input-chip-Do48eI5r.cjs} +1 -1
  143. package/dist/{input-chip-CADXt0X5.cjs.map → input-chip-Do48eI5r.cjs.map} +1 -1
  144. package/dist/input.cjs +1 -1
  145. package/dist/input.js +1 -1
  146. package/dist/json.cjs +1 -1
  147. package/dist/json.js +2 -2
  148. package/dist/kbd.cjs +1 -1
  149. package/dist/kbd.js +1 -1
  150. package/dist/{layout-C4xmnU4n.js → layout-CXPNsUIo.js} +1 -1
  151. package/dist/{layout-C4xmnU4n.js.map → layout-CXPNsUIo.js.map} +1 -1
  152. package/dist/{layout-Dmh6fxh0.cjs → layout-Zhe7wSZ_.cjs} +1 -1
  153. package/dist/{layout-Dmh6fxh0.cjs.map → layout-Zhe7wSZ_.cjs.map} +1 -1
  154. package/dist/layout.cjs +1 -1
  155. package/dist/layout.js +1 -1
  156. package/dist/{lightbox-DqG2z3Cn.js → lightbox-DcutIyjx.js} +2 -2
  157. package/dist/{lightbox-DqG2z3Cn.js.map → lightbox-DcutIyjx.js.map} +1 -1
  158. package/dist/{lightbox-DbYUSfVl.cjs → lightbox-sPfnYzjJ.cjs} +1 -1
  159. package/dist/{lightbox-DbYUSfVl.cjs.map → lightbox-sPfnYzjJ.cjs.map} +1 -1
  160. package/dist/lightbox.cjs +1 -1
  161. package/dist/lightbox.js +1 -1
  162. package/dist/{list-D6-_E5ZD.js → list-BWrtrdgs.js} +1 -1
  163. package/dist/{list-D6-_E5ZD.js.map → list-BWrtrdgs.js.map} +1 -1
  164. package/dist/{list-CLX4sSAw.cjs → list-C4vasUly.cjs} +1 -1
  165. package/dist/{list-CLX4sSAw.cjs.map → list-C4vasUly.cjs.map} +1 -1
  166. package/dist/list.cjs +1 -1
  167. package/dist/list.js +1 -1
  168. package/dist/{magnetic-BH0TsofV.cjs.map → magnetic-BJgB1dVi.cjs.map} +1 -1
  169. package/dist/{magnetic-BZGFxAWG.js.map → magnetic-YwCNvtbB.js.map} +1 -1
  170. package/dist/{map-WXeVkx2K.cjs → map-BAQ9FEB6.cjs} +1 -1
  171. package/dist/{map-WXeVkx2K.cjs.map → map-BAQ9FEB6.cjs.map} +1 -1
  172. package/dist/{map-Dhy3ta9v.js → map-CEreveeI.js} +1 -1
  173. package/dist/{map-Dhy3ta9v.js.map → map-CEreveeI.js.map} +1 -1
  174. package/dist/map.cjs +1 -1
  175. package/dist/map.js +1 -1
  176. package/dist/menu-3yXDZusj.cjs +23 -0
  177. package/dist/menu-3yXDZusj.cjs.map +1 -0
  178. package/dist/menu-CxChOxWT.js +62 -0
  179. package/dist/menu-CxChOxWT.js.map +1 -0
  180. package/dist/menu.cjs +1 -1
  181. package/dist/menu.js +1 -1
  182. package/dist/mixins-Db7gjDah.cjs +298 -0
  183. package/dist/{mixins-De3xfjrm.cjs.map → mixins-Db7gjDah.cjs.map} +1 -1
  184. package/dist/mixins-Dw6hVfy-.js +627 -0
  185. package/dist/{mixins-CcIWET41.js.map → mixins-Dw6hVfy-.js.map} +1 -1
  186. package/dist/mixins.cjs +1 -1
  187. package/dist/mixins.js +1 -1
  188. package/dist/nav-drawer.cjs +1 -1
  189. package/dist/nav-drawer.js +1 -1
  190. package/dist/navigation-bar.cjs +1 -1
  191. package/dist/navigation-bar.js +1 -1
  192. package/dist/navigation-rail.cjs +1 -1
  193. package/dist/navigation-rail.js +1 -1
  194. package/dist/{notification-D_PQjBSf.cjs → notification-DKYy9qVe.cjs} +1 -1
  195. package/dist/{notification-D_PQjBSf.cjs.map → notification-DKYy9qVe.cjs.map} +1 -1
  196. package/dist/{notification-CVLqQ8c_.js → notification-ycbUBbOu.js} +2 -2
  197. package/dist/{notification-CVLqQ8c_.js.map → notification-ycbUBbOu.js.map} +1 -1
  198. package/dist/notification.cjs +1 -1
  199. package/dist/notification.js +1 -1
  200. package/dist/{option-rm4HebVs.js → option-DtOhMd3k.js} +1 -1
  201. package/dist/{option-rm4HebVs.js.map → option-DtOhMd3k.js.map} +1 -1
  202. package/dist/{option-DDU_goh1.cjs → option-zgVge3BH.cjs} +1 -1
  203. package/dist/{option-DDU_goh1.cjs.map → option-zgVge3BH.cjs.map} +1 -1
  204. package/dist/option.cjs +1 -1
  205. package/dist/option.js +1 -1
  206. package/dist/{overlay-stack-CAQno0CK.js.map → overlay-stack-DCDS17uj.js.map} +1 -1
  207. package/dist/{overlay-stack-BprhAE9a.cjs.map → overlay-stack-DPIe_aYv.cjs.map} +1 -1
  208. package/dist/overlay.cjs +5 -53
  209. package/dist/overlay.cjs.map +1 -1
  210. package/dist/overlay.confirm-body-AFqYBqrI.js +104 -0
  211. package/dist/overlay.confirm-body-AFqYBqrI.js.map +1 -0
  212. package/dist/overlay.confirm-body-DctQLDao.cjs +49 -0
  213. package/dist/overlay.confirm-body-DctQLDao.cjs.map +1 -0
  214. package/dist/overlay.js +120 -360
  215. package/dist/overlay.js.map +1 -1
  216. package/dist/overlay.service-B9On2-Aa.js +146 -0
  217. package/dist/overlay.service-B9On2-Aa.js.map +1 -0
  218. package/dist/overlay.service-k2nCE4pi.cjs +1 -0
  219. package/dist/overlay.service-k2nCE4pi.cjs.map +1 -0
  220. package/dist/page.cjs +1 -1
  221. package/dist/page.js +4 -4
  222. package/dist/{payment-card-form-C0dHYZIv.js → payment-card-form-Be1-OVlL.js} +1 -1
  223. package/dist/{payment-card-form-C0dHYZIv.js.map → payment-card-form-Be1-OVlL.js.map} +1 -1
  224. package/dist/{payment-card-form-DNvmZxs4.cjs → payment-card-form-CNnGePG4.cjs} +1 -1
  225. package/dist/{payment-card-form-DNvmZxs4.cjs.map → payment-card-form-CNnGePG4.cjs.map} +1 -1
  226. package/dist/payment-card-form.cjs +1 -1
  227. package/dist/payment-card-form.js +1 -1
  228. package/dist/{progress-BRerM5Bn.js → progress-BFWzmTlz.js} +1 -1
  229. package/dist/{progress-BRerM5Bn.js.map → progress-BFWzmTlz.js.map} +1 -1
  230. package/dist/{progress-U3LQkpM2.cjs → progress-C4TGG2eN.cjs} +1 -1
  231. package/dist/{progress-U3LQkpM2.cjs.map → progress-C4TGG2eN.cjs.map} +1 -1
  232. package/dist/progress.cjs +1 -1
  233. package/dist/progress.js +1 -1
  234. package/dist/qr-scanner.cjs +1 -1
  235. package/dist/qr-scanner.js +1 -1
  236. package/dist/{radio-group-BZ2WoOXJ.js → radio-group-DTNAW5dd.js} +1 -1
  237. package/dist/{radio-group-BZ2WoOXJ.js.map → radio-group-DTNAW5dd.js.map} +1 -1
  238. package/dist/{radio-group-D7mm-yvJ.cjs → radio-group-xLRp1g57.cjs} +1 -1
  239. package/dist/{radio-group-D7mm-yvJ.cjs.map → radio-group-xLRp1g57.cjs.map} +1 -1
  240. package/dist/radio-group.cjs +1 -1
  241. package/dist/radio-group.js +1 -1
  242. package/dist/range.cjs +1 -1
  243. package/dist/range.js +1 -1
  244. package/dist/{rxjs-utils-d-ivVN84.js.map → rxjs-utils-BK8VMe3K.js.map} +1 -1
  245. package/dist/{rxjs-utils-Csnks202.cjs.map → rxjs-utils-DhOKenkS.cjs.map} +1 -1
  246. package/dist/rxjs-utils.cjs +1 -1
  247. package/dist/rxjs-utils.js +1 -1
  248. package/dist/{scroll-qL-HkMdP.js → scroll-BCmdqSQU.js} +1 -1
  249. package/dist/{scroll-qL-HkMdP.js.map → scroll-BCmdqSQU.js.map} +1 -1
  250. package/dist/{scroll-DJTjNIT_.cjs → scroll-Bdgb-vRy.cjs} +1 -1
  251. package/dist/{scroll-DJTjNIT_.cjs.map → scroll-Bdgb-vRy.cjs.map} +1 -1
  252. package/dist/{select-CnPXUeSf.js → select-COGARE0b.js} +2 -2
  253. package/dist/{select-CnPXUeSf.js.map → select-COGARE0b.js.map} +1 -1
  254. package/dist/{select-BvA7v-gL.cjs → select-Cv5t_PT3.cjs} +1 -1
  255. package/dist/{select-BvA7v-gL.cjs.map → select-Cv5t_PT3.cjs.map} +1 -1
  256. package/dist/select.cjs +1 -1
  257. package/dist/select.js +1 -1
  258. package/dist/skeleton.cjs +1 -1
  259. package/dist/skeleton.js +1 -1
  260. package/dist/skills/INDEX.md +3 -6
  261. package/dist/skills/SKILL.md +13 -9
  262. package/dist/skills/schmancy/INDEX.md +3 -6
  263. package/dist/skills/schmancy/SKILL.md +13 -9
  264. package/dist/slider.cjs +1 -1
  265. package/dist/slider.js +1 -1
  266. package/dist/{splash-screen-BDt4PInk.cjs → splash-screen-B8rFbjqT.cjs} +1 -1
  267. package/dist/{splash-screen-BDt4PInk.cjs.map → splash-screen-B8rFbjqT.cjs.map} +1 -1
  268. package/dist/{splash-screen-C8JCqX5L.js → splash-screen-DbGbGttg.js} +1 -1
  269. package/dist/{splash-screen-C8JCqX5L.js.map → splash-screen-DbGbGttg.js.map} +1 -1
  270. package/dist/splash-screen.cjs +1 -1
  271. package/dist/splash-screen.js +1 -1
  272. package/dist/{src-CqdnWGgr.js → src-YRir9pOP.js} +162 -162
  273. package/dist/src-YRir9pOP.js.map +1 -0
  274. package/dist/{src-CpRNClhg.cjs → src-b8D-Ec-Q.cjs} +13 -13
  275. package/dist/src-b8D-Ec-Q.cjs.map +1 -0
  276. package/dist/steps.cjs +1 -1
  277. package/dist/steps.js +1 -1
  278. package/dist/{surface-C8jQy8Ym.js → surface-BE7sGTBt.js} +1 -1
  279. package/dist/{surface-C8jQy8Ym.js.map → surface-BE7sGTBt.js.map} +1 -1
  280. package/dist/{surface-Du2Y4vXd.cjs → surface-BvudRtf5.cjs} +1 -1
  281. package/dist/{surface-Du2Y4vXd.cjs.map → surface-BvudRtf5.cjs.map} +1 -1
  282. package/dist/surface.cjs +1 -1
  283. package/dist/surface.js +1 -1
  284. package/dist/switch.cjs +1 -1
  285. package/dist/switch.js +1 -1
  286. package/dist/table.cjs +1 -1
  287. package/dist/table.js +1 -1
  288. package/dist/{tabs-0RfeCa00.cjs → tabs-C0XKld1Z.cjs} +1 -1
  289. package/dist/{tabs-0RfeCa00.cjs.map → tabs-C0XKld1Z.cjs.map} +1 -1
  290. package/dist/{tabs-Cyahh9Q6.js → tabs-DIzCRsA3.js} +1 -1
  291. package/dist/{tabs-Cyahh9Q6.js.map → tabs-DIzCRsA3.js.map} +1 -1
  292. package/dist/tabs.cjs +1 -1
  293. package/dist/tabs.js +1 -1
  294. package/dist/teleport.cjs +1 -1
  295. package/dist/teleport.js +1 -1
  296. package/dist/{textarea-jqRrLxmo.cjs → textarea-BCDCGCJd.cjs} +1 -1
  297. package/dist/{textarea-jqRrLxmo.cjs.map → textarea-BCDCGCJd.cjs.map} +1 -1
  298. package/dist/{textarea-CXCcTVnf.js → textarea-UbZzBwqm.js} +1 -1
  299. package/dist/{textarea-CXCcTVnf.js.map → textarea-UbZzBwqm.js.map} +1 -1
  300. package/dist/textarea.cjs +1 -1
  301. package/dist/textarea.js +1 -1
  302. package/dist/theme-CIsI-sFj.cjs +181 -0
  303. package/dist/{theme-Hjz9sCN-.cjs.map → theme-CIsI-sFj.cjs.map} +1 -1
  304. package/dist/{theme-2KZW2Rfs.js → theme-Qh-yPEPL.js} +3 -4
  305. package/dist/{theme-2KZW2Rfs.js.map → theme-Qh-yPEPL.js.map} +1 -1
  306. package/dist/{theme-button-9uF1eoHz.js → theme-button-CjTnfs9x.js} +1 -1
  307. package/dist/{theme-button-9uF1eoHz.js.map → theme-button-CjTnfs9x.js.map} +1 -1
  308. package/dist/{theme-button-C7QIbke1.cjs → theme-button-Dv1D_Vil.cjs} +1 -1
  309. package/dist/{theme-button-C7QIbke1.cjs.map → theme-button-Dv1D_Vil.cjs.map} +1 -1
  310. package/dist/theme-button.cjs +1 -1
  311. package/dist/theme-button.js +1 -1
  312. package/dist/theme.cjs +1 -1
  313. package/dist/{theme.interface-D9l33b-M.cjs.map → theme.interface-BeW-sz_g.cjs.map} +1 -1
  314. package/dist/{theme.interface-DnVNre4O.js.map → theme.interface-v7SkAnDH.js.map} +1 -1
  315. package/dist/theme.js +5 -6
  316. package/dist/theme.service-Cfk88qHK.cjs +1 -0
  317. package/dist/theme.service-Cfk88qHK.cjs.map +1 -0
  318. package/dist/{theme.service-CmbOGMA8.js → theme.service-DIUo1mBP.js} +13 -14
  319. package/dist/theme.service-DIUo1mBP.js.map +1 -0
  320. package/dist/timeline.cjs +1 -1
  321. package/dist/timeline.js +1 -1
  322. package/dist/tree.cjs +1 -1
  323. package/dist/tree.js +1 -1
  324. package/dist/typography.cjs +1 -1
  325. package/dist/typography.js +1 -1
  326. package/dist/{utils-hp-DnFf5.js → utils-BfOze6Tk.js} +1 -1
  327. package/dist/{utils-hp-DnFf5.js.map → utils-BfOze6Tk.js.map} +1 -1
  328. package/dist/{utils-Cr-YO4Np.cjs → utils-CJ9y2Jz9.cjs} +1 -1
  329. package/dist/{utils-Cr-YO4Np.cjs.map → utils-CJ9y2Jz9.cjs.map} +1 -1
  330. package/dist/utils.cjs +1 -1
  331. package/dist/utils.js +2 -2
  332. package/dist/visually-hidden.cjs +1 -1
  333. package/dist/visually-hidden.js +1 -1
  334. package/dist/{window-DtUOWiAj.cjs → window-9HOUXrTU.cjs} +1 -1
  335. package/dist/{window-DtUOWiAj.cjs.map → window-9HOUXrTU.cjs.map} +1 -1
  336. package/dist/{window-C7yY9yp5.js → window-B_55dzk0.js} +3 -3
  337. package/dist/{window-C7yY9yp5.js.map → window-B_55dzk0.js.map} +1 -1
  338. package/dist/window.cjs +1 -1
  339. package/dist/window.js +1 -1
  340. package/package.json +1 -2
  341. package/skills/schmancy/INDEX.md +3 -6
  342. package/skills/schmancy/SKILL.md +13 -9
  343. package/src/content-drawer/drawer.ts +24 -7
  344. package/src/content-drawer/events.ts +6 -0
  345. package/src/content-drawer/sheet.ts +13 -12
  346. package/src/date-range/date-range-dialog.ts +4 -4
  347. package/src/date-range/date-range.ts +35 -53
  348. package/src/index.ts +0 -4
  349. package/src/menu/menu-item.ts +7 -2
  350. package/src/menu/menu.ts +24 -20
  351. package/types/src/content-drawer/drawer.d.ts +2 -0
  352. package/types/src/content-drawer/events.d.ts +6 -0
  353. package/types/src/content-drawer/sheet.d.ts +6 -5
  354. package/types/src/date-range/date-range.d.ts +1 -5
  355. package/types/src/index.d.ts +0 -4
  356. package/types/src/menu/menu-item.d.ts +1 -0
  357. package/types/src/menu/menu.d.ts +9 -7
  358. package/dist/agent/vendor-highlight-CHJZQQB7.js +0 -2178
  359. package/dist/agent/vendor-highlight-CHJZQQB7.js.map +0 -1
  360. package/dist/code-highlight-CMilN0B8.cjs +0 -190
  361. package/dist/code-highlight-CMilN0B8.cjs.map +0 -1
  362. package/dist/code-highlight-kFUJ1Eet.js +0 -296
  363. package/dist/code-highlight-kFUJ1Eet.js.map +0 -1
  364. package/dist/code-highlight.cjs +0 -1
  365. package/dist/code-highlight.js +0 -2
  366. package/dist/date-range-BIyrzTRZ.cjs +0 -131
  367. package/dist/date-range-BIyrzTRZ.cjs.map +0 -1
  368. package/dist/date-range-DOstCIg8.js.map +0 -1
  369. package/dist/dialog-service-DI9PPy4H.js +0 -193
  370. package/dist/dialog-service-DI9PPy4H.js.map +0 -1
  371. package/dist/dialog-service-DJd5L0f5.cjs +0 -1
  372. package/dist/dialog-service-DJd5L0f5.cjs.map +0 -1
  373. package/dist/dialog.cjs +0 -89
  374. package/dist/dialog.cjs.map +0 -1
  375. package/dist/dialog.js +0 -419
  376. package/dist/dialog.js.map +0 -1
  377. package/dist/mailbox-Ct6iYe-4.cjs +0 -1140
  378. package/dist/mailbox-Ct6iYe-4.cjs.map +0 -1
  379. package/dist/mailbox-DsPII8HR.js +0 -1596
  380. package/dist/mailbox-DsPII8HR.js.map +0 -1
  381. package/dist/mailbox.cjs +0 -1
  382. package/dist/mailbox.js +0 -2
  383. package/dist/menu-Bhd3EapX.js +0 -56
  384. package/dist/menu-Bhd3EapX.js.map +0 -1
  385. package/dist/menu-Cg2aaDjs.cjs +0 -23
  386. package/dist/menu-Cg2aaDjs.cjs.map +0 -1
  387. package/dist/mixins-CcIWET41.js +0 -627
  388. package/dist/mixins-De3xfjrm.cjs +0 -298
  389. package/dist/sheet-BRL07BB4.js +0 -170
  390. package/dist/sheet-BRL07BB4.js.map +0 -1
  391. package/dist/sheet-BYQJAHQn.cjs +0 -35
  392. package/dist/sheet-BYQJAHQn.cjs.map +0 -1
  393. package/dist/sheet.cjs +0 -1
  394. package/dist/sheet.js +0 -3
  395. package/dist/sheet.service-B25bsrYG.cjs +0 -1
  396. package/dist/sheet.service-B25bsrYG.cjs.map +0 -1
  397. package/dist/sheet.service-SPQ8oLCi.js +0 -86
  398. package/dist/sheet.service-SPQ8oLCi.js.map +0 -1
  399. package/dist/skills/code-highlight.md +0 -47
  400. package/dist/skills/dialog.md +0 -69
  401. package/dist/skills/mailbox.md +0 -102
  402. package/dist/skills/schmancy/code-highlight.md +0 -47
  403. package/dist/skills/schmancy/dialog.md +0 -69
  404. package/dist/skills/schmancy/mailbox.md +0 -102
  405. package/dist/skills/schmancy/sheet.md +0 -76
  406. package/dist/skills/sheet.md +0 -76
  407. package/dist/src-CpRNClhg.cjs.map +0 -1
  408. package/dist/src-CqdnWGgr.js.map +0 -1
  409. package/dist/theme-Hjz9sCN-.cjs +0 -181
  410. package/dist/theme.events-Cv7N4Toe.js +0 -2
  411. package/dist/theme.events-Cv7N4Toe.js.map +0 -1
  412. package/dist/theme.events-DM4H5F2d.cjs +0 -1
  413. package/dist/theme.events-DM4H5F2d.cjs.map +0 -1
  414. package/dist/theme.service-BrUbGoeQ.cjs +0 -1
  415. package/dist/theme.service-BrUbGoeQ.cjs.map +0 -1
  416. package/dist/theme.service-CmbOGMA8.js.map +0 -1
  417. package/skills/schmancy/code-highlight.md +0 -47
  418. package/skills/schmancy/dialog.md +0 -69
  419. package/skills/schmancy/mailbox.md +0 -102
  420. package/skills/schmancy/sheet.md +0 -76
  421. package/src/code-highlight/code-highlight.ts +0 -345
  422. package/src/code-highlight/code-preview.ts +0 -125
  423. package/src/code-highlight/index.ts +0 -3
  424. package/src/dialog/dialog-base.mixin.ts +0 -576
  425. package/src/dialog/dialog-events.ts +0 -17
  426. package/src/dialog/dialog-service.ts +0 -494
  427. package/src/dialog/dialog.component.ts +0 -414
  428. package/src/dialog/index.ts +0 -3
  429. package/src/mailbox/README.md +0 -128
  430. package/src/mailbox/email-editor.ts +0 -1077
  431. package/src/mailbox/email-layout-selector.ts +0 -58
  432. package/src/mailbox/email-recipients.ts +0 -599
  433. package/src/mailbox/email-template-picker.ts +0 -297
  434. package/src/mailbox/email-viewer.ts +0 -717
  435. package/src/mailbox/index.ts +0 -31
  436. package/src/mailbox/mailbox.ts +0 -364
  437. package/src/mailbox/types.ts +0 -180
  438. package/src/sheet/hook.ts +0 -40
  439. package/src/sheet/index.ts +0 -2
  440. package/src/sheet/sheet.service.ts +0 -245
  441. package/src/sheet/sheet.ts +0 -238
  442. package/types/src/code-highlight/code-highlight.d.ts +0 -49
  443. package/types/src/code-highlight/code-preview.d.ts +0 -30
  444. package/types/src/code-highlight/index.d.ts +0 -3
  445. package/types/src/dialog/dialog-base.mixin.d.ts +0 -30
  446. package/types/src/dialog/dialog-events.d.ts +0 -13
  447. package/types/src/dialog/dialog-service.d.ts +0 -91
  448. package/types/src/dialog/dialog.component.d.ts +0 -150
  449. package/types/src/dialog/index.d.ts +0 -3
  450. package/types/src/mailbox/email-editor.d.ts +0 -101
  451. package/types/src/mailbox/email-layout-selector.d.ts +0 -18
  452. package/types/src/mailbox/email-recipients.d.ts +0 -122
  453. package/types/src/mailbox/email-template-picker.d.ts +0 -54
  454. package/types/src/mailbox/email-viewer.d.ts +0 -86
  455. package/types/src/mailbox/index.d.ts +0 -12
  456. package/types/src/mailbox/mailbox.d.ts +0 -82
  457. package/types/src/mailbox/types.d.ts +0 -176
  458. package/types/src/sheet/hook.d.ts +0 -5
  459. package/types/src/sheet/index.d.ts +0 -2
  460. package/types/src/sheet/sheet.d.ts +0 -29
  461. package/types/src/sheet/sheet.service.d.ts +0 -65
  462. /package/dist/agent/{flow-CaPi2G8y.js → flow-3RrZM-e7.js} +0 -0
  463. /package/dist/agent/{vendor-jsqr-r7GNh4P3.js → vendor-jsqr-BUVwyoGC.js} +0 -0
  464. /package/dist/agent/{vendor-material-color-Be96dpGE.js → vendor-material-color-33Mj762T.js} +0 -0
  465. /package/dist/{context-daN5G6HS.cjs → context-BpCETidA.cjs} +0 -0
  466. /package/dist/{context-Bdu1xt0W.js → context-DJTJnSK4.js} +0 -0
  467. /package/dist/{form-BtwOBMZ9.js → form-BF1c3Dk1.js} +0 -0
  468. /package/dist/{form-CSJp687X.cjs → form-DeO5XX3b.cjs} +0 -0
  469. /package/dist/{hashContent-1ARKIsx9.js → hashContent-BU6jl5ih.js} +0 -0
  470. /package/dist/{hashContent-Bp5S6T4U.cjs → hashContent-Bobsobip.cjs} +0 -0
  471. /package/dist/{magnetic-BH0TsofV.cjs → magnetic-BJgB1dVi.cjs} +0 -0
  472. /package/dist/{magnetic-BZGFxAWG.js → magnetic-YwCNvtbB.js} +0 -0
  473. /package/dist/{overlay-stack-CAQno0CK.js → overlay-stack-DCDS17uj.js} +0 -0
  474. /package/dist/{overlay-stack-BprhAE9a.cjs → overlay-stack-DPIe_aYv.cjs} +0 -0
  475. /package/dist/{rxjs-utils-d-ivVN84.js → rxjs-utils-BK8VMe3K.js} +0 -0
  476. /package/dist/{rxjs-utils-Csnks202.cjs → rxjs-utils-DhOKenkS.cjs} +0 -0
  477. /package/dist/{theme.interface-D9l33b-M.cjs → theme.interface-BeW-sz_g.cjs} +0 -0
  478. /package/dist/{theme.interface-DnVNre4O.js → theme.interface-v7SkAnDH.js} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"mailbox-Ct6iYe-4.cjs","names":[],"sources":["../src/mailbox/mailbox.ts","../src/mailbox/email-layout-selector.ts","../src/mailbox/email-template-picker.ts","../src/mailbox/email-editor.ts","../src/mailbox/email-viewer.ts","../src/mailbox/email-recipients.ts"],"sourcesContent":["import { SchmancyElement } from '@mixins/index'\nimport { html, css } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { when } from 'lit/directives/when.js'\nimport type { \n\tEmailTemplate, \n\tEmailAttachment, \n\tEmailComposeConfig, \n\tSendEmailRequest,\n\tImportSource \n} from './types'\n\n/**\n * Main mailbox component that orchestrates the entire email composition flow\n * \n * Features:\n * - Responsive layout with composer and preview panels\n * - Recipients management with floating boat interface\n * - Template selection and content editing\n * - Attachment handling\n * - Email validation and sending\n * \n * @example\n * ```html\n * <schmancy-mailbox\n * .config=${{ sendEndpoint: '/api/send-email' }}\n * .templates=${emailTemplates}\n * .importSources=${recipientSources}\n * ></schmancy-mailbox>\n * ```\n */\n@customElement('schmancy-mailbox')\nexport class SchmancyMailbox extends SchmancyElement {\n\tstatic styles = [css`\n\t:host {\n\t\tdisplay: block;\n\t\theight: 100%;\n\t}\n`]\n\n\t/** Configuration for endpoints and handlers */\n\t@property({ type: Object }) config: EmailComposeConfig = {}\n\t\n\t/** Available email templates */\n\t@property({ type: Array }) templates: EmailTemplate[] = []\n\t\n\t/** Import sources for recipients panel */\n\t@property({ type: Array }) importSources: ImportSource[] = []\n\t\n\t/** Disable all interactions */\n\t@property({ type: Boolean }) disabled = false\n\t\n\t/** Recipients panel title */\n\t@property({ type: String }) recipientsTitle = 'Recipients'\n\t\n\t/** Empty state title for recipients */\n\t@property({ type: String }) recipientsEmptyTitle = 'No recipients yet'\n\t\n\t/** Empty state message for recipients */\n\t@property({ type: String }) recipientsEmptyMessage = 'Import from sources or upload a CSV'\n\t\n\t/** Enable CSV import functionality */\n\t@property({ type: Boolean }) enableCsvImport = true\n\t\n\t/** Enable drag and drop for files */\n\t@property({ type: Boolean }) enableDragDrop = true\n\n\t/** Email composition state */\n\t@state() private recipients: string[] = []\n\t@state() private selectedRecipients: string[] = []\n\t@state() private subject = ''\n\t@state() private body = ''\n\t@state() private templateId: string | null = null\n\t@state() private attachments: EmailAttachment[] = []\n\t@state() private isSending = false\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback()\n\t\tthis.setSending(this.disabled)\n\t}\n\n\tupdated(changedProperties: Map<string, unknown>) {\n\t\tsuper.updated(changedProperties)\n\t\t\n\t\t// Sync sending state\n\t\tif (changedProperties.has('disabled')) {\n\t\t\tthis.setSending(this.disabled)\n\t\t}\n\t}\n\n\t/** Handle emails imported from various sources */\n\tprivate handleEmailsImported = (event: CustomEvent) => {\n\t\tconst { emails } = event.detail\n\t\t\n\t\t// Add unique emails to recipients list\n\t\tconst uniqueEmails = [...new Set([...this.recipients, ...emails])]\n\t\tconst newEmails = emails.filter((email: string) => !this.recipients.includes(email))\n\t\t\n\t\tthis.recipients = uniqueEmails\n\t\t\n\t\t// Auto-select imported emails\n\t\tthis.selectedRecipients = [...new Set([...this.selectedRecipients, ...newEmails])]\n\t\t\n\t\t// Dispatch event to parent\n\t\tthis.dispatchEvent(new CustomEvent('emails-imported', {\n\t\t\tdetail: { emails: newEmails, source: event.detail.source },\n\t\t\tbubbles: true,\n\t\t\tcomposed: true\n\t\t}))\n\t}\n\n\t/** Handle individual recipient removal */\n\tprivate handleRecipientRemoved = (event: CustomEvent) => {\n\t\tconst { email } = event.detail\n\t\tthis.recipients = this.recipients.filter(e => e !== email)\n\t\tthis.selectedRecipients = this.selectedRecipients.filter(e => e !== email)\n\t\t\n\t\tthis.dispatchEvent(new CustomEvent('recipient-removed', {\n\t\t\tdetail: { email },\n\t\t\tbubbles: true,\n\t\t\tcomposed: true\n\t\t}))\n\t}\n\n\t/** Handle clearing all recipients */\n\tprivate handleRecipientsCleared = () => {\n\t\tthis.recipients = []\n\t\tthis.selectedRecipients = []\n\t\t\n\t\tthis.dispatchEvent(new CustomEvent('recipients-cleared', {\n\t\t\tbubbles: true,\n\t\t\tcomposed: true\n\t\t}))\n\t}\n\n\t/** Handle recipient selection changes */\n\tprivate handleSelectionChanged = (event: CustomEvent) => {\n\t\tconst { selectedEmails } = event.detail\n\t\tthis.selectedRecipients = selectedEmails\n\t\t\n\t\tthis.dispatchEvent(new CustomEvent('selection-changed', {\n\t\t\tdetail: { selectedEmails },\n\t\t\tbubbles: true,\n\t\t\tcomposed: true\n\t\t}))\n\t}\n\n\t/** Handle composer content changes */\n\tprivate handleEditorChange = (event: CustomEvent) => {\n\t\tconst { subject, body, templateId, attachments } = event.detail\n\t\tthis.subject = subject\n\t\tthis.body = body\n\t\tthis.templateId = templateId\n\t\tthis.attachments = attachments\n\t\t\n\t\tthis.dispatchEvent(new CustomEvent('compose-changed', {\n\t\t\tdetail: { subject, body, templateId, attachments },\n\t\t\tbubbles: true,\n\t\t\tcomposed: true\n\t\t}))\n\t}\n\n\t/** Handle email sending */\n\tprivate handleSend = async () => {\n\t\t// Validation\n\t\tif (this.selectedRecipients.length === 0) {\n\t\t\tthis.dispatchEvent(new CustomEvent('send-error', {\n\t\t\t\tdetail: { error: 'Please select at least one recipient' },\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true\n\t\t\t}))\n\t\t\treturn\n\t\t}\n\n\t\tif (!this.subject.trim()) {\n\t\t\tthis.dispatchEvent(new CustomEvent('send-error', {\n\t\t\t\tdetail: { error: 'Please enter a subject' },\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true\n\t\t\t}))\n\t\t\treturn\n\t\t}\n\n\t\tif (!this.body.trim()) {\n\t\t\tthis.dispatchEvent(new CustomEvent('send-error', {\n\t\t\t\tdetail: { error: 'Please enter a message body' },\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true\n\t\t\t}))\n\t\t\treturn\n\t\t}\n\n\t\tthis.isSending = true\n\n\t\ttry {\n\t\t\tconst request: SendEmailRequest = {\n\t\t\t\trecipients: this.selectedRecipients,\n\t\t\t\tsubject: this.subject,\n\t\t\t\tbody: this.body,\n\t\t\t\tattachments: this.attachments,\n\t\t\t\ttemplateId: this.templateId\n\t\t\t}\n\n\t\t\t// Dispatch event for parent to handle\n\t\t\tthis.dispatchEvent(new CustomEvent('send-email', {\n\t\t\t\tdetail: { request },\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true\n\t\t\t}))\n\n\t\t} catch (error) {\n\t\t\tthis.dispatchEvent(new CustomEvent('send-error', {\n\t\t\t\tdetail: { error: error instanceof Error ? error.message : 'Failed to send email' },\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true\n\t\t\t}))\n\t\t} finally {\n\t\t\tthis.isSending = false\n\t\t}\n\t}\n\n\t// Public API methods for external control\n\n\t/** Add recipients programmatically */\n\tpublic addRecipients(emails: string[]) {\n\t\tconst uniqueEmails = [...new Set([...this.recipients, ...emails])]\n\t\tconst newEmails = emails.filter(email => !this.recipients.includes(email))\n\t\t\n\t\tthis.recipients = uniqueEmails\n\t\tthis.selectedRecipients = [...new Set([...this.selectedRecipients, ...newEmails])]\n\t}\n\n\t/** Set email subject */\n\tpublic setSubject(subject: string) {\n\t\tthis.subject = subject\n\t}\n\n\t/** Set email body */\n\tpublic setBody(body: string) {\n\t\tthis.body = body\n\t}\n\n\t/** Set selected template */\n\tpublic setTemplate(templateId: string | null) {\n\t\tthis.templateId = templateId\n\t}\n\n\t/** Clear all compose data */\n\tpublic clearCompose() {\n\t\tthis.recipients = []\n\t\tthis.selectedRecipients = []\n\t\tthis.subject = ''\n\t\tthis.body = ''\n\t\tthis.templateId = null\n\t\tthis.attachments = []\n\t}\n\n\t/** Set sending state */\n\tpublic setSending(sending: boolean) {\n\t\tthis.isSending = sending\n\t}\n\n\trender() {\n\t\tconst canSend = this.selectedRecipients.length > 0 && \n\t\t this.subject.trim() && \n\t\t this.body.trim() && \n\t\t !this.isSending && \n\t\t !this.disabled\n\n\t\treturn html`\n\t\t\t<!-- Main Layout Container -->\n\t\t\t<div class=\"flex flex-col h-full gap-6 p-6\">\n\t\t\t\t\n\t\t\t\t<!-- Main Content Section: Composer and Preview -->\n\t\t\t\t<div class=\"flex flex-col xl:flex-row gap-6 flex-1 min-h-0\">\n\t\t\t\t\t\n\t\t\t\t\t<!-- Composer Section - Full width on mobile/tablet, half on large screens -->\n\t\t\t\t\t<div class=\"w-full xl:w-1/2 min-h-0 flex flex-col\">\n\t\t\t\t\t\t<schmancy-email-editor\n\t\t\t\t\t\t\t.subject=${this.subject}\n\t\t\t\t\t\t\t.body=${this.body}\n\t\t\t\t\t\t\t.templates=${this.templates}\n\t\t\t\t\t\t\t.attachments=${this.attachments}\n\t\t\t\t\t\t\t.disabled=${this.disabled}\n\t\t\t\t\t\t\t.config=${this.config}\n\t\t\t\t\t\t\t@editor-change=${this.handleEditorChange}\n\t\t\t\t\t\t\tclass=\"h-full\"\n\t\t\t\t\t\t></schmancy-email-editor>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<!-- Preview Section - Full width on mobile/tablet, half on large screens -->\n\t\t\t\t\t<div class=\"w-full xl:w-1/2 min-h-0 flex flex-col\">\n\t\t\t\t\t\t<schmancy-email-viewer\n\t\t\t\t\t\t\t.subject=${this.subject}\n\t\t\t\t\t\t\t.body=${this.body}\n\t\t\t\t\t\t\t.recipients=${this.selectedRecipients}\n\t\t\t\t\t\t\t.attachments=${this.attachments}\n\t\t\t\t\t\t\tclass=\"h-full\"\n\t\t\t\t\t\t></schmancy-email-viewer>\n\t\t\t\t\t</div>\n\t\t\t\t\t\n\t\t\t\t</div>\n\n\t\t\t\t<!-- Send Section - Sticky bottom bar -->\n\t\t\t\t<div class=\"shrink-0\">\n\t\t\t\t\t<schmancy-surface \n\t\t\t\t\t\ttype=\"subtle\"\n\t\t\t\t\t\trounded=\"all\"\n\t\t\t\t\t\tclass=\"p-4\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div class=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4\">\n\t\t\t\t\t\t\t<!-- Send Info -->\n\t\t\t\t\t\t\t<div class=\"flex flex-col gap-1\">\n\t\t\t\t\t\t\t\t<schmancy-typography type=\"body\" token=\"sm\" class=\"font-medium\">\n\t\t\t\t\t\t\t\t\t${this.selectedRecipients.length} recipient${this.selectedRecipients.length === 1 ? '' : 's'} selected\n\t\t\t\t\t\t\t\t</schmancy-typography>\n\t\t\t\t\t\t\t\t${when(this.attachments.length > 0, () => html`\n\t\t\t\t\t\t\t\t\t<schmancy-typography type=\"body\" token=\"xs\">\n\t\t\t\t\t\t\t\t\t\t${this.attachments.length} attachment${this.attachments.length === 1 ? '' : 's'}\n\t\t\t\t\t\t\t\t\t</schmancy-typography>\n\t\t\t\t\t\t\t\t`)}\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<!-- Send Button -->\n\t\t\t\t\t\t\t<schmancy-button\n\t\t\t\t\t\t\t\tvariant=\"filled\"\n\t\t\t\t\t\t\t\t?disabled=${!canSend}\n\t\t\t\t\t\t\t\t@click=${this.handleSend}\n\t\t\t\t\t\t\t\tclass=\"w-full sm:w-auto\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<schmancy-icon slot=\"prefix\" size=\"18px\">send</schmancy-icon>\n\t\t\t\t\t\t\t\t${this.isSending ? 'Sending...' : 'Send Email'}\n\t\t\t\t\t\t\t</schmancy-button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</schmancy-surface>\n\t\t\t\t</div>\n\t\t\t\t\n\t\t\t</div>\n\n\t\t\t<!-- Recipients Panel as Floating Boat -->\n\t\t\t<schmancy-email-recipients\n\t\t\t\t.recipients=${this.recipients}\n\t\t\t\t.selectedRecipients=${this.selectedRecipients}\n\t\t\t\t.importSources=${this.importSources}\n\t\t\t\t.disabled=${this.disabled}\n\t\t\t\t.enableCsvImport=${this.enableCsvImport}\n\t\t\t\t.enableDragDrop=${this.enableDragDrop}\n\t\t\t\t.title=${this.recipientsTitle}\n\t\t\t\t.emptyStateTitle=${this.recipientsEmptyTitle}\n\t\t\t\t.emptyStateMessage=${this.recipientsEmptyMessage}\n\t\t\t\t@emails-imported=${this.handleEmailsImported}\n\t\t\t\t@recipient-removed=${this.handleRecipientRemoved}\n\t\t\t\t@recipients-cleared=${this.handleRecipientsCleared}\n\t\t\t\t@selection-changed=${this.handleSelectionChanged}\n\t\t\t></schmancy-email-recipients>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-mailbox': SchmancyMailbox\n\t}\n}\n","import { SchmancyElement } from '@mixins/index'\nimport { html } from 'lit'\nimport { customElement } from 'lit/decorators.js'\n\n/**\n * Email layout selector component for choosing email templates\n * \n * Simple horizontal row of 5 layout options using Schmancy components only.\n * \n * @fires layout-select - When a layout is selected with {detail: {layout: string}}\n */\n@customElement('schmancy-email-layout-selector')\nexport class SchmancyEmailLayoutSelector extends SchmancyElement {\n\t\n\tprivate layouts = [\n\t\t{ id: 'columns-2', icon: 'view_week', label: '2 Col' },\n\t\t{ id: 'columns-3', icon: 'view_column', label: '3 Col' },\n\t\t{ id: 'sidebar-left', icon: 'view_sidebar', label: 'Left' },\n\t\t{ id: 'sidebar-right', icon: 'view_sidebar', label: 'Right', flipped: true },\n\t\t{ id: 'image-row', icon: 'collections', label: 'Images' }\n\t]\n\n\tprivate selectLayout(layoutType: string) {\n\t\tthis.dispatchEvent(new CustomEvent('layout-select', {\n\t\t\tdetail: { layout: layoutType },\n\t\t\tbubbles: true,\n\t\t\tcomposed: true\n\t\t}))\n\t}\n\n\trender() {\n\t\treturn html`\n\t\t\t<div class=\"grid p-3 gap-2\">\n\t\t\t\t${this.layouts.map(layout => html`\n\t\t\t\t\t<schmancy-button \n\t\t\t\t\t\tvariant=\"outlined\"\n\t\t\t\t\t\t@click=${() => this.selectLayout(layout.id)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<schmancy-icon \n\t\t\t\t\t\t\tslot=\"prefix\"\n\t\t\t\t\t\t\tsize=\"20px\"\n\t\t\t\t\t\t\tclass=${layout.flipped ? 'scale-x-[-1]' : ''}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t${layout.icon}\n\t\t\t\t\t\t</schmancy-icon>\n\t\t\t\t\t\t${layout.label}\n\t\t\t\t\t</schmancy-button>\n\t\t\t\t`)}\n\t\t\t</div>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-email-layout-selector': SchmancyEmailLayoutSelector\n\t}\n}","import { SchmancyElement } from '@mixins/index'\nimport { css, html } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { repeat } from 'lit/directives/repeat.js'\nimport { when } from 'lit/directives/when.js'\nimport { sheet } from '../sheet/sheet.service'\nimport type { EmailTemplate } from './types'\n\n/**\n * Email template picker content component (for use inside sheets)\n * \n * Features:\n * - Grid layout for template preview\n * - Search/filter templates\n * - Category filtering\n * - Inline preview with direct selection\n * - Single-click template selection\n * \n * @example\n * ```typescript\n * // Open as sheet\n * const picker = new SchmancyEmailTemplatePicker()\n * picker.templates = templates\n * picker.addEventListener('template-selected', handleSelection)\n * sheet.open({ component: picker, title: 'Choose Template' })\n * ```\n */\n@customElement('schmancy-email-template-picker')\nexport class SchmancyEmailTemplatePicker extends SchmancyElement {\n\tstatic styles = [css`\n\t:host {\n\t\tdisplay: block;\n\t}\n`]\n\n\t/** Available templates */\n\t@property({ type: Array }) templates: EmailTemplate[] = []\n\t\n\t/** Search query */\n\t@state() private searchQuery = ''\n\t\n\t/** Filtered templates based on search */\n\t@state() private filteredTemplates: EmailTemplate[] = []\n\t\n\t/** Selected category filter */\n\t@state() private selectedCategory = 'all'\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback()\n\t\tthis.updateFilteredTemplates()\n\t}\n\n\tupdated(changed: Map<string, unknown>) {\n\t\tif (changed.has('templates') || changed.has('searchQuery') || changed.has('selectedCategory')) {\n\t\t\tthis.updateFilteredTemplates()\n\t\t}\n\t}\n\n\t/** Get unique categories from templates */\n\tget categories() {\n\t\tconst cats = new Set<string>()\n\t\tthis.templates.forEach(template => {\n\t\t\tif (template.category) {\n\t\t\t\tcats.add(template.category)\n\t\t\t}\n\t\t})\n\t\treturn ['all', ...Array.from(cats)]\n\t}\n\n\t/** Update filtered templates */\n\tprivate updateFilteredTemplates() {\n\t\tlet filtered = [...this.templates]\n\t\t\n\t\t// Filter by category\n\t\tif (this.selectedCategory !== 'all') {\n\t\t\tfiltered = filtered.filter(template => template.category === this.selectedCategory)\n\t\t}\n\t\t\n\t\t// Filter by search query\n\t\tif (this.searchQuery.trim()) {\n\t\t\tconst query = this.searchQuery.toLowerCase()\n\t\t\tfiltered = filtered.filter(template => \n\t\t\t\ttemplate.name.toLowerCase().includes(query) ||\n\t\t\t\ttemplate.category?.toLowerCase().includes(query) ||\n\t\t\t\ttemplate.description?.toLowerCase().includes(query)\n\t\t\t)\n\t\t}\n\t\t\n\t\tthis.filteredTemplates = filtered\n\t}\n\n\t/** Handle search input */\n\tprivate handleSearch = (e: Event) => {\n\t\tconst input = e.target as HTMLInputElement\n\t\tthis.searchQuery = input.value\n\t}\n\n\t/** Handle category selection */\n\tprivate handleCategorySelect = (category: string) => {\n\t\tthis.selectedCategory = category\n\t\tthis.updateFilteredTemplates()\n\t}\n\n\t/** Select template directly */\n\tprivate selectTemplate = (template: EmailTemplate) => {\n\t\tthis.dispatchEvent(new CustomEvent('template-selected', {\n\t\t\tdetail: template,\n\t\t\tbubbles: true,\n\t\t\tcomposed: true\n\t\t}))\n\t\tsheet.dismiss()\n\t}\n\n\t/** Close the picker */\n\tprivate close = () => {\n\t\tsheet.dismiss()\n\t}\n\n\trender() {\n\t\treturn html`\n\t\t\t<div class=\"flex flex-col h-full overflow-hidden\">\n\t\t\t\t<!-- Header -->\n\t\t\t\t<div class=\"flex items-center justify-between px-6 py-4 border-b border-outline-variant\">\n\t\t\t\t\t<div class=\"flex items-center gap-3\">\n\t\t\t\t\t\t<schmancy-icon size=\"24px\" class=\"text-primary\">mail</schmancy-icon>\n\t\t\t\t\t\t<schmancy-typography type=\"headline\" token=\"md\">\n\t\t\t\t\t\t\tChoose Email Template\n\t\t\t\t\t\t</schmancy-typography>\n\t\t\t\t\t</div>\n\t\t\t\t\t<schmancy-button\n\t\t\t\t\t\tvariant=\"text\"\n\t\t\t\t\t\t@click=${this.close}\n\t\t\t\t\t\tclass=\"hover:bg-surface-container rounded-full w-10 h-10 p-0\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<schmancy-icon>close</schmancy-icon>\n\t\t\t\t\t</schmancy-button>\n\t\t\t\t</div>\n\n\t\t\t\t<!-- Body -->\n\t\t\t\t<div class=\"flex-1 flex flex-col overflow-hidden\">\n\t\t\t\t\t${this.renderTemplateList()}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`\n\t}\n\n\t/** Render template list with inline previews */\n\tprivate renderTemplateList() {\n\t\treturn html`\n\t\t\t<!-- Search and Filter Bar -->\n\t\t\t<div class=\"px-6 py-4 border-b border-outline-variant bg-surface-containerLow\">\n\t\t\t\t<div class=\"flex flex-col gap-4\">\n\t\t\t\t\t<!-- Search Input -->\n\t\t\t\t\t<schmancy-input\n\t\t\t\t\t\ttype=\"search\"\n\t\t\t\t\t\tplaceholder=\"Search templates...\"\n\t\t\t\t\t\t.value=${this.searchQuery}\n\t\t\t\t\t\t@input=${this.handleSearch}\n\t\t\t\t\t\tclass=\"w-full\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<schmancy-icon slot=\"prefix\" size=\"20px\" class=\"text-surface-onVariant\">search</schmancy-icon>\n\t\t\t\t\t\t${when(this.searchQuery, () => html`\n\t\t\t\t\t\t\t<schmancy-button\n\t\t\t\t\t\t\t\tslot=\"suffix\"\n\t\t\t\t\t\t\t\tvariant=\"text\"\n\t\t\t\t\t\t\t\t@click=${() => { this.searchQuery = '' }}\n\t\t\t\t\t\t\t\tclass=\"rounded-full w-8 h-8 p-0\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<schmancy-icon size=\"16px\">close</schmancy-icon>\n\t\t\t\t\t\t\t</schmancy-button>\n\t\t\t\t\t\t`)}\n\t\t\t\t\t</schmancy-input>\n\n\t\t\t\t\t<!-- Category Filter -->\n\t\t\t\t\t${when(this.categories.length > 1, () => html`\n\t\t\t\t\t\t<div class=\"flex gap-2 flex-wrap\">\n\t\t\t\t\t\t\t${repeat(\n\t\t\t\t\t\t\t\tthis.categories,\n\t\t\t\t\t\t\t\tcategory => category,\n\t\t\t\t\t\t\t\tcategory => html`\n\t\t\t\t\t\t\t\t\t<schmancy-chip\n\t\t\t\t\t\t\t\t\t\tclass=\"cursor-pointer transition-all hover:shadow-sm ${this.selectedCategory === category ? 'bg-primary text-primary-on' : 'border border-outline'}\"\n\t\t\t\t\t\t\t\t\t\t@click=${() => this.handleCategorySelect(category)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t${category === 'all' ? 'All Templates' : category}\n\t\t\t\t\t\t\t\t\t</schmancy-chip>\n\t\t\t\t\t\t\t\t`\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`)}\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<!-- Template List with Previews -->\n\t\t\t<div class=\"flex-1 overflow-y-auto px-6 py-6\">\n\t\t\t\t${when(\n\t\t\t\t\tthis.filteredTemplates.length > 0,\n\t\t\t\t\t() => html`\n\t\t\t\t\t\t<div class=\"space-y-6\">\n\t\t\t\t\t\t\t${repeat(\n\t\t\t\t\t\t\t\tthis.filteredTemplates,\n\t\t\t\t\t\t\t\ttemplate => template.id,\n\t\t\t\t\t\t\t\ttemplate => html`\n\t\t\t\t\t\t\t\t\t<schmancy-surface\n\t\t\t\t\t\t\t\t\t\ttype=\"subtle\"\n\t\t\t\t\t\t\t\t\t\televation=\"1\"\n\t\t\t\t\t\t\t\t\t\trounded=\"all\"\n\t\t\t\t\t\t\t\t\t\tclass=\"group cursor-pointer hover:elevation-3 transition-all duration-200 overflow-hidden\"\n\t\t\t\t\t\t\t\t\t\t@click=${() => this.selectTemplate(template)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<!-- Template Header -->\n\t\t\t\t\t\t\t\t\t\t<div class=\"p-4 border-b border-outline-variant\">\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"flex items-start justify-between\">\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"flex-1\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<schmancy-typography type=\"title\" token=\"md\" class=\"font-semibold leading-tight mb-1\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t${template.name}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</schmancy-typography>\n\t\t\t\t\t\t\t\t\t\t\t\t\t${when(template.category, () => html`\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<schmancy-chip class=\"text-xs border border-outline\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t${template.category}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</schmancy-chip>\n\t\t\t\t\t\t\t\t\t\t\t\t\t`)}\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t<schmancy-button \n\t\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"filled\" \n\t\t\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"opacity-0 group-hover:opacity-100 transition-opacity\"\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\tUse This\n\t\t\t\t\t\t\t\t\t\t\t\t</schmancy-button>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t<!-- Email Preview -->\n\t\t\t\t\t\t\t\t\t\t<div class=\"p-4 bg-surface\">\n\t\t\t\t\t\t\t\t\t\t\t<schmancy-email-viewer\n\t\t\t\t\t\t\t\t\t\t\t\tsubject=${template.subject}\n\t\t\t\t\t\t\t\t\t\t\t\tbody=${template.body}\n\t\t\t\t\t\t\t\t\t\t\t\tclass=\"max-h-96 overflow-y-auto\"\n\t\t\t\t\t\t\t\t\t\t\t></schmancy-email-viewer>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</schmancy-surface>\n\t\t\t\t\t\t\t\t`\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`,\n\t\t\t\t\t() => html`\n\t\t\t\t\t\t<div class=\"flex flex-col items-center justify-center h-96 text-center\">\n\t\t\t\t\t\t\t<div class=\"mb-6\">\n\t\t\t\t\t\t\t\t<schmancy-icon size=\"64px\" class=\"text-surface-onVariant opacity-20\">mail_outline</schmancy-icon>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<schmancy-typography type=\"headline\" token=\"sm\" class=\"mb-2\">\n\t\t\t\t\t\t\t\t${this.searchQuery || this.selectedCategory !== 'all' ? 'No templates found' : 'No templates available'}\n\t\t\t\t\t\t\t</schmancy-typography>\n\t\t\t\t\t\t\t<schmancy-typography type=\"body\" token=\"md\" class=\"text-surface-onVariant mb-6 max-w-md\">\n\t\t\t\t\t\t\t\t${this.searchQuery \n\t\t\t\t\t\t\t\t\t? `No templates match your search for \"${this.searchQuery}\"`\n\t\t\t\t\t\t\t\t\t: this.selectedCategory !== 'all'\n\t\t\t\t\t\t\t\t\t\t? `No templates found in the \"${this.selectedCategory}\" category`\n\t\t\t\t\t\t\t\t\t\t: 'Start by creating your first email template'\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t</schmancy-typography>\n\t\t\t\t\t\t\t${when(this.searchQuery || this.selectedCategory !== 'all', () => html`\n\t\t\t\t\t\t\t\t<div class=\"flex gap-3\">\n\t\t\t\t\t\t\t\t\t${when(this.searchQuery, () => html`\n\t\t\t\t\t\t\t\t\t\t<schmancy-button\n\t\t\t\t\t\t\t\t\t\t\tvariant=\"outlined\"\n\t\t\t\t\t\t\t\t\t\t\t@click=${() => { this.searchQuery = '' }}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<schmancy-icon slot=\"prefix\">clear</schmancy-icon>\n\t\t\t\t\t\t\t\t\t\t\tClear Search\n\t\t\t\t\t\t\t\t\t\t</schmancy-button>\n\t\t\t\t\t\t\t\t\t`)}\n\t\t\t\t\t\t\t\t\t${when(this.selectedCategory !== 'all', () => html`\n\t\t\t\t\t\t\t\t\t\t<schmancy-button\n\t\t\t\t\t\t\t\t\t\t\tvariant=\"filled\"\n\t\t\t\t\t\t\t\t\t\t\t@click=${() => this.handleCategorySelect('all')}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<schmancy-icon slot=\"prefix\">view_list</schmancy-icon>\n\t\t\t\t\t\t\t\t\t\t\tShow All Templates\n\t\t\t\t\t\t\t\t\t\t</schmancy-button>\n\t\t\t\t\t\t\t\t\t`)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t`)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`\n\t\t\t\t)}\n\t\t\t</div>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-email-template-picker': SchmancyEmailTemplatePicker\n\t}\n}","import { SchmancyElement } from '@mixins/index'\nimport { css, html } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { createRef, ref } from 'lit/directives/ref.js'\nimport { repeat } from 'lit/directives/repeat.js'\nimport { when } from 'lit/directives/when.js'\nimport { fromEvent, takeUntil } from 'rxjs'\nimport { $dialog } from '../dialog'\nimport { $notify } from '../notification'\nimport { sheet } from '../sheet/sheet.service'\nimport './email-layout-selector'\nimport SchmancyTextarea from '../textarea/textarea'\nimport { SchmancyEmailTemplatePicker } from './email-template-picker'\nimport type { EmailAttachment, EmailComposeConfig, EmailTemplate } from './types'\n\n/**\n * Email editor component with rich text formatting and file attachments\n * \n * Features:\n * - Markdown formatting toolbar\n * - Image upload and insertion\n * - File attachments with drag & drop\n * - Layout templates (columns, sidebars, image rows)\n * - Real-time character/word count\n * \n * @example\n * ```html\n * <schmancy-email-editor\n * .subject=\"Welcome to our service\"\n * .body=\"Email content...\"\n * @editor-change=${handleChange}\n * ></schmancy-email-editor>\n * ```\n */\n@customElement('schmancy-email-editor')\nexport class SchmancyEmailEditor extends SchmancyElement {\n\tstatic styles = [css`\n\t:host {\n\t\tdisplay: block;\n\t\theight: 100%;\n\t}\n`]\n\n\t/** Email subject */\n\t@property({ type: String }) subject = ''\n\t\n\t/** Email body content (markdown) */\n\t@property({ type: String }) body = ''\n\t\n\t\n\t/** Disable all interactions */\n\t@property({ type: Boolean }) disabled = false\n\t\n\t/** Email attachments */\n\t@property({ type: Array }) attachments: EmailAttachment[] = []\n\t\n\t/** Configuration for upload handlers */\n\t@property({ type: Object }) config: EmailComposeConfig = {}\n\t\n\t/** Available email templates */\n\t@property({ type: Array }) templates: EmailTemplate[] = this.getDefaultTemplates()\n\n\t/** Internal state */\n\t@state() private dragOver = false\n\t@state() private isUploading = false\n\n\t/** Element references */\n\tprivate subjectInputRef = createRef<HTMLInputElement>()\n\tprivate bodyTextAreaRef = createRef<SchmancyTextarea>()\n\tprivate fileInputRef = createRef<HTMLInputElement>()\n\tprivate imageInputRef = createRef<HTMLInputElement>()\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback()\n\t\tthis.addEventListeners()\n\t}\n\n\tdisconnectedCallback() {\n\t\tsuper.disconnectedCallback()\n\t\t// Event listeners are automatically cleaned up via takeUntil(this.disconnecting)\n\t}\n\n\t/** Get default email templates */\n\tprivate getDefaultTemplates(): EmailTemplate[] {\n\t\treturn [\n\t\t\t{\n\t\t\t\tid: 'welcome',\n\t\t\t\tname: 'Welcome Email',\n\t\t\t\tsubject: 'Welcome to Our Community! 🌟',\n\t\t\t\tdescription: 'A warm welcome message for new users',\n\t\t\t\tcategory: 'onboarding',\n\t\t\t\tbody: `# Welcome to Our Community!\n\nWe're thrilled to have you on board. Thank you for joining us on this journey.\n\n## What's Next?\n\n* **Explore** your dashboard and discover all the features\n* **Connect** with other community members\n* **Get support** whenever you need it - we're here to help\n\n---\n\n*Need assistance? Simply reply to this email and we'll get back to you within 24 hours.*\n\nBest regards, \nThe Team`\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'newsletter',\n\t\t\t\tname: 'Newsletter',\n\t\t\t\tsubject: 'Weekly Insights & Updates',\n\t\t\t\tdescription: 'Regular newsletter template with updates and insights',\n\t\t\t\tcategory: 'communication',\n\t\t\t\tbody: `# This Week's Highlights\n\n## Featured Story\n\n**[Article Title]** \nBrief description of the main story or update that you want to highlight this week.\n\n[Read More](https://example.com)\n\n## Quick Updates\n\n* **Update 1**: Brief description of an important update\n* **Update 2**: Another noteworthy development\n* **Update 3**: Additional news worth sharing\n\n## Upcoming Events\n\n**[Event Name]** - *Date* \nShort description of the upcoming event.\n\n---\n\n*Thanks for reading! Forward this to a friend who might enjoy it.*\n\nUntil next week, \nThe Team`\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'product-launch',\n\t\t\t\tname: 'Product Launch',\n\t\t\t\tsubject: 'Introducing Our Latest Innovation 🚀',\n\t\t\t\tdescription: 'Announce new products or features',\n\t\t\t\tcategory: 'marketing',\n\t\t\t\tbody: `# Something Amazing is Here\n\nWe've been working hard behind the scenes, and today we're excited to introduce our latest creation.\n\n## Key Features\n\n* **Feature 1**: Benefit that matters to your users\n* **Feature 2**: Another compelling capability\n* **Feature 3**: The feature that sets you apart\n\n## Early Access\n\nAs a valued member, you get **exclusive early access** starting today.\n\n[Get Started Now](https://example.com)\n\n---\n\n*Questions? We'd love to hear from you. Just hit reply!*\n\nBest, \nThe Product Team`\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'event-invitation',\n\t\t\t\tname: 'Event Invitation',\n\t\t\t\tsubject: 'You\\'re Invited: [Event Name]',\n\t\t\t\tdescription: 'Professional event invitation template',\n\t\t\t\tcategory: 'events',\n\t\t\t\tbody: `# You're Invited!\n\n## [Event Name]\n\n**When**: [Date & Time] \n**Where**: [Location or Virtual Link] \n**Duration**: [Duration]\n\nJoin us for an exclusive gathering where we'll explore [brief event description].\n\n## What to Expect\n\n* **Networking** with industry professionals\n* **Insights** from leading experts\n* **Interactive** sessions and discussions\n\n## RSVP Required\n\nSpace is limited, so please confirm your attendance by [RSVP Date].\n\n[Confirm Attendance](https://example.com)\n\n---\n\n*Can't make it? Let us know and we'll share the key highlights with you.*\n\nLooking forward to seeing you there, \nThe Events Team`\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'thank-you',\n\t\t\t\tname: 'Thank You',\n\t\t\t\tsubject: 'Thank You - It Means Everything',\n\t\t\t\tdescription: 'Express gratitude to customers or supporters',\n\t\t\t\tcategory: 'appreciation',\n\t\t\t\tbody: `# Thank You\n\nYour support means the world to us.\n\nWhether you've been with us from the beginning or just joined our community, we want you to know how much we appreciate you.\n\n## Because of You\n\n* We've been able to improve our service\n* Our community has grown stronger\n* We've achieved milestones we never thought possible\n\n## What's Next\n\nWe're committed to continuing to earn your trust and providing even more value in the coming months.\n\n---\n\n*Your feedback shapes everything we do. Reply anytime with thoughts or suggestions.*\n\nWith genuine gratitude, \nThe Team`\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'feedback-request',\n\t\t\t\tname: 'Feedback Request',\n\t\t\t\tsubject: 'Your Opinion Matters - 2 Minutes?',\n\t\t\t\tdescription: 'Request feedback or reviews from users',\n\t\t\t\tcategory: 'feedback',\n\t\t\t\tbody: `# We'd Love Your Feedback\n\nYour experience matters to us, and we're always looking for ways to improve.\n\n## Quick Favor?\n\nCould you spare **2 minutes** to share your thoughts? Your honest feedback helps us serve you better.\n\n[Share Your Feedback](https://example.com)\n\n## What We're Asking\n\n* How has your experience been so far?\n* What's working well for you?\n* What could we improve?\n\n## Thank You Gift\n\nAs a small token of appreciation, everyone who completes our feedback form receives [incentive].\n\n---\n\n*Every response is read personally by our team. We take your input seriously.*\n\nThanks in advance, \nThe Team`\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'password-reset',\n\t\t\t\tname: 'Password Reset',\n\t\t\t\tsubject: 'Reset Your Password - Action Required',\n\t\t\t\tdescription: 'Secure password reset instructions',\n\t\t\t\tcategory: 'security',\n\t\t\t\tbody: `# Password Reset Request\n\nWe received a request to reset the password for your account.\n\n## Reset Your Password\n\nClick the button below to create a new password. This link will expire in **24 hours** for your security.\n\n[Reset Password](https://example.com/reset)\n\n## Didn't Request This?\n\nIf you didn't request a password reset, please ignore this email. Your account remains secure.\n\n## Need Help?\n\nIf you're having trouble with the reset process, contact our support team and we'll assist you right away.\n\n---\n\n*For security reasons, this link can only be used once and expires in 24 hours.*\n\nBest regards, \nSecurity Team`\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'order-confirmation',\n\t\t\t\tname: 'Order Confirmation',\n\t\t\t\tsubject: 'Order Confirmed - #[ORDER-NUMBER]',\n\t\t\t\tdescription: 'Professional order confirmation template',\n\t\t\t\tcategory: 'commerce',\n\t\t\t\tbody: `# Order Confirmation\n\nThanks for your order! We've received your payment and are preparing your items for shipment.\n\n## Order Details\n\n**Order Number**: #[ORDER-NUMBER] \n**Order Date**: [DATE] \n**Total**: $[AMOUNT]\n\n## Items Ordered\n\n* **[Item 1]** - Quantity: [QTY] - $[PRICE]\n* **[Item 2]** - Quantity: [QTY] - $[PRICE]\n\n## Shipping Information\n\n**Address**: [SHIPPING ADDRESS] \n**Method**: [SHIPPING METHOD] \n**Estimated Delivery**: [DELIVERY DATE]\n\n## Next Steps\n\nYou'll receive a tracking number via email once your order ships (usually within 1-2 business days).\n\n[Track Your Order](https://example.com/track)\n\n---\n\n*Questions about your order? Reply to this email or contact our support team.*\n\nThank you for your business, \nThe Fulfillment Team`\n\t\t\t}\n\t\t]\n\t}\n\n\tprivate addEventListeners() {\n\t\t// Keyboard events\n\t\tfromEvent(this, 'keydown').pipe(\n\t\t\ttakeUntil(this.disconnecting)\n\t\t).subscribe(this.handleKeyDown)\n\n\t\t// Document paste events\n\t\tfromEvent(document, 'paste').pipe(\n\t\t\ttakeUntil(this.disconnecting)\n\t\t).subscribe(this.handlePaste)\n\n\t\t// Document drag events\n\t\tfromEvent(document, 'dragenter').pipe(\n\t\t\ttakeUntil(this.disconnecting)\n\t\t).subscribe(this.handleDragEnter)\n\n\t\tfromEvent(document, 'dragleave').pipe(\n\t\t\ttakeUntil(this.disconnecting)\n\t\t).subscribe(this.handleDocumentDragLeave)\n\n\t\tfromEvent(document, 'drop').pipe(\n\t\t\ttakeUntil(this.disconnecting)\n\t\t).subscribe(this.handleDocumentDrop)\n\t}\n\n\t/** Handle keyboard shortcuts and tab indentation */\n\tprivate handleKeyDown = (e: KeyboardEvent) => {\n\t\tif (this.disabled) return\n\n\t\t// Tab key inserts 2 spaces instead of changing focus\n\t\tconst textarea = this.bodyTextAreaRef.value?.shadowRoot?.querySelector('textarea')\n\t\tif (e.key === 'Tab' && e.target === textarea) {\n\t\t\te.preventDefault()\n\t\t\tthis.insertAtCursor(' ')\n\t\t}\n\t}\n\n\t/** Handle paste events for image pasting */\n\tprivate handlePaste = (event: ClipboardEvent) => {\n\t\tconst textarea = this.bodyTextAreaRef.value?.shadowRoot?.querySelector('textarea')\n\t\tif (this.disabled || document.activeElement !== textarea) return\n\n\t\tconst items = event.clipboardData?.items\n\t\tif (!items) return\n\n\t\tfor (let i = 0; i < items.length; i++) {\n\t\t\tconst item = items[i]\n\t\t\tif (item.type.indexOf('image') !== -1) {\n\t\t\t\tevent.preventDefault()\n\t\t\t\tconst file = item.getAsFile()\n\t\t\t\tif (file) {\n\t\t\t\t\tthis.uploadImage(file)\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Handle subject input changes */\n\tprivate handleSubjectChange = (event: Event) => {\n\t\tconst input = event.target as HTMLInputElement\n\t\tthis.subject = input.value\n\t\tthis.dispatchChange()\n\t}\n\n\t/** Handle body textarea changes */\n\tprivate handleBodyChange = (event: CustomEvent<{ value: string }>) => {\n\t\tthis.body = event.detail.value\n\t\tthis.dispatchChange()\n\t}\n\n\t/** Dispatch composer change event */\n\tprivate dispatchChange = () => {\n\t\tthis.dispatchEvent(new CustomEvent('editor-change', {\n\t\t\tdetail: {\n\t\t\t\tsubject: this.subject,\n\t\t\t\tbody: this.body,\n\t\t\t\tattachments: this.attachments\n\t\t\t},\n\t\t\tbubbles: true,\n\t\t\tcomposed: true\n\t\t}))\n\t}\n\n\t/** Insert text at cursor position */\n\tprivate insertAtCursor(text: string, selectText?: string) {\n\t\tif (!this.bodyTextAreaRef.value) return\n\n\t\t// For schmancy-textarea, access the internal textarea\n\t\tconst textarea = this.bodyTextAreaRef.value.shadowRoot?.querySelector('textarea')\n\t\tif (!textarea) return\n\n\t\tconst start = textarea.selectionStart\n\t\tconst end = textarea.selectionEnd\n\t\t\n\t\tconst newValue = \n\t\t\ttextarea.value.substring(0, start) +\n\t\t\ttext +\n\t\t\ttextarea.value.substring(end)\n\t\t\n\t\tthis.body = newValue\n\t\tthis.dispatchChange()\n\t\t\n\t\tthis.updateComplete.then(() => {\n\t\t\tconst updatedTextarea = this.bodyTextAreaRef.value?.shadowRoot?.querySelector('textarea')\n\t\t\tif (updatedTextarea) {\n\t\t\t\tupdatedTextarea.focus()\n\t\t\t\tif (selectText) {\n\t\t\t\t\tconst selectStart = start + text.indexOf(selectText)\n\t\t\t\t\tconst selectEnd = selectStart + selectText.length\n\t\t\t\t\tupdatedTextarea.setSelectionRange(selectStart, selectEnd)\n\t\t\t\t} else {\n\t\t\t\t\tupdatedTextarea.setSelectionRange(start + text.length, start + text.length)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn\n\t\t})\n\t}\n\n\t/** Wrap selected text with formatting */\n\tprivate wrapSelection(before: string, after: string, placeholder: string) {\n\t\tif (!this.bodyTextAreaRef.value) return\n\n\t\t// For schmancy-textarea, access the internal textarea\n\t\tconst textarea = this.bodyTextAreaRef.value.shadowRoot?.querySelector('textarea')\n\t\tif (!textarea) return\n\n\t\tconst start = textarea.selectionStart\n\t\tconst end = textarea.selectionEnd\n\t\tconst selectedText = textarea.value.substring(start, end)\n\t\t\n\t\tconst textToWrap = selectedText || placeholder\n\t\tconst newText = before + textToWrap + after\n\t\t\n\t\tconst newValue = \n\t\t\ttextarea.value.substring(0, start) +\n\t\t\tnewText +\n\t\t\ttextarea.value.substring(end)\n\t\t\n\t\tthis.body = newValue\n\t\tthis.dispatchChange()\n\t\t\n\t\tthis.updateComplete.then(() => {\n\t\t\tconst updatedTextarea = this.bodyTextAreaRef.value?.shadowRoot?.querySelector('textarea')\n\t\t\tif (updatedTextarea) {\n\t\t\t\tupdatedTextarea.focus()\n\t\t\t\tif (!selectedText) {\n\t\t\t\t\t// Select the placeholder text\n\t\t\t\t\tupdatedTextarea.setSelectionRange(start + before.length, start + before.length + placeholder.length)\n\t\t\t\t} else {\n\t\t\t\t\t// Position cursor at the end\n\t\t\t\t\tupdatedTextarea.setSelectionRange(start + newText.length, start + newText.length)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn\n\t\t})\n\t}\n\n\t/** Open layout selection dialog */\n\tprivate openLayoutDialog = () => {\n\t\t$dialog.component(html`\n\t\t\t<schmancy-email-layout-selector\n\t\t\t\t@layout-select=${(e: CustomEvent) => {\n\t\t\t\t\tthis.applyLayout(e.detail.layout)\n\t\t\t\t\t$dialog.close()\n\t\t\t\t}}\n\t\t\t></schmancy-email-layout-selector>\n\t\t`)\n\t}\n\n\t/** Open template picker */\n\tprivate openTemplatePicker = () => {\n\t\tconst picker = new SchmancyEmailTemplatePicker()\n\t\tpicker.templates = this.templates\n\n\t\t// Listen for template selection using RxJS\n\t\tfromEvent(picker, 'template-selected').pipe(\n\t\t\ttakeUntil(this.disconnecting)\n\t\t).subscribe(this.handleTemplateSelected)\n\t\t\n\t\tsheet.open({\n\t\t\tcomponent: picker\n\t\t})\n\t}\n\n\t/** Handle template selection */\n\tprivate handleTemplateSelected = (e: CustomEvent) => {\n\t\tconst template: EmailTemplate = e.detail\n\t\tthis.subject = template.subject\n\t\tthis.body = template.body\n\t\tthis.dispatchChange()\n\t\t$notify.success(`Template \"${template.name}\" applied successfully`)\n\t}\n\n\t/** Apply layout template to content */\n\tprivate applyLayout = (layoutType: string) => {\n\t\tconst layouts: Record<string, string> = {\n\t\t\t'columns-2': `\n:::layout columns-2\n<div class=\"column\">\n![Left Photo](https://via.placeholder.com/400x300?text=Replace+with+your+photo){height=300px}\n\n**Photo Title**\n\nReplace the placeholder image above with your own photo. The height=300px ensures both images have equal height while width adjusts automatically.\n</div>\n\n<div class=\"column\">\n![Right Photo](https://via.placeholder.com/400x300?text=Replace+with+your+photo){height=300px}\n\n**Photo Title**\n\nUse the same height value (300px) for both images to keep them aligned perfectly side by side.\n</div>\n:::\n`,\n\t\t\t'columns-3': `\n:::layout columns-3\n<div class=\"column\">\n![Photo 1](https://via.placeholder.com/300x200?text=Photo+1){height=200px}\n\n**Item Title**\n\nBrief description or caption for this item.\n</div>\n\n<div class=\"column\">\n![Photo 2](https://via.placeholder.com/300x200?text=Photo+2){height=200px}\n\n**Item Title**\n\nBrief description or caption for this item.\n</div>\n\n<div class=\"column\">\n![Photo 3](https://via.placeholder.com/300x200?text=Photo+3){height=200px}\n\n**Item Title**\n\nBrief description or caption for this item.\n</div>\n:::\n`,\n\t\t\t'sidebar-left': `\n:::layout sidebar-left\n<div class=\"sidebar\">\n**Sidebar Content**\n\n* Navigation item 1\n* Navigation item 2\n* Navigation item 3\n</div>\n\n<div class=\"main\">\n**Main Content Area**\n\nYour primary content goes here. This area takes up most of the width while the sidebar provides supplementary information or navigation.\n</div>\n:::\n`,\n\t\t\t'sidebar-right': `\n:::layout sidebar-right\n<div class=\"main\">\n**Main Content Area**\n\nYour primary content goes here. This area takes up most of the width while the sidebar provides supplementary information or navigation.\n</div>\n\n<div class=\"sidebar\">\n**Sidebar Content**\n\n* Quick links\n* Related info\n* Contact details\n</div>\n:::\n`,\n\t\t\t'image-row': `\n:::layout image-row\n<div class=\"image\">\n![Gallery Image 1](https://via.placeholder.com/400x250?text=Gallery+Image+1){height=250px}\n</div>\n\n<div class=\"image\">\n![Gallery Image 2](https://via.placeholder.com/400x250?text=Gallery+Image+2){height=250px}\n</div>\n\n<div class=\"image\">\n![Gallery Image 3](https://via.placeholder.com/400x250?text=Gallery+Image+3){height=250px}\n</div>\n:::\n`\n\t\t}\n\n\t\tconst layoutMarkdown = layouts[layoutType]\n\t\tif (layoutMarkdown) {\n\t\t\tthis.insertAtCursor(layoutMarkdown)\n\t\t}\n\t}\n\n\t/** Upload image with configurable handler */\n\tprivate uploadImage = async (file: File) => {\n\t\tif (!file.type.startsWith('image/')) {\n\t\t\t$notify.error(`File \"${file.name}\" is not an image`)\n\t\t\treturn\n\t\t}\n\n\t\t// Check file size (max 10MB for images)\n\t\tconst maxSize = 10 * 1024 * 1024\n\t\tif (file.size > maxSize) {\n\t\t\t$notify.error(`Image \"${file.name}\" is too large. Maximum size is 10MB.`)\n\t\t\treturn\n\t\t}\n\n\t\t// Show loading state\n\t\tthis.isUploading = true\n\n\t\ttry {\n\t\t\tlet url: string\n\n\t\t\tif (this.config.imageUploadHandler) {\n\t\t\t\t// Use custom upload handler\n\t\t\t\turl = await this.config.imageUploadHandler(file)\n\t\t\t} else if (this.config.uploadHandler) {\n\t\t\t\t// Use generic upload handler\n\t\t\t\turl = await this.config.uploadHandler(file)\n\t\t\t} else {\n\t\t\t\t// Fallback to data URL for preview\n\t\t\t\turl = await this.createDataUrl(file)\n\t\t\t\t$notify.warning('No upload handler configured. Using local preview.')\n\t\t\t}\n\n\t\t\t// Get image dimensions\n\t\t\tconst dimensions = await this.getImageDimensions(file)\n\n\t\t\t// Insert markdown at cursor position\n\t\t\tthis.insertImageMarkdown(url, file.name, dimensions.width, dimensions.height)\n\n\t\t\t$notify.success('Image uploaded successfully')\n\t\t} catch (error) {\n\t\t\tconsole.error('Upload failed:', error)\n\t\t\t$notify.error('Failed to upload image')\n\t\t} finally {\n\t\t\tthis.isUploading = false\n\t\t}\n\t}\n\n\t/** Create data URL for local preview */\n\tprivate createDataUrl = (file: File): Promise<string> => {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst reader = new FileReader()\n\t\t\treader.addEventListener('load', () => resolve(reader.result as string), { once: true })\n\t\t\treader.addEventListener('error', () => reject(reader.error), { once: true })\n\t\t\treader.readAsDataURL(file)\n\t\t})\n\t}\n\n\t/** Get image dimensions */\n\tprivate getImageDimensions = (file: File): Promise<{width: number, height: number}> => {\n\t\treturn new Promise((resolve) => {\n\t\t\tconst img = new Image()\n\t\t\timg.addEventListener('load', () => {\n\t\t\t\tresolve({ width: img.width, height: img.height })\n\t\t\t\tURL.revokeObjectURL(img.src)\n\t\t\t}, { once: true })\n\t\t\timg.addEventListener('error', () => {\n\t\t\t\tresolve({ width: 400, height: 300 }) // Default dimensions\n\t\t\t\tURL.revokeObjectURL(img.src)\n\t\t\t}, { once: true })\n\t\t\timg.src = URL.createObjectURL(file)\n\t\t})\n\t}\n\n\t/** Insert image markdown at cursor */\n\tprivate insertImageMarkdown = (url: string, alt: string, width: number, _height: number) => {\n\t\tconst textarea = this.bodyTextAreaRef.value?.shadowRoot?.querySelector('textarea')\n\t\tif (!textarea) return\n\n\t\tconst markdown = `![${alt}](${url}){width=${Math.min(width, 600)}px height=auto}`\n\n\t\tconst start = textarea.selectionStart\n\t\tconst end = textarea.selectionEnd\n\t\tconst newValue = \n\t\t\tthis.body.substring(0, start) +\n\t\t\tmarkdown +\n\t\t\tthis.body.substring(end)\n\n\t\tthis.body = newValue\n\t\tthis.dispatchChange()\n\n\t\t// Set cursor after inserted markdown\n\t\tthis.updateComplete.then(() => {\n\t\t\tconst updatedTextarea = this.bodyTextAreaRef.value?.shadowRoot?.querySelector('textarea')\n\t\t\tif (updatedTextarea) {\n\t\t\t\tconst newPosition = start + markdown.length\n\t\t\t\tupdatedTextarea.setSelectionRange(newPosition, newPosition)\n\t\t\t\tupdatedTextarea.focus()\n\t\t\t}\n\t\t\treturn\n\t\t})\n\t}\n\n\n\t/** Handle file input changes */\n\tprivate handleFileChange = (event: Event) => {\n\t\tconst input = event.target as HTMLInputElement\n\t\tconst files = input.files\n\t\tif (files) {\n\t\t\tfor (let i = 0; i < files.length; i++) {\n\t\t\t\tconst file = files[i]\n\t\t\t\tif (file.type.startsWith('image/')) {\n\t\t\t\t\tthis.uploadImage(file)\n\t\t\t\t} else {\n\t\t\t\t\tthis.addFile(file)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tinput.value = ''\n\t}\n\n\t/** Handle image selection */\n\tprivate handleImageSelect = (event: Event) => {\n\t\tconst input = event.target as HTMLInputElement\n\t\tconst file = input.files?.[0]\n\t\tif (file && file.type.startsWith('image/')) {\n\t\t\tthis.uploadImage(file)\n\t\t}\n\t\tinput.value = '' // Reset for next selection\n\t}\n\n\t/** Drag and drop handlers */\n\tprivate handleDrop = (event: DragEvent) => {\n\t\tevent.preventDefault()\n\t\tthis.dragOver = false\n\n\t\tconst files = event.dataTransfer?.files\n\t\tif (files) {\n\t\t\tfor (let i = 0; i < files.length; i++) {\n\t\t\t\tconst file = files[i]\n\t\t\t\tif (file.type.startsWith('image/')) {\n\t\t\t\t\tthis.uploadImage(file)\n\t\t\t\t} else {\n\t\t\t\t\tthis.addFile(file)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate handleDragEnter = (event: DragEvent) => {\n\t\tevent.preventDefault()\n\t\tthis.dragOver = true\n\t}\n\n\tprivate handleDocumentDragLeave = (event: DragEvent) => {\n\t\tevent.preventDefault()\n\t\tthis.dragOver = false\n\t}\n\n\tprivate handleDocumentDrop = (event: DragEvent) => {\n\t\tevent.preventDefault()\n\t\tthis.dragOver = false\n\t}\n\n\tprivate handleDragOver = (event: DragEvent) => {\n\t\tevent.preventDefault()\n\t}\n\n\tprivate handleDragLeave = (event: DragEvent) => {\n\t\tevent.preventDefault()\n\t\t// Let document handler manage this\n\t}\n\n\t/** Add file as attachment */\n\tprivate addFile = (file: File) => {\n\t\t// Check file size (max 10MB)\n\t\tconst maxSize = 10 * 1024 * 1024\n\t\tif (file.size > maxSize) {\n\t\t\t$notify.error(`File \"${file.name}\" is too large. Maximum size is 10MB.`)\n\t\t\treturn\n\t\t}\n\n\t\t// Check if file already exists\n\t\tconst exists = this.attachments.some(att => \n\t\t\tatt.name === file.name && att.size === file.size\n\t\t)\n\t\tif (exists) {\n\t\t\t$notify.warning(`File \"${file.name}\" is already attached.`)\n\t\t\treturn\n\t\t}\n\n\t\tconst attachment: EmailAttachment = {\n\t\t\tid: crypto.randomUUID(),\n\t\t\tfile,\n\t\t\tname: file.name,\n\t\t\tsize: file.size,\n\t\t\ttype: file.type || 'application/octet-stream'\n\t\t}\n\n\t\tthis.attachments = [...this.attachments, attachment]\n\t\tthis.dispatchChange()\n\t}\n\n\t/** Remove attachment */\n\tprivate removeAttachment = (attachmentId: string) => {\n\t\tthis.attachments = this.attachments.filter(att => att.id !== attachmentId)\n\t\tthis.dispatchChange()\n\t}\n\n\n\trender() {\n\t\treturn html`\n\t\t\t<schmancy-surface \n\t\t\t\ttype=\"solid\"\n\t\t\t\trounded=\"all\"\n\t\t\t\tclass=${this.classMap({\n\t\t\t\t\t'border-2 border-dashed border-primary': this.dragOver,\n\t\t\t\t\t'h-full flex flex-col': true\n\t\t\t\t})}\n\t\t\t\t@drop=${this.handleDrop}\n\t\t\t\t@dragover=${this.handleDragOver}\n\t\t\t\t@dragleave=${this.handleDragLeave}\n\t\t\t>\n\t\t\t\t<div class=\"flex flex-col h-full gap-4\">\n\n\t\t\t\t\t<!-- Header Section with Subject -->\n\t\t\t\t\t<div class=\"shrink-0 p-4 pb-0 space-y-4\">\n\t\t\t\t\t\t<!-- Subject Field -->\n\t\t\t\t\t\t<div class=\"space-y-2\">\n\t\t\t\t\t\t\t<schmancy-typography type=\"label\" token=\"md\">\n\t\t\t\t\t\t\t\tSubject *\n\t\t\t\t\t\t\t</schmancy-typography>\n\t\t\t\t\t\t\t<schmancy-input\n\t\t\t\t\t\t\t\t${ref(this.subjectInputRef)}\n\t\t\t\t\t\t\t\t.value=${this.subject}\n\t\t\t\t\t\t\t\t@input=${this.handleSubjectChange}\n\t\t\t\t\t\t\t\tplaceholder=\"Enter email subject...\"\n\t\t\t\t\t\t\t\t.disabled=${this.disabled}\n\t\t\t\t\t\t\t\tclass=\"w-full\"\n\t\t\t\t\t\t\t></schmancy-input>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<!-- Formatting Toolbar -->\n\t\t\t\t\t<div class=\"shrink-0 px-4\">\n\t\t\t\t\t\t<schmancy-surface type=\"subtle\" rounded=\"all\" class=\"p-3\">\n\t\t\t\t\t\t\t<div class=\"flex flex-wrap gap-2 items-center\">\n\t\t\t\t\t\t\t\t<!-- Text Formatting Group -->\n\t\t\t\t\t\t\t\t<div class=\"flex gap-1\">\n\t\t\t\t\t\t\t\t\t<schmancy-icon-button \n\t\t\t\t\t\t\t\t\t\tsize=\"sm\" \n\t\t\t\t\t\t\t\t\t\tvariant=\"text\" \n\t\t\t\t\t\t\t\t\t\ttitle=\"Bold\" \n\t\t\t\t\t\t\t\t\t\t?disabled=${this.disabled}\n\t\t\t\t\t\t\t\t\t\t@click=${() => this.wrapSelection('**', '**', 'bold text')}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<schmancy-icon>format_bold</schmancy-icon>\n\t\t\t\t\t\t\t\t\t</schmancy-icon-button>\n\t\t\t\t\t\t\t\t\t<schmancy-icon-button \n\t\t\t\t\t\t\t\t\t\tsize=\"sm\" \n\t\t\t\t\t\t\t\t\t\tvariant=\"text\" \n\t\t\t\t\t\t\t\t\t\ttitle=\"Italic\" \n\t\t\t\t\t\t\t\t\t\t?disabled=${this.disabled}\n\t\t\t\t\t\t\t\t\t\t@click=${() => this.wrapSelection('*', '*', 'italic text')}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<schmancy-icon>format_italic</schmancy-icon>\n\t\t\t\t\t\t\t\t\t</schmancy-icon-button>\n\t\t\t\t\t\t\t\t\t<schmancy-icon-button \n\t\t\t\t\t\t\t\t\t\tsize=\"sm\" \n\t\t\t\t\t\t\t\t\t\tvariant=\"text\" \n\t\t\t\t\t\t\t\t\t\ttitle=\"Link\" \n\t\t\t\t\t\t\t\t\t\t?disabled=${this.disabled}\n\t\t\t\t\t\t\t\t\t\t@click=${() => this.insertAtCursor('[link text](https://example.com)', 'link text')}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<schmancy-icon>link</schmancy-icon>\n\t\t\t\t\t\t\t\t\t</schmancy-icon-button>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t<!-- Divider -->\n\t\t\t\t\t\t\t\t<div class=\"h-6 w-px bg-outline-variant\"></div>\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t<!-- Structure Formatting Group -->\n\t\t\t\t\t\t\t\t<div class=\"flex gap-1\">\n\t\t\t\t\t\t\t\t\t<schmancy-icon-button \n\t\t\t\t\t\t\t\t\t\tsize=\"sm\" \n\t\t\t\t\t\t\t\t\t\tvariant=\"text\" \n\t\t\t\t\t\t\t\t\t\ttitle=\"Heading\" \n\t\t\t\t\t\t\t\t\t\t?disabled=${this.disabled}\n\t\t\t\t\t\t\t\t\t\t@click=${() => this.insertAtCursor('\\n# Heading\\n', 'Heading')}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<schmancy-icon>title</schmancy-icon>\n\t\t\t\t\t\t\t\t\t</schmancy-icon-button>\n\t\t\t\t\t\t\t\t\t<schmancy-icon-button \n\t\t\t\t\t\t\t\t\t\tsize=\"sm\" \n\t\t\t\t\t\t\t\t\t\tvariant=\"text\" \n\t\t\t\t\t\t\t\t\t\ttitle=\"Bullet List\" \n\t\t\t\t\t\t\t\t\t\t?disabled=${this.disabled}\n\t\t\t\t\t\t\t\t\t\t@click=${() => this.insertAtCursor('\\n* List item\\n', 'List item')}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<schmancy-icon>format_list_bulleted</schmancy-icon>\n\t\t\t\t\t\t\t\t\t</schmancy-icon-button>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t<!-- Divider -->\n\t\t\t\t\t\t\t\t<div class=\"h-6 w-px bg-outline-variant\"></div>\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t<!-- Media and Layout Group -->\n\t\t\t\t\t\t\t\t<div class=\"flex gap-1\">\n\t\t\t\t\t\t\t\t\t<schmancy-icon-button \n\t\t\t\t\t\t\t\t\t\tsize=\"sm\" \n\t\t\t\t\t\t\t\t\t\tvariant=\"text\" \n\t\t\t\t\t\t\t\t\t\ttitle=\"Insert Image\" \n\t\t\t\t\t\t\t\t\t\t?disabled=${this.disabled || this.isUploading}\n\t\t\t\t\t\t\t\t\t\t@click=${() => this.imageInputRef.value?.click()}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t${when(this.isUploading, \n\t\t\t\t\t\t\t\t\t\t\t() => html`<schmancy-progress size=\"sm\" class=\"w-4 h-4\"></schmancy-progress>`,\n\t\t\t\t\t\t\t\t\t\t\t() => html`<schmancy-icon>image</schmancy-icon>`\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</schmancy-icon-button>\n\t\t\t\t\t\t\t\t\t<schmancy-icon-button \n\t\t\t\t\t\t\t\t\t\tsize=\"sm\" \n\t\t\t\t\t\t\t\t\t\tvariant=\"text\" \n\t\t\t\t\t\t\t\t\t\ttitle=\"Insert Layout\" \n\t\t\t\t\t\t\t\t\t\t?disabled=${this.disabled}\n\t\t\t\t\t\t\t\t\t\t@click=${this.openLayoutDialog}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<schmancy-icon>mobile_layout</schmancy-icon>\n\t\t\t\t\t\t\t\t\t</schmancy-icon-button>\n\t\t\t\t\t\t\t\t\t<schmancy-icon-button \n\t\t\t\t\t\t\t\t\t\tsize=\"sm\" \n\t\t\t\t\t\t\t\t\t\tvariant=\"text\" \n\t\t\t\t\t\t\t\t\t\ttitle=\"Use Template\" \n\t\t\t\t\t\t\t\t\t\t?disabled=${this.disabled || this.templates.length === 0}\n\t\t\t\t\t\t\t\t\t\t@click=${this.openTemplatePicker}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<schmancy-icon>description</schmancy-icon>\n\t\t\t\t\t\t\t\t\t</schmancy-icon-button>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</schmancy-surface>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<!-- Textarea Container - Takes remaining space -->\n\t\t\t\t\t<div class=\"flex-1 px-4 relative min-h-0\">\n\t\t\t\t\t\t<schmancy-textarea\n\t\t\t\t\t\t\t${ref(this.bodyTextAreaRef)}\n\t\t\t\t\t\t\t.value=${this.body}\n\t\t\t\t\t\t\t@change=${this.handleBodyChange}\n\t\t\t\t\t\t\tplaceholder=\"Enter your email message here...\n\nUse the toolbar buttons above for formatting, or type markdown directly:\n**bold**, *italic*, [link](url), ![image](url)\n\nDrag & drop images or press Ctrl+V to paste from clipboard.\nTab key inserts 2 spaces for better formatting.\"\n\t\t\t\t\t\t\t.disabled=${this.disabled}\n\t\t\t\t\t\t\t.required=${true}\n\t\t\t\t\t\t\t.rows=${4}\n\t\t\t\t\t\t\tclass=\"w-full font-mono text-sm\"\n\t\t\t\t\t\t></schmancy-textarea>\n\t\t\t\t\t\t\n\t\t\t\t\t\t<!-- Upload Progress Overlay -->\n\t\t\t\t\t\t${when(this.isUploading, () => html`\n\t\t\t\t\t\t\t<div class=\"absolute top-3 right-3 z-10\">\n\t\t\t\t\t\t\t\t<schmancy-surface type=\"subtle\" rounded=\"all\" class=\"p-2\">\n\t\t\t\t\t\t\t\t\t<div class=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t\t<schmancy-progress size=\"sm\" class=\"w-4 h-4\"></schmancy-progress>\n\t\t\t\t\t\t\t\t\t\t<schmancy-typography type=\"body\" token=\"xs\">Uploading...</schmancy-typography>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</schmancy-surface>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t`)}\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<!-- Footer Section -->\n\t\t\t\t\t<div class=\"shrink-0 p-4 pt-0 space-y-2\">\n\t\t\t\t\t\t<!-- Character/Word Counter -->\n\t\t\t\t\t\t<div class=\"text-center\">\n\t\t\t\t\t\t\t<schmancy-typography type=\"body\" token=\"xs\">\n\t\t\t\t\t\t\t\t${this.body.length} characters • ${this.body.trim() ? this.body.trim().split(/\\s+/).length : 0} words\n\t\t\t\t\t\t\t</schmancy-typography>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<!-- Attachments Display (if any) -->\n\t\t\t\t\t\t${when(this.attachments.length > 0, () => html`\n\t\t\t\t\t\t\t<div class=\"space-y-2\">\n\t\t\t\t\t\t\t\t<schmancy-typography type=\"label\" token=\"sm\" class=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t<schmancy-icon size=\"16px\">attach_file</schmancy-icon>\n\t\t\t\t\t\t\t\t\tAttachments (${this.attachments.length})\n\t\t\t\t\t\t\t\t</schmancy-typography>\n\t\t\t\t\t\t\t\t<div class=\"flex flex-wrap gap-2\">\n\t\t\t\t\t\t\t\t\t${repeat(this.attachments, att => att.id, (attachment) => html`\n\t\t\t\t\t\t\t\t\t\t<schmancy-chip class=\"text-xs\">\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"truncate max-w-32\">${attachment.name}</span>\n\t\t\t\t\t\t\t\t\t\t\t<button \n\t\t\t\t\t\t\t\t\t\t\t\t@click=${() => this.removeAttachment(attachment.id)}\n\t\t\t\t\t\t\t\t\t\t\t\tclass=\"ml-2 text-error hover:text-error-container\"\n\t\t\t\t\t\t\t\t\t\t\t\ttitle=\"Remove attachment\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<schmancy-icon size=\"14px\">close</schmancy-icon>\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t</schmancy-chip>\n\t\t\t\t\t\t\t\t\t`)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t`)}\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<!-- Hidden File Inputs -->\n\t\t\t\t\t<div class=\"hidden\">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t${ref(this.fileInputRef)}\n\t\t\t\t\t\t\ttype=\"file\"\n\t\t\t\t\t\t\tmultiple\n\t\t\t\t\t\t\t@change=${this.handleFileChange}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t${ref(this.imageInputRef)}\n\t\t\t\t\t\t\ttype=\"file\"\n\t\t\t\t\t\t\taccept=\"image/*\"\n\t\t\t\t\t\t\t@change=${this.handleImageSelect}\n\t\t\t\t\t\t>\n\t\t\t\t\t</div>\n\n\t\t\t\t</div>\n\t\t\t</schmancy-surface>\n\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-email-editor': SchmancyEmailEditor\n\t}\n}\n","import { SchmancyElement } from '@mixins/index'\nimport { css, html } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { repeat } from 'lit/directives/repeat.js'\nimport { when } from 'lit/directives/when.js'\nimport type { EmailAttachment, EmailPreviewMode } from './types'\n\n/**\n * Email viewer component showing formatted HTML and plain text versions\n * \n * Features:\n * - HTML and plain text preview modes\n * - Email client-compatible styling\n * - Layout parsing (columns, sidebars, image rows)\n * - Markdown to HTML conversion\n * - Attachment display\n * - Email header simulation\n * - Character/word statistics\n * \n * @example\n * ```html\n * <schmancy-email-viewer\n * subject=\"Welcome!\"\n * body=\"**Hello** world\"\n * .attachments=${attachments}\n * .recipients=${['user@example.com']}\n * ></schmancy-email-viewer>\n * ```\n */\n@customElement('schmancy-email-viewer')\nexport class SchmancyEmailViewer extends SchmancyElement {\n\tstatic styles = [css`\n\t:host {\n\t\tdisplay: block;\n\t}\n`]\n\n\t/** Email subject */\n\t@property({ type: String }) subject = ''\n\t\n\t/** Email body content (markdown) */\n\t@property({ type: String }) body = ''\n\t\n\t/** Email attachments */\n\t@property({ type: Array }) attachments: EmailAttachment[] = []\n\t\n\t/** Selected recipients for preview */\n\t@property({ type: Array }) recipients: string[] = []\n\t\n\t/** From address for preview */\n\t@property({ type: String }) fromAddress = 'sender@example.com'\n\t\n\t/** To address for preview (uses first recipient if not provided) */\n\t@property({ type: String }) toAddress = 'recipient@example.com'\n\t\n\t/** Current view mode */\n\t@state() private viewMode: EmailPreviewMode = 'html'\n\n\t/**\n\t * Parse layout blocks (:::layout type) and convert to email-safe table layouts\n\t */\n\tprivate parseLayoutBlocks(text: string): string {\n\t\t// Match layout blocks: :::layout type\\n...content...\\n:::\n\t\treturn text.replace(/:::layout\\s+([a-zA-Z0-9-]+)\\n([\\s\\S]*?)\\n:::/g, (_, layoutType, content) => {\n\t\t\tswitch (layoutType) {\n\t\t\t\tcase 'columns-2':\n\t\t\t\t\treturn this.parseColumnsLayout(content, 2)\n\t\t\t\tcase 'columns-3':\n\t\t\t\t\treturn this.parseColumnsLayout(content, 3)\n\t\t\t\tcase 'sidebar-left':\n\t\t\t\t\treturn this.parseSidebarLayout(content, 'left')\n\t\t\t\tcase 'sidebar-right':\n\t\t\t\t\treturn this.parseSidebarLayout(content, 'right')\n\t\t\t\tcase 'image-row':\n\t\t\t\t\treturn this.parseImageRowLayout(content)\n\t\t\t\tdefault:\n\t\t\t\t\t// Unknown layout type, return content as-is\n\t\t\t\t\treturn content\n\t\t\t}\n\t\t})\n\t}\n\n\t/**\n\t * Parse columns layout (2 or 3 columns)\n\t */\n\tprivate parseColumnsLayout(content: string, columnCount: number): string {\n\t\t// Extract column content using regex to find <div class=\"column\">...</div>\n\t\tconst columnRegex = /<div class=\"column\">([\\s\\S]*?)<\\/div>/g\n\t\tconst columns: string[] = []\n\t\tlet match: RegExpExecArray | null\n\n\t\twhile ((match = columnRegex.exec(content)) !== null) {\n\t\t\tcolumns.push(match[1].trim())\n\t\t}\n\n\t\tif (columns.length === 0) {\n\t\t\treturn content // No columns found, return as-is\n\t\t}\n\n\t\t// Calculate column width percentage\n\t\tconst columnWidth = Math.floor(100 / columnCount)\n\t\tconst cellPadding = '0 10px 0 0' // Right padding except last column\n\n\t\t// Build table with columns\n\t\tlet tableRows = '<tr>'\n\t\t\n\t\tfor (let i = 0; i < columnCount && i < columns.length; i++) {\n\t\t\tconst isLastColumn = i === columnCount - 1\n\t\t\tconst padding = isLastColumn ? '0' : cellPadding\n\t\t\t\n\t\t\t// Parse markdown within column content\n\t\t\tconst parsedContent = this.parseBasicMarkdown(columns[i])\n\t\t\t\n\t\t\ttableRows += `\n\t\t\t\t<td width=\"${columnWidth}%\" style=\"padding: ${padding}; vertical-align: top; font-family: Arial, Helvetica, sans-serif; font-size: 14px; line-height: 1.6; color: #333333;\">\n\t\t\t\t\t${parsedContent}\n\t\t\t\t</td>`\n\t\t}\n\t\t\n\t\t// Fill empty columns if needed\n\t\tfor (let i = columns.length; i < columnCount; i++) {\n\t\t\tconst isLastColumn = i === columnCount - 1\n\t\t\tconst padding = isLastColumn ? '0' : cellPadding\n\t\t\t\n\t\t\ttableRows += `\n\t\t\t\t<td width=\"${columnWidth}%\" style=\"padding: ${padding}; vertical-align: top;\">\n\t\t\t\t\t&nbsp;\n\t\t\t\t</td>`\n\t\t}\n\t\t\n\t\ttableRows += '</tr>'\n\n\t\treturn `\n\t\t\t<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" width=\"100%\" style=\"margin: 16px 0;\">\n\t\t\t\t${tableRows}\n\t\t\t</table>`\n\t}\n\n\t/**\n\t * Parse sidebar layout (left or right sidebar)\n\t */\n\tprivate parseSidebarLayout(content: string, side: 'left' | 'right'): string {\n\t\t// Extract sidebar and main content\n\t\tconst sidebarMatch = content.match(/<div class=\"sidebar\">([\\s\\S]*?)<\\/div>/)\n\t\tconst mainMatch = content.match(/<div class=\"main\">([\\s\\S]*?)<\\/div>/)\n\n\t\tif (!sidebarMatch || !mainMatch) {\n\t\t\treturn content // Invalid structure, return as-is\n\t\t}\n\n\t\tconst sidebarContent = this.parseBasicMarkdown(sidebarMatch[1].trim())\n\t\tconst mainContent = this.parseBasicMarkdown(mainMatch[1].trim())\n\n\t\tconst sidebarCell = `\n\t\t\t<td width=\"30%\" style=\"padding: 0 16px 0 0; vertical-align: top; font-family: Arial, Helvetica, sans-serif; font-size: 14px; line-height: 1.6; color: #333333;\">\n\t\t\t\t${sidebarContent}\n\t\t\t</td>`\n\n\t\tconst mainCell = `\n\t\t\t<td width=\"70%\" style=\"padding: 0; vertical-align: top; font-family: Arial, Helvetica, sans-serif; font-size: 14px; line-height: 1.6; color: #333333;\">\n\t\t\t\t${mainContent}\n\t\t\t</td>`\n\n\t\tconst tableRow = side === 'left' ? \n\t\t\t`<tr>${sidebarCell}${mainCell}</tr>` : \n\t\t\t`<tr>${mainCell}${sidebarCell.replace('0 16px 0 0', '0 0 0 16px')}</tr>`\n\n\t\treturn `\n\t\t\t<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" width=\"100%\" style=\"margin: 16px 0;\">\n\t\t\t\t${tableRow}\n\t\t\t</table>`\n\t}\n\n\t/**\n\t * Parse image row layout\n\t */\n\tprivate parseImageRowLayout(content: string): string {\n\t\t// Extract images using regex to find <div class=\"image\">...</div>\n\t\tconst imageRegex = /<div class=\"image\">([\\s\\S]*?)<\\/div>/g\n\t\tconst images: string[] = []\n\t\tlet match: RegExpExecArray | null\n\n\t\twhile ((match = imageRegex.exec(content)) !== null) {\n\t\t\tconst imageContent = match[1].trim()\n\t\t\t// Extract image markdown ![alt](src)\n\t\t\tconst imgMatch = imageContent.match(/!\\[([^\\]]*)\\]\\(([^)]+)\\)/)\n\t\t\tif (imgMatch) {\n\t\t\t\tconst [, alt, src] = imgMatch\n\t\t\t\timages.push(`<img src=\"${src}\" alt=\"${alt || 'Image'}\" style=\"display: block; max-width: 100%; height: auto;\" border=\"0\">`)\n\t\t\t}\n\t\t}\n\n\t\tif (images.length === 0) {\n\t\t\treturn content // No images found, return as-is\n\t\t}\n\n\t\t// Calculate image width percentage\n\t\tconst imageWidth = Math.floor(100 / images.length)\n\t\tconst cellPadding = '0 8px 0 0' // Right padding except last image\n\n\t\t// Build table with images\n\t\tlet tableRow = '<tr>'\n\t\t\n\t\timages.forEach((image, index) => {\n\t\t\tconst isLastImage = index === images.length - 1\n\t\t\tconst padding = isLastImage ? '0' : cellPadding\n\t\t\t\n\t\t\ttableRow += `\n\t\t\t\t<td width=\"${imageWidth}%\" style=\"padding: ${padding}; vertical-align: top; text-align: center;\">\n\t\t\t\t\t${image}\n\t\t\t\t</td>`\n\t\t})\n\t\t\n\t\ttableRow += '</tr>'\n\n\t\treturn `\n\t\t\t<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" width=\"100%\" style=\"margin: 16px 0;\">\n\t\t\t\t${tableRow}\n\t\t\t</table>`\n\t}\n\n\t/**\n\t * Parse image attributes from markdown syntax\n\t */\n\tprivate parseImageAttributes(attributeString: string): {\n\t\twidth?: string;\n\t\theight?: string;\n\t\tcover?: boolean;\n\t\tcontain?: boolean;\n\t} {\n\t\tconst attributes: { width?: string; height?: string; cover?: boolean; contain?: boolean } = {}\n\t\t\n\t\tif (!attributeString) return attributes\n\t\t\n\t\t// Parse width=value\n\t\tconst widthMatch = attributeString.match(/width=([^\\s}]+)/)\n\t\tif (widthMatch) {\n\t\t\tattributes.width = widthMatch[1]\n\t\t}\n\t\t\n\t\t// Parse height=value\n\t\tconst heightMatch = attributeString.match(/height=([^\\s}]+)/)\n\t\tif (heightMatch) {\n\t\t\tattributes.height = heightMatch[1]\n\t\t}\n\t\t\n\t\t// Parse cover/contain flags\n\t\tif (attributeString.includes('cover')) {\n\t\t\tattributes.cover = true\n\t\t}\n\t\tif (attributeString.includes('contain')) {\n\t\t\tattributes.contain = true\n\t\t}\n\t\t\n\t\treturn attributes\n\t}\n\n\t/**\n\t * Generate email-safe image styles based on attributes\n\t */\n\tprivate generateImageStyles(attributes: {\n\t\twidth?: string;\n\t\theight?: string;\n\t\tcover?: boolean;\n\t\tcontain?: boolean;\n\t}, inColumn: boolean = false): { imgStyle: string; imgWidth?: string; imgHeight?: string } {\n\t\tlet imgStyle = 'display: block; margin: 8px 0; border: 0;'\n\t\tlet imgWidth: string | undefined\n\t\tlet imgHeight: string | undefined\n\t\t\n\t\t// Handle width\n\t\tif (attributes.width) {\n\t\t\tif (attributes.width === 'auto') {\n\t\t\t\t// Natural width - but constrain in columns\n\t\t\t\tif (inColumn) {\n\t\t\t\t\timgStyle += ' max-width: 100%; height: auto;'\n\t\t\t\t} else {\n\t\t\t\t\timgStyle += ' height: auto;'\n\t\t\t\t}\n\t\t\t} else if (attributes.width.endsWith('%')) {\n\t\t\t\t// Percentage width\n\t\t\t\timgStyle += ` width: ${attributes.width}; max-width: 100%;`\n\t\t\t\tif (!attributes.height) {\n\t\t\t\t\timgStyle += ' height: auto;'\n\t\t\t\t}\n\t\t\t} else if (attributes.width.endsWith('px')) {\n\t\t\t\t// Fixed pixel width - use width attribute for email compatibility\n\t\t\t\timgWidth = attributes.width.replace('px', '')\n\t\t\t\timgStyle += ' max-width: 100%;'\n\t\t\t\tif (!attributes.height) {\n\t\t\t\t\timgStyle += ' height: auto;'\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// Default width behavior\n\t\t\tif (inColumn) {\n\t\t\t\timgStyle += ' width: 100%; max-width: 100%; height: auto;'\n\t\t\t} else {\n\t\t\t\timgStyle += ' max-width: 100%; height: auto;'\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Handle height\n\t\tif (attributes.height) {\n\t\t\tif (attributes.height === 'auto') {\n\t\t\t\timgStyle += ' height: auto;'\n\t\t\t} else if (attributes.height.endsWith('px')) {\n\t\t\t\t// Fixed pixel height - use height attribute for email compatibility\n\t\t\t\timgHeight = attributes.height.replace('px', '')\n\t\t\t\tif (!attributes.width) {\n\t\t\t\t\t// If only height specified, maintain aspect ratio with max-width\n\t\t\t\t\timgStyle += ' max-width: 100%;'\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Handle object-fit simulation for email (limited support)\n\t\tif (attributes.cover || attributes.contain) {\n\t\t\t// Note: Most email clients don't support object-fit\n\t\t\t// We can only approximate with width/height and overflow hidden\n\t\t\tif (!attributes.width && !attributes.height) {\n\t\t\t\t// Default to container width for cover/contain\n\t\t\t\timgStyle += ' width: 100%;'\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn { imgStyle, imgWidth, imgHeight }\n\t}\n\n\t/**\n\t * Parse basic markdown within layout content (simplified version)\n\t */\n\tprivate parseBasicMarkdown(text: string): string {\n\t\treturn text\n\t\t\t// Handle images with custom attributes - enhanced for better control\n\t\t\t.replace(/!\\[([^\\]]*)\\]\\(([^)]+)\\)(?:\\{([^}]+)\\})?/g, (_, alt, src, attributeString) => {\n\t\t\t\tconst attributes = this.parseImageAttributes(attributeString)\n\t\t\t\tconst { imgStyle, imgWidth, imgHeight } = this.generateImageStyles(attributes, true)\n\t\t\t\t\n\t\t\t\t// Build img tag with attributes\n\t\t\t\tlet imgTag = `<img src=\"${src}\" alt=\"${alt || 'Image'}\" style=\"${imgStyle}\" border=\"0\"`\n\t\t\t\tif (imgWidth) imgTag += ` width=\"${imgWidth}\"`\n\t\t\t\tif (imgHeight) imgTag += ` height=\"${imgHeight}\"`\n\t\t\t\timgTag += '>'\n\t\t\t\t\n\t\t\t\treturn imgTag\n\t\t\t})\n\t\t\t// Convert double line breaks to paragraph breaks\n\t\t\t.replace(/\\n\\n/g, '</p><p style=\"margin: 0 0 16px 0; padding: 0; font-family: Arial, Helvetica, sans-serif; font-size: 14px; line-height: 1.6; color: #333333;\">')\n\t\t\t// Convert single line breaks to <br>\n\t\t\t.replace(/\\n/g, '<br>')\n\t\t\t// Bold text\n\t\t\t.replace(/\\*\\*(.*?)\\*\\*/g, '<strong style=\"font-weight: bold;\">$1</strong>')\n\t\t\t// Italic text \n\t\t\t.replace(/\\*(.*?)\\*/g, '<em style=\"font-style: italic;\">$1</em>')\n\t\t\t// Links with email-safe colors\n\t\t\t.replace(/\\[([^\\]]+)\\]\\(([^)]+)\\)/g, '<a href=\"$2\" style=\"color: #0066cc; text-decoration: underline;\">$1</a>')\n\t\t\t// Headers - only H1 supported for email compatibility\n\t\t\t.replace(/^# (.*$)/gim, '<h2 style=\"margin: 16px 0 8px 0; padding: 0; font-family: Arial, Helvetica, sans-serif; font-size: 18px; font-weight: bold; color: #1a1a1a;\">$1</h2>')\n\t\t\t// Unordered lists\n\t\t\t.replace(/^\\* (.*$)/gim, '<li style=\"margin: 4px 0; font-family: Arial, Helvetica, sans-serif; font-size: 14px; color: #333333;\">$1</li>')\n\t\t\t// Ordered lists \n\t\t\t.replace(/^\\d+\\. (.*$)/gim, '<li style=\"margin: 4px 0; font-family: Arial, Helvetica, sans-serif; font-size: 14px; color: #333333;\">$1</li>')\n\t\t\t// Wrap consecutive list items in proper list containers\n\t\t\t.replace(/(<li[^>]*>.*?<\\/li>(?:\\s*<li[^>]*>.*?<\\/li>)*)/gs, (listMatch) => {\n\t\t\t\t// Check if it's a numbered list by looking for digits at start of first item\n\t\t\t\tconst isNumbered = /^\\d+\\./.test(listMatch.replace(/<[^>]*>/g, ''))\n\t\t\t\tconst listTag = isNumbered ? 'ol' : 'ul'\n\t\t\t\tconst listStyle = 'margin: 8px 0; padding: 0 0 0 20px; font-family: Arial, Helvetica, sans-serif;'\n\t\t\t\t\n\t\t\t\treturn `<${listTag} style=\"${listStyle}\">${listMatch}</${listTag}>`\n\t\t\t})\n\t\t\t// Wrap in paragraph if not already wrapped\n\t\t\t.replace(/^(?!<[h\\d]|<p|<ul|<ol|<li|<img)(.+)$/gim, '<p style=\"margin: 0 0 16px 0; padding: 0; font-family: Arial, Helvetica, sans-serif; font-size: 14px; line-height: 1.6; color: #333333;\">$1</p>')\n\t}\n\n\t/**\n\t * Email-compliant HTML generator for email clients (Gmail, Outlook, Apple Mail)\n\t * Uses table-based layouts with inline styles only - no CSS classes or modern features\n\t */\n\tprivate parseExtendedMarkdown(text: string): string {\n\t\tlet html = text\n\t\t\n\t\t// Process layout blocks FIRST to avoid conflicts with other markdown\n\t\thtml = this.parseLayoutBlocks(html)\n\t\t\n\t\t// Remove complex image blocks - email clients don't handle them well\n\t\thtml = html.replace(/:::images\\s+(row|grid(?:=\\d+)?)\\n((?:!\\[.*?\\]\\(.*?\\)(?:\\{.*?\\})?\\s*\\n?)*?):::/g, '[Multiple Images - View in web browser]')\n\t\t\n\t\t// Handle single images with enhanced attribute support\n\t\thtml = html.replace(/!\\[([^\\]]*)\\]\\(([^)]+)\\)(?:\\{([^}]+)\\})?/g, (_, alt, src, attributeString) => {\n\t\t\tconst attributes = this.parseImageAttributes(attributeString)\n\t\t\tconst { imgStyle, imgWidth, imgHeight } = this.generateImageStyles(attributes, false)\n\t\t\t\n\t\t\t// Build img tag with attributes\n\t\t\tlet imgTag = `<img src=\"${src}\" alt=\"${alt || 'Image'}\" style=\"${imgStyle}\" border=\"0\"`\n\t\t\tif (imgWidth) imgTag += ` width=\"${imgWidth}\"`\n\t\t\tif (imgHeight) imgTag += ` height=\"${imgHeight}\"`\n\t\t\timgTag += '>'\n\t\t\t\n\t\t\t// Wrap in email-safe table\n\t\t\treturn `<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"margin: 16px 0;\"><tr><td>${imgTag}</td></tr></table>`\n\t\t})\n\t\t\n\t\t// Process markdown with email-safe inline styles\n\t\thtml = html\n\t\t\t// Convert double line breaks to paragraph breaks\n\t\t\t.replace(/\\n\\n/g, '</p><p style=\"margin: 0 0 16px 0; padding: 0; font-family: Arial, Helvetica, sans-serif; font-size: 14px; line-height: 1.6; color: #333333;\">')\n\t\t\t// Convert single line breaks to <br>\n\t\t\t.replace(/\\n/g, '<br>')\n\t\t\t// Bold text\n\t\t\t.replace(/\\*\\*(.*?)\\*\\*/g, '<strong style=\"font-weight: bold;\">$1</strong>')\n\t\t\t// Italic text \n\t\t\t.replace(/\\*(.*?)\\*/g, '<em style=\"font-style: italic;\">$1</em>')\n\t\t\t// Links with email-safe colors\n\t\t\t.replace(/\\[([^\\]]+)\\]\\(([^)]+)\\)/g, '<a href=\"$2\" style=\"color: #0066cc; text-decoration: underline;\">$1</a>')\n\t\t\t// Headers - only H1 supported for email compatibility\n\t\t\t.replace(/^# (.*$)/gim, '<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" width=\"100%\" style=\"margin: 24px 0 16px 0;\"><tr><td><h1 style=\"margin: 0; padding: 0; font-family: Arial, Helvetica, sans-serif; font-size: 24px; font-weight: bold; color: #1a1a1a;\">$1</h1></td></tr></table>')\n\t\t\t// Unordered lists\n\t\t\t.replace(/^\\* (.*$)/gim, '<li style=\"margin: 4px 0; font-family: Arial, Helvetica, sans-serif; font-size: 14px; color: #333333;\">$1</li>')\n\t\t\t// Ordered lists \n\t\t\t.replace(/^\\d+\\. (.*$)/gim, '<li style=\"margin: 4px 0; font-family: Arial, Helvetica, sans-serif; font-size: 14px; color: #333333;\">$1</li>')\n\t\t\t// Horizontal rule\n\t\t\t.replace(/^---$/gim, '<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" width=\"100%\" style=\"margin: 24px 0;\"><tr><td style=\"border-top: 1px solid #e0e0e0; height: 1px; line-height: 1px;\">&nbsp;</td></tr></table>')\n\t\t\n\t\t// Wrap consecutive list items in proper list containers\n\t\thtml = html.replace(/(<li[^>]*>.*?<\\/li>(?:\\s*<li[^>]*>.*?<\\/li>)*)/gs, (match) => {\n\t\t\t// Check if it's a numbered list by looking for digits at start of first item\n\t\t\tconst isNumbered = /^\\d+\\./.test(match.replace(/<[^>]*>/g, ''))\n\t\t\tconst listTag = isNumbered ? 'ol' : 'ul'\n\t\t\tconst listStyle = isNumbered \n\t\t\t\t? 'margin: 16px 0; padding: 0 0 0 20px; font-family: Arial, Helvetica, sans-serif;'\n\t\t\t\t: 'margin: 16px 0; padding: 0 0 0 20px; font-family: Arial, Helvetica, sans-serif;'\n\t\t\t\n\t\t\treturn `<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" width=\"100%\"><tr><td><${listTag} style=\"${listStyle}\">${match}</${listTag}></td></tr></table>`\n\t\t})\n\t\t\n\t\t// Wrap content in email-safe container table\n\t\tif (!html.includes('<table>') && !html.includes('<h1>')) {\n\t\t\thtml = `<p style=\"margin: 0 0 16px 0; padding: 0; font-family: Arial, Helvetica, sans-serif; font-size: 14px; line-height: 1.6; color: #333333;\">${html}</p>`\n\t\t}\n\t\t\n\t\t// Wrap everything in a main table container with 600px max width for email compatibility\n\t\thtml = `<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" width=\"100%\" style=\"max-width: 600px; margin: 0 auto;\">\n\t\t\t<tr>\n\t\t\t\t<td style=\"padding: 0; font-family: Arial, Helvetica, sans-serif; font-size: 14px; line-height: 1.6; color: #333333;\">\n\t\t\t\t\t${html}\n\t\t\t\t</td>\n\t\t\t</tr>\n\t\t</table>`\n\t\t\n\t\treturn html\n\t}\n\n\t/**\n\t * Convert markdown to plain text for plain text preview\n\t */\n\tprivate convertToPlainText(text: string): string {\n\t\treturn text.trim()\n\t\t\t// Remove layout blocks but preserve content\n\t\t\t.replace(/:::layout\\s+([a-zA-Z0-9-]+)\\n([\\s\\S]*?)\\n:::/g, (_, __, content) => {\n\t\t\t\t// Extract content from div containers and flatten\n\t\t\t\treturn content\n\t\t\t\t\t.replace(/<div class=\"(?:column|sidebar|main|image)\">/g, '\\n')\n\t\t\t\t\t.replace(/<\\/div>/g, '\\n')\n\t\t\t\t\t.replace(/\\n{3,}/g, '\\n\\n')\n\t\t\t\t\t.trim()\n\t\t\t})\n\t\t\t// Remove image blocks\n\t\t\t.replace(/:::images\\s+(row|grid(?:=\\d+)?)\\n((?:!\\[.*?\\]\\(.*?\\)(?:\\{.*?\\})?\\s*\\n?)*?):::/g, '[Images]')\n\t\t\t// Remove individual images\n\t\t\t.replace(/!\\[([^\\]]*)\\]\\(([^)]+)\\)(?:\\{([^}]+)\\})?/g, '[Image: $1]')\n\t\t\t// Remove other markdown\n\t\t\t.replace(/\\*\\*(.*?)\\*\\*/g, '$1') // Remove bold markers\n\t\t\t.replace(/\\*(.*?)\\*/g, '$1') // Remove italic markers\n\t\t\t.replace(/__(.*?)__/g, '$1') // Remove underline markers\n\t\t\t.replace(/~~(.*?)~~/g, '$1') // Remove strikethrough markers\n\t\t\t.replace(/`(.*?)`/g, '$1') // Remove code markers\n\t\t\t.replace(/^#{1,3} (.*$)/gim, '$1') // Remove header markers\n\t\t\t.replace(/^> (.*$)/gim, '$1') // Remove quote markers\n\t\t\t.replace(/^\\* (.*$)/gim, '• $1') // Convert bullets\n\t\t\t.replace(/^\\d+\\. (.*$)/gim, '$1') // Remove numbered list markers\n\t\t\t.replace(/\\[([^\\]]+)\\]\\(([^)]+)\\)/g, '$1 ($2)') // Convert links to text\n\t\t\t.replace(/^---$/gim, '---') // Keep dividers\n\t\t\t.replace(/\\n\\n+/g, '\\n\\n') // Normalize spacing\n\t}\n\n\t/** Format file size for display */\n\tprivate formatFileSize(bytes: number): string {\n\t\tif (bytes === 0) return '0 Bytes'\n\t\tconst k = 1024\n\t\tconst sizes = ['Bytes', 'KB', 'MB', 'GB']\n\t\tconst i = Math.floor(Math.log(bytes) / Math.log(k))\n\t\treturn parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]\n\t}\n\n\trender() {\n\t\tconst htmlBody = this.parseExtendedMarkdown(this.body)\n\t\tconst plainTextBody = this.convertToPlainText(this.body)\n\t\tconst displayToAddress = this.recipients[0] || this.toAddress\n\n\t\treturn html`\n\t\t\t<schmancy-surface type=\"solid\" rounded=\"all\" class=\"h-full flex flex-col\">\n\t\t\t\t\n\t\t\t\t<!-- Header Section -->\n\t\t\t\t<div class=\"shrink-0 p-4 border-b border-outline-variant\">\n\t\t\t\t\t<div class=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4\">\n\t\t\t\t\t\t<schmancy-typography type=\"title\" token=\"md\" class=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t<schmancy-icon size=\"20px\">preview</schmancy-icon>\n\t\t\t\t\t\t\tEmail Preview\n\t\t\t\t\t\t</schmancy-typography>\n\t\t\t\t\t\t\n\t\t\t\t\t\t<!-- View Mode Toggle -->\n\t\t\t\t\t\t<div class=\"flex gap-1 bg-surface-container rounded-full p-1\">\n\t\t\t\t\t\t\t<schmancy-chip \n\t\t\t\t\t\t\t\t?selected=${this.viewMode === 'html'}\n\t\t\t\t\t\t\t\t@click=${() => { this.viewMode = 'html' }}\n\t\t\t\t\t\t\t\tclass=\"text-xs h-8\"\n\t\t\t\t\t\t\t\tdata-variant=${this.viewMode === 'html' ? 'filled' : 'outlined'}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<schmancy-icon slot=\"prefix\" size=\"14px\">code</schmancy-icon>\n\t\t\t\t\t\t\t\tHTML\n\t\t\t\t\t\t\t</schmancy-chip>\n\t\t\t\t\t\t\t<schmancy-chip \n\t\t\t\t\t\t\t\t?selected=${this.viewMode === 'plaintext'}\n\t\t\t\t\t\t\t\t@click=${() => { this.viewMode = 'plaintext' }}\n\t\t\t\t\t\t\t\tclass=\"text-xs h-8\"\n\t\t\t\t\t\t\t\tdata-variant=${this.viewMode === 'plaintext' ? 'filled' : 'outlined'}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<schmancy-icon slot=\"prefix\" size=\"14px\">text_fields</schmancy-icon>\n\t\t\t\t\t\t\t\tText\n\t\t\t\t\t\t\t</schmancy-chip>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<!-- Preview Content Container -->\n\t\t\t\t<div class=\"flex-1 flex flex-col min-h-0 p-4 gap-4\">\n\t\t\t\t\t\n\t\t\t\t\t<!-- Email Mock Container -->\n\t\t\t\t\t<div class=\"flex-1 flex flex-col min-h-0\">\n\t\t\t\t\t\t<schmancy-surface \n\t\t\t\t\t\t\ttype=\"subtle\"\n\t\t\t\t\t\t\trounded=\"all\"\n\t\t\t\t\t\t\tclass=\"flex-1 flex flex-col overflow-hidden shadow-sm\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<!-- Email Header -->\n\t\t\t\t\t\t\t<div class=\"shrink-0 p-4 bg-surface-containerLow border-b border-outline-variant\">\n\t\t\t\t\t\t\t\t<div class=\"space-y-3\">\n\t\t\t\t\t\t\t\t\t<!-- From Field -->\n\t\t\t\t\t\t\t\t\t<div class=\"flex items-start gap-3\">\n\t\t\t\t\t\t\t\t\t\t<div class=\"flex items-center gap-2 min-w-0 shrink-0 w-16\">\n\t\t\t\t\t\t\t\t\t\t\t<schmancy-icon size=\"16px\">account_circle</schmancy-icon>\n\t\t\t\t\t\t\t\t\t\t\t<schmancy-typography type=\"body\" token=\"sm\" class=\"font-medium\">\n\t\t\t\t\t\t\t\t\t\t\t\tFrom\n\t\t\t\t\t\t\t\t\t\t\t</schmancy-typography>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<schmancy-typography type=\"body\" token=\"sm\" class=\"break-all flex-1\">\n\t\t\t\t\t\t\t\t\t\t\t${this.fromAddress}\n\t\t\t\t\t\t\t\t\t\t</schmancy-typography>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t<!-- To Field -->\n\t\t\t\t\t\t\t\t\t<div class=\"flex items-start gap-3\">\n\t\t\t\t\t\t\t\t\t\t<div class=\"flex items-center gap-2 min-w-0 shrink-0 w-16\">\n\t\t\t\t\t\t\t\t\t\t\t<schmancy-icon size=\"16px\">person</schmancy-icon>\n\t\t\t\t\t\t\t\t\t\t\t<schmancy-typography type=\"body\" token=\"sm\" class=\"font-medium\">\n\t\t\t\t\t\t\t\t\t\t\t\tTo\n\t\t\t\t\t\t\t\t\t\t\t</schmancy-typography>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<schmancy-typography type=\"body\" token=\"sm\" class=\"break-all flex-1\">\n\t\t\t\t\t\t\t\t\t\t\t${displayToAddress}\n\t\t\t\t\t\t\t\t\t\t</schmancy-typography>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t<!-- Subject Field -->\n\t\t\t\t\t\t\t\t\t<div class=\"flex items-start gap-3\">\n\t\t\t\t\t\t\t\t\t\t<div class=\"flex items-center gap-2 min-w-0 shrink-0 w-16\">\n\t\t\t\t\t\t\t\t\t\t\t<schmancy-icon size=\"16px\">subject</schmancy-icon>\n\t\t\t\t\t\t\t\t\t\t\t<schmancy-typography type=\"body\" token=\"sm\" class=\"font-medium\">\n\t\t\t\t\t\t\t\t\t\t\t\tSubject\n\t\t\t\t\t\t\t\t\t\t\t</schmancy-typography>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<schmancy-typography type=\"body\" token=\"sm\" class=\"font-medium flex-1\">\n\t\t\t\t\t\t\t\t\t\t\t${this.subject || html`<span class=\"italic text-surface-onVariant\">(No subject)</span>`}\n\t\t\t\t\t\t\t\t\t\t</schmancy-typography>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<!-- Email Body Content -->\n\t\t\t\t\t\t\t<div class=\"flex-1 overflow-y-auto min-h-0\">\n\t\t\t\t\t\t\t\t${when(this.body, \n\t\t\t\t\t\t\t\t\t() => html`\n\t\t\t\t\t\t\t\t\t\t${when(this.viewMode === 'html', \n\t\t\t\t\t\t\t\t\t\t\t() => html`\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"p-6 bg-white\" style=\"color: #333; line-height: 1.6; font-family: system-ui, -apple-system, sans-serif; font-size: 14px;\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div .innerHTML=${htmlBody}></div>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t`,\n\t\t\t\t\t\t\t\t\t\t\t() => html`\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"p-6 bg-white\" style=\"color: #333; line-height: 1.6; font-family: 'Courier New', monospace; font-size: 13px; white-space: pre-wrap;\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t${plainTextBody}\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t`\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t`,\n\t\t\t\t\t\t\t\t\t() => html`\n\t\t\t\t\t\t\t\t\t\t<!-- Empty State -->\n\t\t\t\t\t\t\t\t\t\t<div class=\"flex-1 flex items-center justify-center p-8\">\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"text-center space-y-3\">\n\t\t\t\t\t\t\t\t\t\t\t\t<schmancy-icon size=\"48px\" class=\"text-surface-onVariant opacity-50\">mail_outline</schmancy-icon>\n\t\t\t\t\t\t\t\t\t\t\t\t<schmancy-typography type=\"body\" token=\"md\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tNo message content to preview\n\t\t\t\t\t\t\t\t\t\t\t\t</schmancy-typography>\n\t\t\t\t\t\t\t\t\t\t\t\t<schmancy-typography type=\"body\" token=\"sm\" class=\"text-surface-onVariant\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tStart typing in the composer to see a preview\n\t\t\t\t\t\t\t\t\t\t\t\t</schmancy-typography>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t`\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<!-- Attachments Section -->\n\t\t\t\t\t\t\t${when(this.attachments.length > 0, () => html`\n\t\t\t\t\t\t\t\t<div class=\"shrink-0 p-4 border-t border-outline-variant bg-surface-containerLowest\">\n\t\t\t\t\t\t\t\t\t<div class=\"space-y-3\">\n\t\t\t\t\t\t\t\t\t\t<!-- Attachments Header -->\n\t\t\t\t\t\t\t\t\t\t<div class=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t\t\t<schmancy-icon size=\"18px\">attach_file</schmancy-icon>\n\t\t\t\t\t\t\t\t\t\t\t<schmancy-typography type=\"label\" token=\"md\" class=\"font-medium\">\n\t\t\t\t\t\t\t\t\t\t\t\tAttachments (${this.attachments.length})\n\t\t\t\t\t\t\t\t\t\t\t</schmancy-typography>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t<!-- Attachments List -->\n\t\t\t\t\t\t\t\t\t\t<div class=\"grid gap-2 sm:grid-cols-2 lg:grid-cols-1 xl:grid-cols-2\">\n\t\t\t\t\t\t\t\t\t\t\t${repeat(this.attachments, attachment => attachment.id, (attachment) => html`\n\t\t\t\t\t\t\t\t\t\t\t\t<schmancy-surface type=\"subtle\" rounded=\"all\" class=\"p-3\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"flex items-center gap-3\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<!-- File Icon -->\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<schmancy-icon size=\"20px\" class=\"text-surface-onVariant shrink-0\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t${attachment.type.startsWith('image/') ? 'image' :\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t attachment.type.includes('pdf') ? 'picture_as_pdf' :\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t attachment.type.includes('text') ? 'description' :\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t 'attach_file'}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</schmancy-icon>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<!-- File Info -->\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"flex-1 min-w-0\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<schmancy-typography type=\"body\" token=\"sm\" class=\"font-medium truncate\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t${attachment.name}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</schmancy-typography>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<schmancy-typography type=\"body\" token=\"xs\" class=\"text-surface-onVariant\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t${this.formatFileSize(attachment.size)} • ${attachment.type}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</schmancy-typography>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t</schmancy-surface>\n\t\t\t\t\t\t\t\t\t\t\t`)}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t`)}\n\t\t\t\t\t\t</schmancy-surface>\n\t\t\t\t\t</div>\n\t\t\t\t\t\n\t\t\t\t\t<!-- Preview Stats -->\n\t\t\t\t\t${when(this.body, () => html`\n\t\t\t\t\t\t<div class=\"shrink-0\">\n\t\t\t\t\t\t\t<schmancy-surface type=\"subtle\" rounded=\"all\" class=\"p-3\">\n\t\t\t\t\t\t\t\t<div class=\"flex items-center justify-center gap-6 text-center\">\n\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t<schmancy-typography type=\"body\" token=\"xs\" class=\"text-surface-onVariant\">\n\t\t\t\t\t\t\t\t\t\t\tCharacters\n\t\t\t\t\t\t\t\t\t\t</schmancy-typography>\n\t\t\t\t\t\t\t\t\t\t<schmancy-typography type=\"body\" token=\"sm\" class=\"font-medium\">\n\t\t\t\t\t\t\t\t\t\t\t${this.body.length}\n\t\t\t\t\t\t\t\t\t\t</schmancy-typography>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div class=\"w-px h-8 bg-outline-variant\"></div>\n\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t<schmancy-typography type=\"body\" token=\"xs\" class=\"text-surface-onVariant\">\n\t\t\t\t\t\t\t\t\t\t\tWords\n\t\t\t\t\t\t\t\t\t\t</schmancy-typography>\n\t\t\t\t\t\t\t\t\t\t<schmancy-typography type=\"body\" token=\"sm\" class=\"font-medium\">\n\t\t\t\t\t\t\t\t\t\t\t${this.body.trim() ? this.body.trim().split(/\\s+/).length : 0}\n\t\t\t\t\t\t\t\t\t\t</schmancy-typography>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t${when(this.attachments.length > 0, () => html`\n\t\t\t\t\t\t\t\t\t\t<div class=\"w-px h-8 bg-outline-variant\"></div>\n\t\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t\t<schmancy-typography type=\"body\" token=\"xs\" class=\"text-surface-onVariant\">\n\t\t\t\t\t\t\t\t\t\t\t\tAttachments\n\t\t\t\t\t\t\t\t\t\t\t</schmancy-typography>\n\t\t\t\t\t\t\t\t\t\t\t<schmancy-typography type=\"body\" token=\"sm\" class=\"font-medium\">\n\t\t\t\t\t\t\t\t\t\t\t\t${this.attachments.length}\n\t\t\t\t\t\t\t\t\t\t\t</schmancy-typography>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t`)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</schmancy-surface>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`)}\n\t\t\t\t\t\n\t\t\t\t</div>\n\t\t\t</schmancy-surface>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-email-viewer': SchmancyEmailViewer\n\t}\n}\n","import { SchmancyElement } from '@mixins/index'\nimport { css, html } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { createRef, ref } from 'lit/directives/ref.js'\nimport { repeat } from 'lit/directives/repeat.js'\nimport { when } from 'lit/directives/when.js'\nimport { fromEvent, takeUntil } from 'rxjs'\nimport { $notify } from '../notification'\nimport type { BoatState, ImportSource } from './types'\n\n/**\n * CSV parser interface (optional dependency)\n * Can be provided via global window object or imported\n */\ninterface CSVParser {\n\tparse(csvContent: string, config: any): {\n\t\tdata: any[]\n\t\tmeta: { fields?: string[] }\n\t}\n}\n\n/**\n * Email recipients management component with floating boat interface\n * \n * Features:\n * - Floating boat UI that can be minimized/expanded\n * - CSV import with drag & drop\n * - Multiple import sources (configurable)\n * - Bulk selection and management\n * - Search and filtering\n * - Email validation\n * \n * @example\n * ```html\n * <schmancy-email-recipients\n * .recipients=${['user1@example.com', 'user2@example.com']}\n * @emails-imported=${handleEmailsImported}\n * ></schmancy-email-recipients>\n * ```\n */\n@customElement('schmancy-email-recipients')\nexport class SchmancyEmailRecipients extends SchmancyElement {\n\tstatic styles = [css`\n\t:host {\n\t\tdisplay: block;\n\t\theight: 100%;\n\t}\n`]\n\n\t/** Disable all interactions */\n\t@property({ type: Boolean }) disabled = false\n\t\n\t/** All available recipients */\n\t@property({ type: Array }) recipients: string[] = []\n\n\t/** Sources users can import recipients from (forwarded from parent) */\n\t@property({ type: Array }) importSources: ImportSource[] = []\n\t\n\t/** Currently selected recipients */\n\t@property({ type: Array }) selectedRecipients: string[] = []\n\t\n\t\n\t/** Enable CSV import functionality */\n\t@property({ type: Boolean }) enableCsvImport = true\n\t\n\t/** Enable drag and drop for files */\n\t@property({ type: Boolean }) enableDragDrop = true\n\t\n\t/** Panel title */\n\t@property({ type: String }) title = 'Recipients'\n\t\n\t/** Empty state title */\n\t@property({ type: String }) emptyStateTitle = 'No recipients yet'\n\t\n\t/** Empty state message */\n\t@property({ type: String }) emptyStateMessage = 'Import from sources or upload a CSV'\n\t\n\t/** CSV parser function (optional) */\n\t@property({ type: Object }) csvParser?: CSVParser\n\n\t/** Internal state */\n\t@state() private dragOver = false\n\t@state() private localSelectedRecipients: Set<string> = new Set()\n\t@state() private searchQuery = ''\n\t@state() private filteredRecipients: string[] = []\n\t@state() private boatState: BoatState = 'collapsed'\n\n\t/** File input reference */\n\tprivate fileInputRef = createRef<HTMLInputElement>()\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback()\n\t\t// Initialize local selection state from prop\n\t\tthis.localSelectedRecipients = new Set(this.selectedRecipients)\n\t\t// Initialize filtered recipients\n\t\tthis.updateFilteredRecipients()\n\n\t\t// Listen for emails-imported events to ensure UI updates using RxJS\n\t\tfromEvent(this, 'emails-imported').pipe(\n\t\t\ttakeUntil(this.disconnecting)\n\t\t).subscribe(this.handleEmailsImported as any)\n\t}\n\n\tprivate handleEmailsImported = () => {\n\t\t// Force update of filtered recipients when emails are imported\n\t\tthis.updateFilteredRecipients()\n\t\tthis.requestUpdate()\n\t}\n\n\tupdated(changedProperties: Map<string, unknown>) {\n\t\tsuper.updated(changedProperties)\n\t\t\n\t\t// Sync selection state when selectedRecipients prop changes\n\t\tif (changedProperties.has('selectedRecipients')) {\n\t\t\tthis.localSelectedRecipients = new Set(this.selectedRecipients)\n\t\t}\n\t\t\n\t\t// Update filtered recipients when recipients or search changes\n\t\tif (changedProperties.has('recipients') || changedProperties.has('searchQuery')) {\n\t\t\tthis.updateFilteredRecipients()\n\t\t}\n\t\t\n\t\t// Force re-render when recipients change (e.g., after import)\n\t\tif (changedProperties.has('recipients')) {\n\t\t\tthis.requestUpdate()\n\t\t}\n\t}\n\n\t/** Handle CSV import trigger */\n\tprivate handleImportFromCSV = () => {\n\t\tif (!this.enableCsvImport) return\n\t\tthis.fileInputRef.value?.click()\n\t}\n\n\t/** Handle file selection */\n\tprivate handleFileSelect = (event: Event) => {\n\t\tconst input = event.target as HTMLInputElement\n\t\tconst file = input.files?.[0]\n\t\tif (file) {\n\t\t\tthis.processCSVFile(file)\n\t\t}\n\t}\n\n\t/** Handle drag and drop */\n\tprivate handleDrop = (event: DragEvent) => {\n\t\tif (!this.enableDragDrop) return\n\t\t\n\t\tevent.preventDefault()\n\t\tthis.dragOver = false\n\n\t\tconst file = event.dataTransfer?.files[0]\n\t\tif (file) {\n\t\t\tthis.processCSVFile(file)\n\t\t}\n\t}\n\n\t/** Process CSV file */\n\tprivate processCSVFile = (file: File) => {\n\t\tif (!file.name.endsWith('.csv')) {\n\t\t\t$notify.error('Please select a CSV file')\n\t\t\treturn\n\t\t}\n\n\t\tconst reader = new FileReader()\n\t\treader.addEventListener('load', e => {\n\t\t\tconst content = (e.target as FileReader | null)?.result as string\n\t\t\ttry {\n\t\t\t\tconst emails = this.parseCSV(content)\n\n\t\t\t\tif (emails.length === 0) {\n\t\t\t\t\t$notify.error('No valid email addresses found in CSV')\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// Dispatch event with new emails\n\t\t\t\tthis.dispatchEvent(new CustomEvent('emails-imported', {\n\t\t\t\t\tdetail: { emails, source: 'csv' },\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true\n\t\t\t\t}))\n\n\t\t\t\t$notify.success(`Imported ${emails.length} emails from CSV file`)\n\t\t\t} catch (error) {\n\t\t\t\t$notify.error('Failed to parse CSV file')\n\t\t\t\tconsole.error('CSV parse error:', error)\n\t\t\t}\n\t\t}, { once: true })\n\t\treader.readAsText(file)\n\t}\n\n\t/** Parse CSV content */\n\tprivate parseCSV(csvContent: string): string[] {\n\t\tconst emails: string[] = []\n\n\t\tlet parseResult: { data: any[], meta: { fields?: string[] } }\n\n\t\t// Try to use provided parser or fallback to simple parsing\n\t\tif (this.csvParser) {\n\t\t\tparseResult = this.csvParser.parse(csvContent, {\n\t\t\t\theader: true,\n\t\t\t\tskipEmptyLines: true,\n\t\t\t\tdynamicTyping: true,\n\t\t\t\tdelimiter: '',\n\t\t\t\ttransformHeader: (header: string) => header.trim(),\n\t\t\t})\n\t\t} else {\n\t\t\t// Simple CSV parsing fallback\n\t\t\tparseResult = this.simpleCSVParse(csvContent)\n\t\t}\n\n\t\tconst data = parseResult.data\n\t\tconst headers = parseResult.meta.fields || []\n\t\tlet emailField = headers.find(h => h.toLowerCase().includes('email'))\n\n\t\tif (!emailField) {\n\t\t\t// Try to detect email in first column with valid emails\n\t\t\tfor (const header of headers) {\n\t\t\t\tconst firstValue = data[0]?.[header]?.toString()\n\t\t\t\tif (firstValue && this.isValidEmail(firstValue)) {\n\t\t\t\t\temailField = header\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (!emailField) {\n\t\t\tthrow new Error('No email column found in CSV')\n\t\t}\n\n\t\t// Extract and validate emails\n\t\tconst emailSet = new Set<string>()\n\t\tfor (const row of data) {\n\t\t\tconst emailCandidate = row[emailField!]?.toString()\n\t\t\tif (!emailCandidate) continue\n\n\t\t\tconst email = emailCandidate.toLowerCase().trim()\n\n\t\t\tif (this.isValidEmail(email) && !emailSet.has(email)) {\n\t\t\t\temailSet.add(email)\n\t\t\t\temails.push(email)\n\t\t\t}\n\t\t}\n\n\t\treturn emails\n\t}\n\n\t/** Simple CSV parsing fallback */\n\tprivate simpleCSVParse(csvContent: string): { data: any[], meta: { fields?: string[] } } {\n\t\tconst lines = csvContent.split('\\n').filter(line => line.trim())\n\t\tif (lines.length === 0) {\n\t\t\treturn { data: [], meta: {} }\n\t\t}\n\n\t\t// Parse headers\n\t\tconst headers = lines[0].split(',').map(h => h.trim().replace(/\"/g, ''))\n\t\tconst data: any[] = []\n\n\t\t// Parse rows\n\t\tfor (let i = 1; i < lines.length; i++) {\n\t\t\tconst values = lines[i].split(',').map(v => v.trim().replace(/\"/g, ''))\n\t\t\tconst row: any = {}\n\t\t\theaders.forEach((header, index) => {\n\t\t\t\trow[header] = values[index] || ''\n\t\t\t})\n\t\t\tdata.push(row)\n\t\t}\n\n\t\treturn { data, meta: { fields: headers } }\n\t}\n\n\t/** Validate email format */\n\tprivate isValidEmail(email: string): boolean {\n\t\tconst emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n\t\treturn emailRegex.test(email.trim())\n\t}\n\n\t/** Toggle recipient selection */\n\tprivate toggleRecipientSelection = (email: string) => {\n\t\tif (this.localSelectedRecipients.has(email)) {\n\t\t\tthis.localSelectedRecipients.delete(email)\n\t\t} else {\n\t\t\tthis.localSelectedRecipients.add(email)\n\t\t}\n\t\tthis.localSelectedRecipients = new Set(this.localSelectedRecipients)\n\t\tthis.dispatchSelectionChange()\n\t}\n\n\t/** Select all filtered recipients */\n\tprivate selectAll = () => {\n\t\tthis.localSelectedRecipients = new Set(this.filteredRecipients)\n\t\tthis.dispatchSelectionChange()\n\t}\n\n\t/** Clear all selections */\n\tprivate selectNone = () => {\n\t\tthis.localSelectedRecipients.clear()\n\t\tthis.localSelectedRecipients = new Set()\n\t\tthis.dispatchSelectionChange()\n\t}\n\n\t/** Remove individual recipient */\n\tprivate removeRecipient = (email: string) => {\n\t\tthis.dispatchEvent(new CustomEvent('recipient-removed', {\n\t\t\tdetail: { email },\n\t\t\tbubbles: true,\n\t\t\tcomposed: true\n\t\t}))\n\t}\n\n\t/** Clear all recipients */\n\tprivate clearAll = () => {\n\t\tthis.dispatchEvent(new CustomEvent('recipients-cleared', {\n\t\t\tbubbles: true,\n\t\t\tcomposed: true\n\t\t}))\n\t}\n\n\t/** Update filtered recipients based on search */\n\tprivate updateFilteredRecipients = () => {\n\t\t// Ensure recipients is an array\n\t\tconst recipientsList = Array.isArray(this.recipients) ? this.recipients : []\n\t\t\n\t\tif (!this.searchQuery.trim()) {\n\t\t\tthis.filteredRecipients = [...recipientsList]\n\t\t} else {\n\t\t\tconst query = this.searchQuery.toLowerCase()\n\t\t\tthis.filteredRecipients = recipientsList.filter(email => \n\t\t\t\temail.toLowerCase().includes(query)\n\t\t\t)\n\t\t}\n\t}\n\n\t/** Handle search input */\n\tprivate handleSearchInput = (event: Event) => {\n\t\tconst input = event.target as HTMLInputElement\n\t\tthis.searchQuery = input.value\n\t}\n\n\t/** Clear search query */\n\tprivate clearSearch = () => {\n\t\tthis.searchQuery = ''\n\t}\n\n\t/** Dispatch selection change event */\n\tprivate dispatchSelectionChange = () => {\n\t\tthis.dispatchEvent(new CustomEvent('selection-changed', {\n\t\t\tdetail: { selectedEmails: Array.from(this.localSelectedRecipients) },\n\t\t\tbubbles: true,\n\t\t\tcomposed: true\n\t\t}))\n\t}\n\n\t/** Handle boat state changes */\n\tprivate handleBoatStateChange = (event: CustomEvent) => {\n\t\tthis.boatState = event.detail\n\t}\n\n\t// Public API methods\n\n\t/** Add recipients programmatically */\n\tpublic addRecipients(emails: string[]) {\n\t\tif (!emails.length) return\n\t\t\n\t\t// Update recipients prop data\n\t\tconst uniqueEmails = [...new Set([...this.recipients, ...emails])]\n\t\tconst newEmails = emails.filter(email => !this.recipients.includes(email))\n\t\t\n\t\t// Update internal state\n\t\tthis.recipients = uniqueEmails\n\t\tthis.selectedRecipients = [...new Set([...this.selectedRecipients, ...newEmails])]\n\t\tthis.localSelectedRecipients = new Set(this.selectedRecipients)\n\t\t\n\t\t// Force UI update\n\t\tthis.updateFilteredRecipients()\n\t\tthis.requestUpdate()\n\t}\n\n\t/** Show boat (collapsed) */\n\tpublic showBoat() {\n\t\tthis.boatState = 'collapsed'\n\t}\n\n\t/** Hide boat (collapse) */\n\tpublic hideBoat() {\n\t\tthis.boatState = 'collapsed'\n\t}\n\n\t/** Expand boat */\n\tpublic expandBoat() {\n\t\tthis.boatState = 'expanded'\n\t}\n\n\t/** Toggle boat state */\n\tpublic toggleBoat() {\n\t\tthis.boatState = this.boatState === 'collapsed' ? 'expanded' : 'collapsed'\n\t}\n\n\trender() {\n\t\treturn this.renderBoatLayout()\n\t}\n\n\t/** Render floating boat layout */\n\tprivate renderBoatLayout() {\n\t\treturn html`\n\t\t\t<!-- Hidden file input for CSV import -->\n\t\t\t${when(this.enableCsvImport, () => html`\n\t\t\t\t<input\n\t\t\t\t\ttype=\"file\"\n\t\t\t\t\taccept=\".csv\"\n\t\t\t\t\t${ref(this.fileInputRef)}\n\t\t\t\t\t@change=${this.handleFileSelect}\n\t\t\t\t\tclass=\"hidden\"\n\t\t\t\t/>\n\t\t\t`)}\n\n\t\t\t<schmancy-boat \n\t\t\t\t.state=${this.boatState}\n\t\t\t\t@change=${this.handleBoatStateChange}\n\t\t\t>\n\t\t\t\t<!-- Boat Header -->\n\t\t\t\t<div slot=\"header\" class=\"flex items-center justify-between w-full px-4 py-2\">\n\t\t\t\t\t<div class=\"flex items-center gap-3\">\n\t\t\t\t\t\t<schmancy-icon size=\"20px\">group</schmancy-icon>\n\t\t\t\t\t\t<schmancy-typography type=\"title\" token=\"md\" class=\"font-semibold\">\n\t\t\t\t\t\t\t${this.title}\n\t\t\t\t\t\t</schmancy-typography>\n\t\t\t\t\t\t${when(this.recipients.length > 0, () => html`\n\t\t\t\t\t\t\t<schmancy-badge>\n\t\t\t\t\t\t\t\t${this.localSelectedRecipients.size}/${this.recipients.length}\n\t\t\t\t\t\t\t</schmancy-badge>\n\t\t\t\t\t\t`)}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<!-- Boat Content -->\n\t\t\t\t<div class=\"h-full flex flex-col max-h-[70vh]\">\n\t\t\t\t\t${this.renderBoatContent()}\n\t\t\t\t</div>\n\t\t\t</schmancy-boat>\n\t\t`\n\t}\n\n\t/** Render boat content */\n\tprivate renderBoatContent() {\n\t\treturn html`\n\t\t\t<!-- Search Bar and CSV Import on one line -->\n\t\t\t<div class=\"p-4 flex gap-3\">\n\t\t\t\t<schmancy-input\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tplaceholder=\"Search recipients\"\n\t\t\t\t\t.value=${this.searchQuery}\n\t\t\t\t\t@input=${this.handleSearchInput}\n\t\t\t\t\tclass=\"flex-1\"\n\t\t\t\t>\n\t\t\t\t\t${when(this.searchQuery, () => html`\n\t\t\t\t\t\t<schmancy-button\n\t\t\t\t\t\t\tslot=\"suffix\" \n\t\t\t\t\t\t\tvariant=\"text\"\n\t\t\t\t\t\t\t@click=${this.clearSearch}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<schmancy-icon size=\"16px\">close</schmancy-icon>\n\t\t\t\t\t\t</schmancy-button>\n\t\t\t\t\t`)}\n\t\t\t\t</schmancy-input>\n\t\t\t\t\n\t\t\t\t${when(this.enableCsvImport, () => html`\n\t\t\t\t\t<schmancy-button\n\t\t\t\t\t\tvariant=\"outlined\"\n\t\t\t\t\t\t@click=${this.handleImportFromCSV}\n\t\t\t\t\t\t?disabled=${this.disabled}\n\t\t\t\t\t>\n\t\t\t\t\t\t<schmancy-icon slot=\"prefix\" size=\"16px\">upload_file</schmancy-icon>\n\t\t\t\t\t\tImport\n\t\t\t\t\t</schmancy-button>\n\t\t\t\t`)}\n\t\t\t</div>\n\n\t\t\t${when(this.recipients.length > 0, () => html`\n\t\t\t\t<!-- Bulk Actions -->\n\t\t\t\t<div class=\"px-4 pb-4\">\n\t\t\t\t\t<div class=\"flex items-center gap-3\">\n\t\t\t\t\t\t<schmancy-button \n\t\t\t\t\t\t\tvariant=\"outlined\"\n\t\t\t\t\t\t\t@click=${this.selectAll}\n\t\t\t\t\t\t\t?disabled=${this.localSelectedRecipients.size === this.filteredRecipients.length}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<schmancy-icon slot=\"prefix\" size=\"14px\">select_all</schmancy-icon>\n\t\t\t\t\t\t\tSelect All\n\t\t\t\t\t\t</schmancy-button>\n\t\t\t\t\t\t\n\t\t\t\t\t\t<schmancy-button \n\t\t\t\t\t\t\tvariant=\"outlined\"\n\t\t\t\t\t\t\t@click=${this.selectNone}\n\t\t\t\t\t\t\t?disabled=${this.localSelectedRecipients.size === 0}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<schmancy-icon slot=\"prefix\" size=\"14px\">deselect</schmancy-icon>\n\t\t\t\t\t\t\tClear Selection\n\t\t\t\t\t\t</schmancy-button>\n\t\t\t\t\t\t\n\t\t\t\t\t\t<div class=\"flex-1\"></div>\n\t\t\t\t\t\t\n\t\t\t\t\t\t<schmancy-button variant=\"text\" @click=${this.clearAll}>\n\t\t\t\t\t\t\t<schmancy-icon slot=\"prefix\" size=\"14px\">delete_forever</schmancy-icon>\n\t\t\t\t\t\t\tClear All\n\t\t\t\t\t\t</schmancy-button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<!-- Recipients List -->\n\t\t\t\t<div class=\"flex-1 overflow-y-auto px-4 pb-4\">\n\t\t\t\t\t${when(\n\t\t\t\t\t\tthis.filteredRecipients.length > 0,\n\t\t\t\t\t\t() => html`\n\t\t\t\t\t\t\t<div class=\"flex flex-wrap gap-3\">\n\t\t\t\t\t\t\t\t${repeat(\n\t\t\t\t\t\t\t\t\tthis.filteredRecipients,\n\t\t\t\t\t\t\t\t\temail => email,\n\t\t\t\t\t\t\t\t\temail => html`\n\t\t\t\t\t\t\t\t\t\t<schmancy-button\n\t\t\t\t\t\t\t\t\t\t\tvariant=${this.localSelectedRecipients.has(email) ? 'filled' : 'outlined'}\n\t\t\t\t\t\t\t\t\t\t\t@click=${(e:Event) => {\n\t\t\t\t\t\t\t\t\t\t\t\te.stopPropagation()\n\t\t\t\t\t\t\t\t\t\t\t\te.preventDefault()\n\t\t\t\t\t\t\t\t\t\t\t\tthis.toggleRecipientSelection(email)}}\n\t\t\t\t\t\t\t\t\t\t\tclass=\"cursor-pointer flex items-center gap-2\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"truncate flex-1 text-left\">${email}</span>\n\t\t\t\t\t\t\t\t\t\t\t<schmancy-icon\n\t\t\t\t\t\t\t\t\t\t\t\t@click=${(e: Event) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\te.stopPropagation()\n\t\t\t\t\t\t\t\t\t\t\t\t\tthis.removeRecipient(email)\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"16px\"\n\t\t\t\t\t\t\t\t\t\t\t\tclass=\"ml-2\"\n\t\t\t\t\t\t\t\t\t\t\t>close</schmancy-icon>\n\t\t\t\t\t\t\t\t\t\t</schmancy-button>\n\t\t\t\t\t\t\t\t\t`,\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t`,\n\t\t\t\t\t\t() => html`\n\t\t\t\t\t\t\t<div class=\"text-center py-8\">\n\t\t\t\t\t\t\t\t<schmancy-icon size=\"32px\" class=\"opacity-50 mb-2\">search_off</schmancy-icon>\n\t\t\t\t\t\t\t\t<schmancy-typography type=\"body\" token=\"sm\" class=\"mb-2\">\n\t\t\t\t\t\t\t\t\tNo recipients match \"${this.searchQuery}\"\n\t\t\t\t\t\t\t\t</schmancy-typography>\n\t\t\t\t\t\t\t\t<schmancy-button variant=\"outlined\" @click=${this.clearSearch}>\n\t\t\t\t\t\t\t\t\tClear Search\n\t\t\t\t\t\t\t\t</schmancy-button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t`\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t`, () => html`\n\t\t\t\t<!-- Empty State -->\n\t\t\t\t<div class=\"flex-1 flex items-center justify-center p-8\">\n\t\t\t\t\t<div class=\"text-center space-y-4\">\n\t\t\t\t\t\t<schmancy-icon size=\"48px\" class=\"opacity-30\">mail_outline</schmancy-icon>\n\t\t\t\t\t\t<schmancy-typography type=\"title\" token=\"md\" class=\"mb-2\">\n\t\t\t\t\t\t\t${this.emptyStateTitle}\n\t\t\t\t\t\t</schmancy-typography>\n\t\t\t\t\t\t<schmancy-typography type=\"body\" token=\"sm\">\n\t\t\t\t\t\t\t${this.emptyStateMessage}\n\t\t\t\t\t\t</schmancy-typography>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t`)}\n\n\t\t\t<!-- Drag Overlay -->\n\t\t\t${when(\n\t\t\t\tthis.dragOver && this.enableDragDrop,\n\t\t\t\t() => html`\n\t\t\t\t\t<div \n\t\t\t\t\t\tclass=\"absolute inset-4 flex items-center justify-center border-2 border-dashed border-primary rounded-lg z-10\"\n\t\t\t\t\t\t@dragover=${(e: DragEvent) => {\n\t\t\t\t\t\t\te.preventDefault()\n\t\t\t\t\t\t\tthis.dragOver = true\n\t\t\t\t\t\t}}\n\t\t\t\t\t\t@dragleave=${() => (this.dragOver = false)}\n\t\t\t\t\t\t@drop=${this.handleDrop}\n\t\t\t\t\t>\n\t\t\t\t\t\t<schmancy-surface type=\"solid\" rounded=\"all\" class=\"p-6 text-center\">\n\t\t\t\t\t\t\t<schmancy-icon size=\"48px\" class=\"mb-2\">upload</schmancy-icon>\n\t\t\t\t\t\t\t<schmancy-typography type=\"body\" token=\"md\">\n\t\t\t\t\t\t\t\tDrop CSV file here\n\t\t\t\t\t\t\t</schmancy-typography>\n\t\t\t\t\t\t</schmancy-surface>\n\t\t\t\t\t</div>\n\t\t\t\t`,\n\t\t\t)}\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-email-recipients': SchmancyEmailRecipients\n\t}\n}"],"mappings":"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"}