@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,1077 +0,0 @@
1
- import { SchmancyElement } from '@mixins/index'
2
- import { css, html } from 'lit'
3
- import { customElement, property, state } from 'lit/decorators.js'
4
- import { createRef, ref } from 'lit/directives/ref.js'
5
- import { repeat } from 'lit/directives/repeat.js'
6
- import { when } from 'lit/directives/when.js'
7
- import { fromEvent, takeUntil } from 'rxjs'
8
- import { $dialog } from '../dialog'
9
- import { $notify } from '../notification'
10
- import { sheet } from '../sheet/sheet.service'
11
- import './email-layout-selector'
12
- import SchmancyTextarea from '../textarea/textarea'
13
- import { SchmancyEmailTemplatePicker } from './email-template-picker'
14
- import type { EmailAttachment, EmailComposeConfig, EmailTemplate } from './types'
15
-
16
- /**
17
- * Email editor component with rich text formatting and file attachments
18
- *
19
- * Features:
20
- * - Markdown formatting toolbar
21
- * - Image upload and insertion
22
- * - File attachments with drag & drop
23
- * - Layout templates (columns, sidebars, image rows)
24
- * - Real-time character/word count
25
- *
26
- * @example
27
- * ```html
28
- * <schmancy-email-editor
29
- * .subject="Welcome to our service"
30
- * .body="Email content..."
31
- * @editor-change=${handleChange}
32
- * ></schmancy-email-editor>
33
- * ```
34
- */
35
- @customElement('schmancy-email-editor')
36
- export class SchmancyEmailEditor extends SchmancyElement {
37
- static styles = [css`
38
- :host {
39
- display: block;
40
- height: 100%;
41
- }
42
- `]
43
-
44
- /** Email subject */
45
- @property({ type: String }) subject = ''
46
-
47
- /** Email body content (markdown) */
48
- @property({ type: String }) body = ''
49
-
50
-
51
- /** Disable all interactions */
52
- @property({ type: Boolean }) disabled = false
53
-
54
- /** Email attachments */
55
- @property({ type: Array }) attachments: EmailAttachment[] = []
56
-
57
- /** Configuration for upload handlers */
58
- @property({ type: Object }) config: EmailComposeConfig = {}
59
-
60
- /** Available email templates */
61
- @property({ type: Array }) templates: EmailTemplate[] = this.getDefaultTemplates()
62
-
63
- /** Internal state */
64
- @state() private dragOver = false
65
- @state() private isUploading = false
66
-
67
- /** Element references */
68
- private subjectInputRef = createRef<HTMLInputElement>()
69
- private bodyTextAreaRef = createRef<SchmancyTextarea>()
70
- private fileInputRef = createRef<HTMLInputElement>()
71
- private imageInputRef = createRef<HTMLInputElement>()
72
-
73
- connectedCallback() {
74
- super.connectedCallback()
75
- this.addEventListeners()
76
- }
77
-
78
- disconnectedCallback() {
79
- super.disconnectedCallback()
80
- // Event listeners are automatically cleaned up via takeUntil(this.disconnecting)
81
- }
82
-
83
- /** Get default email templates */
84
- private getDefaultTemplates(): EmailTemplate[] {
85
- return [
86
- {
87
- id: 'welcome',
88
- name: 'Welcome Email',
89
- subject: 'Welcome to Our Community! 🌟',
90
- description: 'A warm welcome message for new users',
91
- category: 'onboarding',
92
- body: `# Welcome to Our Community!
93
-
94
- We're thrilled to have you on board. Thank you for joining us on this journey.
95
-
96
- ## What's Next?
97
-
98
- * **Explore** your dashboard and discover all the features
99
- * **Connect** with other community members
100
- * **Get support** whenever you need it - we're here to help
101
-
102
- ---
103
-
104
- *Need assistance? Simply reply to this email and we'll get back to you within 24 hours.*
105
-
106
- Best regards,
107
- The Team`
108
- },
109
- {
110
- id: 'newsletter',
111
- name: 'Newsletter',
112
- subject: 'Weekly Insights & Updates',
113
- description: 'Regular newsletter template with updates and insights',
114
- category: 'communication',
115
- body: `# This Week's Highlights
116
-
117
- ## Featured Story
118
-
119
- **[Article Title]**
120
- Brief description of the main story or update that you want to highlight this week.
121
-
122
- [Read More](https://example.com)
123
-
124
- ## Quick Updates
125
-
126
- * **Update 1**: Brief description of an important update
127
- * **Update 2**: Another noteworthy development
128
- * **Update 3**: Additional news worth sharing
129
-
130
- ## Upcoming Events
131
-
132
- **[Event Name]** - *Date*
133
- Short description of the upcoming event.
134
-
135
- ---
136
-
137
- *Thanks for reading! Forward this to a friend who might enjoy it.*
138
-
139
- Until next week,
140
- The Team`
141
- },
142
- {
143
- id: 'product-launch',
144
- name: 'Product Launch',
145
- subject: 'Introducing Our Latest Innovation 🚀',
146
- description: 'Announce new products or features',
147
- category: 'marketing',
148
- body: `# Something Amazing is Here
149
-
150
- We've been working hard behind the scenes, and today we're excited to introduce our latest creation.
151
-
152
- ## Key Features
153
-
154
- * **Feature 1**: Benefit that matters to your users
155
- * **Feature 2**: Another compelling capability
156
- * **Feature 3**: The feature that sets you apart
157
-
158
- ## Early Access
159
-
160
- As a valued member, you get **exclusive early access** starting today.
161
-
162
- [Get Started Now](https://example.com)
163
-
164
- ---
165
-
166
- *Questions? We'd love to hear from you. Just hit reply!*
167
-
168
- Best,
169
- The Product Team`
170
- },
171
- {
172
- id: 'event-invitation',
173
- name: 'Event Invitation',
174
- subject: 'You\'re Invited: [Event Name]',
175
- description: 'Professional event invitation template',
176
- category: 'events',
177
- body: `# You're Invited!
178
-
179
- ## [Event Name]
180
-
181
- **When**: [Date & Time]
182
- **Where**: [Location or Virtual Link]
183
- **Duration**: [Duration]
184
-
185
- Join us for an exclusive gathering where we'll explore [brief event description].
186
-
187
- ## What to Expect
188
-
189
- * **Networking** with industry professionals
190
- * **Insights** from leading experts
191
- * **Interactive** sessions and discussions
192
-
193
- ## RSVP Required
194
-
195
- Space is limited, so please confirm your attendance by [RSVP Date].
196
-
197
- [Confirm Attendance](https://example.com)
198
-
199
- ---
200
-
201
- *Can't make it? Let us know and we'll share the key highlights with you.*
202
-
203
- Looking forward to seeing you there,
204
- The Events Team`
205
- },
206
- {
207
- id: 'thank-you',
208
- name: 'Thank You',
209
- subject: 'Thank You - It Means Everything',
210
- description: 'Express gratitude to customers or supporters',
211
- category: 'appreciation',
212
- body: `# Thank You
213
-
214
- Your support means the world to us.
215
-
216
- Whether you've been with us from the beginning or just joined our community, we want you to know how much we appreciate you.
217
-
218
- ## Because of You
219
-
220
- * We've been able to improve our service
221
- * Our community has grown stronger
222
- * We've achieved milestones we never thought possible
223
-
224
- ## What's Next
225
-
226
- We're committed to continuing to earn your trust and providing even more value in the coming months.
227
-
228
- ---
229
-
230
- *Your feedback shapes everything we do. Reply anytime with thoughts or suggestions.*
231
-
232
- With genuine gratitude,
233
- The Team`
234
- },
235
- {
236
- id: 'feedback-request',
237
- name: 'Feedback Request',
238
- subject: 'Your Opinion Matters - 2 Minutes?',
239
- description: 'Request feedback or reviews from users',
240
- category: 'feedback',
241
- body: `# We'd Love Your Feedback
242
-
243
- Your experience matters to us, and we're always looking for ways to improve.
244
-
245
- ## Quick Favor?
246
-
247
- Could you spare **2 minutes** to share your thoughts? Your honest feedback helps us serve you better.
248
-
249
- [Share Your Feedback](https://example.com)
250
-
251
- ## What We're Asking
252
-
253
- * How has your experience been so far?
254
- * What's working well for you?
255
- * What could we improve?
256
-
257
- ## Thank You Gift
258
-
259
- As a small token of appreciation, everyone who completes our feedback form receives [incentive].
260
-
261
- ---
262
-
263
- *Every response is read personally by our team. We take your input seriously.*
264
-
265
- Thanks in advance,
266
- The Team`
267
- },
268
- {
269
- id: 'password-reset',
270
- name: 'Password Reset',
271
- subject: 'Reset Your Password - Action Required',
272
- description: 'Secure password reset instructions',
273
- category: 'security',
274
- body: `# Password Reset Request
275
-
276
- We received a request to reset the password for your account.
277
-
278
- ## Reset Your Password
279
-
280
- Click the button below to create a new password. This link will expire in **24 hours** for your security.
281
-
282
- [Reset Password](https://example.com/reset)
283
-
284
- ## Didn't Request This?
285
-
286
- If you didn't request a password reset, please ignore this email. Your account remains secure.
287
-
288
- ## Need Help?
289
-
290
- If you're having trouble with the reset process, contact our support team and we'll assist you right away.
291
-
292
- ---
293
-
294
- *For security reasons, this link can only be used once and expires in 24 hours.*
295
-
296
- Best regards,
297
- Security Team`
298
- },
299
- {
300
- id: 'order-confirmation',
301
- name: 'Order Confirmation',
302
- subject: 'Order Confirmed - #[ORDER-NUMBER]',
303
- description: 'Professional order confirmation template',
304
- category: 'commerce',
305
- body: `# Order Confirmation
306
-
307
- Thanks for your order! We've received your payment and are preparing your items for shipment.
308
-
309
- ## Order Details
310
-
311
- **Order Number**: #[ORDER-NUMBER]
312
- **Order Date**: [DATE]
313
- **Total**: $[AMOUNT]
314
-
315
- ## Items Ordered
316
-
317
- * **[Item 1]** - Quantity: [QTY] - $[PRICE]
318
- * **[Item 2]** - Quantity: [QTY] - $[PRICE]
319
-
320
- ## Shipping Information
321
-
322
- **Address**: [SHIPPING ADDRESS]
323
- **Method**: [SHIPPING METHOD]
324
- **Estimated Delivery**: [DELIVERY DATE]
325
-
326
- ## Next Steps
327
-
328
- You'll receive a tracking number via email once your order ships (usually within 1-2 business days).
329
-
330
- [Track Your Order](https://example.com/track)
331
-
332
- ---
333
-
334
- *Questions about your order? Reply to this email or contact our support team.*
335
-
336
- Thank you for your business,
337
- The Fulfillment Team`
338
- }
339
- ]
340
- }
341
-
342
- private addEventListeners() {
343
- // Keyboard events
344
- fromEvent(this, 'keydown').pipe(
345
- takeUntil(this.disconnecting)
346
- ).subscribe(this.handleKeyDown)
347
-
348
- // Document paste events
349
- fromEvent(document, 'paste').pipe(
350
- takeUntil(this.disconnecting)
351
- ).subscribe(this.handlePaste)
352
-
353
- // Document drag events
354
- fromEvent(document, 'dragenter').pipe(
355
- takeUntil(this.disconnecting)
356
- ).subscribe(this.handleDragEnter)
357
-
358
- fromEvent(document, 'dragleave').pipe(
359
- takeUntil(this.disconnecting)
360
- ).subscribe(this.handleDocumentDragLeave)
361
-
362
- fromEvent(document, 'drop').pipe(
363
- takeUntil(this.disconnecting)
364
- ).subscribe(this.handleDocumentDrop)
365
- }
366
-
367
- /** Handle keyboard shortcuts and tab indentation */
368
- private handleKeyDown = (e: KeyboardEvent) => {
369
- if (this.disabled) return
370
-
371
- // Tab key inserts 2 spaces instead of changing focus
372
- const textarea = this.bodyTextAreaRef.value?.shadowRoot?.querySelector('textarea')
373
- if (e.key === 'Tab' && e.target === textarea) {
374
- e.preventDefault()
375
- this.insertAtCursor(' ')
376
- }
377
- }
378
-
379
- /** Handle paste events for image pasting */
380
- private handlePaste = (event: ClipboardEvent) => {
381
- const textarea = this.bodyTextAreaRef.value?.shadowRoot?.querySelector('textarea')
382
- if (this.disabled || document.activeElement !== textarea) return
383
-
384
- const items = event.clipboardData?.items
385
- if (!items) return
386
-
387
- for (let i = 0; i < items.length; i++) {
388
- const item = items[i]
389
- if (item.type.indexOf('image') !== -1) {
390
- event.preventDefault()
391
- const file = item.getAsFile()
392
- if (file) {
393
- this.uploadImage(file)
394
- }
395
- break
396
- }
397
- }
398
- }
399
-
400
- /** Handle subject input changes */
401
- private handleSubjectChange = (event: Event) => {
402
- const input = event.target as HTMLInputElement
403
- this.subject = input.value
404
- this.dispatchChange()
405
- }
406
-
407
- /** Handle body textarea changes */
408
- private handleBodyChange = (event: CustomEvent<{ value: string }>) => {
409
- this.body = event.detail.value
410
- this.dispatchChange()
411
- }
412
-
413
- /** Dispatch composer change event */
414
- private dispatchChange = () => {
415
- this.dispatchEvent(new CustomEvent('editor-change', {
416
- detail: {
417
- subject: this.subject,
418
- body: this.body,
419
- attachments: this.attachments
420
- },
421
- bubbles: true,
422
- composed: true
423
- }))
424
- }
425
-
426
- /** Insert text at cursor position */
427
- private insertAtCursor(text: string, selectText?: string) {
428
- if (!this.bodyTextAreaRef.value) return
429
-
430
- // For schmancy-textarea, access the internal textarea
431
- const textarea = this.bodyTextAreaRef.value.shadowRoot?.querySelector('textarea')
432
- if (!textarea) return
433
-
434
- const start = textarea.selectionStart
435
- const end = textarea.selectionEnd
436
-
437
- const newValue =
438
- textarea.value.substring(0, start) +
439
- text +
440
- textarea.value.substring(end)
441
-
442
- this.body = newValue
443
- this.dispatchChange()
444
-
445
- this.updateComplete.then(() => {
446
- const updatedTextarea = this.bodyTextAreaRef.value?.shadowRoot?.querySelector('textarea')
447
- if (updatedTextarea) {
448
- updatedTextarea.focus()
449
- if (selectText) {
450
- const selectStart = start + text.indexOf(selectText)
451
- const selectEnd = selectStart + selectText.length
452
- updatedTextarea.setSelectionRange(selectStart, selectEnd)
453
- } else {
454
- updatedTextarea.setSelectionRange(start + text.length, start + text.length)
455
- }
456
- }
457
- return
458
- })
459
- }
460
-
461
- /** Wrap selected text with formatting */
462
- private wrapSelection(before: string, after: string, placeholder: string) {
463
- if (!this.bodyTextAreaRef.value) return
464
-
465
- // For schmancy-textarea, access the internal textarea
466
- const textarea = this.bodyTextAreaRef.value.shadowRoot?.querySelector('textarea')
467
- if (!textarea) return
468
-
469
- const start = textarea.selectionStart
470
- const end = textarea.selectionEnd
471
- const selectedText = textarea.value.substring(start, end)
472
-
473
- const textToWrap = selectedText || placeholder
474
- const newText = before + textToWrap + after
475
-
476
- const newValue =
477
- textarea.value.substring(0, start) +
478
- newText +
479
- textarea.value.substring(end)
480
-
481
- this.body = newValue
482
- this.dispatchChange()
483
-
484
- this.updateComplete.then(() => {
485
- const updatedTextarea = this.bodyTextAreaRef.value?.shadowRoot?.querySelector('textarea')
486
- if (updatedTextarea) {
487
- updatedTextarea.focus()
488
- if (!selectedText) {
489
- // Select the placeholder text
490
- updatedTextarea.setSelectionRange(start + before.length, start + before.length + placeholder.length)
491
- } else {
492
- // Position cursor at the end
493
- updatedTextarea.setSelectionRange(start + newText.length, start + newText.length)
494
- }
495
- }
496
- return
497
- })
498
- }
499
-
500
- /** Open layout selection dialog */
501
- private openLayoutDialog = () => {
502
- $dialog.component(html`
503
- <schmancy-email-layout-selector
504
- @layout-select=${(e: CustomEvent) => {
505
- this.applyLayout(e.detail.layout)
506
- $dialog.close()
507
- }}
508
- ></schmancy-email-layout-selector>
509
- `)
510
- }
511
-
512
- /** Open template picker */
513
- private openTemplatePicker = () => {
514
- const picker = new SchmancyEmailTemplatePicker()
515
- picker.templates = this.templates
516
-
517
- // Listen for template selection using RxJS
518
- fromEvent(picker, 'template-selected').pipe(
519
- takeUntil(this.disconnecting)
520
- ).subscribe(this.handleTemplateSelected)
521
-
522
- sheet.open({
523
- component: picker
524
- })
525
- }
526
-
527
- /** Handle template selection */
528
- private handleTemplateSelected = (e: CustomEvent) => {
529
- const template: EmailTemplate = e.detail
530
- this.subject = template.subject
531
- this.body = template.body
532
- this.dispatchChange()
533
- $notify.success(`Template "${template.name}" applied successfully`)
534
- }
535
-
536
- /** Apply layout template to content */
537
- private applyLayout = (layoutType: string) => {
538
- const layouts: Record<string, string> = {
539
- 'columns-2': `
540
- :::layout columns-2
541
- <div class="column">
542
- ![Left Photo](https://via.placeholder.com/400x300?text=Replace+with+your+photo){height=300px}
543
-
544
- **Photo Title**
545
-
546
- Replace the placeholder image above with your own photo. The height=300px ensures both images have equal height while width adjusts automatically.
547
- </div>
548
-
549
- <div class="column">
550
- ![Right Photo](https://via.placeholder.com/400x300?text=Replace+with+your+photo){height=300px}
551
-
552
- **Photo Title**
553
-
554
- Use the same height value (300px) for both images to keep them aligned perfectly side by side.
555
- </div>
556
- :::
557
- `,
558
- 'columns-3': `
559
- :::layout columns-3
560
- <div class="column">
561
- ![Photo 1](https://via.placeholder.com/300x200?text=Photo+1){height=200px}
562
-
563
- **Item Title**
564
-
565
- Brief description or caption for this item.
566
- </div>
567
-
568
- <div class="column">
569
- ![Photo 2](https://via.placeholder.com/300x200?text=Photo+2){height=200px}
570
-
571
- **Item Title**
572
-
573
- Brief description or caption for this item.
574
- </div>
575
-
576
- <div class="column">
577
- ![Photo 3](https://via.placeholder.com/300x200?text=Photo+3){height=200px}
578
-
579
- **Item Title**
580
-
581
- Brief description or caption for this item.
582
- </div>
583
- :::
584
- `,
585
- 'sidebar-left': `
586
- :::layout sidebar-left
587
- <div class="sidebar">
588
- **Sidebar Content**
589
-
590
- * Navigation item 1
591
- * Navigation item 2
592
- * Navigation item 3
593
- </div>
594
-
595
- <div class="main">
596
- **Main Content Area**
597
-
598
- Your primary content goes here. This area takes up most of the width while the sidebar provides supplementary information or navigation.
599
- </div>
600
- :::
601
- `,
602
- 'sidebar-right': `
603
- :::layout sidebar-right
604
- <div class="main">
605
- **Main Content Area**
606
-
607
- Your primary content goes here. This area takes up most of the width while the sidebar provides supplementary information or navigation.
608
- </div>
609
-
610
- <div class="sidebar">
611
- **Sidebar Content**
612
-
613
- * Quick links
614
- * Related info
615
- * Contact details
616
- </div>
617
- :::
618
- `,
619
- 'image-row': `
620
- :::layout image-row
621
- <div class="image">
622
- ![Gallery Image 1](https://via.placeholder.com/400x250?text=Gallery+Image+1){height=250px}
623
- </div>
624
-
625
- <div class="image">
626
- ![Gallery Image 2](https://via.placeholder.com/400x250?text=Gallery+Image+2){height=250px}
627
- </div>
628
-
629
- <div class="image">
630
- ![Gallery Image 3](https://via.placeholder.com/400x250?text=Gallery+Image+3){height=250px}
631
- </div>
632
- :::
633
- `
634
- }
635
-
636
- const layoutMarkdown = layouts[layoutType]
637
- if (layoutMarkdown) {
638
- this.insertAtCursor(layoutMarkdown)
639
- }
640
- }
641
-
642
- /** Upload image with configurable handler */
643
- private uploadImage = async (file: File) => {
644
- if (!file.type.startsWith('image/')) {
645
- $notify.error(`File "${file.name}" is not an image`)
646
- return
647
- }
648
-
649
- // Check file size (max 10MB for images)
650
- const maxSize = 10 * 1024 * 1024
651
- if (file.size > maxSize) {
652
- $notify.error(`Image "${file.name}" is too large. Maximum size is 10MB.`)
653
- return
654
- }
655
-
656
- // Show loading state
657
- this.isUploading = true
658
-
659
- try {
660
- let url: string
661
-
662
- if (this.config.imageUploadHandler) {
663
- // Use custom upload handler
664
- url = await this.config.imageUploadHandler(file)
665
- } else if (this.config.uploadHandler) {
666
- // Use generic upload handler
667
- url = await this.config.uploadHandler(file)
668
- } else {
669
- // Fallback to data URL for preview
670
- url = await this.createDataUrl(file)
671
- $notify.warning('No upload handler configured. Using local preview.')
672
- }
673
-
674
- // Get image dimensions
675
- const dimensions = await this.getImageDimensions(file)
676
-
677
- // Insert markdown at cursor position
678
- this.insertImageMarkdown(url, file.name, dimensions.width, dimensions.height)
679
-
680
- $notify.success('Image uploaded successfully')
681
- } catch (error) {
682
- console.error('Upload failed:', error)
683
- $notify.error('Failed to upload image')
684
- } finally {
685
- this.isUploading = false
686
- }
687
- }
688
-
689
- /** Create data URL for local preview */
690
- private createDataUrl = (file: File): Promise<string> => {
691
- return new Promise((resolve, reject) => {
692
- const reader = new FileReader()
693
- reader.addEventListener('load', () => resolve(reader.result as string), { once: true })
694
- reader.addEventListener('error', () => reject(reader.error), { once: true })
695
- reader.readAsDataURL(file)
696
- })
697
- }
698
-
699
- /** Get image dimensions */
700
- private getImageDimensions = (file: File): Promise<{width: number, height: number}> => {
701
- return new Promise((resolve) => {
702
- const img = new Image()
703
- img.addEventListener('load', () => {
704
- resolve({ width: img.width, height: img.height })
705
- URL.revokeObjectURL(img.src)
706
- }, { once: true })
707
- img.addEventListener('error', () => {
708
- resolve({ width: 400, height: 300 }) // Default dimensions
709
- URL.revokeObjectURL(img.src)
710
- }, { once: true })
711
- img.src = URL.createObjectURL(file)
712
- })
713
- }
714
-
715
- /** Insert image markdown at cursor */
716
- private insertImageMarkdown = (url: string, alt: string, width: number, _height: number) => {
717
- const textarea = this.bodyTextAreaRef.value?.shadowRoot?.querySelector('textarea')
718
- if (!textarea) return
719
-
720
- const markdown = `![${alt}](${url}){width=${Math.min(width, 600)}px height=auto}`
721
-
722
- const start = textarea.selectionStart
723
- const end = textarea.selectionEnd
724
- const newValue =
725
- this.body.substring(0, start) +
726
- markdown +
727
- this.body.substring(end)
728
-
729
- this.body = newValue
730
- this.dispatchChange()
731
-
732
- // Set cursor after inserted markdown
733
- this.updateComplete.then(() => {
734
- const updatedTextarea = this.bodyTextAreaRef.value?.shadowRoot?.querySelector('textarea')
735
- if (updatedTextarea) {
736
- const newPosition = start + markdown.length
737
- updatedTextarea.setSelectionRange(newPosition, newPosition)
738
- updatedTextarea.focus()
739
- }
740
- return
741
- })
742
- }
743
-
744
-
745
- /** Handle file input changes */
746
- private handleFileChange = (event: Event) => {
747
- const input = event.target as HTMLInputElement
748
- const files = input.files
749
- if (files) {
750
- for (let i = 0; i < files.length; i++) {
751
- const file = files[i]
752
- if (file.type.startsWith('image/')) {
753
- this.uploadImage(file)
754
- } else {
755
- this.addFile(file)
756
- }
757
- }
758
- }
759
- input.value = ''
760
- }
761
-
762
- /** Handle image selection */
763
- private handleImageSelect = (event: Event) => {
764
- const input = event.target as HTMLInputElement
765
- const file = input.files?.[0]
766
- if (file && file.type.startsWith('image/')) {
767
- this.uploadImage(file)
768
- }
769
- input.value = '' // Reset for next selection
770
- }
771
-
772
- /** Drag and drop handlers */
773
- private handleDrop = (event: DragEvent) => {
774
- event.preventDefault()
775
- this.dragOver = false
776
-
777
- const files = event.dataTransfer?.files
778
- if (files) {
779
- for (let i = 0; i < files.length; i++) {
780
- const file = files[i]
781
- if (file.type.startsWith('image/')) {
782
- this.uploadImage(file)
783
- } else {
784
- this.addFile(file)
785
- }
786
- }
787
- }
788
- }
789
-
790
- private handleDragEnter = (event: DragEvent) => {
791
- event.preventDefault()
792
- this.dragOver = true
793
- }
794
-
795
- private handleDocumentDragLeave = (event: DragEvent) => {
796
- event.preventDefault()
797
- this.dragOver = false
798
- }
799
-
800
- private handleDocumentDrop = (event: DragEvent) => {
801
- event.preventDefault()
802
- this.dragOver = false
803
- }
804
-
805
- private handleDragOver = (event: DragEvent) => {
806
- event.preventDefault()
807
- }
808
-
809
- private handleDragLeave = (event: DragEvent) => {
810
- event.preventDefault()
811
- // Let document handler manage this
812
- }
813
-
814
- /** Add file as attachment */
815
- private addFile = (file: File) => {
816
- // Check file size (max 10MB)
817
- const maxSize = 10 * 1024 * 1024
818
- if (file.size > maxSize) {
819
- $notify.error(`File "${file.name}" is too large. Maximum size is 10MB.`)
820
- return
821
- }
822
-
823
- // Check if file already exists
824
- const exists = this.attachments.some(att =>
825
- att.name === file.name && att.size === file.size
826
- )
827
- if (exists) {
828
- $notify.warning(`File "${file.name}" is already attached.`)
829
- return
830
- }
831
-
832
- const attachment: EmailAttachment = {
833
- id: crypto.randomUUID(),
834
- file,
835
- name: file.name,
836
- size: file.size,
837
- type: file.type || 'application/octet-stream'
838
- }
839
-
840
- this.attachments = [...this.attachments, attachment]
841
- this.dispatchChange()
842
- }
843
-
844
- /** Remove attachment */
845
- private removeAttachment = (attachmentId: string) => {
846
- this.attachments = this.attachments.filter(att => att.id !== attachmentId)
847
- this.dispatchChange()
848
- }
849
-
850
-
851
- render() {
852
- return html`
853
- <schmancy-surface
854
- type="solid"
855
- rounded="all"
856
- class=${this.classMap({
857
- 'border-2 border-dashed border-primary': this.dragOver,
858
- 'h-full flex flex-col': true
859
- })}
860
- @drop=${this.handleDrop}
861
- @dragover=${this.handleDragOver}
862
- @dragleave=${this.handleDragLeave}
863
- >
864
- <div class="flex flex-col h-full gap-4">
865
-
866
- <!-- Header Section with Subject -->
867
- <div class="shrink-0 p-4 pb-0 space-y-4">
868
- <!-- Subject Field -->
869
- <div class="space-y-2">
870
- <schmancy-typography type="label" token="md">
871
- Subject *
872
- </schmancy-typography>
873
- <schmancy-input
874
- ${ref(this.subjectInputRef)}
875
- .value=${this.subject}
876
- @input=${this.handleSubjectChange}
877
- placeholder="Enter email subject..."
878
- .disabled=${this.disabled}
879
- class="w-full"
880
- ></schmancy-input>
881
- </div>
882
- </div>
883
-
884
- <!-- Formatting Toolbar -->
885
- <div class="shrink-0 px-4">
886
- <schmancy-surface type="subtle" rounded="all" class="p-3">
887
- <div class="flex flex-wrap gap-2 items-center">
888
- <!-- Text Formatting Group -->
889
- <div class="flex gap-1">
890
- <schmancy-icon-button
891
- size="sm"
892
- variant="text"
893
- title="Bold"
894
- ?disabled=${this.disabled}
895
- @click=${() => this.wrapSelection('**', '**', 'bold text')}
896
- >
897
- <schmancy-icon>format_bold</schmancy-icon>
898
- </schmancy-icon-button>
899
- <schmancy-icon-button
900
- size="sm"
901
- variant="text"
902
- title="Italic"
903
- ?disabled=${this.disabled}
904
- @click=${() => this.wrapSelection('*', '*', 'italic text')}
905
- >
906
- <schmancy-icon>format_italic</schmancy-icon>
907
- </schmancy-icon-button>
908
- <schmancy-icon-button
909
- size="sm"
910
- variant="text"
911
- title="Link"
912
- ?disabled=${this.disabled}
913
- @click=${() => this.insertAtCursor('[link text](https://example.com)', 'link text')}
914
- >
915
- <schmancy-icon>link</schmancy-icon>
916
- </schmancy-icon-button>
917
- </div>
918
-
919
- <!-- Divider -->
920
- <div class="h-6 w-px bg-outline-variant"></div>
921
-
922
- <!-- Structure Formatting Group -->
923
- <div class="flex gap-1">
924
- <schmancy-icon-button
925
- size="sm"
926
- variant="text"
927
- title="Heading"
928
- ?disabled=${this.disabled}
929
- @click=${() => this.insertAtCursor('\n# Heading\n', 'Heading')}
930
- >
931
- <schmancy-icon>title</schmancy-icon>
932
- </schmancy-icon-button>
933
- <schmancy-icon-button
934
- size="sm"
935
- variant="text"
936
- title="Bullet List"
937
- ?disabled=${this.disabled}
938
- @click=${() => this.insertAtCursor('\n* List item\n', 'List item')}
939
- >
940
- <schmancy-icon>format_list_bulleted</schmancy-icon>
941
- </schmancy-icon-button>
942
- </div>
943
-
944
- <!-- Divider -->
945
- <div class="h-6 w-px bg-outline-variant"></div>
946
-
947
- <!-- Media and Layout Group -->
948
- <div class="flex gap-1">
949
- <schmancy-icon-button
950
- size="sm"
951
- variant="text"
952
- title="Insert Image"
953
- ?disabled=${this.disabled || this.isUploading}
954
- @click=${() => this.imageInputRef.value?.click()}
955
- >
956
- ${when(this.isUploading,
957
- () => html`<schmancy-progress size="sm" class="w-4 h-4"></schmancy-progress>`,
958
- () => html`<schmancy-icon>image</schmancy-icon>`
959
- )}
960
- </schmancy-icon-button>
961
- <schmancy-icon-button
962
- size="sm"
963
- variant="text"
964
- title="Insert Layout"
965
- ?disabled=${this.disabled}
966
- @click=${this.openLayoutDialog}
967
- >
968
- <schmancy-icon>mobile_layout</schmancy-icon>
969
- </schmancy-icon-button>
970
- <schmancy-icon-button
971
- size="sm"
972
- variant="text"
973
- title="Use Template"
974
- ?disabled=${this.disabled || this.templates.length === 0}
975
- @click=${this.openTemplatePicker}
976
- >
977
- <schmancy-icon>description</schmancy-icon>
978
- </schmancy-icon-button>
979
- </div>
980
- </div>
981
- </schmancy-surface>
982
- </div>
983
-
984
- <!-- Textarea Container - Takes remaining space -->
985
- <div class="flex-1 px-4 relative min-h-0">
986
- <schmancy-textarea
987
- ${ref(this.bodyTextAreaRef)}
988
- .value=${this.body}
989
- @change=${this.handleBodyChange}
990
- placeholder="Enter your email message here...
991
-
992
- Use the toolbar buttons above for formatting, or type markdown directly:
993
- **bold**, *italic*, [link](url), ![image](url)
994
-
995
- Drag & drop images or press Ctrl+V to paste from clipboard.
996
- Tab key inserts 2 spaces for better formatting."
997
- .disabled=${this.disabled}
998
- .required=${true}
999
- .rows=${4}
1000
- class="w-full font-mono text-sm"
1001
- ></schmancy-textarea>
1002
-
1003
- <!-- Upload Progress Overlay -->
1004
- ${when(this.isUploading, () => html`
1005
- <div class="absolute top-3 right-3 z-10">
1006
- <schmancy-surface type="subtle" rounded="all" class="p-2">
1007
- <div class="flex items-center gap-2">
1008
- <schmancy-progress size="sm" class="w-4 h-4"></schmancy-progress>
1009
- <schmancy-typography type="body" token="xs">Uploading...</schmancy-typography>
1010
- </div>
1011
- </schmancy-surface>
1012
- </div>
1013
- `)}
1014
- </div>
1015
-
1016
- <!-- Footer Section -->
1017
- <div class="shrink-0 p-4 pt-0 space-y-2">
1018
- <!-- Character/Word Counter -->
1019
- <div class="text-center">
1020
- <schmancy-typography type="body" token="xs">
1021
- ${this.body.length} characters • ${this.body.trim() ? this.body.trim().split(/\s+/).length : 0} words
1022
- </schmancy-typography>
1023
- </div>
1024
-
1025
- <!-- Attachments Display (if any) -->
1026
- ${when(this.attachments.length > 0, () => html`
1027
- <div class="space-y-2">
1028
- <schmancy-typography type="label" token="sm" class="flex items-center gap-2">
1029
- <schmancy-icon size="16px">attach_file</schmancy-icon>
1030
- Attachments (${this.attachments.length})
1031
- </schmancy-typography>
1032
- <div class="flex flex-wrap gap-2">
1033
- ${repeat(this.attachments, att => att.id, (attachment) => html`
1034
- <schmancy-chip class="text-xs">
1035
- <span class="truncate max-w-32">${attachment.name}</span>
1036
- <button
1037
- @click=${() => this.removeAttachment(attachment.id)}
1038
- class="ml-2 text-error hover:text-error-container"
1039
- title="Remove attachment"
1040
- >
1041
- <schmancy-icon size="14px">close</schmancy-icon>
1042
- </button>
1043
- </schmancy-chip>
1044
- `)}
1045
- </div>
1046
- </div>
1047
- `)}
1048
- </div>
1049
-
1050
- <!-- Hidden File Inputs -->
1051
- <div class="hidden">
1052
- <input
1053
- ${ref(this.fileInputRef)}
1054
- type="file"
1055
- multiple
1056
- @change=${this.handleFileChange}
1057
- >
1058
- <input
1059
- ${ref(this.imageInputRef)}
1060
- type="file"
1061
- accept="image/*"
1062
- @change=${this.handleImageSelect}
1063
- >
1064
- </div>
1065
-
1066
- </div>
1067
- </schmancy-surface>
1068
-
1069
- `
1070
- }
1071
- }
1072
-
1073
- declare global {
1074
- interface HTMLElementTagNameMap {
1075
- 'schmancy-email-editor': SchmancyEmailEditor
1076
- }
1077
- }