@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,58 +0,0 @@
1
- import { SchmancyElement } from '@mixins/index'
2
- import { html } from 'lit'
3
- import { customElement } from 'lit/decorators.js'
4
-
5
- /**
6
- * Email layout selector component for choosing email templates
7
- *
8
- * Simple horizontal row of 5 layout options using Schmancy components only.
9
- *
10
- * @fires layout-select - When a layout is selected with {detail: {layout: string}}
11
- */
12
- @customElement('schmancy-email-layout-selector')
13
- export class SchmancyEmailLayoutSelector extends SchmancyElement {
14
-
15
- private layouts = [
16
- { id: 'columns-2', icon: 'view_week', label: '2 Col' },
17
- { id: 'columns-3', icon: 'view_column', label: '3 Col' },
18
- { id: 'sidebar-left', icon: 'view_sidebar', label: 'Left' },
19
- { id: 'sidebar-right', icon: 'view_sidebar', label: 'Right', flipped: true },
20
- { id: 'image-row', icon: 'collections', label: 'Images' }
21
- ]
22
-
23
- private selectLayout(layoutType: string) {
24
- this.dispatchEvent(new CustomEvent('layout-select', {
25
- detail: { layout: layoutType },
26
- bubbles: true,
27
- composed: true
28
- }))
29
- }
30
-
31
- render() {
32
- return html`
33
- <div class="grid p-3 gap-2">
34
- ${this.layouts.map(layout => html`
35
- <schmancy-button
36
- variant="outlined"
37
- @click=${() => this.selectLayout(layout.id)}
38
- >
39
- <schmancy-icon
40
- slot="prefix"
41
- size="20px"
42
- class=${layout.flipped ? 'scale-x-[-1]' : ''}
43
- >
44
- ${layout.icon}
45
- </schmancy-icon>
46
- ${layout.label}
47
- </schmancy-button>
48
- `)}
49
- </div>
50
- `
51
- }
52
- }
53
-
54
- declare global {
55
- interface HTMLElementTagNameMap {
56
- 'schmancy-email-layout-selector': SchmancyEmailLayoutSelector
57
- }
58
- }
@@ -1,599 +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 { $notify } from '../notification'
9
- import type { BoatState, ImportSource } from './types'
10
-
11
- /**
12
- * CSV parser interface (optional dependency)
13
- * Can be provided via global window object or imported
14
- */
15
- interface CSVParser {
16
- parse(csvContent: string, config: any): {
17
- data: any[]
18
- meta: { fields?: string[] }
19
- }
20
- }
21
-
22
- /**
23
- * Email recipients management component with floating boat interface
24
- *
25
- * Features:
26
- * - Floating boat UI that can be minimized/expanded
27
- * - CSV import with drag & drop
28
- * - Multiple import sources (configurable)
29
- * - Bulk selection and management
30
- * - Search and filtering
31
- * - Email validation
32
- *
33
- * @example
34
- * ```html
35
- * <schmancy-email-recipients
36
- * .recipients=${['user1@example.com', 'user2@example.com']}
37
- * @emails-imported=${handleEmailsImported}
38
- * ></schmancy-email-recipients>
39
- * ```
40
- */
41
- @customElement('schmancy-email-recipients')
42
- export class SchmancyEmailRecipients extends SchmancyElement {
43
- static styles = [css`
44
- :host {
45
- display: block;
46
- height: 100%;
47
- }
48
- `]
49
-
50
- /** Disable all interactions */
51
- @property({ type: Boolean }) disabled = false
52
-
53
- /** All available recipients */
54
- @property({ type: Array }) recipients: string[] = []
55
-
56
- /** Sources users can import recipients from (forwarded from parent) */
57
- @property({ type: Array }) importSources: ImportSource[] = []
58
-
59
- /** Currently selected recipients */
60
- @property({ type: Array }) selectedRecipients: string[] = []
61
-
62
-
63
- /** Enable CSV import functionality */
64
- @property({ type: Boolean }) enableCsvImport = true
65
-
66
- /** Enable drag and drop for files */
67
- @property({ type: Boolean }) enableDragDrop = true
68
-
69
- /** Panel title */
70
- @property({ type: String }) title = 'Recipients'
71
-
72
- /** Empty state title */
73
- @property({ type: String }) emptyStateTitle = 'No recipients yet'
74
-
75
- /** Empty state message */
76
- @property({ type: String }) emptyStateMessage = 'Import from sources or upload a CSV'
77
-
78
- /** CSV parser function (optional) */
79
- @property({ type: Object }) csvParser?: CSVParser
80
-
81
- /** Internal state */
82
- @state() private dragOver = false
83
- @state() private localSelectedRecipients: Set<string> = new Set()
84
- @state() private searchQuery = ''
85
- @state() private filteredRecipients: string[] = []
86
- @state() private boatState: BoatState = 'collapsed'
87
-
88
- /** File input reference */
89
- private fileInputRef = createRef<HTMLInputElement>()
90
-
91
- connectedCallback() {
92
- super.connectedCallback()
93
- // Initialize local selection state from prop
94
- this.localSelectedRecipients = new Set(this.selectedRecipients)
95
- // Initialize filtered recipients
96
- this.updateFilteredRecipients()
97
-
98
- // Listen for emails-imported events to ensure UI updates using RxJS
99
- fromEvent(this, 'emails-imported').pipe(
100
- takeUntil(this.disconnecting)
101
- ).subscribe(this.handleEmailsImported as any)
102
- }
103
-
104
- private handleEmailsImported = () => {
105
- // Force update of filtered recipients when emails are imported
106
- this.updateFilteredRecipients()
107
- this.requestUpdate()
108
- }
109
-
110
- updated(changedProperties: Map<string, unknown>) {
111
- super.updated(changedProperties)
112
-
113
- // Sync selection state when selectedRecipients prop changes
114
- if (changedProperties.has('selectedRecipients')) {
115
- this.localSelectedRecipients = new Set(this.selectedRecipients)
116
- }
117
-
118
- // Update filtered recipients when recipients or search changes
119
- if (changedProperties.has('recipients') || changedProperties.has('searchQuery')) {
120
- this.updateFilteredRecipients()
121
- }
122
-
123
- // Force re-render when recipients change (e.g., after import)
124
- if (changedProperties.has('recipients')) {
125
- this.requestUpdate()
126
- }
127
- }
128
-
129
- /** Handle CSV import trigger */
130
- private handleImportFromCSV = () => {
131
- if (!this.enableCsvImport) return
132
- this.fileInputRef.value?.click()
133
- }
134
-
135
- /** Handle file selection */
136
- private handleFileSelect = (event: Event) => {
137
- const input = event.target as HTMLInputElement
138
- const file = input.files?.[0]
139
- if (file) {
140
- this.processCSVFile(file)
141
- }
142
- }
143
-
144
- /** Handle drag and drop */
145
- private handleDrop = (event: DragEvent) => {
146
- if (!this.enableDragDrop) return
147
-
148
- event.preventDefault()
149
- this.dragOver = false
150
-
151
- const file = event.dataTransfer?.files[0]
152
- if (file) {
153
- this.processCSVFile(file)
154
- }
155
- }
156
-
157
- /** Process CSV file */
158
- private processCSVFile = (file: File) => {
159
- if (!file.name.endsWith('.csv')) {
160
- $notify.error('Please select a CSV file')
161
- return
162
- }
163
-
164
- const reader = new FileReader()
165
- reader.addEventListener('load', e => {
166
- const content = (e.target as FileReader | null)?.result as string
167
- try {
168
- const emails = this.parseCSV(content)
169
-
170
- if (emails.length === 0) {
171
- $notify.error('No valid email addresses found in CSV')
172
- return
173
- }
174
-
175
- // Dispatch event with new emails
176
- this.dispatchEvent(new CustomEvent('emails-imported', {
177
- detail: { emails, source: 'csv' },
178
- bubbles: true,
179
- composed: true
180
- }))
181
-
182
- $notify.success(`Imported ${emails.length} emails from CSV file`)
183
- } catch (error) {
184
- $notify.error('Failed to parse CSV file')
185
- console.error('CSV parse error:', error)
186
- }
187
- }, { once: true })
188
- reader.readAsText(file)
189
- }
190
-
191
- /** Parse CSV content */
192
- private parseCSV(csvContent: string): string[] {
193
- const emails: string[] = []
194
-
195
- let parseResult: { data: any[], meta: { fields?: string[] } }
196
-
197
- // Try to use provided parser or fallback to simple parsing
198
- if (this.csvParser) {
199
- parseResult = this.csvParser.parse(csvContent, {
200
- header: true,
201
- skipEmptyLines: true,
202
- dynamicTyping: true,
203
- delimiter: '',
204
- transformHeader: (header: string) => header.trim(),
205
- })
206
- } else {
207
- // Simple CSV parsing fallback
208
- parseResult = this.simpleCSVParse(csvContent)
209
- }
210
-
211
- const data = parseResult.data
212
- const headers = parseResult.meta.fields || []
213
- let emailField = headers.find(h => h.toLowerCase().includes('email'))
214
-
215
- if (!emailField) {
216
- // Try to detect email in first column with valid emails
217
- for (const header of headers) {
218
- const firstValue = data[0]?.[header]?.toString()
219
- if (firstValue && this.isValidEmail(firstValue)) {
220
- emailField = header
221
- break
222
- }
223
- }
224
- }
225
-
226
- if (!emailField) {
227
- throw new Error('No email column found in CSV')
228
- }
229
-
230
- // Extract and validate emails
231
- const emailSet = new Set<string>()
232
- for (const row of data) {
233
- const emailCandidate = row[emailField!]?.toString()
234
- if (!emailCandidate) continue
235
-
236
- const email = emailCandidate.toLowerCase().trim()
237
-
238
- if (this.isValidEmail(email) && !emailSet.has(email)) {
239
- emailSet.add(email)
240
- emails.push(email)
241
- }
242
- }
243
-
244
- return emails
245
- }
246
-
247
- /** Simple CSV parsing fallback */
248
- private simpleCSVParse(csvContent: string): { data: any[], meta: { fields?: string[] } } {
249
- const lines = csvContent.split('\n').filter(line => line.trim())
250
- if (lines.length === 0) {
251
- return { data: [], meta: {} }
252
- }
253
-
254
- // Parse headers
255
- const headers = lines[0].split(',').map(h => h.trim().replace(/"/g, ''))
256
- const data: any[] = []
257
-
258
- // Parse rows
259
- for (let i = 1; i < lines.length; i++) {
260
- const values = lines[i].split(',').map(v => v.trim().replace(/"/g, ''))
261
- const row: any = {}
262
- headers.forEach((header, index) => {
263
- row[header] = values[index] || ''
264
- })
265
- data.push(row)
266
- }
267
-
268
- return { data, meta: { fields: headers } }
269
- }
270
-
271
- /** Validate email format */
272
- private isValidEmail(email: string): boolean {
273
- const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/
274
- return emailRegex.test(email.trim())
275
- }
276
-
277
- /** Toggle recipient selection */
278
- private toggleRecipientSelection = (email: string) => {
279
- if (this.localSelectedRecipients.has(email)) {
280
- this.localSelectedRecipients.delete(email)
281
- } else {
282
- this.localSelectedRecipients.add(email)
283
- }
284
- this.localSelectedRecipients = new Set(this.localSelectedRecipients)
285
- this.dispatchSelectionChange()
286
- }
287
-
288
- /** Select all filtered recipients */
289
- private selectAll = () => {
290
- this.localSelectedRecipients = new Set(this.filteredRecipients)
291
- this.dispatchSelectionChange()
292
- }
293
-
294
- /** Clear all selections */
295
- private selectNone = () => {
296
- this.localSelectedRecipients.clear()
297
- this.localSelectedRecipients = new Set()
298
- this.dispatchSelectionChange()
299
- }
300
-
301
- /** Remove individual recipient */
302
- private removeRecipient = (email: string) => {
303
- this.dispatchEvent(new CustomEvent('recipient-removed', {
304
- detail: { email },
305
- bubbles: true,
306
- composed: true
307
- }))
308
- }
309
-
310
- /** Clear all recipients */
311
- private clearAll = () => {
312
- this.dispatchEvent(new CustomEvent('recipients-cleared', {
313
- bubbles: true,
314
- composed: true
315
- }))
316
- }
317
-
318
- /** Update filtered recipients based on search */
319
- private updateFilteredRecipients = () => {
320
- // Ensure recipients is an array
321
- const recipientsList = Array.isArray(this.recipients) ? this.recipients : []
322
-
323
- if (!this.searchQuery.trim()) {
324
- this.filteredRecipients = [...recipientsList]
325
- } else {
326
- const query = this.searchQuery.toLowerCase()
327
- this.filteredRecipients = recipientsList.filter(email =>
328
- email.toLowerCase().includes(query)
329
- )
330
- }
331
- }
332
-
333
- /** Handle search input */
334
- private handleSearchInput = (event: Event) => {
335
- const input = event.target as HTMLInputElement
336
- this.searchQuery = input.value
337
- }
338
-
339
- /** Clear search query */
340
- private clearSearch = () => {
341
- this.searchQuery = ''
342
- }
343
-
344
- /** Dispatch selection change event */
345
- private dispatchSelectionChange = () => {
346
- this.dispatchEvent(new CustomEvent('selection-changed', {
347
- detail: { selectedEmails: Array.from(this.localSelectedRecipients) },
348
- bubbles: true,
349
- composed: true
350
- }))
351
- }
352
-
353
- /** Handle boat state changes */
354
- private handleBoatStateChange = (event: CustomEvent) => {
355
- this.boatState = event.detail
356
- }
357
-
358
- // Public API methods
359
-
360
- /** Add recipients programmatically */
361
- public addRecipients(emails: string[]) {
362
- if (!emails.length) return
363
-
364
- // Update recipients prop data
365
- const uniqueEmails = [...new Set([...this.recipients, ...emails])]
366
- const newEmails = emails.filter(email => !this.recipients.includes(email))
367
-
368
- // Update internal state
369
- this.recipients = uniqueEmails
370
- this.selectedRecipients = [...new Set([...this.selectedRecipients, ...newEmails])]
371
- this.localSelectedRecipients = new Set(this.selectedRecipients)
372
-
373
- // Force UI update
374
- this.updateFilteredRecipients()
375
- this.requestUpdate()
376
- }
377
-
378
- /** Show boat (collapsed) */
379
- public showBoat() {
380
- this.boatState = 'collapsed'
381
- }
382
-
383
- /** Hide boat (collapse) */
384
- public hideBoat() {
385
- this.boatState = 'collapsed'
386
- }
387
-
388
- /** Expand boat */
389
- public expandBoat() {
390
- this.boatState = 'expanded'
391
- }
392
-
393
- /** Toggle boat state */
394
- public toggleBoat() {
395
- this.boatState = this.boatState === 'collapsed' ? 'expanded' : 'collapsed'
396
- }
397
-
398
- render() {
399
- return this.renderBoatLayout()
400
- }
401
-
402
- /** Render floating boat layout */
403
- private renderBoatLayout() {
404
- return html`
405
- <!-- Hidden file input for CSV import -->
406
- ${when(this.enableCsvImport, () => html`
407
- <input
408
- type="file"
409
- accept=".csv"
410
- ${ref(this.fileInputRef)}
411
- @change=${this.handleFileSelect}
412
- class="hidden"
413
- />
414
- `)}
415
-
416
- <schmancy-boat
417
- .state=${this.boatState}
418
- @change=${this.handleBoatStateChange}
419
- >
420
- <!-- Boat Header -->
421
- <div slot="header" class="flex items-center justify-between w-full px-4 py-2">
422
- <div class="flex items-center gap-3">
423
- <schmancy-icon size="20px">group</schmancy-icon>
424
- <schmancy-typography type="title" token="md" class="font-semibold">
425
- ${this.title}
426
- </schmancy-typography>
427
- ${when(this.recipients.length > 0, () => html`
428
- <schmancy-badge>
429
- ${this.localSelectedRecipients.size}/${this.recipients.length}
430
- </schmancy-badge>
431
- `)}
432
- </div>
433
- </div>
434
-
435
- <!-- Boat Content -->
436
- <div class="h-full flex flex-col max-h-[70vh]">
437
- ${this.renderBoatContent()}
438
- </div>
439
- </schmancy-boat>
440
- `
441
- }
442
-
443
- /** Render boat content */
444
- private renderBoatContent() {
445
- return html`
446
- <!-- Search Bar and CSV Import on one line -->
447
- <div class="p-4 flex gap-3">
448
- <schmancy-input
449
- type="text"
450
- placeholder="Search recipients"
451
- .value=${this.searchQuery}
452
- @input=${this.handleSearchInput}
453
- class="flex-1"
454
- >
455
- ${when(this.searchQuery, () => html`
456
- <schmancy-button
457
- slot="suffix"
458
- variant="text"
459
- @click=${this.clearSearch}
460
- >
461
- <schmancy-icon size="16px">close</schmancy-icon>
462
- </schmancy-button>
463
- `)}
464
- </schmancy-input>
465
-
466
- ${when(this.enableCsvImport, () => html`
467
- <schmancy-button
468
- variant="outlined"
469
- @click=${this.handleImportFromCSV}
470
- ?disabled=${this.disabled}
471
- >
472
- <schmancy-icon slot="prefix" size="16px">upload_file</schmancy-icon>
473
- Import
474
- </schmancy-button>
475
- `)}
476
- </div>
477
-
478
- ${when(this.recipients.length > 0, () => html`
479
- <!-- Bulk Actions -->
480
- <div class="px-4 pb-4">
481
- <div class="flex items-center gap-3">
482
- <schmancy-button
483
- variant="outlined"
484
- @click=${this.selectAll}
485
- ?disabled=${this.localSelectedRecipients.size === this.filteredRecipients.length}
486
- >
487
- <schmancy-icon slot="prefix" size="14px">select_all</schmancy-icon>
488
- Select All
489
- </schmancy-button>
490
-
491
- <schmancy-button
492
- variant="outlined"
493
- @click=${this.selectNone}
494
- ?disabled=${this.localSelectedRecipients.size === 0}
495
- >
496
- <schmancy-icon slot="prefix" size="14px">deselect</schmancy-icon>
497
- Clear Selection
498
- </schmancy-button>
499
-
500
- <div class="flex-1"></div>
501
-
502
- <schmancy-button variant="text" @click=${this.clearAll}>
503
- <schmancy-icon slot="prefix" size="14px">delete_forever</schmancy-icon>
504
- Clear All
505
- </schmancy-button>
506
- </div>
507
- </div>
508
-
509
- <!-- Recipients List -->
510
- <div class="flex-1 overflow-y-auto px-4 pb-4">
511
- ${when(
512
- this.filteredRecipients.length > 0,
513
- () => html`
514
- <div class="flex flex-wrap gap-3">
515
- ${repeat(
516
- this.filteredRecipients,
517
- email => email,
518
- email => html`
519
- <schmancy-button
520
- variant=${this.localSelectedRecipients.has(email) ? 'filled' : 'outlined'}
521
- @click=${(e:Event) => {
522
- e.stopPropagation()
523
- e.preventDefault()
524
- this.toggleRecipientSelection(email)}}
525
- class="cursor-pointer flex items-center gap-2"
526
- >
527
- <span class="truncate flex-1 text-left">${email}</span>
528
- <schmancy-icon
529
- @click=${(e: Event) => {
530
- e.stopPropagation()
531
- this.removeRecipient(email)
532
- }}
533
- size="16px"
534
- class="ml-2"
535
- >close</schmancy-icon>
536
- </schmancy-button>
537
- `,
538
- )}
539
- </div>
540
- `,
541
- () => html`
542
- <div class="text-center py-8">
543
- <schmancy-icon size="32px" class="opacity-50 mb-2">search_off</schmancy-icon>
544
- <schmancy-typography type="body" token="sm" class="mb-2">
545
- No recipients match "${this.searchQuery}"
546
- </schmancy-typography>
547
- <schmancy-button variant="outlined" @click=${this.clearSearch}>
548
- Clear Search
549
- </schmancy-button>
550
- </div>
551
- `
552
- )}
553
- </div>
554
- `, () => html`
555
- <!-- Empty State -->
556
- <div class="flex-1 flex items-center justify-center p-8">
557
- <div class="text-center space-y-4">
558
- <schmancy-icon size="48px" class="opacity-30">mail_outline</schmancy-icon>
559
- <schmancy-typography type="title" token="md" class="mb-2">
560
- ${this.emptyStateTitle}
561
- </schmancy-typography>
562
- <schmancy-typography type="body" token="sm">
563
- ${this.emptyStateMessage}
564
- </schmancy-typography>
565
- </div>
566
- </div>
567
- `)}
568
-
569
- <!-- Drag Overlay -->
570
- ${when(
571
- this.dragOver && this.enableDragDrop,
572
- () => html`
573
- <div
574
- class="absolute inset-4 flex items-center justify-center border-2 border-dashed border-primary rounded-lg z-10"
575
- @dragover=${(e: DragEvent) => {
576
- e.preventDefault()
577
- this.dragOver = true
578
- }}
579
- @dragleave=${() => (this.dragOver = false)}
580
- @drop=${this.handleDrop}
581
- >
582
- <schmancy-surface type="solid" rounded="all" class="p-6 text-center">
583
- <schmancy-icon size="48px" class="mb-2">upload</schmancy-icon>
584
- <schmancy-typography type="body" token="md">
585
- Drop CSV file here
586
- </schmancy-typography>
587
- </schmancy-surface>
588
- </div>
589
- `,
590
- )}
591
- `
592
- }
593
- }
594
-
595
- declare global {
596
- interface HTMLElementTagNameMap {
597
- 'schmancy-email-recipients': SchmancyEmailRecipients
598
- }
599
- }