@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.
- package/README.md +11 -0
- package/custom-elements.json +235 -1807
- package/dist/agent/{flow-CaPi2G8y.js.map → flow-CvG1fLW5.js.map} +1 -1
- package/dist/agent/schmancy.agent.js +5347 -12408
- package/dist/agent/schmancy.agent.js.map +1 -1
- package/dist/agent/schmancy.manifest.json +70 -1068
- package/dist/agent/{vendor-material-color-Be96dpGE.js.map → vendor-material-color-DcL7ZPxx.js.map} +1 -1
- package/dist/{area-CSQdhCBF.cjs → area-8IBAXzbC.cjs} +1 -1
- package/dist/{area-CSQdhCBF.cjs.map → area-8IBAXzbC.cjs.map} +1 -1
- package/dist/{area-D5haQE-J.js → area-DSW_LYXQ.js} +1 -1
- package/dist/{area-D5haQE-J.js.map → area-DSW_LYXQ.js.map} +1 -1
- package/dist/area.cjs +1 -1
- package/dist/area.js +1 -1
- package/dist/{autocomplete-B_bJXUjm.cjs → autocomplete-9PLjlFYt.cjs} +1 -1
- package/dist/{autocomplete-B_bJXUjm.cjs.map → autocomplete-9PLjlFYt.cjs.map} +1 -1
- package/dist/{autocomplete-DtyjZJ1E.js → autocomplete-CXwwmUbC.js} +2 -2
- package/dist/{autocomplete-DtyjZJ1E.js.map → autocomplete-CXwwmUbC.js.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-BJLCp-Hv.cjs → boat-CpGNeWav.cjs} +1 -1
- package/dist/{boat-BJLCp-Hv.cjs.map → boat-CpGNeWav.cjs.map} +1 -1
- package/dist/{boat-MT8bRT8u.js → boat-Dwn5oXd8.js} +1 -1
- package/dist/{boat-MT8bRT8u.js.map → boat-Dwn5oXd8.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-DSF2E-zy.cjs → busy-CUUgvimY.cjs} +1 -1
- package/dist/{busy-DSF2E-zy.cjs.map → busy-CUUgvimY.cjs.map} +1 -1
- package/dist/{busy-6BqWGryX.js → busy-Cjm1BYVC.js} +1 -1
- package/dist/{busy-6BqWGryX.js.map → busy-Cjm1BYVC.js.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 +1 -1
- package/dist/{card-CvuVha-W.js → card-BR22oYCL.js} +1 -1
- package/dist/{card-CvuVha-W.js.map → card-BR22oYCL.js.map} +1 -1
- package/dist/{card-DnKnaHzf.cjs → card-BjZ_WRr3.cjs} +1 -1
- package/dist/{card-DnKnaHzf.cjs.map → card-BjZ_WRr3.cjs.map} +1 -1
- package/dist/card.cjs +1 -1
- package/dist/card.js +1 -1
- package/dist/{checkbox-D3u8Wm9r.cjs → checkbox-2e8v7CNg.cjs} +1 -1
- package/dist/{checkbox-D3u8Wm9r.cjs.map → checkbox-2e8v7CNg.cjs.map} +1 -1
- package/dist/{checkbox-QDRsE8cp.js → checkbox-CsADwyfu.js} +1 -1
- package/dist/{checkbox-QDRsE8cp.js.map → checkbox-CsADwyfu.js.map} +1 -1
- package/dist/checkbox.cjs +1 -1
- package/dist/checkbox.js +1 -1
- package/dist/{chips-Dy9vx8JS.js → chips-C9HwVbGT.js} +2 -2
- package/dist/{chips-Dy9vx8JS.js.map → chips-C9HwVbGT.js.map} +1 -1
- package/dist/{chips-CMoQzop1.cjs → chips-DPCcO55o.cjs} +1 -1
- package/dist/{chips-CMoQzop1.cjs.map → chips-DPCcO55o.cjs.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/{date-range-B2NuihKA.cjs → date-range-63-FC7gD.cjs} +1 -1
- package/dist/{date-range-B2NuihKA.cjs.map → date-range-63-FC7gD.cjs.map} +1 -1
- package/dist/{date-range-Boesjlic.js → date-range-CFaP-8Os.js} +2 -2
- package/dist/{date-range-Boesjlic.js.map → date-range-CFaP-8Os.js.map} +1 -1
- package/dist/{date-range-inline-DBuND2pc.js → date-range-inline-BCuK_XCv.js} +1 -1
- package/dist/{date-range-inline-DBuND2pc.js.map → date-range-inline-BCuK_XCv.js.map} +1 -1
- package/dist/{date-range-inline-BI6_4Ahl.cjs → date-range-inline-Cpdqd-8B.cjs} +1 -1
- package/dist/{date-range-inline-BI6_4Ahl.cjs.map → date-range-inline-Cpdqd-8B.cjs.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-BrGrUTGC.js → details-0dOlqHHL.js} +1 -1
- package/dist/{details-BrGrUTGC.js.map → details-0dOlqHHL.js.map} +1 -1
- package/dist/{details-BRs_z5-k.cjs → details-qKikJIyH.cjs} +1 -1
- package/dist/{details-BRs_z5-k.cjs.map → details-qKikJIyH.cjs.map} +1 -1
- package/dist/details.cjs +1 -1
- package/dist/details.js +1 -1
- package/dist/{divider-W3TiDasp.js → divider-BxkIl0H1.js} +1 -1
- package/dist/{divider-W3TiDasp.js.map → divider-BxkIl0H1.js.map} +1 -1
- package/dist/{divider-BOxQ2T9h.cjs → divider-CX9mmWZ8.cjs} +1 -1
- package/dist/{divider-BOxQ2T9h.cjs.map → divider-CX9mmWZ8.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-CnccBF91.cjs → expand-891JuQuN.cjs} +1 -1
- package/dist/{expand-CnccBF91.cjs.map → expand-891JuQuN.cjs.map} +1 -1
- package/dist/{expand-Pu8fZ0jZ.js → expand-BeAx94MP.js} +2 -2
- package/dist/{expand-Pu8fZ0jZ.js.map → expand-BeAx94MP.js.map} +1 -1
- package/dist/expand.cjs +1 -1
- package/dist/expand.js +1 -1
- package/dist/{float-WCVdp3um.js → float-BPF2WO4L.js} +1 -1
- package/dist/{float-WCVdp3um.js.map → float-BPF2WO4L.js.map} +1 -1
- package/dist/{float-BRKa-P6Z.cjs → float-D7vvODxx.cjs} +1 -1
- package/dist/{float-BRKa-P6Z.cjs.map → float-D7vvODxx.cjs.map} +1 -1
- package/dist/float.cjs +1 -1
- package/dist/float.js +1 -1
- package/dist/{form-CI59gad4.js.map → form-CFvwnfuJ.js.map} +1 -1
- package/dist/{form-B2qudx_q.cjs.map → form-Ceijw1aA.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-a8uVr3xs.js.map → hashContent-BU6jl5ih.js.map} +1 -1
- package/dist/{hashContent-ejkBgDnN.cjs.map → hashContent-Bobsobip.cjs.map} +1 -1
- package/dist/{icons-C0ufCcdp.js → icons-BKxW_7QR.js} +1 -1
- package/dist/{icons-C0ufCcdp.js.map → icons-BKxW_7QR.js.map} +1 -1
- package/dist/{icons-DXEbmg-O.cjs → icons-QSdo-8h9.cjs} +1 -1
- package/dist/{icons-DXEbmg-O.cjs.map → icons-QSdo-8h9.cjs.map} +1 -1
- package/dist/icons.cjs +1 -1
- package/dist/icons.js +1 -1
- package/dist/{iframe-c9lGxw7x.js → iframe-BxvbhyTS.js} +1 -1
- package/dist/{iframe-c9lGxw7x.js.map → iframe-BxvbhyTS.js.map} +1 -1
- package/dist/{iframe-C6RVODkW.cjs → iframe-CMKV-bm8.cjs} +1 -1
- package/dist/{iframe-C6RVODkW.cjs.map → iframe-CMKV-bm8.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 +64 -72
- package/dist/{input-B4HM-9-H.cjs → input-BFhJU74_.cjs} +1 -1
- package/dist/{input-B4HM-9-H.cjs.map → input-BFhJU74_.cjs.map} +1 -1
- package/dist/{input-Pmj_bH37.js → input-DIqaR8Mr.js} +1 -1
- package/dist/{input-Pmj_bH37.js.map → input-DIqaR8Mr.js.map} +1 -1
- package/dist/{input-chip-BIGgd_7w.js → input-chip-D9tlSk_2.js} +1 -1
- package/dist/{input-chip-BIGgd_7w.js.map → input-chip-D9tlSk_2.js.map} +1 -1
- package/dist/{input-chip-BoDisY6c.cjs → input-chip-w09qTt7J.cjs} +1 -1
- package/dist/{input-chip-BoDisY6c.cjs.map → input-chip-w09qTt7J.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.cjs +1 -1
- package/dist/layout.js +1 -1
- package/dist/{lightbox-DK1vDKm3.cjs → lightbox-CK035jsx.cjs} +1 -1
- package/dist/{lightbox-DK1vDKm3.cjs.map → lightbox-CK035jsx.cjs.map} +1 -1
- package/dist/{lightbox-K1eJTYXP.js → lightbox-GChmL3Ff.js} +2 -2
- package/dist/{lightbox-K1eJTYXP.js.map → lightbox-GChmL3Ff.js.map} +1 -1
- package/dist/lightbox.cjs +1 -1
- package/dist/lightbox.js +1 -1
- package/dist/{list-CEuVqAxN.cjs → list-B3P37zlH.cjs} +1 -1
- package/dist/{list-CEuVqAxN.cjs.map → list-B3P37zlH.cjs.map} +1 -1
- package/dist/{list-Ds0Nv1y5.js → list-J-Fz24Z1.js} +1 -1
- package/dist/{list-Ds0Nv1y5.js.map → list-J-Fz24Z1.js.map} +1 -1
- package/dist/list.cjs +1 -1
- package/dist/list.js +1 -1
- package/dist/{menu-Bly30Nje.cjs → menu-BnFd8CwU.cjs} +1 -1
- package/dist/{menu-Bly30Nje.cjs.map → menu-BnFd8CwU.cjs.map} +1 -1
- package/dist/{menu-L8MK1ma5.js → menu-DHTlUwXS.js} +2 -2
- package/dist/{menu-L8MK1ma5.js.map → menu-DHTlUwXS.js.map} +1 -1
- package/dist/menu.cjs +1 -1
- package/dist/menu.js +1 -1
- package/dist/mixins-47_CZk7q.cjs +298 -0
- package/dist/{mixins-CAb0b03r.cjs.map → mixins-47_CZk7q.cjs.map} +1 -1
- package/dist/mixins-PBJJGiiP.js +627 -0
- package/dist/{mixins-B34UxxCe.js.map → mixins-PBJJGiiP.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-7fSbk8hm.cjs → notification-B6YBL0hx.cjs} +1 -1
- package/dist/{notification-7fSbk8hm.cjs.map → notification-B6YBL0hx.cjs.map} +1 -1
- package/dist/{notification-DB25M-qo.js → notification-C-5Bv3vj.js} +2 -2
- package/dist/{notification-DB25M-qo.js.map → notification-C-5Bv3vj.js.map} +1 -1
- package/dist/notification.cjs +1 -1
- package/dist/notification.js +1 -1
- package/dist/{option-DDHa25k5.js → option-B7q6VXCu.js} +1 -1
- package/dist/{option-DDHa25k5.js.map → option-B7q6VXCu.js.map} +1 -1
- package/dist/{option-HF9Xqbuq.cjs → option-DVQRa3nr.cjs} +1 -1
- package/dist/{option-HF9Xqbuq.cjs.map → option-DVQRa3nr.cjs.map} +1 -1
- package/dist/option.cjs +1 -1
- package/dist/option.js +1 -1
- package/dist/{overlay-stack-CCiTaf_C.js.map → overlay-stack-DCDS17uj.js.map} +1 -1
- package/dist/{overlay-stack-CFGiYf34.cjs.map → overlay-stack-DPIe_aYv.cjs.map} +1 -1
- package/dist/overlay.cjs +1 -1
- package/dist/{overlay.confirm-body-BDG94R0x.js → overlay.confirm-body-CAY5xK1n.js} +1 -1
- package/dist/{overlay.confirm-body-BDG94R0x.js.map → overlay.confirm-body-CAY5xK1n.js.map} +1 -1
- package/dist/{overlay.confirm-body-b4Nx_OVf.cjs → overlay.confirm-body-XZtErofy.cjs} +1 -1
- package/dist/{overlay.confirm-body-b4Nx_OVf.cjs.map → overlay.confirm-body-XZtErofy.cjs.map} +1 -1
- package/dist/overlay.js +3 -3
- package/dist/{overlay.service-BUCuZa6V.js → overlay.service-BZE_lwKO.js} +2 -2
- package/dist/{overlay.service-BUCuZa6V.js.map → overlay.service-BZE_lwKO.js.map} +1 -1
- package/dist/{overlay.service-CRHZZY9F.cjs → overlay.service-Oyjrw831.cjs} +1 -1
- package/dist/{overlay.service-CRHZZY9F.cjs.map → overlay.service-Oyjrw831.cjs.map} +1 -1
- package/dist/page.cjs +1 -1
- package/dist/page.js +2 -2
- package/dist/{progress-CqOyMM4i.js → progress-BHXLYs9i.js} +1 -1
- package/dist/{progress-CqOyMM4i.js.map → progress-BHXLYs9i.js.map} +1 -1
- package/dist/{progress-54R4QRgW.cjs → progress-D99bumkC.cjs} +1 -1
- package/dist/{progress-54R4QRgW.cjs.map → progress-D99bumkC.cjs.map} +1 -1
- package/dist/progress.cjs +1 -1
- package/dist/progress.js +1 -1
- package/dist/{radio-group-B4zbBIZF.js → radio-group-BYra5_q1.js} +1 -1
- package/dist/{radio-group-B4zbBIZF.js.map → radio-group-BYra5_q1.js.map} +1 -1
- package/dist/{radio-group-BJqZpYVy.cjs → radio-group-DYsycLmD.cjs} +1 -1
- package/dist/{radio-group-BJqZpYVy.cjs.map → radio-group-DYsycLmD.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-BXpvHN4-.js.map → rxjs-utils-CVeJQ9KG.js.map} +1 -1
- package/dist/{rxjs-utils-CaC-tdot.cjs.map → rxjs-utils-DCUHg_Ml.cjs.map} +1 -1
- package/dist/rxjs-utils.cjs +1 -1
- package/dist/rxjs-utils.js +1 -1
- package/dist/{scroll-CYm6Krus.js → scroll-TqNWZ0lo.js} +1 -1
- package/dist/{scroll-CYm6Krus.js.map → scroll-TqNWZ0lo.js.map} +1 -1
- package/dist/{scroll-iSRovYYt.cjs → scroll-cayCBOrq.cjs} +1 -1
- package/dist/{scroll-iSRovYYt.cjs.map → scroll-cayCBOrq.cjs.map} +1 -1
- package/dist/{select-DiQHtQJN.cjs → select-CRdSmlLq.cjs} +1 -1
- package/dist/{select-DiQHtQJN.cjs.map → select-CRdSmlLq.cjs.map} +1 -1
- package/dist/{select-1WHseXP6.js → select-nzq0qFlF.js} +2 -2
- package/dist/{select-1WHseXP6.js.map → select-nzq0qFlF.js.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 +9 -6
- package/dist/skills/schmancy/INDEX.md +9 -6
- package/dist/slider.cjs +1 -1
- package/dist/slider.js +1 -1
- package/dist/{splash-screen-BwvtKMdN.js → splash-screen-BJeIiJ_e.js} +1 -1
- package/dist/{splash-screen-BwvtKMdN.js.map → splash-screen-BJeIiJ_e.js.map} +1 -1
- package/dist/{splash-screen-CJL8DGDe.cjs → splash-screen-BMLQXzDq.cjs} +1 -1
- package/dist/{splash-screen-CJL8DGDe.cjs.map → splash-screen-BMLQXzDq.cjs.map} +1 -1
- package/dist/splash-screen.cjs +1 -1
- package/dist/splash-screen.js +1 -1
- package/dist/{src-Bwr2NR0A.cjs → src-DE11tq2Q.cjs} +1 -1
- package/dist/{src-Bwr2NR0A.cjs.map → src-DE11tq2Q.cjs.map} +1 -1
- package/dist/{src-UaZeROcW.js → src-qvWlNoMO.js} +34 -42
- package/dist/{src-UaZeROcW.js.map → src-qvWlNoMO.js.map} +1 -1
- package/dist/steps.cjs +1 -1
- package/dist/steps.js +1 -1
- package/dist/{surface-DE5iuI8e.cjs → surface-D426MFLR.cjs} +1 -1
- package/dist/{surface-DE5iuI8e.cjs.map → surface-D426MFLR.cjs.map} +1 -1
- package/dist/{surface-DPUkQ3OL.js → surface-DG7Cmm9V.js} +1 -1
- package/dist/{surface-DPUkQ3OL.js.map → surface-DG7Cmm9V.js.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-B2XEQPQl.js → tabs-B7siJkM5.js} +1 -1
- package/dist/{tabs-B2XEQPQl.js.map → tabs-B7siJkM5.js.map} +1 -1
- package/dist/{tabs-CsDQ72Qk.cjs → tabs-t3nMfg1F.cjs} +1 -1
- package/dist/{tabs-CsDQ72Qk.cjs.map → tabs-t3nMfg1F.cjs.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-C_ps0lL-.js → textarea-DSxHCCle.js} +1 -1
- package/dist/{textarea-C_ps0lL-.js.map → textarea-DSxHCCle.js.map} +1 -1
- package/dist/{textarea-aeAP9cDG.cjs → textarea-o9vysorM.cjs} +1 -1
- package/dist/{textarea-aeAP9cDG.cjs.map → textarea-o9vysorM.cjs.map} +1 -1
- package/dist/textarea.cjs +1 -1
- package/dist/textarea.js +1 -1
- package/dist/{theme-DAYTVw13.cjs → theme-Ce9eIP05.cjs} +1 -1
- package/dist/{theme-DAYTVw13.cjs.map → theme-Ce9eIP05.cjs.map} +1 -1
- package/dist/{theme-DAx1iRNr.js → theme-XO3nHDbW.js} +2 -2
- package/dist/{theme-DAx1iRNr.js.map → theme-XO3nHDbW.js.map} +1 -1
- package/dist/{theme-button-BrHkzCtj.js → theme-button-DNutDO1j.js} +1 -1
- package/dist/{theme-button-BrHkzCtj.js.map → theme-button-DNutDO1j.js.map} +1 -1
- package/dist/{theme-button-LsMKY_N_.cjs → theme-button-H7PRz_bg.cjs} +1 -1
- package/dist/{theme-button-LsMKY_N_.cjs.map → theme-button-H7PRz_bg.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-C_034TxG.js.map → theme.interface-B9TjbSBF.js.map} +1 -1
- package/dist/{theme.interface-DESopuZS.cjs.map → theme.interface-BujperTo.cjs.map} +1 -1
- package/dist/theme.js +3 -3
- 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-oLBkMvor.cjs → utils-Dt5PpmaQ.cjs} +1 -1
- package/dist/{utils-oLBkMvor.cjs.map → utils-Dt5PpmaQ.cjs.map} +1 -1
- package/dist/{utils-BzFQfaIr.js → utils-kND2Z9Xg.js} +1 -1
- package/dist/{utils-BzFQfaIr.js.map → utils-kND2Z9Xg.js.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-BJrKS6Zr.cjs → window-BaoSwgGE.cjs} +1 -1
- package/dist/{window-BJrKS6Zr.cjs.map → window-BaoSwgGE.cjs.map} +1 -1
- package/dist/{window-CyDuTN80.js → window-KnLWhQ3S.js} +2 -2
- package/dist/{window-CyDuTN80.js.map → window-KnLWhQ3S.js.map} +1 -1
- package/dist/window.cjs +1 -1
- package/dist/window.js +1 -1
- package/package.json +4 -5
- package/skills/schmancy/INDEX.md +9 -6
- package/src/index.ts +0 -8
- package/types/src/index.d.ts +0 -8
- package/dist/agent/vendor-highlight-CHJZQQB7.js +0 -2178
- package/dist/agent/vendor-highlight-CHJZQQB7.js.map +0 -1
- package/dist/agent/vendor-jsqr-r7GNh4P3.js +0 -10212
- package/dist/agent/vendor-jsqr-r7GNh4P3.js.map +0 -1
- package/dist/charts.cjs +0 -112
- package/dist/charts.cjs.map +0 -1
- package/dist/charts.js +0 -374
- package/dist/charts.js.map +0 -1
- package/dist/code-highlight-Ddp0oZnm.cjs +0 -190
- package/dist/code-highlight-Ddp0oZnm.cjs.map +0 -1
- package/dist/code-highlight-DtE2-ObF.js +0 -296
- package/dist/code-highlight-DtE2-ObF.js.map +0 -1
- package/dist/code-highlight.cjs +0 -1
- package/dist/code-highlight.js +0 -2
- package/dist/extra-B8IPs6gG.cjs +0 -31
- package/dist/extra-B8IPs6gG.cjs.map +0 -1
- package/dist/extra-DxEWs41z.js +0 -3440
- package/dist/extra-DxEWs41z.js.map +0 -1
- package/dist/extra.cjs +0 -1
- package/dist/extra.js +0 -2
- package/dist/mailbox-CDWqbVvZ.cjs +0 -1140
- package/dist/mailbox-CDWqbVvZ.cjs.map +0 -1
- package/dist/mailbox-DD2How0H.js +0 -1607
- package/dist/mailbox-DD2How0H.js.map +0 -1
- package/dist/mailbox.cjs +0 -1
- package/dist/mailbox.js +0 -2
- package/dist/map-1uwxxvBa.js +0 -208
- package/dist/map-1uwxxvBa.js.map +0 -1
- package/dist/map-BrBSrIqg.cjs +0 -80
- package/dist/map-BrBSrIqg.cjs.map +0 -1
- package/dist/map.cjs +0 -1
- package/dist/map.js +0 -2
- package/dist/mixins-B34UxxCe.js +0 -627
- package/dist/mixins-CAb0b03r.cjs +0 -298
- package/dist/payment-card-form-C4jb-OdM.js +0 -729
- package/dist/payment-card-form-C4jb-OdM.js.map +0 -1
- package/dist/payment-card-form-WEx4CscR.cjs +0 -73
- package/dist/payment-card-form-WEx4CscR.cjs.map +0 -1
- package/dist/payment-card-form.cjs +0 -1
- package/dist/payment-card-form.js +0 -2
- package/dist/qr-scanner.cjs +0 -35
- package/dist/qr-scanner.cjs.map +0 -1
- package/dist/qr-scanner.js +0 -123
- package/dist/qr-scanner.js.map +0 -1
- package/dist/skills/charts.md +0 -93
- package/dist/skills/code-highlight.md +0 -47
- package/dist/skills/extra.md +0 -59
- package/dist/skills/mailbox.md +0 -102
- package/dist/skills/map.md +0 -55
- package/dist/skills/qr-scanner.md +0 -51
- package/dist/skills/schmancy/charts.md +0 -93
- package/dist/skills/schmancy/code-highlight.md +0 -47
- package/dist/skills/schmancy/extra.md +0 -59
- package/dist/skills/schmancy/mailbox.md +0 -102
- package/dist/skills/schmancy/map.md +0 -55
- package/dist/skills/schmancy/qr-scanner.md +0 -51
- package/dist/skills/schmancy/timeline-tile.md +0 -95
- package/dist/skills/timeline-tile.md +0 -95
- package/dist/timeline.cjs +0 -277
- package/dist/timeline.cjs.map +0 -1
- package/dist/timeline.js +0 -326
- package/dist/timeline.js.map +0 -1
- package/skills/schmancy/charts.md +0 -93
- package/skills/schmancy/code-highlight.md +0 -47
- package/skills/schmancy/extra.md +0 -59
- package/skills/schmancy/mailbox.md +0 -102
- package/skills/schmancy/map.md +0 -55
- package/skills/schmancy/qr-scanner.md +0 -51
- package/skills/schmancy/timeline-tile.md +0 -95
- package/src/charts/area-chart.ts +0 -498
- package/src/charts/index.ts +0 -4
- package/src/charts/pills.ts +0 -352
- package/src/charts/types.ts +0 -66
- package/src/charts/utils.ts +0 -65
- 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/extra/countries/countries.data.ts +0 -196
- package/src/extra/countries/countries.ts +0 -109
- package/src/extra/countries/index.ts +0 -2
- package/src/extra/index.ts +0 -2
- package/src/extra/timezone/index.ts +0 -2
- package/src/extra/timezone/timezone.ts +0 -118
- package/src/extra/timezone/timezones.data.ts +0 -2546
- package/src/mailbox/README.md +0 -128
- package/src/mailbox/email-editor.ts +0 -1076
- 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 -303
- 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/map/index.ts +0 -1
- package/src/map/map.ts +0 -485
- package/src/payment-card-form/index.ts +0 -1
- package/src/payment-card-form/payment-card-form.ts +0 -331
- package/src/qr-scanner/index.ts +0 -1
- package/src/qr-scanner/qr-scanner.ts +0 -242
- package/src/timeline/index.ts +0 -1
- package/src/timeline/timeline-tile.ts +0 -431
- package/types/src/charts/area-chart.d.ts +0 -58
- package/types/src/charts/index.d.ts +0 -4
- package/types/src/charts/pills.d.ts +0 -51
- package/types/src/charts/types.d.ts +0 -62
- package/types/src/charts/utils.d.ts +0 -28
- 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/extra/countries/countries.d.ts +0 -26
- package/types/src/extra/countries/countries.data.d.ts +0 -5
- package/types/src/extra/countries/index.d.ts +0 -2
- package/types/src/extra/index.d.ts +0 -2
- package/types/src/extra/timezone/index.d.ts +0 -2
- package/types/src/extra/timezone/timezone.d.ts +0 -34
- package/types/src/extra/timezone/timezones.data.d.ts +0 -7
- 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/map/index.d.ts +0 -1
- package/types/src/map/map.d.ts +0 -130
- package/types/src/payment-card-form/index.d.ts +0 -1
- package/types/src/payment-card-form/payment-card-form.d.ts +0 -85
- package/types/src/qr-scanner/index.d.ts +0 -1
- package/types/src/qr-scanner/qr-scanner.d.ts +0 -26
- package/types/src/timeline/index.d.ts +0 -1
- package/types/src/timeline/timeline-tile.d.ts +0 -44
- /package/dist/agent/{flow-CaPi2G8y.js → flow-CvG1fLW5.js} +0 -0
- /package/dist/agent/{vendor-material-color-Be96dpGE.js → vendor-material-color-DcL7ZPxx.js} +0 -0
- /package/dist/{form-CI59gad4.js → form-CFvwnfuJ.js} +0 -0
- /package/dist/{form-B2qudx_q.cjs → form-Ceijw1aA.cjs} +0 -0
- /package/dist/{hashContent-a8uVr3xs.js → hashContent-BU6jl5ih.js} +0 -0
- /package/dist/{hashContent-ejkBgDnN.cjs → hashContent-Bobsobip.cjs} +0 -0
- /package/dist/{overlay-stack-CCiTaf_C.js → overlay-stack-DCDS17uj.js} +0 -0
- /package/dist/{overlay-stack-CFGiYf34.cjs → overlay-stack-DPIe_aYv.cjs} +0 -0
- /package/dist/{rxjs-utils-BXpvHN4-.js → rxjs-utils-CVeJQ9KG.js} +0 -0
- /package/dist/{rxjs-utils-CaC-tdot.cjs → rxjs-utils-DCUHg_Ml.cjs} +0 -0
- /package/dist/{theme.interface-C_034TxG.js → theme.interface-B9TjbSBF.js} +0 -0
- /package/dist/{theme.interface-DESopuZS.cjs → theme.interface-BujperTo.cjs} +0 -0
package/dist/qr-scanner.cjs
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./chunk-CncqDLb2.cjs`),t=require(`./mixins-CAb0b03r.cjs`),n=require(`./decorate-DpFmy0nm.cjs`);let r=require(`rxjs`),i=require(`rxjs/operators`),a=require(`lit/decorators.js`),o=require(`lit`),s=require(`lit/directives/when.js`),c=require(`jsqr`);c=e.r(c,1);var l=class extends t.s{constructor(...e){super(...e),this.continuous=!0,this.hasPermission=!1,this.error=``,this.showSuccess=!1,this.stream=null,this.destroy$=new r.Subject,this.videoElement=null}static{this.styles=[o.css`
|
|
2
|
-
:host {
|
|
3
|
-
display: block;
|
|
4
|
-
width: 100%;
|
|
5
|
-
height: 100%;
|
|
6
|
-
min-height: 300px;
|
|
7
|
-
}
|
|
8
|
-
`]}connectedCallback(){super.connectedCallback(),this.startCamera()}async startCamera(){try{let e={video:{facingMode:`environment`,width:{ideal:1280},height:{ideal:720}}};this.stream=await navigator.mediaDevices.getUserMedia(e),this.hasPermission=!0,this.error=``,await this.updateComplete,this.videoElement=this.shadowRoot?.querySelector(`#video`),this.videoElement&&(this.videoElement.srcObject=this.stream,await this.videoElement.play(),this.startScanning())}catch{this.hasPermission=!1,this.error=`Camera access is required to scan QR codes. Please allow camera access and try again.`}}stopCamera(){this.destroy$.next(),this.stream&&=(this.stream.getTracks().forEach(e=>e.stop()),null),this.videoElement&&=(this.videoElement.srcObject=null,null),this.hasPermission=!1,this.error=``,this.showSuccess=!1}startScanning(){this.videoElement&&this.hasPermission&&(0,r.animationFrames)().pipe((0,i.map)(()=>this.scanFrame()),(0,i.filter)(e=>e!==null),(0,i.distinctUntilChanged)((e,t)=>e.data===t.data&&t.timestamp-e.timestamp<2e3),(0,i.throttleTime)(500),(0,i.takeUntil)(this.destroy$)).subscribe({next:e=>this.handleScanResult(e),error:e=>{}})}scanFrame(){if(!this.videoElement||this.videoElement.readyState!==HTMLMediaElement.HAVE_ENOUGH_DATA)return null;try{let e=document.createElement(`canvas`);e.width=this.videoElement.videoWidth,e.height=this.videoElement.videoHeight;let t=e.getContext(`2d`);if(!t)return null;t.drawImage(this.videoElement,0,0);let n=t.getImageData(0,0,e.width,e.height),r=(0,c.default)(n.data,n.width,n.height);if(r&&r.data)return{data:r.data,timestamp:Date.now()}}catch{}return null}handleScanResult(e){this.showSuccessFlash(),navigator.vibrate&&navigator.vibrate([100,50,100]),this.playSuccessSound(),this.dispatchEvent(new CustomEvent(`scan-result`,{detail:{data:e.data,timestamp:e.timestamp},bubbles:!0,composed:!0}))}showSuccessFlash(){this.showSuccess=!0,(0,r.timer)(500).pipe((0,i.takeUntil)(this.destroy$)).subscribe(()=>{this.showSuccess=!1})}playSuccessSound(){try{let e=new(window.AudioContext||window.webkitAudioContext),t=e.createOscillator(),n=e.createGain();t.connect(n),n.connect(e.destination),t.frequency.setValueAtTime(800,e.currentTime),t.frequency.setValueAtTime(1e3,e.currentTime+.1),n.gain.setValueAtTime(.3,e.currentTime),n.gain.exponentialRampToValueAtTime(.01,e.currentTime+.2),t.start(e.currentTime),t.stop(e.currentTime+.2)}catch{}}disconnectedCallback(){super.disconnectedCallback(),this.stopCamera(),this.destroy$.complete()}render(){return this.error?o.html`
|
|
9
|
-
<div class="w-full h-full flex flex-col items-center justify-center bg-black text-white text-center p-5">
|
|
10
|
-
<schmancy-icon size="64" class="mb-4">camera_alt</schmancy-icon>
|
|
11
|
-
<schmancy-typography type="headline" token="md" class="mb-4">Camera Permission Required</schmancy-typography>
|
|
12
|
-
<schmancy-typography type="body" token="md" class="mb-6 max-w-sm">${this.error}</schmancy-typography>
|
|
13
|
-
<schmancy-button variant="filled" @click=${()=>window.location.reload()}>Retry</schmancy-button>
|
|
14
|
-
</div>
|
|
15
|
-
`:o.html`
|
|
16
|
-
<div class="relative w-full h-full bg-black overflow-hidden rounded-xl">
|
|
17
|
-
<!-- Video Stream -->
|
|
18
|
-
<video id="video" class="absolute inset-0 w-full h-full object-cover" autoplay muted playsinline></video>
|
|
19
|
-
|
|
20
|
-
<!-- Success Flash -->
|
|
21
|
-
${(0,s.when)(this.showSuccess,()=>o.html`<div class="absolute inset-0 bg-green-400/30 pointer-events-none"></div>`)}
|
|
22
|
-
|
|
23
|
-
<!-- Minimal corner brackets - Apple style -->
|
|
24
|
-
<div class="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[250px] h-[250px] pointer-events-none animate-pulse">
|
|
25
|
-
<!-- Top-left corner -->
|
|
26
|
-
<div class="absolute top-0 left-0 w-12 h-12 border-t-4 border-l-4 border-white rounded-tl-2xl"></div>
|
|
27
|
-
<!-- Top-right corner -->
|
|
28
|
-
<div class="absolute top-0 right-0 w-12 h-12 border-t-4 border-r-4 border-white rounded-tr-2xl"></div>
|
|
29
|
-
<!-- Bottom-left corner -->
|
|
30
|
-
<div class="absolute bottom-0 left-0 w-12 h-12 border-b-4 border-l-4 border-white rounded-bl-2xl"></div>
|
|
31
|
-
<!-- Bottom-right corner -->
|
|
32
|
-
<div class="absolute bottom-0 right-0 w-12 h-12 border-b-4 border-r-4 border-white rounded-br-2xl"></div>
|
|
33
|
-
</div>
|
|
34
|
-
</div>
|
|
35
|
-
`}};n.t([(0,a.property)({type:Boolean})],l.prototype,`continuous`,void 0),n.t([(0,a.state)()],l.prototype,`hasPermission`,void 0),n.t([(0,a.state)()],l.prototype,`error`,void 0),n.t([(0,a.state)()],l.prototype,`showSuccess`,void 0),l=n.t([(0,a.customElement)(`schmancy-qr-scanner`)],l),Object.defineProperty(exports,`SchmancyQRScanner`,{enumerable:!0,get:function(){return l}});
|
package/dist/qr-scanner.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"qr-scanner.cjs","names":[],"sources":["../src/qr-scanner/qr-scanner.ts"],"sourcesContent":["import { SchmancyElement } from '@mixins/index'\nimport jsQR from 'jsqr'\nimport { css, html } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { when } from 'lit/directives/when.js'\nimport { animationFrames, Subject, timer } from 'rxjs'\nimport { distinctUntilChanged, filter, map, takeUntil, throttleTime } from 'rxjs/operators'\n\ninterface QRScanResult {\n\tdata: string\n\ttimestamp: number\n}\n\n@customElement('schmancy-qr-scanner')\nexport class SchmancyQRScanner extends SchmancyElement {\n\tstatic styles = [css`\n\t:host {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tmin-height: 300px;\n\t}\n`]\n\n\t@property({ type: Boolean }) continuous = true\n\n\t@state() private hasPermission = false\n\t@state() private error = ''\n\t@state() private showSuccess = false\n\n\tprivate stream: MediaStream | null = null\n\tprivate destroy$ = new Subject<void>()\n\tprivate videoElement: HTMLVideoElement | null = null\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback()\n\t\tthis.startCamera()\n\t}\n\n\tprivate async startCamera(): Promise<void> {\n\t\ttry {\n\t\t\tconst constraints: MediaStreamConstraints = {\n\t\t\t\tvideo: {\n\t\t\t\t\tfacingMode: 'environment',\n\t\t\t\t\twidth: { ideal: 1280 },\n\t\t\t\t\theight: { ideal: 720 },\n\t\t\t\t},\n\t\t\t}\n\n\t\t\tthis.stream = await navigator.mediaDevices.getUserMedia(constraints)\n\t\t\tthis.hasPermission = true\n\t\t\tthis.error = ''\n\n\t\t\tawait this.updateComplete\n\n\t\t\tthis.videoElement = this.shadowRoot?.querySelector('#video') as HTMLVideoElement\n\t\t\tif (this.videoElement) {\n\t\t\t\tthis.videoElement.srcObject = this.stream\n\t\t\t\tawait this.videoElement.play()\n\t\t\t\tthis.startScanning()\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error('Camera access denied:', error)\n\t\t\tthis.hasPermission = false\n\t\t\tthis.error = 'Camera access is required to scan QR codes. Please allow camera access and try again.'\n\t\t}\n\t}\n\n\tprivate stopCamera(): void {\n\t\tthis.destroy$.next()\n\n\t\tif (this.stream) {\n\t\t\tthis.stream.getTracks().forEach(track => track.stop())\n\t\t\tthis.stream = null\n\t\t}\n\n\t\tif (this.videoElement) {\n\t\t\tthis.videoElement.srcObject = null\n\t\t\tthis.videoElement = null\n\t\t}\n\n\t\tthis.hasPermission = false\n\t\tthis.error = ''\n\t\tthis.showSuccess = false\n\t}\n\n\tprivate startScanning(): void {\n\t\tif (!this.videoElement || !this.hasPermission) {\n\t\t\treturn\n\t\t}\n\n\t\tanimationFrames()\n\t\t\t.pipe(\n\t\t\t\tmap(() => this.scanFrame()),\n\t\t\t\tfilter((result): result is QRScanResult => result !== null),\n\t\t\t\tdistinctUntilChanged((prev, curr) => {\n\t\t\t\t\tif (prev.data !== curr.data) return false\n\t\t\t\t\treturn curr.timestamp - prev.timestamp < 2000\n\t\t\t\t}),\n\t\t\t\tthrottleTime(500),\n\t\t\t\ttakeUntil(this.destroy$),\n\t\t\t)\n\t\t\t.subscribe({\n\t\t\t\tnext: result => this.handleScanResult(result),\n\t\t\t\terror: error => {\n\t\t\t\t\tconsole.error('Scanning error:', error)\n\t\t\t\t},\n\t\t\t})\n\t}\n\n\tprivate scanFrame(): QRScanResult | null {\n\t\tif (!this.videoElement || this.videoElement.readyState !== HTMLMediaElement.HAVE_ENOUGH_DATA) {\n\t\t\treturn null\n\t\t}\n\n\t\ttry {\n\t\t\tconst canvas = document.createElement('canvas')\n\t\t\tcanvas.width = this.videoElement.videoWidth\n\t\t\tcanvas.height = this.videoElement.videoHeight\n\n\t\t\tconst ctx = canvas.getContext('2d')\n\t\t\tif (!ctx) return null\n\n\t\t\tctx.drawImage(this.videoElement, 0, 0)\n\t\t\tconst imageData = ctx.getImageData(0, 0, canvas.width, canvas.height)\n\n\t\t\tconst code = jsQR(imageData.data, imageData.width, imageData.height)\n\n\t\t\tif (code && code.data) {\n\t\t\t\treturn {\n\t\t\t\t\tdata: code.data,\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error('Frame scan error:', error)\n\t\t}\n\n\t\treturn null\n\t}\n\n\tprivate handleScanResult(result: QRScanResult): void {\n\t\tthis.showSuccessFlash()\n\n\t\t// Haptic feedback if available\n\t\tif (navigator.vibrate) {\n\t\t\tnavigator.vibrate([100, 50, 100])\n\t\t}\n\n\t\t// Audio feedback\n\t\tthis.playSuccessSound()\n\n\t\t// Dispatch scan result\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent('scan-result', {\n\t\t\t\tdetail: { data: result.data, timestamp: result.timestamp },\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t}),\n\t\t)\n\n\t}\n\n\tprivate showSuccessFlash(): void {\n\t\tthis.showSuccess = true\n\t\ttimer(500)\n\t\t\t.pipe(takeUntil(this.destroy$))\n\t\t\t.subscribe(() => {\n\t\t\t\tthis.showSuccess = false\n\t\t\t})\n\t}\n\n\tprivate playSuccessSound(): void {\n\t\ttry {\n\t\t\tconst AudioContextClass = window.AudioContext || (window as unknown as { webkitAudioContext: typeof AudioContext }).webkitAudioContext\n\t\t\tconst audioContext = new AudioContextClass()\n\t\t\tconst oscillator = audioContext.createOscillator()\n\t\t\tconst gainNode = audioContext.createGain()\n\n\t\t\toscillator.connect(gainNode)\n\t\t\tgainNode.connect(audioContext.destination)\n\n\t\t\toscillator.frequency.setValueAtTime(800, audioContext.currentTime)\n\t\t\toscillator.frequency.setValueAtTime(1000, audioContext.currentTime + 0.1)\n\n\t\t\tgainNode.gain.setValueAtTime(0.3, audioContext.currentTime)\n\t\t\tgainNode.gain.exponentialRampToValueAtTime(0.01, audioContext.currentTime + 0.2)\n\n\t\t\toscillator.start(audioContext.currentTime)\n\t\t\toscillator.stop(audioContext.currentTime + 0.2)\n\t\t} catch {\n\t\t\t// Audio feedback failed silently\n\t\t}\n\t}\n\n\tdisconnectedCallback() {\n\t\tsuper.disconnectedCallback()\n\t\tthis.stopCamera()\n\t\tthis.destroy$.complete()\n\t}\n\n\trender() {\n\t\tif (this.error) {\n\t\t\treturn html`\n\t\t\t\t<div class=\"w-full h-full flex flex-col items-center justify-center bg-black text-white text-center p-5\">\n\t\t\t\t\t<schmancy-icon size=\"64\" class=\"mb-4\">camera_alt</schmancy-icon>\n\t\t\t\t\t<schmancy-typography type=\"headline\" token=\"md\" class=\"mb-4\">Camera Permission Required</schmancy-typography>\n\t\t\t\t\t<schmancy-typography type=\"body\" token=\"md\" class=\"mb-6 max-w-sm\">${this.error}</schmancy-typography>\n\t\t\t\t\t<schmancy-button variant=\"filled\" @click=${() => window.location.reload()}>Retry</schmancy-button>\n\t\t\t\t</div>\n\t\t\t`\n\t\t}\n\n\t\treturn html`\n\t\t\t<div class=\"relative w-full h-full bg-black overflow-hidden rounded-xl\">\n\t\t\t\t<!-- Video Stream -->\n\t\t\t\t<video id=\"video\" class=\"absolute inset-0 w-full h-full object-cover\" autoplay muted playsinline></video>\n\n\t\t\t\t<!-- Success Flash -->\n\t\t\t\t${when(this.showSuccess, () => html`<div class=\"absolute inset-0 bg-green-400/30 pointer-events-none\"></div>`)}\n\n\t\t\t\t<!-- Minimal corner brackets - Apple style -->\n\t\t\t\t<div class=\"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[250px] h-[250px] pointer-events-none animate-pulse\">\n\t\t\t\t\t<!-- Top-left corner -->\n\t\t\t\t\t<div class=\"absolute top-0 left-0 w-12 h-12 border-t-4 border-l-4 border-white rounded-tl-2xl\"></div>\n\t\t\t\t\t<!-- Top-right corner -->\n\t\t\t\t\t<div class=\"absolute top-0 right-0 w-12 h-12 border-t-4 border-r-4 border-white rounded-tr-2xl\"></div>\n\t\t\t\t\t<!-- Bottom-left corner -->\n\t\t\t\t\t<div class=\"absolute bottom-0 left-0 w-12 h-12 border-b-4 border-l-4 border-white rounded-bl-2xl\"></div>\n\t\t\t\t\t<!-- Bottom-right corner -->\n\t\t\t\t\t<div class=\"absolute bottom-0 right-0 w-12 h-12 border-b-4 border-r-4 border-white rounded-br-2xl\"></div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-qr-scanner': SchmancyQRScanner\n\t}\n}\n"],"mappings":"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"}
|
package/dist/qr-scanner.js
DELETED
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
import { s as e } from "./mixins-B34UxxCe.js";
|
|
2
|
-
import { t } from "./decorate-23nYs4Le.js";
|
|
3
|
-
import { Subject as n, animationFrames as r, timer as i } from "rxjs";
|
|
4
|
-
import { distinctUntilChanged as a, filter as o, map as s, takeUntil as c, throttleTime as l } from "rxjs/operators";
|
|
5
|
-
import { customElement as u, property as d, state as f } from "lit/decorators.js";
|
|
6
|
-
import { css as p, html as m } from "lit";
|
|
7
|
-
import { when as h } from "lit/directives/when.js";
|
|
8
|
-
import g from "jsqr";
|
|
9
|
-
var _ = class extends e {
|
|
10
|
-
constructor(...e) {
|
|
11
|
-
super(...e), this.continuous = !0, this.hasPermission = !1, this.error = "", this.showSuccess = !1, this.stream = null, this.destroy$ = new n(), this.videoElement = null;
|
|
12
|
-
}
|
|
13
|
-
static {
|
|
14
|
-
this.styles = [p`
|
|
15
|
-
:host {
|
|
16
|
-
display: block;
|
|
17
|
-
width: 100%;
|
|
18
|
-
height: 100%;
|
|
19
|
-
min-height: 300px;
|
|
20
|
-
}
|
|
21
|
-
`];
|
|
22
|
-
}
|
|
23
|
-
connectedCallback() {
|
|
24
|
-
super.connectedCallback(), this.startCamera();
|
|
25
|
-
}
|
|
26
|
-
async startCamera() {
|
|
27
|
-
try {
|
|
28
|
-
let e = { video: {
|
|
29
|
-
facingMode: "environment",
|
|
30
|
-
width: { ideal: 1280 },
|
|
31
|
-
height: { ideal: 720 }
|
|
32
|
-
} };
|
|
33
|
-
this.stream = await navigator.mediaDevices.getUserMedia(e), this.hasPermission = !0, this.error = "", await this.updateComplete, this.videoElement = this.shadowRoot?.querySelector("#video"), this.videoElement && (this.videoElement.srcObject = this.stream, await this.videoElement.play(), this.startScanning());
|
|
34
|
-
} catch {
|
|
35
|
-
this.hasPermission = !1, this.error = "Camera access is required to scan QR codes. Please allow camera access and try again.";
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
stopCamera() {
|
|
39
|
-
this.destroy$.next(), this.stream &&= (this.stream.getTracks().forEach((e) => e.stop()), null), this.videoElement &&= (this.videoElement.srcObject = null, null), this.hasPermission = !1, this.error = "", this.showSuccess = !1;
|
|
40
|
-
}
|
|
41
|
-
startScanning() {
|
|
42
|
-
this.videoElement && this.hasPermission && r().pipe(s(() => this.scanFrame()), o((e) => e !== null), a((e, t) => e.data === t.data && t.timestamp - e.timestamp < 2e3), l(500), c(this.destroy$)).subscribe({
|
|
43
|
-
next: (e) => this.handleScanResult(e),
|
|
44
|
-
error: (e) => {}
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
scanFrame() {
|
|
48
|
-
if (!this.videoElement || this.videoElement.readyState !== HTMLMediaElement.HAVE_ENOUGH_DATA) return null;
|
|
49
|
-
try {
|
|
50
|
-
let e = document.createElement("canvas");
|
|
51
|
-
e.width = this.videoElement.videoWidth, e.height = this.videoElement.videoHeight;
|
|
52
|
-
let t = e.getContext("2d");
|
|
53
|
-
if (!t) return null;
|
|
54
|
-
t.drawImage(this.videoElement, 0, 0);
|
|
55
|
-
let n = t.getImageData(0, 0, e.width, e.height), r = g(n.data, n.width, n.height);
|
|
56
|
-
if (r && r.data) return {
|
|
57
|
-
data: r.data,
|
|
58
|
-
timestamp: Date.now()
|
|
59
|
-
};
|
|
60
|
-
} catch {}
|
|
61
|
-
return null;
|
|
62
|
-
}
|
|
63
|
-
handleScanResult(e) {
|
|
64
|
-
this.showSuccessFlash(), navigator.vibrate && navigator.vibrate([
|
|
65
|
-
100,
|
|
66
|
-
50,
|
|
67
|
-
100
|
|
68
|
-
]), this.playSuccessSound(), this.dispatchEvent(new CustomEvent("scan-result", {
|
|
69
|
-
detail: {
|
|
70
|
-
data: e.data,
|
|
71
|
-
timestamp: e.timestamp
|
|
72
|
-
},
|
|
73
|
-
bubbles: !0,
|
|
74
|
-
composed: !0
|
|
75
|
-
}));
|
|
76
|
-
}
|
|
77
|
-
showSuccessFlash() {
|
|
78
|
-
this.showSuccess = !0, i(500).pipe(c(this.destroy$)).subscribe(() => {
|
|
79
|
-
this.showSuccess = !1;
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
playSuccessSound() {
|
|
83
|
-
try {
|
|
84
|
-
let e = new (window.AudioContext || window.webkitAudioContext)(), t = e.createOscillator(), n = e.createGain();
|
|
85
|
-
t.connect(n), n.connect(e.destination), t.frequency.setValueAtTime(800, e.currentTime), t.frequency.setValueAtTime(1e3, e.currentTime + .1), n.gain.setValueAtTime(.3, e.currentTime), n.gain.exponentialRampToValueAtTime(.01, e.currentTime + .2), t.start(e.currentTime), t.stop(e.currentTime + .2);
|
|
86
|
-
} catch {}
|
|
87
|
-
}
|
|
88
|
-
disconnectedCallback() {
|
|
89
|
-
super.disconnectedCallback(), this.stopCamera(), this.destroy$.complete();
|
|
90
|
-
}
|
|
91
|
-
render() {
|
|
92
|
-
return this.error ? m`
|
|
93
|
-
<div class="w-full h-full flex flex-col items-center justify-center bg-black text-white text-center p-5">
|
|
94
|
-
<schmancy-icon size="64" class="mb-4">camera_alt</schmancy-icon>
|
|
95
|
-
<schmancy-typography type="headline" token="md" class="mb-4">Camera Permission Required</schmancy-typography>
|
|
96
|
-
<schmancy-typography type="body" token="md" class="mb-6 max-w-sm">${this.error}</schmancy-typography>
|
|
97
|
-
<schmancy-button variant="filled" @click=${() => window.location.reload()}>Retry</schmancy-button>
|
|
98
|
-
</div>
|
|
99
|
-
` : m`
|
|
100
|
-
<div class="relative w-full h-full bg-black overflow-hidden rounded-xl">
|
|
101
|
-
<!-- Video Stream -->
|
|
102
|
-
<video id="video" class="absolute inset-0 w-full h-full object-cover" autoplay muted playsinline></video>
|
|
103
|
-
|
|
104
|
-
<!-- Success Flash -->
|
|
105
|
-
${h(this.showSuccess, () => m`<div class="absolute inset-0 bg-green-400/30 pointer-events-none"></div>`)}
|
|
106
|
-
|
|
107
|
-
<!-- Minimal corner brackets - Apple style -->
|
|
108
|
-
<div class="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[250px] h-[250px] pointer-events-none animate-pulse">
|
|
109
|
-
<!-- Top-left corner -->
|
|
110
|
-
<div class="absolute top-0 left-0 w-12 h-12 border-t-4 border-l-4 border-white rounded-tl-2xl"></div>
|
|
111
|
-
<!-- Top-right corner -->
|
|
112
|
-
<div class="absolute top-0 right-0 w-12 h-12 border-t-4 border-r-4 border-white rounded-tr-2xl"></div>
|
|
113
|
-
<!-- Bottom-left corner -->
|
|
114
|
-
<div class="absolute bottom-0 left-0 w-12 h-12 border-b-4 border-l-4 border-white rounded-bl-2xl"></div>
|
|
115
|
-
<!-- Bottom-right corner -->
|
|
116
|
-
<div class="absolute bottom-0 right-0 w-12 h-12 border-b-4 border-r-4 border-white rounded-br-2xl"></div>
|
|
117
|
-
</div>
|
|
118
|
-
</div>
|
|
119
|
-
`;
|
|
120
|
-
}
|
|
121
|
-
};
|
|
122
|
-
t([d({ type: Boolean })], _.prototype, "continuous", void 0), t([f()], _.prototype, "hasPermission", void 0), t([f()], _.prototype, "error", void 0), t([f()], _.prototype, "showSuccess", void 0), _ = t([u("schmancy-qr-scanner")], _);
|
|
123
|
-
export { _ as SchmancyQRScanner };
|
package/dist/qr-scanner.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"qr-scanner.js","names":[],"sources":["../src/qr-scanner/qr-scanner.ts"],"sourcesContent":["import { SchmancyElement } from '@mixins/index'\nimport jsQR from 'jsqr'\nimport { css, html } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { when } from 'lit/directives/when.js'\nimport { animationFrames, Subject, timer } from 'rxjs'\nimport { distinctUntilChanged, filter, map, takeUntil, throttleTime } from 'rxjs/operators'\n\ninterface QRScanResult {\n\tdata: string\n\ttimestamp: number\n}\n\n@customElement('schmancy-qr-scanner')\nexport class SchmancyQRScanner extends SchmancyElement {\n\tstatic styles = [css`\n\t:host {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tmin-height: 300px;\n\t}\n`]\n\n\t@property({ type: Boolean }) continuous = true\n\n\t@state() private hasPermission = false\n\t@state() private error = ''\n\t@state() private showSuccess = false\n\n\tprivate stream: MediaStream | null = null\n\tprivate destroy$ = new Subject<void>()\n\tprivate videoElement: HTMLVideoElement | null = null\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback()\n\t\tthis.startCamera()\n\t}\n\n\tprivate async startCamera(): Promise<void> {\n\t\ttry {\n\t\t\tconst constraints: MediaStreamConstraints = {\n\t\t\t\tvideo: {\n\t\t\t\t\tfacingMode: 'environment',\n\t\t\t\t\twidth: { ideal: 1280 },\n\t\t\t\t\theight: { ideal: 720 },\n\t\t\t\t},\n\t\t\t}\n\n\t\t\tthis.stream = await navigator.mediaDevices.getUserMedia(constraints)\n\t\t\tthis.hasPermission = true\n\t\t\tthis.error = ''\n\n\t\t\tawait this.updateComplete\n\n\t\t\tthis.videoElement = this.shadowRoot?.querySelector('#video') as HTMLVideoElement\n\t\t\tif (this.videoElement) {\n\t\t\t\tthis.videoElement.srcObject = this.stream\n\t\t\t\tawait this.videoElement.play()\n\t\t\t\tthis.startScanning()\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error('Camera access denied:', error)\n\t\t\tthis.hasPermission = false\n\t\t\tthis.error = 'Camera access is required to scan QR codes. Please allow camera access and try again.'\n\t\t}\n\t}\n\n\tprivate stopCamera(): void {\n\t\tthis.destroy$.next()\n\n\t\tif (this.stream) {\n\t\t\tthis.stream.getTracks().forEach(track => track.stop())\n\t\t\tthis.stream = null\n\t\t}\n\n\t\tif (this.videoElement) {\n\t\t\tthis.videoElement.srcObject = null\n\t\t\tthis.videoElement = null\n\t\t}\n\n\t\tthis.hasPermission = false\n\t\tthis.error = ''\n\t\tthis.showSuccess = false\n\t}\n\n\tprivate startScanning(): void {\n\t\tif (!this.videoElement || !this.hasPermission) {\n\t\t\treturn\n\t\t}\n\n\t\tanimationFrames()\n\t\t\t.pipe(\n\t\t\t\tmap(() => this.scanFrame()),\n\t\t\t\tfilter((result): result is QRScanResult => result !== null),\n\t\t\t\tdistinctUntilChanged((prev, curr) => {\n\t\t\t\t\tif (prev.data !== curr.data) return false\n\t\t\t\t\treturn curr.timestamp - prev.timestamp < 2000\n\t\t\t\t}),\n\t\t\t\tthrottleTime(500),\n\t\t\t\ttakeUntil(this.destroy$),\n\t\t\t)\n\t\t\t.subscribe({\n\t\t\t\tnext: result => this.handleScanResult(result),\n\t\t\t\terror: error => {\n\t\t\t\t\tconsole.error('Scanning error:', error)\n\t\t\t\t},\n\t\t\t})\n\t}\n\n\tprivate scanFrame(): QRScanResult | null {\n\t\tif (!this.videoElement || this.videoElement.readyState !== HTMLMediaElement.HAVE_ENOUGH_DATA) {\n\t\t\treturn null\n\t\t}\n\n\t\ttry {\n\t\t\tconst canvas = document.createElement('canvas')\n\t\t\tcanvas.width = this.videoElement.videoWidth\n\t\t\tcanvas.height = this.videoElement.videoHeight\n\n\t\t\tconst ctx = canvas.getContext('2d')\n\t\t\tif (!ctx) return null\n\n\t\t\tctx.drawImage(this.videoElement, 0, 0)\n\t\t\tconst imageData = ctx.getImageData(0, 0, canvas.width, canvas.height)\n\n\t\t\tconst code = jsQR(imageData.data, imageData.width, imageData.height)\n\n\t\t\tif (code && code.data) {\n\t\t\t\treturn {\n\t\t\t\t\tdata: code.data,\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error('Frame scan error:', error)\n\t\t}\n\n\t\treturn null\n\t}\n\n\tprivate handleScanResult(result: QRScanResult): void {\n\t\tthis.showSuccessFlash()\n\n\t\t// Haptic feedback if available\n\t\tif (navigator.vibrate) {\n\t\t\tnavigator.vibrate([100, 50, 100])\n\t\t}\n\n\t\t// Audio feedback\n\t\tthis.playSuccessSound()\n\n\t\t// Dispatch scan result\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent('scan-result', {\n\t\t\t\tdetail: { data: result.data, timestamp: result.timestamp },\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t}),\n\t\t)\n\n\t}\n\n\tprivate showSuccessFlash(): void {\n\t\tthis.showSuccess = true\n\t\ttimer(500)\n\t\t\t.pipe(takeUntil(this.destroy$))\n\t\t\t.subscribe(() => {\n\t\t\t\tthis.showSuccess = false\n\t\t\t})\n\t}\n\n\tprivate playSuccessSound(): void {\n\t\ttry {\n\t\t\tconst AudioContextClass = window.AudioContext || (window as unknown as { webkitAudioContext: typeof AudioContext }).webkitAudioContext\n\t\t\tconst audioContext = new AudioContextClass()\n\t\t\tconst oscillator = audioContext.createOscillator()\n\t\t\tconst gainNode = audioContext.createGain()\n\n\t\t\toscillator.connect(gainNode)\n\t\t\tgainNode.connect(audioContext.destination)\n\n\t\t\toscillator.frequency.setValueAtTime(800, audioContext.currentTime)\n\t\t\toscillator.frequency.setValueAtTime(1000, audioContext.currentTime + 0.1)\n\n\t\t\tgainNode.gain.setValueAtTime(0.3, audioContext.currentTime)\n\t\t\tgainNode.gain.exponentialRampToValueAtTime(0.01, audioContext.currentTime + 0.2)\n\n\t\t\toscillator.start(audioContext.currentTime)\n\t\t\toscillator.stop(audioContext.currentTime + 0.2)\n\t\t} catch {\n\t\t\t// Audio feedback failed silently\n\t\t}\n\t}\n\n\tdisconnectedCallback() {\n\t\tsuper.disconnectedCallback()\n\t\tthis.stopCamera()\n\t\tthis.destroy$.complete()\n\t}\n\n\trender() {\n\t\tif (this.error) {\n\t\t\treturn html`\n\t\t\t\t<div class=\"w-full h-full flex flex-col items-center justify-center bg-black text-white text-center p-5\">\n\t\t\t\t\t<schmancy-icon size=\"64\" class=\"mb-4\">camera_alt</schmancy-icon>\n\t\t\t\t\t<schmancy-typography type=\"headline\" token=\"md\" class=\"mb-4\">Camera Permission Required</schmancy-typography>\n\t\t\t\t\t<schmancy-typography type=\"body\" token=\"md\" class=\"mb-6 max-w-sm\">${this.error}</schmancy-typography>\n\t\t\t\t\t<schmancy-button variant=\"filled\" @click=${() => window.location.reload()}>Retry</schmancy-button>\n\t\t\t\t</div>\n\t\t\t`\n\t\t}\n\n\t\treturn html`\n\t\t\t<div class=\"relative w-full h-full bg-black overflow-hidden rounded-xl\">\n\t\t\t\t<!-- Video Stream -->\n\t\t\t\t<video id=\"video\" class=\"absolute inset-0 w-full h-full object-cover\" autoplay muted playsinline></video>\n\n\t\t\t\t<!-- Success Flash -->\n\t\t\t\t${when(this.showSuccess, () => html`<div class=\"absolute inset-0 bg-green-400/30 pointer-events-none\"></div>`)}\n\n\t\t\t\t<!-- Minimal corner brackets - Apple style -->\n\t\t\t\t<div class=\"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[250px] h-[250px] pointer-events-none animate-pulse\">\n\t\t\t\t\t<!-- Top-left corner -->\n\t\t\t\t\t<div class=\"absolute top-0 left-0 w-12 h-12 border-t-4 border-l-4 border-white rounded-tl-2xl\"></div>\n\t\t\t\t\t<!-- Top-right corner -->\n\t\t\t\t\t<div class=\"absolute top-0 right-0 w-12 h-12 border-t-4 border-r-4 border-white rounded-tr-2xl\"></div>\n\t\t\t\t\t<!-- Bottom-left corner -->\n\t\t\t\t\t<div class=\"absolute bottom-0 left-0 w-12 h-12 border-b-4 border-l-4 border-white rounded-bl-2xl\"></div>\n\t\t\t\t\t<!-- Bottom-right corner -->\n\t\t\t\t\t<div class=\"absolute bottom-0 right-0 w-12 h-12 border-b-4 border-r-4 border-white rounded-br-2xl\"></div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-qr-scanner': SchmancyQRScanner\n\t}\n}\n"],"mappings":"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"}
|
package/dist/skills/charts.md
DELETED
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
# Schmancy Charts
|
|
2
|
-
|
|
3
|
-
> Canvas-rendered area chart and horizontal pill chart. Theme-aware, lazy-animated, with auto peak highlighting.
|
|
4
|
-
|
|
5
|
-
## schmancy-area-chart
|
|
6
|
-
|
|
7
|
-
> Smooth Catmull-Rom spline area chart with peak markers and hover tooltips.
|
|
8
|
-
|
|
9
|
-
```html
|
|
10
|
-
<schmancy-area-chart
|
|
11
|
-
.data=${[
|
|
12
|
-
{ label: '9 AM', value: 12.4 },
|
|
13
|
-
{ label: '10 AM', value: 18.9 },
|
|
14
|
-
{ label: '11 AM', value: 42.1, metadata: { users: 320 } },
|
|
15
|
-
{ label: '12 PM', value: 56.7 },
|
|
16
|
-
]}
|
|
17
|
-
value-prefix="EUR "
|
|
18
|
-
value-decimals="2"
|
|
19
|
-
peak-count="2"
|
|
20
|
-
height="240"
|
|
21
|
-
></schmancy-area-chart>
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
### Properties
|
|
25
|
-
| Property | Type | Default | Description |
|
|
26
|
-
|----------|------|---------|-------------|
|
|
27
|
-
| `data` | `ChartDataPoint[]` | `[]` | `{ label, value, metadata? }[]` |
|
|
28
|
-
| `height` | number | `200` | Chart height in px |
|
|
29
|
-
| `showGrid` | boolean | `true` | Background grid lines |
|
|
30
|
-
| `showLabels` | boolean | `true` | X-axis labels |
|
|
31
|
-
| `showTooltip` | boolean | `true` | Hover tooltip |
|
|
32
|
-
| `peakCount` | number | `3` | Top-N points highlighted larger |
|
|
33
|
-
| `animationDuration` | number | `800` | Entrance animation ms |
|
|
34
|
-
| `animated` | boolean | `true` | Animate on first visible |
|
|
35
|
-
| `valuePrefix` | string | `''` | Display prefix (e.g. `"EUR "`) |
|
|
36
|
-
| `valueSuffix` | string | `''` | Display suffix (e.g. `"%"`) |
|
|
37
|
-
| `valueDecimals` | number | `2` | Decimal places |
|
|
38
|
-
| `theme` | `Partial<ChartTheme>` | `{}` | Override colors, stroke, radii |
|
|
39
|
-
|
|
40
|
-
### ChartTheme
|
|
41
|
-
| Key | Default | Description |
|
|
42
|
-
|-----|---------|-------------|
|
|
43
|
-
| `primaryColor` | `--schmancy-sys-color-primary` | Line + fill gradient color |
|
|
44
|
-
| `gradientOpacity` | `[0.4, 0.05]` | Top/bottom fill opacity |
|
|
45
|
-
| `strokeWidth` | `2` | Line thickness |
|
|
46
|
-
| `pointRadius` | `4` | Normal point radius |
|
|
47
|
-
| `peakRadius` | `6` | Peak point radius |
|
|
48
|
-
|
|
49
|
-
## schmancy-pills
|
|
50
|
-
|
|
51
|
-
> Horizontal bar chart with optional stacked segments, medal ranks, and peak/low styling.
|
|
52
|
-
|
|
53
|
-
```html
|
|
54
|
-
<schmancy-pills
|
|
55
|
-
.data=${[
|
|
56
|
-
{ label: 'Mon', value: 1240, rank: 1 },
|
|
57
|
-
{ label: 'Tue', value: 980 },
|
|
58
|
-
{ label: 'Wed', value: 1830, rank: 2, segments: [
|
|
59
|
-
{ label: 'Pizza', value: 1200 },
|
|
60
|
-
{ label: 'Drinks', value: 630 }
|
|
61
|
-
]},
|
|
62
|
-
]}
|
|
63
|
-
></schmancy-pills>
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
### Properties
|
|
67
|
-
| Property | Type | Default | Description |
|
|
68
|
-
|----------|------|---------|-------------|
|
|
69
|
-
| `data` | `PillDataPoint[]` | `[]` | Rows with optional stacked `segments` |
|
|
70
|
-
| `valuePrefix` / `valueSuffix` / `valueDecimals` | — | — | Value formatting (same as area chart) |
|
|
71
|
-
| `showMedals` | boolean | `true` | Show 🥇🥈🥉 for rank 1/2/3 |
|
|
72
|
-
|
|
73
|
-
### PillDataPoint
|
|
74
|
-
```typescript
|
|
75
|
-
{
|
|
76
|
-
label: string
|
|
77
|
-
value: number
|
|
78
|
-
segments?: { label, value, color }[] // stacked
|
|
79
|
-
isPeak?: boolean // highlighted
|
|
80
|
-
isLow?: boolean // muted
|
|
81
|
-
rank?: 1 | 2 | 3 // medal
|
|
82
|
-
metadata?: Record<string, unknown>
|
|
83
|
-
}
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
## Behavior
|
|
87
|
-
- Both charts use an IntersectionObserver to defer animation until visible.
|
|
88
|
-
- Responsive — resize triggers a re-render.
|
|
89
|
-
- Dark/light aware via theme CSS variables.
|
|
90
|
-
|
|
91
|
-
## When to Use
|
|
92
|
-
- Area chart: time-series or comparative trends.
|
|
93
|
-
- Pills: ranked categorical data (leaderboards, top days, distribution).
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
# schmancy-code
|
|
2
|
-
|
|
3
|
-
> Syntax-highlighted code block with line numbers, copy button, and collapsible display.
|
|
4
|
-
|
|
5
|
-
## Usage
|
|
6
|
-
```html
|
|
7
|
-
<schmancy-code language="typescript" .code=${'const x = 42'}></schmancy-code>
|
|
8
|
-
```
|
|
9
|
-
|
|
10
|
-
## Properties
|
|
11
|
-
| Property | Type | Default | Description |
|
|
12
|
-
|----------|------|---------|-------------|
|
|
13
|
-
| code | string | `''` | Code content to highlight |
|
|
14
|
-
| language | string | `'javascript'` | Language for syntax highlighting |
|
|
15
|
-
| filename | string | `undefined` | Filename shown in header |
|
|
16
|
-
| lineNumbers | boolean | `false` | Show line numbers |
|
|
17
|
-
| copyButton | boolean | `true` | Show copy-to-clipboard button |
|
|
18
|
-
| highlightLines | string | `undefined` | Lines to highlight (e.g., `'1-3,5,7-9'`) |
|
|
19
|
-
| maxHeight | string | `undefined` | Max height before scrolling |
|
|
20
|
-
|
|
21
|
-
## Supported Languages
|
|
22
|
-
javascript, typescript, html, xml, markdown, bash
|
|
23
|
-
|
|
24
|
-
## Examples
|
|
25
|
-
```html
|
|
26
|
-
<!-- TypeScript with line numbers and highlighted lines -->
|
|
27
|
-
<schmancy-code
|
|
28
|
-
language="typescript"
|
|
29
|
-
lineNumbers
|
|
30
|
-
highlightLines="2-3"
|
|
31
|
-
.code=${`import { html } from 'lit'
|
|
32
|
-
const greeting = 'Hello'
|
|
33
|
-
console.log(greeting)`}>
|
|
34
|
-
</schmancy-code>
|
|
35
|
-
|
|
36
|
-
<!-- Bash with filename -->
|
|
37
|
-
<schmancy-code language="bash" filename="install.sh"
|
|
38
|
-
.code=${'npm install @mhmo91/schmancy'}>
|
|
39
|
-
</schmancy-code>
|
|
40
|
-
|
|
41
|
-
<!-- With max height -->
|
|
42
|
-
<schmancy-code language="javascript" maxHeight="300px"
|
|
43
|
-
.code=${longCodeString}>
|
|
44
|
-
</schmancy-code>
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
Renders inside a collapsible `schmancy-details` with a macOS-style header (colored dots + language label). Uses highlight.js with schmancy color tokens.
|
package/dist/skills/extra.md
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
# Schmancy Extra
|
|
2
|
-
|
|
3
|
-
> Data-driven dropdowns for common localization fields. Country and timezone pickers, form-associated and autocomplete-backed.
|
|
4
|
-
|
|
5
|
-
## schmancy-select-countries
|
|
6
|
-
Fully autocomplete-searchable country dropdown. Form-associated (participates in `<form>` submission and validation via `ElementInternals`).
|
|
7
|
-
|
|
8
|
-
```html
|
|
9
|
-
<schmancy-select-countries
|
|
10
|
-
name="country"
|
|
11
|
-
label="Country"
|
|
12
|
-
placeholder="Select a country"
|
|
13
|
-
required
|
|
14
|
-
value="DE"
|
|
15
|
-
@change=${e => this.country = e.target.value}
|
|
16
|
-
></schmancy-select-countries>
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
| Property | Type | Default | Description |
|
|
20
|
-
|----------|------|---------|-------------|
|
|
21
|
-
| `value` | string | — | ISO country code (reflected) |
|
|
22
|
-
| `name` | string | `''` | Form field name |
|
|
23
|
-
| `label` | string | `'Country'` | Visible label |
|
|
24
|
-
| `hint` | string | `'Please select a country'` | Helper text |
|
|
25
|
-
| `placeholder` | string | `'Select a country'` | Placeholder in the input |
|
|
26
|
-
| `required` | boolean | `false` | Validation constraint |
|
|
27
|
-
|
|
28
|
-
## schmancy-select-timezones
|
|
29
|
-
Same pattern as countries, backed by timezone data.
|
|
30
|
-
|
|
31
|
-
```html
|
|
32
|
-
<schmancy-select-timezones
|
|
33
|
-
name="timezone"
|
|
34
|
-
label="Timezone"
|
|
35
|
-
value="Europe/Berlin"
|
|
36
|
-
></schmancy-select-timezones>
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
Accepts the same set of properties (`value`, `name`, `label`, `hint`, `placeholder`, `required`).
|
|
40
|
-
|
|
41
|
-
## Raw Data Exports
|
|
42
|
-
If you want the underlying data without the component:
|
|
43
|
-
```typescript
|
|
44
|
-
import countries from '@mhmo91/schmancy' // default export from countries.data
|
|
45
|
-
import timezones from '@mhmo91/schmancy' // default export from timezones.data
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
Each countries row: `{ code, name, dialCode?, flag?, ... }`. Timezones: `{ name, offset, label, ... }`.
|
|
49
|
-
|
|
50
|
-
## Form Integration
|
|
51
|
-
Both use `formAssociated = true` and register with the parent `<form>`. Works with native `form.checkValidity()` and with [`schmancy-form`](./form.md).
|
|
52
|
-
|
|
53
|
-
```html
|
|
54
|
-
<schmancy-form @submit=${this.onSubmit}>
|
|
55
|
-
<schmancy-select-countries name="country" required></schmancy-select-countries>
|
|
56
|
-
<schmancy-select-timezones name="timezone" required></schmancy-select-timezones>
|
|
57
|
-
<schmancy-button type="submit" variant="filled">Save</schmancy-button>
|
|
58
|
-
</schmancy-form>
|
|
59
|
-
```
|
package/dist/skills/mailbox.md
DELETED
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
# Schmancy Mailbox
|
|
2
|
-
|
|
3
|
-
> Full email composition + campaign management system. Orchestrates recipients, templates, editor, attachments, and preview.
|
|
4
|
-
|
|
5
|
-
## Components
|
|
6
|
-
|
|
7
|
-
| Tag | Purpose |
|
|
8
|
-
|-----|---------|
|
|
9
|
-
| `schmancy-mailbox` | Top-level orchestrator |
|
|
10
|
-
| `schmancy-email-editor` | Subject + body composition |
|
|
11
|
-
| `schmancy-email-viewer` | HTML/plaintext preview |
|
|
12
|
-
| `schmancy-email-recipients` | Recipient list with import/CSV |
|
|
13
|
-
| `schmancy-email-layout-selector` | Layout template picker |
|
|
14
|
-
| `schmancy-email-template-picker` | Email template browser |
|
|
15
|
-
|
|
16
|
-
## Usage
|
|
17
|
-
```html
|
|
18
|
-
<schmancy-mailbox
|
|
19
|
-
.config=${{
|
|
20
|
-
sendEndpoint: '/api/emails/send',
|
|
21
|
-
uploadEndpoint: '/api/uploads',
|
|
22
|
-
authenticateRequest: (req) => ({ ...req, headers: { Authorization: `Bearer ${token}` } })
|
|
23
|
-
}}
|
|
24
|
-
.templates=${myTemplates}
|
|
25
|
-
.importSources=${[
|
|
26
|
-
{ id: 'ticketholders', label: 'Ticket holders', icon: 'confirmation_number', handler: loadTicketHolders },
|
|
27
|
-
{ id: 'waitlist', label: 'Waitlist', icon: 'hourglass_empty', handler: loadWaitlist },
|
|
28
|
-
]}
|
|
29
|
-
></schmancy-mailbox>
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
## schmancy-mailbox Properties
|
|
33
|
-
| Property | Type | Default | Description |
|
|
34
|
-
|----------|------|---------|-------------|
|
|
35
|
-
| `config` | `EmailComposeConfig` | `{}` | Endpoints, auth, upload handlers |
|
|
36
|
-
| `templates` | `EmailTemplate[]` | `[]` | Available email templates |
|
|
37
|
-
| `importSources` | `ImportSource[]` | `[]` | Import buttons shown in recipients panel |
|
|
38
|
-
| `disabled` | boolean | `false` | Disable all interactions |
|
|
39
|
-
| `recipientsTitle` | string | `'Recipients'` | Recipients panel heading |
|
|
40
|
-
| `recipientsEmptyTitle` | string | `'No recipients yet'` | Empty state title |
|
|
41
|
-
| `recipientsEmptyMessage` | string | `'Import from sources or upload a CSV'` | Empty state body |
|
|
42
|
-
| `enableCsvImport` | boolean | `true` | Allow CSV file import |
|
|
43
|
-
| `enableDragDrop` | boolean | `true` | Accept dropped CSV files |
|
|
44
|
-
|
|
45
|
-
## Key Types
|
|
46
|
-
```typescript
|
|
47
|
-
interface EmailTemplate { id, name, subject, body, category?, thumbnail? }
|
|
48
|
-
|
|
49
|
-
interface EmailComposeConfig {
|
|
50
|
-
sendEndpoint?: string
|
|
51
|
-
templatesEndpoint?: string
|
|
52
|
-
uploadEndpoint?: string
|
|
53
|
-
authenticateRequest?: (req: RequestInit) => RequestInit
|
|
54
|
-
uploadHandler?: (file: File) => Promise<string>
|
|
55
|
-
imageUploadHandler?: (file: File) => Promise<string>
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
interface SendEmailRequest {
|
|
59
|
-
recipients: string[]
|
|
60
|
-
subject: string
|
|
61
|
-
body: string
|
|
62
|
-
attachments: EmailAttachment[]
|
|
63
|
-
templateId?: string | null
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
interface ImportSource {
|
|
67
|
-
id: string
|
|
68
|
-
label: string
|
|
69
|
-
icon: string // Material icon name
|
|
70
|
-
handler: () => void // Populates recipients via events
|
|
71
|
-
}
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
## Events
|
|
75
|
-
| Event | Detail | Where |
|
|
76
|
-
|-------|--------|-------|
|
|
77
|
-
| `emails-imported` | `{ emails, source }` | Recipients |
|
|
78
|
-
| `recipient-removed` | `{ email }` | Recipients |
|
|
79
|
-
| `recipients-cleared` | `{}` | Recipients |
|
|
80
|
-
| `selection-changed` | `{ selectedEmails }` | Recipients |
|
|
81
|
-
| `compose-changed` | `{ subject, body, templateId, attachments }` | Editor |
|
|
82
|
-
| `send-email` | `{ request: SendEmailRequest }` | Mailbox — consumer POSTs to backend |
|
|
83
|
-
| `send-error` | `{ error }` | Mailbox |
|
|
84
|
-
|
|
85
|
-
## Recipients Flow
|
|
86
|
-
1. User clicks an `ImportSource` button (or drops a CSV).
|
|
87
|
-
2. CSV is parsed → `validEmails`, `invalidEmails`, `duplicates` reported.
|
|
88
|
-
3. `emails-imported` event fires; mailbox merges into selected recipients.
|
|
89
|
-
4. User edits subject/body via email-editor; changes bubble as `compose-changed`.
|
|
90
|
-
5. On send, `send-email` fires with the full `SendEmailRequest` — parent handles network.
|
|
91
|
-
|
|
92
|
-
## Minimal Integration
|
|
93
|
-
```typescript
|
|
94
|
-
<schmancy-mailbox
|
|
95
|
-
.config=${config}
|
|
96
|
-
.templates=${templates}
|
|
97
|
-
@send-email=${async (e: CustomEvent<{ request: SendEmailRequest }>) => {
|
|
98
|
-
const result = await api.sendCampaign(e.detail.request)
|
|
99
|
-
if (!result.success) this.dispatchError(result.message)
|
|
100
|
-
}}
|
|
101
|
-
></schmancy-mailbox>
|
|
102
|
-
```
|
package/dist/skills/map.md
DELETED
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
# schmancy-map
|
|
2
|
-
|
|
3
|
-
> Google Maps component. Accepts address string (auto-geocoded) or exact lat/lng. Singleton-loaded Maps SDK.
|
|
4
|
-
|
|
5
|
-
## Usage
|
|
6
|
-
```html
|
|
7
|
-
<!-- By address -->
|
|
8
|
-
<schmancy-map
|
|
9
|
-
address="Times Square, New York"
|
|
10
|
-
api-key="YOUR_GOOGLE_MAPS_KEY"
|
|
11
|
-
></schmancy-map>
|
|
12
|
-
|
|
13
|
-
<!-- By coordinates -->
|
|
14
|
-
<schmancy-map
|
|
15
|
-
.latitude=${40.758}
|
|
16
|
-
.longitude=${-73.985}
|
|
17
|
-
.zoom=${15}
|
|
18
|
-
type="satellite"
|
|
19
|
-
api-key="YOUR_GOOGLE_MAPS_KEY"
|
|
20
|
-
></schmancy-map>
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
## Properties
|
|
24
|
-
| Property | Type | Default | Description |
|
|
25
|
-
|----------|------|---------|-------------|
|
|
26
|
-
| `address` | string | — | Location for geocoding (e.g. `"Eiffel Tower, Paris"`) |
|
|
27
|
-
| `latitude` | number | — | Precise latitude (takes precedence over address) |
|
|
28
|
-
| `longitude` | number | — | Precise longitude |
|
|
29
|
-
| `zoom` | number | default Maps default | Map zoom level |
|
|
30
|
-
| `type` | `'roadmap' \| 'satellite' \| 'hybrid' \| 'terrain'` | `'roadmap'` | Map style |
|
|
31
|
-
| `height` | string | — | Custom height (e.g. `'400px'`, `'60vh'`) |
|
|
32
|
-
| `apiKey` | string | **required** | Google Maps API key |
|
|
33
|
-
|
|
34
|
-
## Behavior
|
|
35
|
-
- The first `schmancy-map` instance triggers a singleton script load of `maps.googleapis.com/maps/api/js` with the `places` library.
|
|
36
|
-
- Subsequent instances reuse the same loader — no duplicate network requests.
|
|
37
|
-
- If `address` is provided without coordinates, the built-in `Geocoder` resolves it before rendering.
|
|
38
|
-
- Errors (invalid key, unauthorized domain, geocode failure) render a fallback message inside the host.
|
|
39
|
-
|
|
40
|
-
## Setup
|
|
41
|
-
1. Acquire a Google Maps JavaScript API key from Google Cloud Console.
|
|
42
|
-
2. Enable the **Maps JavaScript API** and **Geocoding API**.
|
|
43
|
-
3. Add your domain to the authorized list.
|
|
44
|
-
|
|
45
|
-
## Example
|
|
46
|
-
```html
|
|
47
|
-
<schmancy-surface type="subtle" rounded="all">
|
|
48
|
-
<schmancy-map
|
|
49
|
-
address="1600 Amphitheatre Parkway, Mountain View, CA"
|
|
50
|
-
height="320px"
|
|
51
|
-
type="hybrid"
|
|
52
|
-
.apiKey=${import.meta.env.VITE_GOOGLE_MAPS_KEY}
|
|
53
|
-
></schmancy-map>
|
|
54
|
-
</schmancy-surface>
|
|
55
|
-
```
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
# schmancy-qr-scanner
|
|
2
|
-
|
|
3
|
-
> Camera-based QR code scanner using `jsQR`. Requests rear-camera access, decodes frames in real time, deduplicates reads.
|
|
4
|
-
|
|
5
|
-
## Usage
|
|
6
|
-
```html
|
|
7
|
-
<schmancy-qr-scanner
|
|
8
|
-
continuous
|
|
9
|
-
@scan-result=${e => this.handleScan(e.detail.data)}
|
|
10
|
-
></schmancy-qr-scanner>
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
```typescript
|
|
14
|
-
handleScan(data: string) {
|
|
15
|
-
console.log('QR decoded:', data)
|
|
16
|
-
}
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
## Properties
|
|
20
|
-
| Property | Type | Default | Description |
|
|
21
|
-
|----------|------|---------|-------------|
|
|
22
|
-
| `continuous` | boolean | `true` | Keep scanning after a successful read (dedupe repeated reads) |
|
|
23
|
-
|
|
24
|
-
## Events
|
|
25
|
-
| Event | Detail | When |
|
|
26
|
-
|-------|--------|------|
|
|
27
|
-
| `scan-result` | `{ data: string, timestamp: number }` | QR code successfully decoded |
|
|
28
|
-
|
|
29
|
-
## Behavior
|
|
30
|
-
- Requests `getUserMedia` with `facingMode: 'environment'` (rear camera) at 1280×720.
|
|
31
|
-
- Decodes via `jsQR` on `animationFrames` stream with `throttleTime` to avoid CPU thrashing.
|
|
32
|
-
- `distinctUntilChanged` prevents duplicate emissions for the same code.
|
|
33
|
-
- Brief success flash on each valid read.
|
|
34
|
-
- Stops camera + tears down subscriptions on disconnect.
|
|
35
|
-
- Displays an error state if camera permission is denied.
|
|
36
|
-
|
|
37
|
-
## Requires
|
|
38
|
-
- HTTPS (or `localhost`) for camera access.
|
|
39
|
-
- User permission to the camera.
|
|
40
|
-
|
|
41
|
-
## Example
|
|
42
|
-
```html
|
|
43
|
-
<schmancy-surface type="glass" rounded="all">
|
|
44
|
-
<schmancy-qr-scanner
|
|
45
|
-
@scan-result=${(e: CustomEvent<{ data: string }>) => {
|
|
46
|
-
$notify.success(`Scanned: ${e.detail.data}`)
|
|
47
|
-
this.scannedCode = e.detail.data
|
|
48
|
-
}}
|
|
49
|
-
></schmancy-qr-scanner>
|
|
50
|
-
</schmancy-surface>
|
|
51
|
-
```
|