@mhmo91/schmancy 0.7.5 → 0.7.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ai/directives.md +214 -7
- package/ai/typewriter.md +151 -33
- package/dist/ai/directives.md +214 -7
- package/dist/ai/typewriter.md +151 -33
- package/dist/{animated-text-DnFenRS1.cjs → animated-text-1FDC-OTA.cjs} +2 -2
- package/dist/{animated-text-DnFenRS1.cjs.map → animated-text-1FDC-OTA.cjs.map} +1 -1
- package/dist/{animated-text-YBgWXuVJ.js → animated-text-1_latidd.js} +3 -3
- package/dist/{animated-text-YBgWXuVJ.js.map → animated-text-1_latidd.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-C_nUxyiY.js → area.component-CQq-Mh0Z.js} +47 -39
- package/dist/area.component-CQq-Mh0Z.js.map +1 -0
- package/dist/{area.component-BojFAcRk.cjs → area.component-Ciw7vGsx.cjs} +4 -4
- package/dist/area.component-Ciw7vGsx.cjs.map +1 -0
- package/dist/area.js +1 -1
- package/dist/{autocomplete-B-X_D8MC.js → autocomplete-DT9MFPEG.js} +5 -5
- package/dist/{autocomplete-B-X_D8MC.js.map → autocomplete-DT9MFPEG.js.map} +1 -1
- package/dist/{autocomplete-B8oOdRsV.cjs → autocomplete-auTO_M_w.cjs} +2 -2
- package/dist/{autocomplete-B8oOdRsV.cjs.map → autocomplete-auTO_M_w.cjs.map} +1 -1
- package/dist/autocomplete.cjs +1 -1
- package/dist/autocomplete.js +1 -1
- package/dist/{avatar-DBdyON6Y.cjs → avatar-Bo8kRnA-.cjs} +2 -2
- package/dist/{avatar-DBdyON6Y.cjs.map → avatar-Bo8kRnA-.cjs.map} +1 -1
- package/dist/{avatar-Cro3M4Lw.js → avatar-Dm_qg-n1.js} +52 -52
- package/dist/{avatar-Cro3M4Lw.js.map → avatar-Dm_qg-n1.js.map} +1 -1
- package/dist/badge.cjs +1 -1
- package/dist/badge.js +1 -1
- package/dist/boat-98He5-K8.cjs +97 -0
- package/dist/boat-98He5-K8.cjs.map +1 -0
- package/dist/boat-RNCKlx8b.js +301 -0
- package/dist/boat-RNCKlx8b.js.map +1 -0
- 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-BOmazo-k.js → checkbox-Bdn1_WJg.js} +2 -2
- package/dist/{checkbox-BOmazo-k.js.map → checkbox-Bdn1_WJg.js.map} +1 -1
- package/dist/{checkbox-DMfwDgYx.cjs → checkbox-Dj06r6MD.cjs} +2 -2
- package/dist/{checkbox-DMfwDgYx.cjs.map → checkbox-Dj06r6MD.cjs.map} +1 -1
- package/dist/checkbox.cjs +1 -1
- package/dist/checkbox.js +1 -1
- package/dist/chips.cjs +1 -1
- package/dist/chips.js +2 -2
- package/dist/code-highlight.cjs +1 -1
- package/dist/code-highlight.js +1 -1
- package/dist/{code-preview-DgyY3Jlw.js → code-preview-Br7zBkyM.js} +2 -2
- package/dist/{code-preview-DgyY3Jlw.js.map → code-preview-Br7zBkyM.js.map} +1 -1
- package/dist/{code-preview-CbZzYTk2.cjs → code-preview-ByxcwPma.cjs} +2 -2
- package/dist/{code-preview-CbZzYTk2.cjs.map → code-preview-ByxcwPma.cjs.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-BV0479CW.js → date-range-VkIMcQdT.js} +3 -3
- package/dist/{date-range-BV0479CW.js.map → date-range-VkIMcQdT.js.map} +1 -1
- package/dist/{date-range-inline-HNDLTnYi.cjs → date-range-inline-kbokz03Z.cjs} +2 -2
- package/dist/{date-range-inline-HNDLTnYi.cjs.map → date-range-inline-kbokz03Z.cjs.map} +1 -1
- package/dist/{date-range-inline-GfLao0NN.js → date-range-inline-l2G48xTX.js} +3 -3
- package/dist/{date-range-inline-GfLao0NN.js.map → date-range-inline-l2G48xTX.js.map} +1 -1
- package/dist/date-range-inline.cjs +1 -1
- package/dist/date-range-inline.js +1 -1
- package/dist/{date-range-47SnbVM6.cjs → date-range-xYUr_KKx.cjs} +2 -2
- package/dist/{date-range-47SnbVM6.cjs.map → date-range-xYUr_KKx.cjs.map} +1 -1
- package/dist/date-range.cjs +1 -1
- package/dist/date-range.js +1 -1
- package/dist/{delay-Dr3Fr5YB.cjs → delay-CCreUpYu.cjs} +2 -2
- package/dist/{delay-Dr3Fr5YB.cjs.map → delay-CCreUpYu.cjs.map} +1 -1
- package/dist/{delay-B40l99jW.js → delay-Nu7RVtYd.js} +2 -2
- package/dist/{delay-B40l99jW.js.map → delay-Nu7RVtYd.js.map} +1 -1
- package/dist/delay.cjs +1 -1
- package/dist/delay.js +1 -1
- package/dist/details-CjQrqBli.cjs +98 -0
- package/dist/details-CjQrqBli.cjs.map +1 -0
- package/dist/details-DVIWpEsI.js +137 -0
- package/dist/details-DVIWpEsI.js.map +1 -0
- package/dist/details.cjs +1 -1
- package/dist/details.js +1 -1
- package/dist/{dialog-content-B_amCfq7.js → dialog-content-BgxKi73O.js} +3 -3
- package/dist/{dialog-content-B_amCfq7.js.map → dialog-content-BgxKi73O.js.map} +1 -1
- package/dist/{dialog-content-Emd7BLQA.cjs → dialog-content-CM3-RXQQ.cjs} +2 -2
- package/dist/{dialog-content-Emd7BLQA.cjs.map → dialog-content-CM3-RXQQ.cjs.map} +1 -1
- package/dist/dialog.cjs +1 -1
- package/dist/dialog.js +1 -1
- package/dist/directives.cjs +1 -1
- package/dist/directives.js +10 -6
- package/dist/divider-0yHQS8kR.cjs +58 -0
- package/dist/divider-0yHQS8kR.cjs.map +1 -0
- package/dist/divider-CqyzFfn1.js +84 -0
- package/dist/divider-CqyzFfn1.js.map +1 -0
- package/dist/divider.cjs +1 -1
- package/dist/divider.js +1 -1
- package/dist/{dropdown-content-BpJq8Q1u.cjs → dropdown-content-BmHQE5-P.cjs} +2 -2
- package/dist/{dropdown-content-BpJq8Q1u.cjs.map → dropdown-content-BmHQE5-P.cjs.map} +1 -1
- package/dist/{dropdown-content-Bw9jnfCR.js → dropdown-content-iFlLupVo.js} +3 -3
- package/dist/{dropdown-content-Bw9jnfCR.js.map → dropdown-content-iFlLupVo.js.map} +1 -1
- package/dist/dropdown.cjs +1 -1
- package/dist/dropdown.js +1 -1
- package/dist/{email-recipients-Bxvu6zi9.cjs → email-recipients-Cioc3U0Z.cjs} +2 -2
- package/dist/{email-recipients-Bxvu6zi9.cjs.map → email-recipients-Cioc3U0Z.cjs.map} +1 -1
- package/dist/{email-recipients-DZGMhyg4.js → email-recipients-CmAEJDMC.js} +6 -6
- package/dist/{email-recipients-DZGMhyg4.js.map → email-recipients-CmAEJDMC.js.map} +1 -1
- package/dist/extra.cjs +1 -1
- package/dist/extra.js +1 -1
- package/dist/{flex-DakK9gco.cjs → flex-BEB1yuMF.cjs} +2 -2
- package/dist/{flex-DakK9gco.cjs.map → flex-BEB1yuMF.cjs.map} +1 -1
- package/dist/{flex-DUgMxT_9.js → flex-BgcbHlPo.js} +2 -2
- package/dist/{flex-DUgMxT_9.js.map → flex-BgcbHlPo.js.map} +1 -1
- package/dist/{form-yZ1fh3h9.js → form-CxrvY530.js} +2 -2
- package/dist/{form-yZ1fh3h9.js.map → form-CxrvY530.js.map} +1 -1
- package/dist/{form-CPmMvWvE.cjs → form-DFDTspmH.cjs} +2 -2
- package/dist/{form-CPmMvWvE.cjs.map → form-DFDTspmH.cjs.map} +1 -1
- package/dist/form.cjs +1 -1
- package/dist/form.js +1 -1
- package/dist/{formField.mixin-D51klHq7.cjs → formField.mixin-C7H5DaEl.cjs} +2 -2
- package/dist/{formField.mixin-D51klHq7.cjs.map → formField.mixin-C7H5DaEl.cjs.map} +1 -1
- package/dist/{formField.mixin-Cmb9YpmX.js → formField.mixin-hZ2qP4iG.js} +2 -2
- package/dist/{formField.mixin-Cmb9YpmX.js.map → formField.mixin-hZ2qP4iG.js.map} +1 -1
- package/dist/{icon-DHT8YsE3.js → icon-D0FAI5uJ.js} +2 -2
- package/dist/{icon-DHT8YsE3.js.map → icon-D0FAI5uJ.js.map} +1 -1
- package/dist/{icon-Dsa_BddL.cjs → icon-DJnGMAQ2.cjs} +2 -2
- package/dist/{icon-Dsa_BddL.cjs.map → icon-DJnGMAQ2.cjs.map} +1 -1
- package/dist/{icon-button-BRcfLsJL.cjs → icon-button-CSZtSmOy.cjs} +8 -8
- package/dist/icon-button-CSZtSmOy.cjs.map +1 -0
- package/dist/{icon-button-PpRHFLCj.js → icon-button-CbgQp3AL.js} +19 -19
- package/dist/icon-button-CbgQp3AL.js.map +1 -0
- package/dist/icons.cjs +1 -1
- package/dist/icons.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +196 -192
- package/dist/{input-CYGSlByl.js → input-DLnKAj3B.js} +4 -4
- package/dist/{input-CYGSlByl.js.map → input-DLnKAj3B.js.map} +1 -1
- package/dist/{input-chip-CKYO8Lww.cjs → input-chip-C3EPsHcP.cjs} +2 -2
- package/dist/{input-chip-CKYO8Lww.cjs.map → input-chip-C3EPsHcP.cjs.map} +1 -1
- package/dist/{input-chip-CTKPIRVA.js → input-chip-dmqYCExV.js} +2 -2
- package/dist/{input-chip-CTKPIRVA.js.map → input-chip-dmqYCExV.js.map} +1 -1
- package/dist/input-wZ6ORWru.cjs +51 -0
- package/dist/{input-DB269a2X.cjs.map → input-wZ6ORWru.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-BbzeVuby.js → list-BegNkhOn.js} +2 -2
- package/dist/{list-BbzeVuby.js.map → list-BegNkhOn.js.map} +1 -1
- package/dist/{list-BQVTFNkq.cjs → list-CLKiZ6lk.cjs} +2 -2
- package/dist/{list-BQVTFNkq.cjs.map → list-CLKiZ6lk.cjs.map} +1 -1
- package/dist/list.cjs +1 -1
- package/dist/list.js +1 -1
- package/dist/{litElement.mixin-DzCpXwcY.cjs → litElement.mixin-CPQYJnK_.cjs} +2 -2
- package/dist/{litElement.mixin-DzCpXwcY.cjs.map → litElement.mixin-CPQYJnK_.cjs.map} +1 -1
- package/dist/{litElement.mixin-BzbZQbxa.js → litElement.mixin-DWDPaNoc.js} +2 -2
- package/dist/{litElement.mixin-BzbZQbxa.js.map → litElement.mixin-DWDPaNoc.js.map} +1 -1
- package/dist/mailbox.cjs +1 -1
- package/dist/mailbox.js +1 -1
- package/dist/{map-CgwU5Px4.js → map-CUKZ6LrR.js} +2 -2
- package/dist/{map-CgwU5Px4.js.map → map-CUKZ6LrR.js.map} +1 -1
- package/dist/{map-DuTFI2lm.cjs → map-w4Kdtycx.cjs} +2 -2
- package/dist/{map-DuTFI2lm.cjs.map → map-w4Kdtycx.cjs.map} +1 -1
- package/dist/map.cjs +1 -1
- package/dist/map.js +1 -1
- package/dist/{media-BnktmFRW.js → media-CjdCchz8.js} +2 -2
- package/dist/{media-BnktmFRW.js.map → media-CjdCchz8.js.map} +1 -1
- package/dist/{media-gtpSHRFx.cjs → media-DDNmuoV0.cjs} +2 -2
- package/dist/{media-gtpSHRFx.cjs.map → media-DDNmuoV0.cjs.map} +1 -1
- package/dist/menu-D9-9vipn.cjs +26 -0
- package/dist/menu-D9-9vipn.cjs.map +1 -0
- package/dist/menu-ofiPDY2a.js +61 -0
- package/dist/menu-ofiPDY2a.js.map +1 -0
- package/dist/menu.cjs +1 -1
- package/dist/menu.js +1 -1
- package/dist/mixins.cjs +1 -1
- package/dist/mixins.js +3 -3
- package/dist/nav-drawer.cjs +1 -1
- package/dist/nav-drawer.js +1 -1
- package/dist/navigation-bar.cjs +1 -1
- package/dist/navigation-bar.js +1 -1
- package/dist/{navigation-rail-D8otIR2P.cjs → navigation-rail-CEDLJTrH.cjs} +2 -2
- package/dist/{navigation-rail-D8otIR2P.cjs.map → navigation-rail-CEDLJTrH.cjs.map} +1 -1
- package/dist/{navigation-rail-CUMNSz0h.js → navigation-rail-weSW6BCv.js} +3 -3
- package/dist/{navigation-rail-CUMNSz0h.js.map → navigation-rail-weSW6BCv.js.map} +1 -1
- package/dist/navigation-rail.cjs +1 -1
- package/dist/navigation-rail.js +1 -1
- package/dist/{notification-service-E16lPsiT.js → notification-service-B4nvP2Jc.js} +5 -5
- package/dist/{notification-service-E16lPsiT.js.map → notification-service-B4nvP2Jc.js.map} +1 -1
- package/dist/{notification-service-CP6kGXVL.cjs → notification-service-B_pa74hl.cjs} +2 -2
- package/dist/{notification-service-CP6kGXVL.cjs.map → notification-service-B_pa74hl.cjs.map} +1 -1
- package/dist/notification.cjs +1 -1
- package/dist/notification.js +2 -2
- package/dist/{notify-D865xIlu.js → notify-Ci0HrUIo.js} +2 -2
- package/dist/{notify-D865xIlu.js.map → notify-Ci0HrUIo.js.map} +1 -1
- package/dist/{notify-Czdp7BbG.cjs → notify-aasSKQGA.cjs} +2 -2
- package/dist/{notify-Czdp7BbG.cjs.map → notify-aasSKQGA.cjs.map} +1 -1
- package/dist/{option-cJ8fM5qJ.js → option-Cs4e3CzF.js} +2 -2
- package/dist/{option-cJ8fM5qJ.js.map → option-Cs4e3CzF.js.map} +1 -1
- package/dist/{option-B1r0hb3H.cjs → option-Uze_q9Ef.cjs} +2 -2
- package/dist/{option-B1r0hb3H.cjs.map → option-Uze_q9Ef.cjs.map} +1 -1
- package/dist/option.cjs +1 -1
- package/dist/option.js +1 -1
- package/dist/{payment-card-form-RBjpMc2m.js → payment-card-form-BLoUTYiB.js} +3 -3
- package/dist/{payment-card-form-RBjpMc2m.js.map → payment-card-form-BLoUTYiB.js.map} +1 -1
- package/dist/{payment-card-form-EO3auDS8.cjs → payment-card-form-rJCPUtWE.cjs} +2 -2
- package/dist/{payment-card-form-EO3auDS8.cjs.map → payment-card-form-rJCPUtWE.cjs.map} +1 -1
- package/dist/{progress-4v9FzvOT.js → progress-B1f3y-Mf.js} +2 -2
- package/dist/{progress-4v9FzvOT.js.map → progress-B1f3y-Mf.js.map} +1 -1
- package/dist/{progress-DnhvJMz_.cjs → progress-DdBHNIMT.cjs} +2 -2
- package/dist/{progress-DnhvJMz_.cjs.map → progress-DdBHNIMT.cjs.map} +1 -1
- package/dist/progress.cjs +1 -1
- package/dist/progress.js +1 -1
- package/dist/{radio-button-BVegeFKE.cjs → radio-button-BAS7gKmA.cjs} +2 -2
- package/dist/{radio-button-BVegeFKE.cjs.map → radio-button-BAS7gKmA.cjs.map} +1 -1
- package/dist/{radio-button-DDavzgCz.js → radio-button-CaDaw5VH.js} +3 -3
- package/dist/{radio-button-DDavzgCz.js.map → radio-button-CaDaw5VH.js.map} +1 -1
- package/dist/radio-group.cjs +1 -1
- package/dist/radio-group.js +1 -1
- package/dist/ripple-QoNZUUw_.js +148 -0
- package/dist/ripple-QoNZUUw_.js.map +1 -0
- package/dist/ripple-Ujq_REH4.cjs +16 -0
- package/dist/ripple-Ujq_REH4.cjs.map +1 -0
- package/dist/{schmancy-steps-container-DN9c-HeX.js → schmancy-steps-container-BInNput3.js} +2 -2
- package/dist/{schmancy-steps-container-DN9c-HeX.js.map → schmancy-steps-container-BInNput3.js.map} +1 -1
- package/dist/{schmancy-steps-container-s6kZWhcr.cjs → schmancy-steps-container-wQsksygx.cjs} +2 -2
- package/dist/{schmancy-steps-container-s6kZWhcr.cjs.map → schmancy-steps-container-wQsksygx.cjs.map} +1 -1
- package/dist/search-B1s7thB0.cjs +2 -0
- package/dist/search-B1s7thB0.cjs.map +1 -0
- package/dist/search-DxxnLa5u.js +95 -0
- package/dist/search-DxxnLa5u.js.map +1 -0
- package/dist/{select--D6l5ru7.js → select-ApLZefMf.js} +4 -4
- package/dist/{select--D6l5ru7.js.map → select-ApLZefMf.js.map} +1 -1
- package/dist/{select-DVT_kFNR.cjs → select-_2Ag_znm.cjs} +2 -2
- package/dist/{select-DVT_kFNR.cjs.map → select-_2Ag_znm.cjs.map} +1 -1
- package/dist/select.cjs +1 -1
- package/dist/select.js +1 -1
- package/dist/selector-hook-Cok22ifx.cjs +2 -0
- package/dist/selector-hook-Cok22ifx.cjs.map +1 -0
- package/dist/selector-hook-l2fe2UO5.js +319 -0
- package/dist/selector-hook-l2fe2UO5.js.map +1 -0
- package/dist/{sheet-CNn_huhz.js → sheet-DovyNsok.js} +14 -14
- package/dist/sheet-DovyNsok.js.map +1 -0
- package/dist/{sheet-Bza5jVS2.cjs → sheet-wjDOQ8Hs.cjs} +4 -4
- package/dist/sheet-wjDOQ8Hs.cjs.map +1 -0
- package/dist/sheet.cjs +1 -1
- package/dist/sheet.js +2 -2
- package/dist/{sheet.service-CmNDL4f6.js → sheet.service-BvOiOFMm.js} +2 -2
- package/dist/{sheet.service-CmNDL4f6.js.map → sheet.service-BvOiOFMm.js.map} +1 -1
- package/dist/{sheet.service--zUgftN3.cjs → sheet.service-DfHrOxyc.cjs} +2 -2
- package/dist/{sheet.service--zUgftN3.cjs.map → sheet.service-DfHrOxyc.cjs.map} +1 -1
- package/dist/{slider-Cf0pED-U.cjs → slider-BgJccHrg.cjs} +2 -2
- package/dist/{slider-Cf0pED-U.cjs.map → slider-BgJccHrg.cjs.map} +1 -1
- package/dist/{slider-DPxBmmFD.js → slider-CeVgx4pL.js} +3 -3
- package/dist/{slider-DPxBmmFD.js.map → slider-CeVgx4pL.js.map} +1 -1
- package/dist/slider.cjs +1 -1
- package/dist/slider.js +1 -1
- package/dist/{spinner-BDSDxr_W.cjs → spinner-BKeA2bdB.cjs} +3 -3
- package/dist/spinner-BKeA2bdB.cjs.map +1 -0
- package/dist/{spinner-Dyz6HBFa.js → spinner-Brq1TenP.js} +3 -3
- package/dist/spinner-Brq1TenP.js.map +1 -0
- package/dist/steps.cjs +1 -1
- package/dist/steps.js +1 -1
- package/dist/store.cjs +1 -1
- package/dist/store.js +1 -1
- package/dist/{suggestion-chip-CCW8g_3S.js → suggestion-chip-CWBSzu7C.js} +3 -3
- package/dist/{suggestion-chip-CCW8g_3S.js.map → suggestion-chip-CWBSzu7C.js.map} +1 -1
- package/dist/{suggestion-chip-B7COqb4l.cjs → suggestion-chip-dq20NKWy.cjs} +2 -2
- package/dist/{suggestion-chip-B7COqb4l.cjs.map → suggestion-chip-dq20NKWy.cjs.map} +1 -1
- package/dist/{surface-B4CxtF38.js → surface-Bf8pvmdG.js} +34 -10
- package/dist/{surface-B4CxtF38.js.map → surface-Bf8pvmdG.js.map} +1 -1
- package/dist/{surface-CkzbeSYN.cjs → surface-fEPJ-cuu.cjs} +27 -3
- package/dist/{surface-CkzbeSYN.cjs.map → surface-fEPJ-cuu.cjs.map} +1 -1
- package/dist/surface.cjs +1 -1
- package/dist/surface.js +1 -1
- package/dist/{table-D-g4ZBys.cjs → table-DEnB9_Rf.cjs} +4 -3
- package/dist/{table-D-g4ZBys.cjs.map → table-DEnB9_Rf.cjs.map} +1 -1
- package/dist/{table-KPNVMJtn.js → table-MLd3oXm6.js} +14 -10
- package/dist/{table-KPNVMJtn.js.map → table-MLd3oXm6.js.map} +1 -1
- package/dist/table.cjs +1 -1
- package/dist/table.js +1 -1
- package/dist/{tabs-compatibility-sMoQP12I.cjs → tabs-compatibility-CXVHOR5X.cjs} +2 -2
- package/dist/{tabs-compatibility-sMoQP12I.cjs.map → tabs-compatibility-CXVHOR5X.cjs.map} +1 -1
- package/dist/{tabs-compatibility-xUK4vD1M.js → tabs-compatibility-KWKzYolX.js} +2 -2
- package/dist/{tabs-compatibility-xUK4vD1M.js.map → tabs-compatibility-KWKzYolX.js.map} +1 -1
- package/dist/tabs.cjs +1 -1
- package/dist/tabs.js +1 -1
- package/dist/tailwind.mixin-3TPVvhYf.cjs +2 -0
- package/dist/{tailwind.mixin-scDxsqaX.cjs.map → tailwind.mixin-3TPVvhYf.cjs.map} +1 -1
- package/dist/tailwind.mixin-DIW0B_of.js +67 -0
- package/dist/{tailwind.mixin-xIIxrXd8.js.map → tailwind.mixin-DIW0B_of.js.map} +1 -1
- package/dist/teleport.cjs +1 -1
- package/dist/teleport.js +1 -1
- package/dist/{textarea-BSBYVs99.cjs → textarea-B7arkA7y.cjs} +2 -2
- package/dist/{textarea-BSBYVs99.cjs.map → textarea-B7arkA7y.cjs.map} +1 -1
- package/dist/{textarea-CFrirT5y.js → textarea-BK1m_CFR.js} +3 -3
- package/dist/{textarea-CFrirT5y.js.map → textarea-BK1m_CFR.js.map} +1 -1
- package/dist/textarea.cjs +1 -1
- package/dist/textarea.js +1 -1
- package/dist/{theme-button-B8Xqrz1M.cjs → theme-button-BTKwL3oC.cjs} +2 -2
- package/dist/{theme-button-B8Xqrz1M.cjs.map → theme-button-BTKwL3oC.cjs.map} +1 -1
- package/dist/{theme-button-D-LTPh88.js → theme-button-C6kk8bay.js} +2 -2
- package/dist/{theme-button-D-LTPh88.js.map → theme-button-C6kk8bay.js.map} +1 -1
- package/dist/theme-button.cjs +1 -1
- package/dist/theme-button.js +1 -1
- package/dist/{theme-controller-boat-BOddzVdU.js → theme-controller-boat-BK59LqH9.js} +3 -3
- package/dist/{theme-controller-boat-BOddzVdU.js.map → theme-controller-boat-BK59LqH9.js.map} +1 -1
- package/dist/{theme-controller-boat-C2F-qRyu.cjs → theme-controller-boat-Y5QXwJxW.cjs} +2 -2
- package/dist/{theme-controller-boat-C2F-qRyu.cjs.map → theme-controller-boat-Y5QXwJxW.cjs.map} +1 -1
- package/dist/theme.cjs +1 -1
- package/dist/theme.js +1 -1
- package/dist/{timezone-BvOWa9Nt.js → timezone-D_skWX6Z.js} +3 -3
- package/dist/{timezone-BvOWa9Nt.js.map → timezone-D_skWX6Z.js.map} +1 -1
- package/dist/{timezone-xHmnktrm.cjs → timezone-nbn0o5GC.cjs} +2 -2
- package/dist/{timezone-xHmnktrm.cjs.map → timezone-nbn0o5GC.cjs.map} +1 -1
- package/dist/{tooltip-D3ZZJEAk.js → tooltip-Btl0IKYC.js} +2 -2
- package/dist/{tooltip-D3ZZJEAk.js.map → tooltip-Btl0IKYC.js.map} +1 -1
- package/dist/{tooltip-D24v5bvM.cjs → tooltip-DyuMJEjL.cjs} +2 -2
- package/dist/{tooltip-D24v5bvM.cjs.map → tooltip-DyuMJEjL.cjs.map} +1 -1
- package/dist/tooltip.cjs +1 -1
- package/dist/tooltip.js +1 -1
- package/dist/{tree-CfVyhRIH.js → tree-B_2eIFQi.js} +2 -2
- package/dist/{tree-CfVyhRIH.js.map → tree-B_2eIFQi.js.map} +1 -1
- package/dist/{tree-DC_jbDRu.cjs → tree-N4Y6MoQe.cjs} +2 -2
- package/dist/{tree-DC_jbDRu.cjs.map → tree-N4Y6MoQe.cjs.map} +1 -1
- package/dist/tree.cjs +1 -1
- package/dist/tree.js +1 -1
- package/dist/{typewriter-By-3T0Jm.js → typewriter-Blyrk_4c.js} +247 -118
- package/dist/typewriter-Blyrk_4c.js.map +1 -0
- package/dist/typewriter-CFQAeOaw.cjs +124 -0
- package/dist/typewriter-CFQAeOaw.cjs.map +1 -0
- package/dist/typewriter.cjs +1 -1
- package/dist/typewriter.js +1 -1
- package/dist/{typography-B7kvO8iJ.js → typography-DjGWK58I.js} +2 -2
- package/dist/{typography-B7kvO8iJ.js.map → typography-DjGWK58I.js.map} +1 -1
- package/dist/{typography-9lVCjAbj.cjs → typography-DsIU0TGe.cjs} +2 -2
- package/dist/{typography-9lVCjAbj.cjs.map → typography-DsIU0TGe.cjs.map} +1 -1
- package/dist/typography.cjs +1 -1
- package/dist/typography.js +1 -1
- package/dist/utils.cjs +1 -1
- package/dist/utils.js +1 -1
- package/package.json +1 -1
- package/types/src/area/router.types.d.ts +1 -0
- package/types/src/boat/boat.d.ts +0 -1
- package/types/src/button/button.d.ts +8 -0
- package/types/src/details/details.d.ts +3 -11
- package/types/src/directives/drag.d.ts +30 -0
- package/types/src/directives/index.d.ts +1 -0
- package/types/src/divider/divider.d.ts +6 -1
- package/types/src/menu/menu-item.d.ts +0 -1
- package/types/src/store/filter-directive.d.ts +1 -1
- package/types/src/surface/surface.d.ts +2 -1
- package/types/src/types/surface.d.ts +1 -1
- package/types/src/typewriter/typewriter.d.ts +15 -0
- package/types/src/utils/index.d.ts +4 -4
- package/types/src/utils/search.d.ts +39 -1
- package/dist/area.component-BojFAcRk.cjs.map +0 -1
- package/dist/area.component-C_nUxyiY.js.map +0 -1
- package/dist/boat-B7AKN6Ge.js +0 -276
- package/dist/boat-B7AKN6Ge.js.map +0 -1
- package/dist/boat-BhAuteUk.cjs +0 -93
- package/dist/boat-BhAuteUk.cjs.map +0 -1
- package/dist/details-CQPpI_la.js +0 -211
- package/dist/details-CQPpI_la.js.map +0 -1
- package/dist/details-DydvHvfw.cjs +0 -143
- package/dist/details-DydvHvfw.cjs.map +0 -1
- package/dist/divider-BF9xljgI.cjs +0 -2
- package/dist/divider-BF9xljgI.cjs.map +0 -1
- package/dist/divider-BHruVdsE.js +0 -23
- package/dist/divider-BHruVdsE.js.map +0 -1
- package/dist/icon-button-BRcfLsJL.cjs.map +0 -1
- package/dist/icon-button-PpRHFLCj.js.map +0 -1
- package/dist/input-DB269a2X.cjs +0 -51
- package/dist/menu-DA2pO48m.cjs +0 -26
- package/dist/menu-DA2pO48m.cjs.map +0 -1
- package/dist/menu-DwFriXTu.js +0 -63
- package/dist/menu-DwFriXTu.js.map +0 -1
- package/dist/ripple-Cy-nvO8W.js +0 -80
- package/dist/ripple-Cy-nvO8W.js.map +0 -1
- package/dist/ripple-DqQrvaTe.cjs +0 -16
- package/dist/ripple-DqQrvaTe.cjs.map +0 -1
- package/dist/search-BeEqIiuO.js +0 -53
- package/dist/search-BeEqIiuO.js.map +0 -1
- package/dist/search-bfOHCuHZ.cjs +0 -2
- package/dist/search-bfOHCuHZ.cjs.map +0 -1
- package/dist/selector-hook-BG6g_IEN.cjs +0 -2
- package/dist/selector-hook-BG6g_IEN.cjs.map +0 -1
- package/dist/selector-hook-CrwQCPxL.js +0 -313
- package/dist/selector-hook-CrwQCPxL.js.map +0 -1
- package/dist/sheet-Bza5jVS2.cjs.map +0 -1
- package/dist/sheet-CNn_huhz.js.map +0 -1
- package/dist/spinner-BDSDxr_W.cjs.map +0 -1
- package/dist/spinner-Dyz6HBFa.js.map +0 -1
- package/dist/tailwind.mixin-scDxsqaX.cjs +0 -2
- package/dist/tailwind.mixin-xIIxrXd8.js +0 -67
- package/dist/typewriter-By-3T0Jm.js.map +0 -1
- package/dist/typewriter-vit0P1N1.cjs +0 -9
- package/dist/typewriter-vit0P1N1.cjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"area.component-C_nUxyiY.js","sources":["../src/area/area.service.ts","../src/area/route.component.ts","../src/area/router.types.ts","../src/area/area.component.ts"],"sourcesContent":["import {\n\tbufferTime,\n\tcatchError,\n\tdistinctUntilChanged,\n\tEMPTY,\n\tfilter,\n\tfromEvent,\n\tmap,\n\tObservable,\n\tof,\n\tReplaySubject,\n\tshareReplay,\n\tskip,\n\tSubject,\n\tSubscription,\n\ttap,\n\ttimeout,\n\tzip\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\tprivate unloadSubscription?: Subscription\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\n\t\t// Setup unload subscription using RxJS\n\t\tif (typeof window !== 'undefined') {\n\t\t\tthis.unloadSubscription = fromEvent(window, 'unload').subscribe(() => {\n\t\t\t\tthis.dispose()\n\t\t\t})\n\t\t}\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\n\t\tconst areaSubject = this.getOrCreateAreaSubject(areaName)\n\t\tconst observable = areaSubject.asObservable().pipe(\n\t\t\t// Add distinct to prevent duplicate emissions - includes state, params, and props\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\tJSON.stringify(a.props) === JSON.stringify(b.props)\n\t\t\t),\n\t\t\t// Share the subscription\n\t\t\tshareReplay(1)\n\t\t)\n\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// Get the current base path (everything except the last segment which might be encoded state)\n\t\tconst currentPath = location.pathname\n\t\tconst pathSegments = currentPath.split('/')\n\t\tlet basePath = '/'\n\n\t\t// Check if the last segment is encoded state (contains { or %7B)\n\t\tconst lastSegment = pathSegments[pathSegments.length - 1]\n\t\tif (lastSegment && (lastSegment.includes('{') || lastSegment.includes('%7B'))) {\n\t\t\t// Remove the encoded state segment to get the base path\n\t\t\tpathSegments.pop()\n\t\t\tbasePath = pathSegments.join('/') || '/'\n\t\t} else {\n\t\t\t// Keep the current path as base path\n\t\t\tbasePath = currentPath\n\t\t}\n\n\t\t// Ensure base path ends properly\n\t\tif (basePath !== '/' && !basePath.endsWith('/')) {\n\t\t\tbasePath += '/'\n\t\t}\n\n\t\t// Handle query parameters\n\t\tlet queryString = ''\n\n\t\tif (clearQueryParams !== true) {\n\t\t\t// Get current query params\n\t\t\tconst urlParams = new URLSearchParams(location.search)\n\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\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\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 = basePath === '/' ? `/${mainArea.component}` : `${basePath}${mainArea.component}`\n\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\n\t\t\t\tconst query = searchParams.toString()\n\t\t\t\treturn path + (query ? `?${query}` : '')\n\t\t\t}\n\t\t}\n\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\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\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\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\n\t\t\t\tcleanedAreas[areaName] = cleanRoute\n\t\t\t})\n\n\t\t\t// If cleanedAreas is empty, preserve the base path\n\t\t\tif (Object.keys(cleanedAreas).length === 0) {\n\t\t\t\tconst cleanBasePath = basePath === '/' ? '' : basePath.replace(/\\/$/, '')\n\t\t\t\treturn `${cleanBasePath}${queryString}`\n\t\t\t}\n\n\t\t\tconst encoded = encodeURIComponent(JSON.stringify(cleanedAreas))\n\t\t\tconst cleanBasePath = basePath === '/' ? '' : basePath.replace(/\\/$/, '')\n\t\t\treturn `${cleanBasePath}/${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\n\t\t// Before removing from current map, emit a clearing signal to the area's subject\n\t\t// This notifies the area component to clear itself\n\t\tconst areaSubject = this.areaSubjects.get(name)\n\t\tif (areaSubject && !areaSubject.closed) {\n\t\t\t// Send a route with null component to signal clearing\n\t\t\tareaSubject.next({\n\t\t\t\tcomponent: null as any,\n\t\t\t\tstate: {},\n\t\t\t\tarea: name,\n\t\t\t\tparams: {},\n\t\t\t\tprops: {}\n\t\t\t})\n\t\t}\n\n\t\t// Send a clearing signal through the request pipeline\n\t\t// This ensures the area component receives the signal to clear\n\t\tthis.request.next({\n\t\t\tarea: name,\n\t\t\tcomponent: null as any,\n\t\t\tstate: {},\n\t\t\tparams: {},\n\t\t\tprops: {},\n\t\t\thistoryStrategy: 'silent' as any,\n\t\t\t_source: 'programmatic' as NavigationSource\n\t\t})\n\n\t\t// Remove from current map\n\t\tthis.current.delete(name)\n\t\tthis.$current.next(this.current)\n\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\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\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\n\t\t// Clear current state\n\t\tthis.current.clear()\n\t\tthis.$current.next(this.current)\n\n\t\t// Update URL\n\t\tif (this.enableHistoryMode) {\n\t\t\tconst url = this.createCleanURL({})\n\t\t\thistory.replaceState({ schmancyAreas: {} }, '', url)\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\n\t\tthis.disposed = true\n\n\t\t// Unsubscribe from unload event\n\t\tif (this.unloadSubscription) {\n\t\t\tthis.unloadSubscription.unsubscribe()\n\t\t\tthis.unloadSubscription = undefined\n\t\t}\n\n\t\t// Complete all subjects\n\t\tthis.areaSubjects.forEach(subject => subject.complete())\n\t\tthis.areaSubjects.clear()\n\n\t\tthis.request.complete()\n\t\tthis.$current.complete()\n\t\trouterHistory.complete()\n\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","import { $LitElement } from '@mixins/index';\nimport { css, html } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { Observable } from 'rxjs';\nimport { LazyComponent } from './lazy';\n\nexport type ObservableGuardResult = Observable<boolean>;\n\n// Component types that can be passed to routes\nexport type RouteComponent =\n | string // Tag name\n | CustomElementConstructor // Constructor function\n | HTMLElement // Existing element\n | LazyComponent<any> \n\nexport interface RouteConfig {\n when: string;\n component: RouteComponent;\n exact?: boolean;\n guard?: ObservableGuardResult;\n}\n\n/**\n * A marker component that holds route configuration.\n * This component doesn't render anything - it's used by schmancy-area\n * to configure routing via slot change detection.\n *\n * @example\n * ```html\n * <schmancy-area>\n * <schmancy-route\n * when=\"users\"\n * .component=${UserComponent}\n * exact\n * ></schmancy-route>\n * </schmancy-area>\n * ```\n */\n@customElement('schmancy-route')\nexport class SchmancyRoute extends $LitElement(css`\n :host {\n display: none;\n }\n`) {\n @property({ type: String })\n when!: string;\n\n @property({ type: Object })\n component!: RouteComponent;\n\n @property({ type: Boolean })\n exact?: boolean = false;\n\n @property({ type: Object })\n guard?:ObservableGuardResult ;\n\n /**\n * Returns the route configuration object\n */\n getConfig(): RouteConfig {\n return {\n when: this.when,\n component: this.component,\n exact: this.exact,\n guard: this.guard\n };\n }\n\n render() {\n // This is a marker component - no visual output\n return html``;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'schmancy-route': SchmancyRoute;\n }\n}","import { LazyComponent } from './lazy'\n\n/**\n * Component type accepted by area router, drawer, and sheet services\n */\nexport type ComponentType = CustomElementConstructor | string | HTMLElement | LazyComponent<any>\n\nexport type RouteAction = {\n\tcomponent: ComponentType\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 { css, html } from 'lit'\nimport { customElement, property, queryAssignedElements } from 'lit/decorators.js'\nimport {\n\tEMPTY,\n\tcatchError,\n\tdistinctUntilChanged,\n\tfilter,\n\tfromEvent,\n\tmap,\n\tmerge,\n\tof,\n\tshareReplay,\n\tswitchMap,\n\ttake,\n\ttakeUntil,\n\ttap,\n} from 'rxjs'\nimport area from './area.service'\nimport { RouteComponent, SchmancyRoute } from './route.component'\nimport { ActiveRoute, HISTORY_STRATEGY, RouteAction } from './router.types'\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!: RouteComponent\n\n\t/**\n\t * Query for assigned route elements in the slot\n\t * This will automatically update when slot content changes\n\t */\n\t@queryAssignedElements({ selector: 'schmancy-route', flatten: true })\n\tprivate routes!: SchmancyRoute[]\n\n\tprotected firstUpdated(): void {\n\t\tif (!this.name) throw new Error('Area name is required')\n\n\t\t// Single unified routing pipeline with all logic inline\n\t\tmerge(\n\t\t\t// Source 1: Programmatic navigation from area.request\n\t\t\tarea.request.pipe(\n\t\t\t\tfilter(({ area }) => area === this.name)\n\t\t\t),\n\n\t\t\t// Source 2: Initial page load - parse route from URL\n\t\t\tof(null).pipe(\n\t\t\t\ttake(1),\n\t\t\t\tmap(() => {\n\t\t\t\t\t// Parse route from URL on initial load\n\t\t\t\t\tconst path = location.pathname\n\t\t\t\t\tconst lastSegment = path.split('/').pop() || ''\n\n\t\t\t\t\t// Check for JSON encoded route in URL\n\t\t\t\t\tif (lastSegment && (lastSegment.includes('{') || lastSegment.includes('%7B'))) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst parsed = JSON.parse(decodeURIComponent(lastSegment)) as Record<string, ActiveRoute>\n\t\t\t\t\t\t\tif (parsed[this.name]) {\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\tarea: this.name,\n\t\t\t\t\t\t\t\t\tcomponent: parsed[this.name].component,\n\t\t\t\t\t\t\t\t\tstate: parsed[this.name].state || {},\n\t\t\t\t\t\t\t\t\tparams: parsed[this.name].params || {},\n\t\t\t\t\t\t\t\t\tprops: parsed[this.name].props || {},\n\t\t\t\t\t\t\t\t\thistoryStrategy: HISTORY_STRATEGY.replace,\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} catch {}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Segment-based routing\n\t\t\t\t\tconst segments = path.split('/').filter(Boolean)\n\t\t\t\t\tconst matchingSegment = segments.find(seg =>\n\t\t\t\t\t\tthis.routes?.some(r => r.when === seg)\n\t\t\t\t\t)\n\n\t\t\t\t\tif (matchingSegment) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tarea: this.name,\n\t\t\t\t\t\t\tcomponent: matchingSegment,\n\t\t\t\t\t\t\tstate: {},\n\t\t\t\t\t\t\tparams: {},\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\n\t\t\t\t\t// Use default route if available\n\t\t\t\t\treturn this.default\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tarea: this.name,\n\t\t\t\t\t\t\t\tcomponent: this.default,\n\t\t\t\t\t\t\t\tstate: {},\n\t\t\t\t\t\t\t\tparams: {},\n\t\t\t\t\t\t\t\thistoryStrategy: HISTORY_STRATEGY.silent,\n\t\t\t\t\t\t\t} as RouteAction\n\t\t\t\t\t\t: null\n\t\t\t\t})\n\t\t\t),\n\n\t\t\t// Source 3: Browser navigation (back/forward) - parse from browser state\n\t\t\tfromEvent<PopStateEvent>(window, 'popstate').pipe(\n\t\t\t\tmap(() => {\n\t\t\t\t\t// Parse route from browser state during popstate\n\t\t\t\t\t// First check history state\n\t\t\t\t\tif (history.state?.schmancyAreas?.[this.name]) {\n\t\t\t\t\t\tconst stateData = history.state.schmancyAreas[this.name]\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tarea: this.name,\n\t\t\t\t\t\t\tcomponent: stateData.component,\n\t\t\t\t\t\t\tstate: stateData.state || {},\n\t\t\t\t\t\t\tparams: stateData.params || {},\n\t\t\t\t\t\t\tprops: stateData.props || {},\n\t\t\t\t\t\t\thistoryStrategy: HISTORY_STRATEGY.pop,\n\t\t\t\t\t\t} as RouteAction\n\t\t\t\t\t}\n\n\t\t\t\t\t// Fallback to URL parsing if no state (e.g., navigating to root)\n\t\t\t\t\tconst path = location.pathname\n\t\t\t\t\tconst lastSegment = path.split('/').pop() || ''\n\n\t\t\t\t\t// Check for JSON encoded route in URL\n\t\t\t\t\tif (lastSegment && (lastSegment.includes('{') || lastSegment.includes('%7B'))) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst parsed = JSON.parse(decodeURIComponent(lastSegment)) as Record<string, ActiveRoute>\n\t\t\t\t\t\t\tif (parsed[this.name]) {\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\tarea: this.name,\n\t\t\t\t\t\t\t\t\tcomponent: parsed[this.name].component,\n\t\t\t\t\t\t\t\t\tstate: parsed[this.name].state || {},\n\t\t\t\t\t\t\t\t\tparams: parsed[this.name].params || {},\n\t\t\t\t\t\t\t\t\tprops: parsed[this.name].props || {},\n\t\t\t\t\t\t\t\t\thistoryStrategy: HISTORY_STRATEGY.replace,\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} catch {}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Segment-based routing\n\t\t\t\t\tconst segments = path.split('/').filter(Boolean)\n\t\t\t\t\tconst matchingSegment = segments.find(seg =>\n\t\t\t\t\t\tthis.routes?.some(r => r.when === seg)\n\t\t\t\t\t)\n\n\t\t\t\t\tif (matchingSegment) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tarea: this.name,\n\t\t\t\t\t\t\tcomponent: matchingSegment,\n\t\t\t\t\t\t\tstate: {},\n\t\t\t\t\t\t\tparams: {},\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\n\t\t\t\t\t// Use default route if available\n\t\t\t\t\treturn this.default\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tarea: this.name,\n\t\t\t\t\t\t\t\tcomponent: this.default,\n\t\t\t\t\t\t\t\tstate: {},\n\t\t\t\t\t\t\t\tparams: {},\n\t\t\t\t\t\t\t\thistoryStrategy: HISTORY_STRATEGY.silent,\n\t\t\t\t\t\t\t} as RouteAction\n\t\t\t\t\t\t: null\n\t\t\t\t})\n\t\t\t)\n\t\t).pipe(\n\t\t\t// Filter out null routes\n\t\t\tfilter((route): route is RouteAction => route !== null),\n\n\t\t\t// Step 1: Resolve route definition from component\n\t\t\tmap(action => {\n\t\t\t\tlet matchedRoute: SchmancyRoute | undefined\n\t\t\t\tlet component = action.component\n\n\t\t\t\t// If component is a string, find the matching route\n\t\t\t\tif (typeof component === 'string' && this.routes) {\n\t\t\t\t\tmatchedRoute = this.routes.find(r => r.when === component)\n\t\t\t\t\tif (matchedRoute) {\n\t\t\t\t\t\tcomponent = matchedRoute.component\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// If component is a function, find matching route\n\t\t\t\telse if (typeof component === 'function' && this.routes) {\n\t\t\t\t\tmatchedRoute = this.routes.find(r => r.component === component)\n\t\t\t\t}\n\t\t\t\t// If component is HTMLElement, find by tag name\n\t\t\t\telse if (component instanceof HTMLElement && this.routes) {\n\t\t\t\t\tconst tagName = component.tagName.toLowerCase()\n\t\t\t\t\tmatchedRoute = this.routes.find(r => r.when === tagName)\n\t\t\t\t}\n\n\t\t\t\treturn { ...action, component, matchedRoute }\n\t\t\t}),\n\n\t\t\t// Step 2: Check route guards\n\t\t\tswitchMap(route => {\n\t\t\t\tif (!route.matchedRoute?.guard) {\n\t\t\t\t\treturn of(route)\n\t\t\t\t}\n\n\t\t\t\treturn route.matchedRoute.guard.pipe(\n\t\t\t\t\tswitchMap(guardResult => {\n\t\t\t\t\t\tif (guardResult === true) {\n\t\t\t\t\t\t\treturn of(route)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Guard failed, dispatch redirect event\n\t\t\t\t\t\tconst redirectEvent = new CustomEvent('redirect', {\n\t\t\t\t\t\t\tdetail: {\n\t\t\t\t\t\t\t\tblockedRoute: route.matchedRoute?.when || 'unknown',\n\t\t\t\t\t\t\t\tarea: this.name,\n\t\t\t\t\t\t\t\tparams: route.params || {},\n\t\t\t\t\t\t\t\tstate: route.state || {},\n\t\t\t\t\t\t\t\tredirectTarget: typeof guardResult === 'object' ? guardResult : undefined,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tbubbles: true,\n\t\t\t\t\t\t\tcomposed: true,\n\t\t\t\t\t\t})\n\t\t\t\t\t\troute.matchedRoute.dispatchEvent(redirectEvent)\n\n\t\t\t\t\t\treturn EMPTY\n\t\t\t\t\t})\n\t\t\t\t)\n\t\t\t}),\n\n\t\t\t// Step 3: Load lazy components if needed\n\t\t\tswitchMap(async route => {\n\t\t\t\tlet component = route.component\n\n\t\t\t\tif (\n\t\t\t\t\ttypeof component === 'function' &&\n\t\t\t\t\t('preload' in component || '_promise' in component || '_module' in component)\n\t\t\t\t) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst module = await (component as () => Promise<{ default: CustomElementConstructor }>)()\n\t\t\t\t\t\tcomponent = module.default\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tconsole.error(`[${this.name}] Lazy load failed:`, e)\n\t\t\t\t\t\treturn { ...route, component: null }\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn { ...route, component }\n\t\t\t}),\n\n\t\t\t// Step 4: Create unique key for deduplication\n\t\t\tmap(route => {\n\t\t\t\tlet identifier = ''\n\t\t\t\tconst component = route.component\n\n\t\t\t\tif (!component || component === '') {\n\t\t\t\t\tidentifier = 'null'\n\t\t\t\t} else if (typeof component === 'string') {\n\t\t\t\t\tidentifier = component\n\t\t\t\t} else if (component instanceof HTMLElement) {\n\t\t\t\t\tidentifier = component.tagName.toLowerCase()\n\t\t\t\t} else if (typeof component === 'function') {\n\t\t\t\t\tidentifier = component.name || 'CustomElement'\n\t\t\t\t}\n\n\t\t\t\tconst key = `${identifier}${JSON.stringify(route.params)}${JSON.stringify(route.state)}${JSON.stringify(route.props)}`\n\n\t\t\t\treturn { ...route, key, tagName: identifier }\n\t\t\t}),\n\n\t\t\t// Step 5: Deduplicate navigation requests\n\t\t\tdistinctUntilChanged((a, b) => a.key === b.key),\n\n\t\t\t// Step 6: Create DOM element from component\n\t\t\tmap(route => {\n\t\t\t\tlet element: HTMLElement | null = null\n\t\t\t\tconst component = route.component\n\n\t\t\t\tif (!component || component === '') {\n\t\t\t\t\telement = null\n\t\t\t\t} else if (typeof component === 'string') {\n\t\t\t\t\ttry {\n\t\t\t\t\t\telement = document.createElement(component)\n\t\t\t\t\t} catch {\n\t\t\t\t\t\tconsole.error(`[${this.name}] Failed to create element:`, component)\n\t\t\t\t\t}\n\t\t\t\t} else if (component instanceof HTMLElement) {\n\t\t\t\t\telement = component\n\t\t\t\t} else if (typeof component === 'function') {\n\t\t\t\t\ttry {\n\t\t\t\t\t\telement = new (component as CustomElementConstructor)()\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tconsole.error(`[${this.name}] Failed to instantiate:`, e)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply properties\n\t\t\t\tif (element) {\n\t\t\t\t\tif (route.params) Object.assign(element, route.params)\n\t\t\t\t\tif (route.props) Object.assign(element, route.props)\n\t\t\t\t\tif (route.state) (element as any).state = route.state\n\t\t\t\t}\n\n\t\t\t\treturn { element, route }\n\t\t\t}),\n\n\t\t\tshareReplay(1),\n\n\t\t\t// Step 7: Swap components in DOM and update history\n\t\t\ttap(({ element, route }) => this.swapComponents(element, route)),\n\n\t\t\tcatchError(error => {\n\t\t\t\tconsole.error(`[${this.name}] Navigation error:`, error)\n\t\t\t\treturn EMPTY\n\t\t\t}),\n\n\t\t\ttakeUntil(this.disconnecting)\n\t\t)\n\t\t.subscribe()\n\t}\n\n\n\t/**\n\t * Swap components with animation\n\t */\n\tprivate swapComponents(newComponent: HTMLElement | null, routeAction: RouteAction) {\n\t\t// Find current routed component (not route definitions)\n\t\tconst oldComponent = Array.from(this.children).find(\n\t\t\tchild => !(child instanceof SchmancyRoute)\n\t\t) as HTMLElement | undefined\n\n\t\t// Clear if no new component\n\t\tif (!newComponent) {\n\t\t\toldComponent?.remove()\n\t\t\treturn\n\t\t}\n\n\t\t// Animate transition\n\t\tif (oldComponent) {\n\t\t\tconst fadeOut = oldComponent.animate([{ opacity: 1 }, { opacity: 0 }], { duration: 150, easing: 'ease-out' })\n\t\t\tfadeOut.onfinish = () => {\n\t\t\t\toldComponent.remove()\n\t\t\t\tthis.appendChild(newComponent)\n\t\t\t\tnewComponent.animate([{ opacity: 0 }, { opacity: 1 }], { duration: 150, easing: 'ease-in' })\n\t\t\t}\n\t\t} else {\n\t\t\tthis.appendChild(newComponent)\n\t\t\tnewComponent.animate([{ opacity: 0 }, { opacity: 1 }], { duration: 100, easing: 'ease-in' })\n\t\t}\n\n\t\t// Update area state\n\t\tconst activeRoute: ActiveRoute = {\n\t\t\tcomponent: newComponent.tagName.toLowerCase(),\n\t\t\tstate: routeAction.state || {},\n\t\t\tarea: this.name,\n\t\t\tparams: routeAction.params || {},\n\t\t\tprops: routeAction.props || {},\n\t\t}\n\n\t\tarea.current.set(this.name, activeRoute)\n\t\tarea.$current.next(area.current)\n\n\t\t// Update browser history\n\t\tif (area.enableHistoryMode) {\n\t\t\tarea._updateBrowserHistory(\n\t\t\t\tthis.name,\n\t\t\t\tactiveRoute,\n\t\t\t\trouteAction.historyStrategy || HISTORY_STRATEGY.push,\n\t\t\t\trouteAction.clearQueryParams\n\t\t\t)\n\t\t}\n\t}\n\n\tdisconnectedCallback() {\n\t\tsuper.disconnectedCallback()\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}\n"],"names":["routerHistory","Subject","FINDING_MORTIES","HERE_RICKY","areaSubjectsCache","WeakMap","AreaService","this","prettyURL","mode","request","ReplaySubject","current","Map","$current","enableHistoryMode","findingMortiesEvent","CustomEvent","disposed","isProcessingPopstate","next","subscribe","currentAreas","forEach","route","areaName","getOrCreateAreaSubject","initializeFromBrowserState","window","unloadSubscription","fromEvent","dispose","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","find","zip","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","currentPath","location","pathname","pathSegments","split","basePath","lastSegment","includes","pop","join","endsWith","queryString","urlParams","URLSearchParams","search","Array","isArray","param","delete","toString","mainArea","main","path","searchParams","String","query","cleanedAreas","cleanRoute","replace","encoded","encodeURIComponent","parseStateFromURL","decoded","decodeURIComponent","parsed","parse","event","bubbles","composed","name","areaSubject","clear","complete","unsubscribe","getInstance","instance","has","getActiveAreas","from","SchmancyRoute","$LitElement","css","constructor","super","arguments","exact","getConfig","when","guard","render","html","__decorateClass","property","type","prototype","Boolean","customElement","HISTORY_STRATEGY","SchmancyArea","firstUpdated","merge","take","matchingSegment","routes","some","seg","silent","default","stateData","action","matchedRoute","HTMLElement","tagName","toLowerCase","switchMap","guardResult","redirectEvent","blockedRoute","redirectTarget","async","module","identifier","element","document","createElement","assign","swapComponents","takeUntil","disconnecting","newComponent","oldComponent","children","child","remove","animate","opacity","duration","easing","onfinish","appendChild","activeRoute","_updateBrowserHistory","push","disconnectedCallback","queryAssignedElements","selector","flatten"],"mappings":"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"}
|
package/dist/boat-B7AKN6Ge.js
DELETED
|
@@ -1,276 +0,0 @@
|
|
|
1
|
-
import { fromEvent as l, race as z, merge as A } from "rxjs";
|
|
2
|
-
import { takeUntil as x, filter as R, tap as b, take as P, map as f, switchMap as D, finalize as Y } from "rxjs/operators";
|
|
3
|
-
import "lit/directives/class-map.js";
|
|
4
|
-
import "lit/directives/style-map.js";
|
|
5
|
-
import { property as y, state as g, customElement as I } from "lit/decorators.js";
|
|
6
|
-
import "./tailwind.mixin-xIIxrXd8.js";
|
|
7
|
-
import { $ as M } from "./litElement.mixin-BzbZQbxa.js";
|
|
8
|
-
import { css as X, html as u } from "lit";
|
|
9
|
-
import { createRef as $, ref as w } from "lit/directives/ref.js";
|
|
10
|
-
var _ = Object.defineProperty, F = Object.getOwnPropertyDescriptor, d = (t, e, s, i) => {
|
|
11
|
-
for (var n, o = i > 1 ? void 0 : i ? F(e, s) : e, a = t.length - 1; a >= 0; a--) (n = t[a]) && (o = (i ? n(e, s, o) : n(o)) || o);
|
|
12
|
-
return i && o && _(e, s, o), o;
|
|
13
|
-
};
|
|
14
|
-
let c = class extends M(X`
|
|
15
|
-
:host {
|
|
16
|
-
display: contents;
|
|
17
|
-
}
|
|
18
|
-
`) {
|
|
19
|
-
constructor() {
|
|
20
|
-
super(...arguments), this.id = "default", this.containerRef = $(), this.contentRef = $(), this.iconRef = $(), this.headerRef = $(), this.ANIMATION_CONFIG = { durations: { expand: 350, minimize: 250, hide: 200, content: 300 }, easing: { emphasized: "cubic-bezier(0.2, 0.0, 0, 1.0)", decelerate: "cubic-bezier(0.05, 0.7, 0.1, 1.0)", accelerate: "cubic-bezier(0.3, 0.0, 0.8, 0.15)", standard: "cubic-bezier(0.4, 0.0, 0.2, 1)" }, shadows: { fab: "0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 6px 10px 0px rgba(0, 0, 0, 0.14), 0px 1px 18px 0px rgba(0, 0, 0, 0.12)", fabLowered: "0px 1px 3px 0px rgba(0, 0, 0, 0.2), 0px 1px 1px 0px rgba(0, 0, 0, 0.14), 0px 2px 1px -1px rgba(0, 0, 0, 0.12)", expanded: "0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)" } }, this.currentState = "minimized", this.isContentVisible = !1, this.isAnimating = !1, this.isLowered = !1, this.isDragging = !1, this.position = { x: 16, y: 16 }, this.anchor = "bottom-right";
|
|
21
|
-
}
|
|
22
|
-
get state() {
|
|
23
|
-
return this.currentState;
|
|
24
|
-
}
|
|
25
|
-
set state(t) {
|
|
26
|
-
this.isAnimating || t === this.currentState || this.animateToState(t);
|
|
27
|
-
}
|
|
28
|
-
get lowered() {
|
|
29
|
-
return this.isLowered;
|
|
30
|
-
}
|
|
31
|
-
set lowered(t) {
|
|
32
|
-
this.isLowered = t, this.requestUpdate();
|
|
33
|
-
}
|
|
34
|
-
connectedCallback() {
|
|
35
|
-
super.connectedCallback(), typeof window < "u" && (l(window, "resize").pipe(x(this.disconnecting)).subscribe(() => {
|
|
36
|
-
this.currentState === "expanded" && this.updateExpandedWidth();
|
|
37
|
-
}), l(window, "keydown").pipe(R((t) => t.key === "Escape" && this.currentState !== "hidden"), b((t) => t.preventDefault()), x(this.disconnecting)).subscribe(() => {
|
|
38
|
-
this.currentState === "expanded" ? this.toggleState() : this.close();
|
|
39
|
-
}));
|
|
40
|
-
}
|
|
41
|
-
initializePosition() {
|
|
42
|
-
if (typeof window > "u") return;
|
|
43
|
-
const t = localStorage.getItem(`schmancy-boat-${this.id}`);
|
|
44
|
-
if (t) try {
|
|
45
|
-
const e = JSON.parse(t);
|
|
46
|
-
this.position = { x: e.x, y: e.y }, this.anchor = e.anchor;
|
|
47
|
-
} catch {
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
async animateToState(t) {
|
|
51
|
-
if (this.isAnimating || t === this.currentState) return;
|
|
52
|
-
const e = this.currentState;
|
|
53
|
-
this.isAnimating = !0;
|
|
54
|
-
try {
|
|
55
|
-
await this.performTransition(e, t), this.currentState = t, this.isContentVisible = t === "expanded", this.dispatchEvent(new CustomEvent("toggle", { detail: t, bubbles: !0, composed: !0 }));
|
|
56
|
-
} catch {
|
|
57
|
-
this.currentState = t, this.isContentVisible = t === "expanded";
|
|
58
|
-
} finally {
|
|
59
|
-
this.isAnimating = !1;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
async performTransition(t, e) {
|
|
63
|
-
if (this.currentAnimation?.cancel(), !this.containerRef.value) return;
|
|
64
|
-
e === "expanded" && (this.isContentVisible = !0);
|
|
65
|
-
const s = this.createAnimations(t, e);
|
|
66
|
-
s.container && (this.currentAnimation = s.container, await s.container.finished, e !== "expanded" && (this.isContentVisible = !1));
|
|
67
|
-
}
|
|
68
|
-
createAnimations(t, e) {
|
|
69
|
-
const s = this.containerRef.value, i = this.contentRef.value, n = this.iconRef.value, o = {};
|
|
70
|
-
if (!s) return o;
|
|
71
|
-
const a = this.ANIMATION_CONFIG, m = this.getStyleForState(t), h = this.getStyleForState(e);
|
|
72
|
-
if (o.container = e === "expanded" ? s.animate([m, h], { duration: a.durations.expand, easing: a.easing.decelerate, fill: "forwards" }) : s.animate([m, h], { duration: e === "hidden" ? a.durations.hide : a.durations.minimize, easing: a.easing.accelerate, fill: "forwards" }), i && t === "expanded" && e === "minimized" ? i.animate([{ opacity: 1, transform: "translateY(0)" }, { opacity: 0, transform: "translateY(-8px)" }], { duration: 150, easing: a.easing.standard, fill: "forwards" }) : i && e === "expanded" && i.animate([{ opacity: 0, transform: "translateY(8px)" }, { opacity: 1, transform: "translateY(0)" }], { duration: a.durations.content, easing: a.easing.standard, fill: "forwards" }), n) {
|
|
73
|
-
const p = e === "expanded";
|
|
74
|
-
(p || t === "expanded" && e === "minimized") && n.animate([{ transform: p ? "rotate(0deg)" : "rotate(180deg)" }, { transform: p ? "rotate(180deg)" : "rotate(0deg)" }], { duration: 250, easing: a.easing.emphasized, fill: "forwards" });
|
|
75
|
-
}
|
|
76
|
-
return o;
|
|
77
|
-
}
|
|
78
|
-
getStyleForState(t) {
|
|
79
|
-
const { shadows: e } = this.ANIMATION_CONFIG, s = { maxWidth: "300px", maxHeight: "auto", borderRadius: "16px" };
|
|
80
|
-
return { hidden: { ...s, opacity: "0", pointerEvents: "none", boxShadow: "none", backdropFilter: "none" }, minimized: { ...s, opacity: "1", pointerEvents: "auto", boxShadow: this.isLowered ? e.fabLowered : e.fab, backdropFilter: "none" }, expanded: { opacity: "1", pointerEvents: "auto", width: this.getResponsiveWidth(), maxWidth: "100%", maxHeight: "80vh", boxShadow: e.expanded, borderRadius: "8px 8px 0 0", backdropFilter: "blur(12px)" } }[t];
|
|
81
|
-
}
|
|
82
|
-
getResponsiveWidth() {
|
|
83
|
-
if (typeof window > "u") return "40vw";
|
|
84
|
-
const t = window.innerWidth;
|
|
85
|
-
return t < 768 ? "calc(100vw - 32px)" : t < 1024 ? "70vw" : t < 1280 ? "60vw" : "40vw";
|
|
86
|
-
}
|
|
87
|
-
updateExpandedWidth() {
|
|
88
|
-
const t = this.containerRef.value;
|
|
89
|
-
t && this.currentState === "expanded" && (t.style.width = this.getResponsiveWidth());
|
|
90
|
-
}
|
|
91
|
-
firstUpdated() {
|
|
92
|
-
this.initializePosition(), this.applyInitialStyles(), this.updateContainerPosition(), this.setupDragPipeline(), this.querySelector('[slot="header"]') && !this.icon && this.label;
|
|
93
|
-
}
|
|
94
|
-
applyInitialStyles() {
|
|
95
|
-
const t = this.containerRef.value, e = this.contentRef.value, s = this.iconRef.value;
|
|
96
|
-
if (t) {
|
|
97
|
-
const i = this.getStyleForState(this.currentState);
|
|
98
|
-
Object.assign(t.style, i), "webkitBackdropFilter" in t.style && (t.style.webkitBackdropFilter = i.backdropFilter);
|
|
99
|
-
}
|
|
100
|
-
e && (e.style.opacity = this.isContentVisible ? "1" : "0"), s && this.currentState === "expanded" && (s.style.transform = "rotate(180deg)");
|
|
101
|
-
}
|
|
102
|
-
toggleState() {
|
|
103
|
-
const t = this.currentState === "minimized" ? "expanded" : "minimized";
|
|
104
|
-
this.animateToState(t);
|
|
105
|
-
}
|
|
106
|
-
close() {
|
|
107
|
-
this.animateToState("hidden");
|
|
108
|
-
}
|
|
109
|
-
closeAndAddToNav() {
|
|
110
|
-
z(this.discover("schmancy-navigation-rail"), this.discover("schmancy-navigation-bar"), this.discover("schmancy-nav-drawer"), this.discover("app-navigation-rail"), this.discover("app-navigation-bar"), this.discover("app-nav-drawer")).pipe(P(1), b((t) => {
|
|
111
|
-
if (t && typeof t.addBoatItem == "function") {
|
|
112
|
-
const e = this.icon || (this.querySelector('[slot="header"]')?.querySelector("schmancy-icon")?.textContent?.trim() || "widgets"), s = this.label || (() => {
|
|
113
|
-
let o = this.querySelector('[slot="header"]')?.textContent?.trim() || "Boat";
|
|
114
|
-
return o.includes(e) && (o = o.replace(e, "").trim()), o || this.id;
|
|
115
|
-
})(), i = t.addBoatItem({ id: `boat-${this.id}`, title: s, icon: e });
|
|
116
|
-
if (i) {
|
|
117
|
-
const n = this.containerRef.value;
|
|
118
|
-
n ? n.animate([{ opacity: 1 }, { opacity: 0 }], { duration: 150, easing: "ease-out", fill: "forwards" }).finished.then(() => {
|
|
119
|
-
this.currentState = "hidden", this.isContentVisible = !1;
|
|
120
|
-
}) : (this.currentState = "hidden", this.isContentVisible = !1), l(i, "click").pipe(b(() => this.state = "expanded"), x(this.disconnecting)).subscribe();
|
|
121
|
-
}
|
|
122
|
-
} else this.close();
|
|
123
|
-
})).subscribe();
|
|
124
|
-
}
|
|
125
|
-
calculateDragPosition(t, e, s, i, n) {
|
|
126
|
-
const o = t - s, a = e - i, m = window.innerWidth, h = window.innerHeight, p = Math.max(0, Math.min(o, m - n.width)), v = Math.max(0, Math.min(a, h - n.height)), r = this.anchor.includes("right") ? m - (p + n.width) : p, S = this.anchor.includes("bottom") ? h - (v + n.height) : v;
|
|
127
|
-
return { x: Math.max(0, r), y: Math.max(0, S) };
|
|
128
|
-
}
|
|
129
|
-
savePosition() {
|
|
130
|
-
if (typeof window > "u") return;
|
|
131
|
-
const t = { x: this.position.x, y: this.position.y, anchor: this.anchor }, e = `schmancy-boat-${this.id}`;
|
|
132
|
-
localStorage.setItem(e, JSON.stringify(t));
|
|
133
|
-
}
|
|
134
|
-
setupDragPipeline() {
|
|
135
|
-
if (typeof window > "u") return;
|
|
136
|
-
const t = this.headerRef.value, e = this.containerRef.value;
|
|
137
|
-
if (!t || !e) return;
|
|
138
|
-
let s = !1;
|
|
139
|
-
A(l(t, "mousedown").pipe(R((i) => i.button === 0), b((i) => {
|
|
140
|
-
i.preventDefault(), i.stopPropagation();
|
|
141
|
-
}), f((i) => ({ clientX: i.clientX, clientY: i.clientY, type: "mouse" }))), l(t, "touchstart").pipe(f((i) => ({ clientX: i.touches[0].clientX, clientY: i.touches[0].clientY, type: "touch" })))).pipe(f(({ clientX: i, clientY: n, type: o }) => {
|
|
142
|
-
const a = e.getBoundingClientRect();
|
|
143
|
-
return s = !1, { startX: i, startY: n, offsetX: i - a.left, offsetY: n - a.top, initialRect: a, type: o };
|
|
144
|
-
})).pipe(D(({ startX: i, startY: n, offsetX: o, offsetY: a, initialRect: m, type: h }) => {
|
|
145
|
-
const p = h === "mouse" ? l(window, "mousemove").pipe(f((r) => ({ clientX: r.clientX, clientY: r.clientY }))) : l(window, "touchmove").pipe(f((r) => ({ clientX: r.touches[0].clientX, clientY: r.touches[0].clientY }))), v = l(window, h === "mouse" ? "mouseup" : "touchend");
|
|
146
|
-
return p.pipe(f(({ clientX: r, clientY: S }) => {
|
|
147
|
-
const k = r - i, C = S - n;
|
|
148
|
-
return Math.sqrt(k * k + C * C) > 5 && !s && (s = !0, this.isDragging = !0), s ? this.calculateDragPosition(r, S, o, a, m) : null;
|
|
149
|
-
}), R((r) => r !== null), b((r) => {
|
|
150
|
-
r && (this.position = r, this.updateContainerPosition());
|
|
151
|
-
}), x(v));
|
|
152
|
-
}), Y(() => {
|
|
153
|
-
s ? (this.updateAnchor(), this.savePosition()) : this.toggleState(), this.isDragging = !1, s = !1;
|
|
154
|
-
}), x(this.disconnecting)).subscribe();
|
|
155
|
-
}
|
|
156
|
-
updateContainerPosition() {
|
|
157
|
-
const t = this.containerRef.value;
|
|
158
|
-
t && (t.style.removeProperty("left"), t.style.removeProperty("right"), t.style.removeProperty("top"), t.style.removeProperty("bottom"), this.anchor.includes("right") ? t.style.right = `${this.position.x}px` : t.style.left = `${this.position.x}px`, this.anchor.includes("bottom") ? t.style.bottom = `${this.position.y}px` : t.style.top = `${this.position.y}px`);
|
|
159
|
-
}
|
|
160
|
-
updateAnchor() {
|
|
161
|
-
if (typeof window > "u") return;
|
|
162
|
-
const t = this.containerRef.value;
|
|
163
|
-
if (!t) return;
|
|
164
|
-
const e = t.getBoundingClientRect(), s = window.innerWidth, i = window.innerHeight, n = e.left > s / 2, o = e.top > i / 2, a = `${o ? "bottom" : "top"}-${n ? "right" : "left"}`;
|
|
165
|
-
a !== this.anchor && (this.position.x = n ? s - e.right : e.left, this.position.y = o ? i - e.bottom : e.top, this.anchor = a);
|
|
166
|
-
}
|
|
167
|
-
disconnectedCallback() {
|
|
168
|
-
super.disconnectedCallback(), this.currentAnimation?.cancel();
|
|
169
|
-
}
|
|
170
|
-
render() {
|
|
171
|
-
const t = this.currentState === "minimized" ? this.isLowered ? "1" : "3" : "4", e = this.currentState === "minimized", s = this.anchor.includes("bottom") ? this.anchor.includes("right") ? "bottom right" : "bottom left" : this.anchor.includes("right") ? "top right" : "top left", i = { "z-50": !0, fixed: !0, "overflow-y-auto": !0, flex: !0, "flex-col": !0, "select-none": !0, "will-change-transform": !0, "[contain:layout_style]": !0, "[transform:translate3d(0,0,0)]": !0, "[backface-visibility:hidden]": !0, "transition-shadow": !0, "opacity-95": this.isDragging, "shadow-[0_24px_48px_-8px_rgba(0,0,0,0.2),0_12px_24px_-4px_rgba(0,0,0,0.12)]": this.isDragging };
|
|
172
|
-
return u`
|
|
173
|
-
<div
|
|
174
|
-
class=${this.classMap(i)}
|
|
175
|
-
style="transform-origin: ${s}"
|
|
176
|
-
${w(this.containerRef)}
|
|
177
|
-
>
|
|
178
|
-
<!-- Header section -->
|
|
179
|
-
<section class="sticky top-0">
|
|
180
|
-
<schmancy-surface
|
|
181
|
-
elevation="${t}"
|
|
182
|
-
rounded="${e ? "none" : "top"}"
|
|
183
|
-
type="containerLowest"
|
|
184
|
-
>
|
|
185
|
-
<div
|
|
186
|
-
class="group sticky top-0 px-3 py-2 flex items-center justify-between gap-3 ${this.isDragging ? "cursor-grabbing" : "cursor-move"}"
|
|
187
|
-
${w(this.headerRef)}
|
|
188
|
-
title="Drag to move, double-click to toggle"
|
|
189
|
-
@dblclick=${(n) => {
|
|
190
|
-
n.preventDefault(), n.stopPropagation(), this.toggleState();
|
|
191
|
-
}}
|
|
192
|
-
>
|
|
193
|
-
<!-- Drag handle indicator -->
|
|
194
|
-
<div
|
|
195
|
-
class="flex items-center text-surface-onVariant opacity-40 transition-opacity duration-200 group-hover:opacity-100"
|
|
196
|
-
>
|
|
197
|
-
<schmancy-icon style="font-size: 20px">drag_indicator</schmancy-icon>
|
|
198
|
-
</div>
|
|
199
|
-
|
|
200
|
-
<!-- Header content - use properties if provided, else fallback to slot -->
|
|
201
|
-
<div
|
|
202
|
-
class="flex-1 min-w-fit items-center flex justify-start ${e ? "cursor-pointer" : ""}"
|
|
203
|
-
|
|
204
|
-
@dblclick=${(n) => {
|
|
205
|
-
e && (n.preventDefault(), n.stopPropagation(), this.state = "expanded");
|
|
206
|
-
}}
|
|
207
|
-
title="${e ? "Click to expand" : ""}"
|
|
208
|
-
>
|
|
209
|
-
${this.icon || this.label ? u`
|
|
210
|
-
<div
|
|
211
|
-
class="flex gap-2 items-center">
|
|
212
|
-
${this.icon ? u`<schmancy-icon>${this.icon}</schmancy-icon>` : ""}
|
|
213
|
-
${this.label ? u`<schmancy-typography type="title" token="md">${this.label}</schmancy-typography>` : ""}
|
|
214
|
-
${this.badge !== void 0 && this.badge !== null && this.badge !== "" ? u`<schmancy-badge>${this.badge}</schmancy-badge>` : ""}
|
|
215
|
-
</div>
|
|
216
|
-
` : u`<slot name="header"></slot>`}
|
|
217
|
-
</div>
|
|
218
|
-
|
|
219
|
-
<!-- Control buttons -->
|
|
220
|
-
<div class="flex items-center gap-1 flex-shrink-0">
|
|
221
|
-
${e ? u`
|
|
222
|
-
<!-- Expand button (when minimized) -->
|
|
223
|
-
<schmancy-icon-button
|
|
224
|
-
size="sm"
|
|
225
|
-
variant="text"
|
|
226
|
-
@click=${(n) => {
|
|
227
|
-
n.stopPropagation(), this.state = "expanded";
|
|
228
|
-
}}
|
|
229
|
-
title="Expand"
|
|
230
|
-
${w(this.iconRef)}
|
|
231
|
-
>
|
|
232
|
-
fullscreen
|
|
233
|
-
</schmancy-icon-button>
|
|
234
|
-
` : u`
|
|
235
|
-
<!-- Minimize button (when expanded) -->
|
|
236
|
-
<schmancy-icon-button
|
|
237
|
-
size="sm"
|
|
238
|
-
variant="filled tonal"
|
|
239
|
-
@click=${(n) => {
|
|
240
|
-
n.stopPropagation(), this.state = "minimized";
|
|
241
|
-
}}
|
|
242
|
-
title="Minimize"
|
|
243
|
-
${w(this.iconRef)}
|
|
244
|
-
>
|
|
245
|
-
close_fullscreen
|
|
246
|
-
</schmancy-icon-button>
|
|
247
|
-
`}
|
|
248
|
-
|
|
249
|
-
<!-- Close button -->
|
|
250
|
-
<schmancy-icon-button
|
|
251
|
-
size="sm"
|
|
252
|
-
@click=${(n) => {
|
|
253
|
-
n.stopPropagation(), this.closeAndAddToNav();
|
|
254
|
-
}}
|
|
255
|
-
title="Close and add to navigation"
|
|
256
|
-
>
|
|
257
|
-
remove
|
|
258
|
-
</schmancy-icon-button>
|
|
259
|
-
</div>
|
|
260
|
-
</div>
|
|
261
|
-
</schmancy-surface>
|
|
262
|
-
</section>
|
|
263
|
-
|
|
264
|
-
<!-- Content section -->
|
|
265
|
-
<schmancy-surface .hidden=${!this.isContentVisible} type="containerLow" class="flex-1" ${w(this.contentRef)}>
|
|
266
|
-
<slot></slot>
|
|
267
|
-
</schmancy-surface>
|
|
268
|
-
</div>
|
|
269
|
-
`;
|
|
270
|
-
}
|
|
271
|
-
};
|
|
272
|
-
d([y({ type: String, reflect: !0 })], c.prototype, "state", 1), d([y({ type: String })], c.prototype, "id", 2), d([y({ type: Boolean, reflect: !0 })], c.prototype, "lowered", 1), d([y({ type: String })], c.prototype, "icon", 2), d([y({ type: String })], c.prototype, "label", 2), d([y()], c.prototype, "badge", 2), d([g()], c.prototype, "currentState", 2), d([g()], c.prototype, "isContentVisible", 2), d([g()], c.prototype, "isAnimating", 2), d([g()], c.prototype, "isLowered", 2), d([g()], c.prototype, "isDragging", 2), d([g()], c.prototype, "position", 2), d([g()], c.prototype, "anchor", 2), c = d([I("schmancy-boat")], c);
|
|
273
|
-
export {
|
|
274
|
-
c as S
|
|
275
|
-
};
|
|
276
|
-
//# sourceMappingURL=boat-B7AKN6Ge.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"boat-B7AKN6Ge.js","sources":["../src/boat/boat.ts"],"sourcesContent":["import { $LitElement } from '@mixins/index'\nimport { css, html } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { createRef, ref, Ref } from 'lit/directives/ref.js'\nimport { fromEvent, merge, race } from 'rxjs'\nimport { filter, finalize, map, switchMap, take, takeUntil, tap } from 'rxjs/operators'\n\ntype BoatState = 'hidden' | 'minimized' | 'expanded'\n\ninterface Position {\n\tx: number\n\ty: number\n}\n\ninterface SavedPosition {\n\tx: number\n\ty: number\n\tanchor: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left'\n}\n\n@customElement('schmancy-boat')\nexport default class SchmancyBoat extends $LitElement(css`\n\t:host {\n\t\tdisplay: contents;\n\t}\n`) {\n\t@property({ type: String, reflect: true })\n\tget state(): BoatState {\n\t\treturn this.currentState\n\t}\n\tset state(value: BoatState) {\n\t\tif (this.isAnimating || value === this.currentState) return\n\t\tthis.animateToState(value)\n\t}\n\n\t@property({ type: String }) id: string = 'default'\n\n\t@property({ type: Boolean, reflect: true })\n\tget lowered(): boolean {\n\t\treturn this.isLowered\n\t}\n\tset lowered(value: boolean) {\n\t\tthis.isLowered = value\n\t\tthis.requestUpdate()\n\t}\n\n\t// New properties for simplified API\n\t@property({ type: String }) icon?: string\n\t@property({ type: String }) label?: string\n\t@property() badge?: string | number\n\n\t// Element references\n\tprivate containerRef: Ref<HTMLDivElement> = createRef()\n\tprivate contentRef: Ref<HTMLElement> = createRef()\n\tprivate iconRef: Ref<HTMLElement> = createRef()\n\tprivate headerRef: Ref<HTMLElement> = createRef()\n\n\t// Current animation reference\n\tprivate currentAnimation?: Animation\n\n\t// Animation configuration\n\tprivate readonly ANIMATION_CONFIG = {\n\t\tdurations: {\n\t\t\texpand: 350,\n\t\t\tminimize: 250,\n\t\t\thide: 200,\n\t\t\tcontent: 300,\n\t\t},\n\t\teasing: {\n\t\t\temphasized: 'cubic-bezier(0.2, 0.0, 0, 1.0)',\n\t\t\tdecelerate: 'cubic-bezier(0.05, 0.7, 0.1, 1.0)',\n\t\t\taccelerate: 'cubic-bezier(0.3, 0.0, 0.8, 0.15)',\n\t\t\tstandard: 'cubic-bezier(0.4, 0.0, 0.2, 1)',\n\t\t},\n\t\tshadows: {\n\t\t\tfab: '0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 6px 10px 0px rgba(0, 0, 0, 0.14), 0px 1px 18px 0px rgba(0, 0, 0, 0.12)',\n\t\t\tfabLowered:\n\t\t\t\t'0px 1px 3px 0px rgba(0, 0, 0, 0.2), 0px 1px 1px 0px rgba(0, 0, 0, 0.14), 0px 2px 1px -1px rgba(0, 0, 0, 0.12)',\n\t\t\texpanded: '0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)',\n\t\t},\n\t}\n\n\t// Reactive state for template\n\t@state() private currentState: BoatState = 'minimized'\n\t@state() private isContentVisible: boolean = false\n\t@state() private isAnimating: boolean = false\n\t@state() private isLowered: boolean = false\n\t@state() private isDragging: boolean = false\n\t@state() private position: Position = { x: 16, y: 16 }\n\t@state() private anchor: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left' = 'bottom-right'\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback()\n\n\t\tif (typeof window !== 'undefined') {\n\t\t\tfromEvent(window, 'resize')\n\t\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t\t.subscribe(() => {\n\t\t\t\t\tif (this.currentState === 'expanded') {\n\t\t\t\t\t\tthis.updateExpandedWidth()\n\t\t\t\t\t}\n\t\t\t\t})\n\n\t\t\t// Keyboard shortcut - Escape key\n\t\t\tfromEvent<KeyboardEvent>(window, 'keydown')\n\t\t\t\t.pipe(\n\t\t\t\t\tfilter(e => e.key === 'Escape' && this.currentState !== 'hidden'),\n\t\t\t\t\ttap(e => e.preventDefault()),\n\t\t\t\t\ttakeUntil(this.disconnecting),\n\t\t\t\t)\n\t\t\t\t.subscribe(() => {\n\t\t\t\t\tif (this.currentState === 'expanded') {\n\t\t\t\t\t\tthis.toggleState() // Minimize on Esc if expanded\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.close() // Hide on Esc if minimized\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t}\n\t}\n\n\tprivate initializePosition() {\n\t\tif (typeof window === 'undefined') return\n\n\t\tconst saved = localStorage.getItem(`schmancy-boat-${this.id}`)\n\n\t\tif (saved) {\n\t\t\ttry {\n\t\t\t\tconst parsed: SavedPosition = JSON.parse(saved)\n\t\t\t\tthis.position = { x: parsed.x, y: parsed.y }\n\t\t\t\tthis.anchor = parsed.anchor\n\t\t\t\tconsole.log('📍 Loaded position:', this.id, parsed)\n\t\t\t} catch (e) {\n\t\t\t\t// Use default position on parse error\n\t\t\t}\n\t\t}\n\t\t// If no saved position, use default from @state initialization\n\t}\n\n\tprivate async animateToState(targetState: BoatState) {\n\t\tif (this.isAnimating || targetState === this.currentState) return\n\n\t\tconst previousState = this.currentState\n\t\tthis.isAnimating = true\n\n\t\ttry {\n\t\t\tawait this.performTransition(previousState, targetState)\n\t\t\tthis.currentState = targetState\n\t\t\tthis.isContentVisible = targetState === 'expanded'\n\n\t\t\t// Dispatch event\n\t\t\tthis.dispatchEvent(\n\t\t\t\tnew CustomEvent('toggle', {\n\t\t\t\t\tdetail: targetState,\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true,\n\t\t\t\t}),\n\t\t\t)\n\t\t} catch (err) {\n\t\t\tconsole.warn('Animation error:', err)\n\t\t\tthis.currentState = targetState\n\t\t\tthis.isContentVisible = targetState === 'expanded'\n\t\t} finally {\n\t\t\tthis.isAnimating = false\n\t\t}\n\t}\n\n\t// Simplified animation transition\n\tprivate async performTransition(fromState: BoatState, toState: BoatState): Promise<void> {\n\t\tthis.currentAnimation?.cancel()\n\n\t\tconst container = this.containerRef.value\n\t\tif (!container) return\n\n\t\t// Update content visibility before expand\n\t\tif (toState === 'expanded') {\n\t\t\tthis.isContentVisible = true\n\t\t}\n\n\t\t// Create animations\n\t\tconst animations = this.createAnimations(fromState, toState)\n\n\t\t// Wait for main animation to complete\n\t\tif (animations.container) {\n\t\t\tthis.currentAnimation = animations.container\n\t\t\tawait animations.container.finished\n\n\t\t\t// Hide content after minimize\n\t\t\tif (toState !== 'expanded') {\n\t\t\t\tthis.isContentVisible = false\n\t\t\t}\n\t\t}\n\t}\n\n\t// Create animations for state transition\n\tprivate createAnimations(fromState: BoatState, toState: BoatState) {\n\t\tconst container = this.containerRef.value\n\t\tconst content = this.contentRef.value\n\t\tconst icon = this.iconRef.value\n\t\tconst animations: { container?: Animation; content?: Animation; icon?: Animation } = {}\n\n\t\tif (!container) return animations\n\n\t\tconst config = this.ANIMATION_CONFIG\n\t\tconst fromStyles = this.getStyleForState(fromState)\n\t\tconst toStyles = this.getStyleForState(toState)\n\n\t\t// Container animation\n\t\tif (toState === 'expanded') {\n\t\t\t// Expand animation without transform\n\t\t\tanimations.container = container.animate([fromStyles, toStyles], {\n\t\t\t\tduration: config.durations.expand,\n\t\t\t\teasing: config.easing.decelerate,\n\t\t\t\tfill: 'forwards',\n\t\t\t})\n\t\t} else {\n\t\t\tanimations.container = container.animate([fromStyles, toStyles], {\n\t\t\t\tduration: toState === 'hidden' ? config.durations.hide : config.durations.minimize,\n\t\t\t\teasing: config.easing.accelerate,\n\t\t\t\tfill: 'forwards',\n\t\t\t})\n\t\t}\n\n\t\t// Content animation (only for expand/minimize transitions)\n\t\tif (content && fromState === 'expanded' && toState === 'minimized') {\n\t\t\t// Fade out content before minimizing\n\t\t\tcontent.animate(\n\t\t\t\t[\n\t\t\t\t\t{ opacity: 1, transform: 'translateY(0)' },\n\t\t\t\t\t{ opacity: 0, transform: 'translateY(-8px)' },\n\t\t\t\t],\n\t\t\t\t{\n\t\t\t\t\tduration: 150,\n\t\t\t\t\teasing: config.easing.standard,\n\t\t\t\t\tfill: 'forwards',\n\t\t\t\t},\n\t\t\t)\n\t\t} else if (content && toState === 'expanded') {\n\t\t\t// Fade in content when expanding\n\t\t\tcontent.animate(\n\t\t\t\t[\n\t\t\t\t\t{ opacity: 0, transform: 'translateY(8px)' },\n\t\t\t\t\t{ opacity: 1, transform: 'translateY(0)' },\n\t\t\t\t],\n\t\t\t\t{\n\t\t\t\t\tduration: config.durations.content,\n\t\t\t\t\teasing: config.easing.standard,\n\t\t\t\t\tfill: 'forwards',\n\t\t\t\t},\n\t\t\t)\n\t\t}\n\n\t\t// Icon rotation animation\n\t\tif (icon) {\n\t\t\tconst isExpanding = toState === 'expanded'\n\t\t\tconst isCollapsing = fromState === 'expanded' && toState === 'minimized'\n\n\t\t\tif (isExpanding || isCollapsing) {\n\t\t\t\ticon.animate(\n\t\t\t\t\t[\n\t\t\t\t\t\t{ transform: isExpanding ? 'rotate(0deg)' : 'rotate(180deg)' },\n\t\t\t\t\t\t{ transform: isExpanding ? 'rotate(180deg)' : 'rotate(0deg)' },\n\t\t\t\t\t],\n\t\t\t\t\t{\n\t\t\t\t\t\tduration: 250,\n\t\t\t\t\t\teasing: config.easing.emphasized,\n\t\t\t\t\t\tfill: 'forwards',\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\n\t\treturn animations\n\t}\n\n\t// Get styles for a specific state\n\tprivate getStyleForState(state: BoatState): Keyframe {\n\t\tconst { shadows } = this.ANIMATION_CONFIG\n\t\tconst baseStyles = {\n\t\t\tmaxWidth: '300px',\n\t\t\tmaxHeight: 'auto',\n\t\t\tborderRadius: '16px',\n\t\t}\n\n\t\tconst stateStyles: Record<BoatState, Keyframe> = {\n\t\t\thidden: {\n\t\t\t\t...baseStyles,\n\t\t\t\topacity: '0',\n\t\t\t\tpointerEvents: 'none',\n\t\t\t\tboxShadow: 'none',\n\t\t\t\tbackdropFilter: 'none',\n\t\t\t},\n\t\t\tminimized: {\n\t\t\t\t...baseStyles,\n\t\t\t\topacity: '1',\n\t\t\t\tpointerEvents: 'auto',\n\t\t\t\tboxShadow: this.isLowered ? shadows.fabLowered : shadows.fab,\n\t\t\t\tbackdropFilter: 'none',\n\t\t\t},\n\t\t\texpanded: {\n\t\t\t\topacity: '1',\n\t\t\t\tpointerEvents: 'auto',\n\t\t\t\twidth: this.getResponsiveWidth(),\n\t\t\t\tmaxWidth: '100%',\n\t\t\t\tmaxHeight: '80vh',\n\t\t\t\tboxShadow: shadows.expanded,\n\t\t\t\tborderRadius: '8px 8px 0 0',\n\t\t\t\tbackdropFilter: 'blur(12px)',\n\t\t\t},\n\t\t}\n\n\t\treturn stateStyles[state] as Keyframe\n\t}\n\n\t// Calculate responsive width based on viewport\n\tprivate getResponsiveWidth(): string {\n\t\tif (typeof window === 'undefined') return '40vw'\n\n\t\tconst vw = window.innerWidth\n\t\tif (vw < 768) return 'calc(100vw - 32px)'\n\t\tif (vw < 1024) return '70vw'\n\t\tif (vw < 1280) return '60vw'\n\t\treturn '40vw'\n\t}\n\n\t// Update expanded width on window resize\n\tprivate updateExpandedWidth() {\n\t\tconst container = this.containerRef.value\n\t\tif (container && this.currentState === 'expanded') {\n\t\t\tcontainer.style.width = this.getResponsiveWidth()\n\t\t}\n\t}\n\n\tfirstUpdated() {\n\t\tthis.initializePosition()\n\t\tthis.applyInitialStyles()\n\t\tthis.updateContainerPosition()\n\t\tthis.setupDragPipeline()\n\n\t\t// Check for deprecated header slot usage\n\t\tconst hasHeaderSlot = this.querySelector('[slot=\"header\"]')\n\t\tif (hasHeaderSlot && !this.icon && !this.label) {\n\t\t\tconsole.warn(\n\t\t\t\t'[schmancy-boat] Using slot=\"header\" is deprecated. ' +\n\t\t\t\t\t'Please use the icon, label, and badge properties instead. ' +\n\t\t\t\t\t'Example: <schmancy-boat icon=\"info\" label=\"Title\" badge=\"5\">',\n\t\t\t)\n\t\t}\n\t}\n\n\t// Apply initial styles to elements\n\tprivate applyInitialStyles() {\n\t\tconst container = this.containerRef.value\n\t\tconst content = this.contentRef.value\n\t\tconst icon = this.iconRef.value\n\n\t\tif (container) {\n\t\t\tconst initialStyle = this.getStyleForState(this.currentState)\n\t\t\tObject.assign(container.style, initialStyle)\n\n\t\t\t// Safari compatibility for backdrop filter\n\t\t\tif ('webkitBackdropFilter' in container.style) {\n\t\t\t\t;(container.style as any).webkitBackdropFilter = initialStyle.backdropFilter\n\t\t\t}\n\t\t}\n\n\t\t// Set initial content opacity\n\t\tif (content) {\n\t\t\tcontent.style.opacity = this.isContentVisible ? '1' : '0'\n\t\t}\n\n\t\t// Set initial icon rotation\n\t\tif (icon && this.currentState === 'expanded') {\n\t\t\ticon.style.transform = 'rotate(180deg)'\n\t\t}\n\t}\n\n\t// Public method to toggle between minimized and expanded\n\ttoggleState() {\n\t\tconst newState = this.currentState === 'minimized' ? 'expanded' : 'minimized'\n\t\tthis.animateToState(newState)\n\t}\n\n\t// Public method to close (hide) the boat\n\tclose() {\n\t\tthis.animateToState('hidden')\n\t}\n\n\tprivate closeAndAddToNav() {\n\t\trace(\n\t\t\tthis.discover<any>('schmancy-navigation-rail'),\n\t\t\tthis.discover<any>('schmancy-navigation-bar'),\n\t\t\tthis.discover<any>('schmancy-nav-drawer'),\n\t\t\tthis.discover<any>('app-navigation-rail'),\n\t\t\tthis.discover<any>('app-navigation-bar'),\n\t\t\tthis.discover<any>('app-nav-drawer'),\n\t\t)\n\t\t\t.pipe(\n\t\t\t\ttake(1),\n\t\t\t\ttap(navComponent => {\n\t\t\t\t\tif (navComponent && typeof navComponent.addBoatItem === 'function') {\n\t\t\t\t\t\t// Use properties first, fall back to slot parsing\n\t\t\t\t\t\tconst icon =\n\t\t\t\t\t\t\tthis.icon ||\n\t\t\t\t\t\t\t(() => {\n\t\t\t\t\t\t\t\tconst headerSlot = this.querySelector('[slot=\"header\"]')\n\t\t\t\t\t\t\t\tconst iconElement = headerSlot?.querySelector('schmancy-icon')\n\t\t\t\t\t\t\t\treturn iconElement?.textContent?.trim() || 'widgets'\n\t\t\t\t\t\t\t})()\n\n\t\t\t\t\t\tconst label =\n\t\t\t\t\t\t\tthis.label ||\n\t\t\t\t\t\t\t(() => {\n\t\t\t\t\t\t\t\tconst headerSlot = this.querySelector('[slot=\"header\"]')\n\t\t\t\t\t\t\t\tlet title = headerSlot?.textContent?.trim() || 'Boat'\n\t\t\t\t\t\t\t\tif (icon && title.includes(icon)) {\n\t\t\t\t\t\t\t\t\ttitle = title.replace(icon, '').trim()\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn title || this.id\n\t\t\t\t\t\t\t})()\n\n\t\t\t\t\t\t// Add the boat to navigation\n\t\t\t\t\t\tconst navItem = navComponent.addBoatItem({\n\t\t\t\t\t\t\tid: `boat-${this.id}`,\n\t\t\t\t\t\t\ttitle: label,\n\t\t\t\t\t\t\ticon: icon,\n\t\t\t\t\t\t})\n\n\t\t\t\t\t\tif (navItem) {\n\t\t\t\t\t\t\t// Simple fade out then hide\n\t\t\t\t\t\t\tconst container = this.containerRef.value\n\t\t\t\t\t\t\tif (container) {\n\t\t\t\t\t\t\t\tcontainer\n\t\t\t\t\t\t\t\t\t.animate([{ opacity: 1 }, { opacity: 0 }], { duration: 150, easing: 'ease-out', fill: 'forwards' })\n\t\t\t\t\t\t\t\t\t.finished.then(() => {\n\t\t\t\t\t\t\t\t\t\tthis.currentState = 'hidden'\n\t\t\t\t\t\t\t\t\t\tthis.isContentVisible = false\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.currentState = 'hidden'\n\t\t\t\t\t\t\t\tthis.isContentVisible = false\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Set up click listener to reopen - using RxJS pattern\n\t\t\t\t\t\t\tfromEvent(navItem, 'click')\n\t\t\t\t\t\t\t\t.pipe(\n\t\t\t\t\t\t\t\t\ttap(() => (this.state = 'expanded')),\n\t\t\t\t\t\t\t\t\ttakeUntil(this.disconnecting),\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t.subscribe()\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// No nav component found, just hide\n\t\t\t\t\t\tthis.close()\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t)\n\t\t\t.subscribe()\n\t}\n\n\tprivate calculateDragPosition(\n\t\tclientX: number,\n\t\tclientY: number,\n\t\toffsetX: number,\n\t\toffsetY: number,\n\t\tinitialRect: DOMRect,\n\t): Position {\n\t\tconst targetLeft = clientX - offsetX\n\t\tconst targetTop = clientY - offsetY\n\t\tconst vw = window.innerWidth\n\t\tconst vh = window.innerHeight\n\t\tconst clampedLeft = Math.max(0, Math.min(targetLeft, vw - initialRect.width))\n\t\tconst clampedTop = Math.max(0, Math.min(targetTop, vh - initialRect.height))\n\n\t\tconst newX = this.anchor.includes('right') ? vw - (clampedLeft + initialRect.width) : clampedLeft\n\n\t\tconst newY = this.anchor.includes('bottom') ? vh - (clampedTop + initialRect.height) : clampedTop\n\n\t\treturn { x: Math.max(0, newX), y: Math.max(0, newY) }\n\t}\n\n\tprivate savePosition() {\n\t\tif (typeof window === 'undefined') return\n\n\t\tconst toSave: SavedPosition = {\n\t\t\tx: this.position.x,\n\t\t\ty: this.position.y,\n\t\t\tanchor: this.anchor,\n\t\t}\n\t\tconst key = `schmancy-boat-${this.id}`\n\t\tlocalStorage.setItem(key, JSON.stringify(toSave))\n\t\tconsole.log('💾 Saved position:', key, toSave)\n\t}\n\n\tprivate setupDragPipeline() {\n\t\tif (typeof window === 'undefined') return\n\n\t\tconst header = this.headerRef.value\n\t\tconst container = this.containerRef.value\n\t\tif (!header || !container) return\n\n\t\tlet hasDragged = false\n\t\tconst DRAG_THRESHOLD = 5\n\n\t\t// Merge mouse and touch start events\n\t\tmerge(\n\t\t\tfromEvent<MouseEvent>(header, 'mousedown').pipe(\n\t\t\t\tfilter(e => e.button === 0),\n\t\t\t\ttap(e => {\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\te.stopPropagation()\n\t\t\t\t}),\n\t\t\t\tmap(e => ({\n\t\t\t\t\tclientX: e.clientX,\n\t\t\t\t\tclientY: e.clientY,\n\t\t\t\t\ttype: 'mouse' as const,\n\t\t\t\t})),\n\t\t\t),\n\t\t\tfromEvent<TouchEvent>(header, 'touchstart').pipe(\n\t\t\t\tmap(e => ({\n\t\t\t\t\tclientX: e.touches[0].clientX,\n\t\t\t\t\tclientY: e.touches[0].clientY,\n\t\t\t\t\ttype: 'touch' as const,\n\t\t\t\t})),\n\t\t\t),\n\t\t)\n\t\t\t.pipe(\n\t\t\t\tmap(({ clientX, clientY, type }) => {\n\t\t\t\t\tconst rect = container.getBoundingClientRect()\n\t\t\t\t\thasDragged = false\n\t\t\t\t\treturn {\n\t\t\t\t\t\tstartX: clientX,\n\t\t\t\t\t\tstartY: clientY,\n\t\t\t\t\t\toffsetX: clientX - rect.left,\n\t\t\t\t\t\toffsetY: clientY - rect.top,\n\t\t\t\t\t\tinitialRect: rect,\n\t\t\t\t\t\ttype,\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t)\n\t\t\t.pipe(\n\t\t\t\tswitchMap(({ startX, startY, offsetX, offsetY, initialRect, type }) => {\n\t\t\t\t\tconst move$ =\n\t\t\t\t\t\ttype === 'mouse'\n\t\t\t\t\t\t\t? fromEvent<MouseEvent>(window, 'mousemove').pipe(map(e => ({ clientX: e.clientX, clientY: e.clientY })))\n\t\t\t\t\t\t\t: fromEvent<TouchEvent>(window, 'touchmove').pipe(\n\t\t\t\t\t\t\t\t\tmap(e => ({ clientX: e.touches[0].clientX, clientY: e.touches[0].clientY })),\n\t\t\t\t\t\t\t\t)\n\n\t\t\t\t\tconst end$ = type === 'mouse' ? fromEvent(window, 'mouseup') : fromEvent(window, 'touchend')\n\n\t\t\t\t\treturn move$.pipe(\n\t\t\t\t\t\tmap(({ clientX, clientY }) => {\n\t\t\t\t\t\t\tconst deltaX = clientX - startX\n\t\t\t\t\t\t\tconst deltaY = clientY - startY\n\t\t\t\t\t\t\tconst distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY)\n\n\t\t\t\t\t\t\tif (distance > DRAG_THRESHOLD && !hasDragged) {\n\t\t\t\t\t\t\t\thasDragged = true\n\t\t\t\t\t\t\t\tthis.isDragging = true\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (!hasDragged) return null\n\n\t\t\t\t\t\t\treturn this.calculateDragPosition(clientX, clientY, offsetX, offsetY, initialRect)\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tfilter(position => position !== null),\n\t\t\t\t\t\ttap(position => {\n\t\t\t\t\t\t\tif (position) {\n\t\t\t\t\t\t\t\tthis.position = position\n\t\t\t\t\t\t\t\tthis.updateContainerPosition()\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}),\n\t\t\t\t\t\ttakeUntil(end$),\n\t\t\t\t\t)\n\t\t\t\t}),\n\t\t\t\tfinalize(() => {\n\t\t\t\t\tif (hasDragged) {\n\t\t\t\t\t\tthis.updateAnchor()\n\t\t\t\t\t\tthis.savePosition()\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.toggleState()\n\t\t\t\t\t}\n\t\t\t\t\tthis.isDragging = false\n\t\t\t\t\thasDragged = false\n\t\t\t\t}),\n\t\t\t\ttakeUntil(this.disconnecting),\n\t\t\t)\n\t\t\t.subscribe()\n\t}\n\n\t// Update container position based on anchor and position values\n\tprivate updateContainerPosition() {\n\t\tconst container = this.containerRef.value\n\t\tif (!container) return\n\n\t\t// Reset all position styles\n\t\tcontainer.style.removeProperty('left')\n\t\tcontainer.style.removeProperty('right')\n\t\tcontainer.style.removeProperty('top')\n\t\tcontainer.style.removeProperty('bottom')\n\n\t\t// Apply new position based on anchor\n\t\tif (this.anchor.includes('right')) {\n\t\t\tcontainer.style.right = `${this.position.x}px`\n\t\t} else {\n\t\t\tcontainer.style.left = `${this.position.x}px`\n\t\t}\n\n\t\tif (this.anchor.includes('bottom')) {\n\t\t\tcontainer.style.bottom = `${this.position.y}px`\n\t\t} else {\n\t\t\tcontainer.style.top = `${this.position.y}px`\n\t\t}\n\t}\n\n\t// Update anchor based on current position\n\tprivate updateAnchor() {\n\t\tif (typeof window === 'undefined') return\n\n\t\tconst container = this.containerRef.value\n\t\tif (!container) return\n\n\t\tconst rect = container.getBoundingClientRect()\n\t\tconst vw = window.innerWidth\n\t\tconst vh = window.innerHeight\n\n\t\tconst isRight = rect.left > vw / 2\n\t\tconst isBottom = rect.top > vh / 2\n\n\t\tconst newAnchor = `${isBottom ? 'bottom' : 'top'}-${isRight ? 'right' : 'left'}` as typeof this.anchor\n\n\t\tif (newAnchor !== this.anchor) {\n\t\t\t// Calculate new position values for the new anchor\n\t\t\tif (isRight) {\n\t\t\t\tthis.position.x = vw - rect.right\n\t\t\t} else {\n\t\t\t\tthis.position.x = rect.left\n\t\t\t}\n\n\t\t\tif (isBottom) {\n\t\t\t\tthis.position.y = vh - rect.bottom\n\t\t\t} else {\n\t\t\t\tthis.position.y = rect.top\n\t\t\t}\n\n\t\t\tthis.anchor = newAnchor\n\t\t}\n\t}\n\n\t// Cleanup on component disconnect\n\tdisconnectedCallback() {\n\t\tsuper.disconnectedCallback()\n\t\tthis.currentAnimation?.cancel()\n\t}\n\n\tprotected render(): unknown {\n\t\tconst surfaceElevation = this.currentState === 'minimized' ? (this.isLowered ? '1' : '3') : '4'\n\t\tconst isMinimized = this.currentState === 'minimized'\n\n\t\t// Set transform origin based on anchor for proper expansion\n\t\tconst transformOrigin = this.anchor.includes('bottom')\n\t\t\t? this.anchor.includes('right')\n\t\t\t\t? 'bottom right'\n\t\t\t\t: 'bottom left'\n\t\t\t: this.anchor.includes('right')\n\t\t\t\t? 'top right'\n\t\t\t\t: 'top left'\n\n\t\tconst containerClasses = {\n\t\t\t'z-50': true,\n\t\t\tfixed: true,\n\t\t\t'overflow-y-auto': true,\n\t\t\tflex: true,\n\t\t\t'flex-col': true,\n\t\t\t'select-none': true,\n\t\t\t'will-change-transform': true,\n\t\t\t'[contain:layout_style]': true,\n\t\t\t'[transform:translate3d(0,0,0)]': true,\n\t\t\t'[backface-visibility:hidden]': true,\n\t\t\t'transition-shadow': true,\n\t\t\t'opacity-95': this.isDragging,\n\t\t\t'shadow-[0_24px_48px_-8px_rgba(0,0,0,0.2),0_12px_24px_-4px_rgba(0,0,0,0.12)]': this.isDragging,\n\t\t}\n\n\t\treturn html`\n\t\t\t<div\n\t\t\t\tclass=${this.classMap(containerClasses)}\n\t\t\t\tstyle=\"transform-origin: ${transformOrigin}\"\n\t\t\t\t${ref(this.containerRef)}\n\t\t\t>\n\t\t\t\t<!-- Header section -->\n\t\t\t\t<section class=\"sticky top-0\">\n\t\t\t\t\t<schmancy-surface\n\t\t\t\t\t\televation=\"${surfaceElevation}\"\n\t\t\t\t\t\trounded=\"${isMinimized ? 'none' : 'top'}\"\n\t\t\t\t\t\ttype=\"containerLowest\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclass=\"group sticky top-0 px-3 py-2 flex items-center justify-between gap-3 ${this.isDragging\n\t\t\t\t\t\t\t\t? 'cursor-grabbing'\n\t\t\t\t\t\t\t\t: 'cursor-move'}\"\n\t\t\t\t\t\t\t${ref(this.headerRef)}\n\t\t\t\t\t\t\ttitle=\"Drag to move, double-click to toggle\"\n\t\t\t\t\t\t\t@dblclick=${(e: Event) => {\n\t\t\t\t\t\t\t\te.preventDefault()\n\t\t\t\t\t\t\t\te.stopPropagation()\n\t\t\t\t\t\t\t\tthis.toggleState()\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<!-- Drag handle indicator -->\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclass=\"flex items-center text-surface-onVariant opacity-40 transition-opacity duration-200 group-hover:opacity-100\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<schmancy-icon style=\"font-size: 20px\">drag_indicator</schmancy-icon>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<!-- Header content - use properties if provided, else fallback to slot -->\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclass=\"flex-1 min-w-fit items-center flex justify-start ${isMinimized ? 'cursor-pointer' : ''}\"\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t@dblclick=${(e: Event) => {\n\t\t\t\t\t\t\t\t\tif (isMinimized) {\n\t\t\t\t\t\t\t\t\t\te.preventDefault()\n\t\t\t\t\t\t\t\t\t\te.stopPropagation()\n\t\t\t\t\t\t\t\t\t\tthis.state = 'expanded'\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\ttitle=\"${isMinimized ? 'Click to expand' : ''}\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t${this.icon || this.label\n\t\t\t\t\t\t\t\t\t? html`\n\t\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tclass=\"flex gap-2 items-center\">\n\t\t\t\t\t\t\t\t\t\t\t\t${this.icon ? html`<schmancy-icon>${this.icon}</schmancy-icon>` : ''}\n\t\t\t\t\t\t\t\t\t\t\t\t${this.label\n\t\t\t\t\t\t\t\t\t\t\t\t\t? html`<schmancy-typography type=\"title\" token=\"md\">${this.label}</schmancy-typography>`\n\t\t\t\t\t\t\t\t\t\t\t\t\t: ''}\n\t\t\t\t\t\t\t\t\t\t\t\t${this.badge !== undefined && this.badge !== null && this.badge !== ''\n\t\t\t\t\t\t\t\t\t\t\t\t\t? html`<schmancy-badge>${this.badge}</schmancy-badge>`\n\t\t\t\t\t\t\t\t\t\t\t\t\t: ''}\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t`\n\t\t\t\t\t\t\t\t\t: html`<slot name=\"header\"></slot>`}\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<!-- Control buttons -->\n\t\t\t\t\t\t\t<div class=\"flex items-center gap-1 flex-shrink-0\">\n\t\t\t\t\t\t\t\t${isMinimized\n\t\t\t\t\t\t\t\t\t? html`\n\t\t\t\t\t\t\t\t\t\t\t<!-- Expand button (when minimized) -->\n\t\t\t\t\t\t\t\t\t\t\t<schmancy-icon-button\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"text\"\n\t\t\t\t\t\t\t\t\t\t\t\t@click=${(e: Event) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\te.stopPropagation()\n\t\t\t\t\t\t\t\t\t\t\t\t\tthis.state = 'expanded'\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\ttitle=\"Expand\"\n\t\t\t\t\t\t\t\t\t\t\t\t${ref(this.iconRef)}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\tfullscreen\n\t\t\t\t\t\t\t\t\t\t\t</schmancy-icon-button>\n\t\t\t\t\t\t\t\t\t\t`\n\t\t\t\t\t\t\t\t\t: html`\n\t\t\t\t\t\t\t\t\t\t\t<!-- Minimize button (when expanded) -->\n\t\t\t\t\t\t\t\t\t\t\t<schmancy-icon-button\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"filled tonal\"\n\t\t\t\t\t\t\t\t\t\t\t\t@click=${(e: Event) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\te.stopPropagation()\n\t\t\t\t\t\t\t\t\t\t\t\t\tthis.state = 'minimized'\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\ttitle=\"Minimize\"\n\t\t\t\t\t\t\t\t\t\t\t\t${ref(this.iconRef)}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\tclose_fullscreen\n\t\t\t\t\t\t\t\t\t\t\t</schmancy-icon-button>\n\t\t\t\t\t\t\t\t\t\t`}\n\n\t\t\t\t\t\t\t\t<!-- Close button -->\n\t\t\t\t\t\t\t\t<schmancy-icon-button\n\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t@click=${(e: Event) => {\n\t\t\t\t\t\t\t\t\t\te.stopPropagation()\n\t\t\t\t\t\t\t\t\t\tthis.closeAndAddToNav()\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\ttitle=\"Close and add to navigation\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tremove\n\t\t\t\t\t\t\t\t</schmancy-icon-button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</schmancy-surface>\n\t\t\t\t</section>\n\n\t\t\t\t<!-- Content section -->\n\t\t\t\t<schmancy-surface .hidden=${!this.isContentVisible} type=\"containerLow\" class=\"flex-1\" ${ref(this.contentRef)}>\n\t\t\t\t\t<slot></slot>\n\t\t\t\t</schmancy-surface>\n\t\t\t</div>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-boat': SchmancyBoat\n\t}\n}\n"],"names":["SchmancyBoat","$LitElement","css","super","arguments","this","id","containerRef","createRef","contentRef","iconRef","headerRef","ANIMATION_CONFIG","durations","expand","minimize","hide","content","easing","emphasized","decelerate","accelerate","standard","shadows","fab","fabLowered","expanded","currentState","isContentVisible","isAnimating","isLowered","isDragging","position","x","y","anchor","state","value","animateToState","lowered","requestUpdate","connectedCallback","window","fromEvent","pipe","takeUntil","disconnecting","subscribe","updateExpandedWidth","filter","e","key","tap","preventDefault","toggleState","close","initializePosition","saved","localStorage","getItem","parsed","JSON","parse","targetState","previousState","performTransition","dispatchEvent","CustomEvent","detail","bubbles","composed","fromState","toState","currentAnimation","cancel","animations","createAnimations","container","finished","icon","config","fromStyles","getStyleForState","toStyles","animate","duration","fill","opacity","transform","isExpanding","baseStyles","maxWidth","maxHeight","borderRadius","hidden","pointerEvents","boxShadow","backdropFilter","minimized","width","getResponsiveWidth","vw","innerWidth","style","applyInitialStyles","updateContainerPosition","setupDragPipeline","querySelector","label","initialStyle","Object","assign","webkitBackdropFilter","newState","race","discover","take","navComponent","addBoatItem","textContent","trim","title","includes","replace","navItem","then","clientX","clientY","offsetX","offsetY","initialRect","targetLeft","targetTop","vh","innerHeight","clampedLeft","Math","max","min","clampedTop","height","newX","newY","toSave","setItem","stringify","header","hasDragged","merge","button","stopPropagation","map","type","touches","rect","getBoundingClientRect","startX","startY","left","top","switchMap","move$","end$","deltaX","deltaY","sqrt","calculateDragPosition","finalize","updateAnchor","savePosition","removeProperty","right","bottom","isRight","isBottom","newAnchor","disconnectedCallback","render","surfaceElevation","isMinimized","transformOrigin","containerClasses","fixed","flex","html","classMap","ref","badge","closeAndAddToNav","__decorateClass","property","String","reflect","prototype","Boolean","customElement"],"mappings":"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"}
|