@mhmo91/schmancy 0.10.16 → 0.10.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/active-host-BP0zy_Y9.js.map +1 -1
- package/dist/agent/flow-CvG1fLW5.js.map +1 -1
- package/dist/agent/schmancy.agent.js +3730 -3804
- package/dist/agent/schmancy.agent.js.map +1 -1
- package/dist/agent/vendor-material-color-DcL7ZPxx.js.map +1 -1
- package/dist/animation-DCznELuT.js.map +1 -1
- package/dist/{area-ChxsDTu_.js → area-BIipuSyO.js} +1 -1
- package/dist/{area-ChxsDTu_.js.map → area-BIipuSyO.js.map} +1 -1
- package/dist/{area-Qt6yUnuA.cjs → area-C-EMiNEE.cjs} +1 -1
- package/dist/{area-Qt6yUnuA.cjs.map → area-C-EMiNEE.cjs.map} +1 -1
- package/dist/area.cjs +1 -1
- package/dist/area.js +1 -1
- package/dist/audio-DS43uoRA.js.map +1 -1
- package/dist/{autocomplete-Ck2zbdF9.cjs → autocomplete-B8CE5vGw.cjs} +1 -1
- package/dist/{autocomplete-Ck2zbdF9.cjs.map → autocomplete-B8CE5vGw.cjs.map} +1 -1
- package/dist/{autocomplete-CXvUjMD-.js → autocomplete-Mrb3koUN.js} +2 -2
- package/dist/{autocomplete-CXvUjMD-.js.map → autocomplete-Mrb3koUN.js.map} +1 -1
- package/dist/autocomplete.cjs +1 -1
- package/dist/autocomplete.js +1 -1
- package/dist/avatar.cjs +1 -1
- package/dist/avatar.js +2 -2
- package/dist/avatar.js.map +1 -1
- package/dist/badge.cjs +1 -1
- package/dist/badge.js +1 -1
- package/dist/{boat-DpFkILFF.cjs → boat-DN1_tyvx.cjs} +2 -2
- package/dist/{boat-DpFkILFF.cjs.map → boat-DN1_tyvx.cjs.map} +1 -1
- package/dist/{boat-Bj0wVcZi.js → boat-cuoSkhGI.js} +1 -4
- package/dist/{boat-Bj0wVcZi.js.map → boat-cuoSkhGI.js.map} +1 -1
- package/dist/boat.cjs +1 -1
- package/dist/boat.js +1 -1
- package/dist/breadcrumb.cjs +2 -1
- package/dist/breadcrumb.cjs.map +1 -1
- package/dist/breadcrumb.js +2 -1
- package/dist/breadcrumb.js.map +1 -1
- package/dist/{busy-CtcnclA3.cjs → busy-CMKX4oQf.cjs} +1 -1
- package/dist/{busy-CtcnclA3.cjs.map → busy-CMKX4oQf.cjs.map} +1 -1
- package/dist/{busy-CyZSBnZP.js → busy-Cetzws-m.js} +1 -1
- package/dist/{busy-CyZSBnZP.js.map → busy-Cetzws-m.js.map} +1 -1
- package/dist/busy.cjs +1 -1
- package/dist/busy.js +1 -1
- package/dist/button.cjs +4 -3
- package/dist/button.cjs.map +1 -1
- package/dist/button.js +4 -3
- package/dist/button.js.map +1 -1
- package/dist/{card-Cl6jp1yX.cjs → card-8VXoo2C_.cjs} +1 -1
- package/dist/{card-Cl6jp1yX.cjs.map → card-8VXoo2C_.cjs.map} +1 -1
- package/dist/{card-nYZCKmOO.js → card-D2k3dRL0.js} +1 -1
- package/dist/{card-nYZCKmOO.js.map → card-D2k3dRL0.js.map} +1 -1
- package/dist/card.cjs +1 -1
- package/dist/card.js +1 -1
- package/dist/{checkbox-DiUrZiyc.js → checkbox-8hNsBejz.js} +1 -1
- package/dist/{checkbox-DiUrZiyc.js.map → checkbox-8hNsBejz.js.map} +1 -1
- package/dist/{checkbox-BeNo0ZGt.cjs → checkbox-Cq5wzeaY.cjs} +1 -1
- package/dist/{checkbox-BeNo0ZGt.cjs.map → checkbox-Cq5wzeaY.cjs.map} +1 -1
- package/dist/checkbox.cjs +1 -1
- package/dist/checkbox.js +1 -1
- package/dist/{chips-DK6m-VCM.cjs → chips-DSdvCpmi.cjs} +9 -18
- package/dist/chips-DSdvCpmi.cjs.map +1 -0
- package/dist/{chips-CfPFXv7Z.js → chips-m2NPN480.js} +8 -22
- package/dist/chips-m2NPN480.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/connectivity.js.map +1 -1
- package/dist/content-drawer.cjs +1 -1
- package/dist/content-drawer.js +1 -1
- package/dist/cursor-glow-Cs2XLDB9.js.map +1 -1
- package/dist/{date-range-DjlF2u7o.js → date-range-D98QcCHl.js} +2 -2
- package/dist/{date-range-DjlF2u7o.js.map → date-range-D98QcCHl.js.map} +1 -1
- package/dist/{date-range-DA6anfcF.cjs → date-range-DxS3Agbj.cjs} +1 -1
- package/dist/{date-range-DA6anfcF.cjs.map → date-range-DxS3Agbj.cjs.map} +1 -1
- package/dist/{date-range-inline-BfYK795W.cjs → date-range-inline-Bvs2ZvEY.cjs} +1 -1
- package/dist/{date-range-inline-BfYK795W.cjs.map → date-range-inline-Bvs2ZvEY.cjs.map} +1 -1
- package/dist/{date-range-inline-n7y_H6PJ.js → date-range-inline-TWWnTZlw.js} +1 -1
- package/dist/{date-range-inline-n7y_H6PJ.js.map → date-range-inline-TWWnTZlw.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/delay.js.map +1 -1
- package/dist/{details-CS_ToAOj.js → details-Cpg8sH2F.js} +3 -8
- package/dist/details-Cpg8sH2F.js.map +1 -0
- package/dist/{details-BdAVsLl-.cjs → details-CwSDur6j.cjs} +2 -6
- package/dist/details-CwSDur6j.cjs.map +1 -0
- package/dist/details.cjs +1 -1
- package/dist/details.js +1 -1
- package/dist/directives.cjs.map +1 -1
- package/dist/directives.js.map +1 -1
- package/dist/discovery.js.map +1 -1
- package/dist/{divider-CvWAnvdO.cjs → divider-BNdVLE0H.cjs} +1 -1
- package/dist/{divider-CvWAnvdO.cjs.map → divider-BNdVLE0H.cjs.map} +1 -1
- package/dist/{divider-COLK0RbT.js → divider-Be833gGZ.js} +1 -1
- package/dist/{divider-COLK0RbT.js.map → divider-Be833gGZ.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/dropdown.js.map +1 -1
- package/dist/{expand-r2sATPUJ.cjs → expand-BP6RLzHw.cjs} +1 -1
- package/dist/{expand-r2sATPUJ.cjs.map → expand-BP6RLzHw.cjs.map} +1 -1
- package/dist/{expand-D9LzmpoV.js → expand-CtoffNNj.js} +2 -2
- package/dist/{expand-D9LzmpoV.js.map → expand-CtoffNNj.js.map} +1 -1
- package/dist/expand.cjs +1 -1
- package/dist/expand.js +1 -1
- package/dist/{float-2nHYuBx-.cjs → float-B8NcSE3a.cjs} +1 -1
- package/dist/{float-2nHYuBx-.cjs.map → float-B8NcSE3a.cjs.map} +1 -1
- package/dist/{float-BWy39CXr.js → float-C-glc-3u.js} +1 -1
- package/dist/{float-BWy39CXr.js.map → float-C-glc-3u.js.map} +1 -1
- package/dist/float.cjs +1 -1
- package/dist/float.js +1 -1
- package/dist/{form-DhjedCWm.js → form-DJvxIyfW.js} +10 -1
- package/dist/{form-DhjedCWm.js.map → form-DJvxIyfW.js.map} +1 -1
- package/dist/form-St_IwR7y.cjs +42 -0
- package/dist/{form-g5c70rac.cjs.map → form-St_IwR7y.cjs.map} +1 -1
- package/dist/form.cjs +1 -1
- package/dist/form.js +9 -2
- package/dist/handover/agent-runtime-followups.md +1 -1
- package/dist/handover/agent-runtime-v1.md +3 -3
- package/dist/hashContent-dJrI-9sc.js.map +1 -1
- package/dist/{icons-1HIENBco.cjs → icons-BJld4JHp.cjs} +1 -1
- package/dist/{icons-1HIENBco.cjs.map → icons-BJld4JHp.cjs.map} +1 -1
- package/dist/{icons-3y0kr1aB.js → icons-D7df1ysG.js} +1 -1
- package/dist/{icons-3y0kr1aB.js.map → icons-D7df1ysG.js.map} +1 -1
- package/dist/icons.cjs +1 -1
- package/dist/icons.js +1 -1
- package/dist/{iframe-Z5gTK-gd.js → iframe-DAbgW9tT.js} +1 -1
- package/dist/{iframe-Z5gTK-gd.js.map → iframe-DAbgW9tT.js.map} +1 -1
- package/dist/{iframe-CjqYuZG5.cjs → iframe-GT6D8l5Z.cjs} +1 -1
- package/dist/{iframe-CjqYuZG5.cjs.map → iframe-GT6D8l5Z.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 +45 -45
- package/dist/{input-BtcIhu0Q.cjs → input-BE9wEEw4.cjs} +1 -1
- package/dist/{input-BtcIhu0Q.cjs.map → input-BE9wEEw4.cjs.map} +1 -1
- package/dist/{input-B-fw6f_r.js → input-DC6ap_uN.js} +1 -1
- package/dist/{input-B-fw6f_r.js.map → input-DC6ap_uN.js.map} +1 -1
- package/dist/{input-chip-DZktYohr.cjs → input-chip-MsiMu-b5.cjs} +4 -4
- package/dist/input-chip-MsiMu-b5.cjs.map +1 -0
- package/dist/{input-chip-CtQ0pH5b.js → input-chip-c5n547tg.js} +3 -6
- package/dist/input-chip-c5n547tg.js.map +1 -0
- 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/json.js.map +1 -1
- package/dist/kbd.cjs +1 -1
- package/dist/kbd.js +1 -1
- package/dist/kbd.js.map +1 -1
- package/dist/layout-BH28sKGc.js.map +1 -1
- package/dist/layout.cjs +1 -1
- package/dist/layout.js +1 -1
- package/dist/lazy-D-bO2r4m.js.map +1 -1
- package/dist/{lightbox-BL3LWp-P.js → lightbox-CNX9Eg3U.js} +4 -4
- package/dist/lightbox-CNX9Eg3U.js.map +1 -0
- package/dist/{lightbox-BHTZOn8K.cjs → lightbox-HqJBBjAT.cjs} +4 -4
- package/dist/lightbox-HqJBBjAT.cjs.map +1 -0
- package/dist/lightbox.cjs +1 -1
- package/dist/lightbox.js +1 -1
- package/dist/{list-DLJL1JQj.js → list-C76Pb-c1.js} +1 -1
- package/dist/{list-DLJL1JQj.js.map → list-C76Pb-c1.js.map} +1 -1
- package/dist/{list-CHYa5VGY.cjs → list-bhyuQSyO.cjs} +1 -1
- package/dist/{list-CHYa5VGY.cjs.map → list-bhyuQSyO.cjs.map} +1 -1
- package/dist/list.cjs +1 -1
- package/dist/list.js +1 -1
- package/dist/magnetic-DxvoEz8_.js.map +1 -1
- package/dist/{menu-BNq93w6X.js → menu-B_-weNpZ.js} +2 -2
- package/dist/{menu-BNq93w6X.js.map → menu-B_-weNpZ.js.map} +1 -1
- package/dist/{menu-DAikvkeV.cjs → menu-Dag0cuWV.cjs} +1 -1
- package/dist/{menu-DAikvkeV.cjs.map → menu-Dag0cuWV.cjs.map} +1 -1
- package/dist/menu.cjs +1 -1
- package/dist/menu.js +1 -1
- package/dist/mixins-DCVXqL1Q.js +636 -0
- package/dist/{mixins-BWb9_e1s.js.map → mixins-DCVXqL1Q.js.map} +1 -1
- package/dist/mixins-Du9HMrIG.cjs +254 -0
- package/dist/{mixins-BOOu6q2n.cjs.map → mixins-Du9HMrIG.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/navigation-rail.js.map +1 -1
- package/dist/{notification-CUmb9c3Y.js → notification-DySnvQeO.js} +3 -3
- package/dist/notification-DySnvQeO.js.map +1 -0
- package/dist/{notification-Dy2azMyt.cjs → notification-yd2KeHjd.cjs} +1 -1
- package/dist/notification-yd2KeHjd.cjs.map +1 -0
- package/dist/notification.cjs +1 -1
- package/dist/notification.js +1 -1
- package/dist/{option-CDgIKifG.cjs → option-BDOKUqTy.cjs} +1 -1
- package/dist/{option-CDgIKifG.cjs.map → option-BDOKUqTy.cjs.map} +1 -1
- package/dist/{option-DFvQ551b.js → option-CBEHYG4U.js} +1 -1
- package/dist/{option-DFvQ551b.js.map → option-CBEHYG4U.js.map} +1 -1
- package/dist/option.cjs +1 -1
- package/dist/option.js +1 -1
- package/dist/overlay-stack-BR4iYivO.js.map +1 -1
- package/dist/overlay.cjs +1 -1
- package/dist/overlay.cjs.map +1 -1
- package/dist/{overlay.confirm-body-uFp-0Zfh.js → overlay.confirm-body-DESGpbru.js} +2 -2
- package/dist/{overlay.confirm-body-uFp-0Zfh.js.map → overlay.confirm-body-DESGpbru.js.map} +1 -1
- package/dist/{overlay.confirm-body-BkhNvr0c.cjs → overlay.confirm-body-sUmd_zVy.cjs} +2 -2
- package/dist/{overlay.confirm-body-BkhNvr0c.cjs.map → overlay.confirm-body-sUmd_zVy.cjs.map} +1 -1
- package/dist/overlay.js +3 -3
- package/dist/overlay.js.map +1 -1
- package/dist/{overlay.service-1YWfUD2S.cjs → overlay.service-BxtEFFSH.cjs} +1 -1
- package/dist/{overlay.service-1YWfUD2S.cjs.map → overlay.service-BxtEFFSH.cjs.map} +1 -1
- package/dist/{overlay.service-BcF12kGb.js → overlay.service-DV_o_xQ0.js} +2 -2
- package/dist/{overlay.service-BcF12kGb.js.map → overlay.service-DV_o_xQ0.js.map} +1 -1
- package/dist/page.cjs +1 -1
- package/dist/page.js +2 -2
- package/dist/page.js.map +1 -1
- package/dist/{progress-bLbGRuQ1.js → progress-C4kDZfb7.js} +1 -1
- package/dist/{progress-bLbGRuQ1.js.map → progress-C4kDZfb7.js.map} +1 -1
- package/dist/{progress-C02sWkmE.cjs → progress-CMSst_2U.cjs} +1 -1
- package/dist/{progress-C02sWkmE.cjs.map → progress-CMSst_2U.cjs.map} +1 -1
- package/dist/progress.cjs +1 -1
- package/dist/progress.js +1 -1
- package/dist/{radio-group-DA4eIGCj.js → radio-group-DB9D2ZkA.js} +1 -1
- package/dist/{radio-group-DA4eIGCj.js.map → radio-group-DB9D2ZkA.js.map} +1 -1
- package/dist/{radio-group-BA-jRct5.cjs → radio-group-dVUvYFq7.cjs} +1 -1
- package/dist/{radio-group-BA-jRct5.cjs.map → radio-group-dVUvYFq7.cjs.map} +1 -1
- package/dist/radio-group.cjs +1 -1
- package/dist/radio-group.js +1 -1
- package/dist/range.cjs +1 -1
- package/dist/range.js +1 -1
- package/dist/range.js.map +1 -1
- package/dist/reduced-motion-D7LqTUMn.js.map +1 -1
- package/dist/{rxjs-utils-kWPShgKu.cjs.map → rxjs-utils-BKB2UM_j.cjs.map} +1 -1
- package/dist/{rxjs-utils-D9U4MW0Q.js.map → rxjs-utils-Dv9T9IpA.js.map} +1 -1
- package/dist/rxjs-utils.cjs +1 -1
- package/dist/rxjs-utils.js +1 -1
- package/dist/{scroll-CG5up5oy.js → scroll-C1klVgSQ.js} +1 -1
- package/dist/{scroll-CG5up5oy.js.map → scroll-C1klVgSQ.js.map} +1 -1
- package/dist/{scroll-D8vBF_gY.cjs → scroll-S-bXF2u6.cjs} +1 -1
- package/dist/{scroll-D8vBF_gY.cjs.map → scroll-S-bXF2u6.cjs.map} +1 -1
- package/dist/search-MvIBA93K.js.map +1 -1
- package/dist/{select-BrK1BJoU.js → select-UU2pB67h.js} +2 -2
- package/dist/{select-BrK1BJoU.js.map → select-UU2pB67h.js.map} +1 -1
- package/dist/{select-Dh2j7Qc-.cjs → select-fu_-rZyn.cjs} +1 -1
- package/dist/{select-Dh2j7Qc-.cjs.map → select-fu_-rZyn.cjs.map} +1 -1
- package/dist/select.cjs +1 -1
- package/dist/select.js +1 -1
- package/dist/skeleton.cjs +1 -1
- package/dist/skeleton.js +1 -1
- package/dist/skeleton.js.map +1 -1
- package/dist/skills/SKILL.md +3 -0
- package/dist/skills/schmancy/SKILL.md +3 -0
- package/dist/slider.cjs +1 -1
- package/dist/slider.js +1 -1
- package/dist/slider.js.map +1 -1
- package/dist/sound.service-BIN2W7Rv.js.map +1 -1
- package/dist/{splash-screen-Kr1sPtME.cjs → splash-screen-25PTDqnp.cjs} +1 -1
- package/dist/{splash-screen-Kr1sPtME.cjs.map → splash-screen-25PTDqnp.cjs.map} +1 -1
- package/dist/{splash-screen-BcjjJSlK.js → splash-screen-bGW_sS4i.js} +1 -1
- package/dist/{splash-screen-BcjjJSlK.js.map → splash-screen-bGW_sS4i.js.map} +1 -1
- package/dist/splash-screen.cjs +1 -1
- package/dist/splash-screen.js +1 -1
- package/dist/{src-B2-CU8fu.cjs → src-Blm9PNcf.cjs} +1 -1
- package/dist/{src-B2-CU8fu.cjs.map → src-Blm9PNcf.cjs.map} +1 -1
- package/dist/{src-DvywUq7l.js → src-olrlFt4e.js} +35 -35
- package/dist/{src-DvywUq7l.js.map → src-olrlFt4e.js.map} +1 -1
- package/dist/state-avic94Ft.cjs.map +1 -1
- package/dist/state-nm8yzMPp.js.map +1 -1
- package/dist/steps.cjs +1 -1
- package/dist/steps.js +1 -1
- package/dist/steps.js.map +1 -1
- package/dist/{surface-BtMMHKol.js → surface-DCRy-EyT.js} +1 -1
- package/dist/{surface-BtMMHKol.js.map → surface-DCRy-EyT.js.map} +1 -1
- package/dist/{surface-CgXeKdGL.cjs → surface-DWwQDX9r.cjs} +1 -1
- package/dist/{surface-CgXeKdGL.cjs.map → surface-DWwQDX9r.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/switch.js.map +1 -1
- package/dist/table.cjs +1 -1
- package/dist/table.js +1 -1
- package/dist/table.js.map +1 -1
- package/dist/{tabs-CikPr7by.js → tabs-BVC_qn8S.js} +1 -1
- package/dist/{tabs-CikPr7by.js.map → tabs-BVC_qn8S.js.map} +1 -1
- package/dist/{tabs-CitVls3_.cjs → tabs-Dc3_Ox2B.cjs} +1 -1
- package/dist/{tabs-CitVls3_.cjs.map → tabs-Dc3_Ox2B.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-CqV1wvmB.cjs → textarea-CNa4dSvF.cjs} +1 -1
- package/dist/{textarea-CqV1wvmB.cjs.map → textarea-CNa4dSvF.cjs.map} +1 -1
- package/dist/{textarea-DVkwQSis.js → textarea-DkfGmRSI.js} +1 -1
- package/dist/{textarea-DVkwQSis.js.map → textarea-DkfGmRSI.js.map} +1 -1
- package/dist/textarea.cjs +1 -1
- package/dist/textarea.js +1 -1
- package/dist/{theme-BIWS4TOW.js → theme-BiCwFfCf.js} +2 -2
- package/dist/{theme-BIWS4TOW.js.map → theme-BiCwFfCf.js.map} +1 -1
- package/dist/{theme-DMgjiKda.cjs → theme-DCybsrfv.cjs} +1 -1
- package/dist/{theme-DMgjiKda.cjs.map → theme-DCybsrfv.cjs.map} +1 -1
- package/dist/{theme-button-DC_shZ_7.js → theme-button-DqiA0rJg.js} +1 -1
- package/dist/{theme-button-DC_shZ_7.js.map → theme-button-DqiA0rJg.js.map} +1 -1
- package/dist/{theme-button-ENKa3TPT.cjs → theme-button-cZGRyQRK.cjs} +1 -1
- package/dist/{theme-button-ENKa3TPT.cjs.map → theme-button-cZGRyQRK.cjs.map} +1 -1
- package/dist/theme-button.cjs +1 -1
- package/dist/theme-button.js +1 -1
- package/dist/theme.cjs +1 -1
- package/dist/{theme.interface-C8OHheXg.js.map → theme.interface-C2XNgsLB.js.map} +1 -1
- package/dist/{theme.interface-CYo4UpWK.cjs.map → theme.interface-D4NeufQA.cjs.map} +1 -1
- package/dist/theme.js +3 -3
- package/dist/theme.service-BOWIT_5k.js.map +1 -1
- package/dist/tooltip.js.map +1 -1
- package/dist/tree.cjs +1 -1
- package/dist/tree.js +1 -1
- package/dist/tree.js.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/typewriter.cjs.map +1 -1
- package/dist/typewriter.js.map +1 -1
- package/dist/typography.cjs +1 -1
- package/dist/typography.js +1 -1
- package/dist/typography.js.map +1 -1
- package/dist/utils-Cj_nRRyx.js.map +1 -1
- package/dist/visually-hidden.cjs +1 -1
- package/dist/visually-hidden.js +1 -1
- package/dist/visually-hidden.js.map +1 -1
- package/dist/{window-DGydMS0g.cjs → window-BMecbTzs.cjs} +3 -3
- package/dist/window-BMecbTzs.cjs.map +1 -0
- package/dist/{window-BTecgE_U.js → window-DMy5Gsgu.js} +3 -10
- package/dist/window-DMy5Gsgu.js.map +1 -0
- package/dist/window.cjs +1 -1
- package/dist/window.js +1 -1
- package/package.json +1 -1
- package/skills/schmancy/SKILL.md +3 -0
- package/src/boat/boat.ts +0 -3
- package/src/breadcrumb/breadcrumb.ts +1 -0
- package/src/button/button.ts +1 -1
- package/src/button/icon-button.ts +2 -1
- package/src/chips/assist-chip.ts +2 -1
- package/src/chips/filter-chip.ts +2 -16
- package/src/chips/input-chip.ts +2 -5
- package/src/chips/suggestion-chip.ts +2 -3
- package/src/details/details.ts +2 -7
- package/src/form/fields/index.ts +9 -0
- package/src/form/index.ts +1 -0
- package/src/lightbox/lightbox.ts +3 -3
- package/src/notification/notification.scss +0 -1
- package/src/overlay/overlay.confirm-body.ts +1 -1
- package/src/surface/surface.styles.ts +1 -45
- package/src/window/window.ts +0 -12
- package/types/src/form/fields/index.d.ts +9 -0
- package/types/src/form/index.d.ts +1 -0
- package/types/src/window/window.d.ts +0 -2
- package/dist/chips-CfPFXv7Z.js.map +0 -1
- package/dist/chips-DK6m-VCM.cjs.map +0 -1
- package/dist/details-BdAVsLl-.cjs.map +0 -1
- package/dist/details-CS_ToAOj.js.map +0 -1
- package/dist/form-g5c70rac.cjs +0 -42
- package/dist/input-chip-CtQ0pH5b.js.map +0 -1
- package/dist/input-chip-DZktYohr.cjs.map +0 -1
- package/dist/lightbox-BHTZOn8K.cjs.map +0 -1
- package/dist/lightbox-BL3LWp-P.js.map +0 -1
- package/dist/mixins-BOOu6q2n.cjs +0 -298
- package/dist/mixins-BWb9_e1s.js +0 -680
- package/dist/notification-CUmb9c3Y.js.map +0 -1
- package/dist/notification-Dy2azMyt.cjs.map +0 -1
- package/dist/window-BTecgE_U.js.map +0 -1
- package/dist/window-DGydMS0g.cjs.map +0 -1
- /package/dist/{rxjs-utils-kWPShgKu.cjs → rxjs-utils-BKB2UM_j.cjs} +0 -0
- /package/dist/{rxjs-utils-D9U4MW0Q.js → rxjs-utils-Dv9T9IpA.js} +0 -0
- /package/dist/{theme.interface-C8OHheXg.js → theme.interface-C2XNgsLB.js} +0 -0
- /package/dist/{theme.interface-CYo4UpWK.cjs → theme.interface-D4NeufQA.cjs} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"window-DMy5Gsgu.js","names":[],"sources":["../src/window/window-manager.ts","../src/window/window-position.ts","../src/window/window.ts"],"sourcesContent":["/**\n * Window Manager — singleton service for multi-window coordination.\n *\n * Tracks all schmancy-window instances: positions, z-indices, focus, visual states.\n * Components register on connectedCallback, unregister on disconnectedCallback.\n * Focus changes, position updates, and overlap queries all flow through here.\n *\n * Follows the ThemeService singleton pattern (theme/theme.service.ts).\n *\n * Example:\n * windowManager.register('chat-1', bounds, 'bottom-right')\n * windowManager.focus('chat-1') // bumps z-index, updates focusedId\n * const overlaps = windowManager.findOverlaps(projectedBounds, 'chat-1')\n */\n\nimport { BehaviorSubject, Observable, distinctUntilChanged, map } from 'rxjs'\nimport { overlayStack } from '../utils/overlay-stack.js'\nimport type { WindowBounds, WindowRecord, WindowRegistryState, SnapTarget } from './window-registry.js'\n\nconst STORAGE_PREFIX = 'schmancy-window-'\nconst LEGACY_STORAGE_PREFIX = 'schmancy-float-'\n\nclass WindowManagerService {\n\tprivate static instance: WindowManagerService\n\n\tprivate readonly _state$ = new BehaviorSubject<WindowRegistryState>({\n\t\twindows: new Map(),\n\t\tfocusedId: null,\n\t\tstackOrder: [],\n\t})\n\n\treadonly state$ = this._state$.asObservable()\n\n\tprivate constructor() {}\n\n\tstatic getInstance(): WindowManagerService {\n\t\tif (!WindowManagerService.instance) {\n\t\t\tWindowManagerService.instance = new WindowManagerService()\n\t\t}\n\t\treturn WindowManagerService.instance\n\t}\n\n\t// ── Synchronous accessors ──────────────────────────────────────────\n\n\tget windows(): Map<string, WindowRecord> {\n\t\treturn this._state$.value.windows\n\t}\n\n\tget focusedId(): string | null {\n\t\treturn this._state$.value.focusedId\n\t}\n\n\t// ── Registration ───────────────────────────────────────────────────\n\n\tregister(id: string, initialBounds: WindowBounds, snapTarget: SnapTarget): void {\n\t\tconst state = this._state$.value\n\t\tif (state.windows.has(id)) return\n\n\t\tconst zIndex = overlayStack.assignZIndex(id)\n\t\tconst record: WindowRecord = {\n\t\t\tid,\n\t\t\tbounds: initialBounds,\n\t\t\tvisualState: 'normal',\n\t\t\tzIndex,\n\t\t\topen: false,\n\t\t\tsnapTarget,\n\t\t}\n\n\t\tconst windows = new Map(state.windows)\n\t\twindows.set(id, record)\n\t\tconst stackOrder = overlayStack.getStackOrder()\n\n\t\tthis._state$.next({ ...state, windows, stackOrder })\n\t}\n\n\tunregister(id: string): void {\n\t\tconst state = this._state$.value\n\t\tif (!state.windows.has(id)) return\n\n\t\toverlayStack.releaseId(id)\n\t\tconst windows = new Map(state.windows)\n\t\twindows.delete(id)\n\t\tconst stackOrder = overlayStack.getStackOrder()\n\t\tconst focusedId = state.focusedId === id ? null : state.focusedId\n\n\t\tthis._state$.next({ ...state, windows, stackOrder, focusedId })\n\t}\n\n\t// ── State mutations ────────────────────────────────────────────────\n\n\tupdateBounds(id: string, bounds: WindowBounds): void {\n\t\tthis._updateRecord(id, { bounds })\n\t}\n\n\tupdateVisualState(id: string, visualState: WindowRecord['visualState']): void {\n\t\tthis._updateRecord(id, { visualState })\n\t}\n\n\tupdateOpen(id: string, open: boolean): void {\n\t\tthis._updateRecord(id, { open })\n\t}\n\n\tfocus(id: string): void {\n\t\tconst state = this._state$.value\n\t\tif (!state.windows.has(id)) return\n\t\tif (state.focusedId === id) return\n\n\t\tconst zIndex = overlayStack.bringToFront(id)\n\t\tconst windows = new Map(state.windows)\n\t\tconst record = windows.get(id)\n\t\tif (record) {\n\t\t\twindows.set(id, { ...record, zIndex })\n\t\t}\n\t\tconst stackOrder = overlayStack.getStackOrder()\n\n\t\tthis._state$.next({ ...state, windows, stackOrder, focusedId: id })\n\t}\n\n\t// ── Queries ────────────────────────────────────────────────────────\n\n\tfindOverlaps(bounds: WindowBounds, excludeId: string): WindowRecord[] {\n\t\tconst result: WindowRecord[] = []\n\t\tfor (const [id, record] of this._state$.value.windows) {\n\t\t\tif (id === excludeId) continue\n\t\t\tif (rectsOverlap(bounds, record.bounds)) {\n\t\t\t\tresult.push(record)\n\t\t\t}\n\t\t}\n\t\treturn result\n\t}\n\n\tgetNeighbors(id: string): WindowRecord[] {\n\t\tconst result: WindowRecord[] = []\n\t\tfor (const [otherId, record] of this._state$.value.windows) {\n\t\t\tif (otherId !== id) result.push(record)\n\t\t}\n\t\treturn result\n\t}\n\n\t// ── Selectors ──────────────────────────────────────────────────────\n\n\tselectWindow(id: string): Observable<WindowRecord | undefined> {\n\t\treturn this._state$.pipe(\n\t\t\tmap(state => state.windows.get(id)),\n\t\t\tdistinctUntilChanged(),\n\t\t)\n\t}\n\n\tselectFocused(): Observable<string | null> {\n\t\treturn this._state$.pipe(\n\t\t\tmap(state => state.focusedId),\n\t\t\tdistinctUntilChanged(),\n\t\t)\n\t}\n\n\t// ── Persistence ────────────────────────────────────────────────────\n\n\tloadPosition(id: string): { x: number; y: number; anchor: string } | null {\n\t\ttry {\n\t\t\t// Try new key first, fall back to legacy\n\t\t\tconst raw = localStorage.getItem(STORAGE_PREFIX + id) ?? localStorage.getItem(LEGACY_STORAGE_PREFIX + id)\n\t\t\tif (!raw) return null\n\t\t\treturn JSON.parse(raw) as { x: number; y: number; anchor: string }\n\t\t} catch {\n\t\t\treturn null\n\t\t}\n\t}\n\n\tsavePosition(id: string, data: { x: number; y: number; anchor: string }): void {\n\t\ttry {\n\t\t\tlocalStorage.setItem(STORAGE_PREFIX + id, JSON.stringify(data))\n\t\t} catch {\n\t\t\t// ignore\n\t\t}\n\t}\n\n\tclearPosition(id: string): void {\n\t\ttry {\n\t\t\tlocalStorage.removeItem(STORAGE_PREFIX + id)\n\t\t\tlocalStorage.removeItem(LEGACY_STORAGE_PREFIX + id)\n\t\t} catch {\n\t\t\t// ignore\n\t\t}\n\t}\n\n\t// ── Internal ───────────────────────────────────────────────────────\n\n\tprivate _updateRecord(id: string, updates: Partial<WindowRecord>): void {\n\t\tconst state = this._state$.value\n\t\tconst record = state.windows.get(id)\n\t\tif (!record) return\n\n\t\tconst windows = new Map(state.windows)\n\t\twindows.set(id, { ...record, ...updates })\n\t\tthis._state$.next({ ...state, windows })\n\t}\n}\n\n/** Simple rect overlap check (inline — no circular import with window-position) */\nfunction rectsOverlap(a: WindowBounds, b: WindowBounds): boolean {\n\treturn !(a.left >= b.left + b.width || a.left + a.width <= b.left || a.top >= b.top + b.height || a.top + a.height <= b.top)\n}\n\nexport const windowManager = WindowManagerService.getInstance()\n","/**\n * Window Position — pure functions for overlap resolution, cascade, and snapping.\n *\n * All functions are stateless: they take window bounds and viewport dimensions,\n * return new bounds. No side effects, no DOM access, no subscriptions.\n *\n * Example:\n * const projected = { left: 100, top: 400, width: 360, height: 500 }\n * const neighbors = windowManager.findOverlaps(projected, 'my-id')\n * const resolved = resolveOverlap(projected, neighbors, { width: 1440, height: 900 })\n * // → { left: 144, top: 444, width: 360, height: 500 } (cascaded away from conflict)\n */\n\nimport type { WindowBounds, WindowRecord } from './window-registry.js'\n\nconst HEAD_HEIGHT = 44\nconst CASCADE_OFFSET = HEAD_HEIGHT\nconst MAX_CASCADE_ATTEMPTS = 10\n\n/** Check if two rectangles overlap (edges touching does NOT count as overlap) */\nexport function rectsOverlap(a: WindowBounds, b: WindowBounds): boolean {\n\treturn !(a.left >= b.left + b.width || a.left + a.width <= b.left || a.top >= b.top + b.height || a.top + a.height <= b.top)\n}\n\n/**\n * Resolve overlap by cascading diagonally until no conflict.\n * Shifts by (HEAD_HEIGHT, HEAD_HEIGHT) per attempt, clamped to viewport.\n */\nexport function resolveOverlap(\n\tcandidate: WindowBounds,\n\texisting: WindowRecord[],\n\tviewport: { width: number; height: number },\n): WindowBounds {\n\tconst bounds = { ...candidate }\n\n\tfor (let attempt = 0; attempt < MAX_CASCADE_ATTEMPTS; attempt++) {\n\t\tconst hasOverlap = existing.some(w => rectsOverlap(bounds, w.bounds))\n\t\tif (!hasOverlap) break\n\n\t\tbounds.left += CASCADE_OFFSET\n\t\tbounds.top += CASCADE_OFFSET\n\t}\n\n\treturn clampToViewport(bounds, viewport)\n}\n\n/**\n * Clamp bounds so the window stays fully within the viewport.\n */\nexport function clampToViewport(\n\tbounds: WindowBounds,\n\tviewport: { width: number; height: number },\n): WindowBounds {\n\treturn {\n\t\twidth: bounds.width,\n\t\theight: bounds.height,\n\t\tleft: Math.max(0, Math.min(bounds.left, viewport.width - bounds.width)),\n\t\ttop: Math.max(0, Math.min(bounds.top, viewport.height - bounds.height)),\n\t}\n}\n","import { SchmancyElement } from '@mixins/index'\nimport { css, html, nothing } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { classMap } from 'lit/directives/class-map.js'\nimport { createRef, ref } from 'lit/directives/ref.js'\nimport { styleMap } from 'lit/directives/style-map.js'\nimport {\n\tanimationFrameScheduler,\n\tauditTime,\n\tcatchError,\n\tEMPTY,\n\tfilter,\n\tfinalize,\n\tfrom,\n\tfromEvent,\n\tmap,\n\tmerge,\n\tObservable,\n\tswitchMap,\n\ttake,\n\ttakeUntil,\n\ttap,\n} from 'rxjs'\nimport { SPRING_SMOOTH, SPRING_SNAPPY } from '../utils/animation.js'\nimport { cursorGlow } from '../directives/cursor-glow'\nimport { reducedMotion$ } from '../directives/reduced-motion'\nimport { theme } from '../theme/theme.service.js'\nimport type { SnapCorner, WindowBounds, WindowVisualState } from './window-registry.js'\nimport { windowManager } from './window-manager.js'\nimport { resolveOverlap } from './window-position.js'\n\nconst HEAD_HEIGHT = 48\nconst DRAG_THRESHOLD = 5\n\ninterface Position {\n\tx: number\n\ty: number\n}\n\n@customElement('schmancy-window')\nexport default class SchmancyWindow extends SchmancyElement {\n\tstatic styles = [css`\n\t:host {\n\t\tdisplay: contents;\n\t\tposition: relative;\n\t\tz-index: 1000;\n\t}\n\t:host([hidden]) {\n\t\tdisplay: none !important;\n\t}\n`]\n\n\t@property({ type: String }) id: string = 'default'\n\t/** Override the expanded panel width (e.g. '320px', '24rem'). Defaults to responsive sizing. */\n\t@property({ type: String }) expandedWidth?: string\n\t/** Override the expanded panel height (e.g. '400px', '50vh'). */\n\t@property({ type: String }) expandedHeight?: string\n\t/** When true, uses a lower elevation shadow in the collapsed state. */\n\t@property({ type: Boolean, reflect: true }) lowered: boolean = false\n\t/** Corner the window is anchored to. */\n\t@property({ type: String }) corner: SnapCorner = 'bottom-right'\n\t/** When true, window can be resized by the user. */\n\t@property({ type: Boolean }) resizable = false\n\t/** When true, window stays at its dragged position instead of snapping to a corner. */\n\t@property({ type: Boolean }) freePosition = false\n\t/** Visual state of the window (minimized, normal, maximized). */\n\t@property({ type: String, reflect: true }) visualState: WindowVisualState = 'normal'\n\t/** Minimum width in pixels. */\n\t@property({ type: Number }) minWidth = 280\n\t/** Minimum height in pixels. */\n\t@property({ type: Number }) minHeight = 200\n\n\t/** Whether the body is expanded. */\n\t@property({ type: Boolean, reflect: true }) open = false\n\n\tprivate _currentAnimation?: Animation\n\n\t/** Lazy rendering: body content not in DOM until first expand. */\n\t@state() private _hasOpened = false\n\n\t// Internal position -- plain fields, updated directly during drag\n\tprivate _position: Position = { x: 16, y: 16 }\n\t@state() private _currentCorner: SnapCorner = 'bottom-right'\n\n\t// Track applied corner to avoid unnecessary style.removeProperty calls during drag\n\tprivate _appliedCorner: string = ''\n\n\t// Refs\n\tprivate _containerRef = createRef<HTMLElement>()\n\tprivate _bodyRef = createRef<HTMLElement>()\n\tprivate _headRef = createRef<HTMLElement>()\n\n\t// ============================================\n\t// COMPUTED\n\t// ============================================\n\n\tprivate get panelWidth(): string {\n\t\treturn this.expandedWidth ?? 'min(360px, calc(100vw - 32px))'\n\t}\n\n\tprivate get isBottomCorner(): boolean {\n\t\treturn this._currentCorner.startsWith('bottom')\n\t}\n\n\tprivate get closedClipPath(): string {\n\t\treturn this.isBottomCorner\n\t\t\t? `inset(calc(100% - ${HEAD_HEIGHT}px) 0px 0px 0px round 22px)`\n\t\t\t: `inset(0px 0px calc(100% - ${HEAD_HEIGHT}px) 0px round 22px)`\n\t}\n\n\tprivate get openClipPath(): string {\n\t\treturn 'inset(0px 0px 0px 0px round 12px)'\n\t}\n\n\tprivate get elevation(): 0 | 1 | 2 | 3 | 4 | 5 {\n\t\tif (this.open) return 4\n\t\treturn this.lowered ? 1 : 3\n\t}\n\n\t// ============================================\n\t// POSITION MANAGEMENT\n\t// ============================================\n\n\tprivate _applyContainerPosition() {\n\t\tconst container = this._containerRef.value\n\t\tif (!container) return\n\t\t// Only clear position properties when corner changes (avoids 4 style invalidations per drag frame)\n\t\tif (this._appliedCorner !== this._currentCorner) {\n\t\t\tcontainer.style.removeProperty('left')\n\t\t\tcontainer.style.removeProperty('right')\n\t\t\tcontainer.style.removeProperty('top')\n\t\t\tcontainer.style.removeProperty('bottom')\n\t\t\tthis._appliedCorner = this._currentCorner\n\t\t}\n\t\tconst { x, y } = this._position\n\t\tif (this._currentCorner.includes('right')) {\n\t\t\tcontainer.style.right = `${x}px`\n\t\t} else {\n\t\t\tcontainer.style.left = `${x}px`\n\t\t}\n\t\tif (this._currentCorner.includes('bottom')) {\n\t\t\tcontainer.style.bottom = `${y + theme.bottomOffset}px`\n\t\t} else {\n\t\t\tcontainer.style.top = `${y}px`\n\t\t}\n\t}\n\n\tprivate static readonly VALID_CORNERS = new Set<string>(['top-left', 'top-right', 'bottom-left', 'bottom-right'])\n\n\tprivate _loadPosition() {\n\t\tconst saved = windowManager.loadPosition(this.id)\n\t\tif (saved) {\n\t\t\tthis._position = { x: saved.x, y: saved.y }\n\t\t\tif (SchmancyWindow.VALID_CORNERS.has(saved.anchor)) {\n\t\t\t\tthis._currentCorner = saved.anchor as SnapCorner\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _savePosition() {\n\t\twindowManager.savePosition(this.id, { ...this._position, anchor: this._currentCorner })\n\t}\n\n\tprivate _validateBounds() {\n\t\tconst container = this._containerRef.value\n\t\tif (!container) return\n\t\tconst rect = container.getBoundingClientRect()\n\t\tif (rect.width === 0) return\n\t\tconst vw = window.innerWidth\n\t\tconst vh = window.innerHeight\n\t\tconst isRight = this._currentCorner.includes('right')\n\t\tconst isBottom = this._currentCorner.includes('bottom')\n\t\tconst actualLeft = isRight ? vw - this._position.x - rect.width : this._position.x\n\t\tconst actualTop = isBottom ? vh - this._position.y - rect.height : this._position.y\n\t\tconst newLeft = Math.max(0, Math.min(actualLeft, vw - rect.width))\n\t\tconst newTop = Math.max(0, Math.min(actualTop, vh - rect.height))\n\t\tthis._position = {\n\t\t\tx: isRight ? vw - newLeft - rect.width : newLeft,\n\t\t\ty: isBottom ? vh - newTop - rect.height : newTop,\n\t\t}\n\t\tthis._applyContainerPosition()\n\t}\n\n\t// ============================================\n\t// CORNER SNAPPING\n\t// ============================================\n\n\tprivate _reorientToNearestCorner(skipAnimation = false): void {\n\t\t// Free position mode: skip corner snapping\n\t\tif (this.freePosition) {\n\t\t\tthis._savePosition()\n\t\t\tconst rect = this._containerRef.value?.getBoundingClientRect()\n\t\t\tif (rect) {\n\t\t\t\twindowManager.updateBounds(this.id, { left: rect.left, top: rect.top, width: rect.width, height: rect.height })\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\tconst container = this._containerRef.value\n\t\tif (!container) return\n\n\t\t// F -- record current screen position before DOM mutation\n\t\tconst rect = container.getBoundingClientRect()\n\n\t\t// L -- calculate nearest corner using head visual center\n\t\tconst currentIsBottom = this._currentCorner.includes('bottom')\n\t\tconst headCenterX = rect.left + rect.width / 2\n\t\tconst headCenterY = currentIsBottom\n\t\t\t? rect.bottom - HEAD_HEIGHT / 2\n\t\t\t: rect.top + HEAD_HEIGHT / 2\n\t\tconst side = headCenterX > window.innerWidth / 2 ? 'right' : 'left'\n\t\tconst vert = headCenterY > window.innerHeight / 2 ? 'bottom' : 'top'\n\t\tconst newCorner: SnapCorner = `${vert}-${side}` as SnapCorner\n\n\t\t// Snap corner and reset offset to standard edge gap\n\t\tthis._currentCorner = newCorner\n\t\tthis._position = { x: 16, y: 16 }\n\t\tthis._applyContainerPosition()\n\t\t// Sync clip-path to new corner\n\t\tif (!this.open) {\n\t\t\tcontainer.style.clipPath = this.closedClipPath\n\t\t}\n\n\t\tif (skipAnimation || reducedMotion$.value) {\n\t\t\tthis._savePosition()\n\t\t\tconst snapRect = container.getBoundingClientRect()\n\t\t\twindowManager.updateBounds(this.id, { left: snapRect.left, top: snapRect.top, width: snapRect.width, height: snapRect.height })\n\t\t\treturn\n\t\t}\n\n\t\t// I -- invert: shift element back to its original visual position\n\t\tconst newRect = container.getBoundingClientRect()\n\t\tconst dx = rect.left - newRect.left\n\t\tconst dy = rect.top - newRect.top\n\t\tcontainer.style.translate = `${dx}px ${dy}px`\n\n\t\t// P -- play: animate from the inverse offset to natural resting position\n\t\tconst flipKeyframes: Keyframe[] = [{ translate: `${dx}px ${dy}px` }, { translate: '0px 0px' }]\n\t\tconst anim = container.animate(\n\t\t\tflipKeyframes,\n\t\t\t{\n\t\t\t\tduration: SPRING_SMOOTH.duration,\n\t\t\t\teasing: SPRING_SMOOTH.easingFallback,\n\t\t\t\tfill: 'forwards',\n\t\t\t},\n\t\t)\n\t\tfrom(anim.finished).pipe(\n\t\t\ttake(1),\n\t\t\ttap(() => {\n\t\t\t\tif (container.isConnected) container.style.translate = ''\n\t\t\t\t// Report final resting bounds after animation completes\n\t\t\t\tconst finalRect = container.getBoundingClientRect()\n\t\t\t\twindowManager.updateBounds(this.id, { left: finalRect.left, top: finalRect.top, width: finalRect.width, height: finalRect.height })\n\t\t\t}),\n\t\t\tcatchError(() => EMPTY),\n\t\t\ttakeUntil(this.disconnecting),\n\t\t).subscribe()\n\n\t\tthis._savePosition()\n\t}\n\n\t// ============================================\n\t// DRAG PIPELINE\n\t// ============================================\n\n\tprivate _drag$(): Observable<never> {\n\t\treturn new Observable(() => {\n\t\t\tconst head = this._headRef.value\n\t\t\tconst container = this._containerRef.value\n\t\t\tif (!head || !container) return\n\n\t\t\tlet didDrag = false\n\n\t\t\tconst sub = fromEvent<PointerEvent>(head, 'pointerdown').pipe(\n\t\t\t\tfilter(e => e.button === 0),\n\t\t\t\tfilter(e => {\n\t\t\t\t\tconst tag = (e.target as HTMLElement).tagName?.toLowerCase()\n\t\t\t\t\treturn !['input', 'textarea', 'select', 'button'].includes(tag)\n\t\t\t\t\t\t&& !(e.target as HTMLElement).closest('schmancy-input, schmancy-icon-button, button, a')\n\t\t\t\t}),\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)\n\t\t\t\t.pipe(\n\t\t\t\t\tmap(e => {\n\t\t\t\t\t\tconst rect = container.getBoundingClientRect()\n\t\t\t\t\t\tconst isBottom = this._currentCorner.includes('bottom')\n\t\t\t\t\t\tconst wasOpen = this.open\n\t\t\t\t\t\tdidDrag = false\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tstartX: e.clientX,\n\t\t\t\t\t\t\tstartY: e.clientY,\n\t\t\t\t\t\t\toffsetX: e.clientX - rect.left,\n\t\t\t\t\t\t\toffsetY: e.clientY - rect.top,\n\t\t\t\t\t\t\trect,\n\t\t\t\t\t\t\tvw: window.innerWidth,\n\t\t\t\t\t\t\tvh: window.innerHeight,\n\t\t\t\t\t\t\tisBottom,\n\t\t\t\t\t\t\twasOpen,\n\t\t\t\t\t\t\tpointerId: e.pointerId,\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t\t\tswitchMap(({ startX, startY, offsetX, offsetY, rect, vw, vh, isBottom, wasOpen, pointerId }) => {\n\t\t\t\t\t\tconst move$ = fromEvent<PointerEvent>(window, 'pointermove').pipe(\n\t\t\t\t\t\t\tfilter(e => e.pointerId === pointerId),\n\t\t\t\t\t\t\tauditTime(0, animationFrameScheduler),\n\t\t\t\t\t\t\tmap(e => ({ clientX: e.clientX, clientY: e.clientY })),\n\t\t\t\t\t\t)\n\t\t\t\t\t\tconst end$ = fromEvent<PointerEvent>(window, 'pointerup').pipe(\n\t\t\t\t\t\t\tfilter(e => e.pointerId === pointerId),\n\t\t\t\t\t\t)\n\n\t\t\t\t\t\treturn move$.pipe(\n\t\t\t\t\t\t\ttap(({ clientX, clientY }) => {\n\t\t\t\t\t\t\t\tconst dx = clientX - startX\n\t\t\t\t\t\t\t\tconst dy = clientY - startY\n\t\t\t\t\t\t\t\tif (Math.sqrt(dx * dx + dy * dy) > DRAG_THRESHOLD && !didDrag) {\n\t\t\t\t\t\t\t\t\tdidDrag = true\n\t\t\t\t\t\t\t\t\tthis._applyDragVisuals(true)\n\t\t\t\t\t\t\t\t\t// Collapse on first confirmed drag move\n\t\t\t\t\t\t\t\t\tif (wasOpen) {\n\t\t\t\t\t\t\t\t\t\tthis.open = false\n\t\t\t\t\t\t\t\t\t\tcontainer.style.clipPath = this.closedClipPath\n\t\t\t\t\t\t\t\t\t\tcontainer.style.overflow = 'hidden'\n\t\t\t\t\t\t\t\t\t\tconst body = this._bodyRef.value\n\t\t\t\t\t\t\t\t\t\tif (body) {\n\t\t\t\t\t\t\t\t\t\t\tbody.inert = true\n\t\t\t\t\t\t\t\t\t\t\tbody.style.visibility = 'hidden'\n\t\t\t\t\t\t\t\t\t\t}\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\tif (!didDrag) return\n\n\t\t\t\t\t\t\t\tconst left = Math.max(0, Math.min(clientX - offsetX, vw - rect.width))\n\t\t\t\t\t\t\t\tconst minTop = isBottom ? HEAD_HEIGHT - rect.height : 0\n\t\t\t\t\t\t\t\tconst maxTop = isBottom ? vh - rect.height : vh - HEAD_HEIGHT\n\t\t\t\t\t\t\t\tconst top = Math.max(minTop, Math.min(clientY - offsetY, maxTop))\n\n\t\t\t\t\t\t\t\tthis._position = {\n\t\t\t\t\t\t\t\t\tx: this._currentCorner.includes('right') ? vw - left - rect.width : left,\n\t\t\t\t\t\t\t\t\ty: isBottom ? vh - top - rect.height : top,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tthis._applyContainerPosition()\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\ttakeUntil(end$),\n\t\t\t\t\t\t\tfinalize(() => {\n\t\t\t\t\t\t\t\tif (didDrag) {\n\t\t\t\t\t\t\t\t\tthis._reorientToNearestCorner()\n\t\t\t\t\t\t\t\t\tthis._applyDragVisuals(false)\n\t\t\t\t\t\t\t\t\tdidDrag = false\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tdidDrag = false\n\t\t\t\t\t\t\t\t\tthis.toggle()\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t)\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\t.subscribe()\n\n\t\t\treturn () => sub.unsubscribe()\n\t\t})\n\t}\n\n\t// ============================================\n\t// LIFECYCLE\n\t// ============================================\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback()\n\n\t\t// Pipeline 1: DOM setup + manager registration + drag + z-index sync\n\t\tfrom(this.updateComplete).pipe(\n\t\t\ttake(1),\n\t\t\ttap(() => {\n\t\t\t\tthis._currentCorner = this.corner\n\t\t\t\tthis._loadPosition()\n\t\t\t\tthis._applyContainerPosition()\n\t\t\t\tthis._initDOMState()\n\t\t\t\t// Register with window manager\n\t\t\t\tconst container = this._containerRef.value\n\t\t\t\tif (container) {\n\t\t\t\t\tconst rect = container.getBoundingClientRect()\n\t\t\t\t\tconst bounds: WindowBounds = { left: rect.left, top: rect.top, width: rect.width, height: rect.height }\n\t\t\t\t\twindowManager.register(this.id, bounds, this.freePosition ? 'free' : this._currentCorner)\n\t\t\t\t}\n\t\t\t}),\n\t\t\tswitchMap(() => merge(\n\t\t\t\tthis._drag$(),\n\t\t\t\twindowManager.selectWindow(this.id).pipe(\n\t\t\t\t\ttap(record => {\n\t\t\t\t\t\tif (!record) return\n\t\t\t\t\t\tconst container = this._containerRef.value\n\t\t\t\t\t\tif (container) container.style.zIndex = String(record.zIndex)\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t)),\n\t\t\ttakeUntil(this.disconnecting),\n\t\t).subscribe()\n\n\n\t\t// Pipeline 3: Environment -- one subscription\n\t\tmerge(\n\t\t\tfromEvent(window, 'resize').pipe(\n\t\t\t\tauditTime(0, animationFrameScheduler),\n\t\t\t\ttap(() => this._validateBounds()),\n\t\t\t),\n\t\t\ttheme.bottomOffset$.pipe(\n\t\t\t\ttap(() => this._applyContainerPosition()),\n\t\t\t),\n\t\t).pipe(takeUntil(this.disconnecting)).subscribe()\n\t}\n\n\tdisconnectedCallback() {\n\t\tsuper.disconnectedCallback()\n\t\twindowManager.unregister(this.id)\n\t}\n\n\tprivate _initDOMState() {\n\t\tconst container = this._containerRef.value\n\t\tconst body = this._bodyRef.value\n\t\tif (!container) return\n\n\t\tthis._applyContainerPosition()\n\n\t\tif (this.open) {\n\t\t\tthis._hasOpened = true\n\t\t\tcontainer.style.overflow = ''\n\t\t\tif (body) {\n\t\t\t\tbody.inert = false\n\t\t\t\tbody.style.visibility = 'visible'\n\t\t\t}\n\t\t} else {\n\t\t\tcontainer.style.clipPath = this.closedClipPath\n\t\t\tcontainer.style.overflow = 'hidden'\n\t\t\tif (body) {\n\t\t\t\tbody.inert = true\n\t\t\t\tbody.style.visibility = 'hidden'\n\t\t\t}\n\t\t}\n\t}\n\n\t// ============================================\n\t// ANIMATION\n\t// ============================================\n\n\tprivate _animateOpen() {\n\t\tconst container = this._containerRef.value\n\t\tconst body = this._bodyRef.value\n\t\tif (!container) return\n\n\t\tthis._hasOpened = true\n\t\tthis.open = true\n\n\t\t// Overlap avoidance\n\t\tconst rect = container.getBoundingClientRect()\n\t\tconst projectedBounds: WindowBounds = {\n\t\t\tleft: rect.left,\n\t\t\ttop: this.isBottomCorner ? rect.top - 400 : rect.top,\n\t\t\twidth: rect.width,\n\t\t\theight: 400 + HEAD_HEIGHT,\n\t\t}\n\t\tconst overlaps = windowManager.findOverlaps(projectedBounds, this.id)\n\t\tif (overlaps.length > 0) {\n\t\t\tconst resolved = resolveOverlap(projectedBounds, overlaps, { width: window.innerWidth, height: window.innerHeight })\n\t\t\tif (Math.abs(resolved.left - projectedBounds.left) > 10 || Math.abs(resolved.top - projectedBounds.top) > 10) {\n\t\t\t\tconst isRight = this._currentCorner.includes('right')\n\t\t\t\tconst isBottom = this._currentCorner.includes('bottom')\n\t\t\t\tthis._position = {\n\t\t\t\t\tx: isRight ? window.innerWidth - resolved.left - resolved.width : resolved.left,\n\t\t\t\t\ty: isBottom ? window.innerHeight - resolved.top - resolved.height : resolved.top,\n\t\t\t\t}\n\t\t\t\tthis._applyContainerPosition()\n\t\t\t}\n\t\t}\n\n\t\tif (body) {\n\t\t\tbody.style.visibility = 'visible'\n\t\t\tbody.inert = false\n\t\t}\n\n\t\tif (reducedMotion$.value) {\n\t\t\tcontainer.style.clipPath = ''\n\t\t\tcontainer.style.overflow = ''\n\t\t\tthis.dispatchScopedEvent('window-toggle', { state: 'expanded' })\n\t\t\treturn\n\t\t}\n\n\t\tthis._currentAnimation?.cancel()\n\t\tcontainer.style.overflow = 'hidden'\n\t\tcontainer.style.willChange = 'opacity'\n\t\tconst openKeyframes: Keyframe[] = [\n\t\t\t{ clipPath: this.closedClipPath, opacity: 0.95 },\n\t\t\t{ clipPath: this.openClipPath, opacity: 1 },\n\t\t]\n\t\tconst anim = container.animate(openKeyframes, {\n\t\t\tduration: SPRING_SNAPPY.duration,\n\t\t\teasing: SPRING_SNAPPY.easingFallback,\n\t\t\tfill: 'forwards',\n\t\t})\n\t\tthis._currentAnimation = anim\n\n\t\tfrom(anim.finished).pipe(\n\t\t\ttake(1),\n\t\t\ttap(() => {\n\t\t\t\tif (container.isConnected) {\n\t\t\t\t\tcontainer.style.clipPath = ''\n\t\t\t\t\tcontainer.style.overflow = ''\n\t\t\t\t\tcontainer.style.willChange = ''\n\t\t\t\t}\n\t\t\t}),\n\t\t\tcatchError(() => EMPTY),\n\t\t\ttakeUntil(this.disconnecting),\n\t\t).subscribe()\n\n\t\tthis.dispatchScopedEvent('window-toggle', { state: 'expanded' })\n\t}\n\n\tprivate _animateClose() {\n\t\tconst container = this._containerRef.value\n\t\tif (!container) return\n\n\t\tif (reducedMotion$.value) {\n\t\t\tcontainer.style.clipPath = this.closedClipPath\n\t\t\tcontainer.style.overflow = 'hidden'\n\t\t\tthis.open = false\n\t\t\tconst body = this._bodyRef.value\n\t\t\tif (body) { body.inert = true; body.style.visibility = 'hidden' }\n\t\t\tthis.dispatchScopedEvent('window-toggle', { state: 'collapsed' })\n\t\t\treturn\n\t\t}\n\n\t\tthis._currentAnimation?.cancel()\n\t\tcontainer.style.overflow = 'hidden'\n\t\tcontainer.style.willChange = 'opacity'\n\t\tconst closeKeyframes: Keyframe[] = [\n\t\t\t{ clipPath: this.openClipPath, opacity: 1 },\n\t\t\t{ clipPath: this.closedClipPath, opacity: 0.95 },\n\t\t]\n\t\tconst anim = container.animate(closeKeyframes, {\n\t\t\tduration: Math.round(SPRING_SNAPPY.duration * 0.7),\n\t\t\teasing: 'cubic-bezier(0.4, 0, 0.8, 0.15)',\n\t\t\tfill: 'forwards',\n\t\t})\n\t\tthis._currentAnimation = anim\n\n\t\tfrom(anim.finished).pipe(\n\t\t\ttake(1),\n\t\t\ttap(() => {\n\t\t\t\tthis.open = false\n\t\t\t\tcontainer.style.willChange = ''\n\t\t\t\tconst body = this._bodyRef.value\n\t\t\t\tif (body) { body.inert = true; body.style.visibility = 'hidden' }\n\t\t\t}),\n\t\t\tcatchError(() => EMPTY),\n\t\t\ttakeUntil(this.disconnecting),\n\t\t).subscribe()\n\n\t\tthis.dispatchScopedEvent('window-toggle', { state: 'collapsed' })\n\t}\n\n\t// ============================================\n\t// VISUAL STATE HELPERS\n\t// ============================================\n\n\t/** Apply drag visuals directly on DOM refs — avoids full Lit re-render for cursor + opacity */\n\tprivate _applyDragVisuals(dragging: boolean) {\n\t\tconst head = this._headRef.value\n\t\tconst container = this._containerRef.value\n\t\tif (head) {\n\t\t\thead.classList.toggle('cursor-grabbing', dragging)\n\t\t\thead.classList.toggle('cursor-move', !dragging)\n\t\t}\n\t\tif (container) {\n\t\t\tcontainer.style.opacity = dragging ? '0.95' : ''\n\t\t}\n\t}\n\n\tprivate _handleFocus = () => windowManager.focus(this.id)\n\n\tprivate _handleHeadKeydown = (e: KeyboardEvent) => {\n\t\tif (e.key === 'Enter' || e.key === ' ') {\n\t\t\te.preventDefault()\n\t\t\tthis.toggle()\n\t\t\treturn\n\t\t}\n\t\tif (e.key === 'ArrowUp' || e.key === 'ArrowDown' || e.key === 'ArrowLeft' || e.key === 'ArrowRight') {\n\t\t\te.preventDefault()\n\t\t\tconst step = e.shiftKey ? 20 : 5\n\t\t\tconst dx = e.key === 'ArrowRight' ? step : e.key === 'ArrowLeft' ? -step : 0\n\t\t\tconst dy = e.key === 'ArrowDown' ? step : e.key === 'ArrowUp' ? -step : 0\n\t\t\tthis._position = { x: this._position.x + dx, y: this._position.y + dy }\n\t\t\tthis._applyContainerPosition()\n\t\t\tthis._savePosition()\n\t\t}\n\t}\n\n\t// ============================================\n\t// PUBLIC API\n\t// ============================================\n\n\ttoggle() {\n\t\tif (this.open) this._animateClose()\n\t\telse this._animateOpen()\n\t}\n\n\texpand() {\n\t\tif (this.open) return\n\t\tthis._animateOpen()\n\t}\n\n\tclose() {\n\t\tif (!this.open) return\n\t\tthis._animateClose()\n\t}\n\n\t// ============================================\n\t// RENDER\n\t// ============================================\n\n\tprotected render(): unknown {\n\t\tconst isBottom = this._currentCorner.startsWith('bottom')\n\n\t\tconst containerClasses = classMap({\n\t\t\tfixed: true,\n\t\t\tflex: true,\n\t\t\t'flex-col': isBottom,\n\t\t\t'flex-col-reverse': !isBottom,\n\t\t\t'z-1000': true,\n\t\t\t'rounded-2xl': this.open,\n\t\t\t'rounded-[22px]': !this.open,\n\t\t\t'overflow-hidden': true,\n\t\t})\n\n\t\tconst containerStyles = styleMap({\n\t\t\twidth: this.panelWidth,\n\t\t\t'max-height': 'calc(100vh - 32px)',\n\t\t\t'pointer-events': 'none',\n\t\t})\n\n\t\tconst bodyStyles = styleMap({\n\t\t\t'pointer-events': this.open ? 'auto' : 'none',\n\t\t})\n\n\t\tconst headClasses = classMap({\n\t\t\t'h-full': true,\n\t\t\t'px-3': true,\n\t\t\tflex: true,\n\t\t\t'items-center': true,\n\t\t\t'gap-2': true,\n\t\t\t'select-none': true,\n\t\t\t'cursor-move': true,\n\t\t})\n\n\t\treturn html`\n\t\t\t<schmancy-surface\n\t\t\t\t${ref(this._containerRef)}\n\t\t\t\ttype=\"glass\"\n\t\t\t\t.elevation=${this.elevation}\n\t\t\t\tclass=${containerClasses}\n\t\t\t\tstyle=${containerStyles}\n\t\t\t\taria-expanded=${this.open}\n\t\t\t\t@pointerdown=${this._handleFocus}\n\t\t\t>\n\t\t\t\t<!-- Details section (visually above summary for bottom corners) -->\n\t\t\t\t<section\n\t\t\t\t\t${ref(this._bodyRef)}\n\t\t\t\t\tclass=\"flex-1 min-h-0 overflow-hidden flex flex-col\"\n\t\t\t\t\tstyle=${bodyStyles}\n\t\t\t\t\trole=\"region\"\n\t\t\t\t\taria-label=\"Expandable content\"\n\t\t\t\t>\n\t\t\t\t\t${this._hasOpened ? html`<slot name=\"details\"></slot>` : nothing}\n\t\t\t\t</section>\n\n\t\t\t\t<!-- Summary section -- always interactive, always visible -->\n\t\t\t\t<section\n\t\t\t\t\tclass=\"shrink-0 bg-surface-lowest\"\n\t\t\t\t\tstyle=${styleMap({ 'pointer-events': 'auto', height: `${HEAD_HEIGHT}px` })}\n\t\t\t\t>\n\t\t\t\t\t<div\n\t\t\t\t\t\t${ref(this._headRef)}\n\t\t\t\t\t\t${cursorGlow({ radius: 200, intensity: 0.10 })}\n\t\t\t\t\t\tclass=${headClasses}\n\t\t\t\t\t\trole=\"button\"\n\t\t\t\t\t\ttabindex=\"0\"\n\t\t\t\t\t\ttitle=\"Drag to move, click to expand\"\n\t\t\t\t\t\taria-label=\"${this.open ? 'Collapse window' : 'Expand window'}\"\n\t\t\t\t\t\t@keydown=${this._handleHeadKeydown}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div class=\"flex-1 min-w-0\">\n\t\t\t\t\t\t\t<slot></slot>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\twidth=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\"\n\t\t\t\t\t\t\tclass=\"shrink-0 text-surface-on/40 transition-transform duration-200 ${this.open ? 'rotate-180' : ''}\"\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<path d=\"M6 9L12 15L18 9\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</div>\n\t\t\t\t</section>\n\t\t\t</schmancy-surface>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-window': SchmancyWindow\n\t}\n}\n"],"mappings":"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"}
|
package/dist/window.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./window-
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./window-BMecbTzs.cjs`);exports.SchmancyWindow=e.t,exports.windowManager=e.n;
|
package/dist/window.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as e, t } from "./window-
|
|
1
|
+
import { n as e, t } from "./window-DMy5Gsgu.js";
|
|
2
2
|
export { t as SchmancyWindow, e as windowManager };
|
package/package.json
CHANGED
package/skills/schmancy/SKILL.md
CHANGED
|
@@ -57,6 +57,9 @@ Use component tags (`<schmancy-menu>`, `<schmancy-dropdown>`, `<schmancy-tooltip
|
|
|
57
57
|
- **Schmancy primitive first** (`PRIMITIVE_FIRST`). Within `web/**`, every visible UI element is a custom element exported from `packages/schmancy/src/**`, and an element absent from that export set is added there before being imported into `web/**`. The rule sits above the styling rules: a `<div class="text-xs text-surface-on-variant">…</div>` whose role is typography is a violation even when every utility resolves to a registered token, because `<schmancy-typography>` already covers that role; the styling rules apply only to whatever class strings remain after the right primitive has been selected.
|
|
58
58
|
Sources: [packages/schmancy/skills/schmancy/INDEX.md](../INDEX.md) catalogues the export set by job (foundations / atoms / forms / navigation / overlays / interaction / feedback / display); each role's reference file (`typography.md`, `surface.md`, `button.md`, `overlay.md`, …) names the props, slots, and events that displace the equivalent `<div>` + utility-class pattern. The export set is the single source — a primitive that is not exported from `packages/schmancy/src/**` does not satisfy this rule even if it lives in a private file inside the schmancy tree.
|
|
59
59
|
Remediation: walk every `.ts` and `.html` file under `web/**` and list every raw HTML element whose class string carries design-system styling (typography, color, spacing-as-design-decision, surface, layout-as-design-decision, motion, overlay) — those are the violations. For each, look up the matching schmancy primitive in `INDEX.md` and rewrite the element through that primitive (`<schmancy-typography type=… token=…>` for type-scale text, `<schmancy-surface type=… fill=…>` for elevated/bounded surfaces, `<schmancy-grid>`/`<schmancy-flex>` for layout primitives with design intent, the imperative `show`/`$notify`/`schmancyContentDrawer.push` services for overlays, `<schmancy-scroll>` for scroll containers). When a needed primitive is absent from the export set, design and implement it as a new component under `packages/schmancy/src/<role>/` — extending `SchmancyElement` with `static styles = [css\`...\`]`, registered in `HTMLElementTagNameMap`, exported through the package barrel, and documented with a sibling `.md` in the skill's reference set — and only then introduce the first call site in `web/**`. The audit subagent iterates the whole `web/**` tree, surfaces the violation list, applies the rewrites, runs `yarn workspace @momo/web tsc --noEmit` plus the colocated `*-view.test.ts` suites, and reports pre-existing violations that require a new schmancy primitive as a separate punch list for designer/architect approval before the implementation lands. The loop exits when every `web/**` file's visible UI elements are schmancy primitives and the typecheck plus the test suites pass.
|
|
60
|
+
- **Module index re-exports the subpath surface** (`MODULE_INDEX_REEXPORTS_SUBPATH`). Each schmancy module exposed through the package's `./*` subpath export resolves to `src/<name>/index.ts`, and any other source file under `src/<name>/` is visible to consumers only through symbols that index re-exports.
|
|
61
|
+
Sources: the `exports` field in [packages/schmancy/package.json](../../package.json) maps the `./*` subpath to `./dist/*.js` and the matching `./types/src/*/index.d.ts` types entry, so the only declaration a consumer reaches for `import … from '@mhmo91/schmancy/<name>'` is the one emitted from `src/<name>/index.ts`. Files placed in subdirectories of that module are bundled into the same dist output, but they cross the package boundary only through symbols re-exported up the chain into the module index. Past incident: `packages/schmancy/src/form/index.ts` exposed only `form`, `form-state`, and `form-summary`; consumers importing field types like `SchmancyInput` and `SchmancyFormSubmitDetail` from `@mhmo91/schmancy/form` saw nothing because `form/fields/*` had no path into the module index.
|
|
62
|
+
Remediation: list every direct subdirectory of `packages/schmancy/src/<name>/` that owns its own `index.ts` with component exports, and for each one verify that `packages/schmancy/src/<name>/index.ts` carries an `export * from './<subdir>'` (directly, or via a grouping barrel such as `<subdir>/index.ts` re-exported by the module index). The audit subagent runs `ls -d packages/schmancy/src/<name>/*/` for every module under `./*`, greps each subdirectory's `index.ts` for `^export`, then greps the module's `index.ts` for `export \* from './<subdir>'` (or for an intermediate barrel that re-exports it), and lists every subdirectory that fails the second grep as a violation. The fix per violation is one line in the module's `index.ts`; when a module groups several subdirectories under one role (e.g. `form/fields/*`), the loop also adds an intermediate `<subdir>/index.ts` barrel and re-exports that single barrel from the module index rather than enumerating leaves. The loop exits when every direct subdirectory's symbols round-trip through the module index and `yarn workspace @momo/web tsc --noEmit` passes against the consumers that import from `@mhmo91/schmancy/<name>`.
|
|
60
63
|
|
|
61
64
|
## Non-negotiable conventions
|
|
62
65
|
|
package/src/boat/boat.ts
CHANGED
|
@@ -527,10 +527,7 @@ export default class SchmancyBoat extends SchmancyElement {
|
|
|
527
527
|
'flex-col-reverse': !isBottom,
|
|
528
528
|
'will-change-[clip-path]': true,
|
|
529
529
|
'z-1000': true,
|
|
530
|
-
'ring-1': true,
|
|
531
|
-
'ring-primary-default/15': this.open,
|
|
532
530
|
'rounded-2xl': this.open,
|
|
533
|
-
'ring-outline-variant/40': !this.open,
|
|
534
531
|
'rounded-[22px]': !this.open,
|
|
535
532
|
'overflow-hidden': true,
|
|
536
533
|
'opacity-95': this.isDragging,
|
package/src/button/button.ts
CHANGED
|
@@ -301,7 +301,7 @@ export class SchmancyButton extends SchmancyElement {
|
|
|
301
301
|
|
|
302
302
|
// Compute classes for the interactive element.
|
|
303
303
|
const classes = {
|
|
304
|
-
'z-0 transition-all duration-200 relative rounded-2xl
|
|
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 w-full overflow-hidden':
|
|
305
305
|
true,
|
|
306
306
|
// Height - M3 spec: 24dp (xxs) → 32dp (dense) → 40dp (default) → 48dp (large) → 56dp (XL)
|
|
307
307
|
'h-6': this.size === 'xxs', // 24px - Ultra-compact
|
|
@@ -16,7 +16,8 @@ import { ButtonVariant } from './button'
|
|
|
16
16
|
export class SchmnacyIconButton extends SchmancyElement {
|
|
17
17
|
static styles = [css`
|
|
18
18
|
:host {
|
|
19
|
-
display: block;
|
|
19
|
+
display: inline-block;
|
|
20
|
+
width: fit-content;
|
|
20
21
|
border-radius: 9999px;
|
|
21
22
|
transition:
|
|
22
23
|
box-shadow 300ms cubic-bezier(0.34, 1.56, 0.64, 1),
|
package/src/chips/assist-chip.ts
CHANGED
package/src/chips/filter-chip.ts
CHANGED
|
@@ -24,15 +24,10 @@ export class SchmancyFilterChip extends SchmancyElement {
|
|
|
24
24
|
:host {
|
|
25
25
|
display: inline-block;
|
|
26
26
|
outline: none;
|
|
27
|
+
width: fit-content;
|
|
27
28
|
min-width: fit-content;
|
|
28
29
|
border-radius: 0.5rem;
|
|
29
|
-
transition:
|
|
30
|
-
box-shadow 300ms ease,
|
|
31
|
-
transform 200ms cubic-bezier(0.34, 1.56, 0.64, 1);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
:host(:hover:not([disabled])) {
|
|
35
|
-
box-shadow: 0 2px 8px -2px color-mix(in srgb, var(--schmancy-sys-color-primary-default) 15%, transparent);
|
|
30
|
+
transition: transform 200ms cubic-bezier(0.34, 1.56, 0.64, 1);
|
|
36
31
|
}
|
|
37
32
|
|
|
38
33
|
:host(:active:not([disabled])) {
|
|
@@ -40,10 +35,6 @@ export class SchmancyFilterChip extends SchmancyElement {
|
|
|
40
35
|
transition-duration: 100ms;
|
|
41
36
|
}
|
|
42
37
|
|
|
43
|
-
:host([selected]) {
|
|
44
|
-
box-shadow: 0 0 12px -2px color-mix(in srgb, var(--schmancy-sys-color-secondary-default) 20%, transparent);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
38
|
:host([disabled]) {
|
|
48
39
|
pointer-events: none;
|
|
49
40
|
opacity: var(--schmancy-sys-state-disabled-opacity);
|
|
@@ -51,9 +42,7 @@ export class SchmancyFilterChip extends SchmancyElement {
|
|
|
51
42
|
|
|
52
43
|
@media (prefers-reduced-motion: reduce) {
|
|
53
44
|
:host { transition: none; }
|
|
54
|
-
:host(:hover:not([disabled])) { box-shadow: none; }
|
|
55
45
|
:host(:active:not([disabled])) { transform: none; }
|
|
56
|
-
:host([selected]) { box-shadow: none; }
|
|
57
46
|
}
|
|
58
47
|
|
|
59
48
|
button {
|
|
@@ -184,17 +173,14 @@ export class SchmancyFilterChip extends SchmancyElement {
|
|
|
184
173
|
'select-none': true,
|
|
185
174
|
'text-sm': true,
|
|
186
175
|
'font-medium': true,
|
|
187
|
-
'border': true,
|
|
188
176
|
'relative': true,
|
|
189
177
|
'min-h-[32px]': true,
|
|
190
178
|
|
|
191
179
|
// Background and text colors based on selection state
|
|
192
180
|
'bg-secondary-container': this._selected,
|
|
193
181
|
'text-secondary-onContainer': this._selected,
|
|
194
|
-
'border-secondary-container': this._selected,
|
|
195
182
|
'bg-surface-container': !this._selected,
|
|
196
183
|
'text-surface-on': !this._selected,
|
|
197
|
-
'border-outline': !this._selected,
|
|
198
184
|
|
|
199
185
|
// Hover states
|
|
200
186
|
'hover:brightness-95': this._selected && !this.disabled,
|
package/src/chips/input-chip.ts
CHANGED
|
@@ -34,8 +34,8 @@ export class SchmancyInputChip extends SchmancyElement {
|
|
|
34
34
|
:host {
|
|
35
35
|
display: inline-block;
|
|
36
36
|
outline: none;
|
|
37
|
-
|
|
38
|
-
|
|
37
|
+
width: fit-content;
|
|
38
|
+
min-width: fit-content;
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
:host([disabled]) {
|
|
@@ -295,7 +295,6 @@ export class SchmancyInputChip extends SchmancyElement {
|
|
|
295
295
|
'font-medium': true, // M3: 500 weight
|
|
296
296
|
'relative': true,
|
|
297
297
|
'overflow-hidden': true,
|
|
298
|
-
'border': true,
|
|
299
298
|
|
|
300
299
|
// M3 Padding: 8px with icon, 16px without (leading), 8px with trailing icon
|
|
301
300
|
'pl-2': hasLeadingIcon, // 8px with avatar/icon
|
|
@@ -306,8 +305,6 @@ export class SchmancyInputChip extends SchmancyElement {
|
|
|
306
305
|
// M3 Colors for input chips
|
|
307
306
|
'bg-surface-containerLow': true,
|
|
308
307
|
'text-surface-onVariant': true,
|
|
309
|
-
'border-outline': true,
|
|
310
|
-
'border-solid':true,
|
|
311
308
|
// Input chips are flat (no elevation) per M3
|
|
312
309
|
|
|
313
310
|
// Focus-visible state
|
|
@@ -20,7 +20,8 @@ export class SchmancySuggestionChip extends SchmancyElement {
|
|
|
20
20
|
:host {
|
|
21
21
|
display: inline-block;
|
|
22
22
|
outline: none;
|
|
23
|
-
|
|
23
|
+
width: fit-content;
|
|
24
|
+
min-width: fit-content;
|
|
24
25
|
}
|
|
25
26
|
|
|
26
27
|
:host([disabled]) {
|
|
@@ -193,7 +194,6 @@ export class SchmancySuggestionChip extends SchmancyElement {
|
|
|
193
194
|
'duration-200': true,
|
|
194
195
|
'select-none': true,
|
|
195
196
|
'overflow-hidden': true,
|
|
196
|
-
'border': true,
|
|
197
197
|
|
|
198
198
|
// M3 Padding: 8px with icon, 16px without (leading), 16px trailing
|
|
199
199
|
'pl-2': hasIcon, // 8px with icon
|
|
@@ -203,7 +203,6 @@ export class SchmancySuggestionChip extends SchmancyElement {
|
|
|
203
203
|
// M3 Colors for suggestion chips
|
|
204
204
|
'bg-surface-containerLow': true,
|
|
205
205
|
'text-surface-onVariant': true,
|
|
206
|
-
'border-outline': true,
|
|
207
206
|
|
|
208
207
|
// Suggestion chips are flat by default (no elevation per M3)
|
|
209
208
|
|
package/src/details/details.ts
CHANGED
|
@@ -14,7 +14,6 @@ export default class SchmancyDetails extends SurfaceMixin(SchmancyElement) {
|
|
|
14
14
|
static styles = [css`
|
|
15
15
|
:host {
|
|
16
16
|
display: block;
|
|
17
|
-
transition: box-shadow 400ms cubic-bezier(0.34, 1.2, 0.64, 1);
|
|
18
17
|
}
|
|
19
18
|
|
|
20
19
|
:host([overlay]) {
|
|
@@ -22,9 +21,6 @@ export default class SchmancyDetails extends SurfaceMixin(SchmancyElement) {
|
|
|
22
21
|
}
|
|
23
22
|
|
|
24
23
|
:host([open]) {
|
|
25
|
-
box-shadow:
|
|
26
|
-
0 2px 12px -2px color-mix(in srgb, var(--schmancy-sys-color-primary-default) 15%, transparent),
|
|
27
|
-
0 8px 32px -8px color-mix(in srgb, var(--schmancy-sys-color-primary-default) 8%, transparent);
|
|
28
24
|
z-index: 10;
|
|
29
25
|
}
|
|
30
26
|
|
|
@@ -228,8 +224,7 @@ export default class SchmancyDetails extends SurfaceMixin(SchmancyElement) {
|
|
|
228
224
|
[this.summaryPadding]: true,
|
|
229
225
|
'select-none relative flex items-center gap-2 rounded-xl': true,
|
|
230
226
|
'transition-colors duration-150': true,
|
|
231
|
-
'
|
|
232
|
-
'hover:bg-surface-on/5 active:bg-surface-on/8 hover:ring-outline-variant/40': !this.locked,
|
|
227
|
+
'hover:bg-surface-on/5 active:bg-surface-on/8': !this.locked,
|
|
233
228
|
'focus-visible:ring-2 focus-visible:ring-primary-default/50 focus-visible:ring-offset-1': !this.locked,
|
|
234
229
|
'cursor-pointer group': !this.locked,
|
|
235
230
|
'cursor-default': this.locked,
|
|
@@ -240,7 +235,7 @@ export default class SchmancyDetails extends SurfaceMixin(SchmancyElement) {
|
|
|
240
235
|
const contentClasses = this.classMap({
|
|
241
236
|
[this.contentPadding]: true,
|
|
242
237
|
'text-sm': true,
|
|
243
|
-
'absolute inset-x-0 bg-surface-lowest/55 backdrop-blur-[16px] shadow-2xl rounded-b-xl z-20
|
|
238
|
+
'absolute inset-x-0 bg-surface-lowest/55 backdrop-blur-[16px] shadow-2xl rounded-b-xl z-20':
|
|
244
239
|
this.overlay,
|
|
245
240
|
})
|
|
246
241
|
|
package/src/form/index.ts
CHANGED
package/src/lightbox/lightbox.ts
CHANGED
|
@@ -329,7 +329,7 @@ export class SchmancyLightbox extends SchmancyElement {
|
|
|
329
329
|
>
|
|
330
330
|
<!-- Close Button -->
|
|
331
331
|
<button
|
|
332
|
-
class="absolute top-4 right-4 md:top-4 md:right-4 sm:top-2 sm:right-2 bg-white/15 backdrop-blur-md
|
|
332
|
+
class="absolute top-4 right-4 md:top-4 md:right-4 sm:top-2 sm:right-2 bg-white/15 backdrop-blur-md text-white w-11 h-11 rounded-full flex items-center justify-center cursor-pointer z-10 transition-all duration-200 hover:bg-white/25 hover:scale-105 active:scale-95"
|
|
333
333
|
@click=${this.handleClose}
|
|
334
334
|
aria-label="Close lightbox"
|
|
335
335
|
title="Close (Esc)"
|
|
@@ -383,7 +383,7 @@ export class SchmancyLightbox extends SchmancyElement {
|
|
|
383
383
|
class="absolute bottom-[-3.5rem] md:bottom-[-3.5rem] sm:bottom-[-3rem] left-1/2 -translate-x-1/2 flex items-center gap-4 z-10"
|
|
384
384
|
>
|
|
385
385
|
<button
|
|
386
|
-
class="bg-white/15 backdrop-blur-md
|
|
386
|
+
class="bg-white/15 backdrop-blur-md text-white w-10 h-10 rounded-full flex items-center justify-center cursor-pointer transition-all duration-200 hover:bg-white/25 hover:scale-105 active:scale-95"
|
|
387
387
|
@click=${this.handlePrevious}
|
|
388
388
|
aria-label="Previous image"
|
|
389
389
|
title="Previous (←)"
|
|
@@ -396,7 +396,7 @@ export class SchmancyLightbox extends SchmancyElement {
|
|
|
396
396
|
</div>
|
|
397
397
|
|
|
398
398
|
<button
|
|
399
|
-
class="bg-white/15 backdrop-blur-md
|
|
399
|
+
class="bg-white/15 backdrop-blur-md text-white w-10 h-10 rounded-full flex items-center justify-center cursor-pointer transition-all duration-200 hover:bg-white/25 hover:scale-105 active:scale-95"
|
|
400
400
|
@click=${this.handleNext}
|
|
401
401
|
aria-label="Next image"
|
|
402
402
|
title="Next (→)"
|
|
@@ -18,7 +18,6 @@
|
|
|
18
18
|
/* Type-colored luminous glow */
|
|
19
19
|
--notification-glow-color: var(--schmancy-sys-color-primary-default);
|
|
20
20
|
box-shadow: 0 4px 24px -6px color-mix(in srgb, var(--notification-glow-color) 18%, transparent);
|
|
21
|
-
border-left: 2px solid color-mix(in srgb, var(--notification-glow-color) 50%, transparent);
|
|
22
21
|
|
|
23
22
|
transition:
|
|
24
23
|
box-shadow 300ms ease,
|
|
@@ -140,7 +140,7 @@ export class SchmancyOverlayPromptBody extends SchmancyElement {
|
|
|
140
140
|
<button
|
|
141
141
|
type="button"
|
|
142
142
|
@click=${this.handleCancel}
|
|
143
|
-
class="px-4 py-2 rounded-md
|
|
143
|
+
class="px-4 py-2 rounded-md bg-transparent cursor-pointer hover:bg-surface-on/5"
|
|
144
144
|
>
|
|
145
145
|
${this.cancelText}
|
|
146
146
|
</button>
|
|
@@ -23,7 +23,6 @@ export const surfaceTypeStyles = css`
|
|
|
23
23
|
--glass-tint: var(--schmancy-sys-color-surface-on);
|
|
24
24
|
background: color-mix(in srgb, var(--glass-base) 92%, transparent);
|
|
25
25
|
color: var(--schmancy-sys-color-surface-on);
|
|
26
|
-
border: 1px solid color-mix(in srgb, var(--glass-tint) 4%, transparent);
|
|
27
26
|
}
|
|
28
27
|
|
|
29
28
|
/* Subtle — frosted glass, clearly readable */
|
|
@@ -34,28 +33,17 @@ export const surfaceTypeStyles = css`
|
|
|
34
33
|
backdrop-filter: blur(8px) saturate(130%);
|
|
35
34
|
-webkit-backdrop-filter: blur(8px) saturate(130%);
|
|
36
35
|
color: var(--schmancy-sys-color-surface-on);
|
|
37
|
-
border: 1px solid color-mix(in srgb, var(--glass-tint) 7%, transparent);
|
|
38
|
-
box-shadow: inset 0 1px 0 color-mix(in srgb, var(--glass-tint) 5%, transparent);
|
|
39
36
|
}
|
|
40
37
|
|
|
41
38
|
/* Glass — frosted glass, blur ensures readability */
|
|
42
39
|
:host([type='glass']) {
|
|
43
40
|
--glass-base: var(--schmancy-sys-color-surface-lowest);
|
|
44
41
|
--glass-tint: var(--schmancy-sys-color-surface-on);
|
|
45
|
-
--glass-border: color-mix(in srgb, var(--glass-tint) 10%, transparent);
|
|
46
|
-
--glass-border-highlight: color-mix(in srgb, var(--glass-tint) 18%, transparent);
|
|
47
42
|
|
|
48
43
|
background: color-mix(in srgb, var(--glass-base) 55%, transparent);
|
|
49
44
|
backdrop-filter: blur(16px) saturate(180%) brightness(1.05);
|
|
50
45
|
-webkit-backdrop-filter: blur(16px) saturate(180%) brightness(1.05);
|
|
51
46
|
color: var(--schmancy-sys-color-surface-on);
|
|
52
|
-
border: 1px solid var(--glass-border);
|
|
53
|
-
border-top-color: var(--glass-border-highlight);
|
|
54
|
-
border-left-color: var(--glass-border-highlight);
|
|
55
|
-
box-shadow:
|
|
56
|
-
0 4px 24px color-mix(in srgb, black 10%, transparent),
|
|
57
|
-
inset 0 1px 0 color-mix(in srgb, var(--glass-tint) 8%, transparent),
|
|
58
|
-
inset 0 -1px 0 color-mix(in srgb, black 3%, transparent);
|
|
59
47
|
contain: content;
|
|
60
48
|
position: relative;
|
|
61
49
|
overflow: hidden;
|
|
@@ -67,20 +55,11 @@ export const surfaceTypeStyles = css`
|
|
|
67
55
|
--glass-base: var(--schmancy-sys-color-surface-lowest);
|
|
68
56
|
--glass-tint: var(--schmancy-sys-color-surface-on);
|
|
69
57
|
--glow-color: var(--schmancy-sys-color-primary-default);
|
|
70
|
-
--glass-border: color-mix(in srgb, var(--glass-tint) 12%, transparent);
|
|
71
|
-
--glass-border-highlight: color-mix(in srgb, var(--glass-tint) 22%, transparent);
|
|
72
58
|
|
|
73
59
|
background: color-mix(in srgb, var(--glass-base) 42%, transparent);
|
|
74
60
|
backdrop-filter: blur(20px) saturate(200%) brightness(1.08);
|
|
75
61
|
-webkit-backdrop-filter: blur(20px) saturate(200%) brightness(1.08);
|
|
76
62
|
color: var(--schmancy-sys-color-surface-on);
|
|
77
|
-
border: 1px solid var(--glass-border);
|
|
78
|
-
border-top-color: var(--glass-border-highlight);
|
|
79
|
-
border-left-color: var(--glass-border-highlight);
|
|
80
|
-
box-shadow:
|
|
81
|
-
0 8px 40px -4px color-mix(in srgb, var(--glow-color) 20%, transparent),
|
|
82
|
-
0 2px 16px color-mix(in srgb, black 8%, transparent),
|
|
83
|
-
inset 0 1px 0 color-mix(in srgb, var(--glass-tint) 10%, transparent);
|
|
84
63
|
contain: content;
|
|
85
64
|
position: relative;
|
|
86
65
|
overflow: hidden;
|
|
@@ -114,49 +93,42 @@ export const surfaceTypeStyles = css`
|
|
|
114
93
|
backdrop-filter: blur(4px) saturate(140%);
|
|
115
94
|
-webkit-backdrop-filter: blur(4px) saturate(140%);
|
|
116
95
|
color: var(--schmancy-sys-color-primary-default);
|
|
117
|
-
border: 1px solid color-mix(in srgb, var(--schmancy-sys-color-primary-default) 20%, transparent);
|
|
118
96
|
}
|
|
119
97
|
:host([type='secondary']) {
|
|
120
98
|
background: color-mix(in srgb, var(--schmancy-sys-color-secondary-default) 12%, transparent);
|
|
121
99
|
backdrop-filter: blur(4px) saturate(140%);
|
|
122
100
|
-webkit-backdrop-filter: blur(4px) saturate(140%);
|
|
123
101
|
color: var(--schmancy-sys-color-secondary-default);
|
|
124
|
-
border: 1px solid color-mix(in srgb, var(--schmancy-sys-color-secondary-default) 20%, transparent);
|
|
125
102
|
}
|
|
126
103
|
:host([type='tertiary']) {
|
|
127
104
|
background: color-mix(in srgb, var(--schmancy-sys-color-tertiary-default) 12%, transparent);
|
|
128
105
|
backdrop-filter: blur(4px) saturate(140%);
|
|
129
106
|
-webkit-backdrop-filter: blur(4px) saturate(140%);
|
|
130
107
|
color: var(--schmancy-sys-color-tertiary-default);
|
|
131
|
-
border: 1px solid color-mix(in srgb, var(--schmancy-sys-color-tertiary-default) 20%, transparent);
|
|
132
108
|
}
|
|
133
109
|
:host([type='error']) {
|
|
134
110
|
background: color-mix(in srgb, var(--schmancy-sys-color-error-default) 12%, transparent);
|
|
135
111
|
backdrop-filter: blur(4px) saturate(140%);
|
|
136
112
|
-webkit-backdrop-filter: blur(4px) saturate(140%);
|
|
137
113
|
color: var(--schmancy-sys-color-error-onContainer);
|
|
138
|
-
border: 1px solid color-mix(in srgb, var(--schmancy-sys-color-error-default) 25%, transparent);
|
|
139
114
|
}
|
|
140
115
|
:host([type='success']) {
|
|
141
116
|
background: color-mix(in srgb, var(--schmancy-sys-color-success-default) 12%, transparent);
|
|
142
117
|
backdrop-filter: blur(4px) saturate(140%);
|
|
143
118
|
-webkit-backdrop-filter: blur(4px) saturate(140%);
|
|
144
119
|
color: var(--schmancy-sys-color-success-onContainer);
|
|
145
|
-
border: 1px solid color-mix(in srgb, var(--schmancy-sys-color-success-default) 25%, transparent);
|
|
146
120
|
}
|
|
147
121
|
:host([type='warning']) {
|
|
148
122
|
background: color-mix(in srgb, var(--schmancy-sys-color-warning-default) 12%, transparent);
|
|
149
123
|
backdrop-filter: blur(4px) saturate(140%);
|
|
150
124
|
-webkit-backdrop-filter: blur(4px) saturate(140%);
|
|
151
125
|
color: var(--schmancy-sys-color-warning-onContainer);
|
|
152
|
-
border: 1px solid color-mix(in srgb, var(--schmancy-sys-color-warning-default) 25%, transparent);
|
|
153
126
|
}
|
|
154
127
|
:host([type='info']) {
|
|
155
128
|
background: color-mix(in srgb, var(--schmancy-sys-color-info-default) 12%, transparent);
|
|
156
129
|
backdrop-filter: blur(4px) saturate(140%);
|
|
157
130
|
-webkit-backdrop-filter: blur(4px) saturate(140%);
|
|
158
131
|
color: var(--schmancy-sys-color-info-onContainer);
|
|
159
|
-
border: 1px solid color-mix(in srgb, var(--schmancy-sys-color-info-default) 25%, transparent);
|
|
160
132
|
}
|
|
161
133
|
|
|
162
134
|
/* ================================================================
|
|
@@ -173,7 +145,6 @@ export const surfaceTypeStyles = css`
|
|
|
173
145
|
--glass-tint: var(--schmancy-sys-color-surface-on);
|
|
174
146
|
background: color-mix(in srgb, var(--glass-base) 92%, transparent);
|
|
175
147
|
color: var(--schmancy-sys-color-surface-on);
|
|
176
|
-
border: 1px solid color-mix(in srgb, var(--glass-tint) 4%, transparent);
|
|
177
148
|
}
|
|
178
149
|
|
|
179
150
|
/* subtle aliases — frosted glass */
|
|
@@ -185,8 +156,6 @@ export const surfaceTypeStyles = css`
|
|
|
185
156
|
backdrop-filter: blur(8px) saturate(130%);
|
|
186
157
|
-webkit-backdrop-filter: blur(8px) saturate(130%);
|
|
187
158
|
color: var(--schmancy-sys-color-surface-on);
|
|
188
|
-
border: 1px solid color-mix(in srgb, var(--glass-tint) 7%, transparent);
|
|
189
|
-
box-shadow: inset 0 1px 0 color-mix(in srgb, var(--glass-tint) 5%, transparent);
|
|
190
159
|
}
|
|
191
160
|
|
|
192
161
|
/* glass aliases */
|
|
@@ -195,20 +164,11 @@ export const surfaceTypeStyles = css`
|
|
|
195
164
|
:host([type='glassOforim']) {
|
|
196
165
|
--glass-base: var(--schmancy-sys-color-surface-lowest);
|
|
197
166
|
--glass-tint: var(--schmancy-sys-color-surface-on);
|
|
198
|
-
--glass-border: color-mix(in srgb, var(--glass-tint) 10%, transparent);
|
|
199
|
-
--glass-border-highlight: color-mix(in srgb, var(--glass-tint) 18%, transparent);
|
|
200
167
|
|
|
201
168
|
background: color-mix(in srgb, var(--glass-base) 55%, transparent);
|
|
202
169
|
backdrop-filter: blur(16px) saturate(180%) brightness(1.05);
|
|
203
170
|
-webkit-backdrop-filter: blur(16px) saturate(180%) brightness(1.05);
|
|
204
171
|
color: var(--schmancy-sys-color-surface-on);
|
|
205
|
-
border: 1px solid var(--glass-border);
|
|
206
|
-
border-top-color: var(--glass-border-highlight);
|
|
207
|
-
border-left-color: var(--glass-border-highlight);
|
|
208
|
-
box-shadow:
|
|
209
|
-
0 4px 24px color-mix(in srgb, black 10%, transparent),
|
|
210
|
-
inset 0 1px 0 color-mix(in srgb, var(--glass-tint) 8%, transparent),
|
|
211
|
-
inset 0 -1px 0 color-mix(in srgb, black 3%, transparent);
|
|
212
172
|
position: relative;
|
|
213
173
|
overflow: hidden;
|
|
214
174
|
isolation: isolate;
|
|
@@ -301,19 +261,15 @@ export const surfaceClickableStyles = css`
|
|
|
301
261
|
}
|
|
302
262
|
:host([clickable]:hover) {
|
|
303
263
|
filter: brightness(1.03);
|
|
304
|
-
transform: translateY(-1px);
|
|
305
|
-
box-shadow: 0 4px 20px -6px color-mix(in srgb, var(--schmancy-sys-color-primary-default) 15%, transparent);
|
|
306
264
|
}
|
|
307
265
|
:host([clickable]:active) {
|
|
308
266
|
filter: brightness(0.96);
|
|
309
|
-
transform: scale(0.
|
|
310
|
-
box-shadow: none;
|
|
267
|
+
transform: scale(0.98);
|
|
311
268
|
transition-duration: 100ms;
|
|
312
269
|
}
|
|
313
270
|
:host([clickable]:focus-visible) {
|
|
314
271
|
outline: 2px solid var(--schmancy-sys-color-primary-default);
|
|
315
272
|
outline-offset: 2px;
|
|
316
|
-
box-shadow: 0 0 12px -2px color-mix(in srgb, var(--schmancy-sys-color-primary-default) 20%, transparent);
|
|
317
273
|
}
|
|
318
274
|
@media (prefers-reduced-motion: reduce) {
|
|
319
275
|
:host([clickable]) { transition: filter 150ms ease; }
|
package/src/window/window.ts
CHANGED
|
@@ -77,8 +77,6 @@ export default class SchmancyWindow extends SchmancyElement {
|
|
|
77
77
|
|
|
78
78
|
/** Lazy rendering: body content not in DOM until first expand. */
|
|
79
79
|
@state() private _hasOpened = false
|
|
80
|
-
/** Whether this window is the focused window in the manager — drives visual ring */
|
|
81
|
-
@state() private _focused = false
|
|
82
80
|
|
|
83
81
|
// Internal position -- plain fields, updated directly during drag
|
|
84
82
|
private _position: Position = { x: 16, y: 16 }
|
|
@@ -398,11 +396,6 @@ export default class SchmancyWindow extends SchmancyElement {
|
|
|
398
396
|
if (container) container.style.zIndex = String(record.zIndex)
|
|
399
397
|
}),
|
|
400
398
|
),
|
|
401
|
-
windowManager.selectFocused().pipe(
|
|
402
|
-
tap(focusedId => {
|
|
403
|
-
this._focused = focusedId === this.id
|
|
404
|
-
}),
|
|
405
|
-
),
|
|
406
399
|
)),
|
|
407
400
|
takeUntil(this.disconnecting),
|
|
408
401
|
).subscribe()
|
|
@@ -636,12 +629,7 @@ export default class SchmancyWindow extends SchmancyElement {
|
|
|
636
629
|
'flex-col': isBottom,
|
|
637
630
|
'flex-col-reverse': !isBottom,
|
|
638
631
|
'z-1000': true,
|
|
639
|
-
'ring-1': !this._focused,
|
|
640
|
-
'ring-2': this._focused,
|
|
641
|
-
'ring-primary-default/30': this._focused,
|
|
642
|
-
'ring-primary-default/15': this.open && !this._focused,
|
|
643
632
|
'rounded-2xl': this.open,
|
|
644
|
-
'ring-outline-variant/40': !this.open && !this._focused,
|
|
645
633
|
'rounded-[22px]': !this.open,
|
|
646
634
|
'overflow-hidden': true,
|
|
647
635
|
})
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export * from './autocomplete';
|
|
2
|
+
export * from './checkbox';
|
|
3
|
+
export * from './date-range';
|
|
4
|
+
export * from './input';
|
|
5
|
+
export * from './radio-group';
|
|
6
|
+
export * from './range';
|
|
7
|
+
export * from './select';
|
|
8
|
+
export * from './switch';
|
|
9
|
+
export * from './textarea';
|