@mhmo91/schmancy 0.4.68 → 0.4.69
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/dist/{animated-text-DC6DoZFp.cjs → animated-text-Bm1G50ol.cjs} +2 -2
- package/dist/{animated-text-DC6DoZFp.cjs.map → animated-text-Bm1G50ol.cjs.map} +1 -1
- package/dist/{animated-text-DWROCNAc.js → animated-text-DhaihRNU.js} +3 -3
- package/dist/{animated-text-DWROCNAc.js.map → animated-text-DhaihRNU.js.map} +1 -1
- package/dist/animated-text.cjs +1 -1
- package/dist/animated-text.js +1 -1
- package/dist/area.cjs +1 -1
- package/dist/{area.component-vZfDiNZy.js → area.component-Cybfl9fo.js} +10 -10
- package/dist/{area.component-vZfDiNZy.js.map → area.component-Cybfl9fo.js.map} +1 -1
- package/dist/{area.component-tnIDc9kT.cjs → area.component-e7ccHmOi.cjs} +2 -2
- package/dist/{area.component-tnIDc9kT.cjs.map → area.component-e7ccHmOi.cjs.map} +1 -1
- package/dist/area.js +1 -1
- package/dist/{autocomplete-D-68OyCe.js → autocomplete-CHPr_eII.js} +3 -3
- package/dist/{autocomplete-D-68OyCe.js.map → autocomplete-CHPr_eII.js.map} +1 -1
- package/dist/{autocomplete-C5fz6X5-.cjs → autocomplete-DhRURo6G.cjs} +2 -2
- package/dist/{autocomplete-C5fz6X5-.cjs.map → autocomplete-DhRURo6G.cjs.map} +1 -1
- package/dist/autocomplete.cjs +1 -1
- package/dist/autocomplete.js +1 -1
- package/dist/{avatar-DbWoxALg.js → avatar-B3rxuPbq.js} +62 -61
- package/dist/{avatar-DbWoxALg.js.map → avatar-B3rxuPbq.js.map} +1 -1
- package/dist/{avatar-f1s6Rri7.cjs → avatar-BREyQJqy.cjs} +2 -2
- package/dist/{avatar-f1s6Rri7.cjs.map → avatar-BREyQJqy.cjs.map} +1 -1
- package/dist/badge.cjs +1 -1
- package/dist/badge.js +1 -1
- package/dist/{boat-DA_B_UOn.js → boat-Ch2Dn8n_.js} +2 -2
- package/dist/{boat-DA_B_UOn.js.map → boat-Ch2Dn8n_.js.map} +1 -1
- package/dist/{boat-DeMH4PII.cjs → boat-IQenN8zy.cjs} +2 -2
- package/dist/{boat-DeMH4PII.cjs.map → boat-IQenN8zy.cjs.map} +1 -1
- package/dist/boat.cjs +1 -1
- package/dist/boat.js +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.cjs +1 -1
- package/dist/card.js +1 -1
- package/dist/{checkbox-iwkV_VZd.js → checkbox-DTtOgNWH.js} +2 -2
- package/dist/{checkbox-iwkV_VZd.js.map → checkbox-DTtOgNWH.js.map} +1 -1
- package/dist/{checkbox-d6KUhyv1.cjs → checkbox-EV_8e4Q9.cjs} +2 -2
- package/dist/{checkbox-d6KUhyv1.cjs.map → checkbox-EV_8e4Q9.cjs.map} +1 -1
- package/dist/checkbox.cjs +1 -1
- package/dist/checkbox.js +1 -1
- package/dist/{chips-BXYlvuv1.cjs → chips-D9bYHkvu.cjs} +2 -2
- package/dist/{chips-BXYlvuv1.cjs.map → chips-D9bYHkvu.cjs.map} +1 -1
- package/dist/{chips--CHI-PBC.js → chips-xlNsY8Dl.js} +3 -3
- package/dist/{chips--CHI-PBC.js.map → chips-xlNsY8Dl.js.map} +1 -1
- package/dist/chips.cjs +1 -1
- package/dist/chips.js +1 -1
- package/dist/code-highlight.cjs +1 -1
- package/dist/code-highlight.js +1 -1
- package/dist/{code-preview-DaI_YMOB.cjs → code-preview-CC_QZwlB.cjs} +2 -2
- package/dist/{code-preview-DaI_YMOB.cjs.map → code-preview-CC_QZwlB.cjs.map} +1 -1
- package/dist/{code-preview-CLWEbiLF.js → code-preview-Dy4fNmOI.js} +2 -2
- package/dist/{code-preview-CLWEbiLF.js.map → code-preview-Dy4fNmOI.js.map} +1 -1
- package/dist/components.cjs +1 -1
- package/dist/components.js +1 -1
- package/dist/content-drawer.cjs +1 -1
- package/dist/content-drawer.js +1 -1
- package/dist/{date-range-lT3ch0CJ.js → date-range-CEhn7Gvg.js} +4 -4
- package/dist/{date-range-lT3ch0CJ.js.map → date-range-CEhn7Gvg.js.map} +1 -1
- package/dist/{date-range-CHWNwZmy.cjs → date-range-XTs2K2Rp.cjs} +2 -2
- package/dist/{date-range-CHWNwZmy.cjs.map → date-range-XTs2K2Rp.cjs.map} +1 -1
- package/dist/{date-range-inline-eCsAJVSI.cjs → date-range-inline-BW6v6aDq.cjs} +2 -2
- package/dist/{date-range-inline-eCsAJVSI.cjs.map → date-range-inline-BW6v6aDq.cjs.map} +1 -1
- package/dist/{date-range-inline-BrblUJWk.js → date-range-inline-D-F8YwDL.js} +3 -3
- package/dist/{date-range-inline-BrblUJWk.js.map → date-range-inline-D-F8YwDL.js.map} +1 -1
- package/dist/date-range-inline.cjs +1 -1
- package/dist/date-range-inline.js +1 -1
- package/dist/date-range.cjs +1 -1
- package/dist/date-range.js +1 -1
- package/dist/{delay-CN1qSEKQ.cjs → delay-BYwpzSYY.cjs} +2 -2
- package/dist/{delay-CN1qSEKQ.cjs.map → delay-BYwpzSYY.cjs.map} +1 -1
- package/dist/{delay-DF3m820G.js → delay-CqcMq7V3.js} +12 -12
- package/dist/{delay-DF3m820G.js.map → delay-CqcMq7V3.js.map} +1 -1
- package/dist/delay.cjs +1 -1
- package/dist/delay.js +1 -1
- package/dist/{details-WlWNEznx.cjs → details-C9Vr2c8F.cjs} +2 -2
- package/dist/{details-WlWNEznx.cjs.map → details-C9Vr2c8F.cjs.map} +1 -1
- package/dist/{details-B0TayDAR.js → details-gxjy3noS.js} +2 -2
- package/dist/{details-B0TayDAR.js.map → details-gxjy3noS.js.map} +1 -1
- package/dist/details.cjs +1 -1
- package/dist/details.js +1 -1
- package/dist/{dialog-content-Bu-1wPol.js → dialog-content-CJ21oAff.js} +4 -4
- package/dist/{dialog-content-Bu-1wPol.js.map → dialog-content-CJ21oAff.js.map} +1 -1
- package/dist/{dialog-content-DxSr-3n2.cjs → dialog-content-DfXB0r6A.cjs} +2 -2
- package/dist/{dialog-content-DxSr-3n2.cjs.map → dialog-content-DfXB0r6A.cjs.map} +1 -1
- package/dist/dialog-service-ClZa-7cE.cjs +2 -0
- package/dist/dialog-service-ClZa-7cE.cjs.map +1 -0
- package/dist/dialog-service-Dwnyl4Gg.js +141 -0
- package/dist/dialog-service-Dwnyl4Gg.js.map +1 -0
- package/dist/dialog.cjs +1 -1
- package/dist/dialog.js +2 -2
- package/dist/{divider-DMelIbAX.js → divider-Dw3OYKoH.js} +3 -3
- package/dist/{divider-DMelIbAX.js.map → divider-Dw3OYKoH.js.map} +1 -1
- package/dist/{divider-6-gngn50.cjs → divider-ZX6UG8fE.cjs} +2 -2
- package/dist/{divider-6-gngn50.cjs.map → divider-ZX6UG8fE.cjs.map} +1 -1
- package/dist/divider.cjs +1 -1
- package/dist/divider.js +1 -1
- package/dist/{dropdown-content-CWyaIopS.js → dropdown-content-QWlP1OxV.js} +3 -3
- package/dist/{dropdown-content-CWyaIopS.js.map → dropdown-content-QWlP1OxV.js.map} +1 -1
- package/dist/{dropdown-content-DQgspBt5.cjs → dropdown-content-ULdb1NeW.cjs} +2 -2
- package/dist/{dropdown-content-DQgspBt5.cjs.map → dropdown-content-ULdb1NeW.cjs.map} +1 -1
- package/dist/dropdown.cjs +1 -1
- package/dist/dropdown.js +1 -1
- package/dist/email-recipients-DQ36ickQ.js +1358 -0
- package/dist/email-recipients-DQ36ickQ.js.map +1 -0
- package/dist/email-recipients-H9HVkFvE.cjs +851 -0
- package/dist/email-recipients-H9HVkFvE.cjs.map +1 -0
- package/dist/extra.cjs +1 -1
- package/dist/extra.js +1 -1
- package/dist/{flex-CPva0jtS.js → flex-Cam0G_h7.js} +2 -2
- package/dist/{flex-CPva0jtS.js.map → flex-Cam0G_h7.js.map} +1 -1
- package/dist/{flex-uUxnTzlw.cjs → flex-DEiJ9fDk.cjs} +2 -2
- package/dist/{flex-uUxnTzlw.cjs.map → flex-DEiJ9fDk.cjs.map} +1 -1
- package/dist/{form-DPXb7Fad.cjs → form-B87v130C.cjs} +2 -2
- package/dist/{form-DPXb7Fad.cjs.map → form-B87v130C.cjs.map} +1 -1
- package/dist/{form-zJGrEXrf.js → form-EPO5N6pI.js} +2 -2
- package/dist/{form-zJGrEXrf.js.map → form-EPO5N6pI.js.map} +1 -1
- package/dist/form.cjs +1 -1
- package/dist/form.js +1 -1
- package/dist/{formField.mixin-CfRnxkkt.js → formField.mixin-B6XjIwKN.js} +2 -2
- package/dist/{formField.mixin-CfRnxkkt.js.map → formField.mixin-B6XjIwKN.js.map} +1 -1
- package/dist/{formField.mixin-DWGkWIQa.cjs → formField.mixin-Dpx2Zk8-.cjs} +2 -2
- package/dist/{formField.mixin-DWGkWIQa.cjs.map → formField.mixin-Dpx2Zk8-.cjs.map} +1 -1
- package/dist/{icon-DZYFOov6.js → icon-C6CXTo3Z.js} +2 -2
- package/dist/{icon-DZYFOov6.js.map → icon-C6CXTo3Z.js.map} +1 -1
- package/dist/{icon-YYb239jY.cjs → icon-MrlToWLJ.cjs} +2 -2
- package/dist/{icon-YYb239jY.cjs.map → icon-MrlToWLJ.cjs.map} +1 -1
- package/dist/{icon-button-Yrq8D9rB.cjs → icon-button-BwAStx3H.cjs} +2 -2
- package/dist/{icon-button-Yrq8D9rB.cjs.map → icon-button-BwAStx3H.cjs.map} +1 -1
- package/dist/{icon-button-DeFeauMH.js → icon-button-Csj8jwj8.js} +3 -3
- package/dist/{icon-button-DeFeauMH.js.map → icon-button-Csj8jwj8.js.map} +1 -1
- package/dist/icons.cjs +1 -1
- package/dist/icons.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +171 -165
- package/dist/index.js.map +1 -1
- package/dist/{input-BsMQq8Or.js → input-B9PDbNB9.js} +3 -3
- package/dist/{input-BsMQq8Or.js.map → input-B9PDbNB9.js.map} +1 -1
- package/dist/{input-BX4VAA8U.cjs → input-D4L413yG.cjs} +2 -2
- package/dist/{input-BX4VAA8U.cjs.map → input-D4L413yG.cjs.map} +1 -1
- package/dist/input.cjs +1 -1
- package/dist/input.js +1 -1
- package/dist/layout.cjs +1 -1
- package/dist/layout.js +1 -1
- package/dist/{list-D9HxZJmG.js → list-Cdd7ht2E.js} +2 -2
- package/dist/{list-D9HxZJmG.js.map → list-Cdd7ht2E.js.map} +1 -1
- package/dist/{list-Bww4Iiey.cjs → list-DLUbjS69.cjs} +2 -2
- package/dist/{list-Bww4Iiey.cjs.map → list-DLUbjS69.cjs.map} +1 -1
- package/dist/list.cjs +1 -1
- package/dist/list.js +1 -1
- package/dist/{litElement.mixin-CLjCvtPx.js → litElement.mixin-BYVS1wwl.js} +2 -2
- package/dist/{litElement.mixin-CLjCvtPx.js.map → litElement.mixin-BYVS1wwl.js.map} +1 -1
- package/dist/{litElement.mixin-C98sb2sB.cjs → litElement.mixin-CbFQ2uxn.cjs} +2 -2
- package/dist/{litElement.mixin-C98sb2sB.cjs.map → litElement.mixin-CbFQ2uxn.cjs.map} +1 -1
- package/dist/mailbox.cjs +2 -0
- package/dist/mailbox.cjs.map +1 -0
- package/dist/mailbox.js +9 -0
- package/dist/mailbox.js.map +1 -0
- package/dist/{map-1mMvYo0I.js → map-DmjQ1Izx.js} +2 -2
- package/dist/{map-1mMvYo0I.js.map → map-DmjQ1Izx.js.map} +1 -1
- package/dist/{map-CZEpXVR1.cjs → map-DxUajvGo.cjs} +2 -2
- package/dist/{map-CZEpXVR1.cjs.map → map-DxUajvGo.cjs.map} +1 -1
- package/dist/map.cjs +1 -1
- package/dist/map.js +1 -1
- package/dist/{media-Dq-o2otE.cjs → media-DCIVM-cE.cjs} +2 -2
- package/dist/{media-Dq-o2otE.cjs.map → media-DCIVM-cE.cjs.map} +1 -1
- package/dist/{media-CGPGcf2N.js → media-DPurU9FS.js} +2 -2
- package/dist/{media-CGPGcf2N.js.map → media-DPurU9FS.js.map} +1 -1
- package/dist/{menu-Bl0w5kB_.cjs → menu-CIObvZ7n.cjs} +2 -2
- package/dist/{menu-Bl0w5kB_.cjs.map → menu-CIObvZ7n.cjs.map} +1 -1
- package/dist/{menu-DrrQkRZL.js → menu-CwRGjbC-.js} +3 -3
- package/dist/{menu-DrrQkRZL.js.map → menu-CwRGjbC-.js.map} +1 -1
- package/dist/menu.cjs +1 -1
- package/dist/menu.js +1 -1
- package/dist/nav-drawer.cjs +1 -1
- package/dist/nav-drawer.js +1 -1
- package/dist/netlify.toml +366 -0
- package/dist/{notification-service-BE2zvE-H.cjs → notification-service-BMnjQVrQ.cjs} +2 -2
- package/dist/{notification-service-BE2zvE-H.cjs.map → notification-service-BMnjQVrQ.cjs.map} +1 -1
- package/dist/{notification-service-DNKVvHBY.js → notification-service-DypTYarw.js} +4 -4
- package/dist/{notification-service-DNKVvHBY.js.map → notification-service-DypTYarw.js.map} +1 -1
- package/dist/notification.cjs +1 -1
- package/dist/notification.js +2 -2
- package/dist/{notify-DMUxXGK4.cjs → notify-CqCSy8Ek.cjs} +2 -2
- package/dist/{notify-DMUxXGK4.cjs.map → notify-CqCSy8Ek.cjs.map} +1 -1
- package/dist/{notify-BrKEcp4z.js → notify-DUMaApt7.js} +2 -2
- package/dist/{notify-BrKEcp4z.js.map → notify-DUMaApt7.js.map} +1 -1
- package/dist/{option-CugRKlmM.cjs → option-BuN5MSy7.cjs} +2 -2
- package/dist/{option-CugRKlmM.cjs.map → option-BuN5MSy7.cjs.map} +1 -1
- package/dist/{option-Ds5MbbtW.js → option-CvjLp3CB.js} +2 -2
- package/dist/{option-Ds5MbbtW.js.map → option-CvjLp3CB.js.map} +1 -1
- package/dist/option.cjs +1 -1
- package/dist/option.js +1 -1
- package/dist/{payment-card-form-DagrNF-H.cjs → payment-card-form-C9VN_H07.cjs} +2 -2
- package/dist/{payment-card-form-DagrNF-H.cjs.map → payment-card-form-C9VN_H07.cjs.map} +1 -1
- package/dist/{payment-card-form-BUQze-h_.js → payment-card-form-CFDdmSH2.js} +3 -3
- package/dist/{payment-card-form-BUQze-h_.js.map → payment-card-form-CFDdmSH2.js.map} +1 -1
- package/dist/{progress-CMR28yUw.js → progress-BeOOCcPN.js} +2 -2
- package/dist/{progress-CMR28yUw.js.map → progress-BeOOCcPN.js.map} +1 -1
- package/dist/{progress-C9_S0erz.cjs → progress-C-6ieScw.cjs} +2 -2
- package/dist/{progress-C9_S0erz.cjs.map → progress-C-6ieScw.cjs.map} +1 -1
- package/dist/progress.cjs +1 -1
- package/dist/progress.js +1 -1
- package/dist/{radio-button-CdvyPFKn.cjs → radio-button-Bi4ywYhW.cjs} +2 -2
- package/dist/{radio-button-CdvyPFKn.cjs.map → radio-button-Bi4ywYhW.cjs.map} +1 -1
- package/dist/{radio-button-DKSwDv7G.js → radio-button-D6zvMVQb.js} +3 -3
- package/dist/{radio-button-DKSwDv7G.js.map → radio-button-D6zvMVQb.js.map} +1 -1
- package/dist/radio-group.cjs +1 -1
- package/dist/radio-group.js +1 -1
- package/dist/{schmancy-steps-container-o660nlUA.js → schmancy-steps-container-CfDatUf8.js} +2 -2
- package/dist/{schmancy-steps-container-o660nlUA.js.map → schmancy-steps-container-CfDatUf8.js.map} +1 -1
- package/dist/{schmancy-steps-container-CsU-IwKt.cjs → schmancy-steps-container-i8rqaPet.cjs} +2 -2
- package/dist/{schmancy-steps-container-CsU-IwKt.cjs.map → schmancy-steps-container-i8rqaPet.cjs.map} +1 -1
- package/dist/{select-Cpxpfm_m.cjs → select-BPkJhj-o.cjs} +2 -2
- package/dist/{select-Cpxpfm_m.cjs.map → select-BPkJhj-o.cjs.map} +1 -1
- package/dist/{select-ukml9TYC.js → select-X7b74OI8.js} +3 -3
- package/dist/{select-ukml9TYC.js.map → select-X7b74OI8.js.map} +1 -1
- package/dist/select.cjs +1 -1
- package/dist/select.js +1 -1
- package/dist/{sheet-3VDjNIQO.cjs → sheet-BBT4JQ3Z.cjs} +2 -2
- package/dist/{sheet-3VDjNIQO.cjs.map → sheet-BBT4JQ3Z.cjs.map} +1 -1
- package/dist/{sheet-C944d0EG.js → sheet-DvCIJGFo.js} +4 -4
- package/dist/{sheet-C944d0EG.js.map → sheet-DvCIJGFo.js.map} +1 -1
- package/dist/sheet.cjs +1 -1
- package/dist/sheet.js +1 -1
- package/dist/{slider-DVSSKagG.cjs → slider-DWO4L_qC.cjs} +2 -2
- package/dist/{slider-DVSSKagG.cjs.map → slider-DWO4L_qC.cjs.map} +1 -1
- package/dist/{slider-BhxlOVWT.js → slider-py-bz6Vv.js} +3 -3
- package/dist/{slider-BhxlOVWT.js.map → slider-py-bz6Vv.js.map} +1 -1
- package/dist/slider.cjs +1 -1
- package/dist/slider.js +1 -1
- package/dist/{spinner-B4O46fTH.js → spinner-DpmMO5_E.js} +2 -2
- package/dist/{spinner-B4O46fTH.js.map → spinner-DpmMO5_E.js.map} +1 -1
- package/dist/{spinner-3kZLS7Cb.cjs → spinner-Dv1WJaIf.cjs} +2 -2
- package/dist/{spinner-3kZLS7Cb.cjs.map → spinner-Dv1WJaIf.cjs.map} +1 -1
- package/dist/steps.cjs +1 -1
- package/dist/steps.js +1 -1
- package/dist/{surface-BvaQlBsM.cjs → surface-Bn4-n1lT.cjs} +2 -2
- package/dist/{surface-BvaQlBsM.cjs.map → surface-Bn4-n1lT.cjs.map} +1 -1
- package/dist/{surface-C8u1VYhL.js → surface-CFNIITaq.js} +2 -2
- package/dist/{surface-C8u1VYhL.js.map → surface-CFNIITaq.js.map} +1 -1
- package/dist/surface.cjs +1 -1
- package/dist/surface.js +1 -1
- package/dist/{table-CyDat8c8.cjs → table-A_oEWQzm.cjs} +2 -2
- package/dist/{table-CyDat8c8.cjs.map → table-A_oEWQzm.cjs.map} +1 -1
- package/dist/{table-CFz1b1sP.js → table-DNUpAcQk.js} +2 -2
- package/dist/{table-CFz1b1sP.js.map → table-DNUpAcQk.js.map} +1 -1
- package/dist/table.cjs +1 -1
- package/dist/table.js +1 -1
- package/dist/{tabs-compatibility-lvrpa0sC.js → tabs-compatibility-Bxoz71f7.js} +2 -2
- package/dist/{tabs-compatibility-lvrpa0sC.js.map → tabs-compatibility-Bxoz71f7.js.map} +1 -1
- package/dist/{tabs-compatibility-BuochlXo.cjs → tabs-compatibility-DNVqDoQh.cjs} +2 -2
- package/dist/{tabs-compatibility-BuochlXo.cjs.map → tabs-compatibility-DNVqDoQh.cjs.map} +1 -1
- package/dist/tabs.cjs +1 -1
- package/dist/tabs.js +1 -1
- package/dist/tailwind.mixin-BU9fMdfc.cjs +2 -0
- package/dist/{tailwind.mixin-BxmzUuoy.cjs.map → tailwind.mixin-BU9fMdfc.cjs.map} +1 -1
- package/dist/tailwind.mixin-Bpgmqass.js +43 -0
- package/dist/{tailwind.mixin-2JxfkZ8s.js.map → tailwind.mixin-Bpgmqass.js.map} +1 -1
- package/dist/teleport.cjs +1 -1
- package/dist/teleport.js +1 -1
- package/dist/{textarea-D3TB4zVT.js → textarea-BE5TqYmx.js} +15 -12
- package/dist/textarea-BE5TqYmx.js.map +1 -0
- package/dist/{textarea-BwGtA0J3.cjs → textarea-DTlpsJ-V.cjs} +4 -4
- package/dist/textarea-DTlpsJ-V.cjs.map +1 -0
- package/dist/textarea.cjs +1 -1
- package/dist/textarea.js +1 -1
- package/dist/{theme-button-Dy8-BFPF.js → theme-button-BsojGTM7.js} +2 -2
- package/dist/{theme-button-Dy8-BFPF.js.map → theme-button-BsojGTM7.js.map} +1 -1
- package/dist/{theme-button-UYtArDID.cjs → theme-button-DG8sPYM-.cjs} +2 -2
- package/dist/{theme-button-UYtArDID.cjs.map → theme-button-DG8sPYM-.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.component-MAXMwTCm.js → theme.component-BG4oCMuV.js} +4 -4
- package/dist/{theme.component-MAXMwTCm.js.map → theme.component-BG4oCMuV.js.map} +1 -1
- package/dist/{theme.component-CSyghlYl.cjs → theme.component-D7TpDD6q.cjs} +3 -3
- package/dist/{theme.component-CSyghlYl.cjs.map → theme.component-D7TpDD6q.cjs.map} +1 -1
- package/dist/theme.js +1 -1
- package/dist/{timezone-Dw9OZuMM.js → timezone-DtsS7reI.js} +3 -3
- package/dist/{timezone-Dw9OZuMM.js.map → timezone-DtsS7reI.js.map} +1 -1
- package/dist/{timezone-TZYuQZP6.cjs → timezone-dc6VVlU0.cjs} +2 -2
- package/dist/{timezone-TZYuQZP6.cjs.map → timezone-dc6VVlU0.cjs.map} +1 -1
- package/dist/{tooltip-FihkwDY8.js → tooltip-C5C8KN_9.js} +2 -2
- package/dist/{tooltip-FihkwDY8.js.map → tooltip-C5C8KN_9.js.map} +1 -1
- package/dist/{tooltip-BBE_guBn.cjs → tooltip-CA2yHZN6.cjs} +2 -2
- package/dist/{tooltip-BBE_guBn.cjs.map → tooltip-CA2yHZN6.cjs.map} +1 -1
- package/dist/tooltip.cjs +1 -1
- package/dist/tooltip.js +1 -1
- package/dist/{tree-CMkehhmo.cjs → tree-D7CAcAHa.cjs} +2 -2
- package/dist/{tree-CMkehhmo.cjs.map → tree-D7CAcAHa.cjs.map} +1 -1
- package/dist/{tree-BT_APHcb.js → tree-jBMmDqPl.js} +2 -2
- package/dist/{tree-BT_APHcb.js.map → tree-jBMmDqPl.js.map} +1 -1
- package/dist/tree.cjs +1 -1
- package/dist/tree.js +1 -1
- package/dist/{typewriter-DGb13Ag4.cjs → typewriter-BMfjokvJ.cjs} +2 -2
- package/dist/{typewriter-DGb13Ag4.cjs.map → typewriter-BMfjokvJ.cjs.map} +1 -1
- package/dist/{typewriter-Dl1yTspy.js → typewriter-DDgmwo1Z.js} +7 -7
- package/dist/{typewriter-Dl1yTspy.js.map → typewriter-DDgmwo1Z.js.map} +1 -1
- package/dist/typewriter.cjs +1 -1
- package/dist/typewriter.js +1 -1
- package/dist/{typography-BSpj-MU6.cjs → typography-CeAzj0Al.cjs} +2 -2
- package/dist/{typography-BSpj-MU6.cjs.map → typography-CeAzj0Al.cjs.map} +1 -1
- package/dist/{typography-CardnZ_o.js → typography-D0JH1nwp.js} +2 -2
- package/dist/{typography-CardnZ_o.js.map → typography-D0JH1nwp.js.map} +1 -1
- package/dist/typography.cjs +1 -1
- package/dist/typography.js +1 -1
- package/package.json +1 -1
- package/types/src/index.d.ts +1 -0
- package/types/src/mailbox/email-editor.d.ts +103 -0
- package/types/src/mailbox/email-layout-selector.d.ts +19 -0
- package/types/src/mailbox/email-recipients.d.ts +118 -0
- package/types/src/mailbox/email-viewer.d.ts +86 -0
- package/types/src/mailbox/index.d.ts +12 -0
- package/types/src/mailbox/mailbox.d.ts +82 -0
- package/types/src/mailbox/types.d.ts +174 -0
- package/types/src/textarea/textarea.d.ts +2 -2
- package/dist/dialog-service-DGfyRhia.js +0 -135
- package/dist/dialog-service-DGfyRhia.js.map +0 -1
- package/dist/dialog-service-mkcNUT8P.cjs +0 -2
- package/dist/dialog-service-mkcNUT8P.cjs.map +0 -1
- package/dist/tailwind.mixin-2JxfkZ8s.js +0 -43
- package/dist/tailwind.mixin-BxmzUuoy.cjs +0 -2
- package/dist/textarea-BwGtA0J3.cjs.map +0 -1
- package/dist/textarea-D3TB4zVT.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"area.component-tnIDc9kT.cjs","sources":["../src/area/area.service.ts","../src/area/router.types.ts","../src/area/area.component.ts"],"sourcesContent":["import { \n\tObservable, \n\tReplaySubject, \n\tSubject, \n\tbufferTime, \n\tfilter, \n\tfromEvent, \n\tmap, \n\tof, \n\tskip, \n\ttap, \n\ttimeout, \n\tzip,\n\tshareReplay,\n\tdistinctUntilChanged,\n\tcatchError,\n\tEMPTY\n} from 'rxjs'\nimport { SchmancyTeleportation } from '../teleport'\nimport { ActiveRoute, AreaSubscription, RouteAction } from './router.types'\n\nexport const routerHistory = new Subject<RouteAction>()\n\nexport const FINDING_MORTIES = 'FINDING_MORTIES'\nexport const HERE_RICKY = 'HERE_RICKY'\nexport type HERE_RICKY_EVENT = CustomEvent<{\n\tcomponent: SchmancyTeleportation\n}>\nexport type FINDING_MORTIES_EVENT = CustomEvent<{\n\tcomponent: SchmancyTeleportation\n}>\n\n// WeakMap for better memory management of area subjects\nconst areaSubjectsCache = new WeakMap<AreaService, Map<string, ReplaySubject<ActiveRoute>>>()\n\n// Track navigation source to prevent history conflicts\ntype NavigationSource = 'programmatic' | 'browser' | 'initial'\n\nclass AreaService implements AreaSubscription {\n\tprivate static instance: AreaService\n\tpublic prettyURL = false\n\tpublic mode: 'SILENT' | 'HISTORY' = 'HISTORY'\n\tpublic request = new ReplaySubject<RouteAction>(1)\n\tpublic current = new Map<string, ActiveRoute>()\n\tpublic $current = new ReplaySubject<Map<string, ActiveRoute>>(1)\n\t\n\t// Create a dictionary of ReplaySubjects for area-specific subscriptions\n\tprivate get areaSubjects(): Map<string, ReplaySubject<ActiveRoute>> {\n\t\tlet subjects = areaSubjectsCache.get(this)\n\t\tif (!subjects) {\n\t\t\tsubjects = new Map()\n\t\t\tareaSubjectsCache.set(this, subjects)\n\t\t}\n\t\treturn subjects\n\t}\n\t\n\tpublic enableHistoryMode = true\n\tprivate findingMortiesEvent = new CustomEvent<FINDING_MORTIES_EVENT['detail']>(FINDING_MORTIES)\n\tprivate disposed = false\n\tpublic isProcessingPopstate = false\n\n\tconstructor() {\n\t\tthis.$current.next(this.current)\n\t\t\n\t\t// Subscribe to current changes to update area-specific subjects\n\t\tthis.$current.subscribe(currentAreas => {\n\t\t\tif (this.disposed) return\n\t\t\t\n\t\t\t// For each area in the current map\n\t\t\tcurrentAreas.forEach((route, areaName) => {\n\t\t\t\t// Get or create a subject for this area\n\t\t\t\tconst areaSubject = this.getOrCreateAreaSubject(areaName)\n\t\t\t\t// Emit the updated route to area-specific subscribers\n\t\t\t\tareaSubject.next(route)\n\t\t\t})\n\t\t})\n\n\t\t// Initialize from browser state if available\n\t\tthis.initializeFromBrowserState()\n\t}\n\n\t/**\n\t * Initialize router state from browser history state\n\t */\n\tprivate initializeFromBrowserState() {\n\t\ttry {\n\t\t\tconst browserState = history.state\n\t\t\tif (browserState && browserState.schmancyAreas) {\n\t\t\t\tObject.entries(browserState.schmancyAreas).forEach(([areaName, route]) => {\n\t\t\t\t\tthis.current.set(areaName, route as ActiveRoute)\n\t\t\t\t})\n\t\t\t\tthis.$current.next(this.current)\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.warn('Failed to initialize from browser state:', error)\n\t\t}\n\t}\n\n\t/**\n\t * Get or create a ReplaySubject for a specific area with proper cleanup\n\t */\n\tprivate getOrCreateAreaSubject(areaName: string): ReplaySubject<ActiveRoute> {\n\t\tlet subject = this.areaSubjects.get(areaName)\n\t\t\n\t\tif (!subject || subject.closed) {\n\t\t\tsubject = new ReplaySubject<ActiveRoute>(1)\n\t\t\tthis.areaSubjects.set(areaName, subject)\n\t\t\t\n\t\t\t// If the area already exists in current, emit it immediately\n\t\t\tconst currentRoute = this.current.get(areaName)\n\t\t\tif (currentRoute) {\n\t\t\t\tsubject.next({\n\t\t\t\t\t...currentRoute,\n\t\t\t\t\t// Ensure state, params and props are initialized if undefined\n\t\t\t\t\tstate: currentRoute.state || {},\n\t\t\t\t\tparams: currentRoute.params || {},\n\t\t\t\t\tprops: currentRoute.props || {}\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn subject\n\t}\n\n\t/**\n\t * Subscribe to a specific area with caching\n\t */\n\ton(areaName: string, skipCurrent = false): Observable<ActiveRoute> {\n\t\tif (!areaName) {\n\t\t\tthrow new Error('Area name is required')\n\t\t}\n\t\t\n\t\tconst areaSubject = this.getOrCreateAreaSubject(areaName)\n\t\tconst observable = areaSubject.asObservable().pipe(\n\t\t\t// Add distinct to prevent duplicate emissions - now includes state\n\t\t\tdistinctUntilChanged((a, b) => \n\t\t\t\ta.component === b.component &&\n\t\t\t\tJSON.stringify(a.state) === JSON.stringify(b.state) &&\n\t\t\t\tJSON.stringify(a.params) === JSON.stringify(b.params)\n\t\t\t),\n\t\t\t// Share the subscription\n\t\t\tshareReplay(1)\n\t\t)\n\t\t\n\t\treturn skipCurrent ? observable.pipe(skip(1)) : observable\n\t}\n\t\n\t/**\n\t * Subscribe to all areas\n\t */\n\tall(skipCurrent = false): Observable<Map<string, ActiveRoute>> {\n\t\tconst observable = this.$current.asObservable().pipe(\n\t\t\tshareReplay(1)\n\t\t)\n\t\treturn skipCurrent ? observable.pipe(skip(1)) : observable\n\t}\n\t\n\t/**\n\t * Get state from an area with type safety\n\t */\n\tgetState<T = unknown>(areaName: string): Observable<T> {\n\t\tif (!areaName) {\n\t\t\tthrow new Error('Area name is required')\n\t\t}\n\t\t\n\t\treturn this.on(areaName).pipe(\n\t\t\tmap(route => route.state),\n\t\t\tfilter((state): state is NonNullable<Record<string, unknown>> => \n\t\t\t\tstate !== undefined && state !== null\n\t\t\t),\n\t\t\tdistinctUntilChanged((a, b) => JSON.stringify(a) === JSON.stringify(b)),\n\t\t\tmap(state => state as T),\n\t\t\tcatchError(err => {\n\t\t\t\tconsole.error(`Error getting state for area \"${areaName}\":`, err)\n\t\t\t\treturn EMPTY\n\t\t\t})\n\t\t)\n\t}\n\t\n\t/**\n\t * Get params from an area with type safety\n\t */\n\tparams<T extends Record<string, unknown> = Record<string, unknown>>(areaName: string): Observable<T> {\n\t\tif (!areaName) {\n\t\t\tthrow new Error('Area name is required')\n\t\t}\n\t\t\n\t\treturn this.on(areaName).pipe(\n\t\t\tmap(route => route.params),\n\t\t\tfilter((params): params is NonNullable<Record<string, unknown>> => \n\t\t\t\tparams !== undefined && params !== null\n\t\t\t),\n\t\t\tdistinctUntilChanged((a, b) => JSON.stringify(a) === JSON.stringify(b)),\n\t\t\tmap(params => params as T),\n\t\t\tcatchError(err => {\n\t\t\t\tconsole.error(`Error getting params for area \"${areaName}\":`, err)\n\t\t\t\treturn EMPTY\n\t\t\t})\n\t\t)\n\t}\n\t\n\t/**\n\t * Get a specific param from an area with null safety\n\t */\n\tparam<T = unknown>(areaName: string, key: string): Observable<T> {\n\t\tif (!areaName || !key) {\n\t\t\tthrow new Error('Area name and key are required')\n\t\t}\n\t\t\n\t\treturn this.params<Record<string, unknown>>(areaName).pipe(\n\t\t\tmap(params => params[key]),\n\t\t\tfilter((value): value is NonNullable<unknown> => value !== undefined),\n\t\t\tdistinctUntilChanged(),\n\t\t\tmap(value => value as T),\n\t\t\tcatchError(err => {\n\t\t\t\tconsole.error(`Error getting param \"${key}\" for area \"${areaName}\":`, err)\n\t\t\t\treturn EMPTY\n\t\t\t})\n\t\t)\n\t}\n\t\n\t/**\n\t * Get props from an area with type safety\n\t */\n\tprops<T extends Record<string, unknown> = Record<string, unknown>>(areaName: string): Observable<T> {\n\t\tif (!areaName) {\n\t\t\tthrow new Error('Area name is required')\n\t\t}\n\t\t\n\t\treturn this.on(areaName).pipe(\n\t\t\tmap(route => route.props),\n\t\t\tfilter((props): props is NonNullable<Record<string, unknown>> => \n\t\t\t\tprops !== undefined && props !== null\n\t\t\t),\n\t\t\tdistinctUntilChanged((a, b) => JSON.stringify(a) === JSON.stringify(b)),\n\t\t\tmap(props => props as T),\n\t\t\tcatchError(err => {\n\t\t\t\tconsole.error(`Error getting props for area \"${areaName}\":`, err)\n\t\t\t\treturn EMPTY\n\t\t\t})\n\t\t)\n\t}\n\t\n\t/**\n\t * Get a specific prop from an area with null safety\n\t */\n\tprop<T = unknown>(areaName: string, key: string): Observable<T> {\n\t\tif (!areaName || !key) {\n\t\t\tthrow new Error('Area name and key are required')\n\t\t}\n\t\t\n\t\treturn this.props<Record<string, unknown>>(areaName).pipe(\n\t\t\tmap(props => props[key]),\n\t\t\tfilter((value): value is NonNullable<unknown> => value !== undefined),\n\t\t\tdistinctUntilChanged(),\n\t\t\tmap(value => value as T),\n\t\t\tcatchError(err => {\n\t\t\t\tconsole.error(`Error getting prop \"${key}\" for area \"${areaName}\":`, err)\n\t\t\t\treturn EMPTY\n\t\t\t})\n\t\t)\n\t}\n\n\t/**\n\t * Find teleportation components\n\t */\n\tfind() {\n\t\treturn zip([\n\t\t\tfromEvent<HERE_RICKY_EVENT>(window, HERE_RICKY).pipe(\n\t\t\t\tmap(e => e.detail),\n\t\t\t\tbufferTime(0),\n\t\t\t),\n\t\t\tof(1).pipe(tap(() => window.dispatchEvent(this.findingMortiesEvent))),\n\t\t]).pipe(\n\t\t\tmap(([component]) => component),\n\t\t\ttimeout(1),\n\t\t\tcatchError(() => EMPTY)\n\t\t)\n\t}\n\n\t/**\n\t * Push a new route action with validation\n\t */\n\tpush(r: RouteAction) {\n\t\tif (!r.area) {\n\t\t\tthrow new Error('Area is required for route action')\n\t\t}\n\t\t\n\t\t// Prevent processing during popstate handling\n\t\tif (this.isProcessingPopstate) {\n\t\t\treturn\n\t\t}\n\t\t\n\t\t// Ensure state, params and props are initialized\n\t\tconst routeAction: RouteAction = {\n\t\t\t...r,\n\t\t\tstate: r.state || {},\n\t\t\tparams: r.params || {},\n\t\t\tprops: r.props || {},\n\t\t\t_source: 'programmatic' as NavigationSource\n\t\t}\n\t\t\n\t\t// Add to history if enabled\n\t\tif (this.enableHistoryMode) {\n\t\t\trouterHistory.next(routeAction)\n\t\t}\n\t\t\n\t\tthis.request.next(routeAction)\n\t\t// Emit an area-specific event for those who want to listen directly to DOM events\n\t\tthis.dispatchAreaEvent(routeAction.area, routeAction)\n\t}\n\n\t/**\n\t * Internal method to update route from browser navigation\n\t * This should only be called by area components during popstate handling\n\t */\n\t_updateFromBrowser(routeAction: RouteAction) {\n\t\tconst enhancedRoute: RouteAction = {\n\t\t\t...routeAction,\n\t\t\tstate: routeAction.state || {},\n\t\t\tparams: routeAction.params || {},\n\t\t\tprops: routeAction.props || {},\n\t\t\t_source: 'browser' as NavigationSource\n\t\t}\n\t\t\n\t\tthis.isProcessingPopstate = true\n\t\tthis.request.next(enhancedRoute)\n\t\tthis.isProcessingPopstate = false\n\t}\n\n\t/**\n\t * Update browser history state (called by area components)\n\t */\n\t_updateBrowserHistory(areaName: string, route: ActiveRoute, historyStrategy?: string, clearQueryParams?: string[] | boolean | null) {\n\t\tif (!this.enableHistoryMode) return\n\t\t\n\t\ttry {\n\t\t\t// Get current browser state or create new one\n\t\t\tconst currentState = history.state || {}\n\t\t\tconst schmancyAreas = currentState.schmancyAreas || {}\n\t\t\t\n\t\t\t// Update the specific area - only include non-empty state/params/props\n\t\t\tconst areaData: any = {\n\t\t\t\tcomponent: route.component,\n\t\t\t\tarea: route.area\n\t\t\t}\n\t\t\t\n\t\t\t// Only include state if it has content\n\t\t\tif (route.state && Object.keys(route.state).length > 0) {\n\t\t\t\tareaData.state = route.state\n\t\t\t}\n\t\t\t\n\t\t\t// Only include params if it has content\n\t\t\tif (route.params && Object.keys(route.params).length > 0) {\n\t\t\t\tareaData.params = route.params\n\t\t\t}\n\t\t\t\n\t\t\t// Only include props if it has content\n\t\t\tif (route.props && Object.keys(route.props).length > 0) {\n\t\t\t\tareaData.props = route.props\n\t\t\t}\n\t\t\t\n\t\t\tschmancyAreas[areaName] = areaData\n\t\t\t\n\t\t\tconst newState = {\n\t\t\t\t...currentState,\n\t\t\t\tschmancyAreas\n\t\t\t}\n\t\t\t\n\t\t\t// Create clean URL\n\t\t\tconst url = this.createCleanURL(schmancyAreas, clearQueryParams)\n\t\t\t\n\t\t\t// Update browser history\n\t\t\tif (historyStrategy === 'replace' || historyStrategy === 'pop') {\n\t\t\t\thistory.replaceState(newState, '', url)\n\t\t\t} else if (historyStrategy === 'push' || !historyStrategy) {\n\t\t\t\thistory.pushState(newState, '', url)\n\t\t\t}\n\t\t\t// 'silent' strategy doesn't update browser history\n\t\t\t\n\t\t} catch (error) {\n\t\t\tconsole.error('Failed to update browser history:', error)\n\t\t}\n\t}\n\n\t/**\n\t * Create a clean URL from area states\n\t */\n\tprivate createCleanURL(areas: Record<string, ActiveRoute>, clearQueryParams?: string[] | boolean | null): string {\n\t\t// Handle query parameters\n\t\tlet queryString = ''\n\t\t\n\t\tif (clearQueryParams !== true) {\n\t\t\t// Get current query params\n\t\t\tconst urlParams = new URLSearchParams(location.search)\n\t\t\t\n\t\t\t// Clear specific params if provided\n\t\t\tif (Array.isArray(clearQueryParams)) {\n\t\t\t\tclearQueryParams.forEach(param => urlParams.delete(param))\n\t\t\t}\n\t\t\t\n\t\t\t// Convert back to string\n\t\t\tqueryString = urlParams.toString()\n\t\t\tqueryString = queryString ? `?${queryString}` : ''\n\t\t}\n\t\t// If clearQueryParams === true, queryString remains empty (all params cleared)\n\t\t\n\t\tif (this.prettyURL) {\n\t\t\t// Create pretty URLs - customize this based on your routing needs\n\t\t\tconst mainArea = areas.main\n\t\t\tif (mainArea) {\n\t\t\t\tlet path = `/${mainArea.component}`\n\t\t\t\t\n\t\t\t\t// Add simple params to URL\n\t\t\t\tconst searchParams = new URLSearchParams(queryString)\n\t\t\t\tif (mainArea.params) {\n\t\t\t\t\tObject.entries(mainArea.params).forEach(([key, value]) => {\n\t\t\t\t\t\tif (typeof value === 'string' || typeof value === 'number') {\n\t\t\t\t\t\t\tsearchParams.set(key, String(value))\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tconst query = searchParams.toString()\n\t\t\t\treturn path + (query ? `?${query}` : '')\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Fallback to encoded state in URL (original behavior)\n\t\ttry {\n\t\t\t// Clean up empty objects before encoding\n\t\t\tconst cleanedAreas: Record<string, any> = {}\n\t\t\tObject.entries(areas).forEach(([areaName, route]) => {\n\t\t\t\tconst cleanRoute: any = { component: route.component }\n\t\t\t\t\n\t\t\t\t// Only include state if it has content\n\t\t\t\tif (route.state && Object.keys(route.state).length > 0) {\n\t\t\t\t\tcleanRoute.state = route.state\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// Only include params if it has content\n\t\t\t\tif (route.params && Object.keys(route.params).length > 0) {\n\t\t\t\t\tcleanRoute.params = route.params\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// Only include props if it has content\n\t\t\t\tif (route.props && Object.keys(route.props).length > 0) {\n\t\t\t\t\tcleanRoute.props = route.props\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tcleanedAreas[areaName] = cleanRoute\n\t\t\t})\n\t\t\t\n\t\t\tconst encoded = encodeURIComponent(JSON.stringify(cleanedAreas))\n\t\t\treturn `/${encoded}${queryString}`\n\t\t} catch (error) {\n\t\t\tconsole.error('Failed to encode URL state:', error)\n\t\t\treturn location.pathname\n\t\t}\n\t}\n\n\t/**\n\t * Restore state from browser history state\n\t */\n\trestoreFromBrowserState(browserState: any): Record<string, ActiveRoute> {\n\t\ttry {\n\t\t\tif (browserState && browserState.schmancyAreas) {\n\t\t\t\treturn browserState.schmancyAreas\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error('Failed to restore from browser state:', error)\n\t\t}\n\t\t\n\t\t// Fallback to URL parsing (original behavior)\n\t\treturn this.parseStateFromURL()\n\t}\n\n\t/**\n\t * Parse state from URL (fallback method)\n\t */\n\tprivate parseStateFromURL(): Record<string, ActiveRoute> {\n\t\tconst pathname = location.pathname.split('/').pop()\n\t\tif (!pathname) return {}\n\t\t\n\t\ttry {\n\t\t\tconst decoded = decodeURIComponent(pathname)\n\t\t\tconst parsed = JSON.parse(decoded)\n\t\t\t\n\t\t\tif (typeof parsed === 'object' && parsed !== null) {\n\t\t\t\treturn parsed\n\t\t\t}\n\t\t} catch {\n\t\t\t// Ignore parse errors\n\t\t}\n\t\t\n\t\treturn {}\n\t}\n\t\n\t/**\n\t * Dispatch a DOM event for a specific area change\n\t */\n\tprivate dispatchAreaEvent(areaName: string, routeAction: RouteAction) {\n\t\tconst eventName = `schmancy-area-${areaName}-changed`\n\t\tconst event = new CustomEvent(eventName, { \n\t\t\tdetail: { \n\t\t\t\tarea: areaName,\n\t\t\t\tcomponent: routeAction.component,\n\t\t\t\tstate: routeAction.state,\n\t\t\t\tparams: routeAction.params,\n\t\t\t\tprops: routeAction.props,\n\t\t\t\thistoryStrategy: routeAction.historyStrategy\n\t\t\t},\n\t\t\tbubbles: true,\n\t\t\tcomposed: true\n\t\t})\n\t\twindow.dispatchEvent(event)\n\t}\n\n\t/**\n\t * Remove an area from the current state\n\t */\n\tpop(name: string) {\n\t\tif (!name) {\n\t\t\tthrow new Error('Area name is required')\n\t\t}\n\t\t\n\t\t// Remove from current map\n\t\tthis.current.delete(name)\n\t\tthis.$current.next(this.current)\n\t\t\n\t\t// Update browser history\n\t\tif (this.enableHistoryMode) {\n\t\t\ttry {\n\t\t\t\tconst currentState = history.state || {}\n\t\t\t\tconst schmancyAreas = { ...(currentState.schmancyAreas || {}) }\n\t\t\t\tdelete schmancyAreas[name]\n\t\t\t\t\n\t\t\t\tconst newState = {\n\t\t\t\t\t...currentState,\n\t\t\t\t\tschmancyAreas\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tconst url = this.createCleanURL(schmancyAreas)\n\t\t\t\thistory.replaceState(newState, '', url)\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('Failed to update history after pop:', error)\n\t\t\t}\n\t\t}\n\t}\n\t\n\t/**\n\t * Clear all areas\n\t */\n\tclear() {\n\t\t// Complete all area subjects\n\t\tthis.areaSubjects.forEach(subject => subject.complete())\n\t\tthis.areaSubjects.clear()\n\t\t\n\t\t// Clear current state\n\t\tthis.current.clear()\n\t\tthis.$current.next(this.current)\n\t\t\n\t\t// Update URL\n\t\tif (this.enableHistoryMode) {\n\t\t\thistory.replaceState({ schmancyAreas: {} }, '', `/${location.search}`)\n\t\t}\n\t}\n\t\n\t/**\n\t * Dispose of the service and clean up resources\n\t */\n\tdispose() {\n\t\tif (this.disposed) return\n\t\t\n\t\tthis.disposed = true\n\t\t\n\t\t// Complete all subjects\n\t\tthis.areaSubjects.forEach(subject => subject.complete())\n\t\tthis.areaSubjects.clear()\n\t\t\n\t\tthis.request.complete()\n\t\tthis.$current.complete()\n\t\trouterHistory.complete()\n\t\t\n\t\t// Clear references\n\t\tthis.current.clear()\n\t\tareaSubjectsCache.delete(this)\n\t}\n\t\n\t/**\n\t * Get singleton instance\n\t */\n\tstatic getInstance() {\n\t\tif (!AreaService.instance) {\n\t\t\tAreaService.instance = new AreaService()\n\t\t}\n\t\treturn AreaService.instance\n\t}\n\n\t/**\n\t * Get current state from URL (deprecated - use browser state instead)\n\t */\n\tget state(): Record<string, unknown> {\n\t\t// Try browser state first\n\t\ttry {\n\t\t\tconst browserState = history.state\n\t\t\tif (browserState && browserState.schmancyAreas) {\n\t\t\t\treturn browserState.schmancyAreas\n\t\t\t}\n\t\t} catch {\n\t\t\t// Fallback to URL parsing\n\t\t}\n\t\t\n\t\t// Fallback to URL parsing (original behavior)\n\t\treturn this.parseStateFromURL()\n\t}\n\t\n\t/**\n\t * Check if an area exists in current state\n\t */\n\thasArea(areaName: string): boolean {\n\t\treturn this.current.has(areaName)\n\t}\n\t\n\t/**\n\t * Get all active area names\n\t */\n\tgetActiveAreas(): string[] {\n\t\treturn Array.from(this.current.keys())\n\t}\n\t\n\t/**\n\t * Get route for a specific area synchronously\n\t */\n\tgetRoute(areaName: string): ActiveRoute | undefined {\n\t\treturn this.current.get(areaName)\n\t}\n}\n\nexport const area = AreaService.getInstance()\nexport default area\n\n// Cleanup on page unload\nif (typeof window !== 'undefined') {\n\twindow.addEventListener('unload', () => {\n\t\tarea.dispose()\n\t})\n}","export type RouteAction = {\n\tcomponent: CustomElementConstructor | string | HTMLElement | Promise<any>\n\tarea: string\n\tstate?: Record<string, unknown>\n\tparams?: Record<string, unknown>\n\tprops?: Record<string, unknown> // Alias for params\n\thistoryStrategy?: THistoryStrategy\n\tclearQueryParams?: string[] | boolean | null\n\t_source?: 'programmatic' | 'browser' | 'initial' // Internal use only\n}\n\nexport type ActiveRoute = {\n\tcomponent: string\n\tarea: string\n\tstate?: Record<string, unknown>\n\tparams?: Record<string, unknown>\n\tprops?: Record<string, unknown>\n}\n\n/**\n * Interface for subscribing to area changes\n */\nexport interface AreaSubscription {\n\t/**\n\t * Subscribe to a specific area\n\t * @param areaName Name of the area to subscribe to\n\t * @param skipCurrent Whether to skip the current value\n\t * @returns Observable of the active route for the specified area\n\t */\n\ton(areaName: string, skipCurrent?: boolean): import('rxjs').Observable<ActiveRoute>\n\t\n\t/**\n\t * Subscribe to all areas\n\t * @param skipCurrent Whether to skip the current value\n\t * @returns Observable of all active routes\n\t */\n\tall(skipCurrent?: boolean): import('rxjs').Observable<Map<string, ActiveRoute>>\n\t\n\t/**\n\t * Get state from an area\n\t * @param areaName Name of the area to subscribe to\n\t * @returns Observable of the area's state\n\t */\n\tgetState<T = unknown>(areaName: string): import('rxjs').Observable<T>\n\t\n\t/**\n\t * Get params from an area\n\t * @param areaName Name of the area to subscribe to\n\t * @returns Observable of the area's params\n\t */\n\tparams<T extends Record<string, unknown> = Record<string, unknown>>(areaName: string): import('rxjs').Observable<T>\n\t\n\t/**\n\t * Get a specific param from an area\n\t * @param areaName Name of the area to subscribe to\n\t * @param key Key of the param to select\n\t * @returns Observable of the param value\n\t */\n\tparam<T = unknown>(areaName: string, key: string): import('rxjs').Observable<T>\n\t\n\t/**\n\t * Get props from an area\n\t * @param areaName Name of the area to subscribe to\n\t * @returns Observable of the area's props\n\t */\n\tprops<T extends Record<string, unknown> = Record<string, unknown>>(areaName: string): import('rxjs').Observable<T>\n\t\n\t/**\n\t * Get a specific prop from an area\n\t * @param areaName Name of the area to subscribe to\n\t * @param key Key of the prop to select\n\t * @returns Observable of the prop value\n\t */\n\tprop<T = unknown>(areaName: string, key: string): import('rxjs').Observable<T>\n}\n\nexport type THistoryStrategy = 'push' | 'replace' | 'pop' | 'silent'\n\nexport enum HISTORY_STRATEGY {\n\tpush = 'push',\n\treplace = 'replace',\n\tpop = 'pop',\n\tsilent = 'silent',\n}\n\n/**\n * Browser history state structure used by Schmancy Area\n */\nexport interface SchmancyHistoryState {\n\tschmancyAreas: Record<string, ActiveRoute>\n\t[key: string]: any // Allow other apps to store additional state\n}","import { $LitElement } from '@mixins/index'\nimport { TemplateResult, css, html } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport {\n\tEMPTY,\n\tcatchError,\n\tdistinctUntilChanged,\n\tfilter,\n\tfrom,\n\tfromEvent,\n\tmap,\n\tmerge,\n\tof,\n\tswitchMap,\n\ttake,\n\ttakeUntil,\n\ttap\n} from 'rxjs'\nimport { isPresent } from 'ts-is-present'\nimport area from './area.service'\nimport { ActiveRoute, HISTORY_STRATEGY, RouteAction } from './router.types'\n\ntype TRouteArea = {\n\tcomponent: string\n\tstate: object | undefined\n\tparams?: Record<string, unknown>\n\tprops?: Record<string, unknown>\n}\n\n\n@customElement('schmancy-area')\nexport class SchmancyArea extends $LitElement(css`\n\t:host {\n\t\tposition: relative;\n\t\tdisplay: block;\n\t\tinset: 0;\n\t}\n`) {\n\t/**\n\t * The name of the router outlet\n\t * @attr\n\t * @type {string}\n\t * @public\n\t * @required\n\t */\n\t@property() name!: string\n\n\t@property() default!: string | CustomElementConstructor | TemplateResult<1>\n\n\t/**\n\t * Get component from pathname with better error handling\n\t */\n\tgetComponentFromPathname(pathname: string, historyStrategy: HISTORY_STRATEGY) {\n\t\treturn of(pathname).pipe(\n\t\t\tmap(path => path.split('/').pop() ?? ''),\n\t\t\tmap(path => {\n\t\t\t\ttry {\n\t\t\t\t\treturn JSON.parse(decodeURIComponent(path))\n\t\t\t\t} catch {\n\t\t\t\t\treturn {}\n\t\t\t\t}\n\t\t\t}),\n\t\t\tmap(routes => routes[this.name] as TRouteArea),\n\t\t\tmap(component =>\n\t\t\t\t!component && this.default\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tcomponent: this.default,\n\t\t\t\t\t\t\tstate: undefined,\n\t\t\t\t\t\t\tparams: undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t: component,\n\t\t\t),\n\t\t\tfilter(x => isPresent(x)),\n\t\t\tmap((component: TRouteArea) => ({\n\t\t\t\tarea: this.name,\n\t\t\t\tcomponent: component.component ?? this.default,\n\t\t\t\tstate: component.state || {},\n\t\t\t\tparams: component.params || {},\n\t\t\t\thistoryStrategy\n\t\t\t} as RouteAction)),\n\t\t\tcatchError((error) => {\n\t\t\t\tconsole.error('Error parsing component from pathname:', error)\n\t\t\t\treturn this.default\n\t\t\t\t\t? of({\n\t\t\t\t\t\t\tarea: this.name,\n\t\t\t\t\t\t\tcomponent: this.default,\n\t\t\t\t\t\t\thistoryStrategy,\n\t\t\t\t\t\t\tstate: {},\n\t\t\t\t\t\t\tparams: {},\n\t\t\t\t\t\t\tprops: {}\n\t\t\t\t\t\t} as RouteAction)\n\t\t\t\t\t: EMPTY\n\t\t\t}),\n\t\t)\n\t}\n\n\t/**\n\t * Get component from browser state with fallback to URL\n\t */\n\tgetComponentFromBrowserState(event: PopStateEvent): RouteAction | null {\n\t\ttry {\n\t\t\tconst browserState = event.state\n\t\t\tif (browserState && browserState.schmancyAreas && browserState.schmancyAreas[this.name]) {\n\t\t\t\tconst areaState = browserState.schmancyAreas[this.name]\n\t\t\t\treturn {\n\t\t\t\t\tarea: this.name,\n\t\t\t\t\tcomponent: areaState.component,\n\t\t\t\t\tstate: areaState.state || {},\n\t\t\t\t\tparams: areaState.params || {},\n\t\t\t\t\thistoryStrategy: HISTORY_STRATEGY.silent,\n\t\t\t\t\t_source: 'browser'\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error('Error reading browser state:', error)\n\t\t}\n\t\t\n\t\treturn null\n\t}\n\n\tprotected firstUpdated(): void {\n\t\tif (!this.name) {\n\t\t\tthrow new Error('Area name or default component not set')\n\t\t}\n\n\t\t// Create a single merged stream for ALL events that might affect this area\n\t\tmerge(\n\t\t\t// 1. Initial load from URL\n\t\t\tof(location.pathname).pipe(\n\t\t\t\tswitchMap(pathname => this.getComponentFromPathname(pathname, HISTORY_STRATEGY.silent)),\n\t\t\t\ttake(1),\n\t\t\t\ttap(route => console.log(`[${this.name}] Initial load:`, route))\n\t\t\t),\n\n\t\t\t// 2. Direct navigation requests to this area\n\t\t\tarea.request.pipe(\n\t\t\t\tfilter(({ area }) => area === this.name),\n\t\t\t\ttap(route => console.log(`[${this.name}] Navigation request:`, route))\n\t\t\t),\n\n\t\t\t// 3. Browser navigation (back/forward)\n\t\t\tfromEvent<PopStateEvent>(window, 'popstate').pipe(\n\t\t\t\t// Parse the state to see if this area is affected\n\t\t\t\tswitchMap(event => {\n\t\t\t\t\tconsole.log(`[${this.name}] Processing popstate event:`, event)\n\t\t\t\t\tconst state = event.state?.schmancyAreas?.[this.name]\n\t\t\t\t\tconst pathname = (event.target as Window).location.pathname\n\t\t\t\t\t\n\t\t\t\t\t// If this area exists in the state, use it\n\t\t\t\t\tif (state) {\n\t\t\t\t\t\treturn of({\n\t\t\t\t\t\t\tarea: this.name,\n\t\t\t\t\t\t\tcomponent: state.component,\n\t\t\t\t\t\t\tstate: state.state || {},\n\t\t\t\t\t\t\tparams: state.params || {},\n\t\t\t\t\t\t\thistoryStrategy: HISTORY_STRATEGY.silent\n\t\t\t\t\t\t} as RouteAction)\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t// Check if it exists in the URL\n\t\t\t\t\treturn this.getComponentFromPathname(pathname, HISTORY_STRATEGY.silent).pipe(\n\t\t\t\t\t\t// If nothing found in URL and no default, emit empty component\n\t\t\t\t\t\tswitchMap(route => {\n\t\t\t\t\t\t\tif (!route.component && !this.default) {\n\t\t\t\t\t\t\t\treturn of({\n\t\t\t\t\t\t\t\t\tarea: this.name,\n\t\t\t\t\t\t\t\t\tcomponent: '', // Empty component to track state change\n\t\t\t\t\t\t\t\t\tstate: {},\n\t\t\t\t\t\t\t\t\tparams: {},\n\t\t\t\t\t\t\t\t\thistoryStrategy: HISTORY_STRATEGY.silent\n\t\t\t\t\t\t\t\t} as RouteAction)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn of(route)\n\t\t\t\t\t\t})\n\t\t\t\t\t)\n\t\t\t\t}),\n\t\t\t\ttap(route => console.log(`[${this.name}] Browser navigation:`, route))\n\t\t\t),\n\n\t\t\t// 4. Handle area.pop() - when area is removed from current map\n\t\t\tarea.$current.pipe(\n\t\t\t\tmap(currentAreas => !currentAreas.has(this.name)),\n\t\t\t\tdistinctUntilChanged(),\n\t\t\t\tfilter(removed => removed),\n\t\t\t\tmap(() => ({\n\t\t\t\t\tarea: this.name,\n\t\t\t\t\tcomponent: this.default || '', // Use default or empty component\n\t\t\t\t\tstate: {},\n\t\t\t\t\tparams: {},\n\t\t\t\t\thistoryStrategy: HISTORY_STRATEGY.silent\n\t\t\t\t} as RouteAction)),\n\t\t\t\ttap(() => console.log(`[${this.name}] Area cleared via pop()`))\n\t\t\t)\n\t\t)\n\t\t\t.pipe(\n\t\t\t\t// Allow empty string component (means clear)\n\t\t\t\tfilter(request => request.component !== null && request.component !== undefined),\n\t\t\t\ttakeUntil(this.disconnecting),\n\t\t\t\t// Prevent duplicate navigations\n\t\t\t\tdistinctUntilChanged((a, b) => {\n\t\t\t\t\t// Compare component names (normalize)\n\t\t\t\t\tlet aComponent: string = '', bComponent: string = ''\n\t\t\t\t\t\n\t\t\t\t\t// Handle function components by comparing constructor names\n\t\t\t\t\tif (typeof a.component === 'function') {\n\t\t\t\t\t\taComponent = (a.component as any).name || a.component.toString()\n\t\t\t\t\t} else if (typeof a.component === 'string') {\n\t\t\t\t\t\taComponent = a.component\n\t\t\t\t\t}\n\n\t\t\t\t\tif (typeof b.component === 'function') {\n\t\t\t\t\t\tbComponent = (b.component as any).name || b.component.toString()\n\t\t\t\t\t} else if (typeof b.component === 'string') {\n\t\t\t\t\t\tbComponent = b.component\n\t\t\t\t\t}\n\n\t\t\t\t\t// Normalize component names for comparison\n\t\t\t\t\tconst normalizeComponent = (c: string) => c?.replaceAll('-', '').toLowerCase()\n\t\t\t\t\tconst sameComponent = normalizeComponent(aComponent) === normalizeComponent(bComponent)\n\t\t\t\t\tconst sameParams = JSON.stringify(a.params || {}) === JSON.stringify(b.params || {})\n\t\t\t\t\tconst sameState = JSON.stringify(a.state || {}) === JSON.stringify(b.state || {})\n\t\t\t\t\t\n\t\t\t\t\tconst result = sameComponent && sameParams && sameState\n\t\t\t\t\t\n\t\t\t\t\tif (!result) {\n\t\t\t\t\t\tconsole.log(`[${this.name}] Route change detected:`, {\n\t\t\t\t\t\t\tsameComponent,\n\t\t\t\t\t\t\tsameParams, \n\t\t\t\t\t\t\tsameState\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\treturn result\n\t\t\t\t}),\n\t\t\t)\n\t\t\t.pipe(\n\t\t\t\t// Resolve component (handle dynamic imports, constructors, etc.)\n\t\t\t\tswitchMap(route => {\n\t\t\t\t\tconst c = route.component\n\t\t\t\t\tif (c instanceof Promise) {\n\t\t\t\t\t\t// Dynamic import module\n\t\t\t\t\t\treturn from(c).pipe(\n\t\t\t\t\t\t\tmap((x: any) => ({ \n\t\t\t\t\t\t\t\tcomponent: (x.exports?.default || x.default) as CustomElementConstructor, \n\t\t\t\t\t\t\t\troute \n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\tcatchError(error => {\n\t\t\t\t\t\t\t\tconsole.error(`[${this.name}] Failed to load dynamic component:`, error)\n\t\t\t\t\t\t\t\treturn EMPTY\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t)\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Already a string, function, or element\n\t\t\t\t\t\treturn of({ component: c, route })\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t\t// Create DOM element\n\t\t\t\tmap(({ component, route }) => {\n\t\t\t\t\tlet element: HTMLElement | null = null\n\t\t\t\t\t\n\t\t\t\t\tif (component === '') {\n\t\t\t\t\t\t// Empty component means clear the area\n\t\t\t\t\t\telement = null\n\t\t\t\t\t} else if (typeof component === 'string') {\n\t\t\t\t\t\t// Tag name\n\t\t\t\t\t\telement = document.createElement(component)\n\t\t\t\t\t} else if (component instanceof HTMLElement) {\n\t\t\t\t\t\t// Already an element instance\n\t\t\t\t\t\telement = component\n\t\t\t\t\t} else if (typeof component === 'function') {\n\t\t\t\t\t\t// Custom element constructor\n\t\t\t\t\t\telement = new component()\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// @ts-ignore - we know component exists\n\t\t\t\t\t\telement = component\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t// Set params as properties on the element\n\t\t\t\t\tif (element && route.params) {\n\t\t\t\t\t\tObject.entries(route.params).forEach(([key, value]) => {\n\t\t\t\t\t\t\t(element as any)[key] = value\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t// Set state as well if provided\n\t\t\t\t\tif (element && route.state) {\n\t\t\t\t\t\t(element as any).state = route.state\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\treturn { component: element, route }\n\t\t\t\t}),\n\t\t\t\t// Update DOM and handle side effects\n\t\t\t\ttap(({ component, route }) => {\n\t\t\t\t\t// Update DOM\n\t\t\t\t\tthis.updateDOM(component)\n\t\t\t\t\t\n\t\t\t\t\t// Update internal state first\n\t\t\t\t\tthis.updateInternalState(route, component)\n\t\t\t\t\t\n\t\t\t\t\t// Handle browser history\n\t\t\t\t\tthis.updateBrowserHistory(route, component)\n\t\t\t\t}),\n\t\t\t\t// Error handling\n\t\t\t\tcatchError(error => {\n\t\t\t\t\tconsole.error(`[${this.name}] Navigation error:`, error)\n\t\t\t\t\treturn EMPTY\n\t\t\t\t}),\n\t\t\t\ttakeUntil(this.disconnecting),\n\t\t\t)\n\t\t\t.subscribe({\n\t\t\t\terror: (error) => {\n\t\t\t\t\tconsole.error(`[${this.name}] Subscription error:`, error)\n\t\t\t\t}\n\t\t\t})\n\t}\n\n\t/**\n\t * Update the DOM with the new component\n\t */\n\tprivate updateDOM(component: HTMLElement | null) {\n\t\tconst oldView = this.shadowRoot?.children[0]\n\t\tconst oldViewExists = !!oldView\n\n\t\t// Remove the old view (if any)\n\t\toldView?.remove()\n\t\t\n\t\t// If component is null, we're clearing the area\n\t\tif (!component) {\n\t\t\treturn\n\t\t}\n\t\t\n\t\t// Add new component with animation\n\t\tcomponent.classList.add('opacity-0')\n\t\tthis.shadowRoot?.append(component)\n\t\t\n\t\t// Animate in\n\t\tcomponent.animate([{ opacity: 0 }, { opacity: 1 }], {\n\t\t\tduration: oldViewExists ? 150 : 100,\n\t\t\teasing: 'cubic-bezier(0.25, 0.8, 0.25, 1)',\n\t\t\tfill: 'forwards',\n\t\t})\n\t}\n\n\t/**\n\t * Update internal router state\n\t */\n\tprivate updateInternalState(route: RouteAction, component: HTMLElement | null) {\n\t\t// If component is null, we're clearing\n\t\tif (!component) {\n\t\t\t// Don't update state - it's already been cleared by the service\n\t\t\treturn\n\t\t}\n\t\t\n\t\tconst activeRoute: ActiveRoute = {\n\t\t\tcomponent: component.tagName.toLowerCase(),\n\t\t\tstate: route.state || {},\n\t\t\tarea: this.name,\n\t\t\tparams: route.params || {},\n\t\t}\n\n\t\tarea.current.set(this.name, activeRoute)\n\t\tarea.$current.next(area.current)\n\t}\n\n\t/**\n\t * Update browser history (only for programmatic navigation)\n\t */\n\tprivate updateBrowserHistory(route: RouteAction, component: HTMLElement | null) {\n\t\tif (!area.enableHistoryMode) return\n\t\t\n\t\t// If clearing, don't update history (already handled by service)\n\t\tif (!component) {\n\t\t\treturn\n\t\t}\n\t\t\n\t\tconst activeRoute: ActiveRoute = {\n\t\t\tcomponent: component.tagName.toLowerCase(),\n\t\t\tstate: route.state || {},\n\t\t\tarea: this.name,\n\t\t\tparams: route.params || {},\n\t\t}\n\n\t\t// Use the service method to update browser history\n\t\tarea._updateBrowserHistory(this.name, activeRoute, route.historyStrategy, route.clearQueryParams)\n\t}\n\n\n\t/**\n\t * Create URL path for the route (legacy method, now handled by service)\n\t */\n\tnewPath(tag: string, route: RouteAction) {\n\t\tconst oldPathname = location.pathname.split('/').pop()\n\t\tlet oldAreaState = {}\n\t\ttry {\n\t\t\toldAreaState = oldPathname ? JSON.parse(decodeURIComponent(oldPathname)) : {}\n\t\t} catch {\n\t\t\toldAreaState = {}\n\t\t}\n\t\troute.state = route.state ?? {}\n\t\tconst queryParams = route.clearQueryParams ? this.queryParamClear(route.clearQueryParams) : document.location.search\n\n\t\treturn encodeURIComponent(\n\t\t\tJSON.stringify({\n\t\t\t\t...oldAreaState,\n\t\t\t\t[this.name]: { component: tag.toLowerCase(), state: route.state, params: route.params },\n\t\t\t}),\n\t\t).concat(`${queryParams}`)\n\t}\n\n\t/**\n\t * Clear query parameters\n\t */\n\tqueryParamClear(params?: string[] | boolean) {\n\t\tif (!params) {\n\t\t\treturn ''\n\t\t}\n\t\t// get query params from url\n\t\tconst urlParams = new URLSearchParams(location.search)\n\t\t\n\t\tif (params === true) {\n\t\t\t// Clear all query params\n\t\t\treturn ''\n\t\t} else {\n\t\t\t// Clear specific query params\n\t\t\tparams.forEach(param => urlParams.delete(param))\n\t\t\t// update url\n\t\t\tif (urlParams.toString() === '') return ''\n\t\t\treturn `?${urlParams.toString()}`\n\t\t}\n\t}\n\n\trender() {\n\t\treturn html` <slot> </slot> `\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-area': SchmancyArea\n\t}\n}"],"names":["routerHistory","Subject","FINDING_MORTIES","HERE_RICKY","areaSubjectsCache","WeakMap","AreaService","constructor","this","prettyURL","mode","request","ReplaySubject","current","Map","$current","enableHistoryMode","findingMortiesEvent","CustomEvent","disposed","isProcessingPopstate","next","subscribe","currentAreas","forEach","route","areaName","getOrCreateAreaSubject","initializeFromBrowserState","areaSubjects","subjects","get","set","browserState","history","state","schmancyAreas","Object","entries","error","subject","closed","currentRoute","params","props","skipCurrent","Error","observable","asObservable","pipe","distinctUntilChanged","a","b","component","JSON","stringify","shareReplay","skip","on","map","filter","catchError","err","EMPTY","key","value","zip","fromEvent","window","e","detail","bufferTime","of","tap","dispatchEvent","timeout","r","area","routeAction","_source","dispatchAreaEvent","enhancedRoute","historyStrategy","clearQueryParams","currentState","areaData","keys","length","newState","url","createCleanURL","replaceState","pushState","areas","queryString","urlParams","URLSearchParams","location","search","Array","isArray","param","delete","toString","mainArea","main","path","searchParams","String","query","cleanedAreas","cleanRoute","encodeURIComponent","pathname","parseStateFromURL","split","pop","decoded","decodeURIComponent","parsed","parse","event","bubbles","composed","name","clear","complete","dispose","getInstance","instance","has","getActiveAreas","from","addEventListener","HISTORY_STRATEGY","SchmancyArea","$LitElement","css","routes","default","x","isPresent","areaState","silent","firstUpdated","merge","switchMap","getComponentFromPathname","take","target","removed","takeUntil","disconnecting","aComponent","bComponent","normalizeComponent","c","replaceAll","toLowerCase","sameComponent","sameParams","sameState","Promise","exports","element","document","createElement","HTMLElement","updateDOM","updateInternalState","updateBrowserHistory","oldView","shadowRoot","children","oldViewExists","remove","classList","add","append","animate","opacity","duration","easing","fill","activeRoute","tagName","_updateBrowserHistory","tag","oldPathname","oldAreaState","queryParams","queryParamClear","concat","html","__decorateClass","property","prototype","customElement"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"area.component-e7ccHmOi.cjs","sources":["../src/area/area.service.ts","../src/area/router.types.ts","../src/area/area.component.ts"],"sourcesContent":["import { \n\tObservable, \n\tReplaySubject, \n\tSubject, \n\tbufferTime, \n\tfilter, \n\tfromEvent, \n\tmap, \n\tof, \n\tskip, \n\ttap, \n\ttimeout, \n\tzip,\n\tshareReplay,\n\tdistinctUntilChanged,\n\tcatchError,\n\tEMPTY\n} from 'rxjs'\nimport { SchmancyTeleportation } from '../teleport'\nimport { ActiveRoute, AreaSubscription, RouteAction } from './router.types'\n\nexport const routerHistory = new Subject<RouteAction>()\n\nexport const FINDING_MORTIES = 'FINDING_MORTIES'\nexport const HERE_RICKY = 'HERE_RICKY'\nexport type HERE_RICKY_EVENT = CustomEvent<{\n\tcomponent: SchmancyTeleportation\n}>\nexport type FINDING_MORTIES_EVENT = CustomEvent<{\n\tcomponent: SchmancyTeleportation\n}>\n\n// WeakMap for better memory management of area subjects\nconst areaSubjectsCache = new WeakMap<AreaService, Map<string, ReplaySubject<ActiveRoute>>>()\n\n// Track navigation source to prevent history conflicts\ntype NavigationSource = 'programmatic' | 'browser' | 'initial'\n\nclass AreaService implements AreaSubscription {\n\tprivate static instance: AreaService\n\tpublic prettyURL = false\n\tpublic mode: 'SILENT' | 'HISTORY' = 'HISTORY'\n\tpublic request = new ReplaySubject<RouteAction>(1)\n\tpublic current = new Map<string, ActiveRoute>()\n\tpublic $current = new ReplaySubject<Map<string, ActiveRoute>>(1)\n\t\n\t// Create a dictionary of ReplaySubjects for area-specific subscriptions\n\tprivate get areaSubjects(): Map<string, ReplaySubject<ActiveRoute>> {\n\t\tlet subjects = areaSubjectsCache.get(this)\n\t\tif (!subjects) {\n\t\t\tsubjects = new Map()\n\t\t\tareaSubjectsCache.set(this, subjects)\n\t\t}\n\t\treturn subjects\n\t}\n\t\n\tpublic enableHistoryMode = true\n\tprivate findingMortiesEvent = new CustomEvent<FINDING_MORTIES_EVENT['detail']>(FINDING_MORTIES)\n\tprivate disposed = false\n\tpublic isProcessingPopstate = false\n\n\tconstructor() {\n\t\tthis.$current.next(this.current)\n\t\t\n\t\t// Subscribe to current changes to update area-specific subjects\n\t\tthis.$current.subscribe(currentAreas => {\n\t\t\tif (this.disposed) return\n\t\t\t\n\t\t\t// For each area in the current map\n\t\t\tcurrentAreas.forEach((route, areaName) => {\n\t\t\t\t// Get or create a subject for this area\n\t\t\t\tconst areaSubject = this.getOrCreateAreaSubject(areaName)\n\t\t\t\t// Emit the updated route to area-specific subscribers\n\t\t\t\tareaSubject.next(route)\n\t\t\t})\n\t\t})\n\n\t\t// Initialize from browser state if available\n\t\tthis.initializeFromBrowserState()\n\t}\n\n\t/**\n\t * Initialize router state from browser history state\n\t */\n\tprivate initializeFromBrowserState() {\n\t\ttry {\n\t\t\tconst browserState = history.state\n\t\t\tif (browserState && browserState.schmancyAreas) {\n\t\t\t\tObject.entries(browserState.schmancyAreas).forEach(([areaName, route]) => {\n\t\t\t\t\tthis.current.set(areaName, route as ActiveRoute)\n\t\t\t\t})\n\t\t\t\tthis.$current.next(this.current)\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.warn('Failed to initialize from browser state:', error)\n\t\t}\n\t}\n\n\t/**\n\t * Get or create a ReplaySubject for a specific area with proper cleanup\n\t */\n\tprivate getOrCreateAreaSubject(areaName: string): ReplaySubject<ActiveRoute> {\n\t\tlet subject = this.areaSubjects.get(areaName)\n\t\t\n\t\tif (!subject || subject.closed) {\n\t\t\tsubject = new ReplaySubject<ActiveRoute>(1)\n\t\t\tthis.areaSubjects.set(areaName, subject)\n\t\t\t\n\t\t\t// If the area already exists in current, emit it immediately\n\t\t\tconst currentRoute = this.current.get(areaName)\n\t\t\tif (currentRoute) {\n\t\t\t\tsubject.next({\n\t\t\t\t\t...currentRoute,\n\t\t\t\t\t// Ensure state, params and props are initialized if undefined\n\t\t\t\t\tstate: currentRoute.state || {},\n\t\t\t\t\tparams: currentRoute.params || {},\n\t\t\t\t\tprops: currentRoute.props || {}\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn subject\n\t}\n\n\t/**\n\t * Subscribe to a specific area with caching\n\t */\n\ton(areaName: string, skipCurrent = false): Observable<ActiveRoute> {\n\t\tif (!areaName) {\n\t\t\tthrow new Error('Area name is required')\n\t\t}\n\t\t\n\t\tconst areaSubject = this.getOrCreateAreaSubject(areaName)\n\t\tconst observable = areaSubject.asObservable().pipe(\n\t\t\t// Add distinct to prevent duplicate emissions - now includes state\n\t\t\tdistinctUntilChanged((a, b) => \n\t\t\t\ta.component === b.component &&\n\t\t\t\tJSON.stringify(a.state) === JSON.stringify(b.state) &&\n\t\t\t\tJSON.stringify(a.params) === JSON.stringify(b.params)\n\t\t\t),\n\t\t\t// Share the subscription\n\t\t\tshareReplay(1)\n\t\t)\n\t\t\n\t\treturn skipCurrent ? observable.pipe(skip(1)) : observable\n\t}\n\t\n\t/**\n\t * Subscribe to all areas\n\t */\n\tall(skipCurrent = false): Observable<Map<string, ActiveRoute>> {\n\t\tconst observable = this.$current.asObservable().pipe(\n\t\t\tshareReplay(1)\n\t\t)\n\t\treturn skipCurrent ? observable.pipe(skip(1)) : observable\n\t}\n\t\n\t/**\n\t * Get state from an area with type safety\n\t */\n\tgetState<T = unknown>(areaName: string): Observable<T> {\n\t\tif (!areaName) {\n\t\t\tthrow new Error('Area name is required')\n\t\t}\n\t\t\n\t\treturn this.on(areaName).pipe(\n\t\t\tmap(route => route.state),\n\t\t\tfilter((state): state is NonNullable<Record<string, unknown>> => \n\t\t\t\tstate !== undefined && state !== null\n\t\t\t),\n\t\t\tdistinctUntilChanged((a, b) => JSON.stringify(a) === JSON.stringify(b)),\n\t\t\tmap(state => state as T),\n\t\t\tcatchError(err => {\n\t\t\t\tconsole.error(`Error getting state for area \"${areaName}\":`, err)\n\t\t\t\treturn EMPTY\n\t\t\t})\n\t\t)\n\t}\n\t\n\t/**\n\t * Get params from an area with type safety\n\t */\n\tparams<T extends Record<string, unknown> = Record<string, unknown>>(areaName: string): Observable<T> {\n\t\tif (!areaName) {\n\t\t\tthrow new Error('Area name is required')\n\t\t}\n\t\t\n\t\treturn this.on(areaName).pipe(\n\t\t\tmap(route => route.params),\n\t\t\tfilter((params): params is NonNullable<Record<string, unknown>> => \n\t\t\t\tparams !== undefined && params !== null\n\t\t\t),\n\t\t\tdistinctUntilChanged((a, b) => JSON.stringify(a) === JSON.stringify(b)),\n\t\t\tmap(params => params as T),\n\t\t\tcatchError(err => {\n\t\t\t\tconsole.error(`Error getting params for area \"${areaName}\":`, err)\n\t\t\t\treturn EMPTY\n\t\t\t})\n\t\t)\n\t}\n\t\n\t/**\n\t * Get a specific param from an area with null safety\n\t */\n\tparam<T = unknown>(areaName: string, key: string): Observable<T> {\n\t\tif (!areaName || !key) {\n\t\t\tthrow new Error('Area name and key are required')\n\t\t}\n\t\t\n\t\treturn this.params<Record<string, unknown>>(areaName).pipe(\n\t\t\tmap(params => params[key]),\n\t\t\tfilter((value): value is NonNullable<unknown> => value !== undefined),\n\t\t\tdistinctUntilChanged(),\n\t\t\tmap(value => value as T),\n\t\t\tcatchError(err => {\n\t\t\t\tconsole.error(`Error getting param \"${key}\" for area \"${areaName}\":`, err)\n\t\t\t\treturn EMPTY\n\t\t\t})\n\t\t)\n\t}\n\t\n\t/**\n\t * Get props from an area with type safety\n\t */\n\tprops<T extends Record<string, unknown> = Record<string, unknown>>(areaName: string): Observable<T> {\n\t\tif (!areaName) {\n\t\t\tthrow new Error('Area name is required')\n\t\t}\n\t\t\n\t\treturn this.on(areaName).pipe(\n\t\t\tmap(route => route.props),\n\t\t\tfilter((props): props is NonNullable<Record<string, unknown>> => \n\t\t\t\tprops !== undefined && props !== null\n\t\t\t),\n\t\t\tdistinctUntilChanged((a, b) => JSON.stringify(a) === JSON.stringify(b)),\n\t\t\tmap(props => props as T),\n\t\t\tcatchError(err => {\n\t\t\t\tconsole.error(`Error getting props for area \"${areaName}\":`, err)\n\t\t\t\treturn EMPTY\n\t\t\t})\n\t\t)\n\t}\n\t\n\t/**\n\t * Get a specific prop from an area with null safety\n\t */\n\tprop<T = unknown>(areaName: string, key: string): Observable<T> {\n\t\tif (!areaName || !key) {\n\t\t\tthrow new Error('Area name and key are required')\n\t\t}\n\t\t\n\t\treturn this.props<Record<string, unknown>>(areaName).pipe(\n\t\t\tmap(props => props[key]),\n\t\t\tfilter((value): value is NonNullable<unknown> => value !== undefined),\n\t\t\tdistinctUntilChanged(),\n\t\t\tmap(value => value as T),\n\t\t\tcatchError(err => {\n\t\t\t\tconsole.error(`Error getting prop \"${key}\" for area \"${areaName}\":`, err)\n\t\t\t\treturn EMPTY\n\t\t\t})\n\t\t)\n\t}\n\n\t/**\n\t * Find teleportation components\n\t */\n\tfind() {\n\t\treturn zip([\n\t\t\tfromEvent<HERE_RICKY_EVENT>(window, HERE_RICKY).pipe(\n\t\t\t\tmap(e => e.detail),\n\t\t\t\tbufferTime(0),\n\t\t\t),\n\t\t\tof(1).pipe(tap(() => window.dispatchEvent(this.findingMortiesEvent))),\n\t\t]).pipe(\n\t\t\tmap(([component]) => component),\n\t\t\ttimeout(1),\n\t\t\tcatchError(() => EMPTY)\n\t\t)\n\t}\n\n\t/**\n\t * Push a new route action with validation\n\t */\n\tpush(r: RouteAction) {\n\t\tif (!r.area) {\n\t\t\tthrow new Error('Area is required for route action')\n\t\t}\n\t\t\n\t\t// Prevent processing during popstate handling\n\t\tif (this.isProcessingPopstate) {\n\t\t\treturn\n\t\t}\n\t\t\n\t\t// Ensure state, params and props are initialized\n\t\tconst routeAction: RouteAction = {\n\t\t\t...r,\n\t\t\tstate: r.state || {},\n\t\t\tparams: r.params || {},\n\t\t\tprops: r.props || {},\n\t\t\t_source: 'programmatic' as NavigationSource\n\t\t}\n\t\t\n\t\t// Add to history if enabled\n\t\tif (this.enableHistoryMode) {\n\t\t\trouterHistory.next(routeAction)\n\t\t}\n\t\t\n\t\tthis.request.next(routeAction)\n\t\t// Emit an area-specific event for those who want to listen directly to DOM events\n\t\tthis.dispatchAreaEvent(routeAction.area, routeAction)\n\t}\n\n\t/**\n\t * Internal method to update route from browser navigation\n\t * This should only be called by area components during popstate handling\n\t */\n\t_updateFromBrowser(routeAction: RouteAction) {\n\t\tconst enhancedRoute: RouteAction = {\n\t\t\t...routeAction,\n\t\t\tstate: routeAction.state || {},\n\t\t\tparams: routeAction.params || {},\n\t\t\tprops: routeAction.props || {},\n\t\t\t_source: 'browser' as NavigationSource\n\t\t}\n\t\t\n\t\tthis.isProcessingPopstate = true\n\t\tthis.request.next(enhancedRoute)\n\t\tthis.isProcessingPopstate = false\n\t}\n\n\t/**\n\t * Update browser history state (called by area components)\n\t */\n\t_updateBrowserHistory(areaName: string, route: ActiveRoute, historyStrategy?: string, clearQueryParams?: string[] | boolean | null) {\n\t\tif (!this.enableHistoryMode) return\n\t\t\n\t\ttry {\n\t\t\t// Get current browser state or create new one\n\t\t\tconst currentState = history.state || {}\n\t\t\tconst schmancyAreas = currentState.schmancyAreas || {}\n\t\t\t\n\t\t\t// Update the specific area - only include non-empty state/params/props\n\t\t\tconst areaData: any = {\n\t\t\t\tcomponent: route.component,\n\t\t\t\tarea: route.area\n\t\t\t}\n\t\t\t\n\t\t\t// Only include state if it has content\n\t\t\tif (route.state && Object.keys(route.state).length > 0) {\n\t\t\t\tareaData.state = route.state\n\t\t\t}\n\t\t\t\n\t\t\t// Only include params if it has content\n\t\t\tif (route.params && Object.keys(route.params).length > 0) {\n\t\t\t\tareaData.params = route.params\n\t\t\t}\n\t\t\t\n\t\t\t// Only include props if it has content\n\t\t\tif (route.props && Object.keys(route.props).length > 0) {\n\t\t\t\tareaData.props = route.props\n\t\t\t}\n\t\t\t\n\t\t\tschmancyAreas[areaName] = areaData\n\t\t\t\n\t\t\tconst newState = {\n\t\t\t\t...currentState,\n\t\t\t\tschmancyAreas\n\t\t\t}\n\t\t\t\n\t\t\t// Create clean URL\n\t\t\tconst url = this.createCleanURL(schmancyAreas, clearQueryParams)\n\t\t\t\n\t\t\t// Update browser history\n\t\t\tif (historyStrategy === 'replace' || historyStrategy === 'pop') {\n\t\t\t\thistory.replaceState(newState, '', url)\n\t\t\t} else if (historyStrategy === 'push' || !historyStrategy) {\n\t\t\t\thistory.pushState(newState, '', url)\n\t\t\t}\n\t\t\t// 'silent' strategy doesn't update browser history\n\t\t\t\n\t\t} catch (error) {\n\t\t\tconsole.error('Failed to update browser history:', error)\n\t\t}\n\t}\n\n\t/**\n\t * Create a clean URL from area states\n\t */\n\tprivate createCleanURL(areas: Record<string, ActiveRoute>, clearQueryParams?: string[] | boolean | null): string {\n\t\t// Handle query parameters\n\t\tlet queryString = ''\n\t\t\n\t\tif (clearQueryParams !== true) {\n\t\t\t// Get current query params\n\t\t\tconst urlParams = new URLSearchParams(location.search)\n\t\t\t\n\t\t\t// Clear specific params if provided\n\t\t\tif (Array.isArray(clearQueryParams)) {\n\t\t\t\tclearQueryParams.forEach(param => urlParams.delete(param))\n\t\t\t}\n\t\t\t\n\t\t\t// Convert back to string\n\t\t\tqueryString = urlParams.toString()\n\t\t\tqueryString = queryString ? `?${queryString}` : ''\n\t\t}\n\t\t// If clearQueryParams === true, queryString remains empty (all params cleared)\n\t\t\n\t\tif (this.prettyURL) {\n\t\t\t// Create pretty URLs - customize this based on your routing needs\n\t\t\tconst mainArea = areas.main\n\t\t\tif (mainArea) {\n\t\t\t\tlet path = `/${mainArea.component}`\n\t\t\t\t\n\t\t\t\t// Add simple params to URL\n\t\t\t\tconst searchParams = new URLSearchParams(queryString)\n\t\t\t\tif (mainArea.params) {\n\t\t\t\t\tObject.entries(mainArea.params).forEach(([key, value]) => {\n\t\t\t\t\t\tif (typeof value === 'string' || typeof value === 'number') {\n\t\t\t\t\t\t\tsearchParams.set(key, String(value))\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tconst query = searchParams.toString()\n\t\t\t\treturn path + (query ? `?${query}` : '')\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Fallback to encoded state in URL (original behavior)\n\t\ttry {\n\t\t\t// Clean up empty objects before encoding\n\t\t\tconst cleanedAreas: Record<string, any> = {}\n\t\t\tObject.entries(areas).forEach(([areaName, route]) => {\n\t\t\t\tconst cleanRoute: any = { component: route.component }\n\t\t\t\t\n\t\t\t\t// Only include state if it has content\n\t\t\t\tif (route.state && Object.keys(route.state).length > 0) {\n\t\t\t\t\tcleanRoute.state = route.state\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// Only include params if it has content\n\t\t\t\tif (route.params && Object.keys(route.params).length > 0) {\n\t\t\t\t\tcleanRoute.params = route.params\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// Only include props if it has content\n\t\t\t\tif (route.props && Object.keys(route.props).length > 0) {\n\t\t\t\t\tcleanRoute.props = route.props\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tcleanedAreas[areaName] = cleanRoute\n\t\t\t})\n\t\t\t\n\t\t\tconst encoded = encodeURIComponent(JSON.stringify(cleanedAreas))\n\t\t\treturn `/${encoded}${queryString}`\n\t\t} catch (error) {\n\t\t\tconsole.error('Failed to encode URL state:', error)\n\t\t\treturn location.pathname\n\t\t}\n\t}\n\n\t/**\n\t * Restore state from browser history state\n\t */\n\trestoreFromBrowserState(browserState: any): Record<string, ActiveRoute> {\n\t\ttry {\n\t\t\tif (browserState && browserState.schmancyAreas) {\n\t\t\t\treturn browserState.schmancyAreas\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error('Failed to restore from browser state:', error)\n\t\t}\n\t\t\n\t\t// Fallback to URL parsing (original behavior)\n\t\treturn this.parseStateFromURL()\n\t}\n\n\t/**\n\t * Parse state from URL (fallback method)\n\t */\n\tprivate parseStateFromURL(): Record<string, ActiveRoute> {\n\t\tconst pathname = location.pathname.split('/').pop()\n\t\tif (!pathname) return {}\n\t\t\n\t\ttry {\n\t\t\tconst decoded = decodeURIComponent(pathname)\n\t\t\tconst parsed = JSON.parse(decoded)\n\t\t\t\n\t\t\tif (typeof parsed === 'object' && parsed !== null) {\n\t\t\t\treturn parsed\n\t\t\t}\n\t\t} catch {\n\t\t\t// Ignore parse errors\n\t\t}\n\t\t\n\t\treturn {}\n\t}\n\t\n\t/**\n\t * Dispatch a DOM event for a specific area change\n\t */\n\tprivate dispatchAreaEvent(areaName: string, routeAction: RouteAction) {\n\t\tconst eventName = `schmancy-area-${areaName}-changed`\n\t\tconst event = new CustomEvent(eventName, { \n\t\t\tdetail: { \n\t\t\t\tarea: areaName,\n\t\t\t\tcomponent: routeAction.component,\n\t\t\t\tstate: routeAction.state,\n\t\t\t\tparams: routeAction.params,\n\t\t\t\tprops: routeAction.props,\n\t\t\t\thistoryStrategy: routeAction.historyStrategy\n\t\t\t},\n\t\t\tbubbles: true,\n\t\t\tcomposed: true\n\t\t})\n\t\twindow.dispatchEvent(event)\n\t}\n\n\t/**\n\t * Remove an area from the current state\n\t */\n\tpop(name: string) {\n\t\tif (!name) {\n\t\t\tthrow new Error('Area name is required')\n\t\t}\n\t\t\n\t\t// Remove from current map\n\t\tthis.current.delete(name)\n\t\tthis.$current.next(this.current)\n\t\t\n\t\t// Update browser history\n\t\tif (this.enableHistoryMode) {\n\t\t\ttry {\n\t\t\t\tconst currentState = history.state || {}\n\t\t\t\tconst schmancyAreas = { ...(currentState.schmancyAreas || {}) }\n\t\t\t\tdelete schmancyAreas[name]\n\t\t\t\t\n\t\t\t\tconst newState = {\n\t\t\t\t\t...currentState,\n\t\t\t\t\tschmancyAreas\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tconst url = this.createCleanURL(schmancyAreas)\n\t\t\t\thistory.replaceState(newState, '', url)\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('Failed to update history after pop:', error)\n\t\t\t}\n\t\t}\n\t}\n\t\n\t/**\n\t * Clear all areas\n\t */\n\tclear() {\n\t\t// Complete all area subjects\n\t\tthis.areaSubjects.forEach(subject => subject.complete())\n\t\tthis.areaSubjects.clear()\n\t\t\n\t\t// Clear current state\n\t\tthis.current.clear()\n\t\tthis.$current.next(this.current)\n\t\t\n\t\t// Update URL\n\t\tif (this.enableHistoryMode) {\n\t\t\thistory.replaceState({ schmancyAreas: {} }, '', `/${location.search}`)\n\t\t}\n\t}\n\t\n\t/**\n\t * Dispose of the service and clean up resources\n\t */\n\tdispose() {\n\t\tif (this.disposed) return\n\t\t\n\t\tthis.disposed = true\n\t\t\n\t\t// Complete all subjects\n\t\tthis.areaSubjects.forEach(subject => subject.complete())\n\t\tthis.areaSubjects.clear()\n\t\t\n\t\tthis.request.complete()\n\t\tthis.$current.complete()\n\t\trouterHistory.complete()\n\t\t\n\t\t// Clear references\n\t\tthis.current.clear()\n\t\tareaSubjectsCache.delete(this)\n\t}\n\t\n\t/**\n\t * Get singleton instance\n\t */\n\tstatic getInstance() {\n\t\tif (!AreaService.instance) {\n\t\t\tAreaService.instance = new AreaService()\n\t\t}\n\t\treturn AreaService.instance\n\t}\n\n\t/**\n\t * Get current state from URL (deprecated - use browser state instead)\n\t */\n\tget state(): Record<string, unknown> {\n\t\t// Try browser state first\n\t\ttry {\n\t\t\tconst browserState = history.state\n\t\t\tif (browserState && browserState.schmancyAreas) {\n\t\t\t\treturn browserState.schmancyAreas\n\t\t\t}\n\t\t} catch {\n\t\t\t// Fallback to URL parsing\n\t\t}\n\t\t\n\t\t// Fallback to URL parsing (original behavior)\n\t\treturn this.parseStateFromURL()\n\t}\n\t\n\t/**\n\t * Check if an area exists in current state\n\t */\n\thasArea(areaName: string): boolean {\n\t\treturn this.current.has(areaName)\n\t}\n\t\n\t/**\n\t * Get all active area names\n\t */\n\tgetActiveAreas(): string[] {\n\t\treturn Array.from(this.current.keys())\n\t}\n\t\n\t/**\n\t * Get route for a specific area synchronously\n\t */\n\tgetRoute(areaName: string): ActiveRoute | undefined {\n\t\treturn this.current.get(areaName)\n\t}\n}\n\nexport const area = AreaService.getInstance()\nexport default area\n\n// Cleanup on page unload\nif (typeof window !== 'undefined') {\n\twindow.addEventListener('unload', () => {\n\t\tarea.dispose()\n\t})\n}","export type RouteAction = {\n\tcomponent: CustomElementConstructor | string | HTMLElement | Promise<any>\n\tarea: string\n\tstate?: Record<string, unknown>\n\tparams?: Record<string, unknown>\n\tprops?: Record<string, unknown> // Alias for params\n\thistoryStrategy?: THistoryStrategy\n\tclearQueryParams?: string[] | boolean | null\n\t_source?: 'programmatic' | 'browser' | 'initial' // Internal use only\n}\n\nexport type ActiveRoute = {\n\tcomponent: string\n\tarea: string\n\tstate?: Record<string, unknown>\n\tparams?: Record<string, unknown>\n\tprops?: Record<string, unknown>\n}\n\n/**\n * Interface for subscribing to area changes\n */\nexport interface AreaSubscription {\n\t/**\n\t * Subscribe to a specific area\n\t * @param areaName Name of the area to subscribe to\n\t * @param skipCurrent Whether to skip the current value\n\t * @returns Observable of the active route for the specified area\n\t */\n\ton(areaName: string, skipCurrent?: boolean): import('rxjs').Observable<ActiveRoute>\n\t\n\t/**\n\t * Subscribe to all areas\n\t * @param skipCurrent Whether to skip the current value\n\t * @returns Observable of all active routes\n\t */\n\tall(skipCurrent?: boolean): import('rxjs').Observable<Map<string, ActiveRoute>>\n\t\n\t/**\n\t * Get state from an area\n\t * @param areaName Name of the area to subscribe to\n\t * @returns Observable of the area's state\n\t */\n\tgetState<T = unknown>(areaName: string): import('rxjs').Observable<T>\n\t\n\t/**\n\t * Get params from an area\n\t * @param areaName Name of the area to subscribe to\n\t * @returns Observable of the area's params\n\t */\n\tparams<T extends Record<string, unknown> = Record<string, unknown>>(areaName: string): import('rxjs').Observable<T>\n\t\n\t/**\n\t * Get a specific param from an area\n\t * @param areaName Name of the area to subscribe to\n\t * @param key Key of the param to select\n\t * @returns Observable of the param value\n\t */\n\tparam<T = unknown>(areaName: string, key: string): import('rxjs').Observable<T>\n\t\n\t/**\n\t * Get props from an area\n\t * @param areaName Name of the area to subscribe to\n\t * @returns Observable of the area's props\n\t */\n\tprops<T extends Record<string, unknown> = Record<string, unknown>>(areaName: string): import('rxjs').Observable<T>\n\t\n\t/**\n\t * Get a specific prop from an area\n\t * @param areaName Name of the area to subscribe to\n\t * @param key Key of the prop to select\n\t * @returns Observable of the prop value\n\t */\n\tprop<T = unknown>(areaName: string, key: string): import('rxjs').Observable<T>\n}\n\nexport type THistoryStrategy = 'push' | 'replace' | 'pop' | 'silent'\n\nexport enum HISTORY_STRATEGY {\n\tpush = 'push',\n\treplace = 'replace',\n\tpop = 'pop',\n\tsilent = 'silent',\n}\n\n/**\n * Browser history state structure used by Schmancy Area\n */\nexport interface SchmancyHistoryState {\n\tschmancyAreas: Record<string, ActiveRoute>\n\t[key: string]: any // Allow other apps to store additional state\n}","import { $LitElement } from '@mixins/index'\nimport { TemplateResult, css, html } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport {\n\tEMPTY,\n\tcatchError,\n\tdistinctUntilChanged,\n\tfilter,\n\tfrom,\n\tfromEvent,\n\tmap,\n\tmerge,\n\tof,\n\tswitchMap,\n\ttake,\n\ttakeUntil,\n\ttap\n} from 'rxjs'\nimport { isPresent } from 'ts-is-present'\nimport area from './area.service'\nimport { ActiveRoute, HISTORY_STRATEGY, RouteAction } from './router.types'\n\ntype TRouteArea = {\n\tcomponent: string\n\tstate: object | undefined\n\tparams?: Record<string, unknown>\n\tprops?: Record<string, unknown>\n}\n\n\n@customElement('schmancy-area')\nexport class SchmancyArea extends $LitElement(css`\n\t:host {\n\t\tposition: relative;\n\t\tdisplay: block;\n\t\tinset: 0;\n\t}\n`) {\n\t/**\n\t * The name of the router outlet\n\t * @attr\n\t * @type {string}\n\t * @public\n\t * @required\n\t */\n\t@property() name!: string\n\n\t@property() default!: string | CustomElementConstructor | TemplateResult<1>\n\n\t/**\n\t * Get component from pathname with better error handling\n\t */\n\tgetComponentFromPathname(pathname: string, historyStrategy: HISTORY_STRATEGY) {\n\t\treturn of(pathname).pipe(\n\t\t\tmap(path => path.split('/').pop() ?? ''),\n\t\t\tmap(path => {\n\t\t\t\ttry {\n\t\t\t\t\treturn JSON.parse(decodeURIComponent(path))\n\t\t\t\t} catch {\n\t\t\t\t\treturn {}\n\t\t\t\t}\n\t\t\t}),\n\t\t\tmap(routes => routes[this.name] as TRouteArea),\n\t\t\tmap(component =>\n\t\t\t\t!component && this.default\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tcomponent: this.default,\n\t\t\t\t\t\t\tstate: undefined,\n\t\t\t\t\t\t\tparams: undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t: component,\n\t\t\t),\n\t\t\tfilter(x => isPresent(x)),\n\t\t\tmap((component: TRouteArea) => ({\n\t\t\t\tarea: this.name,\n\t\t\t\tcomponent: component.component ?? this.default,\n\t\t\t\tstate: component.state || {},\n\t\t\t\tparams: component.params || {},\n\t\t\t\thistoryStrategy\n\t\t\t} as RouteAction)),\n\t\t\tcatchError((error) => {\n\t\t\t\tconsole.error('Error parsing component from pathname:', error)\n\t\t\t\treturn this.default\n\t\t\t\t\t? of({\n\t\t\t\t\t\t\tarea: this.name,\n\t\t\t\t\t\t\tcomponent: this.default,\n\t\t\t\t\t\t\thistoryStrategy,\n\t\t\t\t\t\t\tstate: {},\n\t\t\t\t\t\t\tparams: {},\n\t\t\t\t\t\t\tprops: {}\n\t\t\t\t\t\t} as RouteAction)\n\t\t\t\t\t: EMPTY\n\t\t\t}),\n\t\t)\n\t}\n\n\t/**\n\t * Get component from browser state with fallback to URL\n\t */\n\tgetComponentFromBrowserState(event: PopStateEvent): RouteAction | null {\n\t\ttry {\n\t\t\tconst browserState = event.state\n\t\t\tif (browserState && browserState.schmancyAreas && browserState.schmancyAreas[this.name]) {\n\t\t\t\tconst areaState = browserState.schmancyAreas[this.name]\n\t\t\t\treturn {\n\t\t\t\t\tarea: this.name,\n\t\t\t\t\tcomponent: areaState.component,\n\t\t\t\t\tstate: areaState.state || {},\n\t\t\t\t\tparams: areaState.params || {},\n\t\t\t\t\thistoryStrategy: HISTORY_STRATEGY.silent,\n\t\t\t\t\t_source: 'browser'\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error('Error reading browser state:', error)\n\t\t}\n\t\t\n\t\treturn null\n\t}\n\n\tprotected firstUpdated(): void {\n\t\tif (!this.name) {\n\t\t\tthrow new Error('Area name or default component not set')\n\t\t}\n\n\t\t// Create a single merged stream for ALL events that might affect this area\n\t\tmerge(\n\t\t\t// 1. Initial load from URL\n\t\t\tof(location.pathname).pipe(\n\t\t\t\tswitchMap(pathname => this.getComponentFromPathname(pathname, HISTORY_STRATEGY.silent)),\n\t\t\t\ttake(1),\n\t\t\t\ttap(route => console.log(`[${this.name}] Initial load:`, route))\n\t\t\t),\n\n\t\t\t// 2. Direct navigation requests to this area\n\t\t\tarea.request.pipe(\n\t\t\t\tfilter(({ area }) => area === this.name),\n\t\t\t\ttap(route => console.log(`[${this.name}] Navigation request:`, route))\n\t\t\t),\n\n\t\t\t// 3. Browser navigation (back/forward)\n\t\t\tfromEvent<PopStateEvent>(window, 'popstate').pipe(\n\t\t\t\t// Parse the state to see if this area is affected\n\t\t\t\tswitchMap(event => {\n\t\t\t\t\tconsole.log(`[${this.name}] Processing popstate event:`, event)\n\t\t\t\t\tconst state = event.state?.schmancyAreas?.[this.name]\n\t\t\t\t\tconst pathname = (event.target as Window).location.pathname\n\t\t\t\t\t\n\t\t\t\t\t// If this area exists in the state, use it\n\t\t\t\t\tif (state) {\n\t\t\t\t\t\treturn of({\n\t\t\t\t\t\t\tarea: this.name,\n\t\t\t\t\t\t\tcomponent: state.component,\n\t\t\t\t\t\t\tstate: state.state || {},\n\t\t\t\t\t\t\tparams: state.params || {},\n\t\t\t\t\t\t\thistoryStrategy: HISTORY_STRATEGY.silent\n\t\t\t\t\t\t} as RouteAction)\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t// Check if it exists in the URL\n\t\t\t\t\treturn this.getComponentFromPathname(pathname, HISTORY_STRATEGY.silent).pipe(\n\t\t\t\t\t\t// If nothing found in URL and no default, emit empty component\n\t\t\t\t\t\tswitchMap(route => {\n\t\t\t\t\t\t\tif (!route.component && !this.default) {\n\t\t\t\t\t\t\t\treturn of({\n\t\t\t\t\t\t\t\t\tarea: this.name,\n\t\t\t\t\t\t\t\t\tcomponent: '', // Empty component to track state change\n\t\t\t\t\t\t\t\t\tstate: {},\n\t\t\t\t\t\t\t\t\tparams: {},\n\t\t\t\t\t\t\t\t\thistoryStrategy: HISTORY_STRATEGY.silent\n\t\t\t\t\t\t\t\t} as RouteAction)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn of(route)\n\t\t\t\t\t\t})\n\t\t\t\t\t)\n\t\t\t\t}),\n\t\t\t\ttap(route => console.log(`[${this.name}] Browser navigation:`, route))\n\t\t\t),\n\n\t\t\t// 4. Handle area.pop() - when area is removed from current map\n\t\t\tarea.$current.pipe(\n\t\t\t\tmap(currentAreas => !currentAreas.has(this.name)),\n\t\t\t\tdistinctUntilChanged(),\n\t\t\t\tfilter(removed => removed),\n\t\t\t\tmap(() => ({\n\t\t\t\t\tarea: this.name,\n\t\t\t\t\tcomponent: this.default || '', // Use default or empty component\n\t\t\t\t\tstate: {},\n\t\t\t\t\tparams: {},\n\t\t\t\t\thistoryStrategy: HISTORY_STRATEGY.silent\n\t\t\t\t} as RouteAction)),\n\t\t\t\ttap(() => console.log(`[${this.name}] Area cleared via pop()`))\n\t\t\t)\n\t\t)\n\t\t\t.pipe(\n\t\t\t\t// Allow empty string component (means clear)\n\t\t\t\tfilter(request => request.component !== null && request.component !== undefined),\n\t\t\t\ttakeUntil(this.disconnecting),\n\t\t\t\t// Prevent duplicate navigations\n\t\t\t\tdistinctUntilChanged((a, b) => {\n\t\t\t\t\t// Compare component names (normalize)\n\t\t\t\t\tlet aComponent: string = '', bComponent: string = ''\n\t\t\t\t\t\n\t\t\t\t\t// Handle function components by comparing constructor names\n\t\t\t\t\tif (typeof a.component === 'function') {\n\t\t\t\t\t\taComponent = (a.component as any).name || a.component.toString()\n\t\t\t\t\t} else if (typeof a.component === 'string') {\n\t\t\t\t\t\taComponent = a.component\n\t\t\t\t\t}\n\n\t\t\t\t\tif (typeof b.component === 'function') {\n\t\t\t\t\t\tbComponent = (b.component as any).name || b.component.toString()\n\t\t\t\t\t} else if (typeof b.component === 'string') {\n\t\t\t\t\t\tbComponent = b.component\n\t\t\t\t\t}\n\n\t\t\t\t\t// Normalize component names for comparison\n\t\t\t\t\tconst normalizeComponent = (c: string) => c?.replaceAll('-', '').toLowerCase()\n\t\t\t\t\tconst sameComponent = normalizeComponent(aComponent) === normalizeComponent(bComponent)\n\t\t\t\t\tconst sameParams = JSON.stringify(a.params || {}) === JSON.stringify(b.params || {})\n\t\t\t\t\tconst sameState = JSON.stringify(a.state || {}) === JSON.stringify(b.state || {})\n\t\t\t\t\t\n\t\t\t\t\tconst result = sameComponent && sameParams && sameState\n\t\t\t\t\t\n\t\t\t\t\tif (!result) {\n\t\t\t\t\t\tconsole.log(`[${this.name}] Route change detected:`, {\n\t\t\t\t\t\t\tsameComponent,\n\t\t\t\t\t\t\tsameParams, \n\t\t\t\t\t\t\tsameState\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\treturn result\n\t\t\t\t}),\n\t\t\t)\n\t\t\t.pipe(\n\t\t\t\t// Resolve component (handle dynamic imports, constructors, etc.)\n\t\t\t\tswitchMap(route => {\n\t\t\t\t\tconst c = route.component\n\t\t\t\t\tif (c instanceof Promise) {\n\t\t\t\t\t\t// Dynamic import module\n\t\t\t\t\t\treturn from(c).pipe(\n\t\t\t\t\t\t\tmap((x: any) => ({ \n\t\t\t\t\t\t\t\tcomponent: (x.exports?.default || x.default) as CustomElementConstructor, \n\t\t\t\t\t\t\t\troute \n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\tcatchError(error => {\n\t\t\t\t\t\t\t\tconsole.error(`[${this.name}] Failed to load dynamic component:`, error)\n\t\t\t\t\t\t\t\treturn EMPTY\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t)\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Already a string, function, or element\n\t\t\t\t\t\treturn of({ component: c, route })\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t\t// Create DOM element\n\t\t\t\tmap(({ component, route }) => {\n\t\t\t\t\tlet element: HTMLElement | null = null\n\t\t\t\t\t\n\t\t\t\t\tif (component === '') {\n\t\t\t\t\t\t// Empty component means clear the area\n\t\t\t\t\t\telement = null\n\t\t\t\t\t} else if (typeof component === 'string') {\n\t\t\t\t\t\t// Tag name\n\t\t\t\t\t\telement = document.createElement(component)\n\t\t\t\t\t} else if (component instanceof HTMLElement) {\n\t\t\t\t\t\t// Already an element instance\n\t\t\t\t\t\telement = component\n\t\t\t\t\t} else if (typeof component === 'function') {\n\t\t\t\t\t\t// Custom element constructor\n\t\t\t\t\t\telement = new component()\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// @ts-ignore - we know component exists\n\t\t\t\t\t\telement = component\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t// Set params as properties on the element\n\t\t\t\t\tif (element && route.params) {\n\t\t\t\t\t\tObject.entries(route.params).forEach(([key, value]) => {\n\t\t\t\t\t\t\t(element as any)[key] = value\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t// Set state as well if provided\n\t\t\t\t\tif (element && route.state) {\n\t\t\t\t\t\t(element as any).state = route.state\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\treturn { component: element, route }\n\t\t\t\t}),\n\t\t\t\t// Update DOM and handle side effects\n\t\t\t\ttap(({ component, route }) => {\n\t\t\t\t\t// Update DOM\n\t\t\t\t\tthis.updateDOM(component)\n\t\t\t\t\t\n\t\t\t\t\t// Update internal state first\n\t\t\t\t\tthis.updateInternalState(route, component)\n\t\t\t\t\t\n\t\t\t\t\t// Handle browser history\n\t\t\t\t\tthis.updateBrowserHistory(route, component)\n\t\t\t\t}),\n\t\t\t\t// Error handling\n\t\t\t\tcatchError(error => {\n\t\t\t\t\tconsole.error(`[${this.name}] Navigation error:`, error)\n\t\t\t\t\treturn EMPTY\n\t\t\t\t}),\n\t\t\t\ttakeUntil(this.disconnecting),\n\t\t\t)\n\t\t\t.subscribe({\n\t\t\t\terror: (error) => {\n\t\t\t\t\tconsole.error(`[${this.name}] Subscription error:`, error)\n\t\t\t\t}\n\t\t\t})\n\t}\n\n\t/**\n\t * Update the DOM with the new component\n\t */\n\tprivate updateDOM(component: HTMLElement | null) {\n\t\tconst oldView = this.shadowRoot?.children[0]\n\t\tconst oldViewExists = !!oldView\n\n\t\t// Remove the old view (if any)\n\t\toldView?.remove()\n\t\t\n\t\t// If component is null, we're clearing the area\n\t\tif (!component) {\n\t\t\treturn\n\t\t}\n\t\t\n\t\t// Add new component with animation\n\t\tcomponent.classList.add('opacity-0')\n\t\tthis.shadowRoot?.append(component)\n\t\t\n\t\t// Animate in\n\t\tcomponent.animate([{ opacity: 0 }, { opacity: 1 }], {\n\t\t\tduration: oldViewExists ? 150 : 100,\n\t\t\teasing: 'cubic-bezier(0.25, 0.8, 0.25, 1)',\n\t\t\tfill: 'forwards',\n\t\t})\n\t}\n\n\t/**\n\t * Update internal router state\n\t */\n\tprivate updateInternalState(route: RouteAction, component: HTMLElement | null) {\n\t\t// If component is null, we're clearing\n\t\tif (!component) {\n\t\t\t// Don't update state - it's already been cleared by the service\n\t\t\treturn\n\t\t}\n\t\t\n\t\tconst activeRoute: ActiveRoute = {\n\t\t\tcomponent: component.tagName.toLowerCase(),\n\t\t\tstate: route.state || {},\n\t\t\tarea: this.name,\n\t\t\tparams: route.params || {},\n\t\t}\n\n\t\tarea.current.set(this.name, activeRoute)\n\t\tarea.$current.next(area.current)\n\t}\n\n\t/**\n\t * Update browser history (only for programmatic navigation)\n\t */\n\tprivate updateBrowserHistory(route: RouteAction, component: HTMLElement | null) {\n\t\tif (!area.enableHistoryMode) return\n\t\t\n\t\t// If clearing, don't update history (already handled by service)\n\t\tif (!component) {\n\t\t\treturn\n\t\t}\n\t\t\n\t\tconst activeRoute: ActiveRoute = {\n\t\t\tcomponent: component.tagName.toLowerCase(),\n\t\t\tstate: route.state || {},\n\t\t\tarea: this.name,\n\t\t\tparams: route.params || {},\n\t\t}\n\n\t\t// Use the service method to update browser history\n\t\tarea._updateBrowserHistory(this.name, activeRoute, route.historyStrategy, route.clearQueryParams)\n\t}\n\n\n\t/**\n\t * Create URL path for the route (legacy method, now handled by service)\n\t */\n\tnewPath(tag: string, route: RouteAction) {\n\t\tconst oldPathname = location.pathname.split('/').pop()\n\t\tlet oldAreaState = {}\n\t\ttry {\n\t\t\toldAreaState = oldPathname ? JSON.parse(decodeURIComponent(oldPathname)) : {}\n\t\t} catch {\n\t\t\toldAreaState = {}\n\t\t}\n\t\troute.state = route.state ?? {}\n\t\tconst queryParams = route.clearQueryParams ? this.queryParamClear(route.clearQueryParams) : document.location.search\n\n\t\treturn encodeURIComponent(\n\t\t\tJSON.stringify({\n\t\t\t\t...oldAreaState,\n\t\t\t\t[this.name]: { component: tag.toLowerCase(), state: route.state, params: route.params },\n\t\t\t}),\n\t\t).concat(`${queryParams}`)\n\t}\n\n\t/**\n\t * Clear query parameters\n\t */\n\tqueryParamClear(params?: string[] | boolean) {\n\t\tif (!params) {\n\t\t\treturn ''\n\t\t}\n\t\t// get query params from url\n\t\tconst urlParams = new URLSearchParams(location.search)\n\t\t\n\t\tif (params === true) {\n\t\t\t// Clear all query params\n\t\t\treturn ''\n\t\t} else {\n\t\t\t// Clear specific query params\n\t\t\tparams.forEach(param => urlParams.delete(param))\n\t\t\t// update url\n\t\t\tif (urlParams.toString() === '') return ''\n\t\t\treturn `?${urlParams.toString()}`\n\t\t}\n\t}\n\n\trender() {\n\t\treturn html` <slot> </slot> `\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-area': SchmancyArea\n\t}\n}"],"names":["routerHistory","Subject","FINDING_MORTIES","HERE_RICKY","areaSubjectsCache","WeakMap","AreaService","constructor","this","prettyURL","mode","request","ReplaySubject","current","Map","$current","enableHistoryMode","findingMortiesEvent","CustomEvent","disposed","isProcessingPopstate","next","subscribe","currentAreas","forEach","route","areaName","getOrCreateAreaSubject","initializeFromBrowserState","areaSubjects","subjects","get","set","browserState","history","state","schmancyAreas","Object","entries","error","subject","closed","currentRoute","params","props","skipCurrent","Error","observable","asObservable","pipe","distinctUntilChanged","a","b","component","JSON","stringify","shareReplay","skip","on","map","filter","catchError","err","EMPTY","key","value","zip","fromEvent","window","e","detail","bufferTime","of","tap","dispatchEvent","timeout","r","area","routeAction","_source","dispatchAreaEvent","enhancedRoute","historyStrategy","clearQueryParams","currentState","areaData","keys","length","newState","url","createCleanURL","replaceState","pushState","areas","queryString","urlParams","URLSearchParams","location","search","Array","isArray","param","delete","toString","mainArea","main","path","searchParams","String","query","cleanedAreas","cleanRoute","encodeURIComponent","pathname","parseStateFromURL","split","pop","decoded","decodeURIComponent","parsed","parse","event","bubbles","composed","name","clear","complete","dispose","getInstance","instance","has","getActiveAreas","from","addEventListener","HISTORY_STRATEGY","SchmancyArea","$LitElement","css","routes","default","x","isPresent","areaState","silent","firstUpdated","merge","switchMap","getComponentFromPathname","take","target","removed","takeUntil","disconnecting","aComponent","bComponent","normalizeComponent","c","replaceAll","toLowerCase","sameComponent","sameParams","sameState","Promise","exports","element","document","createElement","HTMLElement","updateDOM","updateInternalState","updateBrowserHistory","oldView","shadowRoot","children","oldViewExists","remove","classList","add","append","animate","opacity","duration","easing","fill","activeRoute","tagName","_updateBrowserHistory","tag","oldPathname","oldAreaState","queryParams","queryParamClear","concat","html","__decorateClass","property","prototype","customElement"],"mappings":"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"}
|
package/dist/area.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { F as s, H as t, b as o, S as r, a as c, r as u } from "./area.component-
|
|
1
|
+
import { F as s, H as t, b as o, S as r, a as c, r as u } from "./area.component-Cybfl9fo.js";
|
|
2
2
|
import { l as R, h as i, c as n, f as S, j as d, a as g, b as p, d as T, e as b, k as y, g as E, i as I, n as l, s as A } from "./utils-03Coa8AW.js";
|
|
3
3
|
export {
|
|
4
4
|
s as FINDING_MORTIES,
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { BehaviorSubject as _, Subject as V, fromEvent as w, combineLatest as k, timer as x, of as S, EMPTY as A } from "rxjs";
|
|
2
2
|
import { classMap as O } from "lit/directives/class-map.js";
|
|
3
3
|
import "lit/directives/style-map.js";
|
|
4
|
-
import { $ as T } from "./litElement.mixin-
|
|
5
|
-
import "./tailwind.mixin-
|
|
4
|
+
import { $ as T } from "./litElement.mixin-BYVS1wwl.js";
|
|
5
|
+
import "./tailwind.mixin-Bpgmqass.js";
|
|
6
6
|
import { property as c, state as m, query as E, queryAssignedElements as j, customElement as L } from "lit/decorators.js";
|
|
7
7
|
import { html as g } from "lit";
|
|
8
8
|
import { createRef as M, ref as q } from "lit/directives/ref.js";
|
|
@@ -238,4 +238,4 @@ let l = class extends T(":host{display:block;border:unset!important;line-height:
|
|
|
238
238
|
}
|
|
239
239
|
};
|
|
240
240
|
a([c({ type: Boolean })], l.prototype, "required", 2), a([c({ type: String })], l.prototype, "placeholder", 2), a([c({ type: String, reflect: !0 })], l.prototype, "label", 2), a([c({ type: String })], l.prototype, "name", 2), a([c({ type: String })], l.prototype, "maxHeight", 2), a([c({ type: Boolean })], l.prototype, "multi", 2), a([c({ type: String })], l.prototype, "description", 2), a([c({ type: String, reflect: !0 })], l.prototype, "size", 2), a([c({ type: String })], l.prototype, "autocomplete", 2), a([c({ type: Number })], l.prototype, "debounceMs", 2), a([c({ type: Number })], l.prototype, "similarityThreshold", 2), a([c({ type: Array })], l.prototype, "values", 1), a([c({ type: String, reflect: !0 })], l.prototype, "value", 1), a([m()], l.prototype, "_open", 2), a([m()], l.prototype, "_inputValue", 2), a([m()], l.prototype, "_visibleOptionsCount", 2), a([m()], l.prototype, "_hasResults", 2), a([E("#options")], l.prototype, "_listbox", 2), a([E("sch-input")], l.prototype, "_input", 2), a([j({ flatten: !0 })], l.prototype, "_options", 2), l = a([L("schmancy-autocomplete")], l);
|
|
241
|
-
//# sourceMappingURL=autocomplete-
|
|
241
|
+
//# sourceMappingURL=autocomplete-CHPr_eII.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autocomplete-D-68OyCe.js","sources":["../src/autocomplete/autocomplete.ts"],"sourcesContent":["import { $LitElement } from '@mixins/index'\nimport { InputSize, SchmancyInput } from '@schmancy/input'\nimport SchmancyOption from '@schmancy/option/option'\nimport { html } from 'lit'\nimport { customElement, property, query, queryAssignedElements, state } from 'lit/decorators.js'\nimport { classMap } from 'lit/directives/class-map.js'\nimport { createRef, ref } from 'lit/directives/ref.js'\nimport {\n BehaviorSubject,\n combineLatest,\n EMPTY,\n fromEvent,\n of,\n Subject,\n timer\n} from 'rxjs'\nimport {\n debounceTime,\n distinctUntilChanged,\n filter,\n switchMap,\n take,\n takeUntil,\n tap,\n withLatestFrom\n} from 'rxjs/operators'\nimport style from './autocomplete.scss?inline'\n\n// Import the similarity function (or include it inline)\nimport { similarity } from '../utils/search'\n\nexport type SchmancyAutocompleteChangeEvent = CustomEvent<{\n value: string | string[]\n values?: string[]\n}>\n\ninterface FilteredOption {\n option: SchmancyOption\n score: number\n}\n\n@customElement('schmancy-autocomplete')\nexport default class SchmancyAutocomplete extends $LitElement(style) {\n // Public API properties\n @property({ type: Boolean }) required = false\n @property({ type: String }) placeholder = ''\n @property({ type: String, reflect: true }) label = ''\n @property({ type: String }) name = ''\n @property({ type: String }) maxHeight = '300px'\n @property({ type: Boolean }) multi = false\n @property({ type: String }) description = ''\n @property({ type: String, reflect: true }) size: InputSize = 'md'\n @property({ type: String }) autocomplete = 'on'\n @property({ type: Number }) debounceMs = 200\n @property({ type: Number }) similarityThreshold = 0.3 // Minimum similarity score to show option\n\n // Values property for multi-select mode\n @property({ type: Array })\n get values() {\n return [...this._selectedValues$.value]\n }\n set values(vals: string[]) {\n this._selectedValues$.next(Array.isArray(vals) ? [...vals] : [])\n }\n\n // Value property\n @property({ type: String, reflect: true })\n get value() {\n return this.multi \n ? this._selectedValues$.value.join(',')\n : this._selectedValue$.value\n }\n set value(val: string) {\n if (this.multi) {\n this._selectedValues$.next(\n val ? val.split(',').map(v => v.trim()).filter(Boolean) : []\n )\n } else {\n this._selectedValue$.next(val)\n }\n }\n\n // State\n @state() private _open = false\n @state() private _inputValue = ''\n @state() private _visibleOptionsCount = 0\n @state() private _hasResults = true\n\n // DOM references\n @query('#options') _listbox!: HTMLUListElement\n @query('sch-input') _input!: SchmancyInput\n @queryAssignedElements({ flatten: true }) private _options!: SchmancyOption[]\n private _inputElementRef = createRef<HTMLInputElement>()\n\n // RxJS Subjects\n private _selectedValue$ = new BehaviorSubject<string>('')\n private _selectedValues$ = new BehaviorSubject<string[]>([])\n private _inputValue$ = new BehaviorSubject<string>('')\n private _open$ = new BehaviorSubject<boolean>(false)\n private _options$ = new BehaviorSubject<SchmancyOption[]>([])\n private _optionSelect$ = new Subject<SchmancyOption>()\n private _documentClick$ = new Subject<MouseEvent>()\n\n connectedCallback() {\n super.connectedCallback()\n \n if (!this.id) {\n this.id = `sch-autocomplete-${Math.random().toString(36).slice(2, 9)}`\n }\n\n this._setupAutocompleteLogic()\n this._setupDocumentClickHandler()\n // Complex autofill detection disabled - using simple auto-select on blur instead\n // this._setupAutofillDetection()\n }\n\n private _setupAutocompleteLogic() {\n // Options management pipeline\n this._options$.pipe(\n tap(options => {\n options.forEach((option, index) => {\n option.setAttribute('role', 'option')\n option.tabIndex = -1\n if (!option.id) {\n option.id = `${this.id}-option-${index}`\n }\n if (!option.hasAttribute('data-event-bound')) {\n fromEvent(option, 'pointerdown').pipe(\n tap(e => {\n e.preventDefault() // Prevent blur from firing\n e.stopPropagation()\n }),\n takeUntil(this.disconnecting)\n ).subscribe(() => this._optionSelect$.next(option))\n option.setAttribute('data-event-bound', 'true')\n }\n })\n }),\n takeUntil(this.disconnecting)\n ).subscribe()\n\n // Selection sync pipeline\n combineLatest([\n this._selectedValue$,\n this._selectedValues$,\n this._options$\n ]).pipe(\n tap(([selectedValue, selectedValues, options]) => {\n options.forEach(option => {\n option.selected = this.multi \n ? selectedValues.includes(option.value)\n : option.value === selectedValue\n option.setAttribute('aria-selected', String(option.selected))\n })\n }),\n takeUntil(this.disconnecting)\n ).subscribe()\n\n // Enhanced fuzzy filtering pipeline\n this._inputValue$.pipe(\n distinctUntilChanged(),\n debounceTime(this.debounceMs),\n withLatestFrom(this._options$, this._open$),\n tap(([searchTerm, options, isOpen]) => {\n if (!isOpen) return\n\n const term = searchTerm.trim()\n \n if (!term) {\n // Show all options if no search term\n options.forEach(option => {\n option.hidden = false\n option.style.order = '0' // Reset order\n })\n this._visibleOptionsCount = options.length\n this._hasResults = true\n } else {\n // Calculate similarity scores for all options\n const scoredOptions: FilteredOption[] = options.map(option => {\n // Get text to search in (prioritize label, then textContent, then value)\n const optionLabel = option.label || option.textContent || ''\n const optionValue = option.value\n \n // Calculate similarity scores for both label and value\n const labelScore = similarity(term, optionLabel)\n const valueScore = similarity(term, optionValue)\n \n // Use the higher score (prioritizing label matches)\n const score = Math.max(labelScore * 1.1, valueScore) // Slight boost for label matches\n \n return { option, score }\n })\n \n // Sort by score (highest first)\n scoredOptions.sort((a, b) => b.score - a.score)\n \n // Apply visibility and ordering\n let visibleCount = 0\n scoredOptions.forEach((item, index) => {\n const { option, score } = item\n \n // Hide options below threshold\n if (score < this.similarityThreshold) {\n option.hidden = true\n } else {\n option.hidden = false\n visibleCount++\n // Use CSS order to sort visible options by relevance\n option.style.order = String(index)\n }\n })\n \n this._visibleOptionsCount = visibleCount\n this._hasResults = visibleCount > 0\n }\n \n this._announceToScreenReader(\n this._visibleOptionsCount > 0 \n ? `${this._visibleOptionsCount} option${this._visibleOptionsCount === 1 ? '' : 's'} available.`\n : 'No results found.'\n )\n }),\n takeUntil(this.disconnecting)\n ).subscribe()\n\n // Option selection pipeline\n this._optionSelect$.pipe(\n withLatestFrom(this._selectedValue$, this._selectedValues$),\n tap(([option, _, currentValues]) => {\n if (this.multi) {\n const index = currentValues.indexOf(option.value)\n const newValues = index > -1\n ? [...currentValues.slice(0, index), ...currentValues.slice(index + 1)]\n : [...currentValues, option.value]\n this._selectedValues$.next(newValues)\n \n this._inputValue$.next('')\n this._inputValue = ''\n \n const labels = this._getSelectedLabels()\n this._announceToScreenReader(\n labels.length > 0 \n ? `Selected: ${labels.join(', ')}`\n : 'No options selected'\n )\n } else {\n this._selectedValue$.next(option.value)\n this._open$.next(false)\n this._open = false\n \n this._inputValue = option.label || option.textContent || ''\n this._inputValue$.next(this._inputValue)\n \n timer(100).pipe(\n tap(() => this._inputElementRef.value?.blur()),\n take(1)\n ).subscribe()\n \n this._announceToScreenReader(`Selected: ${option.label || option.textContent}`)\n }\n }),\n tap(() => this._fireChangeEvent()),\n takeUntil(this.disconnecting)\n ).subscribe()\n\n // Display update pipeline\n combineLatest([\n this._open$,\n this._selectedValue$,\n this._selectedValues$,\n this._options$\n ]).pipe(\n filter(() => !this._open$.value),\n tap(([, selectedValue, selectedValues, options]) => {\n if (this.multi) {\n const labels = options\n .filter(opt => selectedValues.includes(opt.value))\n .map(opt => opt.label || opt.textContent || '')\n this._inputValue = labels.join(', ')\n } else {\n const option = options.find(opt => opt.value === selectedValue)\n this._inputValue = option ? option.label || option.textContent || '' : ''\n }\n this._inputValue$.next(this._inputValue)\n }),\n takeUntil(this.disconnecting)\n ).subscribe()\n\n // Open state sync\n this._open$.pipe(\n tap(open => this._open = open),\n takeUntil(this.disconnecting)\n ).subscribe()\n }\n\n private _setupDocumentClickHandler() {\n this._documentClick$.pipe(\n filter(e => !e.composedPath().includes(this)),\n filter(e => !this._options.some(opt => e.composedPath().includes(opt))),\n filter(() => this._open),\n tap(() => {\n this._open$.next(false)\n this._updateInputDisplay()\n }),\n takeUntil(this.disconnecting)\n ).subscribe()\n\n this._open$.pipe(\n distinctUntilChanged(),\n switchMap(open => \n open \n ? timer(10).pipe(\n tap(() => document.addEventListener('click', e => this._documentClick$.next(e))),\n switchMap(() => EMPTY)\n )\n : of(null).pipe(\n tap(() => document.removeEventListener('click', e => this._documentClick$.next(e)))\n )\n ),\n takeUntil(this.disconnecting)\n ).subscribe()\n }\n\n\n private _updateInputDisplay() {\n of(null).pipe(\n withLatestFrom(\n this._selectedValue$,\n this._selectedValues$,\n this._options$,\n this._open$\n ),\n tap(([, selectedValue, selectedValues, options, isOpen]) => {\n if (!this._inputElementRef.value) return\n\n if (!isOpen || !this.multi) {\n if (this.multi) {\n const labels = options\n .filter(opt => selectedValues.includes(opt.value))\n .map(opt => opt.label || opt.textContent || '')\n this._inputValue = labels.join(', ')\n } else {\n const option = options.find(opt => opt.value === selectedValue)\n this._inputValue = option ? option.label || option.textContent || '' : ''\n }\n this._inputValue$.next(this._inputValue)\n this._inputElementRef.value.value = this._inputValue\n }\n }),\n take(1)\n ).subscribe()\n }\n\n private _getSelectedLabels(): string[] {\n return this._options\n .filter(option => \n this.multi \n ? this._selectedValues$.value.includes(option.value)\n : option.value === this._selectedValue$.value\n )\n .map(option => option.label || option.textContent || '')\n }\n\n private _announceToScreenReader(message: string) {\n const liveRegion = this.shadowRoot?.querySelector('#live-status')\n if (liveRegion) {\n liveRegion.textContent = message\n }\n }\n\n private _fireChangeEvent() {\n const detail: SchmancyAutocompleteChangeEvent['detail'] = {\n value: this.value,\n }\n\n if (this.multi) {\n detail.values = [...this._selectedValues$.value]\n }\n\n this.dispatchEvent(\n new CustomEvent<SchmancyAutocompleteChangeEvent['detail']>('change', {\n detail,\n bubbles: true,\n composed: true,\n })\n )\n }\n\n public checkValidity(): boolean {\n if (!this.required) return true\n return this.multi \n ? this._selectedValues$.value.length > 0 \n : Boolean(this._selectedValue$.value)\n }\n\n public reportValidity(): boolean {\n if (this._inputElementRef.value) {\n return this._inputElementRef.value.reportValidity()\n }\n return this.checkValidity()\n }\n\n firstUpdated() {\n // Auto-selection now happens on blur, no need for autofill detection\n }\n\n render() {\n const descriptionId = `${this.id}-desc`\n\n return html`\n <div class=\"relative\">\n <!-- Screen reader live region -->\n <div id=\"live-status\" role=\"status\" aria-live=\"polite\" class=\"sr-only\"></div>\n\n <!-- Description -->\n ${this.description ? html`<div id=\"${descriptionId}\" class=\"sr-only\">${this.description}</div>` : ''}\n\n <!-- Input -->\n <slot name=\"trigger\">\n <schmancy-input\n .size=${this.size}\n ${ref(this._inputElementRef)}\n id=\"autocomplete-input\"\n class=\"w-full\"\n .name=${this.name || this.label?.toLowerCase().replace(/\\s+/g, '-')}\n .label=${this.label}\n .placeholder=${this.placeholder}\n .required=${this.required}\n .value=${this._inputValue}\n type=\"text\"\n autocomplete=${this.autocomplete}\n clickable\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-haspopup=\"listbox\"\n aria-controls=\"options\"\n aria-expanded=${this._open}\n aria-describedby=${this.description ? descriptionId : undefined}\n @input=${(e: Event) => {\n const value = (e.target as HTMLInputElement).value\n this._inputValue = value\n this._inputValue$.next(value)\n }}\n @focus=${(e: FocusEvent) => {\n e.stopPropagation()\n \n const hasSelection = this.multi \n ? this._selectedValues$.value.length > 0\n : !!this._selectedValue$.value\n \n if (this.multi && !hasSelection) {\n this._inputValue = ''\n this._inputValue$.next('')\n if (this._inputElementRef.value) {\n this._inputElementRef.value.value = ''\n }\n }\n \n this._open$.next(true)\n }}\n @click=${(e: MouseEvent) => {\n e.stopPropagation()\n this._open$.next(true)\n }}\n @keydown=${(e: KeyboardEvent) => {\n this._handleKeyDown(e)\n }}\n @blur=${() => {\n this._handleAutoSelectOnBlur()\n }}\n >\n </schmancy-input>\n </slot>\n\n <!-- Options dropdown -->\n <ul\n id=\"options\"\n class=${classMap({\n 'absolute': true,\n 'z-[1000]': true,\n 'mt-1': true,\n 'w-full': true,\n 'rounded-md': true,\n 'shadow-md': true,\n 'overflow-auto': true,\n 'min-w-full': true,\n 'bg-surface-low': true,\n 'flex': true,\n 'flex-col': true, // Enable flexbox for ordering\n })}\n role=\"listbox\"\n aria-multiselectable=${this.multi ? 'true' : 'false'}\n aria-label=${`${this.label || 'Options'} dropdown`}\n ?hidden=${!this._open}\n style=\"max-height: ${this.maxHeight}; display: ${this._open ? 'flex' : 'none'};\"\n @slotchange=${() => {\n this._options$.next(this._options)\n }}\n >\n <slot></slot>\n ${!this._hasResults ? html`\n <li class=\"px-3 py-2 text-sm text-muted\">No results found</li>\n ` : ''}\n </ul>\n </div>\n `\n }\n\n private _handleAutoSelectOnBlur() {\n // Only auto-select in single-select mode and when dropdown is open with a search term\n if (this.multi || !this._open || !this._inputValue.trim()) {\n return\n }\n \n const searchTerm = this._inputValue.trim()\n \n // Find the best matching option using the same similarity logic as filtering\n let bestMatch: SchmancyOption | null = null\n let bestScore = 0\n \n this._options.forEach(option => {\n // Skip hidden options\n if (option.hidden) return\n \n // Get text to search in (prioritize label, then textContent, then value)\n const optionLabel = option.label || option.textContent || ''\n const optionValue = option.value\n \n // Calculate similarity scores for both label and value\n const labelScore = similarity(searchTerm, optionLabel)\n const valueScore = similarity(searchTerm, optionValue)\n \n // Use the higher score (prioritizing label matches)\n const score = Math.max(labelScore * 1.1, valueScore) // Slight boost for label matches\n \n // Keep track of best match that meets threshold\n if (score > bestScore && score >= this.similarityThreshold) {\n bestScore = score\n bestMatch = option\n }\n })\n \n // Auto-select the best match if found\n if (bestMatch) {\n // Select the option using the existing pipeline\n this._optionSelect$.next(bestMatch)\n \n // Close the dropdown\n this._open$.next(false)\n this._open = false\n \n console.log('Auto-selected on blur:', bestMatch.value, 'with score:', bestScore)\n }\n }\n\n private _handleKeyDown(_e: KeyboardEvent) {\n fromEvent<KeyboardEvent>(document, 'keydown').pipe(\n take(1),\n withLatestFrom(this._open$, this._options$),\n tap(([event, isOpen, options]) => {\n if (!isOpen && (event.key === 'ArrowDown' || event.key === 'Enter')) {\n event.preventDefault()\n this._open$.next(true)\n \n timer(10).pipe(\n tap(() => {\n const firstVisible = options.find(opt => !opt.hidden)\n firstVisible?.focus()\n }),\n take(1)\n ).subscribe()\n return\n }\n\n if (!isOpen) return\n\n const visibleOptions = options.filter(opt => !opt.hidden)\n .sort((a, b) => parseInt(a.style.order || '0') - parseInt(b.style.order || '0'))\n \n const focusedOption = visibleOptions.find(opt => opt === document.activeElement)\n const currentIndex = focusedOption ? visibleOptions.indexOf(focusedOption) : -1\n\n switch (event.key) {\n case 'Escape':\n event.preventDefault()\n this._open$.next(false)\n this._updateInputDisplay()\n this._inputElementRef.value?.focus()\n break\n\n case 'Tab':\n this._open$.next(false)\n this._updateInputDisplay()\n break\n\n case 'ArrowDown':\n event.preventDefault()\n const nextIndex = currentIndex < visibleOptions.length - 1 ? currentIndex + 1 : 0\n visibleOptions[nextIndex]?.focus()\n break\n\n case 'ArrowUp':\n event.preventDefault()\n const prevIndex = currentIndex > 0 ? currentIndex - 1 : visibleOptions.length - 1\n visibleOptions[prevIndex]?.focus()\n break\n\n case 'Home':\n event.preventDefault()\n visibleOptions[0]?.focus()\n break\n\n case 'End':\n event.preventDefault()\n visibleOptions[visibleOptions.length - 1]?.focus()\n break\n\n case 'Enter':\n case ' ':\n if (focusedOption) {\n event.preventDefault()\n this._optionSelect$.next(focusedOption)\n }\n break\n }\n })\n ).subscribe()\n }\n}\n\n\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'schmancy-autocomplete': SchmancyAutocomplete\n }\n}"],"names":["SchmancyAutocomplete","$LitElement","constructor","super","arguments","this","required","placeholder","label","name","maxHeight","multi","description","size","autocomplete","debounceMs","similarityThreshold","_open","_inputValue","_visibleOptionsCount","_hasResults","_inputElementRef","createRef","_selectedValue$","BehaviorSubject","_selectedValues$","_inputValue$","_open$","_options$","_optionSelect$","Subject","_documentClick$","values","value","vals","next","Array","isArray","join","val","split","map","v","trim","filter","Boolean","connectedCallback","id","Math","random","toString","slice","_setupAutocompleteLogic","_setupDocumentClickHandler","pipe","tap","options","forEach","option","index","setAttribute","tabIndex","hasAttribute","fromEvent","e","preventDefault","stopPropagation","takeUntil","disconnecting","subscribe","combineLatest","selectedValue","selectedValues","selected","includes","String","distinctUntilChanged","debounceTime","withLatestFrom","searchTerm","isOpen","term","scoredOptions","optionLabel","textContent","optionValue","labelScore","similarity","valueScore","score","max","sort","a","b","visibleCount","item","hidden","style","order","length","_announceToScreenReader","_","currentValues","indexOf","newValues","labels","_getSelectedLabels","timer","blur","take","_fireChangeEvent","opt","find","open","composedPath","_options","some","_updateInputDisplay","switchMap","document","addEventListener","EMPTY","of","removeEventListener","message","liveRegion","shadowRoot","querySelector","detail","dispatchEvent","CustomEvent","bubbles","composed","checkValidity","reportValidity","firstUpdated","render","descriptionId","html","ref","toLowerCase","replace","target","hasSelection","_handleKeyDown","_handleAutoSelectOnBlur","classMap","absolute","flex","bestMatch","bestScore","_e","event","key","firstVisible","focus","visibleOptions","parseInt","focusedOption","activeElement","currentIndex","nextIndex","prevIndex","__decorateClass","property","type","prototype","reflect","Number","state","query","queryAssignedElements","flatten","customElement"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"autocomplete-CHPr_eII.js","sources":["../src/autocomplete/autocomplete.ts"],"sourcesContent":["import { $LitElement } from '@mixins/index'\nimport { InputSize, SchmancyInput } from '@schmancy/input'\nimport SchmancyOption from '@schmancy/option/option'\nimport { html } from 'lit'\nimport { customElement, property, query, queryAssignedElements, state } from 'lit/decorators.js'\nimport { classMap } from 'lit/directives/class-map.js'\nimport { createRef, ref } from 'lit/directives/ref.js'\nimport {\n BehaviorSubject,\n combineLatest,\n EMPTY,\n fromEvent,\n of,\n Subject,\n timer\n} from 'rxjs'\nimport {\n debounceTime,\n distinctUntilChanged,\n filter,\n switchMap,\n take,\n takeUntil,\n tap,\n withLatestFrom\n} from 'rxjs/operators'\nimport style from './autocomplete.scss?inline'\n\n// Import the similarity function (or include it inline)\nimport { similarity } from '../utils/search'\n\nexport type SchmancyAutocompleteChangeEvent = CustomEvent<{\n value: string | string[]\n values?: string[]\n}>\n\ninterface FilteredOption {\n option: SchmancyOption\n score: number\n}\n\n@customElement('schmancy-autocomplete')\nexport default class SchmancyAutocomplete extends $LitElement(style) {\n // Public API properties\n @property({ type: Boolean }) required = false\n @property({ type: String }) placeholder = ''\n @property({ type: String, reflect: true }) label = ''\n @property({ type: String }) name = ''\n @property({ type: String }) maxHeight = '300px'\n @property({ type: Boolean }) multi = false\n @property({ type: String }) description = ''\n @property({ type: String, reflect: true }) size: InputSize = 'md'\n @property({ type: String }) autocomplete = 'on'\n @property({ type: Number }) debounceMs = 200\n @property({ type: Number }) similarityThreshold = 0.3 // Minimum similarity score to show option\n\n // Values property for multi-select mode\n @property({ type: Array })\n get values() {\n return [...this._selectedValues$.value]\n }\n set values(vals: string[]) {\n this._selectedValues$.next(Array.isArray(vals) ? [...vals] : [])\n }\n\n // Value property\n @property({ type: String, reflect: true })\n get value() {\n return this.multi \n ? this._selectedValues$.value.join(',')\n : this._selectedValue$.value\n }\n set value(val: string) {\n if (this.multi) {\n this._selectedValues$.next(\n val ? val.split(',').map(v => v.trim()).filter(Boolean) : []\n )\n } else {\n this._selectedValue$.next(val)\n }\n }\n\n // State\n @state() private _open = false\n @state() private _inputValue = ''\n @state() private _visibleOptionsCount = 0\n @state() private _hasResults = true\n\n // DOM references\n @query('#options') _listbox!: HTMLUListElement\n @query('sch-input') _input!: SchmancyInput\n @queryAssignedElements({ flatten: true }) private _options!: SchmancyOption[]\n private _inputElementRef = createRef<HTMLInputElement>()\n\n // RxJS Subjects\n private _selectedValue$ = new BehaviorSubject<string>('')\n private _selectedValues$ = new BehaviorSubject<string[]>([])\n private _inputValue$ = new BehaviorSubject<string>('')\n private _open$ = new BehaviorSubject<boolean>(false)\n private _options$ = new BehaviorSubject<SchmancyOption[]>([])\n private _optionSelect$ = new Subject<SchmancyOption>()\n private _documentClick$ = new Subject<MouseEvent>()\n\n connectedCallback() {\n super.connectedCallback()\n \n if (!this.id) {\n this.id = `sch-autocomplete-${Math.random().toString(36).slice(2, 9)}`\n }\n\n this._setupAutocompleteLogic()\n this._setupDocumentClickHandler()\n // Complex autofill detection disabled - using simple auto-select on blur instead\n // this._setupAutofillDetection()\n }\n\n private _setupAutocompleteLogic() {\n // Options management pipeline\n this._options$.pipe(\n tap(options => {\n options.forEach((option, index) => {\n option.setAttribute('role', 'option')\n option.tabIndex = -1\n if (!option.id) {\n option.id = `${this.id}-option-${index}`\n }\n if (!option.hasAttribute('data-event-bound')) {\n fromEvent(option, 'pointerdown').pipe(\n tap(e => {\n e.preventDefault() // Prevent blur from firing\n e.stopPropagation()\n }),\n takeUntil(this.disconnecting)\n ).subscribe(() => this._optionSelect$.next(option))\n option.setAttribute('data-event-bound', 'true')\n }\n })\n }),\n takeUntil(this.disconnecting)\n ).subscribe()\n\n // Selection sync pipeline\n combineLatest([\n this._selectedValue$,\n this._selectedValues$,\n this._options$\n ]).pipe(\n tap(([selectedValue, selectedValues, options]) => {\n options.forEach(option => {\n option.selected = this.multi \n ? selectedValues.includes(option.value)\n : option.value === selectedValue\n option.setAttribute('aria-selected', String(option.selected))\n })\n }),\n takeUntil(this.disconnecting)\n ).subscribe()\n\n // Enhanced fuzzy filtering pipeline\n this._inputValue$.pipe(\n distinctUntilChanged(),\n debounceTime(this.debounceMs),\n withLatestFrom(this._options$, this._open$),\n tap(([searchTerm, options, isOpen]) => {\n if (!isOpen) return\n\n const term = searchTerm.trim()\n \n if (!term) {\n // Show all options if no search term\n options.forEach(option => {\n option.hidden = false\n option.style.order = '0' // Reset order\n })\n this._visibleOptionsCount = options.length\n this._hasResults = true\n } else {\n // Calculate similarity scores for all options\n const scoredOptions: FilteredOption[] = options.map(option => {\n // Get text to search in (prioritize label, then textContent, then value)\n const optionLabel = option.label || option.textContent || ''\n const optionValue = option.value\n \n // Calculate similarity scores for both label and value\n const labelScore = similarity(term, optionLabel)\n const valueScore = similarity(term, optionValue)\n \n // Use the higher score (prioritizing label matches)\n const score = Math.max(labelScore * 1.1, valueScore) // Slight boost for label matches\n \n return { option, score }\n })\n \n // Sort by score (highest first)\n scoredOptions.sort((a, b) => b.score - a.score)\n \n // Apply visibility and ordering\n let visibleCount = 0\n scoredOptions.forEach((item, index) => {\n const { option, score } = item\n \n // Hide options below threshold\n if (score < this.similarityThreshold) {\n option.hidden = true\n } else {\n option.hidden = false\n visibleCount++\n // Use CSS order to sort visible options by relevance\n option.style.order = String(index)\n }\n })\n \n this._visibleOptionsCount = visibleCount\n this._hasResults = visibleCount > 0\n }\n \n this._announceToScreenReader(\n this._visibleOptionsCount > 0 \n ? `${this._visibleOptionsCount} option${this._visibleOptionsCount === 1 ? '' : 's'} available.`\n : 'No results found.'\n )\n }),\n takeUntil(this.disconnecting)\n ).subscribe()\n\n // Option selection pipeline\n this._optionSelect$.pipe(\n withLatestFrom(this._selectedValue$, this._selectedValues$),\n tap(([option, _, currentValues]) => {\n if (this.multi) {\n const index = currentValues.indexOf(option.value)\n const newValues = index > -1\n ? [...currentValues.slice(0, index), ...currentValues.slice(index + 1)]\n : [...currentValues, option.value]\n this._selectedValues$.next(newValues)\n \n this._inputValue$.next('')\n this._inputValue = ''\n \n const labels = this._getSelectedLabels()\n this._announceToScreenReader(\n labels.length > 0 \n ? `Selected: ${labels.join(', ')}`\n : 'No options selected'\n )\n } else {\n this._selectedValue$.next(option.value)\n this._open$.next(false)\n this._open = false\n \n this._inputValue = option.label || option.textContent || ''\n this._inputValue$.next(this._inputValue)\n \n timer(100).pipe(\n tap(() => this._inputElementRef.value?.blur()),\n take(1)\n ).subscribe()\n \n this._announceToScreenReader(`Selected: ${option.label || option.textContent}`)\n }\n }),\n tap(() => this._fireChangeEvent()),\n takeUntil(this.disconnecting)\n ).subscribe()\n\n // Display update pipeline\n combineLatest([\n this._open$,\n this._selectedValue$,\n this._selectedValues$,\n this._options$\n ]).pipe(\n filter(() => !this._open$.value),\n tap(([, selectedValue, selectedValues, options]) => {\n if (this.multi) {\n const labels = options\n .filter(opt => selectedValues.includes(opt.value))\n .map(opt => opt.label || opt.textContent || '')\n this._inputValue = labels.join(', ')\n } else {\n const option = options.find(opt => opt.value === selectedValue)\n this._inputValue = option ? option.label || option.textContent || '' : ''\n }\n this._inputValue$.next(this._inputValue)\n }),\n takeUntil(this.disconnecting)\n ).subscribe()\n\n // Open state sync\n this._open$.pipe(\n tap(open => this._open = open),\n takeUntil(this.disconnecting)\n ).subscribe()\n }\n\n private _setupDocumentClickHandler() {\n this._documentClick$.pipe(\n filter(e => !e.composedPath().includes(this)),\n filter(e => !this._options.some(opt => e.composedPath().includes(opt))),\n filter(() => this._open),\n tap(() => {\n this._open$.next(false)\n this._updateInputDisplay()\n }),\n takeUntil(this.disconnecting)\n ).subscribe()\n\n this._open$.pipe(\n distinctUntilChanged(),\n switchMap(open => \n open \n ? timer(10).pipe(\n tap(() => document.addEventListener('click', e => this._documentClick$.next(e))),\n switchMap(() => EMPTY)\n )\n : of(null).pipe(\n tap(() => document.removeEventListener('click', e => this._documentClick$.next(e)))\n )\n ),\n takeUntil(this.disconnecting)\n ).subscribe()\n }\n\n\n private _updateInputDisplay() {\n of(null).pipe(\n withLatestFrom(\n this._selectedValue$,\n this._selectedValues$,\n this._options$,\n this._open$\n ),\n tap(([, selectedValue, selectedValues, options, isOpen]) => {\n if (!this._inputElementRef.value) return\n\n if (!isOpen || !this.multi) {\n if (this.multi) {\n const labels = options\n .filter(opt => selectedValues.includes(opt.value))\n .map(opt => opt.label || opt.textContent || '')\n this._inputValue = labels.join(', ')\n } else {\n const option = options.find(opt => opt.value === selectedValue)\n this._inputValue = option ? option.label || option.textContent || '' : ''\n }\n this._inputValue$.next(this._inputValue)\n this._inputElementRef.value.value = this._inputValue\n }\n }),\n take(1)\n ).subscribe()\n }\n\n private _getSelectedLabels(): string[] {\n return this._options\n .filter(option => \n this.multi \n ? this._selectedValues$.value.includes(option.value)\n : option.value === this._selectedValue$.value\n )\n .map(option => option.label || option.textContent || '')\n }\n\n private _announceToScreenReader(message: string) {\n const liveRegion = this.shadowRoot?.querySelector('#live-status')\n if (liveRegion) {\n liveRegion.textContent = message\n }\n }\n\n private _fireChangeEvent() {\n const detail: SchmancyAutocompleteChangeEvent['detail'] = {\n value: this.value,\n }\n\n if (this.multi) {\n detail.values = [...this._selectedValues$.value]\n }\n\n this.dispatchEvent(\n new CustomEvent<SchmancyAutocompleteChangeEvent['detail']>('change', {\n detail,\n bubbles: true,\n composed: true,\n })\n )\n }\n\n public checkValidity(): boolean {\n if (!this.required) return true\n return this.multi \n ? this._selectedValues$.value.length > 0 \n : Boolean(this._selectedValue$.value)\n }\n\n public reportValidity(): boolean {\n if (this._inputElementRef.value) {\n return this._inputElementRef.value.reportValidity()\n }\n return this.checkValidity()\n }\n\n firstUpdated() {\n // Auto-selection now happens on blur, no need for autofill detection\n }\n\n render() {\n const descriptionId = `${this.id}-desc`\n\n return html`\n <div class=\"relative\">\n <!-- Screen reader live region -->\n <div id=\"live-status\" role=\"status\" aria-live=\"polite\" class=\"sr-only\"></div>\n\n <!-- Description -->\n ${this.description ? html`<div id=\"${descriptionId}\" class=\"sr-only\">${this.description}</div>` : ''}\n\n <!-- Input -->\n <slot name=\"trigger\">\n <schmancy-input\n .size=${this.size}\n ${ref(this._inputElementRef)}\n id=\"autocomplete-input\"\n class=\"w-full\"\n .name=${this.name || this.label?.toLowerCase().replace(/\\s+/g, '-')}\n .label=${this.label}\n .placeholder=${this.placeholder}\n .required=${this.required}\n .value=${this._inputValue}\n type=\"text\"\n autocomplete=${this.autocomplete}\n clickable\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-haspopup=\"listbox\"\n aria-controls=\"options\"\n aria-expanded=${this._open}\n aria-describedby=${this.description ? descriptionId : undefined}\n @input=${(e: Event) => {\n const value = (e.target as HTMLInputElement).value\n this._inputValue = value\n this._inputValue$.next(value)\n }}\n @focus=${(e: FocusEvent) => {\n e.stopPropagation()\n \n const hasSelection = this.multi \n ? this._selectedValues$.value.length > 0\n : !!this._selectedValue$.value\n \n if (this.multi && !hasSelection) {\n this._inputValue = ''\n this._inputValue$.next('')\n if (this._inputElementRef.value) {\n this._inputElementRef.value.value = ''\n }\n }\n \n this._open$.next(true)\n }}\n @click=${(e: MouseEvent) => {\n e.stopPropagation()\n this._open$.next(true)\n }}\n @keydown=${(e: KeyboardEvent) => {\n this._handleKeyDown(e)\n }}\n @blur=${() => {\n this._handleAutoSelectOnBlur()\n }}\n >\n </schmancy-input>\n </slot>\n\n <!-- Options dropdown -->\n <ul\n id=\"options\"\n class=${classMap({\n 'absolute': true,\n 'z-[1000]': true,\n 'mt-1': true,\n 'w-full': true,\n 'rounded-md': true,\n 'shadow-md': true,\n 'overflow-auto': true,\n 'min-w-full': true,\n 'bg-surface-low': true,\n 'flex': true,\n 'flex-col': true, // Enable flexbox for ordering\n })}\n role=\"listbox\"\n aria-multiselectable=${this.multi ? 'true' : 'false'}\n aria-label=${`${this.label || 'Options'} dropdown`}\n ?hidden=${!this._open}\n style=\"max-height: ${this.maxHeight}; display: ${this._open ? 'flex' : 'none'};\"\n @slotchange=${() => {\n this._options$.next(this._options)\n }}\n >\n <slot></slot>\n ${!this._hasResults ? html`\n <li class=\"px-3 py-2 text-sm text-muted\">No results found</li>\n ` : ''}\n </ul>\n </div>\n `\n }\n\n private _handleAutoSelectOnBlur() {\n // Only auto-select in single-select mode and when dropdown is open with a search term\n if (this.multi || !this._open || !this._inputValue.trim()) {\n return\n }\n \n const searchTerm = this._inputValue.trim()\n \n // Find the best matching option using the same similarity logic as filtering\n let bestMatch: SchmancyOption | null = null\n let bestScore = 0\n \n this._options.forEach(option => {\n // Skip hidden options\n if (option.hidden) return\n \n // Get text to search in (prioritize label, then textContent, then value)\n const optionLabel = option.label || option.textContent || ''\n const optionValue = option.value\n \n // Calculate similarity scores for both label and value\n const labelScore = similarity(searchTerm, optionLabel)\n const valueScore = similarity(searchTerm, optionValue)\n \n // Use the higher score (prioritizing label matches)\n const score = Math.max(labelScore * 1.1, valueScore) // Slight boost for label matches\n \n // Keep track of best match that meets threshold\n if (score > bestScore && score >= this.similarityThreshold) {\n bestScore = score\n bestMatch = option\n }\n })\n \n // Auto-select the best match if found\n if (bestMatch) {\n // Select the option using the existing pipeline\n this._optionSelect$.next(bestMatch)\n \n // Close the dropdown\n this._open$.next(false)\n this._open = false\n \n console.log('Auto-selected on blur:', bestMatch.value, 'with score:', bestScore)\n }\n }\n\n private _handleKeyDown(_e: KeyboardEvent) {\n fromEvent<KeyboardEvent>(document, 'keydown').pipe(\n take(1),\n withLatestFrom(this._open$, this._options$),\n tap(([event, isOpen, options]) => {\n if (!isOpen && (event.key === 'ArrowDown' || event.key === 'Enter')) {\n event.preventDefault()\n this._open$.next(true)\n \n timer(10).pipe(\n tap(() => {\n const firstVisible = options.find(opt => !opt.hidden)\n firstVisible?.focus()\n }),\n take(1)\n ).subscribe()\n return\n }\n\n if (!isOpen) return\n\n const visibleOptions = options.filter(opt => !opt.hidden)\n .sort((a, b) => parseInt(a.style.order || '0') - parseInt(b.style.order || '0'))\n \n const focusedOption = visibleOptions.find(opt => opt === document.activeElement)\n const currentIndex = focusedOption ? visibleOptions.indexOf(focusedOption) : -1\n\n switch (event.key) {\n case 'Escape':\n event.preventDefault()\n this._open$.next(false)\n this._updateInputDisplay()\n this._inputElementRef.value?.focus()\n break\n\n case 'Tab':\n this._open$.next(false)\n this._updateInputDisplay()\n break\n\n case 'ArrowDown':\n event.preventDefault()\n const nextIndex = currentIndex < visibleOptions.length - 1 ? currentIndex + 1 : 0\n visibleOptions[nextIndex]?.focus()\n break\n\n case 'ArrowUp':\n event.preventDefault()\n const prevIndex = currentIndex > 0 ? currentIndex - 1 : visibleOptions.length - 1\n visibleOptions[prevIndex]?.focus()\n break\n\n case 'Home':\n event.preventDefault()\n visibleOptions[0]?.focus()\n break\n\n case 'End':\n event.preventDefault()\n visibleOptions[visibleOptions.length - 1]?.focus()\n break\n\n case 'Enter':\n case ' ':\n if (focusedOption) {\n event.preventDefault()\n this._optionSelect$.next(focusedOption)\n }\n break\n }\n })\n ).subscribe()\n }\n}\n\n\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'schmancy-autocomplete': SchmancyAutocomplete\n }\n}"],"names":["SchmancyAutocomplete","$LitElement","constructor","super","arguments","this","required","placeholder","label","name","maxHeight","multi","description","size","autocomplete","debounceMs","similarityThreshold","_open","_inputValue","_visibleOptionsCount","_hasResults","_inputElementRef","createRef","_selectedValue$","BehaviorSubject","_selectedValues$","_inputValue$","_open$","_options$","_optionSelect$","Subject","_documentClick$","values","value","vals","next","Array","isArray","join","val","split","map","v","trim","filter","Boolean","connectedCallback","id","Math","random","toString","slice","_setupAutocompleteLogic","_setupDocumentClickHandler","pipe","tap","options","forEach","option","index","setAttribute","tabIndex","hasAttribute","fromEvent","e","preventDefault","stopPropagation","takeUntil","disconnecting","subscribe","combineLatest","selectedValue","selectedValues","selected","includes","String","distinctUntilChanged","debounceTime","withLatestFrom","searchTerm","isOpen","term","scoredOptions","optionLabel","textContent","optionValue","labelScore","similarity","valueScore","score","max","sort","a","b","visibleCount","item","hidden","style","order","length","_announceToScreenReader","_","currentValues","indexOf","newValues","labels","_getSelectedLabels","timer","blur","take","_fireChangeEvent","opt","find","open","composedPath","_options","some","_updateInputDisplay","switchMap","document","addEventListener","EMPTY","of","removeEventListener","message","liveRegion","shadowRoot","querySelector","detail","dispatchEvent","CustomEvent","bubbles","composed","checkValidity","reportValidity","firstUpdated","render","descriptionId","html","ref","toLowerCase","replace","target","hasSelection","_handleKeyDown","_handleAutoSelectOnBlur","classMap","absolute","flex","bestMatch","bestScore","_e","event","key","firstVisible","focus","visibleOptions","parseInt","focusedOption","activeElement","currentIndex","nextIndex","prevIndex","__decorateClass","property","type","prototype","reflect","Number","state","query","queryAssignedElements","flatten","customElement"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";const h=require("rxjs"),y=require("lit/directives/class-map.js");require("lit/directives/style-map.js");const f=require("./litElement.mixin-
|
|
1
|
+
"use strict";const h=require("rxjs"),y=require("lit/directives/class-map.js");require("lit/directives/style-map.js");const f=require("./litElement.mixin-CbFQ2uxn.cjs");require("./tailwind.mixin-BU9fMdfc.cjs");const u=require("lit/decorators.js"),b=require("lit"),$=require("lit/directives/ref.js"),i=require("rxjs/operators"),_=require("./search-DWW8IoOp.cjs");var x=Object.defineProperty,g=Object.getOwnPropertyDescriptor,r=(e,t,o,s)=>{for(var n,l=s>1?void 0:s?g(t,o):t,p=e.length-1;p>=0;p--)(n=e[p])&&(l=(s?n(t,o,l):n(l))||l);return s&&l&&x(t,o,l),l};let a=class extends f.$LitElement(":host{display:block;border:unset!important;line-height:unset!important;background:unset!important;padding:unset!important;font-size:unset!important;box-shadow:unset!important}:host:focus{box-shadow:unset!important}@keyframes onAutoFillStart{}sch-input::part(input):-webkit-autofill,sch-input input:-webkit-autofill{animation-name:onAutoFillStart;animation-duration:1ms}"){constructor(){super(...arguments),this.required=!1,this.placeholder="",this.label="",this.name="",this.maxHeight="300px",this.multi=!1,this.description="",this.size="md",this.autocomplete="on",this.debounceMs=200,this.similarityThreshold=.3,this._open=!1,this._inputValue="",this._visibleOptionsCount=0,this._hasResults=!0,this._inputElementRef=$.createRef(),this._selectedValue$=new h.BehaviorSubject(""),this._selectedValues$=new h.BehaviorSubject([]),this._inputValue$=new h.BehaviorSubject(""),this._open$=new h.BehaviorSubject(!1),this._options$=new h.BehaviorSubject([]),this._optionSelect$=new h.Subject,this._documentClick$=new h.Subject}get values(){return[...this._selectedValues$.value]}set values(e){this._selectedValues$.next(Array.isArray(e)?[...e]:[])}get value(){return this.multi?this._selectedValues$.value.join(","):this._selectedValue$.value}set value(e){this.multi?this._selectedValues$.next(e?e.split(",").map(t=>t.trim()).filter(Boolean):[]):this._selectedValue$.next(e)}connectedCallback(){super.connectedCallback(),this.id||(this.id=`sch-autocomplete-${Math.random().toString(36).slice(2,9)}`),this._setupAutocompleteLogic(),this._setupDocumentClickHandler()}_setupAutocompleteLogic(){this._options$.pipe(i.tap(e=>{e.forEach((t,o)=>{t.setAttribute("role","option"),t.tabIndex=-1,t.id||(t.id=`${this.id}-option-${o}`),t.hasAttribute("data-event-bound")||(h.fromEvent(t,"pointerdown").pipe(i.tap(s=>{s.preventDefault(),s.stopPropagation()}),i.takeUntil(this.disconnecting)).subscribe(()=>this._optionSelect$.next(t)),t.setAttribute("data-event-bound","true"))})}),i.takeUntil(this.disconnecting)).subscribe(),h.combineLatest([this._selectedValue$,this._selectedValues$,this._options$]).pipe(i.tap(([e,t,o])=>{o.forEach(s=>{s.selected=this.multi?t.includes(s.value):s.value===e,s.setAttribute("aria-selected",String(s.selected))})}),i.takeUntil(this.disconnecting)).subscribe(),this._inputValue$.pipe(i.distinctUntilChanged(),i.debounceTime(this.debounceMs),i.withLatestFrom(this._options$,this._open$),i.tap(([e,t,o])=>{if(!o)return;const s=e.trim();if(s){const n=t.map(p=>{const c=p.label||p.textContent||"",d=p.value,m=_.similarity(s,c),v=_.similarity(s,d);return{option:p,score:Math.max(1.1*m,v)}});n.sort((p,c)=>c.score-p.score);let l=0;n.forEach((p,c)=>{const{option:d,score:m}=p;m<this.similarityThreshold?d.hidden=!0:(d.hidden=!1,l++,d.style.order=String(c))}),this._visibleOptionsCount=l,this._hasResults=l>0}else t.forEach(n=>{n.hidden=!1,n.style.order="0"}),this._visibleOptionsCount=t.length,this._hasResults=!0;this._announceToScreenReader(this._visibleOptionsCount>0?`${this._visibleOptionsCount} option${this._visibleOptionsCount===1?"":"s"} available.`:"No results found.")}),i.takeUntil(this.disconnecting)).subscribe(),this._optionSelect$.pipe(i.withLatestFrom(this._selectedValue$,this._selectedValues$),i.tap(([e,t,o])=>{if(this.multi){const s=o.indexOf(e.value),n=s>-1?[...o.slice(0,s),...o.slice(s+1)]:[...o,e.value];this._selectedValues$.next(n),this._inputValue$.next(""),this._inputValue="";const l=this._getSelectedLabels();this._announceToScreenReader(l.length>0?`Selected: ${l.join(", ")}`:"No options selected")}else this._selectedValue$.next(e.value),this._open$.next(!1),this._open=!1,this._inputValue=e.label||e.textContent||"",this._inputValue$.next(this._inputValue),h.timer(100).pipe(i.tap(()=>this._inputElementRef.value?.blur()),i.take(1)).subscribe(),this._announceToScreenReader(`Selected: ${e.label||e.textContent}`)}),i.tap(()=>this._fireChangeEvent()),i.takeUntil(this.disconnecting)).subscribe(),h.combineLatest([this._open$,this._selectedValue$,this._selectedValues$,this._options$]).pipe(i.filter(()=>!this._open$.value),i.tap(([,e,t,o])=>{if(this.multi){const s=o.filter(n=>t.includes(n.value)).map(n=>n.label||n.textContent||"");this._inputValue=s.join(", ")}else{const s=o.find(n=>n.value===e);this._inputValue=s&&(s.label||s.textContent)||""}this._inputValue$.next(this._inputValue)}),i.takeUntil(this.disconnecting)).subscribe(),this._open$.pipe(i.tap(e=>this._open=e),i.takeUntil(this.disconnecting)).subscribe()}_setupDocumentClickHandler(){this._documentClick$.pipe(i.filter(e=>!e.composedPath().includes(this)),i.filter(e=>!this._options.some(t=>e.composedPath().includes(t))),i.filter(()=>this._open),i.tap(()=>{this._open$.next(!1),this._updateInputDisplay()}),i.takeUntil(this.disconnecting)).subscribe(),this._open$.pipe(i.distinctUntilChanged(),i.switchMap(e=>e?h.timer(10).pipe(i.tap(()=>document.addEventListener("click",t=>this._documentClick$.next(t))),i.switchMap(()=>h.EMPTY)):h.of(null).pipe(i.tap(()=>document.removeEventListener("click",t=>this._documentClick$.next(t))))),i.takeUntil(this.disconnecting)).subscribe()}_updateInputDisplay(){h.of(null).pipe(i.withLatestFrom(this._selectedValue$,this._selectedValues$,this._options$,this._open$),i.tap(([,e,t,o,s])=>{if(this._inputElementRef.value&&(!s||!this.multi)){if(this.multi){const n=o.filter(l=>t.includes(l.value)).map(l=>l.label||l.textContent||"");this._inputValue=n.join(", ")}else{const n=o.find(l=>l.value===e);this._inputValue=n&&(n.label||n.textContent)||""}this._inputValue$.next(this._inputValue),this._inputElementRef.value.value=this._inputValue}}),i.take(1)).subscribe()}_getSelectedLabels(){return this._options.filter(e=>this.multi?this._selectedValues$.value.includes(e.value):e.value===this._selectedValue$.value).map(e=>e.label||e.textContent||"")}_announceToScreenReader(e){const t=this.shadowRoot?.querySelector("#live-status");t&&(t.textContent=e)}_fireChangeEvent(){const e={value:this.value};this.multi&&(e.values=[...this._selectedValues$.value]),this.dispatchEvent(new CustomEvent("change",{detail:e,bubbles:!0,composed:!0}))}checkValidity(){return!this.required||(this.multi?this._selectedValues$.value.length>0:!!this._selectedValue$.value)}reportValidity(){return this._inputElementRef.value?this._inputElementRef.value.reportValidity():this.checkValidity()}firstUpdated(){}render(){const e=`${this.id}-desc`;return b.html`
|
|
2
2
|
<div class="relative">
|
|
3
3
|
<!-- Screen reader live region -->
|
|
4
4
|
<div id="live-status" role="status" aria-live="polite" class="sr-only"></div>
|
|
@@ -54,4 +54,4 @@
|
|
|
54
54
|
</ul>
|
|
55
55
|
</div>
|
|
56
56
|
`}_handleAutoSelectOnBlur(){if(this.multi||!this._open||!this._inputValue.trim())return;const e=this._inputValue.trim();let t=null,o=0;this._options.forEach(s=>{if(s.hidden)return;const n=s.label||s.textContent||"",l=s.value,p=_.similarity(e,n),c=_.similarity(e,l),d=Math.max(1.1*p,c);d>o&&d>=this.similarityThreshold&&(o=d,t=s)}),t&&(this._optionSelect$.next(t),this._open$.next(!1),this._open=!1)}_handleKeyDown(e){h.fromEvent(document,"keydown").pipe(i.take(1),i.withLatestFrom(this._open$,this._options$),i.tap(([t,o,s])=>{if(!o&&(t.key==="ArrowDown"||t.key==="Enter"))return t.preventDefault(),this._open$.next(!0),void h.timer(10).pipe(i.tap(()=>{s.find(d=>!d.hidden)?.focus()}),i.take(1)).subscribe();if(!o)return;const n=s.filter(c=>!c.hidden).sort((c,d)=>parseInt(c.style.order||"0")-parseInt(d.style.order||"0")),l=n.find(c=>c===document.activeElement),p=l?n.indexOf(l):-1;switch(t.key){case"Escape":t.preventDefault(),this._open$.next(!1),this._updateInputDisplay(),this._inputElementRef.value?.focus();break;case"Tab":this._open$.next(!1),this._updateInputDisplay();break;case"ArrowDown":t.preventDefault();const c=p<n.length-1?p+1:0;n[c]?.focus();break;case"ArrowUp":t.preventDefault();const d=p>0?p-1:n.length-1;n[d]?.focus();break;case"Home":t.preventDefault(),n[0]?.focus();break;case"End":t.preventDefault(),n[n.length-1]?.focus();break;case"Enter":case" ":l&&(t.preventDefault(),this._optionSelect$.next(l))}})).subscribe()}};r([u.property({type:Boolean})],a.prototype,"required",2),r([u.property({type:String})],a.prototype,"placeholder",2),r([u.property({type:String,reflect:!0})],a.prototype,"label",2),r([u.property({type:String})],a.prototype,"name",2),r([u.property({type:String})],a.prototype,"maxHeight",2),r([u.property({type:Boolean})],a.prototype,"multi",2),r([u.property({type:String})],a.prototype,"description",2),r([u.property({type:String,reflect:!0})],a.prototype,"size",2),r([u.property({type:String})],a.prototype,"autocomplete",2),r([u.property({type:Number})],a.prototype,"debounceMs",2),r([u.property({type:Number})],a.prototype,"similarityThreshold",2),r([u.property({type:Array})],a.prototype,"values",1),r([u.property({type:String,reflect:!0})],a.prototype,"value",1),r([u.state()],a.prototype,"_open",2),r([u.state()],a.prototype,"_inputValue",2),r([u.state()],a.prototype,"_visibleOptionsCount",2),r([u.state()],a.prototype,"_hasResults",2),r([u.query("#options")],a.prototype,"_listbox",2),r([u.query("sch-input")],a.prototype,"_input",2),r([u.queryAssignedElements({flatten:!0})],a.prototype,"_options",2),a=r([u.customElement("schmancy-autocomplete")],a);
|
|
57
|
-
//# sourceMappingURL=autocomplete-
|
|
57
|
+
//# sourceMappingURL=autocomplete-DhRURo6G.cjs.map
|