@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.
- package/custom-elements.json +43 -949
- package/dist/agent/{flow-CaPi2G8y.js.map → flow-3RrZM-e7.js.map} +1 -1
- package/dist/agent/schmancy.agent.js +3817 -6527
- package/dist/agent/schmancy.agent.js.map +1 -1
- package/dist/agent/schmancy.manifest.json +10 -680
- package/dist/agent/{vendor-jsqr-r7GNh4P3.js.map → vendor-jsqr-BUVwyoGC.js.map} +1 -1
- package/dist/agent/{vendor-material-color-Be96dpGE.js.map → vendor-material-color-33Mj762T.js.map} +1 -1
- package/dist/{area-DHVANBbr.js → area-CIZZ5tbB.js} +1 -1
- package/dist/{area-DHVANBbr.js.map → area-CIZZ5tbB.js.map} +1 -1
- package/dist/{area-ZupIezvU.cjs → area-oZjYJlUy.cjs} +1 -1
- package/dist/{area-ZupIezvU.cjs.map → area-oZjYJlUy.cjs.map} +1 -1
- package/dist/area.cjs +1 -1
- package/dist/area.js +1 -1
- package/dist/{autocomplete-pHvsyfbH.js → autocomplete-C1oDLuol.js} +2 -2
- package/dist/{autocomplete-pHvsyfbH.js.map → autocomplete-C1oDLuol.js.map} +1 -1
- package/dist/{autocomplete-Bn525CTp.cjs → autocomplete-X20i6D62.cjs} +1 -1
- package/dist/{autocomplete-Bn525CTp.cjs.map → autocomplete-X20i6D62.cjs.map} +1 -1
- package/dist/autocomplete.cjs +1 -1
- package/dist/autocomplete.js +1 -1
- package/dist/avatar.cjs +1 -1
- package/dist/avatar.js +2 -2
- package/dist/badge.cjs +1 -1
- package/dist/badge.js +1 -1
- package/dist/{boat-IyEtsNI4.cjs → boat-CUx58Gwe.cjs} +1 -1
- package/dist/{boat-IyEtsNI4.cjs.map → boat-CUx58Gwe.cjs.map} +1 -1
- package/dist/{boat-_Yv3M6YM.js → boat-CpE0yAlK.js} +2 -2
- package/dist/{boat-_Yv3M6YM.js.map → boat-CpE0yAlK.js.map} +1 -1
- package/dist/boat.cjs +1 -1
- package/dist/boat.js +1 -1
- package/dist/breadcrumb.cjs +1 -1
- package/dist/breadcrumb.js +1 -1
- package/dist/{busy-Ck2IXJ4r.js → busy-C9n-DUY4.js} +1 -1
- package/dist/{busy-Ck2IXJ4r.js.map → busy-C9n-DUY4.js.map} +1 -1
- package/dist/{busy-CjM39APN.cjs → busy-D1DKZhgV.cjs} +1 -1
- package/dist/{busy-CjM39APN.cjs.map → busy-D1DKZhgV.cjs.map} +1 -1
- package/dist/busy.cjs +1 -1
- package/dist/busy.js +1 -1
- package/dist/button.cjs +1 -1
- package/dist/button.js +3 -3
- package/dist/{card-DUWZmMHc.js → card-B3hN-qzk.js} +1 -1
- package/dist/{card-DUWZmMHc.js.map → card-B3hN-qzk.js.map} +1 -1
- package/dist/{card-DIxDuuth.cjs → card-DZJ7qjf2.cjs} +1 -1
- package/dist/{card-DIxDuuth.cjs.map → card-DZJ7qjf2.cjs.map} +1 -1
- package/dist/card.cjs +1 -1
- package/dist/card.js +1 -1
- package/dist/charts.cjs +1 -1
- package/dist/charts.js +1 -1
- package/dist/{checkbox-DPS1mWG-.js → checkbox-CvmB1ev9.js} +1 -1
- package/dist/{checkbox-DPS1mWG-.js.map → checkbox-CvmB1ev9.js.map} +1 -1
- package/dist/{checkbox-CGdFXuWQ.cjs → checkbox-DapdzDow.cjs} +1 -1
- package/dist/{checkbox-CGdFXuWQ.cjs.map → checkbox-DapdzDow.cjs.map} +1 -1
- package/dist/checkbox.cjs +1 -1
- package/dist/checkbox.js +1 -1
- package/dist/{chips-UoFbwmlG.cjs → chips-7g6mWRuh.cjs} +1 -1
- package/dist/{chips-UoFbwmlG.cjs.map → chips-7g6mWRuh.cjs.map} +1 -1
- package/dist/{chips-BnnXQSA-.js → chips-C8Y3_3ke.js} +4 -4
- package/dist/{chips-BnnXQSA-.js.map → chips-C8Y3_3ke.js.map} +1 -1
- package/dist/chips.cjs +1 -1
- package/dist/chips.js +2 -2
- package/dist/connectivity.cjs +1 -1
- package/dist/connectivity.js +1 -1
- package/dist/content-drawer.cjs +1 -1
- package/dist/content-drawer.js +1 -1
- package/dist/{context-daN5G6HS.cjs.map → context-BpCETidA.cjs.map} +1 -1
- package/dist/{context-Bdu1xt0W.js.map → context-DJTJnSK4.js.map} +1 -1
- package/dist/{date-range-DOstCIg8.js → date-range-DdcaPX7C.js} +99 -113
- package/dist/date-range-DdcaPX7C.js.map +1 -0
- package/dist/date-range-ZfUl4duV.cjs +131 -0
- package/dist/date-range-ZfUl4duV.cjs.map +1 -0
- package/dist/{date-range-inline-4P7zqeVe.cjs → date-range-inline-D-d7N6bh.cjs} +1 -1
- package/dist/{date-range-inline-4P7zqeVe.cjs.map → date-range-inline-D-d7N6bh.cjs.map} +1 -1
- package/dist/{date-range-inline-BVycTWLb.js → date-range-inline-QQmIWhZ4.js} +1 -1
- package/dist/{date-range-inline-BVycTWLb.js.map → date-range-inline-QQmIWhZ4.js.map} +1 -1
- package/dist/date-range-inline.cjs +1 -1
- package/dist/date-range-inline.js +1 -1
- package/dist/date-range.cjs +1 -1
- package/dist/date-range.js +1 -1
- package/dist/delay.cjs +1 -1
- package/dist/delay.js +2 -2
- package/dist/{details-BJBbZOO6.cjs → details-3rL6UQU8.cjs} +1 -1
- package/dist/{details-BJBbZOO6.cjs.map → details-3rL6UQU8.cjs.map} +1 -1
- package/dist/{details-DPc5GxPa.js → details-Dpjh-XnJ.js} +2 -2
- package/dist/{details-DPc5GxPa.js.map → details-Dpjh-XnJ.js.map} +1 -1
- package/dist/details.cjs +1 -1
- package/dist/details.js +1 -1
- package/dist/directives.cjs +1 -1
- package/dist/directives.js +2 -2
- package/dist/{divider-BvJsmSPH.js → divider-BdfEKQsH.js} +1 -1
- package/dist/{divider-BvJsmSPH.js.map → divider-BdfEKQsH.js.map} +1 -1
- package/dist/{divider-DPT3XnG5.cjs → divider-CutXDz3F.cjs} +1 -1
- package/dist/{divider-DPT3XnG5.cjs.map → divider-CutXDz3F.cjs.map} +1 -1
- package/dist/divider.cjs +1 -1
- package/dist/divider.js +1 -1
- package/dist/dropdown.cjs +1 -1
- package/dist/dropdown.js +1 -1
- package/dist/{expand-CTqBWVXo.cjs → expand-DM6zfZf7.cjs} +1 -1
- package/dist/{expand-CTqBWVXo.cjs.map → expand-DM6zfZf7.cjs.map} +1 -1
- package/dist/{expand-BMzocdtj.js → expand-DrgMPJbu.js} +2 -2
- package/dist/{expand-BMzocdtj.js.map → expand-DrgMPJbu.js.map} +1 -1
- package/dist/expand.cjs +1 -1
- package/dist/expand.js +1 -1
- package/dist/{extra-BeHlUhzv.js → extra-B6gFu4_1.js} +1 -1
- package/dist/{extra-BeHlUhzv.js.map → extra-B6gFu4_1.js.map} +1 -1
- package/dist/{extra-h_cuxRII.cjs → extra-DJRYaOXe.cjs} +1 -1
- package/dist/{extra-h_cuxRII.cjs.map → extra-DJRYaOXe.cjs.map} +1 -1
- package/dist/extra.cjs +1 -1
- package/dist/extra.js +1 -1
- package/dist/{float-CTc1xxqH.js → float-1iihPek5.js} +1 -1
- package/dist/{float-CTc1xxqH.js.map → float-1iihPek5.js.map} +1 -1
- package/dist/{float-CwVBs11k.cjs → float-Ckyk85XG.cjs} +1 -1
- package/dist/{float-CwVBs11k.cjs.map → float-Ckyk85XG.cjs.map} +1 -1
- package/dist/float.cjs +1 -1
- package/dist/float.js +1 -1
- package/dist/{form-BtwOBMZ9.js.map → form-BF1c3Dk1.js.map} +1 -1
- package/dist/{form-CSJp687X.cjs.map → form-DeO5XX3b.cjs.map} +1 -1
- package/dist/form.cjs +1 -1
- package/dist/form.js +1 -1
- package/dist/handover/agent-runtime-followups.md +1 -1
- package/dist/handover/agent-runtime-v1.md +3 -3
- package/dist/{hashContent-1ARKIsx9.js.map → hashContent-BU6jl5ih.js.map} +1 -1
- package/dist/{hashContent-Bp5S6T4U.cjs.map → hashContent-Bobsobip.cjs.map} +1 -1
- package/dist/{icons-qEQW4pjM.cjs → icons-CV-fiGcW.cjs} +1 -1
- package/dist/{icons-qEQW4pjM.cjs.map → icons-CV-fiGcW.cjs.map} +1 -1
- package/dist/{icons-BbCVrcas.js → icons-DUkcTZAY.js} +2 -2
- package/dist/{icons-BbCVrcas.js.map → icons-DUkcTZAY.js.map} +1 -1
- package/dist/icons.cjs +1 -1
- package/dist/icons.js +1 -1
- package/dist/{iframe-BJfDIEJf.js → iframe-C9tj7F6Y.js} +1 -1
- package/dist/{iframe-BJfDIEJf.js.map → iframe-C9tj7F6Y.js.map} +1 -1
- package/dist/{iframe-D6HTruav.cjs → iframe-DF97oGtZ.cjs} +1 -1
- package/dist/{iframe-D6HTruav.cjs.map → iframe-DF97oGtZ.cjs.map} +1 -1
- package/dist/iframe.cjs +1 -1
- package/dist/iframe.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +70 -76
- package/dist/{input-LTK3cctF.js → input-DE7x223Y.js} +1 -1
- package/dist/{input-LTK3cctF.js.map → input-DE7x223Y.js.map} +1 -1
- package/dist/{input-U26axtcs.cjs → input-TW9G3n7X.cjs} +1 -1
- package/dist/{input-U26axtcs.cjs.map → input-TW9G3n7X.cjs.map} +1 -1
- package/dist/{input-chip-Ch-aCs3c.js → input-chip-BdoaVw_D.js} +1 -1
- package/dist/{input-chip-Ch-aCs3c.js.map → input-chip-BdoaVw_D.js.map} +1 -1
- package/dist/{input-chip-CADXt0X5.cjs → input-chip-Do48eI5r.cjs} +1 -1
- package/dist/{input-chip-CADXt0X5.cjs.map → input-chip-Do48eI5r.cjs.map} +1 -1
- package/dist/input.cjs +1 -1
- package/dist/input.js +1 -1
- package/dist/json.cjs +1 -1
- package/dist/json.js +2 -2
- package/dist/kbd.cjs +1 -1
- package/dist/kbd.js +1 -1
- package/dist/{layout-C4xmnU4n.js → layout-CXPNsUIo.js} +1 -1
- package/dist/{layout-C4xmnU4n.js.map → layout-CXPNsUIo.js.map} +1 -1
- package/dist/{layout-Dmh6fxh0.cjs → layout-Zhe7wSZ_.cjs} +1 -1
- package/dist/{layout-Dmh6fxh0.cjs.map → layout-Zhe7wSZ_.cjs.map} +1 -1
- package/dist/layout.cjs +1 -1
- package/dist/layout.js +1 -1
- package/dist/{lightbox-DqG2z3Cn.js → lightbox-DcutIyjx.js} +2 -2
- package/dist/{lightbox-DqG2z3Cn.js.map → lightbox-DcutIyjx.js.map} +1 -1
- package/dist/{lightbox-DbYUSfVl.cjs → lightbox-sPfnYzjJ.cjs} +1 -1
- package/dist/{lightbox-DbYUSfVl.cjs.map → lightbox-sPfnYzjJ.cjs.map} +1 -1
- package/dist/lightbox.cjs +1 -1
- package/dist/lightbox.js +1 -1
- package/dist/{list-D6-_E5ZD.js → list-BWrtrdgs.js} +1 -1
- package/dist/{list-D6-_E5ZD.js.map → list-BWrtrdgs.js.map} +1 -1
- package/dist/{list-CLX4sSAw.cjs → list-C4vasUly.cjs} +1 -1
- package/dist/{list-CLX4sSAw.cjs.map → list-C4vasUly.cjs.map} +1 -1
- package/dist/list.cjs +1 -1
- package/dist/list.js +1 -1
- package/dist/{magnetic-BH0TsofV.cjs.map → magnetic-BJgB1dVi.cjs.map} +1 -1
- package/dist/{magnetic-BZGFxAWG.js.map → magnetic-YwCNvtbB.js.map} +1 -1
- package/dist/{map-WXeVkx2K.cjs → map-BAQ9FEB6.cjs} +1 -1
- package/dist/{map-WXeVkx2K.cjs.map → map-BAQ9FEB6.cjs.map} +1 -1
- package/dist/{map-Dhy3ta9v.js → map-CEreveeI.js} +1 -1
- package/dist/{map-Dhy3ta9v.js.map → map-CEreveeI.js.map} +1 -1
- package/dist/map.cjs +1 -1
- package/dist/map.js +1 -1
- package/dist/menu-3yXDZusj.cjs +23 -0
- package/dist/menu-3yXDZusj.cjs.map +1 -0
- package/dist/menu-CxChOxWT.js +62 -0
- package/dist/menu-CxChOxWT.js.map +1 -0
- package/dist/menu.cjs +1 -1
- package/dist/menu.js +1 -1
- package/dist/mixins-Db7gjDah.cjs +298 -0
- package/dist/{mixins-De3xfjrm.cjs.map → mixins-Db7gjDah.cjs.map} +1 -1
- package/dist/mixins-Dw6hVfy-.js +627 -0
- package/dist/{mixins-CcIWET41.js.map → mixins-Dw6hVfy-.js.map} +1 -1
- package/dist/mixins.cjs +1 -1
- package/dist/mixins.js +1 -1
- package/dist/nav-drawer.cjs +1 -1
- package/dist/nav-drawer.js +1 -1
- package/dist/navigation-bar.cjs +1 -1
- package/dist/navigation-bar.js +1 -1
- package/dist/navigation-rail.cjs +1 -1
- package/dist/navigation-rail.js +1 -1
- package/dist/{notification-D_PQjBSf.cjs → notification-DKYy9qVe.cjs} +1 -1
- package/dist/{notification-D_PQjBSf.cjs.map → notification-DKYy9qVe.cjs.map} +1 -1
- package/dist/{notification-CVLqQ8c_.js → notification-ycbUBbOu.js} +2 -2
- package/dist/{notification-CVLqQ8c_.js.map → notification-ycbUBbOu.js.map} +1 -1
- package/dist/notification.cjs +1 -1
- package/dist/notification.js +1 -1
- package/dist/{option-rm4HebVs.js → option-DtOhMd3k.js} +1 -1
- package/dist/{option-rm4HebVs.js.map → option-DtOhMd3k.js.map} +1 -1
- package/dist/{option-DDU_goh1.cjs → option-zgVge3BH.cjs} +1 -1
- package/dist/{option-DDU_goh1.cjs.map → option-zgVge3BH.cjs.map} +1 -1
- package/dist/option.cjs +1 -1
- package/dist/option.js +1 -1
- package/dist/{overlay-stack-CAQno0CK.js.map → overlay-stack-DCDS17uj.js.map} +1 -1
- package/dist/{overlay-stack-BprhAE9a.cjs.map → overlay-stack-DPIe_aYv.cjs.map} +1 -1
- package/dist/overlay.cjs +5 -53
- package/dist/overlay.cjs.map +1 -1
- package/dist/overlay.confirm-body-AFqYBqrI.js +104 -0
- package/dist/overlay.confirm-body-AFqYBqrI.js.map +1 -0
- package/dist/overlay.confirm-body-DctQLDao.cjs +49 -0
- package/dist/overlay.confirm-body-DctQLDao.cjs.map +1 -0
- package/dist/overlay.js +120 -360
- package/dist/overlay.js.map +1 -1
- package/dist/overlay.service-B9On2-Aa.js +146 -0
- package/dist/overlay.service-B9On2-Aa.js.map +1 -0
- package/dist/overlay.service-k2nCE4pi.cjs +1 -0
- package/dist/overlay.service-k2nCE4pi.cjs.map +1 -0
- package/dist/page.cjs +1 -1
- package/dist/page.js +4 -4
- package/dist/{payment-card-form-C0dHYZIv.js → payment-card-form-Be1-OVlL.js} +1 -1
- package/dist/{payment-card-form-C0dHYZIv.js.map → payment-card-form-Be1-OVlL.js.map} +1 -1
- package/dist/{payment-card-form-DNvmZxs4.cjs → payment-card-form-CNnGePG4.cjs} +1 -1
- package/dist/{payment-card-form-DNvmZxs4.cjs.map → payment-card-form-CNnGePG4.cjs.map} +1 -1
- package/dist/payment-card-form.cjs +1 -1
- package/dist/payment-card-form.js +1 -1
- package/dist/{progress-BRerM5Bn.js → progress-BFWzmTlz.js} +1 -1
- package/dist/{progress-BRerM5Bn.js.map → progress-BFWzmTlz.js.map} +1 -1
- package/dist/{progress-U3LQkpM2.cjs → progress-C4TGG2eN.cjs} +1 -1
- package/dist/{progress-U3LQkpM2.cjs.map → progress-C4TGG2eN.cjs.map} +1 -1
- package/dist/progress.cjs +1 -1
- package/dist/progress.js +1 -1
- package/dist/qr-scanner.cjs +1 -1
- package/dist/qr-scanner.js +1 -1
- package/dist/{radio-group-BZ2WoOXJ.js → radio-group-DTNAW5dd.js} +1 -1
- package/dist/{radio-group-BZ2WoOXJ.js.map → radio-group-DTNAW5dd.js.map} +1 -1
- package/dist/{radio-group-D7mm-yvJ.cjs → radio-group-xLRp1g57.cjs} +1 -1
- package/dist/{radio-group-D7mm-yvJ.cjs.map → radio-group-xLRp1g57.cjs.map} +1 -1
- package/dist/radio-group.cjs +1 -1
- package/dist/radio-group.js +1 -1
- package/dist/range.cjs +1 -1
- package/dist/range.js +1 -1
- package/dist/{rxjs-utils-d-ivVN84.js.map → rxjs-utils-BK8VMe3K.js.map} +1 -1
- package/dist/{rxjs-utils-Csnks202.cjs.map → rxjs-utils-DhOKenkS.cjs.map} +1 -1
- package/dist/rxjs-utils.cjs +1 -1
- package/dist/rxjs-utils.js +1 -1
- package/dist/{scroll-qL-HkMdP.js → scroll-BCmdqSQU.js} +1 -1
- package/dist/{scroll-qL-HkMdP.js.map → scroll-BCmdqSQU.js.map} +1 -1
- package/dist/{scroll-DJTjNIT_.cjs → scroll-Bdgb-vRy.cjs} +1 -1
- package/dist/{scroll-DJTjNIT_.cjs.map → scroll-Bdgb-vRy.cjs.map} +1 -1
- package/dist/{select-CnPXUeSf.js → select-COGARE0b.js} +2 -2
- package/dist/{select-CnPXUeSf.js.map → select-COGARE0b.js.map} +1 -1
- package/dist/{select-BvA7v-gL.cjs → select-Cv5t_PT3.cjs} +1 -1
- package/dist/{select-BvA7v-gL.cjs.map → select-Cv5t_PT3.cjs.map} +1 -1
- package/dist/select.cjs +1 -1
- package/dist/select.js +1 -1
- package/dist/skeleton.cjs +1 -1
- package/dist/skeleton.js +1 -1
- package/dist/skills/INDEX.md +3 -6
- package/dist/skills/SKILL.md +13 -9
- package/dist/skills/schmancy/INDEX.md +3 -6
- package/dist/skills/schmancy/SKILL.md +13 -9
- package/dist/slider.cjs +1 -1
- package/dist/slider.js +1 -1
- package/dist/{splash-screen-BDt4PInk.cjs → splash-screen-B8rFbjqT.cjs} +1 -1
- package/dist/{splash-screen-BDt4PInk.cjs.map → splash-screen-B8rFbjqT.cjs.map} +1 -1
- package/dist/{splash-screen-C8JCqX5L.js → splash-screen-DbGbGttg.js} +1 -1
- package/dist/{splash-screen-C8JCqX5L.js.map → splash-screen-DbGbGttg.js.map} +1 -1
- package/dist/splash-screen.cjs +1 -1
- package/dist/splash-screen.js +1 -1
- package/dist/{src-CqdnWGgr.js → src-YRir9pOP.js} +162 -162
- package/dist/src-YRir9pOP.js.map +1 -0
- package/dist/{src-CpRNClhg.cjs → src-b8D-Ec-Q.cjs} +13 -13
- package/dist/src-b8D-Ec-Q.cjs.map +1 -0
- package/dist/steps.cjs +1 -1
- package/dist/steps.js +1 -1
- package/dist/{surface-C8jQy8Ym.js → surface-BE7sGTBt.js} +1 -1
- package/dist/{surface-C8jQy8Ym.js.map → surface-BE7sGTBt.js.map} +1 -1
- package/dist/{surface-Du2Y4vXd.cjs → surface-BvudRtf5.cjs} +1 -1
- package/dist/{surface-Du2Y4vXd.cjs.map → surface-BvudRtf5.cjs.map} +1 -1
- package/dist/surface.cjs +1 -1
- package/dist/surface.js +1 -1
- package/dist/switch.cjs +1 -1
- package/dist/switch.js +1 -1
- package/dist/table.cjs +1 -1
- package/dist/table.js +1 -1
- package/dist/{tabs-0RfeCa00.cjs → tabs-C0XKld1Z.cjs} +1 -1
- package/dist/{tabs-0RfeCa00.cjs.map → tabs-C0XKld1Z.cjs.map} +1 -1
- package/dist/{tabs-Cyahh9Q6.js → tabs-DIzCRsA3.js} +1 -1
- package/dist/{tabs-Cyahh9Q6.js.map → tabs-DIzCRsA3.js.map} +1 -1
- package/dist/tabs.cjs +1 -1
- package/dist/tabs.js +1 -1
- package/dist/teleport.cjs +1 -1
- package/dist/teleport.js +1 -1
- package/dist/{textarea-jqRrLxmo.cjs → textarea-BCDCGCJd.cjs} +1 -1
- package/dist/{textarea-jqRrLxmo.cjs.map → textarea-BCDCGCJd.cjs.map} +1 -1
- package/dist/{textarea-CXCcTVnf.js → textarea-UbZzBwqm.js} +1 -1
- package/dist/{textarea-CXCcTVnf.js.map → textarea-UbZzBwqm.js.map} +1 -1
- package/dist/textarea.cjs +1 -1
- package/dist/textarea.js +1 -1
- package/dist/theme-CIsI-sFj.cjs +181 -0
- package/dist/{theme-Hjz9sCN-.cjs.map → theme-CIsI-sFj.cjs.map} +1 -1
- package/dist/{theme-2KZW2Rfs.js → theme-Qh-yPEPL.js} +3 -4
- package/dist/{theme-2KZW2Rfs.js.map → theme-Qh-yPEPL.js.map} +1 -1
- package/dist/{theme-button-9uF1eoHz.js → theme-button-CjTnfs9x.js} +1 -1
- package/dist/{theme-button-9uF1eoHz.js.map → theme-button-CjTnfs9x.js.map} +1 -1
- package/dist/{theme-button-C7QIbke1.cjs → theme-button-Dv1D_Vil.cjs} +1 -1
- package/dist/{theme-button-C7QIbke1.cjs.map → theme-button-Dv1D_Vil.cjs.map} +1 -1
- package/dist/theme-button.cjs +1 -1
- package/dist/theme-button.js +1 -1
- package/dist/theme.cjs +1 -1
- package/dist/{theme.interface-D9l33b-M.cjs.map → theme.interface-BeW-sz_g.cjs.map} +1 -1
- package/dist/{theme.interface-DnVNre4O.js.map → theme.interface-v7SkAnDH.js.map} +1 -1
- package/dist/theme.js +5 -6
- package/dist/theme.service-Cfk88qHK.cjs +1 -0
- package/dist/theme.service-Cfk88qHK.cjs.map +1 -0
- package/dist/{theme.service-CmbOGMA8.js → theme.service-DIUo1mBP.js} +13 -14
- package/dist/theme.service-DIUo1mBP.js.map +1 -0
- package/dist/timeline.cjs +1 -1
- package/dist/timeline.js +1 -1
- package/dist/tree.cjs +1 -1
- package/dist/tree.js +1 -1
- package/dist/typography.cjs +1 -1
- package/dist/typography.js +1 -1
- package/dist/{utils-hp-DnFf5.js → utils-BfOze6Tk.js} +1 -1
- package/dist/{utils-hp-DnFf5.js.map → utils-BfOze6Tk.js.map} +1 -1
- package/dist/{utils-Cr-YO4Np.cjs → utils-CJ9y2Jz9.cjs} +1 -1
- package/dist/{utils-Cr-YO4Np.cjs.map → utils-CJ9y2Jz9.cjs.map} +1 -1
- package/dist/utils.cjs +1 -1
- package/dist/utils.js +2 -2
- package/dist/visually-hidden.cjs +1 -1
- package/dist/visually-hidden.js +1 -1
- package/dist/{window-DtUOWiAj.cjs → window-9HOUXrTU.cjs} +1 -1
- package/dist/{window-DtUOWiAj.cjs.map → window-9HOUXrTU.cjs.map} +1 -1
- package/dist/{window-C7yY9yp5.js → window-B_55dzk0.js} +3 -3
- package/dist/{window-C7yY9yp5.js.map → window-B_55dzk0.js.map} +1 -1
- package/dist/window.cjs +1 -1
- package/dist/window.js +1 -1
- package/package.json +1 -2
- package/skills/schmancy/INDEX.md +3 -6
- package/skills/schmancy/SKILL.md +13 -9
- package/src/content-drawer/drawer.ts +24 -7
- package/src/content-drawer/events.ts +6 -0
- package/src/content-drawer/sheet.ts +13 -12
- package/src/date-range/date-range-dialog.ts +4 -4
- package/src/date-range/date-range.ts +35 -53
- package/src/index.ts +0 -4
- package/src/menu/menu-item.ts +7 -2
- package/src/menu/menu.ts +24 -20
- package/types/src/content-drawer/drawer.d.ts +2 -0
- package/types/src/content-drawer/events.d.ts +6 -0
- package/types/src/content-drawer/sheet.d.ts +6 -5
- package/types/src/date-range/date-range.d.ts +1 -5
- package/types/src/index.d.ts +0 -4
- package/types/src/menu/menu-item.d.ts +1 -0
- package/types/src/menu/menu.d.ts +9 -7
- package/dist/agent/vendor-highlight-CHJZQQB7.js +0 -2178
- package/dist/agent/vendor-highlight-CHJZQQB7.js.map +0 -1
- package/dist/code-highlight-CMilN0B8.cjs +0 -190
- package/dist/code-highlight-CMilN0B8.cjs.map +0 -1
- package/dist/code-highlight-kFUJ1Eet.js +0 -296
- package/dist/code-highlight-kFUJ1Eet.js.map +0 -1
- package/dist/code-highlight.cjs +0 -1
- package/dist/code-highlight.js +0 -2
- package/dist/date-range-BIyrzTRZ.cjs +0 -131
- package/dist/date-range-BIyrzTRZ.cjs.map +0 -1
- package/dist/date-range-DOstCIg8.js.map +0 -1
- package/dist/dialog-service-DI9PPy4H.js +0 -193
- package/dist/dialog-service-DI9PPy4H.js.map +0 -1
- package/dist/dialog-service-DJd5L0f5.cjs +0 -1
- package/dist/dialog-service-DJd5L0f5.cjs.map +0 -1
- package/dist/dialog.cjs +0 -89
- package/dist/dialog.cjs.map +0 -1
- package/dist/dialog.js +0 -419
- package/dist/dialog.js.map +0 -1
- package/dist/mailbox-Ct6iYe-4.cjs +0 -1140
- package/dist/mailbox-Ct6iYe-4.cjs.map +0 -1
- package/dist/mailbox-DsPII8HR.js +0 -1596
- package/dist/mailbox-DsPII8HR.js.map +0 -1
- package/dist/mailbox.cjs +0 -1
- package/dist/mailbox.js +0 -2
- package/dist/menu-Bhd3EapX.js +0 -56
- package/dist/menu-Bhd3EapX.js.map +0 -1
- package/dist/menu-Cg2aaDjs.cjs +0 -23
- package/dist/menu-Cg2aaDjs.cjs.map +0 -1
- package/dist/mixins-CcIWET41.js +0 -627
- package/dist/mixins-De3xfjrm.cjs +0 -298
- package/dist/sheet-BRL07BB4.js +0 -170
- package/dist/sheet-BRL07BB4.js.map +0 -1
- package/dist/sheet-BYQJAHQn.cjs +0 -35
- package/dist/sheet-BYQJAHQn.cjs.map +0 -1
- package/dist/sheet.cjs +0 -1
- package/dist/sheet.js +0 -3
- package/dist/sheet.service-B25bsrYG.cjs +0 -1
- package/dist/sheet.service-B25bsrYG.cjs.map +0 -1
- package/dist/sheet.service-SPQ8oLCi.js +0 -86
- package/dist/sheet.service-SPQ8oLCi.js.map +0 -1
- package/dist/skills/code-highlight.md +0 -47
- package/dist/skills/dialog.md +0 -69
- package/dist/skills/mailbox.md +0 -102
- package/dist/skills/schmancy/code-highlight.md +0 -47
- package/dist/skills/schmancy/dialog.md +0 -69
- package/dist/skills/schmancy/mailbox.md +0 -102
- package/dist/skills/schmancy/sheet.md +0 -76
- package/dist/skills/sheet.md +0 -76
- package/dist/src-CpRNClhg.cjs.map +0 -1
- package/dist/src-CqdnWGgr.js.map +0 -1
- package/dist/theme-Hjz9sCN-.cjs +0 -181
- package/dist/theme.events-Cv7N4Toe.js +0 -2
- package/dist/theme.events-Cv7N4Toe.js.map +0 -1
- package/dist/theme.events-DM4H5F2d.cjs +0 -1
- package/dist/theme.events-DM4H5F2d.cjs.map +0 -1
- package/dist/theme.service-BrUbGoeQ.cjs +0 -1
- package/dist/theme.service-BrUbGoeQ.cjs.map +0 -1
- package/dist/theme.service-CmbOGMA8.js.map +0 -1
- package/skills/schmancy/code-highlight.md +0 -47
- package/skills/schmancy/dialog.md +0 -69
- package/skills/schmancy/mailbox.md +0 -102
- package/skills/schmancy/sheet.md +0 -76
- package/src/code-highlight/code-highlight.ts +0 -345
- package/src/code-highlight/code-preview.ts +0 -125
- package/src/code-highlight/index.ts +0 -3
- package/src/dialog/dialog-base.mixin.ts +0 -576
- package/src/dialog/dialog-events.ts +0 -17
- package/src/dialog/dialog-service.ts +0 -494
- package/src/dialog/dialog.component.ts +0 -414
- package/src/dialog/index.ts +0 -3
- package/src/mailbox/README.md +0 -128
- package/src/mailbox/email-editor.ts +0 -1077
- package/src/mailbox/email-layout-selector.ts +0 -58
- package/src/mailbox/email-recipients.ts +0 -599
- package/src/mailbox/email-template-picker.ts +0 -297
- package/src/mailbox/email-viewer.ts +0 -717
- package/src/mailbox/index.ts +0 -31
- package/src/mailbox/mailbox.ts +0 -364
- package/src/mailbox/types.ts +0 -180
- package/src/sheet/hook.ts +0 -40
- package/src/sheet/index.ts +0 -2
- package/src/sheet/sheet.service.ts +0 -245
- package/src/sheet/sheet.ts +0 -238
- package/types/src/code-highlight/code-highlight.d.ts +0 -49
- package/types/src/code-highlight/code-preview.d.ts +0 -30
- package/types/src/code-highlight/index.d.ts +0 -3
- package/types/src/dialog/dialog-base.mixin.d.ts +0 -30
- package/types/src/dialog/dialog-events.d.ts +0 -13
- package/types/src/dialog/dialog-service.d.ts +0 -91
- package/types/src/dialog/dialog.component.d.ts +0 -150
- package/types/src/dialog/index.d.ts +0 -3
- package/types/src/mailbox/email-editor.d.ts +0 -101
- package/types/src/mailbox/email-layout-selector.d.ts +0 -18
- package/types/src/mailbox/email-recipients.d.ts +0 -122
- package/types/src/mailbox/email-template-picker.d.ts +0 -54
- package/types/src/mailbox/email-viewer.d.ts +0 -86
- package/types/src/mailbox/index.d.ts +0 -12
- package/types/src/mailbox/mailbox.d.ts +0 -82
- package/types/src/mailbox/types.d.ts +0 -176
- package/types/src/sheet/hook.d.ts +0 -5
- package/types/src/sheet/index.d.ts +0 -2
- package/types/src/sheet/sheet.d.ts +0 -29
- package/types/src/sheet/sheet.service.d.ts +0 -65
- /package/dist/agent/{flow-CaPi2G8y.js → flow-3RrZM-e7.js} +0 -0
- /package/dist/agent/{vendor-jsqr-r7GNh4P3.js → vendor-jsqr-BUVwyoGC.js} +0 -0
- /package/dist/agent/{vendor-material-color-Be96dpGE.js → vendor-material-color-33Mj762T.js} +0 -0
- /package/dist/{context-daN5G6HS.cjs → context-BpCETidA.cjs} +0 -0
- /package/dist/{context-Bdu1xt0W.js → context-DJTJnSK4.js} +0 -0
- /package/dist/{form-BtwOBMZ9.js → form-BF1c3Dk1.js} +0 -0
- /package/dist/{form-CSJp687X.cjs → form-DeO5XX3b.cjs} +0 -0
- /package/dist/{hashContent-1ARKIsx9.js → hashContent-BU6jl5ih.js} +0 -0
- /package/dist/{hashContent-Bp5S6T4U.cjs → hashContent-Bobsobip.cjs} +0 -0
- /package/dist/{magnetic-BH0TsofV.cjs → magnetic-BJgB1dVi.cjs} +0 -0
- /package/dist/{magnetic-BZGFxAWG.js → magnetic-YwCNvtbB.js} +0 -0
- /package/dist/{overlay-stack-CAQno0CK.js → overlay-stack-DCDS17uj.js} +0 -0
- /package/dist/{overlay-stack-BprhAE9a.cjs → overlay-stack-DPIe_aYv.cjs} +0 -0
- /package/dist/{rxjs-utils-d-ivVN84.js → rxjs-utils-BK8VMe3K.js} +0 -0
- /package/dist/{rxjs-utils-Csnks202.cjs → rxjs-utils-DhOKenkS.cjs} +0 -0
- /package/dist/{theme.interface-D9l33b-M.cjs → theme.interface-BeW-sz_g.cjs} +0 -0
- /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
|
-
}
|