@mhmo91/schmancy 0.10.5 → 0.10.7

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 (445) hide show
  1. package/README.md +11 -0
  2. package/custom-elements.json +235 -1807
  3. package/dist/agent/{flow-CaPi2G8y.js.map → flow-CvG1fLW5.js.map} +1 -1
  4. package/dist/agent/schmancy.agent.js +5347 -12408
  5. package/dist/agent/schmancy.agent.js.map +1 -1
  6. package/dist/agent/schmancy.manifest.json +70 -1068
  7. package/dist/agent/{vendor-material-color-Be96dpGE.js.map → vendor-material-color-DcL7ZPxx.js.map} +1 -1
  8. package/dist/{area-CSQdhCBF.cjs → area-8IBAXzbC.cjs} +1 -1
  9. package/dist/{area-CSQdhCBF.cjs.map → area-8IBAXzbC.cjs.map} +1 -1
  10. package/dist/{area-D5haQE-J.js → area-DSW_LYXQ.js} +1 -1
  11. package/dist/{area-D5haQE-J.js.map → area-DSW_LYXQ.js.map} +1 -1
  12. package/dist/area.cjs +1 -1
  13. package/dist/area.js +1 -1
  14. package/dist/{autocomplete-B_bJXUjm.cjs → autocomplete-9PLjlFYt.cjs} +1 -1
  15. package/dist/{autocomplete-B_bJXUjm.cjs.map → autocomplete-9PLjlFYt.cjs.map} +1 -1
  16. package/dist/{autocomplete-DtyjZJ1E.js → autocomplete-CXwwmUbC.js} +2 -2
  17. package/dist/{autocomplete-DtyjZJ1E.js.map → autocomplete-CXwwmUbC.js.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-BJLCp-Hv.cjs → boat-CpGNeWav.cjs} +1 -1
  25. package/dist/{boat-BJLCp-Hv.cjs.map → boat-CpGNeWav.cjs.map} +1 -1
  26. package/dist/{boat-MT8bRT8u.js → boat-Dwn5oXd8.js} +1 -1
  27. package/dist/{boat-MT8bRT8u.js.map → boat-Dwn5oXd8.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-DSF2E-zy.cjs → busy-CUUgvimY.cjs} +1 -1
  33. package/dist/{busy-DSF2E-zy.cjs.map → busy-CUUgvimY.cjs.map} +1 -1
  34. package/dist/{busy-6BqWGryX.js → busy-Cjm1BYVC.js} +1 -1
  35. package/dist/{busy-6BqWGryX.js.map → busy-Cjm1BYVC.js.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 +1 -1
  40. package/dist/{card-CvuVha-W.js → card-BR22oYCL.js} +1 -1
  41. package/dist/{card-CvuVha-W.js.map → card-BR22oYCL.js.map} +1 -1
  42. package/dist/{card-DnKnaHzf.cjs → card-BjZ_WRr3.cjs} +1 -1
  43. package/dist/{card-DnKnaHzf.cjs.map → card-BjZ_WRr3.cjs.map} +1 -1
  44. package/dist/card.cjs +1 -1
  45. package/dist/card.js +1 -1
  46. package/dist/{checkbox-D3u8Wm9r.cjs → checkbox-2e8v7CNg.cjs} +1 -1
  47. package/dist/{checkbox-D3u8Wm9r.cjs.map → checkbox-2e8v7CNg.cjs.map} +1 -1
  48. package/dist/{checkbox-QDRsE8cp.js → checkbox-CsADwyfu.js} +1 -1
  49. package/dist/{checkbox-QDRsE8cp.js.map → checkbox-CsADwyfu.js.map} +1 -1
  50. package/dist/checkbox.cjs +1 -1
  51. package/dist/checkbox.js +1 -1
  52. package/dist/{chips-Dy9vx8JS.js → chips-C9HwVbGT.js} +2 -2
  53. package/dist/{chips-Dy9vx8JS.js.map → chips-C9HwVbGT.js.map} +1 -1
  54. package/dist/{chips-CMoQzop1.cjs → chips-DPCcO55o.cjs} +1 -1
  55. package/dist/{chips-CMoQzop1.cjs.map → chips-DPCcO55o.cjs.map} +1 -1
  56. package/dist/chips.cjs +1 -1
  57. package/dist/chips.js +2 -2
  58. package/dist/connectivity.cjs +1 -1
  59. package/dist/connectivity.js +1 -1
  60. package/dist/content-drawer.cjs +1 -1
  61. package/dist/content-drawer.js +1 -1
  62. package/dist/{date-range-B2NuihKA.cjs → date-range-63-FC7gD.cjs} +1 -1
  63. package/dist/{date-range-B2NuihKA.cjs.map → date-range-63-FC7gD.cjs.map} +1 -1
  64. package/dist/{date-range-Boesjlic.js → date-range-CFaP-8Os.js} +2 -2
  65. package/dist/{date-range-Boesjlic.js.map → date-range-CFaP-8Os.js.map} +1 -1
  66. package/dist/{date-range-inline-DBuND2pc.js → date-range-inline-BCuK_XCv.js} +1 -1
  67. package/dist/{date-range-inline-DBuND2pc.js.map → date-range-inline-BCuK_XCv.js.map} +1 -1
  68. package/dist/{date-range-inline-BI6_4Ahl.cjs → date-range-inline-Cpdqd-8B.cjs} +1 -1
  69. package/dist/{date-range-inline-BI6_4Ahl.cjs.map → date-range-inline-Cpdqd-8B.cjs.map} +1 -1
  70. package/dist/date-range-inline.cjs +1 -1
  71. package/dist/date-range-inline.js +1 -1
  72. package/dist/date-range.cjs +1 -1
  73. package/dist/date-range.js +1 -1
  74. package/dist/delay.cjs +1 -1
  75. package/dist/delay.js +2 -2
  76. package/dist/{details-BrGrUTGC.js → details-0dOlqHHL.js} +1 -1
  77. package/dist/{details-BrGrUTGC.js.map → details-0dOlqHHL.js.map} +1 -1
  78. package/dist/{details-BRs_z5-k.cjs → details-qKikJIyH.cjs} +1 -1
  79. package/dist/{details-BRs_z5-k.cjs.map → details-qKikJIyH.cjs.map} +1 -1
  80. package/dist/details.cjs +1 -1
  81. package/dist/details.js +1 -1
  82. package/dist/{divider-W3TiDasp.js → divider-BxkIl0H1.js} +1 -1
  83. package/dist/{divider-W3TiDasp.js.map → divider-BxkIl0H1.js.map} +1 -1
  84. package/dist/{divider-BOxQ2T9h.cjs → divider-CX9mmWZ8.cjs} +1 -1
  85. package/dist/{divider-BOxQ2T9h.cjs.map → divider-CX9mmWZ8.cjs.map} +1 -1
  86. package/dist/divider.cjs +1 -1
  87. package/dist/divider.js +1 -1
  88. package/dist/dropdown.cjs +1 -1
  89. package/dist/dropdown.js +1 -1
  90. package/dist/{expand-CnccBF91.cjs → expand-891JuQuN.cjs} +1 -1
  91. package/dist/{expand-CnccBF91.cjs.map → expand-891JuQuN.cjs.map} +1 -1
  92. package/dist/{expand-Pu8fZ0jZ.js → expand-BeAx94MP.js} +2 -2
  93. package/dist/{expand-Pu8fZ0jZ.js.map → expand-BeAx94MP.js.map} +1 -1
  94. package/dist/expand.cjs +1 -1
  95. package/dist/expand.js +1 -1
  96. package/dist/{float-WCVdp3um.js → float-BPF2WO4L.js} +1 -1
  97. package/dist/{float-WCVdp3um.js.map → float-BPF2WO4L.js.map} +1 -1
  98. package/dist/{float-BRKa-P6Z.cjs → float-D7vvODxx.cjs} +1 -1
  99. package/dist/{float-BRKa-P6Z.cjs.map → float-D7vvODxx.cjs.map} +1 -1
  100. package/dist/float.cjs +1 -1
  101. package/dist/float.js +1 -1
  102. package/dist/{form-CI59gad4.js.map → form-CFvwnfuJ.js.map} +1 -1
  103. package/dist/{form-B2qudx_q.cjs.map → form-Ceijw1aA.cjs.map} +1 -1
  104. package/dist/form.cjs +1 -1
  105. package/dist/form.js +1 -1
  106. package/dist/handover/agent-runtime-followups.md +1 -1
  107. package/dist/handover/agent-runtime-v1.md +3 -3
  108. package/dist/{hashContent-a8uVr3xs.js.map → hashContent-BU6jl5ih.js.map} +1 -1
  109. package/dist/{hashContent-ejkBgDnN.cjs.map → hashContent-Bobsobip.cjs.map} +1 -1
  110. package/dist/{icons-C0ufCcdp.js → icons-BKxW_7QR.js} +1 -1
  111. package/dist/{icons-C0ufCcdp.js.map → icons-BKxW_7QR.js.map} +1 -1
  112. package/dist/{icons-DXEbmg-O.cjs → icons-QSdo-8h9.cjs} +1 -1
  113. package/dist/{icons-DXEbmg-O.cjs.map → icons-QSdo-8h9.cjs.map} +1 -1
  114. package/dist/icons.cjs +1 -1
  115. package/dist/icons.js +1 -1
  116. package/dist/{iframe-c9lGxw7x.js → iframe-BxvbhyTS.js} +1 -1
  117. package/dist/{iframe-c9lGxw7x.js.map → iframe-BxvbhyTS.js.map} +1 -1
  118. package/dist/{iframe-C6RVODkW.cjs → iframe-CMKV-bm8.cjs} +1 -1
  119. package/dist/{iframe-C6RVODkW.cjs.map → iframe-CMKV-bm8.cjs.map} +1 -1
  120. package/dist/iframe.cjs +1 -1
  121. package/dist/iframe.js +1 -1
  122. package/dist/index.cjs +1 -1
  123. package/dist/index.js +64 -72
  124. package/dist/{input-B4HM-9-H.cjs → input-BFhJU74_.cjs} +1 -1
  125. package/dist/{input-B4HM-9-H.cjs.map → input-BFhJU74_.cjs.map} +1 -1
  126. package/dist/{input-Pmj_bH37.js → input-DIqaR8Mr.js} +1 -1
  127. package/dist/{input-Pmj_bH37.js.map → input-DIqaR8Mr.js.map} +1 -1
  128. package/dist/{input-chip-BIGgd_7w.js → input-chip-D9tlSk_2.js} +1 -1
  129. package/dist/{input-chip-BIGgd_7w.js.map → input-chip-D9tlSk_2.js.map} +1 -1
  130. package/dist/{input-chip-BoDisY6c.cjs → input-chip-w09qTt7J.cjs} +1 -1
  131. package/dist/{input-chip-BoDisY6c.cjs.map → input-chip-w09qTt7J.cjs.map} +1 -1
  132. package/dist/input.cjs +1 -1
  133. package/dist/input.js +1 -1
  134. package/dist/json.cjs +1 -1
  135. package/dist/json.js +2 -2
  136. package/dist/kbd.cjs +1 -1
  137. package/dist/kbd.js +1 -1
  138. package/dist/layout.cjs +1 -1
  139. package/dist/layout.js +1 -1
  140. package/dist/{lightbox-DK1vDKm3.cjs → lightbox-CK035jsx.cjs} +1 -1
  141. package/dist/{lightbox-DK1vDKm3.cjs.map → lightbox-CK035jsx.cjs.map} +1 -1
  142. package/dist/{lightbox-K1eJTYXP.js → lightbox-GChmL3Ff.js} +2 -2
  143. package/dist/{lightbox-K1eJTYXP.js.map → lightbox-GChmL3Ff.js.map} +1 -1
  144. package/dist/lightbox.cjs +1 -1
  145. package/dist/lightbox.js +1 -1
  146. package/dist/{list-CEuVqAxN.cjs → list-B3P37zlH.cjs} +1 -1
  147. package/dist/{list-CEuVqAxN.cjs.map → list-B3P37zlH.cjs.map} +1 -1
  148. package/dist/{list-Ds0Nv1y5.js → list-J-Fz24Z1.js} +1 -1
  149. package/dist/{list-Ds0Nv1y5.js.map → list-J-Fz24Z1.js.map} +1 -1
  150. package/dist/list.cjs +1 -1
  151. package/dist/list.js +1 -1
  152. package/dist/{menu-Bly30Nje.cjs → menu-BnFd8CwU.cjs} +1 -1
  153. package/dist/{menu-Bly30Nje.cjs.map → menu-BnFd8CwU.cjs.map} +1 -1
  154. package/dist/{menu-L8MK1ma5.js → menu-DHTlUwXS.js} +2 -2
  155. package/dist/{menu-L8MK1ma5.js.map → menu-DHTlUwXS.js.map} +1 -1
  156. package/dist/menu.cjs +1 -1
  157. package/dist/menu.js +1 -1
  158. package/dist/mixins-47_CZk7q.cjs +298 -0
  159. package/dist/{mixins-CAb0b03r.cjs.map → mixins-47_CZk7q.cjs.map} +1 -1
  160. package/dist/mixins-PBJJGiiP.js +627 -0
  161. package/dist/{mixins-B34UxxCe.js.map → mixins-PBJJGiiP.js.map} +1 -1
  162. package/dist/mixins.cjs +1 -1
  163. package/dist/mixins.js +1 -1
  164. package/dist/nav-drawer.cjs +1 -1
  165. package/dist/nav-drawer.js +1 -1
  166. package/dist/navigation-bar.cjs +1 -1
  167. package/dist/navigation-bar.js +1 -1
  168. package/dist/navigation-rail.cjs +1 -1
  169. package/dist/navigation-rail.js +1 -1
  170. package/dist/{notification-7fSbk8hm.cjs → notification-B6YBL0hx.cjs} +1 -1
  171. package/dist/{notification-7fSbk8hm.cjs.map → notification-B6YBL0hx.cjs.map} +1 -1
  172. package/dist/{notification-DB25M-qo.js → notification-C-5Bv3vj.js} +2 -2
  173. package/dist/{notification-DB25M-qo.js.map → notification-C-5Bv3vj.js.map} +1 -1
  174. package/dist/notification.cjs +1 -1
  175. package/dist/notification.js +1 -1
  176. package/dist/{option-DDHa25k5.js → option-B7q6VXCu.js} +1 -1
  177. package/dist/{option-DDHa25k5.js.map → option-B7q6VXCu.js.map} +1 -1
  178. package/dist/{option-HF9Xqbuq.cjs → option-DVQRa3nr.cjs} +1 -1
  179. package/dist/{option-HF9Xqbuq.cjs.map → option-DVQRa3nr.cjs.map} +1 -1
  180. package/dist/option.cjs +1 -1
  181. package/dist/option.js +1 -1
  182. package/dist/{overlay-stack-CCiTaf_C.js.map → overlay-stack-DCDS17uj.js.map} +1 -1
  183. package/dist/{overlay-stack-CFGiYf34.cjs.map → overlay-stack-DPIe_aYv.cjs.map} +1 -1
  184. package/dist/overlay.cjs +1 -1
  185. package/dist/{overlay.confirm-body-BDG94R0x.js → overlay.confirm-body-CAY5xK1n.js} +1 -1
  186. package/dist/{overlay.confirm-body-BDG94R0x.js.map → overlay.confirm-body-CAY5xK1n.js.map} +1 -1
  187. package/dist/{overlay.confirm-body-b4Nx_OVf.cjs → overlay.confirm-body-XZtErofy.cjs} +1 -1
  188. package/dist/{overlay.confirm-body-b4Nx_OVf.cjs.map → overlay.confirm-body-XZtErofy.cjs.map} +1 -1
  189. package/dist/overlay.js +3 -3
  190. package/dist/{overlay.service-BUCuZa6V.js → overlay.service-BZE_lwKO.js} +2 -2
  191. package/dist/{overlay.service-BUCuZa6V.js.map → overlay.service-BZE_lwKO.js.map} +1 -1
  192. package/dist/{overlay.service-CRHZZY9F.cjs → overlay.service-Oyjrw831.cjs} +1 -1
  193. package/dist/{overlay.service-CRHZZY9F.cjs.map → overlay.service-Oyjrw831.cjs.map} +1 -1
  194. package/dist/page.cjs +1 -1
  195. package/dist/page.js +2 -2
  196. package/dist/{progress-CqOyMM4i.js → progress-BHXLYs9i.js} +1 -1
  197. package/dist/{progress-CqOyMM4i.js.map → progress-BHXLYs9i.js.map} +1 -1
  198. package/dist/{progress-54R4QRgW.cjs → progress-D99bumkC.cjs} +1 -1
  199. package/dist/{progress-54R4QRgW.cjs.map → progress-D99bumkC.cjs.map} +1 -1
  200. package/dist/progress.cjs +1 -1
  201. package/dist/progress.js +1 -1
  202. package/dist/{radio-group-B4zbBIZF.js → radio-group-BYra5_q1.js} +1 -1
  203. package/dist/{radio-group-B4zbBIZF.js.map → radio-group-BYra5_q1.js.map} +1 -1
  204. package/dist/{radio-group-BJqZpYVy.cjs → radio-group-DYsycLmD.cjs} +1 -1
  205. package/dist/{radio-group-BJqZpYVy.cjs.map → radio-group-DYsycLmD.cjs.map} +1 -1
  206. package/dist/radio-group.cjs +1 -1
  207. package/dist/radio-group.js +1 -1
  208. package/dist/range.cjs +1 -1
  209. package/dist/range.js +1 -1
  210. package/dist/{rxjs-utils-BXpvHN4-.js.map → rxjs-utils-CVeJQ9KG.js.map} +1 -1
  211. package/dist/{rxjs-utils-CaC-tdot.cjs.map → rxjs-utils-DCUHg_Ml.cjs.map} +1 -1
  212. package/dist/rxjs-utils.cjs +1 -1
  213. package/dist/rxjs-utils.js +1 -1
  214. package/dist/{scroll-CYm6Krus.js → scroll-TqNWZ0lo.js} +1 -1
  215. package/dist/{scroll-CYm6Krus.js.map → scroll-TqNWZ0lo.js.map} +1 -1
  216. package/dist/{scroll-iSRovYYt.cjs → scroll-cayCBOrq.cjs} +1 -1
  217. package/dist/{scroll-iSRovYYt.cjs.map → scroll-cayCBOrq.cjs.map} +1 -1
  218. package/dist/{select-DiQHtQJN.cjs → select-CRdSmlLq.cjs} +1 -1
  219. package/dist/{select-DiQHtQJN.cjs.map → select-CRdSmlLq.cjs.map} +1 -1
  220. package/dist/{select-1WHseXP6.js → select-nzq0qFlF.js} +2 -2
  221. package/dist/{select-1WHseXP6.js.map → select-nzq0qFlF.js.map} +1 -1
  222. package/dist/select.cjs +1 -1
  223. package/dist/select.js +1 -1
  224. package/dist/skeleton.cjs +1 -1
  225. package/dist/skeleton.js +1 -1
  226. package/dist/skills/INDEX.md +9 -6
  227. package/dist/skills/schmancy/INDEX.md +9 -6
  228. package/dist/slider.cjs +1 -1
  229. package/dist/slider.js +1 -1
  230. package/dist/{splash-screen-BwvtKMdN.js → splash-screen-BJeIiJ_e.js} +1 -1
  231. package/dist/{splash-screen-BwvtKMdN.js.map → splash-screen-BJeIiJ_e.js.map} +1 -1
  232. package/dist/{splash-screen-CJL8DGDe.cjs → splash-screen-BMLQXzDq.cjs} +1 -1
  233. package/dist/{splash-screen-CJL8DGDe.cjs.map → splash-screen-BMLQXzDq.cjs.map} +1 -1
  234. package/dist/splash-screen.cjs +1 -1
  235. package/dist/splash-screen.js +1 -1
  236. package/dist/{src-Bwr2NR0A.cjs → src-DE11tq2Q.cjs} +1 -1
  237. package/dist/{src-Bwr2NR0A.cjs.map → src-DE11tq2Q.cjs.map} +1 -1
  238. package/dist/{src-UaZeROcW.js → src-qvWlNoMO.js} +34 -42
  239. package/dist/{src-UaZeROcW.js.map → src-qvWlNoMO.js.map} +1 -1
  240. package/dist/steps.cjs +1 -1
  241. package/dist/steps.js +1 -1
  242. package/dist/{surface-DE5iuI8e.cjs → surface-D426MFLR.cjs} +1 -1
  243. package/dist/{surface-DE5iuI8e.cjs.map → surface-D426MFLR.cjs.map} +1 -1
  244. package/dist/{surface-DPUkQ3OL.js → surface-DG7Cmm9V.js} +1 -1
  245. package/dist/{surface-DPUkQ3OL.js.map → surface-DG7Cmm9V.js.map} +1 -1
  246. package/dist/surface.cjs +1 -1
  247. package/dist/surface.js +1 -1
  248. package/dist/switch.cjs +1 -1
  249. package/dist/switch.js +1 -1
  250. package/dist/table.cjs +1 -1
  251. package/dist/table.js +1 -1
  252. package/dist/{tabs-B2XEQPQl.js → tabs-B7siJkM5.js} +1 -1
  253. package/dist/{tabs-B2XEQPQl.js.map → tabs-B7siJkM5.js.map} +1 -1
  254. package/dist/{tabs-CsDQ72Qk.cjs → tabs-t3nMfg1F.cjs} +1 -1
  255. package/dist/{tabs-CsDQ72Qk.cjs.map → tabs-t3nMfg1F.cjs.map} +1 -1
  256. package/dist/tabs.cjs +1 -1
  257. package/dist/tabs.js +1 -1
  258. package/dist/teleport.cjs +1 -1
  259. package/dist/teleport.js +1 -1
  260. package/dist/{textarea-C_ps0lL-.js → textarea-DSxHCCle.js} +1 -1
  261. package/dist/{textarea-C_ps0lL-.js.map → textarea-DSxHCCle.js.map} +1 -1
  262. package/dist/{textarea-aeAP9cDG.cjs → textarea-o9vysorM.cjs} +1 -1
  263. package/dist/{textarea-aeAP9cDG.cjs.map → textarea-o9vysorM.cjs.map} +1 -1
  264. package/dist/textarea.cjs +1 -1
  265. package/dist/textarea.js +1 -1
  266. package/dist/{theme-DAYTVw13.cjs → theme-Ce9eIP05.cjs} +1 -1
  267. package/dist/{theme-DAYTVw13.cjs.map → theme-Ce9eIP05.cjs.map} +1 -1
  268. package/dist/{theme-DAx1iRNr.js → theme-XO3nHDbW.js} +2 -2
  269. package/dist/{theme-DAx1iRNr.js.map → theme-XO3nHDbW.js.map} +1 -1
  270. package/dist/{theme-button-BrHkzCtj.js → theme-button-DNutDO1j.js} +1 -1
  271. package/dist/{theme-button-BrHkzCtj.js.map → theme-button-DNutDO1j.js.map} +1 -1
  272. package/dist/{theme-button-LsMKY_N_.cjs → theme-button-H7PRz_bg.cjs} +1 -1
  273. package/dist/{theme-button-LsMKY_N_.cjs.map → theme-button-H7PRz_bg.cjs.map} +1 -1
  274. package/dist/theme-button.cjs +1 -1
  275. package/dist/theme-button.js +1 -1
  276. package/dist/theme.cjs +1 -1
  277. package/dist/{theme.interface-C_034TxG.js.map → theme.interface-B9TjbSBF.js.map} +1 -1
  278. package/dist/{theme.interface-DESopuZS.cjs.map → theme.interface-BujperTo.cjs.map} +1 -1
  279. package/dist/theme.js +3 -3
  280. package/dist/tree.cjs +1 -1
  281. package/dist/tree.js +1 -1
  282. package/dist/typography.cjs +1 -1
  283. package/dist/typography.js +1 -1
  284. package/dist/{utils-oLBkMvor.cjs → utils-Dt5PpmaQ.cjs} +1 -1
  285. package/dist/{utils-oLBkMvor.cjs.map → utils-Dt5PpmaQ.cjs.map} +1 -1
  286. package/dist/{utils-BzFQfaIr.js → utils-kND2Z9Xg.js} +1 -1
  287. package/dist/{utils-BzFQfaIr.js.map → utils-kND2Z9Xg.js.map} +1 -1
  288. package/dist/utils.cjs +1 -1
  289. package/dist/utils.js +2 -2
  290. package/dist/visually-hidden.cjs +1 -1
  291. package/dist/visually-hidden.js +1 -1
  292. package/dist/{window-BJrKS6Zr.cjs → window-BaoSwgGE.cjs} +1 -1
  293. package/dist/{window-BJrKS6Zr.cjs.map → window-BaoSwgGE.cjs.map} +1 -1
  294. package/dist/{window-CyDuTN80.js → window-KnLWhQ3S.js} +2 -2
  295. package/dist/{window-CyDuTN80.js.map → window-KnLWhQ3S.js.map} +1 -1
  296. package/dist/window.cjs +1 -1
  297. package/dist/window.js +1 -1
  298. package/package.json +4 -5
  299. package/skills/schmancy/INDEX.md +9 -6
  300. package/src/index.ts +0 -8
  301. package/types/src/index.d.ts +0 -8
  302. package/dist/agent/vendor-highlight-CHJZQQB7.js +0 -2178
  303. package/dist/agent/vendor-highlight-CHJZQQB7.js.map +0 -1
  304. package/dist/agent/vendor-jsqr-r7GNh4P3.js +0 -10212
  305. package/dist/agent/vendor-jsqr-r7GNh4P3.js.map +0 -1
  306. package/dist/charts.cjs +0 -112
  307. package/dist/charts.cjs.map +0 -1
  308. package/dist/charts.js +0 -374
  309. package/dist/charts.js.map +0 -1
  310. package/dist/code-highlight-Ddp0oZnm.cjs +0 -190
  311. package/dist/code-highlight-Ddp0oZnm.cjs.map +0 -1
  312. package/dist/code-highlight-DtE2-ObF.js +0 -296
  313. package/dist/code-highlight-DtE2-ObF.js.map +0 -1
  314. package/dist/code-highlight.cjs +0 -1
  315. package/dist/code-highlight.js +0 -2
  316. package/dist/extra-B8IPs6gG.cjs +0 -31
  317. package/dist/extra-B8IPs6gG.cjs.map +0 -1
  318. package/dist/extra-DxEWs41z.js +0 -3440
  319. package/dist/extra-DxEWs41z.js.map +0 -1
  320. package/dist/extra.cjs +0 -1
  321. package/dist/extra.js +0 -2
  322. package/dist/mailbox-CDWqbVvZ.cjs +0 -1140
  323. package/dist/mailbox-CDWqbVvZ.cjs.map +0 -1
  324. package/dist/mailbox-DD2How0H.js +0 -1607
  325. package/dist/mailbox-DD2How0H.js.map +0 -1
  326. package/dist/mailbox.cjs +0 -1
  327. package/dist/mailbox.js +0 -2
  328. package/dist/map-1uwxxvBa.js +0 -208
  329. package/dist/map-1uwxxvBa.js.map +0 -1
  330. package/dist/map-BrBSrIqg.cjs +0 -80
  331. package/dist/map-BrBSrIqg.cjs.map +0 -1
  332. package/dist/map.cjs +0 -1
  333. package/dist/map.js +0 -2
  334. package/dist/mixins-B34UxxCe.js +0 -627
  335. package/dist/mixins-CAb0b03r.cjs +0 -298
  336. package/dist/payment-card-form-C4jb-OdM.js +0 -729
  337. package/dist/payment-card-form-C4jb-OdM.js.map +0 -1
  338. package/dist/payment-card-form-WEx4CscR.cjs +0 -73
  339. package/dist/payment-card-form-WEx4CscR.cjs.map +0 -1
  340. package/dist/payment-card-form.cjs +0 -1
  341. package/dist/payment-card-form.js +0 -2
  342. package/dist/qr-scanner.cjs +0 -35
  343. package/dist/qr-scanner.cjs.map +0 -1
  344. package/dist/qr-scanner.js +0 -123
  345. package/dist/qr-scanner.js.map +0 -1
  346. package/dist/skills/charts.md +0 -93
  347. package/dist/skills/code-highlight.md +0 -47
  348. package/dist/skills/extra.md +0 -59
  349. package/dist/skills/mailbox.md +0 -102
  350. package/dist/skills/map.md +0 -55
  351. package/dist/skills/qr-scanner.md +0 -51
  352. package/dist/skills/schmancy/charts.md +0 -93
  353. package/dist/skills/schmancy/code-highlight.md +0 -47
  354. package/dist/skills/schmancy/extra.md +0 -59
  355. package/dist/skills/schmancy/mailbox.md +0 -102
  356. package/dist/skills/schmancy/map.md +0 -55
  357. package/dist/skills/schmancy/qr-scanner.md +0 -51
  358. package/dist/skills/schmancy/timeline-tile.md +0 -95
  359. package/dist/skills/timeline-tile.md +0 -95
  360. package/dist/timeline.cjs +0 -277
  361. package/dist/timeline.cjs.map +0 -1
  362. package/dist/timeline.js +0 -326
  363. package/dist/timeline.js.map +0 -1
  364. package/skills/schmancy/charts.md +0 -93
  365. package/skills/schmancy/code-highlight.md +0 -47
  366. package/skills/schmancy/extra.md +0 -59
  367. package/skills/schmancy/mailbox.md +0 -102
  368. package/skills/schmancy/map.md +0 -55
  369. package/skills/schmancy/qr-scanner.md +0 -51
  370. package/skills/schmancy/timeline-tile.md +0 -95
  371. package/src/charts/area-chart.ts +0 -498
  372. package/src/charts/index.ts +0 -4
  373. package/src/charts/pills.ts +0 -352
  374. package/src/charts/types.ts +0 -66
  375. package/src/charts/utils.ts +0 -65
  376. package/src/code-highlight/code-highlight.ts +0 -345
  377. package/src/code-highlight/code-preview.ts +0 -125
  378. package/src/code-highlight/index.ts +0 -3
  379. package/src/extra/countries/countries.data.ts +0 -196
  380. package/src/extra/countries/countries.ts +0 -109
  381. package/src/extra/countries/index.ts +0 -2
  382. package/src/extra/index.ts +0 -2
  383. package/src/extra/timezone/index.ts +0 -2
  384. package/src/extra/timezone/timezone.ts +0 -118
  385. package/src/extra/timezone/timezones.data.ts +0 -2546
  386. package/src/mailbox/README.md +0 -128
  387. package/src/mailbox/email-editor.ts +0 -1076
  388. package/src/mailbox/email-layout-selector.ts +0 -58
  389. package/src/mailbox/email-recipients.ts +0 -599
  390. package/src/mailbox/email-template-picker.ts +0 -303
  391. package/src/mailbox/email-viewer.ts +0 -717
  392. package/src/mailbox/index.ts +0 -31
  393. package/src/mailbox/mailbox.ts +0 -364
  394. package/src/mailbox/types.ts +0 -180
  395. package/src/map/index.ts +0 -1
  396. package/src/map/map.ts +0 -485
  397. package/src/payment-card-form/index.ts +0 -1
  398. package/src/payment-card-form/payment-card-form.ts +0 -331
  399. package/src/qr-scanner/index.ts +0 -1
  400. package/src/qr-scanner/qr-scanner.ts +0 -242
  401. package/src/timeline/index.ts +0 -1
  402. package/src/timeline/timeline-tile.ts +0 -431
  403. package/types/src/charts/area-chart.d.ts +0 -58
  404. package/types/src/charts/index.d.ts +0 -4
  405. package/types/src/charts/pills.d.ts +0 -51
  406. package/types/src/charts/types.d.ts +0 -62
  407. package/types/src/charts/utils.d.ts +0 -28
  408. package/types/src/code-highlight/code-highlight.d.ts +0 -49
  409. package/types/src/code-highlight/code-preview.d.ts +0 -30
  410. package/types/src/code-highlight/index.d.ts +0 -3
  411. package/types/src/extra/countries/countries.d.ts +0 -26
  412. package/types/src/extra/countries/countries.data.d.ts +0 -5
  413. package/types/src/extra/countries/index.d.ts +0 -2
  414. package/types/src/extra/index.d.ts +0 -2
  415. package/types/src/extra/timezone/index.d.ts +0 -2
  416. package/types/src/extra/timezone/timezone.d.ts +0 -34
  417. package/types/src/extra/timezone/timezones.data.d.ts +0 -7
  418. package/types/src/mailbox/email-editor.d.ts +0 -101
  419. package/types/src/mailbox/email-layout-selector.d.ts +0 -18
  420. package/types/src/mailbox/email-recipients.d.ts +0 -122
  421. package/types/src/mailbox/email-template-picker.d.ts +0 -54
  422. package/types/src/mailbox/email-viewer.d.ts +0 -86
  423. package/types/src/mailbox/index.d.ts +0 -12
  424. package/types/src/mailbox/mailbox.d.ts +0 -82
  425. package/types/src/mailbox/types.d.ts +0 -176
  426. package/types/src/map/index.d.ts +0 -1
  427. package/types/src/map/map.d.ts +0 -130
  428. package/types/src/payment-card-form/index.d.ts +0 -1
  429. package/types/src/payment-card-form/payment-card-form.d.ts +0 -85
  430. package/types/src/qr-scanner/index.d.ts +0 -1
  431. package/types/src/qr-scanner/qr-scanner.d.ts +0 -26
  432. package/types/src/timeline/index.d.ts +0 -1
  433. package/types/src/timeline/timeline-tile.d.ts +0 -44
  434. /package/dist/agent/{flow-CaPi2G8y.js → flow-CvG1fLW5.js} +0 -0
  435. /package/dist/agent/{vendor-material-color-Be96dpGE.js → vendor-material-color-DcL7ZPxx.js} +0 -0
  436. /package/dist/{form-CI59gad4.js → form-CFvwnfuJ.js} +0 -0
  437. /package/dist/{form-B2qudx_q.cjs → form-Ceijw1aA.cjs} +0 -0
  438. /package/dist/{hashContent-a8uVr3xs.js → hashContent-BU6jl5ih.js} +0 -0
  439. /package/dist/{hashContent-ejkBgDnN.cjs → hashContent-Bobsobip.cjs} +0 -0
  440. /package/dist/{overlay-stack-CCiTaf_C.js → overlay-stack-DCDS17uj.js} +0 -0
  441. /package/dist/{overlay-stack-CFGiYf34.cjs → overlay-stack-DPIe_aYv.cjs} +0 -0
  442. /package/dist/{rxjs-utils-BXpvHN4-.js → rxjs-utils-CVeJQ9KG.js} +0 -0
  443. /package/dist/{rxjs-utils-CaC-tdot.cjs → rxjs-utils-DCUHg_Ml.cjs} +0 -0
  444. /package/dist/{theme.interface-C_034TxG.js → theme.interface-B9TjbSBF.js} +0 -0
  445. /package/dist/{theme.interface-DESopuZS.cjs → theme.interface-BujperTo.cjs} +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
- }