@mhmo91/schmancy 0.10.18 → 0.10.20
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 -13
- package/dist/agent/{flow-CvG1fLW5.js.map → flow-3RrZM-e7.js.map} +1 -1
- package/dist/agent/overlay.confirm-body-mYm0zq4k.js +2863 -0
- package/dist/agent/overlay.confirm-body-mYm0zq4k.js.map +1 -0
- package/dist/agent/{rolldown-runtime-DsMetpgY.js → rolldown-runtime-BIIoCavz.js} +9 -2
- package/dist/agent/schmancy.agent.js +3932 -5905
- package/dist/agent/schmancy.agent.js.map +1 -1
- package/dist/agent/schmancy.manifest.json +1 -9
- package/dist/agent/{vendor-material-color-DcL7ZPxx.js.map → vendor-material-color-33Mj762T.js.map} +1 -1
- package/dist/area-C7MNn-3e.cjs +12 -0
- package/dist/area-C7MNn-3e.cjs.map +1 -0
- package/dist/{area-BIipuSyO.js → area-CRe41aIG.js} +91 -130
- package/dist/area-CRe41aIG.js.map +1 -0
- package/dist/area.cjs +1 -1
- package/dist/area.js +1 -1
- package/dist/{audio-D-TZzpXF.cjs → audio-Cvmemu84.cjs} +1 -1
- package/dist/{audio-D-TZzpXF.cjs.map → audio-Cvmemu84.cjs.map} +1 -1
- package/dist/{audio-DS43uoRA.js → audio-CxO5a2HL.js} +1 -1
- package/dist/{audio-DS43uoRA.js.map → audio-CxO5a2HL.js.map} +1 -1
- package/dist/audio.cjs +1 -1
- package/dist/audio.js +2 -2
- package/dist/{autocomplete-Mrb3koUN.js → autocomplete-CRDFL4Ul.js} +2 -2
- package/dist/{autocomplete-Mrb3koUN.js.map → autocomplete-CRDFL4Ul.js.map} +1 -1
- package/dist/{autocomplete-B8CE5vGw.cjs → autocomplete-CqUl7o0e.cjs} +1 -1
- package/dist/{autocomplete-B8CE5vGw.cjs.map → autocomplete-CqUl7o0e.cjs.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-DN1_tyvx.cjs → boat-BHV5kOlN.cjs} +1 -1
- package/dist/{boat-DN1_tyvx.cjs.map → boat-BHV5kOlN.cjs.map} +1 -1
- package/dist/{boat-cuoSkhGI.js → boat-XajM8A3M.js} +2 -2
- package/dist/{boat-cuoSkhGI.js.map → boat-XajM8A3M.js.map} +1 -1
- package/dist/boat.cjs +1 -1
- package/dist/boat.js +1 -1
- package/dist/breadcrumb.cjs +1 -1
- package/dist/breadcrumb.js +1 -1
- package/dist/{busy-CMKX4oQf.cjs → busy-BlBZ5ZOs.cjs} +1 -1
- package/dist/{busy-CMKX4oQf.cjs.map → busy-BlBZ5ZOs.cjs.map} +1 -1
- package/dist/{busy-Cetzws-m.js → busy-D8YsqVBf.js} +1 -1
- package/dist/{busy-Cetzws-m.js.map → busy-D8YsqVBf.js.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-D2k3dRL0.js → card-C9TljY2Z.js} +1 -1
- package/dist/{card-D2k3dRL0.js.map → card-C9TljY2Z.js.map} +1 -1
- package/dist/{card-8VXoo2C_.cjs → card-yT_St83D.cjs} +1 -1
- package/dist/{card-8VXoo2C_.cjs.map → card-yT_St83D.cjs.map} +1 -1
- package/dist/card.cjs +1 -1
- package/dist/card.js +1 -1
- package/dist/{checkbox-8hNsBejz.js → checkbox-BDgh4rge.js} +1 -1
- package/dist/{checkbox-8hNsBejz.js.map → checkbox-BDgh4rge.js.map} +1 -1
- package/dist/{checkbox-Cq5wzeaY.cjs → checkbox-Dz2lkJs0.cjs} +1 -1
- package/dist/{checkbox-Cq5wzeaY.cjs.map → checkbox-Dz2lkJs0.cjs.map} +1 -1
- package/dist/checkbox.cjs +1 -1
- package/dist/checkbox.js +1 -1
- package/dist/{chips-DSdvCpmi.cjs → chips-M7Dr2npv.cjs} +2 -4
- package/dist/chips-M7Dr2npv.cjs.map +1 -0
- package/dist/{chips-m2NPN480.js → chips-N7fu0hA4.js} +4 -6
- package/dist/chips-N7fu0hA4.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 +2 -2
- package/dist/content-drawer.cjs +1 -1
- package/dist/content-drawer.js +1 -1
- package/dist/{date-range-DxS3Agbj.cjs → date-range-D2vxD814.cjs} +1 -1
- package/dist/{date-range-DxS3Agbj.cjs.map → date-range-D2vxD814.cjs.map} +1 -1
- package/dist/{date-range-D98QcCHl.js → date-range-DFWOMgI3.js} +2 -2
- package/dist/{date-range-D98QcCHl.js.map → date-range-DFWOMgI3.js.map} +1 -1
- package/dist/{date-range-inline-Bvs2ZvEY.cjs → date-range-inline-C5JuZ_Kw.cjs} +1 -1
- package/dist/{date-range-inline-Bvs2ZvEY.cjs.map → date-range-inline-C5JuZ_Kw.cjs.map} +1 -1
- package/dist/{date-range-inline-TWWnTZlw.js → date-range-inline-D3q1OoKk.js} +1 -1
- package/dist/{date-range-inline-TWWnTZlw.js.map → date-range-inline-D3q1OoKk.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-Cpg8sH2F.js → details-BrUPmd92.js} +2 -2
- package/dist/details-BrUPmd92.js.map +1 -0
- package/dist/{details-CwSDur6j.cjs → details-DmDEInaL.cjs} +2 -2
- package/dist/details-DmDEInaL.cjs.map +1 -0
- package/dist/details.cjs +1 -1
- package/dist/details.js +1 -1
- package/dist/directives.cjs +1 -1
- package/dist/directives.js +1 -1
- package/dist/{divider-Be833gGZ.js → divider-BLijs8ba.js} +1 -1
- package/dist/{divider-Be833gGZ.js.map → divider-BLijs8ba.js.map} +1 -1
- package/dist/{divider-BNdVLE0H.cjs → divider-B_Ts_-qz.cjs} +1 -1
- package/dist/{divider-BNdVLE0H.cjs.map → divider-B_Ts_-qz.cjs.map} +1 -1
- package/dist/divider.cjs +1 -1
- package/dist/divider.js +1 -1
- package/dist/dropdown.cjs +1 -1
- package/dist/dropdown.js +1 -1
- package/dist/{expand-CtoffNNj.js → expand-C-xSpg7M.js} +2 -2
- package/dist/{expand-CtoffNNj.js.map → expand-C-xSpg7M.js.map} +1 -1
- package/dist/{expand-BP6RLzHw.cjs → expand-DV5sWUB6.cjs} +1 -1
- package/dist/{expand-BP6RLzHw.cjs.map → expand-DV5sWUB6.cjs.map} +1 -1
- package/dist/expand.cjs +1 -1
- package/dist/expand.js +1 -1
- package/dist/{float-B8NcSE3a.cjs → float-LyKef0LY.cjs} +1 -1
- package/dist/{float-B8NcSE3a.cjs.map → float-LyKef0LY.cjs.map} +1 -1
- package/dist/{float-C-glc-3u.js → float-Y22yVBE2.js} +1 -1
- package/dist/{float-C-glc-3u.js.map → float-Y22yVBE2.js.map} +1 -1
- package/dist/float.cjs +1 -1
- package/dist/float.js +1 -1
- package/dist/{form-St_IwR7y.cjs → form-C_smXI2-.cjs} +1 -1
- package/dist/{form-St_IwR7y.cjs.map → form-C_smXI2-.cjs.map} +1 -1
- package/dist/{form-DJvxIyfW.js → form-LFkEQkOX.js} +9 -9
- package/dist/{form-DJvxIyfW.js.map → form-LFkEQkOX.js.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-B3pFrwKC.js} +1 -1
- package/dist/{icons-D7df1ysG.js.map → icons-B3pFrwKC.js.map} +1 -1
- package/dist/{icons-BJld4JHp.cjs → icons-CCNy4Egc.cjs} +1 -1
- package/dist/{icons-BJld4JHp.cjs.map → icons-CCNy4Egc.cjs.map} +1 -1
- package/dist/icons.cjs +1 -1
- package/dist/icons.js +1 -1
- package/dist/{iframe-DAbgW9tT.js → iframe-BbFlCEyP.js} +1 -1
- package/dist/{iframe-DAbgW9tT.js.map → iframe-BbFlCEyP.js.map} +1 -1
- package/dist/{iframe-GT6D8l5Z.cjs → iframe-CCcmLZ_K.cjs} +1 -1
- package/dist/{iframe-GT6D8l5Z.cjs.map → iframe-CCcmLZ_K.cjs.map} +1 -1
- package/dist/iframe.cjs +1 -1
- package/dist/iframe.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +59 -56
- package/dist/{input-DC6ap_uN.js → input-Dkneo4uA.js} +2 -2
- package/dist/{input-DC6ap_uN.js.map → input-Dkneo4uA.js.map} +1 -1
- package/dist/{input-chip-c5n547tg.js → input-chip-C1-TYu4v.js} +1 -1
- package/dist/{input-chip-c5n547tg.js.map → input-chip-C1-TYu4v.js.map} +1 -1
- package/dist/{input-chip-MsiMu-b5.cjs → input-chip-F5NEkkBU.cjs} +1 -1
- package/dist/{input-chip-MsiMu-b5.cjs.map → input-chip-F5NEkkBU.cjs.map} +1 -1
- package/dist/{input-BE9wEEw4.cjs → input-sBZ89wz1.cjs} +1 -1
- package/dist/{input-BE9wEEw4.cjs.map → input-sBZ89wz1.cjs.map} +1 -1
- package/dist/input.cjs +1 -1
- package/dist/input.js +1 -1
- package/dist/json.cjs +1 -1
- package/dist/json.js +2 -2
- package/dist/kbd.cjs +1 -1
- package/dist/kbd.js +1 -1
- package/dist/{layout-Delq-QvR.cjs → layout-BbCIfIgo.cjs} +1 -1
- package/dist/{layout-Delq-QvR.cjs.map → layout-BbCIfIgo.cjs.map} +1 -1
- package/dist/{layout-BH28sKGc.js → layout-Dq2oeOTS.js} +1 -1
- package/dist/{layout-BH28sKGc.js.map → layout-Dq2oeOTS.js.map} +1 -1
- package/dist/layout.cjs +1 -1
- package/dist/layout.js +1 -1
- package/dist/{lightbox-HqJBBjAT.cjs → lightbox-B4m5lxGs.cjs} +1 -1
- package/dist/{lightbox-HqJBBjAT.cjs.map → lightbox-B4m5lxGs.cjs.map} +1 -1
- package/dist/{lightbox-CNX9Eg3U.js → lightbox-D7hYFspE.js} +1 -1
- package/dist/{lightbox-CNX9Eg3U.js.map → lightbox-D7hYFspE.js.map} +1 -1
- package/dist/lightbox.cjs +1 -1
- package/dist/lightbox.js +1 -1
- package/dist/{list-bhyuQSyO.cjs → list-C2ycz-yr.cjs} +1 -1
- package/dist/{list-bhyuQSyO.cjs.map → list-C2ycz-yr.cjs.map} +1 -1
- package/dist/{list-C76Pb-c1.js → list-Ou72tSeq.js} +1 -1
- package/dist/{list-C76Pb-c1.js.map → list-Ou72tSeq.js.map} +1 -1
- package/dist/list.cjs +1 -1
- package/dist/list.js +1 -1
- package/dist/{menu-Dag0cuWV.cjs → menu-ComSx-T0.cjs} +1 -1
- package/dist/{menu-Dag0cuWV.cjs.map → menu-ComSx-T0.cjs.map} +1 -1
- package/dist/{menu-B_-weNpZ.js → menu-YHbpRa7x.js} +2 -2
- package/dist/{menu-B_-weNpZ.js.map → menu-YHbpRa7x.js.map} +1 -1
- package/dist/menu.cjs +1 -1
- package/dist/menu.js +1 -1
- package/dist/mixins-B9kY_60p.js +636 -0
- package/dist/{mixins-DCVXqL1Q.js.map → mixins-B9kY_60p.js.map} +1 -1
- package/dist/mixins-BwGJwK7X.cjs +254 -0
- package/dist/{mixins-Du9HMrIG.cjs.map → mixins-BwGJwK7X.cjs.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-yd2KeHjd.cjs → notification-DZhL0ZEg.cjs} +1 -1
- package/dist/{notification-yd2KeHjd.cjs.map → notification-DZhL0ZEg.cjs.map} +1 -1
- package/dist/{notification-DySnvQeO.js → notification-O4Q5pyio.js} +3 -3
- package/dist/{notification-DySnvQeO.js.map → notification-O4Q5pyio.js.map} +1 -1
- package/dist/notification.cjs +1 -1
- package/dist/notification.js +1 -1
- package/dist/{option-CBEHYG4U.js → option-BCks0a4i.js} +1 -1
- package/dist/{option-CBEHYG4U.js.map → option-BCks0a4i.js.map} +1 -1
- package/dist/{option-BDOKUqTy.cjs → option-C2VKw8Yt.cjs} +1 -1
- package/dist/{option-BDOKUqTy.cjs.map → option-C2VKw8Yt.cjs.map} +1 -1
- package/dist/option.cjs +1 -1
- package/dist/option.js +1 -1
- package/dist/overlay-C0YSnxoV.js +743 -0
- package/dist/overlay-C0YSnxoV.js.map +1 -0
- package/dist/overlay-CG1gc1Jw.cjs +80 -0
- package/dist/overlay-CG1gc1Jw.cjs.map +1 -0
- package/dist/overlay.cjs +1 -80
- package/dist/{overlay.confirm-body-sUmd_zVy.cjs → overlay.confirm-body-B-Kmn7LF.cjs} +1 -1
- package/dist/{overlay.confirm-body-sUmd_zVy.cjs.map → overlay.confirm-body-B-Kmn7LF.cjs.map} +1 -1
- package/dist/{overlay.confirm-body-DESGpbru.js → overlay.confirm-body-BmOnrKbF.js} +1 -1
- package/dist/{overlay.confirm-body-DESGpbru.js.map → overlay.confirm-body-BmOnrKbF.js.map} +1 -1
- package/dist/overlay.js +5 -746
- package/dist/{overlay.service-BxtEFFSH.cjs → overlay.service-BPKV2a8w.cjs} +1 -1
- package/dist/{overlay.service-BxtEFFSH.cjs.map → overlay.service-BPKV2a8w.cjs.map} +1 -1
- package/dist/{overlay.service-DV_o_xQ0.js → overlay.service-CRoq9Gu-.js} +2 -2
- package/dist/{overlay.service-DV_o_xQ0.js.map → overlay.service-CRoq9Gu-.js.map} +1 -1
- package/dist/page.cjs +1 -1
- package/dist/page.js +4 -4
- package/dist/{progress-CMSst_2U.cjs → progress-B9RWAFv5.cjs} +1 -1
- package/dist/{progress-CMSst_2U.cjs.map → progress-B9RWAFv5.cjs.map} +1 -1
- package/dist/{progress-C4kDZfb7.js → progress-CEEl7vdd.js} +1 -1
- package/dist/{progress-C4kDZfb7.js.map → progress-CEEl7vdd.js.map} +1 -1
- package/dist/progress.cjs +1 -1
- package/dist/progress.js +1 -1
- package/dist/radio-group-C2y6H5YY.cjs +19 -0
- package/dist/radio-group-C2y6H5YY.cjs.map +1 -0
- package/dist/radio-group-VERF_8rC.js +71 -0
- package/dist/radio-group-VERF_8rC.js.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-Dv9T9IpA.js.map → rxjs-utils-Cs6XGwF6.js.map} +1 -1
- package/dist/{rxjs-utils-BKB2UM_j.cjs.map → rxjs-utils-Dsj75cJy.cjs.map} +1 -1
- package/dist/rxjs-utils.cjs +1 -1
- package/dist/rxjs-utils.js +1 -1
- package/dist/{scroll-C1klVgSQ.js → scroll-Bj7FsS08.js} +1 -1
- package/dist/{scroll-C1klVgSQ.js.map → scroll-Bj7FsS08.js.map} +1 -1
- package/dist/{scroll-S-bXF2u6.cjs → scroll-Djz3pJfX.cjs} +1 -1
- package/dist/{scroll-S-bXF2u6.cjs.map → scroll-Djz3pJfX.cjs.map} +1 -1
- package/dist/{select-UU2pB67h.js → select-ClJj_2AP.js} +3 -3
- package/dist/select-ClJj_2AP.js.map +1 -0
- package/dist/select-CngphfDB.cjs +56 -0
- package/dist/select-CngphfDB.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 +12 -0
- package/dist/skills/schmancy/SKILL.md +12 -0
- package/dist/slider.cjs +1 -1
- package/dist/slider.js +1 -1
- package/dist/{sound.service-DyY78ukR.cjs → sound.service-DVJZb9ox.cjs} +1 -1
- package/dist/{sound.service-DyY78ukR.cjs.map → sound.service-DVJZb9ox.cjs.map} +1 -1
- package/dist/{sound.service-BIN2W7Rv.js → sound.service-v_jqCkos.js} +1 -1
- package/dist/{sound.service-BIN2W7Rv.js.map → sound.service-v_jqCkos.js.map} +1 -1
- package/dist/{splash-screen-bGW_sS4i.js → splash-screen-BQsBy3O1.js} +1 -1
- package/dist/{splash-screen-bGW_sS4i.js.map → splash-screen-BQsBy3O1.js.map} +1 -1
- package/dist/{splash-screen-25PTDqnp.cjs → splash-screen-CntIFk2h.cjs} +1 -1
- package/dist/{splash-screen-25PTDqnp.cjs.map → splash-screen-CntIFk2h.cjs.map} +1 -1
- package/dist/splash-screen.cjs +1 -1
- package/dist/splash-screen.js +1 -1
- package/dist/{src-olrlFt4e.js → src-BAXhEv8f.js} +37 -36
- package/dist/{src-olrlFt4e.js.map → src-BAXhEv8f.js.map} +1 -1
- package/dist/{src-Blm9PNcf.cjs → src-ChFa-FDD.cjs} +1 -1
- package/dist/{src-Blm9PNcf.cjs.map → src-ChFa-FDD.cjs.map} +1 -1
- package/dist/{state-nm8yzMPp.js → state-CHbIt2Dw.js} +198 -202
- package/dist/{state-nm8yzMPp.js.map → state-CHbIt2Dw.js.map} +1 -1
- package/dist/state-DcGj-pJJ.cjs +1 -0
- package/dist/{state-avic94Ft.cjs.map → state-DcGj-pJJ.cjs.map} +1 -1
- package/dist/state.cjs +1 -1
- package/dist/state.js +1 -1
- package/dist/steps.cjs +1 -1
- package/dist/steps.js +1 -1
- package/dist/{surface-DCRy-EyT.js → surface-CHUJSY1o.js} +1 -1
- package/dist/{surface-DCRy-EyT.js.map → surface-CHUJSY1o.js.map} +1 -1
- package/dist/{surface-DWwQDX9r.cjs → surface-CXmQuXun.cjs} +1 -1
- package/dist/{surface-DWwQDX9r.cjs.map → surface-CXmQuXun.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-Dc3_Ox2B.cjs → tabs-Bku0sC0p.cjs} +1 -1
- package/dist/{tabs-Dc3_Ox2B.cjs.map → tabs-Bku0sC0p.cjs.map} +1 -1
- package/dist/{tabs-BVC_qn8S.js → tabs-DPVX21WM.js} +1 -1
- package/dist/{tabs-BVC_qn8S.js.map → tabs-DPVX21WM.js.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-CNa4dSvF.cjs → textarea-CqJNviYi.cjs} +1 -1
- package/dist/{textarea-CNa4dSvF.cjs.map → textarea-CqJNviYi.cjs.map} +1 -1
- package/dist/{textarea-DkfGmRSI.js → textarea-D6z1UZzs.js} +1 -1
- package/dist/{textarea-DkfGmRSI.js.map → textarea-D6z1UZzs.js.map} +1 -1
- package/dist/textarea.cjs +1 -1
- package/dist/textarea.js +1 -1
- package/dist/{theme-DCybsrfv.cjs → theme-BpKVBJCr.cjs} +1 -1
- package/dist/{theme-DCybsrfv.cjs.map → theme-BpKVBJCr.cjs.map} +1 -1
- package/dist/{theme-BiCwFfCf.js → theme-DbHfINBV.js} +3 -3
- package/dist/{theme-BiCwFfCf.js.map → theme-DbHfINBV.js.map} +1 -1
- package/dist/{theme-button-DqiA0rJg.js → theme-button-BeU8Nbs2.js} +1 -1
- package/dist/{theme-button-DqiA0rJg.js.map → theme-button-BeU8Nbs2.js.map} +1 -1
- package/dist/{theme-button-cZGRyQRK.cjs → theme-button-Cof9I85G.cjs} +1 -1
- package/dist/{theme-button-cZGRyQRK.cjs.map → theme-button-Cof9I85G.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 +3 -3
- package/dist/{theme.service-BOWIT_5k.js → theme.service-CSzNkqBB.js} +1 -1
- package/dist/{theme.service-BOWIT_5k.js.map → theme.service-CSzNkqBB.js.map} +1 -1
- package/dist/{theme.service-DkdH1t60.cjs → theme.service-CnFUmUpc.cjs} +1 -1
- package/dist/{theme.service-DkdH1t60.cjs.map → theme.service-CnFUmUpc.cjs.map} +1 -1
- 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-D2QUu4-g.cjs.map → utils-C-Q8ePtG.cjs.map} +1 -1
- package/dist/{utils-Cj_nRRyx.js.map → utils-DXE5fBBd.js.map} +1 -1
- package/dist/utils.cjs +1 -1
- package/dist/utils.js +1 -1
- package/dist/visually-hidden.cjs +1 -1
- package/dist/visually-hidden.js +1 -1
- package/dist/{window-BMecbTzs.cjs → window-Cql1aIX2.cjs} +1 -1
- package/dist/{window-BMecbTzs.cjs.map → window-Cql1aIX2.cjs.map} +1 -1
- package/dist/{window-DMy5Gsgu.js → window-DmMNsos0.js} +2 -2
- package/dist/{window-DMy5Gsgu.js.map → window-DmMNsos0.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 +12 -0
- package/src/CLAUDE.md +20 -0
- package/src/area/area.component.ts +155 -342
- 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/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 +8 -0
- package/src/overlay/overlay.component.ts +29 -39
- package/src/overlay/overlay.positioning.ts +10 -2
- package/src/state/index.ts +31 -9
- 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/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 +1 -0
- package/types/src/overlay/overlay.positioning.d.ts +9 -1
- 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-DSdvCpmi.cjs.map +0 -1
- package/dist/chips-m2NPN480.js.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.cjs.map +0 -1
- package/dist/overlay.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/select-UU2pB67h.js.map +0 -1
- package/dist/select-fu_-rZyn.cjs +0 -56
- package/dist/select-fu_-rZyn.cjs.map +0 -1
- package/dist/state-avic94Ft.cjs +0 -1
- /package/dist/agent/{flow-CvG1fLW5.js → flow-3RrZM-e7.js} +0 -0
- /package/dist/agent/{vendor-material-color-DcL7ZPxx.js → vendor-material-color-33Mj762T.js} +0 -0
- /package/dist/{rxjs-utils-Dv9T9IpA.js → rxjs-utils-Cs6XGwF6.js} +0 -0
- /package/dist/{rxjs-utils-BKB2UM_j.cjs → rxjs-utils-Dsj75cJy.cjs} +0 -0
- /package/dist/{utils-D2QUu4-g.cjs → utils-C-Q8ePtG.cjs} +0 -0
- /package/dist/{utils-Cj_nRRyx.js → utils-DXE5fBBd.js} +0 -0
package/src/CLAUDE.md
CHANGED
|
@@ -18,6 +18,26 @@ by the Claude Code plugin. Drift here means drift everywhere.
|
|
|
18
18
|
|
|
19
19
|
## Source-author rules (not in the consumer docs)
|
|
20
20
|
|
|
21
|
+
### Host sizing — `inline-flex` + `flex-1` pattern
|
|
22
|
+
|
|
23
|
+
Every component whose `:host` carries visual affordances (box-shadow, transform) must follow the same pattern native `<button>` uses:
|
|
24
|
+
|
|
25
|
+
```css
|
|
26
|
+
/* ✓ correct */
|
|
27
|
+
:host { display: inline-flex; } /* host is a flex container */
|
|
28
|
+
:host([width="full"]) { display: flex; width: 100%; }
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
/* inner interactive element */
|
|
33
|
+
'flex-1 ...' : true, /* ✓ resolves against the flex container's available space */
|
|
34
|
+
'w-full ...' : true, /* ✗ resolves against the containing block content-box — wrong when host is blockified by a parent flex layout */
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
**Why `flex-1` not `w-full`:** when a flex/grid parent stretches the `<schmancy-button>` host, `width: 100%` on the inner `<button>` resolves against the host's *containing-block content-box*, which remains content-sized for `inline-flex` hosts. The outer (flex-stretched) size and the inner (content-sized) size split — the inner element is narrower than the host, so `:host(:hover)` box-shadow fires across the full stretched area while the visible button fill is narrower. `flex-1` uses `flex-basis: 0` + grow, which resolves against the flex container's *available space* — always the stretched width — with no circular-percentage issue. This matches native `<button>` behavior: content-sized inline, stretches in flex containers.
|
|
38
|
+
|
|
39
|
+
**Applies to:** `schmancy-button`, `schmancy-icon-button`, and any future component with host-level visual affordances.
|
|
40
|
+
|
|
21
41
|
### Component skeleton
|
|
22
42
|
|
|
23
43
|
Every concrete component:
|
|
@@ -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'
|
|
@@ -31,407 +30,221 @@ export class SchmancyArea extends SchmancyElement {
|
|
|
31
30
|
}
|
|
32
31
|
`]
|
|
33
32
|
|
|
34
|
-
/**
|
|
35
|
-
* The name of the router outlet
|
|
36
|
-
* @attr
|
|
37
|
-
* @type {string}
|
|
38
|
-
* @public
|
|
39
|
-
* @required
|
|
40
|
-
*/
|
|
41
33
|
@property() name!: string
|
|
42
34
|
|
|
43
35
|
@property() default!: RouteComponent
|
|
44
36
|
|
|
45
|
-
/**
|
|
46
|
-
* Query for assigned route elements in the slot
|
|
47
|
-
* This will automatically update when slot content changes
|
|
48
|
-
*/
|
|
49
37
|
@queryAssignedElements({ selector: 'schmancy-route', flatten: true })
|
|
50
38
|
private routes!: SchmancyRoute[]
|
|
51
39
|
|
|
52
40
|
protected firstUpdated(): void {
|
|
53
41
|
if (!this.name) throw new Error('Area name is required')
|
|
54
42
|
|
|
55
|
-
// Single unified routing pipeline with all logic inline
|
|
56
43
|
merge(
|
|
57
|
-
//
|
|
44
|
+
// Programmatic navigation
|
|
58
45
|
area.request.pipe(
|
|
59
46
|
filter(({ area }) => area === this.name),
|
|
60
47
|
),
|
|
61
48
|
|
|
62
|
-
//
|
|
49
|
+
// Initial URL parse
|
|
63
50
|
of(null).pipe(
|
|
64
|
-
take(1),
|
|
65
51
|
map(() => {
|
|
66
|
-
// Parse route from URL on initial load
|
|
67
52
|
const path = location.pathname
|
|
68
53
|
const lastSegment = path.split('/').pop() || ''
|
|
69
|
-
|
|
70
|
-
// Check for JSON encoded route in URL
|
|
71
54
|
if (lastSegment && (lastSegment.includes('{') || lastSegment.includes('%7B'))) {
|
|
72
55
|
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
|
|
56
|
+
const parsed = JSON.parse(decodeURIComponent(lastSegment))
|
|
57
|
+
if (typeof parsed === 'object' && parsed !== null && parsed[this.name]) {
|
|
58
|
+
const r = parsed[this.name]
|
|
59
|
+
return { area: this.name, component: r.component, state: r.state || {}, params: r.params || {}, props: r.props || {}, historyStrategy: HISTORY_STRATEGY.replace } as RouteAction
|
|
83
60
|
}
|
|
84
61
|
} catch {}
|
|
85
62
|
}
|
|
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
|
-
|
|
63
|
+
const matchingSegment = path.split('/').filter(Boolean).find(seg => this.routes?.some(r => r.when === seg))
|
|
93
64
|
if (matchingSegment) {
|
|
94
|
-
return {
|
|
95
|
-
area: this.name,
|
|
96
|
-
component: matchingSegment,
|
|
97
|
-
state: {},
|
|
98
|
-
params: {},
|
|
99
|
-
historyStrategy: HISTORY_STRATEGY.silent,
|
|
100
|
-
} as RouteAction
|
|
65
|
+
return { area: this.name, component: matchingSegment, state: {}, params: {}, historyStrategy: HISTORY_STRATEGY.silent } as RouteAction
|
|
101
66
|
}
|
|
102
|
-
|
|
103
|
-
// Use default route if available
|
|
104
67
|
return this.default
|
|
105
|
-
? {
|
|
106
|
-
area: this.name,
|
|
107
|
-
component: this.default,
|
|
108
|
-
state: {},
|
|
109
|
-
params: {},
|
|
110
|
-
historyStrategy: HISTORY_STRATEGY.silent,
|
|
111
|
-
} as RouteAction
|
|
68
|
+
? { area: this.name, component: this.default, state: {}, params: {}, historyStrategy: HISTORY_STRATEGY.silent } as RouteAction
|
|
112
69
|
: null
|
|
113
|
-
})
|
|
70
|
+
}),
|
|
114
71
|
),
|
|
115
72
|
|
|
116
|
-
//
|
|
73
|
+
// Browser back/forward
|
|
117
74
|
fromEvent<PopStateEvent>(window, 'popstate').pipe(
|
|
118
75
|
map(() => {
|
|
119
|
-
// Parse route from browser state during popstate
|
|
120
|
-
// First check history state
|
|
121
76
|
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
|
|
77
|
+
const s = history.state.schmancyAreas[this.name]
|
|
78
|
+
return { area: this.name, component: s.component, state: s.state || {}, params: s.params || {}, props: s.props || {}, historyStrategy: HISTORY_STRATEGY.pop } as RouteAction
|
|
131
79
|
}
|
|
132
|
-
|
|
133
|
-
// Fallback to URL parsing if no state (e.g., navigating to root)
|
|
134
80
|
const path = location.pathname
|
|
135
81
|
const lastSegment = path.split('/').pop() || ''
|
|
136
|
-
|
|
137
|
-
// Check for JSON encoded route in URL
|
|
138
82
|
if (lastSegment && (lastSegment.includes('{') || lastSegment.includes('%7B'))) {
|
|
139
83
|
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
|
|
84
|
+
const parsed = JSON.parse(decodeURIComponent(lastSegment))
|
|
85
|
+
if (typeof parsed === 'object' && parsed !== null && parsed[this.name]) {
|
|
86
|
+
const r = parsed[this.name]
|
|
87
|
+
return { area: this.name, component: r.component, state: r.state || {}, params: r.params || {}, props: r.props || {}, historyStrategy: HISTORY_STRATEGY.replace } as RouteAction
|
|
150
88
|
}
|
|
151
89
|
} catch {}
|
|
152
90
|
}
|
|
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
|
-
|
|
91
|
+
const matchingSegment = path.split('/').filter(Boolean).find(seg => this.routes?.some(r => r.when === seg))
|
|
160
92
|
if (matchingSegment) {
|
|
161
|
-
return {
|
|
162
|
-
area: this.name,
|
|
163
|
-
component: matchingSegment,
|
|
164
|
-
state: {},
|
|
165
|
-
params: {},
|
|
166
|
-
historyStrategy: HISTORY_STRATEGY.silent,
|
|
167
|
-
} as RouteAction
|
|
93
|
+
return { area: this.name, component: matchingSegment, state: {}, params: {}, historyStrategy: HISTORY_STRATEGY.silent } as RouteAction
|
|
168
94
|
}
|
|
169
|
-
|
|
170
|
-
// Use default route if available
|
|
171
95
|
return this.default
|
|
172
|
-
? {
|
|
173
|
-
area: this.name,
|
|
174
|
-
component: this.default,
|
|
175
|
-
state: {},
|
|
176
|
-
params: {},
|
|
177
|
-
historyStrategy: HISTORY_STRATEGY.silent,
|
|
178
|
-
} as RouteAction
|
|
96
|
+
? { area: this.name, component: this.default, state: {}, params: {}, historyStrategy: HISTORY_STRATEGY.silent } as RouteAction
|
|
179
97
|
: null
|
|
180
|
-
})
|
|
181
|
-
)
|
|
98
|
+
}),
|
|
99
|
+
),
|
|
182
100
|
).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
|
|
101
|
+
filter((r): r is RouteAction => r !== null),
|
|
102
|
+
|
|
103
|
+
// Per-navigation error isolation — one bad nav skips, outer stream keeps flowing
|
|
104
|
+
switchMap(action => of(action).pipe(
|
|
105
|
+
// Step 1: resolve component + find matched route
|
|
106
|
+
switchMap(action => {
|
|
107
|
+
let component: RouteComponent | null = action.component
|
|
108
|
+
let matchedRoute: SchmancyRoute | undefined
|
|
109
|
+
|
|
110
|
+
if (typeof component === 'string' && this.routes) {
|
|
111
|
+
matchedRoute = this.routes.find(r => r.when === component)
|
|
112
|
+
if (matchedRoute) component = matchedRoute.component
|
|
199
113
|
}
|
|
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 }
|
|
114
|
+
if (!matchedRoute && component instanceof HTMLElement && this.routes) {
|
|
115
|
+
matchedRoute = this.routes.find(r => r.when === component.tagName.toLowerCase())
|
|
220
116
|
}
|
|
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 }
|
|
117
|
+
if (!matchedRoute && typeof component === 'function' && 'preload' in component) {
|
|
118
|
+
return from(
|
|
119
|
+
(component as () => Promise<{ default: CustomElementConstructor }>)().then(m => ({
|
|
120
|
+
...action,
|
|
121
|
+
component: m.default as RouteComponent,
|
|
122
|
+
matchedRoute: this.routes?.find(r => r.when === (customElements.getName(m.default) ?? '')) ?? undefined,
|
|
123
|
+
}))
|
|
124
|
+
)
|
|
277
125
|
}
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
126
|
+
return of({ ...action, component, matchedRoute })
|
|
127
|
+
}),
|
|
128
|
+
|
|
129
|
+
// Step 2: guard check
|
|
130
|
+
switchMap(carry => {
|
|
131
|
+
if (!carry.matchedRoute?.guard) return of(carry)
|
|
132
|
+
return carry.matchedRoute.guard.pipe(
|
|
133
|
+
switchMap(allowed => {
|
|
134
|
+
if (allowed) return of(carry)
|
|
135
|
+
carry.matchedRoute?.dispatchEvent(new CustomEvent('redirect', {
|
|
136
|
+
detail: { blockedRoute: carry.matchedRoute?.when ?? 'unknown', area: this.name, params: carry.params || {}, state: carry.state || {} },
|
|
137
|
+
bubbles: true,
|
|
138
|
+
composed: true,
|
|
139
|
+
}))
|
|
140
|
+
return EMPTY
|
|
141
|
+
}),
|
|
142
|
+
)
|
|
143
|
+
}),
|
|
144
|
+
|
|
145
|
+
// Step 3: load lazy component (after guard, for perf)
|
|
146
|
+
switchMap(carry => {
|
|
147
|
+
if (!(typeof carry.component === 'function' && 'preload' in carry.component)) return of(carry)
|
|
148
|
+
return from(
|
|
149
|
+
(carry.component as () => Promise<{ default: CustomElementConstructor }>)()
|
|
150
|
+
.then(m => ({ ...carry, component: m.default as RouteComponent }))
|
|
151
|
+
)
|
|
152
|
+
}),
|
|
153
|
+
|
|
154
|
+
// Step 4: dedup key
|
|
155
|
+
map(carry => {
|
|
156
|
+
const c = carry.component
|
|
157
|
+
const id =
|
|
158
|
+
!c || c === '' ? 'null'
|
|
159
|
+
: typeof c === 'string' ? c
|
|
160
|
+
: c instanceof HTMLElement ? c.tagName.toLowerCase()
|
|
161
|
+
: typeof c === 'function' ? c.name || 'CustomElement'
|
|
162
|
+
: 'null'
|
|
163
|
+
return { ...carry, key: `${id}${JSON.stringify(carry.params)}${JSON.stringify(carry.state)}${JSON.stringify(carry.props)}` }
|
|
164
|
+
}),
|
|
165
|
+
|
|
166
|
+
catchError(err => {
|
|
167
|
+
console.error(`[${this.name}] Navigation error:`, err)
|
|
168
|
+
return EMPTY
|
|
169
|
+
}),
|
|
170
|
+
)),
|
|
302
171
|
|
|
303
|
-
// Step 5: Deduplicate navigation requests
|
|
304
172
|
distinctUntilChanged((a, b) => a.key === b.key),
|
|
305
173
|
|
|
306
|
-
// Step
|
|
307
|
-
map(
|
|
174
|
+
// Step 5: instantiate element
|
|
175
|
+
map(carry => {
|
|
176
|
+
const c = carry.component
|
|
308
177
|
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
|
-
}
|
|
178
|
+
if (typeof c === 'string' && c !== '') {
|
|
179
|
+
try { element = document.createElement(c) } catch { console.error(`[${this.name}] Failed to create element:`, c) }
|
|
180
|
+
} else if (c instanceof HTMLElement) {
|
|
181
|
+
element = c
|
|
182
|
+
} else if (typeof c === 'function') {
|
|
183
|
+
try { element = new (c as CustomElementConstructor)() } catch (e) { console.error(`[${this.name}] Failed to instantiate:`, e) }
|
|
327
184
|
}
|
|
328
|
-
|
|
329
|
-
// Apply properties
|
|
330
185
|
if (element) {
|
|
331
|
-
if (
|
|
332
|
-
if (
|
|
333
|
-
if (
|
|
186
|
+
if (carry.params) Object.assign(element, carry.params)
|
|
187
|
+
if (carry.props) Object.assign(element, carry.props)
|
|
188
|
+
if (carry.state) Object.assign(element, { state: carry.state })
|
|
334
189
|
}
|
|
335
|
-
|
|
336
|
-
return { element, route }
|
|
190
|
+
return { ...carry, element }
|
|
337
191
|
}),
|
|
338
192
|
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
// Clear if no new component
|
|
371
|
-
if (!newComponent) {
|
|
372
|
-
oldComponent?.remove()
|
|
373
|
-
return
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
// Get animation duration (0 = instant, default = 150ms)
|
|
377
|
-
const duration = routeAction.animationDuration ?? 150
|
|
378
|
-
|
|
379
|
-
// Animate transition (or instant swap if duration is 0)
|
|
380
|
-
if (duration === 0) {
|
|
381
|
-
// Instant swap - no animation
|
|
382
|
-
oldComponent?.remove()
|
|
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'
|
|
193
|
+
// Step 6: swap DOM, write area state, update history
|
|
194
|
+
tap(carry => {
|
|
195
|
+
const old = Array.from(this.children).find(c => !(c instanceof SchmancyRoute)) as HTMLElement | undefined
|
|
196
|
+
const { element } = carry
|
|
197
|
+
|
|
198
|
+
if (!element) { old?.remove(); return }
|
|
199
|
+
|
|
200
|
+
const duration = carry.animationDuration ?? 150
|
|
201
|
+
|
|
202
|
+
if (duration === 0) {
|
|
203
|
+
old?.remove()
|
|
204
|
+
this.appendChild(element)
|
|
205
|
+
} else if (old) {
|
|
206
|
+
old.style.willChange = 'opacity'
|
|
207
|
+
element.style.willChange = 'opacity'
|
|
208
|
+
old.style.contentVisibility = 'hidden'
|
|
209
|
+
old.animate([{ opacity: 1 }, { opacity: 0 }], { duration, easing: 'ease-out' }).finished
|
|
210
|
+
.then(() => {
|
|
211
|
+
if (!this.isConnected) return
|
|
212
|
+
old.remove()
|
|
213
|
+
this.appendChild(element)
|
|
214
|
+
return element.animate([{ opacity: 0 }, { opacity: 1 }], { duration, easing: 'ease-in' }).finished
|
|
215
|
+
})
|
|
216
|
+
.then(() => (element.style.willChange = 'auto'))
|
|
217
|
+
} else {
|
|
218
|
+
this.appendChild(element)
|
|
219
|
+
element.animate([{ opacity: 0 }, { opacity: 1 }], {
|
|
220
|
+
duration: duration > 100 ? Math.max(100, duration * 0.66) : duration,
|
|
221
|
+
easing: 'ease-in',
|
|
222
|
+
}).finished.then(() => (element.style.willChange = 'auto'))
|
|
400
223
|
}
|
|
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
224
|
|
|
422
|
-
|
|
423
|
-
|
|
225
|
+
const activeRoute: ActiveRoute = {
|
|
226
|
+
component: element.tagName.toLowerCase(),
|
|
227
|
+
state: carry.state || {},
|
|
228
|
+
area: this.name,
|
|
229
|
+
params: carry.params || {},
|
|
230
|
+
props: carry.props || {},
|
|
231
|
+
}
|
|
232
|
+
area.current.set(this.name, activeRoute)
|
|
233
|
+
area.$current.next(area.current)
|
|
234
|
+
|
|
235
|
+
if (area.enableHistoryMode) {
|
|
236
|
+
area._updateBrowserHistory(
|
|
237
|
+
this.name,
|
|
238
|
+
activeRoute,
|
|
239
|
+
carry.historyStrategy ?? HISTORY_STRATEGY.push,
|
|
240
|
+
carry.clearQueryParams,
|
|
241
|
+
carry.path,
|
|
242
|
+
)
|
|
243
|
+
}
|
|
244
|
+
}),
|
|
424
245
|
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
area._updateBrowserHistory(
|
|
428
|
-
this.name,
|
|
429
|
-
activeRoute,
|
|
430
|
-
routeAction.historyStrategy || HISTORY_STRATEGY.push,
|
|
431
|
-
routeAction.clearQueryParams,
|
|
432
|
-
routeAction.path
|
|
433
|
-
)
|
|
434
|
-
}
|
|
246
|
+
takeUntil(this.disconnecting),
|
|
247
|
+
).subscribe()
|
|
435
248
|
}
|
|
436
249
|
|
|
437
250
|
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
|