@mhmo91/schmancy 0.10.19 → 0.10.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/custom-elements.json +0 -62
- package/dist/agent/{overlay.confirm-body-D3jQyXgA.js → overlay.confirm-body-DXus8d-w.js} +1 -1
- package/dist/agent/{overlay.confirm-body-D3jQyXgA.js.map → overlay.confirm-body-DXus8d-w.js.map} +1 -1
- package/dist/agent/schmancy.agent.js +2043 -2083
- package/dist/agent/schmancy.agent.js.map +1 -1
- package/dist/agent/schmancy.manifest.json +1 -48
- package/dist/area-Cbkt0NX4.cjs +21 -0
- package/dist/area-Cbkt0NX4.cjs.map +1 -0
- package/dist/{area-BIipuSyO.js → area-Ddk7P5wD.js} +101 -131
- package/dist/area-Ddk7P5wD.js.map +1 -0
- package/dist/area.cjs +1 -1
- package/dist/area.js +1 -1
- package/dist/{autocomplete-B8CE5vGw.cjs → autocomplete-CfBFDSc3.cjs} +1 -1
- package/dist/{autocomplete-B8CE5vGw.cjs.map → autocomplete-CfBFDSc3.cjs.map} +1 -1
- package/dist/{autocomplete-Mrb3koUN.js → autocomplete-Ds3Q2cwR.js} +2 -2
- package/dist/{autocomplete-Mrb3koUN.js.map → autocomplete-Ds3Q2cwR.js.map} +1 -1
- package/dist/autocomplete.cjs +1 -1
- package/dist/autocomplete.js +1 -1
- package/dist/avatar.cjs +1 -1
- package/dist/avatar.js +1 -1
- package/dist/badge.cjs +1 -1
- package/dist/badge.js +1 -1
- package/dist/{boat-CNWIQPA1.js → boat-BF5P6p_f.js} +1 -1
- package/dist/{boat-CNWIQPA1.js.map → boat-BF5P6p_f.js.map} +1 -1
- package/dist/{boat-OatK_MGh.cjs → boat-BPN8HLzZ.cjs} +1 -1
- package/dist/{boat-OatK_MGh.cjs.map → boat-BPN8HLzZ.cjs.map} +1 -1
- package/dist/boat.cjs +1 -1
- package/dist/boat.js +1 -1
- package/dist/breadcrumb.cjs +1 -1
- package/dist/breadcrumb.js +1 -1
- package/dist/{busy-Cetzws-m.js → busy-BuACDJy6.js} +1 -1
- package/dist/{busy-Cetzws-m.js.map → busy-BuACDJy6.js.map} +1 -1
- package/dist/{busy-CMKX4oQf.cjs → busy-C7ejPa-Q.cjs} +1 -1
- package/dist/{busy-CMKX4oQf.cjs.map → busy-C7ejPa-Q.cjs.map} +1 -1
- package/dist/busy.cjs +1 -1
- package/dist/busy.js +1 -1
- package/dist/button.cjs +15 -9
- package/dist/button.cjs.map +1 -1
- package/dist/button.js +15 -9
- package/dist/button.js.map +1 -1
- package/dist/{card-8VXoo2C_.cjs → card-BIzaLuEg.cjs} +1 -1
- package/dist/{card-8VXoo2C_.cjs.map → card-BIzaLuEg.cjs.map} +1 -1
- package/dist/{card-D2k3dRL0.js → card-CgQwXO8L.js} +1 -1
- package/dist/{card-D2k3dRL0.js.map → card-CgQwXO8L.js.map} +1 -1
- package/dist/card.cjs +1 -1
- package/dist/card.js +1 -1
- package/dist/{checkbox-Cq5wzeaY.cjs → checkbox-BAqE3sTx.cjs} +1 -1
- package/dist/{checkbox-Cq5wzeaY.cjs.map → checkbox-BAqE3sTx.cjs.map} +1 -1
- package/dist/{checkbox-8hNsBejz.js → checkbox-BNdg57Om.js} +1 -1
- package/dist/{checkbox-8hNsBejz.js.map → checkbox-BNdg57Om.js.map} +1 -1
- package/dist/checkbox.cjs +1 -1
- package/dist/checkbox.js +1 -1
- package/dist/{chips-Dx_WvOGk.cjs → chips-DS3y4Lbn.cjs} +2 -4
- package/dist/chips-DS3y4Lbn.cjs.map +1 -0
- package/dist/{chips-D1kJrbzo.js → chips-DnqLaOb1.js} +3 -5
- package/dist/chips-DnqLaOb1.js.map +1 -0
- package/dist/chips.cjs +1 -1
- package/dist/chips.js +2 -2
- package/dist/connectivity.cjs +1 -1
- package/dist/connectivity.js +1 -1
- package/dist/content-drawer.cjs +1 -1
- package/dist/content-drawer.js +1 -1
- package/dist/{date-range-H903Vt_r.cjs → date-range-CsJfjbmi.cjs} +1 -1
- package/dist/{date-range-H903Vt_r.cjs.map → date-range-CsJfjbmi.cjs.map} +1 -1
- package/dist/{date-range-Dv-DM6mB.js → date-range-aPSmSBhk.js} +2 -2
- package/dist/{date-range-Dv-DM6mB.js.map → date-range-aPSmSBhk.js.map} +1 -1
- package/dist/{date-range-inline-Bvs2ZvEY.cjs → date-range-inline-CAa0_4EI.cjs} +1 -1
- package/dist/{date-range-inline-Bvs2ZvEY.cjs.map → date-range-inline-CAa0_4EI.cjs.map} +1 -1
- package/dist/{date-range-inline-TWWnTZlw.js → date-range-inline-PeRt1iIF.js} +1 -1
- package/dist/{date-range-inline-TWWnTZlw.js.map → date-range-inline-PeRt1iIF.js.map} +1 -1
- package/dist/date-range-inline.cjs +1 -1
- package/dist/date-range-inline.js +1 -1
- package/dist/date-range.cjs +1 -1
- package/dist/date-range.js +1 -1
- package/dist/delay.cjs +1 -1
- package/dist/delay.js +1 -1
- package/dist/{details-CwSDur6j.cjs → details-BnXbDpt7.cjs} +2 -2
- package/dist/details-BnXbDpt7.cjs.map +1 -0
- package/dist/{details-Cpg8sH2F.js → details-BpFjVclg.js} +2 -2
- package/dist/details-BpFjVclg.js.map +1 -0
- package/dist/details.cjs +1 -1
- package/dist/details.js +1 -1
- package/dist/directives.cjs +3 -3
- package/dist/directives.cjs.map +1 -1
- package/dist/directives.js +290 -203
- package/dist/directives.js.map +1 -1
- package/dist/{divider-BNdVLE0H.cjs → divider-B84lt1A3.cjs} +1 -1
- package/dist/{divider-BNdVLE0H.cjs.map → divider-B84lt1A3.cjs.map} +1 -1
- package/dist/{divider-Be833gGZ.js → divider-D8cBBkdG.js} +1 -1
- package/dist/{divider-Be833gGZ.js.map → divider-D8cBBkdG.js.map} +1 -1
- package/dist/divider.cjs +1 -1
- package/dist/divider.js +1 -1
- package/dist/dropdown.cjs +1 -1
- package/dist/dropdown.js +1 -1
- package/dist/{expand-CtoffNNj.js → expand-BJiKggfg.js} +2 -2
- package/dist/{expand-CtoffNNj.js.map → expand-BJiKggfg.js.map} +1 -1
- package/dist/{expand-BP6RLzHw.cjs → expand-DK-O37-j.cjs} +1 -1
- package/dist/{expand-BP6RLzHw.cjs.map → expand-DK-O37-j.cjs.map} +1 -1
- package/dist/expand.cjs +1 -1
- package/dist/expand.js +1 -1
- package/dist/{float-KmbhaQHA.js → float-B4FDN40h.js} +1 -1
- package/dist/{float-KmbhaQHA.js.map → float-B4FDN40h.js.map} +1 -1
- package/dist/{float-CfbQM_2v.cjs → float-RWR6Q1Hh.cjs} +1 -1
- package/dist/{float-CfbQM_2v.cjs.map → float-RWR6Q1Hh.cjs.map} +1 -1
- package/dist/float.cjs +1 -1
- package/dist/float.js +1 -1
- package/dist/{form-8IcmP8uV.js → form-Bz5WamuM.js} +8 -8
- package/dist/{form-8IcmP8uV.js.map → form-Bz5WamuM.js.map} +1 -1
- package/dist/{form-CuBIrKOA.cjs → form-PioZDvzA.cjs} +1 -1
- package/dist/{form-CuBIrKOA.cjs.map → form-PioZDvzA.cjs.map} +1 -1
- package/dist/form.cjs +1 -1
- package/dist/form.js +6 -6
- package/dist/handover/agent-runtime-followups.md +1 -1
- package/dist/handover/agent-runtime-v1.md +3 -3
- package/dist/{icons-D7df1ysG.js → icons-BgUbHwy8.js} +1 -1
- package/dist/{icons-D7df1ysG.js.map → icons-BgUbHwy8.js.map} +1 -1
- package/dist/{icons-BJld4JHp.cjs → icons-morK4hHz.cjs} +1 -1
- package/dist/{icons-BJld4JHp.cjs.map → icons-morK4hHz.cjs.map} +1 -1
- package/dist/icons.cjs +1 -1
- package/dist/icons.js +1 -1
- package/dist/{iframe-GT6D8l5Z.cjs → iframe-BXe1TPx1.cjs} +1 -1
- package/dist/{iframe-GT6D8l5Z.cjs.map → iframe-BXe1TPx1.cjs.map} +1 -1
- package/dist/{iframe-DAbgW9tT.js → iframe-CByrVlZy.js} +1 -1
- package/dist/{iframe-DAbgW9tT.js.map → iframe-CByrVlZy.js.map} +1 -1
- package/dist/iframe.cjs +1 -1
- package/dist/iframe.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +55 -56
- package/dist/{input-BE9wEEw4.cjs → input-BY9OCQWr.cjs} +1 -1
- package/dist/{input-BE9wEEw4.cjs.map → input-BY9OCQWr.cjs.map} +1 -1
- package/dist/{input-DC6ap_uN.js → input-Q0fm34Co.js} +2 -2
- package/dist/{input-DC6ap_uN.js.map → input-Q0fm34Co.js.map} +1 -1
- package/dist/{input-chip-MsiMu-b5.cjs → input-chip-BwNf3GD0.cjs} +1 -1
- package/dist/{input-chip-MsiMu-b5.cjs.map → input-chip-BwNf3GD0.cjs.map} +1 -1
- package/dist/{input-chip-c5n547tg.js → input-chip-CytUirVS.js} +1 -1
- package/dist/{input-chip-c5n547tg.js.map → input-chip-CytUirVS.js.map} +1 -1
- package/dist/input.cjs +1 -1
- package/dist/input.js +1 -1
- package/dist/json.cjs +1 -1
- package/dist/json.js +2 -2
- package/dist/kbd.cjs +1 -1
- package/dist/kbd.js +1 -1
- package/dist/layout.cjs +26 -1
- package/dist/layout.cjs.map +1 -0
- package/dist/layout.js +115 -2
- package/dist/layout.js.map +1 -0
- package/dist/{lightbox-CNX9Eg3U.js → lightbox-Ckvn5YNF.js} +1 -1
- package/dist/{lightbox-CNX9Eg3U.js.map → lightbox-Ckvn5YNF.js.map} +1 -1
- package/dist/{lightbox-HqJBBjAT.cjs → lightbox-p2E0oVR0.cjs} +1 -1
- package/dist/{lightbox-HqJBBjAT.cjs.map → lightbox-p2E0oVR0.cjs.map} +1 -1
- package/dist/lightbox.cjs +1 -1
- package/dist/lightbox.js +1 -1
- package/dist/{list-C76Pb-c1.js → list-CsrPVvmm.js} +1 -1
- package/dist/{list-C76Pb-c1.js.map → list-CsrPVvmm.js.map} +1 -1
- package/dist/{list-bhyuQSyO.cjs → list-r57UFHu3.cjs} +1 -1
- package/dist/{list-bhyuQSyO.cjs.map → list-r57UFHu3.cjs.map} +1 -1
- package/dist/list.cjs +1 -1
- package/dist/list.js +1 -1
- package/dist/{menu-BqKQ-s0C.cjs → menu-BOZ2iwed.cjs} +1 -1
- package/dist/{menu-BqKQ-s0C.cjs.map → menu-BOZ2iwed.cjs.map} +1 -1
- package/dist/{menu-C5ksITpG.js → menu-CxE16xur.js} +2 -2
- package/dist/{menu-C5ksITpG.js.map → menu-CxE16xur.js.map} +1 -1
- package/dist/menu.cjs +1 -1
- package/dist/menu.js +1 -1
- package/dist/mixins-DTCHPEd4.cjs +254 -0
- package/dist/{mixins-Du9HMrIG.cjs.map → mixins-DTCHPEd4.cjs.map} +1 -1
- package/dist/mixins-pU53qf6R.js +636 -0
- package/dist/{mixins-DCVXqL1Q.js.map → mixins-pU53qf6R.js.map} +1 -1
- package/dist/mixins.cjs +1 -1
- package/dist/mixins.js +1 -1
- package/dist/nav-drawer.cjs +1 -1
- package/dist/nav-drawer.js +1 -1
- package/dist/navigation-bar.cjs +1 -1
- package/dist/navigation-bar.js +1 -1
- package/dist/navigation-rail.cjs +1 -1
- package/dist/navigation-rail.js +1 -1
- package/dist/{notification-DR3gvWt8.cjs → notification-58tkVys8.cjs} +1 -1
- package/dist/{notification-DR3gvWt8.cjs.map → notification-58tkVys8.cjs.map} +1 -1
- package/dist/{notification-eZxtr3NN.js → notification-CgTBiAdf.js} +2 -2
- package/dist/{notification-eZxtr3NN.js.map → notification-CgTBiAdf.js.map} +1 -1
- package/dist/notification.cjs +1 -1
- package/dist/notification.js +1 -1
- package/dist/{option-BDOKUqTy.cjs → option-61YE3gub.cjs} +1 -1
- package/dist/{option-BDOKUqTy.cjs.map → option-61YE3gub.cjs.map} +1 -1
- package/dist/{option-CBEHYG4U.js → option-Bicf6xpI.js} +1 -1
- package/dist/{option-CBEHYG4U.js.map → option-Bicf6xpI.js.map} +1 -1
- package/dist/option.cjs +1 -1
- package/dist/option.js +1 -1
- package/dist/{overlay-DG6EeyKt.cjs → overlay-B3gKPWhu.cjs} +2 -2
- package/dist/overlay-B3gKPWhu.cjs.map +1 -0
- package/dist/{overlay-oxM9OLXP.js → overlay-D3mdWOLS.js} +12 -11
- package/dist/overlay-D3mdWOLS.js.map +1 -0
- package/dist/overlay.cjs +1 -1
- package/dist/{overlay.confirm-body-D_P2e7l6.js → overlay.confirm-body-Czi6cMZq.js} +1 -1
- package/dist/{overlay.confirm-body-D_P2e7l6.js.map → overlay.confirm-body-Czi6cMZq.js.map} +1 -1
- package/dist/{overlay.confirm-body-78e1WrN9.cjs → overlay.confirm-body-yr0HzS_d.cjs} +1 -1
- package/dist/{overlay.confirm-body-78e1WrN9.cjs.map → overlay.confirm-body-yr0HzS_d.cjs.map} +1 -1
- package/dist/overlay.js +3 -3
- package/dist/{overlay.service-C8NwO4Bx.js → overlay.service-BfZf3xoD.js} +2 -2
- package/dist/{overlay.service-C8NwO4Bx.js.map → overlay.service-BfZf3xoD.js.map} +1 -1
- package/dist/{overlay.service-DQkGPUY7.cjs → overlay.service-DNs3AWqp.cjs} +1 -1
- package/dist/{overlay.service-DQkGPUY7.cjs.map → overlay.service-DNs3AWqp.cjs.map} +1 -1
- package/dist/{progress-CMSst_2U.cjs → progress-D8XZJVl5.cjs} +1 -1
- package/dist/{progress-CMSst_2U.cjs.map → progress-D8XZJVl5.cjs.map} +1 -1
- package/dist/{progress-C4kDZfb7.js → progress-Zqx-S9NZ.js} +1 -1
- package/dist/{progress-C4kDZfb7.js.map → progress-Zqx-S9NZ.js.map} +1 -1
- package/dist/progress.cjs +1 -1
- package/dist/progress.js +1 -1
- package/dist/radio-group-D9MU1Mxz.js +71 -0
- package/dist/radio-group-D9MU1Mxz.js.map +1 -0
- package/dist/radio-group-bl8K4Gls.cjs +19 -0
- package/dist/radio-group-bl8K4Gls.cjs.map +1 -0
- package/dist/radio-group.cjs +1 -1
- package/dist/radio-group.js +1 -1
- package/dist/range.cjs +1 -1
- package/dist/range.js +1 -1
- package/dist/{rxjs-utils-Cs6XGwF6.js.map → rxjs-utils-BK8VMe3K.js.map} +1 -1
- package/dist/{rxjs-utils-Dsj75cJy.cjs.map → rxjs-utils-DhOKenkS.cjs.map} +1 -1
- package/dist/rxjs-utils.cjs +1 -1
- package/dist/rxjs-utils.js +1 -1
- package/dist/{select-UU2pB67h.js → select-CMwkl-D6.js} +3 -3
- package/dist/select-CMwkl-D6.js.map +1 -0
- package/dist/select-COIfVtZl.cjs +56 -0
- package/dist/select-COIfVtZl.cjs.map +1 -0
- package/dist/select.cjs +1 -1
- package/dist/select.js +1 -1
- package/dist/skeleton.cjs +1 -1
- package/dist/skeleton.js +1 -1
- package/dist/skills/SKILL.md +18 -2
- package/dist/skills/area.md +13 -0
- package/dist/skills/overlay.md +13 -0
- package/dist/skills/page.md +71 -29
- package/dist/skills/schmancy/SKILL.md +18 -2
- package/dist/skills/schmancy/area.md +13 -0
- package/dist/skills/schmancy/overlay.md +13 -0
- package/dist/skills/schmancy/page.md +71 -29
- package/dist/slider.cjs +1 -1
- package/dist/slider.js +1 -1
- package/dist/{splash-screen-BvaDkvJU.cjs → splash-screen-2hxq8Sft.cjs} +1 -1
- package/dist/{splash-screen-BvaDkvJU.cjs.map → splash-screen-2hxq8Sft.cjs.map} +1 -1
- package/dist/{splash-screen-ChMkAPLU.js → splash-screen-xrMNpzkm.js} +1 -1
- package/dist/{splash-screen-ChMkAPLU.js.map → splash-screen-xrMNpzkm.js.map} +1 -1
- package/dist/splash-screen.cjs +1 -1
- package/dist/splash-screen.js +1 -1
- package/dist/{src-DnunCC4X.js → src-CHd-U-w4.js} +34 -35
- package/dist/{src-DnunCC4X.js.map → src-CHd-U-w4.js.map} +1 -1
- package/dist/{src-BIlD63Cz.cjs → src-ggWtvpDr.cjs} +1 -1
- package/dist/{src-BIlD63Cz.cjs.map → src-ggWtvpDr.cjs.map} +1 -1
- package/dist/steps.cjs +1 -1
- package/dist/steps.js +1 -1
- package/dist/{surface-DCRy-EyT.js → surface-3nnvlxeE.js} +1 -1
- package/dist/{surface-DCRy-EyT.js.map → surface-3nnvlxeE.js.map} +1 -1
- package/dist/{surface-DWwQDX9r.cjs → surface-BkQ44Wuo.cjs} +1 -1
- package/dist/{surface-DWwQDX9r.cjs.map → surface-BkQ44Wuo.cjs.map} +1 -1
- package/dist/surface.cjs +1 -1
- package/dist/surface.js +1 -1
- package/dist/switch.cjs +1 -1
- package/dist/switch.js +1 -1
- package/dist/table.cjs +1 -1
- package/dist/table.js +1 -1
- package/dist/{tabs-CkDNLbiS.js → tabs-CnLIe8nE.js} +1 -1
- package/dist/{tabs-CkDNLbiS.js.map → tabs-CnLIe8nE.js.map} +1 -1
- package/dist/{tabs-lxQHWEb7.cjs → tabs-Dql0rcqZ.cjs} +1 -1
- package/dist/{tabs-lxQHWEb7.cjs.map → tabs-Dql0rcqZ.cjs.map} +1 -1
- package/dist/tabs.cjs +1 -1
- package/dist/tabs.js +1 -1
- package/dist/teleport.cjs +1 -1
- package/dist/teleport.js +1 -1
- package/dist/{textarea-DkfGmRSI.js → textarea-BAogS_Ff.js} +1 -1
- package/dist/{textarea-DkfGmRSI.js.map → textarea-BAogS_Ff.js.map} +1 -1
- package/dist/{textarea-CNa4dSvF.cjs → textarea-CGD6lAEe.cjs} +1 -1
- package/dist/{textarea-CNa4dSvF.cjs.map → textarea-CGD6lAEe.cjs.map} +1 -1
- package/dist/textarea.cjs +1 -1
- package/dist/textarea.js +1 -1
- package/dist/{theme-CNWRYdfn.js → theme-CUK0HrS3.js} +1 -1
- package/dist/{theme-CNWRYdfn.js.map → theme-CUK0HrS3.js.map} +1 -1
- package/dist/{theme-CMyXTDht.cjs → theme-DKrrQ-ic.cjs} +1 -1
- package/dist/{theme-CMyXTDht.cjs.map → theme-DKrrQ-ic.cjs.map} +1 -1
- package/dist/{theme-button-CixloLin.js → theme-button-Bb8qW2IH.js} +1 -1
- package/dist/{theme-button-CixloLin.js.map → theme-button-Bb8qW2IH.js.map} +1 -1
- package/dist/{theme-button-kMhsX5Oe.cjs → theme-button-CmTwFm3l.cjs} +1 -1
- package/dist/{theme-button-kMhsX5Oe.cjs.map → theme-button-CmTwFm3l.cjs.map} +1 -1
- package/dist/theme-button.cjs +1 -1
- package/dist/theme-button.js +1 -1
- package/dist/theme.cjs +1 -1
- package/dist/theme.js +2 -2
- package/dist/tree.cjs +1 -1
- package/dist/tree.js +1 -1
- package/dist/typography.cjs +1 -1
- package/dist/typography.js +1 -1
- package/dist/{utils-DXE5fBBd.js.map → utils-Cxg0Kfy5.js.map} +1 -1
- package/dist/{utils-C-Q8ePtG.cjs.map → utils-aCJYAGUr.cjs.map} +1 -1
- package/dist/utils.cjs +1 -1
- package/dist/utils.js +1 -1
- package/dist/visually-hidden.cjs +1 -1
- package/dist/visually-hidden.js +1 -1
- package/dist/{window-qaGFMn_4.cjs → window-BbWlaPZv.cjs} +1 -1
- package/dist/{window-qaGFMn_4.cjs.map → window-BbWlaPZv.cjs.map} +1 -1
- package/dist/{window-BcvDNi9D.js → window-DuDAQa6y.js} +1 -1
- package/dist/{window-BcvDNi9D.js.map → window-DuDAQa6y.js.map} +1 -1
- package/dist/window.cjs +1 -1
- package/dist/window.js +1 -1
- package/package.json +1 -1
- package/skills/schmancy/SKILL.md +18 -2
- package/skills/schmancy/area.md +13 -0
- package/skills/schmancy/overlay.md +13 -0
- package/skills/schmancy/page.md +71 -29
- package/src/CLAUDE.md +20 -0
- package/src/area/area.component.ts +168 -343
- package/src/button/button.ts +8 -5
- package/src/button/icon-button.ts +8 -5
- package/src/chips/filter-chip.ts +1 -3
- package/src/details/details.ts +1 -1
- package/src/directives/fill.ts +137 -0
- package/src/directives/index.ts +2 -0
- package/src/directives/overflow-within.ts +186 -0
- package/src/form/fields/radio-group/radio-button.ts +22 -44
- package/src/form/fields/radio-group/radio-group.ts +20 -75
- package/src/form/fields/select/select.ts +3 -2
- package/src/index.ts +0 -1
- package/src/overlay/index.ts +1 -0
- package/src/overlay/overlay.component.ts +38 -39
- package/src/overlay/overlay.positioning.ts +10 -2
- package/src/overlay/overlay.types.ts +10 -3
- package/src/state/schmancy-state.html +897 -0
- package/src/state/schmancy-state.md +981 -0
- package/types/src/area/area.component.d.ts +0 -15
- package/types/src/button/icon-button.d.ts +1 -1
- package/types/src/directives/fill.d.ts +46 -0
- package/types/src/directives/index.d.ts +2 -0
- package/types/src/directives/overflow-within.d.ts +77 -0
- package/types/src/form/fields/radio-group/radio-button.d.ts +2 -5
- package/types/src/form/fields/radio-group/radio-group.d.ts +2 -10
- package/types/src/index.d.ts +0 -1
- package/types/src/overlay/index.d.ts +1 -1
- package/types/src/overlay/overlay.positioning.d.ts +9 -1
- package/types/src/overlay/overlay.types.d.ts +9 -3
- package/dist/area-BIipuSyO.js.map +0 -1
- package/dist/area-C-EMiNEE.cjs +0 -12
- package/dist/area-C-EMiNEE.cjs.map +0 -1
- package/dist/chips-D1kJrbzo.js.map +0 -1
- package/dist/chips-Dx_WvOGk.cjs.map +0 -1
- package/dist/details-Cpg8sH2F.js.map +0 -1
- package/dist/details-CwSDur6j.cjs.map +0 -1
- package/dist/mixins-DCVXqL1Q.js +0 -636
- package/dist/mixins-Du9HMrIG.cjs +0 -254
- package/dist/overlay-DG6EeyKt.cjs.map +0 -1
- package/dist/overlay-oxM9OLXP.js.map +0 -1
- package/dist/page.cjs +0 -20
- package/dist/page.cjs.map +0 -1
- package/dist/page.js +0 -74
- package/dist/page.js.map +0 -1
- package/dist/radio-group-DB9D2ZkA.js +0 -108
- package/dist/radio-group-DB9D2ZkA.js.map +0 -1
- package/dist/radio-group-dVUvYFq7.cjs +0 -40
- package/dist/radio-group-dVUvYFq7.cjs.map +0 -1
- package/dist/scroll-C1klVgSQ.js +0 -115
- package/dist/scroll-C1klVgSQ.js.map +0 -1
- package/dist/scroll-S-bXF2u6.cjs +0 -26
- package/dist/scroll-S-bXF2u6.cjs.map +0 -1
- package/dist/select-UU2pB67h.js.map +0 -1
- package/dist/select-fu_-rZyn.cjs +0 -56
- package/dist/select-fu_-rZyn.cjs.map +0 -1
- package/src/page/index.ts +0 -1
- package/src/page/page.ts +0 -137
- package/types/src/page/index.d.ts +0 -1
- package/types/src/page/page.d.ts +0 -37
- /package/dist/{rxjs-utils-Cs6XGwF6.js → rxjs-utils-BK8VMe3K.js} +0 -0
- /package/dist/{rxjs-utils-Dsj75cJy.cjs → rxjs-utils-DhOKenkS.cjs} +0 -0
- /package/dist/{utils-DXE5fBBd.js → utils-Cxg0Kfy5.js} +0 -0
- /package/dist/{utils-C-Q8ePtG.cjs → utils-aCJYAGUr.cjs} +0 -0
|
@@ -6,13 +6,12 @@ import {
|
|
|
6
6
|
catchError,
|
|
7
7
|
distinctUntilChanged,
|
|
8
8
|
filter,
|
|
9
|
+
from,
|
|
9
10
|
fromEvent,
|
|
10
11
|
map,
|
|
11
12
|
merge,
|
|
12
13
|
of,
|
|
13
|
-
shareReplay,
|
|
14
14
|
switchMap,
|
|
15
|
-
take,
|
|
16
15
|
takeUntil,
|
|
17
16
|
tap,
|
|
18
17
|
} from 'rxjs'
|
|
@@ -26,412 +25,238 @@ export class SchmancyArea extends SchmancyElement {
|
|
|
26
25
|
:host {
|
|
27
26
|
position: relative;
|
|
28
27
|
display: block;
|
|
29
|
-
|
|
28
|
+
height: 100%;
|
|
29
|
+
width: 100%;
|
|
30
|
+
min-height: 0;
|
|
31
|
+
min-width: 0;
|
|
30
32
|
contain: layout style;
|
|
31
33
|
}
|
|
34
|
+
::slotted(:not(schmancy-route)) {
|
|
35
|
+
display: block;
|
|
36
|
+
box-sizing: border-box;
|
|
37
|
+
min-height: 100%;
|
|
38
|
+
width: 100%;
|
|
39
|
+
}
|
|
32
40
|
`]
|
|
33
41
|
|
|
34
|
-
/**
|
|
35
|
-
* The name of the router outlet
|
|
36
|
-
* @attr
|
|
37
|
-
* @type {string}
|
|
38
|
-
* @public
|
|
39
|
-
* @required
|
|
40
|
-
*/
|
|
41
42
|
@property() name!: string
|
|
42
43
|
|
|
43
44
|
@property() default!: RouteComponent
|
|
44
45
|
|
|
45
|
-
/**
|
|
46
|
-
* Query for assigned route elements in the slot
|
|
47
|
-
* This will automatically update when slot content changes
|
|
48
|
-
*/
|
|
49
46
|
@queryAssignedElements({ selector: 'schmancy-route', flatten: true })
|
|
50
47
|
private routes!: SchmancyRoute[]
|
|
51
48
|
|
|
52
49
|
protected firstUpdated(): void {
|
|
53
50
|
if (!this.name) throw new Error('Area name is required')
|
|
54
51
|
|
|
55
|
-
// Single unified routing pipeline with all logic inline
|
|
56
52
|
merge(
|
|
57
|
-
//
|
|
53
|
+
// Programmatic navigation
|
|
58
54
|
area.request.pipe(
|
|
59
55
|
filter(({ area }) => area === this.name),
|
|
60
56
|
),
|
|
61
57
|
|
|
62
|
-
//
|
|
58
|
+
// Initial URL parse
|
|
63
59
|
of(null).pipe(
|
|
64
|
-
take(1),
|
|
65
60
|
map(() => {
|
|
66
|
-
// Parse route from URL on initial load
|
|
67
61
|
const path = location.pathname
|
|
68
62
|
const lastSegment = path.split('/').pop() || ''
|
|
69
|
-
|
|
70
|
-
// Check for JSON encoded route in URL
|
|
71
63
|
if (lastSegment && (lastSegment.includes('{') || lastSegment.includes('%7B'))) {
|
|
72
64
|
try {
|
|
73
|
-
const parsed = JSON.parse(decodeURIComponent(lastSegment))
|
|
74
|
-
if (parsed[this.name]) {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
component: parsed[this.name].component,
|
|
78
|
-
state: parsed[this.name].state || {},
|
|
79
|
-
params: parsed[this.name].params || {},
|
|
80
|
-
props: parsed[this.name].props || {},
|
|
81
|
-
historyStrategy: HISTORY_STRATEGY.replace,
|
|
82
|
-
} as RouteAction
|
|
65
|
+
const parsed = JSON.parse(decodeURIComponent(lastSegment))
|
|
66
|
+
if (typeof parsed === 'object' && parsed !== null && parsed[this.name]) {
|
|
67
|
+
const r = parsed[this.name]
|
|
68
|
+
return { area: this.name, component: r.component, state: r.state || {}, params: r.params || {}, props: r.props || {}, historyStrategy: HISTORY_STRATEGY.replace } as RouteAction
|
|
83
69
|
}
|
|
84
70
|
} catch {}
|
|
85
71
|
}
|
|
86
|
-
|
|
87
|
-
// Segment-based routing
|
|
88
|
-
const segments = path.split('/').filter(Boolean)
|
|
89
|
-
const matchingSegment = segments.find(seg =>
|
|
90
|
-
this.routes?.some(r => r.when === seg)
|
|
91
|
-
)
|
|
92
|
-
|
|
72
|
+
const matchingSegment = path.split('/').filter(Boolean).find(seg => this.routes?.some(r => r.when === seg))
|
|
93
73
|
if (matchingSegment) {
|
|
94
|
-
return {
|
|
95
|
-
area: this.name,
|
|
96
|
-
component: matchingSegment,
|
|
97
|
-
state: {},
|
|
98
|
-
params: {},
|
|
99
|
-
historyStrategy: HISTORY_STRATEGY.silent,
|
|
100
|
-
} as RouteAction
|
|
74
|
+
return { area: this.name, component: matchingSegment, state: {}, params: {}, historyStrategy: HISTORY_STRATEGY.silent } as RouteAction
|
|
101
75
|
}
|
|
102
|
-
|
|
103
|
-
// Use default route if available
|
|
104
76
|
return this.default
|
|
105
|
-
? {
|
|
106
|
-
area: this.name,
|
|
107
|
-
component: this.default,
|
|
108
|
-
state: {},
|
|
109
|
-
params: {},
|
|
110
|
-
historyStrategy: HISTORY_STRATEGY.silent,
|
|
111
|
-
} as RouteAction
|
|
77
|
+
? { area: this.name, component: this.default, state: {}, params: {}, historyStrategy: HISTORY_STRATEGY.silent } as RouteAction
|
|
112
78
|
: null
|
|
113
|
-
})
|
|
79
|
+
}),
|
|
114
80
|
),
|
|
115
81
|
|
|
116
|
-
//
|
|
82
|
+
// Browser back/forward
|
|
117
83
|
fromEvent<PopStateEvent>(window, 'popstate').pipe(
|
|
118
84
|
map(() => {
|
|
119
|
-
// Parse route from browser state during popstate
|
|
120
|
-
// First check history state
|
|
121
85
|
if (history.state?.schmancyAreas?.[this.name]) {
|
|
122
|
-
const
|
|
123
|
-
return {
|
|
124
|
-
area: this.name,
|
|
125
|
-
component: stateData.component,
|
|
126
|
-
state: stateData.state || {},
|
|
127
|
-
params: stateData.params || {},
|
|
128
|
-
props: stateData.props || {},
|
|
129
|
-
historyStrategy: HISTORY_STRATEGY.pop,
|
|
130
|
-
} as RouteAction
|
|
86
|
+
const s = history.state.schmancyAreas[this.name]
|
|
87
|
+
return { area: this.name, component: s.component, state: s.state || {}, params: s.params || {}, props: s.props || {}, historyStrategy: HISTORY_STRATEGY.pop } as RouteAction
|
|
131
88
|
}
|
|
132
|
-
|
|
133
|
-
// Fallback to URL parsing if no state (e.g., navigating to root)
|
|
134
89
|
const path = location.pathname
|
|
135
90
|
const lastSegment = path.split('/').pop() || ''
|
|
136
|
-
|
|
137
|
-
// Check for JSON encoded route in URL
|
|
138
91
|
if (lastSegment && (lastSegment.includes('{') || lastSegment.includes('%7B'))) {
|
|
139
92
|
try {
|
|
140
|
-
const parsed = JSON.parse(decodeURIComponent(lastSegment))
|
|
141
|
-
if (parsed[this.name]) {
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
component: parsed[this.name].component,
|
|
145
|
-
state: parsed[this.name].state || {},
|
|
146
|
-
params: parsed[this.name].params || {},
|
|
147
|
-
props: parsed[this.name].props || {},
|
|
148
|
-
historyStrategy: HISTORY_STRATEGY.replace,
|
|
149
|
-
} as RouteAction
|
|
93
|
+
const parsed = JSON.parse(decodeURIComponent(lastSegment))
|
|
94
|
+
if (typeof parsed === 'object' && parsed !== null && parsed[this.name]) {
|
|
95
|
+
const r = parsed[this.name]
|
|
96
|
+
return { area: this.name, component: r.component, state: r.state || {}, params: r.params || {}, props: r.props || {}, historyStrategy: HISTORY_STRATEGY.replace } as RouteAction
|
|
150
97
|
}
|
|
151
98
|
} catch {}
|
|
152
99
|
}
|
|
153
|
-
|
|
154
|
-
// Segment-based routing
|
|
155
|
-
const segments = path.split('/').filter(Boolean)
|
|
156
|
-
const matchingSegment = segments.find(seg =>
|
|
157
|
-
this.routes?.some(r => r.when === seg)
|
|
158
|
-
)
|
|
159
|
-
|
|
100
|
+
const matchingSegment = path.split('/').filter(Boolean).find(seg => this.routes?.some(r => r.when === seg))
|
|
160
101
|
if (matchingSegment) {
|
|
161
|
-
return {
|
|
162
|
-
area: this.name,
|
|
163
|
-
component: matchingSegment,
|
|
164
|
-
state: {},
|
|
165
|
-
params: {},
|
|
166
|
-
historyStrategy: HISTORY_STRATEGY.silent,
|
|
167
|
-
} as RouteAction
|
|
102
|
+
return { area: this.name, component: matchingSegment, state: {}, params: {}, historyStrategy: HISTORY_STRATEGY.silent } as RouteAction
|
|
168
103
|
}
|
|
169
|
-
|
|
170
|
-
// Use default route if available
|
|
171
104
|
return this.default
|
|
172
|
-
? {
|
|
173
|
-
area: this.name,
|
|
174
|
-
component: this.default,
|
|
175
|
-
state: {},
|
|
176
|
-
params: {},
|
|
177
|
-
historyStrategy: HISTORY_STRATEGY.silent,
|
|
178
|
-
} as RouteAction
|
|
105
|
+
? { area: this.name, component: this.default, state: {}, params: {}, historyStrategy: HISTORY_STRATEGY.silent } as RouteAction
|
|
179
106
|
: null
|
|
180
|
-
})
|
|
181
|
-
)
|
|
107
|
+
}),
|
|
108
|
+
),
|
|
182
109
|
).pipe(
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
if (typeof component === 'string' && this.routes) {
|
|
196
|
-
matchedRoute = this.routes.find(r => r.when === component)
|
|
197
|
-
if (matchedRoute) {
|
|
198
|
-
component = matchedRoute.component
|
|
110
|
+
filter((r): r is RouteAction => r !== null),
|
|
111
|
+
|
|
112
|
+
// Per-navigation error isolation — one bad nav skips, outer stream keeps flowing
|
|
113
|
+
switchMap(action => of(action).pipe(
|
|
114
|
+
// Step 1: resolve component + find matched route
|
|
115
|
+
switchMap(action => {
|
|
116
|
+
let component: RouteComponent | null = action.component
|
|
117
|
+
let matchedRoute: SchmancyRoute | undefined
|
|
118
|
+
|
|
119
|
+
if (typeof component === 'string' && this.routes) {
|
|
120
|
+
matchedRoute = this.routes.find(r => r.when === component)
|
|
121
|
+
if (matchedRoute) component = matchedRoute.component
|
|
199
122
|
}
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
// If component is a lazy function and we don't have a matched route yet,
|
|
203
|
-
// resolve it to find the route by tag name
|
|
204
|
-
if (
|
|
205
|
-
!matchedRoute &&
|
|
206
|
-
typeof component === 'function' &&
|
|
207
|
-
('preload' in component || '_promise' in component || '_module' in component)
|
|
208
|
-
) {
|
|
209
|
-
try {
|
|
210
|
-
const module = await (component as unknown as () => Promise<{ default: CustomElementConstructor }>)()
|
|
211
|
-
component = module.default
|
|
212
|
-
// Now find route by tag name
|
|
213
|
-
const tagName = customElements.getName(component as CustomElementConstructor)
|
|
214
|
-
if (tagName && this.routes) {
|
|
215
|
-
matchedRoute = this.routes.find(r => r.when === tagName)
|
|
216
|
-
}
|
|
217
|
-
} catch (e) {
|
|
218
|
-
console.error(`[${this.name}] Lazy load failed:`, e)
|
|
219
|
-
return { ...action, component: null, matchedRoute: undefined }
|
|
123
|
+
if (!matchedRoute && component instanceof HTMLElement && this.routes) {
|
|
124
|
+
matchedRoute = this.routes.find(r => r.when === component.tagName.toLowerCase())
|
|
220
125
|
}
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
return { ...action, component, matchedRoute }
|
|
230
|
-
}),
|
|
231
|
-
|
|
232
|
-
// Step 2: Check route guards
|
|
233
|
-
switchMap(route => {
|
|
234
|
-
if (!route.matchedRoute?.guard) {
|
|
235
|
-
return of(route)
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
return route.matchedRoute.guard.pipe(
|
|
239
|
-
switchMap(guardResult => {
|
|
240
|
-
if (guardResult === true) {
|
|
241
|
-
return of(route)
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
// Guard failed, dispatch redirect event
|
|
245
|
-
const redirectEvent = new CustomEvent('redirect', {
|
|
246
|
-
detail: {
|
|
247
|
-
blockedRoute: route.matchedRoute?.when || 'unknown',
|
|
248
|
-
area: this.name,
|
|
249
|
-
params: route.params || {},
|
|
250
|
-
state: route.state || {},
|
|
251
|
-
redirectTarget: typeof guardResult === 'object' ? guardResult : undefined,
|
|
252
|
-
},
|
|
253
|
-
bubbles: true,
|
|
254
|
-
composed: true,
|
|
255
|
-
})
|
|
256
|
-
route.matchedRoute.dispatchEvent(redirectEvent)
|
|
257
|
-
|
|
258
|
-
return EMPTY
|
|
259
|
-
})
|
|
260
|
-
)
|
|
261
|
-
}),
|
|
262
|
-
|
|
263
|
-
// Step 3: Load lazy components (after guard check for performance)
|
|
264
|
-
switchMap(async route => {
|
|
265
|
-
let component = route.component
|
|
266
|
-
|
|
267
|
-
if (
|
|
268
|
-
typeof component === 'function' &&
|
|
269
|
-
('preload' in component || '_promise' in component || '_module' in component)
|
|
270
|
-
) {
|
|
271
|
-
try {
|
|
272
|
-
const module = await (component as unknown as () => Promise<{ default: CustomElementConstructor }>)()
|
|
273
|
-
component = module.default
|
|
274
|
-
} catch (e) {
|
|
275
|
-
console.error(`[${this.name}] Lazy load failed:`, e)
|
|
276
|
-
return { ...route, component: null }
|
|
126
|
+
if (!matchedRoute && typeof component === 'function' && 'preload' in component) {
|
|
127
|
+
return from(
|
|
128
|
+
(component as () => Promise<{ default: CustomElementConstructor }>)().then(m => ({
|
|
129
|
+
...action,
|
|
130
|
+
component: m.default as RouteComponent,
|
|
131
|
+
matchedRoute: this.routes?.find(r => r.when === (customElements.getName(m.default) ?? '')) ?? undefined,
|
|
132
|
+
}))
|
|
133
|
+
)
|
|
277
134
|
}
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
135
|
+
return of({ ...action, component, matchedRoute })
|
|
136
|
+
}),
|
|
137
|
+
|
|
138
|
+
// Step 2: guard check
|
|
139
|
+
switchMap(carry => {
|
|
140
|
+
if (!carry.matchedRoute?.guard) return of(carry)
|
|
141
|
+
return carry.matchedRoute.guard.pipe(
|
|
142
|
+
switchMap(allowed => {
|
|
143
|
+
if (allowed) return of(carry)
|
|
144
|
+
carry.matchedRoute?.dispatchEvent(new CustomEvent('redirect', {
|
|
145
|
+
detail: { blockedRoute: carry.matchedRoute?.when ?? 'unknown', area: this.name, params: carry.params || {}, state: carry.state || {} },
|
|
146
|
+
bubbles: true,
|
|
147
|
+
composed: true,
|
|
148
|
+
}))
|
|
149
|
+
return EMPTY
|
|
150
|
+
}),
|
|
151
|
+
)
|
|
152
|
+
}),
|
|
153
|
+
|
|
154
|
+
// Step 3: load lazy component (after guard, for perf)
|
|
155
|
+
switchMap(carry => {
|
|
156
|
+
if (!(typeof carry.component === 'function' && 'preload' in carry.component)) return of(carry)
|
|
157
|
+
return from(
|
|
158
|
+
(carry.component as () => Promise<{ default: CustomElementConstructor }>)()
|
|
159
|
+
.then(m => ({ ...carry, component: m.default as RouteComponent }))
|
|
160
|
+
)
|
|
161
|
+
}),
|
|
162
|
+
|
|
163
|
+
// Step 4: dedup key
|
|
164
|
+
map(carry => {
|
|
165
|
+
const c = carry.component
|
|
166
|
+
const id =
|
|
167
|
+
!c || c === '' ? 'null'
|
|
168
|
+
: typeof c === 'string' ? c
|
|
169
|
+
: c instanceof HTMLElement ? c.tagName.toLowerCase()
|
|
170
|
+
: typeof c === 'function' ? c.name || 'CustomElement'
|
|
171
|
+
: 'null'
|
|
172
|
+
return { ...carry, key: `${id}${JSON.stringify(carry.params)}${JSON.stringify(carry.state)}${JSON.stringify(carry.props)}` }
|
|
173
|
+
}),
|
|
174
|
+
|
|
175
|
+
catchError(err => {
|
|
176
|
+
console.error(`[${this.name}] Navigation error:`, err)
|
|
177
|
+
return EMPTY
|
|
178
|
+
}),
|
|
179
|
+
)),
|
|
302
180
|
|
|
303
|
-
// Step 5: Deduplicate navigation requests
|
|
304
181
|
distinctUntilChanged((a, b) => a.key === b.key),
|
|
305
182
|
|
|
306
|
-
// Step
|
|
307
|
-
map(
|
|
183
|
+
// Step 5: instantiate element
|
|
184
|
+
map(carry => {
|
|
185
|
+
const c = carry.component
|
|
308
186
|
let element: HTMLElement | null = null
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
if (
|
|
312
|
-
element =
|
|
313
|
-
} else if (typeof
|
|
314
|
-
try {
|
|
315
|
-
element = document.createElement(component)
|
|
316
|
-
} catch {
|
|
317
|
-
console.error(`[${this.name}] Failed to create element:`, component)
|
|
318
|
-
}
|
|
319
|
-
} else if (component instanceof HTMLElement) {
|
|
320
|
-
element = component
|
|
321
|
-
} else if (typeof component === 'function') {
|
|
322
|
-
try {
|
|
323
|
-
element = new (component as CustomElementConstructor)()
|
|
324
|
-
} catch (e) {
|
|
325
|
-
console.error(`[${this.name}] Failed to instantiate:`, e)
|
|
326
|
-
}
|
|
187
|
+
if (typeof c === 'string' && c !== '') {
|
|
188
|
+
try { element = document.createElement(c) } catch { console.error(`[${this.name}] Failed to create element:`, c) }
|
|
189
|
+
} else if (c instanceof HTMLElement) {
|
|
190
|
+
element = c
|
|
191
|
+
} else if (typeof c === 'function') {
|
|
192
|
+
try { element = new (c as CustomElementConstructor)() } catch (e) { console.error(`[${this.name}] Failed to instantiate:`, e) }
|
|
327
193
|
}
|
|
328
|
-
|
|
329
|
-
// Apply properties
|
|
330
194
|
if (element) {
|
|
331
|
-
if (
|
|
332
|
-
if (
|
|
333
|
-
if (
|
|
195
|
+
if (carry.params) Object.assign(element, carry.params)
|
|
196
|
+
if (carry.props) Object.assign(element, carry.props)
|
|
197
|
+
if (carry.state) Object.assign(element, { state: carry.state })
|
|
334
198
|
}
|
|
335
|
-
|
|
336
|
-
return { element, route }
|
|
337
|
-
}),
|
|
338
|
-
|
|
339
|
-
shareReplay(1),
|
|
340
|
-
|
|
341
|
-
// Step 7: Swap components in DOM and update history
|
|
342
|
-
tap(({ element, route }) => this.swapComponents(element, route)),
|
|
343
|
-
|
|
344
|
-
// Performance: measure navigation duration
|
|
345
|
-
tap(() => {
|
|
346
|
-
performance.mark(`area-${this.name}-nav-end`)
|
|
347
|
-
performance.measure(`area-${this.name}-navigation`, `area-${this.name}-nav-start`, `area-${this.name}-nav-end`)
|
|
199
|
+
return { ...carry, element }
|
|
348
200
|
}),
|
|
349
201
|
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
this.appendChild(newComponent)
|
|
384
|
-
} else if (oldComponent) {
|
|
385
|
-
// GPU optimization: promote layers before animation
|
|
386
|
-
oldComponent.style.willChange = 'opacity'
|
|
387
|
-
newComponent.style.willChange = 'opacity'
|
|
388
|
-
// Skip paint for outgoing component
|
|
389
|
-
oldComponent.style.contentVisibility = 'hidden'
|
|
390
|
-
|
|
391
|
-
// Animated swap - fade out old, then fade in new
|
|
392
|
-
const fadeOut = oldComponent.animate([{ opacity: 1 }, { opacity: 0 }], { duration, easing: 'ease-out' })
|
|
393
|
-
fadeOut.onfinish = () => {
|
|
394
|
-
oldComponent.remove()
|
|
395
|
-
this.appendChild(newComponent)
|
|
396
|
-
const fadeIn = newComponent.animate([{ opacity: 0 }, { opacity: 1 }], { duration, easing: 'ease-in' })
|
|
397
|
-
fadeIn.onfinish = () => {
|
|
398
|
-
// Clean up GPU layer promotion
|
|
399
|
-
newComponent.style.willChange = 'auto'
|
|
202
|
+
// Step 6: swap DOM, write area state, update history
|
|
203
|
+
tap(carry => {
|
|
204
|
+
const old = Array.from(this.children).find(c => !(c instanceof SchmancyRoute)) as HTMLElement | undefined
|
|
205
|
+
const { element } = carry
|
|
206
|
+
|
|
207
|
+
if (!element) { old?.remove(); return }
|
|
208
|
+
|
|
209
|
+
const duration = carry.animationDuration ?? 150
|
|
210
|
+
|
|
211
|
+
if (duration === 0) {
|
|
212
|
+
old?.remove()
|
|
213
|
+
this.appendChild(element)
|
|
214
|
+
this.scrollTop = 0
|
|
215
|
+
} else if (old) {
|
|
216
|
+
old.style.willChange = 'opacity'
|
|
217
|
+
element.style.willChange = 'opacity'
|
|
218
|
+
old.style.contentVisibility = 'hidden'
|
|
219
|
+
old.animate([{ opacity: 1 }, { opacity: 0 }], { duration, easing: 'ease-out' }).finished
|
|
220
|
+
.then(() => {
|
|
221
|
+
if (!this.isConnected) return
|
|
222
|
+
old.remove()
|
|
223
|
+
this.appendChild(element)
|
|
224
|
+
this.scrollTop = 0
|
|
225
|
+
return element.animate([{ opacity: 0 }, { opacity: 1 }], { duration, easing: 'ease-in' }).finished
|
|
226
|
+
})
|
|
227
|
+
.then(() => (element.style.willChange = 'auto'))
|
|
228
|
+
} else {
|
|
229
|
+
this.appendChild(element)
|
|
230
|
+
this.scrollTop = 0
|
|
231
|
+
element.animate([{ opacity: 0 }, { opacity: 1 }], {
|
|
232
|
+
duration: duration > 100 ? Math.max(100, duration * 0.66) : duration,
|
|
233
|
+
easing: 'ease-in',
|
|
234
|
+
}).finished.then(() => (element.style.willChange = 'auto'))
|
|
400
235
|
}
|
|
401
|
-
}
|
|
402
|
-
} else {
|
|
403
|
-
// No old component - just fade in new
|
|
404
|
-
newComponent.style.willChange = 'opacity'
|
|
405
|
-
this.appendChild(newComponent)
|
|
406
|
-
const fadeInDuration = duration > 100 ? Math.max(100, duration * 0.66) : duration
|
|
407
|
-
const fadeIn = newComponent.animate([{ opacity: 0 }, { opacity: 1 }], { duration: fadeInDuration, easing: 'ease-in' })
|
|
408
|
-
fadeIn.onfinish = () => {
|
|
409
|
-
newComponent.style.willChange = 'auto'
|
|
410
|
-
}
|
|
411
|
-
}
|
|
412
|
-
|
|
413
|
-
// Update area state
|
|
414
|
-
const activeRoute: ActiveRoute = {
|
|
415
|
-
component: newComponent.tagName.toLowerCase(),
|
|
416
|
-
state: routeAction.state || {},
|
|
417
|
-
area: this.name,
|
|
418
|
-
params: routeAction.params || {},
|
|
419
|
-
props: routeAction.props || {},
|
|
420
|
-
}
|
|
421
236
|
|
|
422
|
-
|
|
423
|
-
|
|
237
|
+
const activeRoute: ActiveRoute = {
|
|
238
|
+
component: element.tagName.toLowerCase(),
|
|
239
|
+
state: carry.state || {},
|
|
240
|
+
area: this.name,
|
|
241
|
+
params: carry.params || {},
|
|
242
|
+
props: carry.props || {},
|
|
243
|
+
}
|
|
244
|
+
area.current.set(this.name, activeRoute)
|
|
245
|
+
area.$current.next(area.current)
|
|
246
|
+
|
|
247
|
+
if (area.enableHistoryMode) {
|
|
248
|
+
area._updateBrowserHistory(
|
|
249
|
+
this.name,
|
|
250
|
+
activeRoute,
|
|
251
|
+
carry.historyStrategy ?? HISTORY_STRATEGY.push,
|
|
252
|
+
carry.clearQueryParams,
|
|
253
|
+
carry.path,
|
|
254
|
+
)
|
|
255
|
+
}
|
|
256
|
+
}),
|
|
424
257
|
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
area._updateBrowserHistory(
|
|
428
|
-
this.name,
|
|
429
|
-
activeRoute,
|
|
430
|
-
routeAction.historyStrategy || HISTORY_STRATEGY.push,
|
|
431
|
-
routeAction.clearQueryParams,
|
|
432
|
-
routeAction.path
|
|
433
|
-
)
|
|
434
|
-
}
|
|
258
|
+
takeUntil(this.disconnecting),
|
|
259
|
+
).subscribe()
|
|
435
260
|
}
|
|
436
261
|
|
|
437
262
|
disconnectedCallback() {
|
package/src/button/button.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { SchmancyElement } from '@mixins/index'
|
|
2
1
|
import { provide } from '@lit/context'
|
|
2
|
+
import { SchmancyElement } from '@mixins/index'
|
|
3
3
|
import { css, html, LitElement } from 'lit'
|
|
4
4
|
import { customElement, property, query, queryAssignedElements } from 'lit/decorators.js'
|
|
5
5
|
import { ifDefined } from 'lit/directives/if-defined.js'
|
|
@@ -26,8 +26,7 @@ export type ButtonColor = 'primary' | 'secondary' | 'success' | 'error' | 'warni
|
|
|
26
26
|
@customElement('schmancy-button')
|
|
27
27
|
export class SchmancyButton extends SchmancyElement {
|
|
28
28
|
static styles = [css`:host{
|
|
29
|
-
display: inline-
|
|
30
|
-
min-width: fit-content;
|
|
29
|
+
display: inline-flex;
|
|
31
30
|
overflow: hidden;
|
|
32
31
|
position: relative;
|
|
33
32
|
touch-action: manipulation;
|
|
@@ -36,6 +35,10 @@ export class SchmancyButton extends SchmancyElement {
|
|
|
36
35
|
box-shadow 300ms cubic-bezier(0.34, 1.56, 0.64, 1),
|
|
37
36
|
transform 200ms cubic-bezier(0.34, 1.56, 0.64, 1);
|
|
38
37
|
}
|
|
38
|
+
:host([width="full"]) {
|
|
39
|
+
display: flex;
|
|
40
|
+
width: 100%;
|
|
41
|
+
}
|
|
39
42
|
:host(:hover:not([disabled])) {
|
|
40
43
|
box-shadow: 0 4px 16px -4px color-mix(in srgb, var(--schmancy-sys-color-primary-default) 20%, transparent);
|
|
41
44
|
}
|
|
@@ -165,7 +168,7 @@ export class SchmancyButton extends SchmancyElement {
|
|
|
165
168
|
* @default 'auto'
|
|
166
169
|
* @public
|
|
167
170
|
*/
|
|
168
|
-
@property()
|
|
171
|
+
@property({ reflect: true })
|
|
169
172
|
public width: 'full' | 'auto' = 'auto'
|
|
170
173
|
|
|
171
174
|
/**
|
|
@@ -301,7 +304,7 @@ export class SchmancyButton extends SchmancyElement {
|
|
|
301
304
|
|
|
302
305
|
// Compute classes for the interactive element.
|
|
303
306
|
const classes = {
|
|
304
|
-
'z-0 transition-all duration-200 relative rounded-2xl flex justify-center items-center outline-secondary-default focus-visible:outline-solid focus-visible:outline-2 focus-visible:outline-offset-2 outline-hidden
|
|
307
|
+
'z-0 transition-all duration-200 relative rounded-2xl flex justify-center items-center outline-secondary-default focus-visible:outline-solid focus-visible:outline-2 focus-visible:outline-offset-2 outline-hidden flex-1 overflow-hidden':
|
|
305
308
|
true,
|
|
306
309
|
// Height - M3 spec: 24dp (xxs) → 32dp (dense) → 40dp (default) → 48dp (large) → 56dp (XL)
|
|
307
310
|
'h-6': this.size === 'xxs', // 24px - Ultra-compact
|