@mhmo91/schmancy 0.10.6 → 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 +11 -880
- package/dist/agent/{flow-3RrZM-e7.js.map → flow-CvG1fLW5.js.map} +1 -1
- package/dist/agent/schmancy.agent.js +5223 -10404
- package/dist/agent/schmancy.agent.js.map +1 -1
- package/dist/agent/schmancy.manifest.json +4 -537
- package/dist/agent/{vendor-material-color-33Mj762T.js.map → vendor-material-color-DcL7ZPxx.js.map} +1 -1
- package/dist/{area-oZjYJlUy.cjs → area-8IBAXzbC.cjs} +1 -1
- package/dist/{area-oZjYJlUy.cjs.map → area-8IBAXzbC.cjs.map} +1 -1
- package/dist/{area-CIZZ5tbB.js → area-DSW_LYXQ.js} +1 -1
- package/dist/{area-CIZZ5tbB.js.map → area-DSW_LYXQ.js.map} +1 -1
- package/dist/area.cjs +1 -1
- package/dist/area.js +1 -1
- package/dist/{autocomplete-X20i6D62.cjs → autocomplete-9PLjlFYt.cjs} +1 -1
- package/dist/{autocomplete-X20i6D62.cjs.map → autocomplete-9PLjlFYt.cjs.map} +1 -1
- package/dist/{autocomplete-C1oDLuol.js → autocomplete-CXwwmUbC.js} +2 -2
- package/dist/{autocomplete-C1oDLuol.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-CUx58Gwe.cjs → boat-CpGNeWav.cjs} +1 -1
- package/dist/{boat-CUx58Gwe.cjs.map → boat-CpGNeWav.cjs.map} +1 -1
- package/dist/{boat-CpE0yAlK.js → boat-Dwn5oXd8.js} +1 -1
- package/dist/{boat-CpE0yAlK.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-D1DKZhgV.cjs → busy-CUUgvimY.cjs} +1 -1
- package/dist/{busy-D1DKZhgV.cjs.map → busy-CUUgvimY.cjs.map} +1 -1
- package/dist/{busy-C9n-DUY4.js → busy-Cjm1BYVC.js} +1 -1
- package/dist/{busy-C9n-DUY4.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-B3hN-qzk.js → card-BR22oYCL.js} +1 -1
- package/dist/{card-B3hN-qzk.js.map → card-BR22oYCL.js.map} +1 -1
- package/dist/{card-DZJ7qjf2.cjs → card-BjZ_WRr3.cjs} +1 -1
- package/dist/{card-DZJ7qjf2.cjs.map → card-BjZ_WRr3.cjs.map} +1 -1
- package/dist/card.cjs +1 -1
- package/dist/card.js +1 -1
- package/dist/{checkbox-DapdzDow.cjs → checkbox-2e8v7CNg.cjs} +1 -1
- package/dist/{checkbox-DapdzDow.cjs.map → checkbox-2e8v7CNg.cjs.map} +1 -1
- package/dist/{checkbox-CvmB1ev9.js → checkbox-CsADwyfu.js} +1 -1
- package/dist/{checkbox-CvmB1ev9.js.map → checkbox-CsADwyfu.js.map} +1 -1
- package/dist/checkbox.cjs +1 -1
- package/dist/checkbox.js +1 -1
- package/dist/{chips-C8Y3_3ke.js → chips-C9HwVbGT.js} +2 -2
- package/dist/{chips-C8Y3_3ke.js.map → chips-C9HwVbGT.js.map} +1 -1
- package/dist/{chips-7g6mWRuh.cjs → chips-DPCcO55o.cjs} +1 -1
- package/dist/{chips-7g6mWRuh.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-ZfUl4duV.cjs → date-range-63-FC7gD.cjs} +1 -1
- package/dist/{date-range-ZfUl4duV.cjs.map → date-range-63-FC7gD.cjs.map} +1 -1
- package/dist/{date-range-DdcaPX7C.js → date-range-CFaP-8Os.js} +2 -2
- package/dist/{date-range-DdcaPX7C.js.map → date-range-CFaP-8Os.js.map} +1 -1
- package/dist/{date-range-inline-QQmIWhZ4.js → date-range-inline-BCuK_XCv.js} +1 -1
- package/dist/{date-range-inline-QQmIWhZ4.js.map → date-range-inline-BCuK_XCv.js.map} +1 -1
- package/dist/{date-range-inline-D-d7N6bh.cjs → date-range-inline-Cpdqd-8B.cjs} +1 -1
- package/dist/{date-range-inline-D-d7N6bh.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 +1 -1
- package/dist/{details-Dpjh-XnJ.js → details-0dOlqHHL.js} +1 -1
- package/dist/{details-Dpjh-XnJ.js.map → details-0dOlqHHL.js.map} +1 -1
- package/dist/{details-3rL6UQU8.cjs → details-qKikJIyH.cjs} +1 -1
- package/dist/{details-3rL6UQU8.cjs.map → details-qKikJIyH.cjs.map} +1 -1
- package/dist/details.cjs +1 -1
- package/dist/details.js +1 -1
- package/dist/{divider-BdfEKQsH.js → divider-BxkIl0H1.js} +1 -1
- package/dist/{divider-BdfEKQsH.js.map → divider-BxkIl0H1.js.map} +1 -1
- package/dist/{divider-CutXDz3F.cjs → divider-CX9mmWZ8.cjs} +1 -1
- package/dist/{divider-CutXDz3F.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-DM6zfZf7.cjs → expand-891JuQuN.cjs} +1 -1
- package/dist/{expand-DM6zfZf7.cjs.map → expand-891JuQuN.cjs.map} +1 -1
- package/dist/{expand-DrgMPJbu.js → expand-BeAx94MP.js} +2 -2
- package/dist/{expand-DrgMPJbu.js.map → expand-BeAx94MP.js.map} +1 -1
- package/dist/expand.cjs +1 -1
- package/dist/expand.js +1 -1
- package/dist/{float-1iihPek5.js → float-BPF2WO4L.js} +1 -1
- package/dist/{float-1iihPek5.js.map → float-BPF2WO4L.js.map} +1 -1
- package/dist/{float-Ckyk85XG.cjs → float-D7vvODxx.cjs} +1 -1
- package/dist/{float-Ckyk85XG.cjs.map → float-D7vvODxx.cjs.map} +1 -1
- package/dist/float.cjs +1 -1
- package/dist/float.js +1 -1
- package/dist/{form-BF1c3Dk1.js.map → form-CFvwnfuJ.js.map} +1 -1
- package/dist/{form-DeO5XX3b.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/{icons-DUkcTZAY.js → icons-BKxW_7QR.js} +1 -1
- package/dist/{icons-DUkcTZAY.js.map → icons-BKxW_7QR.js.map} +1 -1
- package/dist/{icons-CV-fiGcW.cjs → icons-QSdo-8h9.cjs} +1 -1
- package/dist/{icons-CV-fiGcW.cjs.map → icons-QSdo-8h9.cjs.map} +1 -1
- package/dist/icons.cjs +1 -1
- package/dist/icons.js +1 -1
- package/dist/{iframe-C9tj7F6Y.js → iframe-BxvbhyTS.js} +1 -1
- package/dist/{iframe-C9tj7F6Y.js.map → iframe-BxvbhyTS.js.map} +1 -1
- package/dist/{iframe-DF97oGtZ.cjs → iframe-CMKV-bm8.cjs} +1 -1
- package/dist/{iframe-DF97oGtZ.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 +52 -58
- package/dist/{input-TW9G3n7X.cjs → input-BFhJU74_.cjs} +1 -1
- package/dist/{input-TW9G3n7X.cjs.map → input-BFhJU74_.cjs.map} +1 -1
- package/dist/{input-DE7x223Y.js → input-DIqaR8Mr.js} +1 -1
- package/dist/{input-DE7x223Y.js.map → input-DIqaR8Mr.js.map} +1 -1
- package/dist/{input-chip-BdoaVw_D.js → input-chip-D9tlSk_2.js} +1 -1
- package/dist/{input-chip-BdoaVw_D.js.map → input-chip-D9tlSk_2.js.map} +1 -1
- package/dist/{input-chip-Do48eI5r.cjs → input-chip-w09qTt7J.cjs} +1 -1
- package/dist/{input-chip-Do48eI5r.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-sPfnYzjJ.cjs → lightbox-CK035jsx.cjs} +1 -1
- package/dist/{lightbox-sPfnYzjJ.cjs.map → lightbox-CK035jsx.cjs.map} +1 -1
- package/dist/{lightbox-DcutIyjx.js → lightbox-GChmL3Ff.js} +1 -1
- package/dist/{lightbox-DcutIyjx.js.map → lightbox-GChmL3Ff.js.map} +1 -1
- package/dist/lightbox.cjs +1 -1
- package/dist/lightbox.js +1 -1
- package/dist/{list-C4vasUly.cjs → list-B3P37zlH.cjs} +1 -1
- package/dist/{list-C4vasUly.cjs.map → list-B3P37zlH.cjs.map} +1 -1
- package/dist/{list-BWrtrdgs.js → list-J-Fz24Z1.js} +1 -1
- package/dist/{list-BWrtrdgs.js.map → list-J-Fz24Z1.js.map} +1 -1
- package/dist/list.cjs +1 -1
- package/dist/list.js +1 -1
- package/dist/{menu-3yXDZusj.cjs → menu-BnFd8CwU.cjs} +1 -1
- package/dist/{menu-3yXDZusj.cjs.map → menu-BnFd8CwU.cjs.map} +1 -1
- package/dist/{menu-CxChOxWT.js → menu-DHTlUwXS.js} +2 -2
- package/dist/{menu-CxChOxWT.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-Db7gjDah.cjs.map → mixins-47_CZk7q.cjs.map} +1 -1
- package/dist/mixins-PBJJGiiP.js +627 -0
- package/dist/{mixins-Dw6hVfy-.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-DKYy9qVe.cjs → notification-B6YBL0hx.cjs} +1 -1
- package/dist/{notification-DKYy9qVe.cjs.map → notification-B6YBL0hx.cjs.map} +1 -1
- package/dist/{notification-ycbUBbOu.js → notification-C-5Bv3vj.js} +2 -2
- package/dist/{notification-ycbUBbOu.js.map → notification-C-5Bv3vj.js.map} +1 -1
- package/dist/notification.cjs +1 -1
- package/dist/notification.js +1 -1
- package/dist/{option-DtOhMd3k.js → option-B7q6VXCu.js} +1 -1
- package/dist/{option-DtOhMd3k.js.map → option-B7q6VXCu.js.map} +1 -1
- package/dist/{option-zgVge3BH.cjs → option-DVQRa3nr.cjs} +1 -1
- package/dist/{option-zgVge3BH.cjs.map → option-DVQRa3nr.cjs.map} +1 -1
- package/dist/option.cjs +1 -1
- package/dist/option.js +1 -1
- package/dist/overlay.cjs +1 -1
- package/dist/{overlay.confirm-body-AFqYBqrI.js → overlay.confirm-body-CAY5xK1n.js} +1 -1
- package/dist/{overlay.confirm-body-AFqYBqrI.js.map → overlay.confirm-body-CAY5xK1n.js.map} +1 -1
- package/dist/{overlay.confirm-body-DctQLDao.cjs → overlay.confirm-body-XZtErofy.cjs} +1 -1
- package/dist/{overlay.confirm-body-DctQLDao.cjs.map → overlay.confirm-body-XZtErofy.cjs.map} +1 -1
- package/dist/overlay.js +3 -3
- package/dist/{overlay.service-B9On2-Aa.js → overlay.service-BZE_lwKO.js} +2 -2
- package/dist/{overlay.service-B9On2-Aa.js.map → overlay.service-BZE_lwKO.js.map} +1 -1
- package/dist/{overlay.service-k2nCE4pi.cjs → overlay.service-Oyjrw831.cjs} +1 -1
- package/dist/{overlay.service-k2nCE4pi.cjs.map → overlay.service-Oyjrw831.cjs.map} +1 -1
- package/dist/page.cjs +1 -1
- package/dist/page.js +2 -2
- package/dist/{progress-BFWzmTlz.js → progress-BHXLYs9i.js} +1 -1
- package/dist/{progress-BFWzmTlz.js.map → progress-BHXLYs9i.js.map} +1 -1
- package/dist/{progress-C4TGG2eN.cjs → progress-D99bumkC.cjs} +1 -1
- package/dist/{progress-C4TGG2eN.cjs.map → progress-D99bumkC.cjs.map} +1 -1
- package/dist/progress.cjs +1 -1
- package/dist/progress.js +1 -1
- package/dist/{radio-group-DTNAW5dd.js → radio-group-BYra5_q1.js} +1 -1
- package/dist/{radio-group-DTNAW5dd.js.map → radio-group-BYra5_q1.js.map} +1 -1
- package/dist/{radio-group-xLRp1g57.cjs → radio-group-DYsycLmD.cjs} +1 -1
- package/dist/{radio-group-xLRp1g57.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-BK8VMe3K.js.map → rxjs-utils-CVeJQ9KG.js.map} +1 -1
- package/dist/{rxjs-utils-DhOKenkS.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-BCmdqSQU.js → scroll-TqNWZ0lo.js} +1 -1
- package/dist/{scroll-BCmdqSQU.js.map → scroll-TqNWZ0lo.js.map} +1 -1
- package/dist/{scroll-Bdgb-vRy.cjs → scroll-cayCBOrq.cjs} +1 -1
- package/dist/{scroll-Bdgb-vRy.cjs.map → scroll-cayCBOrq.cjs.map} +1 -1
- package/dist/{select-Cv5t_PT3.cjs → select-CRdSmlLq.cjs} +1 -1
- package/dist/{select-Cv5t_PT3.cjs.map → select-CRdSmlLq.cjs.map} +1 -1
- package/dist/{select-COGARE0b.js → select-nzq0qFlF.js} +2 -2
- package/dist/{select-COGARE0b.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 -3
- package/dist/skills/schmancy/INDEX.md +9 -3
- package/dist/slider.cjs +1 -1
- package/dist/slider.js +1 -1
- package/dist/{splash-screen-DbGbGttg.js → splash-screen-BJeIiJ_e.js} +1 -1
- package/dist/{splash-screen-DbGbGttg.js.map → splash-screen-BJeIiJ_e.js.map} +1 -1
- package/dist/{splash-screen-B8rFbjqT.cjs → splash-screen-BMLQXzDq.cjs} +1 -1
- package/dist/{splash-screen-B8rFbjqT.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-b8D-Ec-Q.cjs → src-DE11tq2Q.cjs} +1 -1
- package/dist/{src-b8D-Ec-Q.cjs.map → src-DE11tq2Q.cjs.map} +1 -1
- package/dist/{src-YRir9pOP.js → src-qvWlNoMO.js} +34 -40
- package/dist/{src-YRir9pOP.js.map → src-qvWlNoMO.js.map} +1 -1
- package/dist/steps.cjs +1 -1
- package/dist/steps.js +1 -1
- package/dist/{surface-BvudRtf5.cjs → surface-D426MFLR.cjs} +1 -1
- package/dist/{surface-BvudRtf5.cjs.map → surface-D426MFLR.cjs.map} +1 -1
- package/dist/{surface-BE7sGTBt.js → surface-DG7Cmm9V.js} +1 -1
- package/dist/{surface-BE7sGTBt.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-DIzCRsA3.js → tabs-B7siJkM5.js} +1 -1
- package/dist/{tabs-DIzCRsA3.js.map → tabs-B7siJkM5.js.map} +1 -1
- package/dist/{tabs-C0XKld1Z.cjs → tabs-t3nMfg1F.cjs} +1 -1
- package/dist/{tabs-C0XKld1Z.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-UbZzBwqm.js → textarea-DSxHCCle.js} +1 -1
- package/dist/{textarea-UbZzBwqm.js.map → textarea-DSxHCCle.js.map} +1 -1
- package/dist/{textarea-BCDCGCJd.cjs → textarea-o9vysorM.cjs} +1 -1
- package/dist/{textarea-BCDCGCJd.cjs.map → textarea-o9vysorM.cjs.map} +1 -1
- package/dist/textarea.cjs +1 -1
- package/dist/textarea.js +1 -1
- package/dist/{theme-CIsI-sFj.cjs → theme-Ce9eIP05.cjs} +1 -1
- package/dist/{theme-CIsI-sFj.cjs.map → theme-Ce9eIP05.cjs.map} +1 -1
- package/dist/{theme-Qh-yPEPL.js → theme-XO3nHDbW.js} +2 -2
- package/dist/{theme-Qh-yPEPL.js.map → theme-XO3nHDbW.js.map} +1 -1
- package/dist/{theme-button-CjTnfs9x.js → theme-button-DNutDO1j.js} +1 -1
- package/dist/{theme-button-CjTnfs9x.js.map → theme-button-DNutDO1j.js.map} +1 -1
- package/dist/{theme-button-Dv1D_Vil.cjs → theme-button-H7PRz_bg.cjs} +1 -1
- package/dist/{theme-button-Dv1D_Vil.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-v7SkAnDH.js.map → theme.interface-B9TjbSBF.js.map} +1 -1
- package/dist/{theme.interface-BeW-sz_g.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-CJ9y2Jz9.cjs.map → utils-Dt5PpmaQ.cjs.map} +1 -1
- package/dist/{utils-BfOze6Tk.js.map → utils-kND2Z9Xg.js.map} +1 -1
- package/dist/utils.cjs +1 -1
- package/dist/utils.js +1 -1
- package/dist/visually-hidden.cjs +1 -1
- package/dist/visually-hidden.js +1 -1
- package/dist/{window-9HOUXrTU.cjs → window-BaoSwgGE.cjs} +1 -1
- package/dist/{window-9HOUXrTU.cjs.map → window-BaoSwgGE.cjs.map} +1 -1
- package/dist/{window-B_55dzk0.js → window-KnLWhQ3S.js} +1 -1
- package/dist/{window-B_55dzk0.js.map → window-KnLWhQ3S.js.map} +1 -1
- package/dist/window.cjs +1 -1
- package/dist/window.js +1 -1
- package/package.json +4 -4
- package/skills/schmancy/INDEX.md +9 -3
- package/src/index.ts +0 -6
- package/types/src/index.d.ts +0 -6
- package/dist/agent/vendor-jsqr-BUVwyoGC.js +0 -10212
- package/dist/agent/vendor-jsqr-BUVwyoGC.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/extra-B6gFu4_1.js +0 -3440
- package/dist/extra-B6gFu4_1.js.map +0 -1
- package/dist/extra-DJRYaOXe.cjs +0 -31
- package/dist/extra-DJRYaOXe.cjs.map +0 -1
- package/dist/extra.cjs +0 -1
- package/dist/extra.js +0 -2
- package/dist/map-BAQ9FEB6.cjs +0 -80
- package/dist/map-BAQ9FEB6.cjs.map +0 -1
- package/dist/map-CEreveeI.js +0 -208
- package/dist/map-CEreveeI.js.map +0 -1
- package/dist/map.cjs +0 -1
- package/dist/map.js +0 -2
- package/dist/mixins-Db7gjDah.cjs +0 -298
- package/dist/mixins-Dw6hVfy-.js +0 -627
- package/dist/payment-card-form-Be1-OVlL.js +0 -729
- package/dist/payment-card-form-Be1-OVlL.js.map +0 -1
- package/dist/payment-card-form-CNnGePG4.cjs +0 -73
- package/dist/payment-card-form-CNnGePG4.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/extra.md +0 -59
- 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/extra.md +0 -59
- 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/extra.md +0 -59
- 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/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/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/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/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-3RrZM-e7.js → flow-CvG1fLW5.js} +0 -0
- /package/dist/agent/{vendor-material-color-33Mj762T.js → vendor-material-color-DcL7ZPxx.js} +0 -0
- /package/dist/{form-BF1c3Dk1.js → form-CFvwnfuJ.js} +0 -0
- /package/dist/{form-DeO5XX3b.cjs → form-Ceijw1aA.cjs} +0 -0
- /package/dist/{rxjs-utils-BK8VMe3K.js → rxjs-utils-CVeJQ9KG.js} +0 -0
- /package/dist/{rxjs-utils-DhOKenkS.cjs → rxjs-utils-DCUHg_Ml.cjs} +0 -0
- /package/dist/{theme.interface-v7SkAnDH.js → theme.interface-B9TjbSBF.js} +0 -0
- /package/dist/{theme.interface-BeW-sz_g.cjs → theme.interface-BujperTo.cjs} +0 -0
- /package/dist/{utils-CJ9y2Jz9.cjs → utils-Dt5PpmaQ.cjs} +0 -0
- /package/dist/{utils-BfOze6Tk.js → utils-kND2Z9Xg.js} +0 -0
|
@@ -1,331 +0,0 @@
|
|
|
1
|
-
import { SchmancyElement } from '@mixins/index'
|
|
2
|
-
import SchmancyForm from '@schmancy/form/form'
|
|
3
|
-
import { SchmancyInputChangeEvent } from '@schmancy/input'
|
|
4
|
-
import SchmancyInput from '@schmancy/input/input'
|
|
5
|
-
import Cleave from 'cleave.js'
|
|
6
|
-
import { html } from 'lit'
|
|
7
|
-
import { customElement, property, query, state } from 'lit/decorators.js'
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* @element schmancy-payment-card-form
|
|
11
|
-
* A mobile-friendly payment card form component that provides real-time validation
|
|
12
|
-
* and formatting for credit card information.
|
|
13
|
-
*
|
|
14
|
-
* @fires change - Fires when any field in the form changes
|
|
15
|
-
* @slot - Default slot for any additional content
|
|
16
|
-
*/
|
|
17
|
-
@customElement('schmancy-payment-card-form')
|
|
18
|
-
export class SchmancyPaymentCardForm extends SchmancyElement {
|
|
19
|
-
/**
|
|
20
|
-
* The form data containing all payment card information
|
|
21
|
-
*/
|
|
22
|
-
@property({ type: Object, reflect: true })
|
|
23
|
-
public value: {
|
|
24
|
-
cardName: string
|
|
25
|
-
cardNumber: string
|
|
26
|
-
expirationDate: string
|
|
27
|
-
cvv: string
|
|
28
|
-
} = {
|
|
29
|
-
cardName: '',
|
|
30
|
-
cardNumber: '',
|
|
31
|
-
expirationDate: '',
|
|
32
|
-
cvv: '',
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* The detected card type (visa, mastercard, amex, etc.)
|
|
37
|
-
* This is determined automatically by the Cleave.js library
|
|
38
|
-
*/
|
|
39
|
-
@state() cardType: string = ''
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Individual field values tracked with state properties for reactivity
|
|
43
|
-
*/
|
|
44
|
-
@state() cardName: string | undefined
|
|
45
|
-
@state() cardNumber: string | undefined
|
|
46
|
-
@state() expirationDate: string | undefined
|
|
47
|
-
@state() cvv: string | undefined
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Field validity states for enhanced validation feedback
|
|
51
|
-
*/
|
|
52
|
-
@state() isCardNameValid: boolean = true
|
|
53
|
-
@state() isCardNumberValid: boolean = true
|
|
54
|
-
@state() isExpirationDateValid: boolean = true
|
|
55
|
-
@state() isCvvValid: boolean = true
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* Query selectors for the form elements
|
|
59
|
-
*/
|
|
60
|
-
@query('#cardNumber') cardNumberInput!: SchmancyInput
|
|
61
|
-
@query('#expirationDate') expirationDateInput!: SchmancyInput
|
|
62
|
-
@query('#cvv') cvvInput!: SchmancyInput
|
|
63
|
-
@query('#cardName') cardNameInput!: SchmancyInput
|
|
64
|
-
@query('schmancy-form') form!: SchmancyForm
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* When the component is first updated, initialize the Cleave.js formatters
|
|
68
|
-
* for the credit card fields with appropriate validations
|
|
69
|
-
*/
|
|
70
|
-
firstUpdated(): void {
|
|
71
|
-
// Credit card number formatter with type detection
|
|
72
|
-
void new Cleave(this.cardNumberInput, {
|
|
73
|
-
creditCard: true,
|
|
74
|
-
creditCardStrictMode: true,
|
|
75
|
-
onCreditCardTypeChanged: type => {
|
|
76
|
-
this.cardType = type
|
|
77
|
-
|
|
78
|
-
if (type === 'unknown') {
|
|
79
|
-
this.isCardNumberValid = false
|
|
80
|
-
this.cardNumberInput.setCustomValidity('Please enter a valid card number.')
|
|
81
|
-
this.cardNumberInput.error = true
|
|
82
|
-
} else {
|
|
83
|
-
this.isCardNumberValid = true
|
|
84
|
-
this.cardNumberInput.setCustomValidity('')
|
|
85
|
-
this.cardNumberInput.error = false
|
|
86
|
-
|
|
87
|
-
// Adjust CVV length based on card type
|
|
88
|
-
if (type === 'amex') {
|
|
89
|
-
this.cvvInput.maxlength = 4
|
|
90
|
-
} else {
|
|
91
|
-
this.cvvInput.maxlength = 3
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
},
|
|
95
|
-
})
|
|
96
|
-
|
|
97
|
-
// Expiration date formatter (MM/YY)
|
|
98
|
-
void new Cleave(this.expirationDateInput, {
|
|
99
|
-
date: true,
|
|
100
|
-
datePattern: ['m', 'y'],
|
|
101
|
-
onValueChanged: e => {
|
|
102
|
-
const value = e.target.value
|
|
103
|
-
|
|
104
|
-
if (!value || value.length < 5) {
|
|
105
|
-
this.isExpirationDateValid = false
|
|
106
|
-
this.expirationDateInput.setCustomValidity('Please enter a valid expiration date (MM/YY).')
|
|
107
|
-
this.expirationDateInput.error = true
|
|
108
|
-
} else {
|
|
109
|
-
// Validate expiration date is in the future
|
|
110
|
-
const [month, year] = value.split('/')
|
|
111
|
-
const now = new Date()
|
|
112
|
-
const currentYear = now.getFullYear() % 100 // Get last two digits of year
|
|
113
|
-
const currentMonth = now.getMonth() + 1 // JS months are 0-indexed
|
|
114
|
-
|
|
115
|
-
const monthNum = parseInt(month, 10)
|
|
116
|
-
const yearNum = parseInt(year, 10)
|
|
117
|
-
|
|
118
|
-
// Check if the card is expired
|
|
119
|
-
if (yearNum < currentYear || (yearNum === currentYear && monthNum < currentMonth)) {
|
|
120
|
-
this.isExpirationDateValid = false
|
|
121
|
-
this.expirationDateInput.setCustomValidity('Card has expired.')
|
|
122
|
-
this.expirationDateInput.error = true
|
|
123
|
-
} else {
|
|
124
|
-
this.isExpirationDateValid = true
|
|
125
|
-
this.expirationDateInput.setCustomValidity('')
|
|
126
|
-
this.expirationDateInput.error = false
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
},
|
|
130
|
-
})
|
|
131
|
-
|
|
132
|
-
// CVV formatter (numeric only)
|
|
133
|
-
void new Cleave(this.cvvInput, {
|
|
134
|
-
blocks: [4], // Maximum size for AMEX
|
|
135
|
-
numericOnly: true,
|
|
136
|
-
onValueChanged: e => {
|
|
137
|
-
const minLength = this.cardType === 'amex' ? 4 : 3
|
|
138
|
-
|
|
139
|
-
if (e.target.value.length < minLength) {
|
|
140
|
-
this.isCvvValid = false
|
|
141
|
-
this.cvvInput.setCustomValidity(`Please enter a valid ${minLength}-digit CVV.`)
|
|
142
|
-
this.cvvInput.error = true
|
|
143
|
-
} else {
|
|
144
|
-
this.isCvvValid = true
|
|
145
|
-
this.cvvInput.setCustomValidity('')
|
|
146
|
-
this.cvvInput.error = false
|
|
147
|
-
}
|
|
148
|
-
},
|
|
149
|
-
})
|
|
150
|
-
|
|
151
|
-
// Card name formatter (uppercase)
|
|
152
|
-
void new Cleave(this.cardNameInput, {
|
|
153
|
-
uppercase: true,
|
|
154
|
-
delimiter: ' ',
|
|
155
|
-
onValueChanged: e => {
|
|
156
|
-
// Basic name validation
|
|
157
|
-
if (!e.target.value || e.target.value.length < 3) {
|
|
158
|
-
this.isCardNameValid = false
|
|
159
|
-
this.cardNameInput.setCustomValidity('Please enter the name as it appears on the card.')
|
|
160
|
-
this.cardNameInput.error = true
|
|
161
|
-
} else {
|
|
162
|
-
this.isCardNameValid = true
|
|
163
|
-
this.cardNameInput.setCustomValidity('')
|
|
164
|
-
this.cardNameInput.error = false
|
|
165
|
-
}
|
|
166
|
-
},
|
|
167
|
-
})
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
/**
|
|
171
|
-
* Checks for validity of the entire form
|
|
172
|
-
* @returns {boolean} True if the form is valid
|
|
173
|
-
*/
|
|
174
|
-
public reportValidity() {
|
|
175
|
-
return this.form.reportValidity()
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
/**
|
|
179
|
-
* Checks for validity of the form
|
|
180
|
-
* @returns {boolean} True if the form is valid
|
|
181
|
-
*/
|
|
182
|
-
public checkValidity() {
|
|
183
|
-
return !!this.form.reportValidity()
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
/**
|
|
187
|
-
* Emit change event when any input value changes
|
|
188
|
-
*/
|
|
189
|
-
private emitChange() {
|
|
190
|
-
this.dispatchEvent(
|
|
191
|
-
new CustomEvent('change', {
|
|
192
|
-
detail: { ...this.value },
|
|
193
|
-
bubbles: true,
|
|
194
|
-
}),
|
|
195
|
-
)
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
/**
|
|
199
|
-
* Render the payment card form with a responsive grid layout
|
|
200
|
-
*/
|
|
201
|
-
protected render() {
|
|
202
|
-
// Determine icon based on card type
|
|
203
|
-
const cardIcon = this.getCardIcon()
|
|
204
|
-
|
|
205
|
-
return html`
|
|
206
|
-
<schmancy-form
|
|
207
|
-
@change=${e => {
|
|
208
|
-
e.stopPropagation()
|
|
209
|
-
e.preventDefault()
|
|
210
|
-
}}
|
|
211
|
-
>
|
|
212
|
-
<div class="grid grid-flow-row auto-rows-max flex-1 gap-4 w-full">
|
|
213
|
-
<!-- Card Name Field -->
|
|
214
|
-
<schmancy-input
|
|
215
|
-
autocomplete="cc-name"
|
|
216
|
-
id="cardName"
|
|
217
|
-
.value=${this.cardName ?? ''}
|
|
218
|
-
.error=${!this.isCardNameValid}
|
|
219
|
-
type="text"
|
|
220
|
-
.label=${'Name on card'}
|
|
221
|
-
.required=${true}
|
|
222
|
-
.hint=${!this.isCardNameValid
|
|
223
|
-
? 'Please enter the name as it appears on the card'
|
|
224
|
-
: 'Enter the name exactly as it appears on your card'}
|
|
225
|
-
@change=${(e: SchmancyInputChangeEvent) => {
|
|
226
|
-
this.cardName = e.detail.value
|
|
227
|
-
this.value.cardName = e.detail.value
|
|
228
|
-
this.emitChange()
|
|
229
|
-
}}
|
|
230
|
-
></schmancy-input>
|
|
231
|
-
|
|
232
|
-
<!-- Card Number Field with Card Type Indicator -->
|
|
233
|
-
<div class="relative w-full">
|
|
234
|
-
<schmancy-input
|
|
235
|
-
autocomplete="cc-number"
|
|
236
|
-
id="cardNumber"
|
|
237
|
-
type="text"
|
|
238
|
-
.label=${'Card number'}
|
|
239
|
-
.error=${!this.isCardNumberValid}
|
|
240
|
-
.required=${true}
|
|
241
|
-
.hint=${!this.isCardNumberValid ? 'Please enter a valid card number' : 'Your 16-digit card number'}
|
|
242
|
-
@change=${(e: SchmancyInputChangeEvent) => {
|
|
243
|
-
this.cardNumber = e.detail.value
|
|
244
|
-
this.value.cardNumber = e.detail.value
|
|
245
|
-
this.emitChange()
|
|
246
|
-
}}
|
|
247
|
-
></schmancy-input>
|
|
248
|
-
${cardIcon ? html`<div class="absolute right-3 top-1/2 transform -translate-y-1/4">${cardIcon}</div>` : ''}
|
|
249
|
-
</div>
|
|
250
|
-
|
|
251
|
-
<!-- Responsive grid for expiration date and CVV -->
|
|
252
|
-
<div class="grid grid-cols-[1fr_1fr] gap-4 w-full">
|
|
253
|
-
<schmancy-input
|
|
254
|
-
autocomplete="cc-exp"
|
|
255
|
-
id="expirationDate"
|
|
256
|
-
@change=${(e: SchmancyInputChangeEvent) => {
|
|
257
|
-
this.expirationDate = e.detail.value
|
|
258
|
-
this.value.expirationDate = e.detail.value
|
|
259
|
-
this.emitChange()
|
|
260
|
-
}}
|
|
261
|
-
type="text"
|
|
262
|
-
.error=${!this.isExpirationDateValid}
|
|
263
|
-
.label=${'Expiration date'}
|
|
264
|
-
placeholder="MM/YY"
|
|
265
|
-
.required=${true}
|
|
266
|
-
.hint=${!this.isExpirationDateValid ? 'Invalid expiration date' : 'MM/YY format'}
|
|
267
|
-
></schmancy-input>
|
|
268
|
-
|
|
269
|
-
<schmancy-input
|
|
270
|
-
id="cvv"
|
|
271
|
-
autocomplete="cc-csc"
|
|
272
|
-
@change=${(e: SchmancyInputChangeEvent) => {
|
|
273
|
-
this.cvv = e.detail.value
|
|
274
|
-
this.value.cvv = e.detail.value
|
|
275
|
-
this.emitChange()
|
|
276
|
-
}}
|
|
277
|
-
.label=${'CVV'}
|
|
278
|
-
.error=${!this.isCvvValid}
|
|
279
|
-
.required=${true}
|
|
280
|
-
type="text"
|
|
281
|
-
maxlength="${this.cardType === 'amex' ? '4' : '3'}"
|
|
282
|
-
minlength="${this.cardType === 'amex' ? '4' : '3'}"
|
|
283
|
-
.hint=${!this.isCvvValid ? 'Invalid security code' : 'Security code on back of card'}
|
|
284
|
-
></schmancy-input>
|
|
285
|
-
</div>
|
|
286
|
-
|
|
287
|
-
<!-- Show card acceptability notice -->
|
|
288
|
-
<div class="text-sm text-secondary-onContainer mt-2">${this.renderSecurityNotice()}</div>
|
|
289
|
-
|
|
290
|
-
<slot></slot>
|
|
291
|
-
</div>
|
|
292
|
-
</schmancy-form>
|
|
293
|
-
`
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
/**
|
|
297
|
-
* Helper method to render card type icon based on detected card type
|
|
298
|
-
*/
|
|
299
|
-
private getCardIcon() {
|
|
300
|
-
switch (this.cardType) {
|
|
301
|
-
case 'visa':
|
|
302
|
-
return html`<schmancy-icon>credit_card</schmancy-icon>`
|
|
303
|
-
case 'mastercard':
|
|
304
|
-
return html`<schmancy-icon>credit_card</schmancy-icon>`
|
|
305
|
-
case 'amex':
|
|
306
|
-
return html`<schmancy-icon>credit_card</schmancy-icon>`
|
|
307
|
-
case 'discover':
|
|
308
|
-
return html`<schmancy-icon>credit_card</schmancy-icon>`
|
|
309
|
-
default:
|
|
310
|
-
return this.cardNumber ? html`<schmancy-icon>credit_card</schmancy-icon>` : null
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
/**
|
|
315
|
-
* Helper method to render a security and acceptance notice
|
|
316
|
-
*/
|
|
317
|
-
private renderSecurityNotice() {
|
|
318
|
-
return html`
|
|
319
|
-
<div class="flex items-center gap-2">
|
|
320
|
-
<schmancy-icon size="18px">lock</schmancy-icon>
|
|
321
|
-
<span>Your payment information is secure and encrypted</span>
|
|
322
|
-
</div>
|
|
323
|
-
`
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
declare global {
|
|
328
|
-
interface HTMLElementTagNameMap {
|
|
329
|
-
'schmancy-payment-card-form': SchmancyPaymentCardForm
|
|
330
|
-
}
|
|
331
|
-
}
|
package/src/qr-scanner/index.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './qr-scanner'
|
|
@@ -1,242 +0,0 @@
|
|
|
1
|
-
import { SchmancyElement } from '@mixins/index'
|
|
2
|
-
import jsQR from 'jsqr'
|
|
3
|
-
import { css, html } from 'lit'
|
|
4
|
-
import { customElement, property, state } from 'lit/decorators.js'
|
|
5
|
-
import { when } from 'lit/directives/when.js'
|
|
6
|
-
import { animationFrames, Subject, timer } from 'rxjs'
|
|
7
|
-
import { distinctUntilChanged, filter, map, takeUntil, throttleTime } from 'rxjs/operators'
|
|
8
|
-
|
|
9
|
-
interface QRScanResult {
|
|
10
|
-
data: string
|
|
11
|
-
timestamp: number
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
@customElement('schmancy-qr-scanner')
|
|
15
|
-
export class SchmancyQRScanner extends SchmancyElement {
|
|
16
|
-
static styles = [css`
|
|
17
|
-
:host {
|
|
18
|
-
display: block;
|
|
19
|
-
width: 100%;
|
|
20
|
-
height: 100%;
|
|
21
|
-
min-height: 300px;
|
|
22
|
-
}
|
|
23
|
-
`]
|
|
24
|
-
|
|
25
|
-
@property({ type: Boolean }) continuous = true
|
|
26
|
-
|
|
27
|
-
@state() private hasPermission = false
|
|
28
|
-
@state() private error = ''
|
|
29
|
-
@state() private showSuccess = false
|
|
30
|
-
|
|
31
|
-
private stream: MediaStream | null = null
|
|
32
|
-
private destroy$ = new Subject<void>()
|
|
33
|
-
private videoElement: HTMLVideoElement | null = null
|
|
34
|
-
|
|
35
|
-
connectedCallback() {
|
|
36
|
-
super.connectedCallback()
|
|
37
|
-
this.startCamera()
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
private async startCamera(): Promise<void> {
|
|
41
|
-
try {
|
|
42
|
-
const constraints: MediaStreamConstraints = {
|
|
43
|
-
video: {
|
|
44
|
-
facingMode: 'environment',
|
|
45
|
-
width: { ideal: 1280 },
|
|
46
|
-
height: { ideal: 720 },
|
|
47
|
-
},
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
this.stream = await navigator.mediaDevices.getUserMedia(constraints)
|
|
51
|
-
this.hasPermission = true
|
|
52
|
-
this.error = ''
|
|
53
|
-
|
|
54
|
-
await this.updateComplete
|
|
55
|
-
|
|
56
|
-
this.videoElement = this.shadowRoot?.querySelector('#video') as HTMLVideoElement
|
|
57
|
-
if (this.videoElement) {
|
|
58
|
-
this.videoElement.srcObject = this.stream
|
|
59
|
-
await this.videoElement.play()
|
|
60
|
-
this.startScanning()
|
|
61
|
-
}
|
|
62
|
-
} catch (error) {
|
|
63
|
-
console.error('Camera access denied:', error)
|
|
64
|
-
this.hasPermission = false
|
|
65
|
-
this.error = 'Camera access is required to scan QR codes. Please allow camera access and try again.'
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
private stopCamera(): void {
|
|
70
|
-
this.destroy$.next()
|
|
71
|
-
|
|
72
|
-
if (this.stream) {
|
|
73
|
-
this.stream.getTracks().forEach(track => track.stop())
|
|
74
|
-
this.stream = null
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
if (this.videoElement) {
|
|
78
|
-
this.videoElement.srcObject = null
|
|
79
|
-
this.videoElement = null
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
this.hasPermission = false
|
|
83
|
-
this.error = ''
|
|
84
|
-
this.showSuccess = false
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
private startScanning(): void {
|
|
88
|
-
if (!this.videoElement || !this.hasPermission) {
|
|
89
|
-
return
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
animationFrames()
|
|
93
|
-
.pipe(
|
|
94
|
-
map(() => this.scanFrame()),
|
|
95
|
-
filter((result): result is QRScanResult => result !== null),
|
|
96
|
-
distinctUntilChanged((prev, curr) => {
|
|
97
|
-
if (prev.data !== curr.data) return false
|
|
98
|
-
return curr.timestamp - prev.timestamp < 2000
|
|
99
|
-
}),
|
|
100
|
-
throttleTime(500),
|
|
101
|
-
takeUntil(this.destroy$),
|
|
102
|
-
)
|
|
103
|
-
.subscribe({
|
|
104
|
-
next: result => this.handleScanResult(result),
|
|
105
|
-
error: error => {
|
|
106
|
-
console.error('Scanning error:', error)
|
|
107
|
-
},
|
|
108
|
-
})
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
private scanFrame(): QRScanResult | null {
|
|
112
|
-
if (!this.videoElement || this.videoElement.readyState !== HTMLMediaElement.HAVE_ENOUGH_DATA) {
|
|
113
|
-
return null
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
try {
|
|
117
|
-
const canvas = document.createElement('canvas')
|
|
118
|
-
canvas.width = this.videoElement.videoWidth
|
|
119
|
-
canvas.height = this.videoElement.videoHeight
|
|
120
|
-
|
|
121
|
-
const ctx = canvas.getContext('2d')
|
|
122
|
-
if (!ctx) return null
|
|
123
|
-
|
|
124
|
-
ctx.drawImage(this.videoElement, 0, 0)
|
|
125
|
-
const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height)
|
|
126
|
-
|
|
127
|
-
const code = jsQR(imageData.data, imageData.width, imageData.height)
|
|
128
|
-
|
|
129
|
-
if (code && code.data) {
|
|
130
|
-
return {
|
|
131
|
-
data: code.data,
|
|
132
|
-
timestamp: Date.now(),
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
} catch (error) {
|
|
136
|
-
console.error('Frame scan error:', error)
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
return null
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
private handleScanResult(result: QRScanResult): void {
|
|
143
|
-
this.showSuccessFlash()
|
|
144
|
-
|
|
145
|
-
// Haptic feedback if available
|
|
146
|
-
if (navigator.vibrate) {
|
|
147
|
-
navigator.vibrate([100, 50, 100])
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
// Audio feedback
|
|
151
|
-
this.playSuccessSound()
|
|
152
|
-
|
|
153
|
-
// Dispatch scan result
|
|
154
|
-
this.dispatchEvent(
|
|
155
|
-
new CustomEvent('scan-result', {
|
|
156
|
-
detail: { data: result.data, timestamp: result.timestamp },
|
|
157
|
-
bubbles: true,
|
|
158
|
-
composed: true,
|
|
159
|
-
}),
|
|
160
|
-
)
|
|
161
|
-
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
private showSuccessFlash(): void {
|
|
165
|
-
this.showSuccess = true
|
|
166
|
-
timer(500)
|
|
167
|
-
.pipe(takeUntil(this.destroy$))
|
|
168
|
-
.subscribe(() => {
|
|
169
|
-
this.showSuccess = false
|
|
170
|
-
})
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
private playSuccessSound(): void {
|
|
174
|
-
try {
|
|
175
|
-
const AudioContextClass = window.AudioContext || (window as unknown as { webkitAudioContext: typeof AudioContext }).webkitAudioContext
|
|
176
|
-
const audioContext = new AudioContextClass()
|
|
177
|
-
const oscillator = audioContext.createOscillator()
|
|
178
|
-
const gainNode = audioContext.createGain()
|
|
179
|
-
|
|
180
|
-
oscillator.connect(gainNode)
|
|
181
|
-
gainNode.connect(audioContext.destination)
|
|
182
|
-
|
|
183
|
-
oscillator.frequency.setValueAtTime(800, audioContext.currentTime)
|
|
184
|
-
oscillator.frequency.setValueAtTime(1000, audioContext.currentTime + 0.1)
|
|
185
|
-
|
|
186
|
-
gainNode.gain.setValueAtTime(0.3, audioContext.currentTime)
|
|
187
|
-
gainNode.gain.exponentialRampToValueAtTime(0.01, audioContext.currentTime + 0.2)
|
|
188
|
-
|
|
189
|
-
oscillator.start(audioContext.currentTime)
|
|
190
|
-
oscillator.stop(audioContext.currentTime + 0.2)
|
|
191
|
-
} catch {
|
|
192
|
-
// Audio feedback failed silently
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
disconnectedCallback() {
|
|
197
|
-
super.disconnectedCallback()
|
|
198
|
-
this.stopCamera()
|
|
199
|
-
this.destroy$.complete()
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
render() {
|
|
203
|
-
if (this.error) {
|
|
204
|
-
return html`
|
|
205
|
-
<div class="w-full h-full flex flex-col items-center justify-center bg-black text-white text-center p-5">
|
|
206
|
-
<schmancy-icon size="64" class="mb-4">camera_alt</schmancy-icon>
|
|
207
|
-
<schmancy-typography type="headline" token="md" class="mb-4">Camera Permission Required</schmancy-typography>
|
|
208
|
-
<schmancy-typography type="body" token="md" class="mb-6 max-w-sm">${this.error}</schmancy-typography>
|
|
209
|
-
<schmancy-button variant="filled" @click=${() => window.location.reload()}>Retry</schmancy-button>
|
|
210
|
-
</div>
|
|
211
|
-
`
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
return html`
|
|
215
|
-
<div class="relative w-full h-full bg-black overflow-hidden rounded-xl">
|
|
216
|
-
<!-- Video Stream -->
|
|
217
|
-
<video id="video" class="absolute inset-0 w-full h-full object-cover" autoplay muted playsinline></video>
|
|
218
|
-
|
|
219
|
-
<!-- Success Flash -->
|
|
220
|
-
${when(this.showSuccess, () => html`<div class="absolute inset-0 bg-green-400/30 pointer-events-none"></div>`)}
|
|
221
|
-
|
|
222
|
-
<!-- Minimal corner brackets - Apple style -->
|
|
223
|
-
<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">
|
|
224
|
-
<!-- Top-left corner -->
|
|
225
|
-
<div class="absolute top-0 left-0 w-12 h-12 border-t-4 border-l-4 border-white rounded-tl-2xl"></div>
|
|
226
|
-
<!-- Top-right corner -->
|
|
227
|
-
<div class="absolute top-0 right-0 w-12 h-12 border-t-4 border-r-4 border-white rounded-tr-2xl"></div>
|
|
228
|
-
<!-- Bottom-left corner -->
|
|
229
|
-
<div class="absolute bottom-0 left-0 w-12 h-12 border-b-4 border-l-4 border-white rounded-bl-2xl"></div>
|
|
230
|
-
<!-- Bottom-right corner -->
|
|
231
|
-
<div class="absolute bottom-0 right-0 w-12 h-12 border-b-4 border-r-4 border-white rounded-br-2xl"></div>
|
|
232
|
-
</div>
|
|
233
|
-
</div>
|
|
234
|
-
`
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
declare global {
|
|
239
|
-
interface HTMLElementTagNameMap {
|
|
240
|
-
'schmancy-qr-scanner': SchmancyQRScanner
|
|
241
|
-
}
|
|
242
|
-
}
|
package/src/timeline/index.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './timeline-tile'
|