@mhmo91/schmancy 0.9.28 → 0.10.2
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 +1005 -2215
- package/dist/active-host-CcIa2tmW.cjs +1 -0
- package/dist/active-host-CcIa2tmW.cjs.map +1 -0
- package/dist/active-host-CvNYoprt.js +57 -0
- package/dist/active-host-CvNYoprt.js.map +1 -0
- package/dist/agent/{flow-CvG1fLW5.js.map → flow-CaPi2G8y.js.map} +1 -1
- package/dist/agent/{rolldown-runtime-BIIoCavz.js → rolldown-runtime-DsMetpgY.js} +2 -9
- package/dist/agent/schmancy.agent.js +12678 -7791
- package/dist/agent/schmancy.agent.js.map +1 -1
- package/dist/agent/schmancy.manifest.json +265 -1453
- package/dist/agent/{vendor-highlight-Dow87ZL_.js → vendor-highlight-CHJZQQB7.js} +85 -90
- package/dist/agent/{vendor-highlight-Dow87ZL_.js.map → vendor-highlight-CHJZQQB7.js.map} +1 -1
- package/dist/agent/{vendor-jsqr-Bl4iAtKC.js → vendor-jsqr-r7GNh4P3.js} +1 -1
- package/dist/agent/{vendor-jsqr-Bl4iAtKC.js.map → vendor-jsqr-r7GNh4P3.js.map} +1 -1
- package/dist/agent/{vendor-material-color-DcL7ZPxx.js.map → vendor-material-color-Be96dpGE.js.map} +1 -1
- package/dist/{animation-hXFClrIn.js.map → animation-BK-8BwY8.js.map} +1 -1
- package/dist/{animation-CQRdLgzX.cjs.map → animation-CO_Csq84.cjs.map} +1 -1
- package/dist/{area-BGBCMC79.js → area-DHVANBbr.js} +20 -15
- package/dist/area-DHVANBbr.js.map +1 -0
- package/dist/area-ZupIezvU.cjs +12 -0
- package/dist/area-ZupIezvU.cjs.map +1 -0
- package/dist/area.cjs +1 -1
- package/dist/area.js +2 -2
- package/dist/{audio-Dvr-RBzE.cjs → audio-CluX8Qpq.cjs} +1 -1
- package/dist/{audio-Dvr-RBzE.cjs.map → audio-CluX8Qpq.cjs.map} +1 -1
- package/dist/{audio-ql6nvY0y.js → audio-DcXphulJ.js} +1 -1
- package/dist/{audio-ql6nvY0y.js.map → audio-DcXphulJ.js.map} +1 -1
- package/dist/audio.cjs +1 -1
- package/dist/audio.js +2 -2
- package/dist/autocomplete-Bn525CTp.cjs +115 -0
- package/dist/autocomplete-Bn525CTp.cjs.map +1 -0
- package/dist/{autocomplete-C2P0Soht.js → autocomplete-pHvsyfbH.js} +29 -26
- package/dist/autocomplete-pHvsyfbH.js.map +1 -0
- package/dist/autocomplete.cjs +1 -1
- package/dist/autocomplete.js +1 -1
- package/dist/avatar.cjs +7 -0
- package/dist/avatar.cjs.map +1 -0
- package/dist/avatar.js +87 -0
- package/dist/avatar.js.map +1 -0
- package/dist/badge.cjs +1 -1
- package/dist/badge.js +1 -1
- package/dist/boat-IyEtsNI4.cjs +80 -0
- package/dist/boat-IyEtsNI4.cjs.map +1 -0
- package/dist/{boat-DXZ0k7oa.js → boat-_Yv3M6YM.js} +43 -54
- package/dist/boat-_Yv3M6YM.js.map +1 -0
- package/dist/boat.cjs +1 -1
- package/dist/boat.js +1 -1
- package/dist/breadcrumb.cjs +4 -4
- package/dist/breadcrumb.cjs.map +1 -1
- package/dist/breadcrumb.js +16 -11
- package/dist/breadcrumb.js.map +1 -1
- package/dist/{busy-DGYhpTnO.cjs → busy-CjM39APN.cjs} +4 -4
- package/dist/busy-CjM39APN.cjs.map +1 -0
- package/dist/{busy-iRjq6Nvd.js → busy-Ck2IXJ4r.js} +14 -9
- package/dist/busy-Ck2IXJ4r.js.map +1 -0
- package/dist/busy.cjs +1 -1
- package/dist/busy.js +1 -1
- package/dist/button.cjs +24 -24
- package/dist/button.cjs.map +1 -1
- package/dist/button.js +42 -37
- package/dist/button.js.map +1 -1
- package/dist/{card-DjYnCckw.cjs → card-DIxDuuth.cjs} +6 -6
- package/dist/card-DIxDuuth.cjs.map +1 -0
- package/dist/{card-wUTjx0EC.js → card-DUWZmMHc.js} +41 -30
- package/dist/card-DUWZmMHc.js.map +1 -0
- package/dist/card.cjs +1 -1
- package/dist/card.js +1 -1
- package/dist/charts.cjs +5 -5
- package/dist/charts.cjs.map +1 -1
- package/dist/charts.js +21 -16
- package/dist/charts.js.map +1 -1
- package/dist/checkbox-CGdFXuWQ.cjs +39 -0
- package/dist/checkbox-CGdFXuWQ.cjs.map +1 -0
- package/dist/{checkbox-VBSenxgb.js → checkbox-DPS1mWG-.js} +86 -82
- package/dist/checkbox-DPS1mWG-.js.map +1 -0
- package/dist/checkbox.cjs +1 -1
- package/dist/checkbox.js +1 -1
- package/dist/{chips-BDS9lkPa.js → chips-BnnXQSA-.js} +146 -136
- package/dist/chips-BnnXQSA-.js.map +1 -0
- package/dist/{chips-D6ptH5re.cjs → chips-UoFbwmlG.cjs} +19 -19
- package/dist/chips-UoFbwmlG.cjs.map +1 -0
- package/dist/chips.cjs +1 -1
- package/dist/chips.js +2 -2
- package/dist/{code-highlight-BzRmBZzz.cjs → code-highlight-CMilN0B8.cjs} +15 -15
- package/dist/code-highlight-CMilN0B8.cjs.map +1 -0
- package/dist/{code-highlight-Bi91XHJN.js → code-highlight-kFUJ1Eet.js} +37 -40
- package/dist/code-highlight-kFUJ1Eet.js.map +1 -0
- package/dist/code-highlight.cjs +1 -1
- package/dist/code-highlight.js +1 -1
- package/dist/connectivity.cjs +2 -2
- package/dist/connectivity.cjs.map +1 -1
- package/dist/connectivity.js +10 -7
- package/dist/connectivity.js.map +1 -1
- package/dist/content-drawer.cjs +1 -1
- package/dist/content-drawer.js +2 -2
- package/dist/context-Bdu1xt0W.js +3 -0
- package/dist/{context-BerzpUhI.js.map → context-Bdu1xt0W.js.map} +1 -1
- package/dist/context-daN5G6HS.cjs +1 -0
- package/dist/{context-C6dHUHhi.cjs.map → context-daN5G6HS.cjs.map} +1 -1
- package/dist/{cursor-glow-BydlDInj.js → cursor-glow-Ah7VXSj7.js} +1 -1
- package/dist/{cursor-glow-BydlDInj.js.map → cursor-glow-Ah7VXSj7.js.map} +1 -1
- package/dist/{cursor-glow-Duw9jHmh.cjs → cursor-glow-Bulq-38P.cjs} +1 -1
- package/dist/{cursor-glow-Duw9jHmh.cjs.map → cursor-glow-Bulq-38P.cjs.map} +1 -1
- package/dist/date-range-BIyrzTRZ.cjs +131 -0
- package/dist/date-range-BIyrzTRZ.cjs.map +1 -0
- package/dist/{date-range-ClTMg1AB.js → date-range-DOstCIg8.js} +16 -17
- package/dist/date-range-DOstCIg8.js.map +1 -0
- package/dist/date-range-inline-4P7zqeVe.cjs +43 -0
- package/dist/{date-range-inline-B9Dp2z6C.cjs.map → date-range-inline-4P7zqeVe.cjs.map} +1 -1
- package/dist/{date-range-inline-CpKG6qt2.js → date-range-inline-BVycTWLb.js} +5 -5
- package/dist/{date-range-inline-CpKG6qt2.js.map → date-range-inline-BVycTWLb.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 +9 -1
- package/dist/delay.cjs.map +1 -0
- package/dist/delay.js +77 -2
- package/dist/delay.js.map +1 -0
- package/dist/{details-Cz9ok9si.cjs → details-BJBbZOO6.cjs} +9 -9
- package/dist/details-BJBbZOO6.cjs.map +1 -0
- package/dist/{details-CPjlqQD4.js → details-DPc5GxPa.js} +19 -18
- package/dist/details-DPc5GxPa.js.map +1 -0
- package/dist/details.cjs +1 -1
- package/dist/details.js +1 -1
- package/dist/{dialog-service-DH-tjPuE.js → dialog-service-DI9PPy4H.js} +2 -2
- package/dist/dialog-service-DI9PPy4H.js.map +1 -0
- package/dist/{dialog-service-CzDO08Gy.cjs → dialog-service-DJd5L0f5.cjs} +1 -1
- package/dist/dialog-service-DJd5L0f5.cjs.map +1 -0
- package/dist/dialog.cjs +2 -2
- package/dist/dialog.cjs.map +1 -1
- package/dist/dialog.js +13 -14
- package/dist/dialog.js.map +1 -1
- package/dist/directives.cjs +2 -11
- package/dist/directives.cjs.map +1 -1
- package/dist/directives.js +141 -227
- package/dist/directives.js.map +1 -1
- package/dist/discovery.cjs +1 -1
- package/dist/discovery.cjs.map +1 -1
- package/dist/discovery.js +1 -1
- package/dist/discovery.js.map +1 -1
- package/dist/{divider-ghgyw5CU.js → divider-BvJsmSPH.js} +11 -9
- package/dist/divider-BvJsmSPH.js.map +1 -0
- package/dist/{divider-CILo3_vi.cjs → divider-DPT3XnG5.cjs} +3 -3
- package/dist/divider-DPT3XnG5.cjs.map +1 -0
- package/dist/divider.cjs +1 -1
- package/dist/divider.js +1 -1
- package/dist/dropdown.cjs +4 -4
- package/dist/dropdown.cjs.map +1 -1
- package/dist/dropdown.js +29 -28
- package/dist/dropdown.js.map +1 -1
- package/dist/{expand-CbjBr_Ds.js → expand-BMzocdtj.js} +24 -20
- package/dist/expand-BMzocdtj.js.map +1 -0
- package/dist/expand-CTqBWVXo.cjs +141 -0
- package/dist/expand-CTqBWVXo.cjs.map +1 -0
- package/dist/expand.cjs +1 -1
- package/dist/expand.js +1 -1
- package/dist/{extra-DK9MQtPJ.js → extra-BeHlUhzv.js} +19 -14
- package/dist/extra-BeHlUhzv.js.map +1 -0
- package/dist/{extra-BZeZOMBI.cjs → extra-h_cuxRII.cjs} +6 -6
- package/dist/extra-h_cuxRII.cjs.map +1 -0
- package/dist/extra.cjs +1 -1
- package/dist/extra.js +1 -1
- package/dist/{float-BfCvGeY9.js → float-CTc1xxqH.js} +2 -2
- package/dist/{float-BfCvGeY9.js.map → float-CTc1xxqH.js.map} +1 -1
- package/dist/float-CwVBs11k.cjs +1 -0
- package/dist/{float-CuZ8LOgB.cjs.map → float-CwVBs11k.cjs.map} +1 -1
- package/dist/float.cjs +1 -1
- package/dist/float.js +1 -1
- package/dist/{form-rCZqoAoK.js → form-BtwOBMZ9.js} +1 -1
- package/dist/form-BtwOBMZ9.js.map +1 -0
- package/dist/{form-wI58M85H.cjs → form-CSJp687X.cjs} +1 -1
- package/dist/form-CSJp687X.cjs.map +1 -0
- package/dist/form.cjs +1 -1
- package/dist/form.js +1 -1
- package/dist/handover/agent-runtime-followups.md +1 -1
- package/dist/handover/agent-runtime-v1.md +3 -3
- package/dist/handover/claude-design-brief.md +19 -54
- package/dist/handover/claude-design-setup.md +57 -0
- package/dist/{hashContent-B2IntJQf.js.map → hashContent-1ARKIsx9.js.map} +1 -1
- package/dist/{hashContent-CahnEuut.cjs.map → hashContent-Bp5S6T4U.cjs.map} +1 -1
- package/dist/{icons-Drq4kKy2.js → icons-BbCVrcas.js} +27 -24
- package/dist/icons-BbCVrcas.js.map +1 -0
- package/dist/icons-qEQW4pjM.cjs +52 -0
- package/dist/icons-qEQW4pjM.cjs.map +1 -0
- package/dist/icons.cjs +1 -1
- package/dist/icons.js +1 -1
- package/dist/{iframe-BmyHW8km.js → iframe-BJfDIEJf.js} +17 -11
- package/dist/iframe-BJfDIEJf.js.map +1 -0
- package/dist/iframe-D6HTruav.cjs +24 -0
- package/dist/iframe-D6HTruav.cjs.map +1 -0
- package/dist/iframe.cjs +1 -1
- package/dist/iframe.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +77 -77
- package/dist/{input-Bc3bVISm.js → input-LTK3cctF.js} +34 -34
- package/dist/input-LTK3cctF.js.map +1 -0
- package/dist/input-U26axtcs.cjs +51 -0
- package/dist/input-U26axtcs.cjs.map +1 -0
- package/dist/{input-chip-DN-cwf11.cjs → input-chip-CADXt0X5.cjs} +2 -2
- package/dist/input-chip-CADXt0X5.cjs.map +1 -0
- package/dist/{input-chip-BQrjpjaQ.js → input-chip-Ch-aCs3c.js} +7 -4
- package/dist/input-chip-Ch-aCs3c.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.cjs.map +1 -1
- package/dist/json.js +7 -5
- package/dist/json.js.map +1 -1
- package/dist/kbd.cjs +2 -2
- package/dist/kbd.cjs.map +1 -1
- package/dist/kbd.js +9 -7
- package/dist/kbd.js.map +1 -1
- package/dist/{layout-fjM1DWlF.js → layout-C4xmnU4n.js} +1 -1
- package/dist/{layout-fjM1DWlF.js.map → layout-C4xmnU4n.js.map} +1 -1
- package/dist/{layout-CTfRXQoz.cjs → layout-Dmh6fxh0.cjs} +1 -1
- package/dist/{layout-CTfRXQoz.cjs.map → layout-Dmh6fxh0.cjs.map} +1 -1
- package/dist/layout.cjs +1 -1
- package/dist/layout.js +2 -3
- package/dist/{lazy-D6R5N5v4.js.map → lazy-B0ia54tT.js.map} +1 -1
- package/dist/{lazy-BDNnH_r7.cjs.map → lazy-Dq9mRRjT.cjs.map} +1 -1
- package/dist/lightbox-DbYUSfVl.cjs +202 -0
- package/dist/lightbox-DbYUSfVl.cjs.map +1 -0
- package/dist/{lightbox-CY52Z_ig.js → lightbox-DqG2z3Cn.js} +13 -12
- package/dist/lightbox-DqG2z3Cn.js.map +1 -0
- package/dist/lightbox.cjs +1 -1
- package/dist/lightbox.js +1 -1
- package/dist/list-CLX4sSAw.cjs +40 -0
- package/dist/list-CLX4sSAw.cjs.map +1 -0
- package/dist/{list-D7wUxu1C.js → list-D6-_E5ZD.js} +26 -21
- package/dist/list-D6-_E5ZD.js.map +1 -0
- package/dist/list.cjs +1 -1
- package/dist/list.js +1 -1
- package/dist/{magnetic-CVXEkYTA.cjs → magnetic-BH0TsofV.cjs} +1 -1
- package/dist/{magnetic-CVXEkYTA.cjs.map → magnetic-BH0TsofV.cjs.map} +1 -1
- package/dist/{magnetic-BhXebqF3.js → magnetic-BZGFxAWG.js} +2 -2
- package/dist/{magnetic-BhXebqF3.js.map → magnetic-BZGFxAWG.js.map} +1 -1
- package/dist/{mailbox-DLiBGJhY.cjs → mailbox-Ct6iYe-4.cjs} +64 -66
- package/dist/mailbox-Ct6iYe-4.cjs.map +1 -0
- package/dist/{mailbox--EN-JhjV.js → mailbox-DsPII8HR.js} +137 -126
- package/dist/mailbox-DsPII8HR.js.map +1 -0
- package/dist/mailbox.cjs +1 -1
- package/dist/mailbox.js +1 -1
- package/dist/{map-B0S_q3ma.js → map-Dhy3ta9v.js} +11 -9
- package/dist/map-Dhy3ta9v.js.map +1 -0
- package/dist/map-WXeVkx2K.cjs +80 -0
- package/dist/map-WXeVkx2K.cjs.map +1 -0
- package/dist/map.cjs +1 -1
- package/dist/map.js +1 -1
- package/dist/{menu-COeFpb6n.js → menu-Bhd3EapX.js} +15 -10
- package/dist/menu-Bhd3EapX.js.map +1 -0
- package/dist/{menu-3edZGQ1x.cjs → menu-Cg2aaDjs.cjs} +5 -5
- package/dist/menu-Cg2aaDjs.cjs.map +1 -0
- package/dist/menu.cjs +1 -1
- package/dist/menu.js +1 -1
- package/dist/mixins-CcIWET41.js +627 -0
- package/dist/mixins-CcIWET41.js.map +1 -0
- package/dist/mixins-De3xfjrm.cjs +298 -0
- package/dist/mixins-De3xfjrm.cjs.map +1 -0
- package/dist/mixins.cjs +1 -1
- package/dist/mixins.js +2 -87
- package/dist/nav-drawer.cjs +1 -1
- package/dist/nav-drawer.js +2 -2
- package/dist/navigation-bar.cjs +1 -1
- package/dist/navigation-bar.js +1 -1
- package/dist/navigation-rail.cjs +3 -3
- package/dist/navigation-rail.cjs.map +1 -1
- package/dist/navigation-rail.js +15 -16
- package/dist/navigation-rail.js.map +1 -1
- package/dist/{notification-CC-TFN5v.js → notification-CVLqQ8c_.js} +40 -38
- package/dist/notification-CVLqQ8c_.js.map +1 -0
- package/dist/notification-D_PQjBSf.cjs +23 -0
- package/dist/notification-D_PQjBSf.cjs.map +1 -0
- package/dist/notification.cjs +1 -1
- package/dist/notification.js +1 -1
- package/dist/option-DDU_goh1.cjs +43 -0
- package/dist/option-DDU_goh1.cjs.map +1 -0
- package/dist/{option-BwAF4nAw.js → option-rm4HebVs.js} +9 -7
- package/dist/option-rm4HebVs.js.map +1 -0
- package/dist/option.cjs +1 -1
- package/dist/option.js +1 -1
- package/dist/{overlay-stack-7bs4ZNnh.cjs → overlay-stack-BprhAE9a.cjs} +1 -1
- package/dist/{overlay-stack-7bs4ZNnh.cjs.map → overlay-stack-BprhAE9a.cjs.map} +1 -1
- package/dist/{overlay-stack-DXPYHPhk.js → overlay-stack-CAQno0CK.js} +1 -1
- package/dist/{overlay-stack-DXPYHPhk.js.map → overlay-stack-CAQno0CK.js.map} +1 -1
- package/dist/overlay.cjs +43 -45
- package/dist/overlay.cjs.map +1 -1
- package/dist/overlay.js +684 -268
- package/dist/overlay.js.map +1 -1
- package/dist/page.cjs +3 -3
- package/dist/page.cjs.map +1 -1
- package/dist/page.js +15 -13
- package/dist/page.js.map +1 -1
- package/dist/{components-DZgJWHdZ.js → payment-card-form-C0dHYZIv.js} +21 -22
- package/dist/{components-DZgJWHdZ.js.map → payment-card-form-C0dHYZIv.js.map} +1 -1
- package/dist/payment-card-form-DNvmZxs4.cjs +73 -0
- package/dist/{components-DkmEgyAc.cjs.map → payment-card-form-DNvmZxs4.cjs.map} +1 -1
- package/dist/payment-card-form.cjs +1 -0
- package/dist/payment-card-form.js +2 -0
- package/dist/{progress-Bk_Q1Shy.js → progress-BRerM5Bn.js} +16 -13
- package/dist/progress-BRerM5Bn.js.map +1 -0
- package/dist/{progress-Yz6EMNSu.cjs → progress-U3LQkpM2.cjs} +3 -3
- package/dist/progress-U3LQkpM2.cjs.map +1 -0
- package/dist/progress.cjs +1 -1
- package/dist/progress.js +1 -1
- package/dist/qr-scanner.cjs +5 -5
- package/dist/qr-scanner.cjs.map +1 -1
- package/dist/qr-scanner.js +14 -15
- package/dist/qr-scanner.js.map +1 -1
- package/dist/{radio-group-BcdcjLNC.js → radio-group-BZ2WoOXJ.js} +14 -12
- package/dist/radio-group-BZ2WoOXJ.js.map +1 -0
- package/dist/radio-group-D7mm-yvJ.cjs +40 -0
- package/dist/radio-group-D7mm-yvJ.cjs.map +1 -0
- package/dist/radio-group.cjs +1 -1
- package/dist/radio-group.js +1 -1
- package/dist/range.cjs +2 -2
- package/dist/range.cjs.map +1 -1
- package/dist/range.js +9 -7
- package/dist/range.js.map +1 -1
- package/dist/{reduced-motion-BZTLqAyl.js.map → reduced-motion-D-L12p7G.js.map} +1 -1
- package/dist/{reduced-motion-9RjNnhIg.cjs.map → reduced-motion-Ds-HjMzn.cjs.map} +1 -1
- package/dist/{rxjs-utils-DJbZRjp3.cjs.map → rxjs-utils-Csnks202.cjs.map} +1 -1
- package/dist/{rxjs-utils-CKTnEKUH.js.map → rxjs-utils-d-ivVN84.js.map} +1 -1
- package/dist/rxjs-utils.cjs +1 -1
- package/dist/rxjs-utils.js +1 -1
- package/dist/scroll-DJTjNIT_.cjs +26 -0
- package/dist/scroll-DJTjNIT_.cjs.map +1 -0
- package/dist/{scroll-DXQv0ejL.js → scroll-qL-HkMdP.js} +9 -7
- package/dist/scroll-qL-HkMdP.js.map +1 -0
- package/dist/search-BLCRsxIC.cjs +1 -0
- package/dist/{search-CwMav5QB.cjs.map → search-BLCRsxIC.cjs.map} +1 -1
- package/dist/{search-CvUZRLF1.js → search-BTz7-Rev.js} +1 -1
- package/dist/{search-CvUZRLF1.js.map → search-BTz7-Rev.js.map} +1 -1
- package/dist/{select-BV4lK2zy.cjs → select-BvA7v-gL.cjs} +6 -6
- package/dist/select-BvA7v-gL.cjs.map +1 -0
- package/dist/{select-DKyGWDsG.js → select-CnPXUeSf.js} +23 -20
- package/dist/select-CnPXUeSf.js.map +1 -0
- package/dist/select.cjs +1 -1
- package/dist/select.js +1 -1
- package/dist/{sheet-C3TLKItO.js → sheet-BRL07BB4.js} +22 -20
- package/dist/sheet-BRL07BB4.js.map +1 -0
- package/dist/sheet-BYQJAHQn.cjs +35 -0
- package/dist/sheet-BYQJAHQn.cjs.map +1 -0
- package/dist/sheet.cjs +1 -1
- package/dist/sheet.js +2 -2
- package/dist/sheet.service-B25bsrYG.cjs +1 -0
- package/dist/{sheet.service-RcDBwHmv.cjs.map → sheet.service-B25bsrYG.cjs.map} +1 -1
- package/dist/{sheet.service-Dlv20Zfc.js → sheet.service-SPQ8oLCi.js} +3 -3
- package/dist/{sheet.service-Dlv20Zfc.js.map → sheet.service-SPQ8oLCi.js.map} +1 -1
- package/dist/skeleton.cjs +2 -2
- package/dist/skeleton.cjs.map +1 -1
- package/dist/skeleton.js +9 -7
- package/dist/skeleton.js.map +1 -1
- package/dist/skills/INDEX.md +1 -1
- package/dist/skills/SKILL.md +17 -5
- package/dist/skills/mixins.md +78 -20
- package/dist/skills/schmancy/INDEX.md +1 -1
- package/dist/skills/schmancy/SKILL.md +17 -5
- package/dist/skills/schmancy/mixins.md +78 -20
- package/dist/skills/schmancy/state.md +501 -0
- package/dist/skills/schmancy/theme.md +15 -0
- package/dist/skills/schmancy/timeline-tile.md +95 -0
- package/dist/skills/state.md +501 -0
- package/dist/skills/theme.md +15 -0
- package/dist/skills/timeline-tile.md +95 -0
- package/dist/slider.cjs +5 -5
- package/dist/slider.cjs.map +1 -1
- package/dist/slider.js +18 -13
- package/dist/slider.js.map +1 -1
- package/dist/sound.service-BGs6m0Cm.cjs +1 -0
- package/dist/sound.service-BGs6m0Cm.cjs.map +1 -0
- package/dist/{sound.service-DWZe6swU.js → sound.service-kKfsN0m-.js} +3 -3
- package/dist/sound.service-kKfsN0m-.js.map +1 -0
- package/dist/splash-screen-BDt4PInk.cjs +41 -0
- package/dist/splash-screen-BDt4PInk.cjs.map +1 -0
- package/dist/{splash-screen-DbI5RgBf.js → splash-screen-C8JCqX5L.js} +12 -9
- package/dist/splash-screen-C8JCqX5L.js.map +1 -0
- package/dist/splash-screen.cjs +1 -1
- package/dist/splash-screen.js +1 -1
- package/dist/src-CpRNClhg.cjs +263 -0
- package/dist/src-CpRNClhg.cjs.map +1 -0
- package/dist/{src-00DfxCJq.js → src-CqdnWGgr.js} +299 -351
- package/dist/src-CqdnWGgr.js.map +1 -0
- package/dist/state-BusMG6sM.js +868 -0
- package/dist/state-BusMG6sM.js.map +1 -0
- package/dist/state-DNdCPITt.cjs +1 -0
- package/dist/state-DNdCPITt.cjs.map +1 -0
- package/dist/state.cjs +1 -0
- package/dist/state.js +3 -0
- package/dist/steps.cjs +10 -10
- package/dist/steps.cjs.map +1 -1
- package/dist/steps.js +29 -24
- package/dist/steps.js.map +1 -1
- package/dist/surface-C8jQy8Ym.js +24 -0
- package/dist/surface-C8jQy8Ym.js.map +1 -0
- package/dist/surface-Du2Y4vXd.cjs +7 -0
- package/dist/surface-Du2Y4vXd.cjs.map +1 -0
- package/dist/surface.cjs +1 -1
- package/dist/surface.js +1 -1
- package/dist/switch.cjs +2 -2
- package/dist/switch.cjs.map +1 -1
- package/dist/switch.js +7 -5
- package/dist/switch.js.map +1 -1
- package/dist/table.cjs +72 -1
- package/dist/table.cjs.map +1 -0
- package/dist/table.js +174 -2
- package/dist/table.js.map +1 -0
- package/dist/tabs-0RfeCa00.cjs +31 -0
- package/dist/tabs-0RfeCa00.cjs.map +1 -0
- package/dist/{tabs-Ce55RbwF.js → tabs-Cyahh9Q6.js} +22 -22
- package/dist/tabs-Cyahh9Q6.js.map +1 -0
- package/dist/tabs.cjs +1 -1
- package/dist/tabs.js +1 -1
- package/dist/teleport.cjs +1 -1
- package/dist/teleport.js +2 -2
- package/dist/{textarea-DjN1D9u0.js → textarea-CXCcTVnf.js} +30 -28
- package/dist/textarea-CXCcTVnf.js.map +1 -0
- package/dist/textarea-jqRrLxmo.cjs +39 -0
- package/dist/textarea-jqRrLxmo.cjs.map +1 -0
- package/dist/textarea.cjs +1 -1
- package/dist/textarea.js +1 -1
- package/dist/{theme-pbxlt72h.js → theme-2KZW2Rfs.js} +45 -41
- package/dist/{theme-pbxlt72h.js.map → theme-2KZW2Rfs.js.map} +1 -1
- package/dist/theme-Hjz9sCN-.cjs +181 -0
- package/dist/{theme-B-IJ2r7Q.cjs.map → theme-Hjz9sCN-.cjs.map} +1 -1
- package/dist/{theme-button-CEMeAUOL.js → theme-button-9uF1eoHz.js} +3 -4
- package/dist/theme-button-9uF1eoHz.js.map +1 -0
- package/dist/theme-button-C7QIbke1.cjs +8 -0
- package/dist/theme-button-C7QIbke1.cjs.map +1 -0
- package/dist/theme-button.cjs +1 -1
- package/dist/theme-button.js +1 -1
- package/dist/theme.cjs +1 -1
- package/dist/{theme.events-NuihzD_p.js.map → theme.events-Cv7N4Toe.js.map} +1 -1
- package/dist/{theme.events-DakXxZeP.cjs.map → theme.events-DM4H5F2d.cjs.map} +1 -1
- package/dist/{theme.interface-DTwkuAKJ.cjs.map → theme.interface-D9l33b-M.cjs.map} +1 -1
- package/dist/{theme.interface-Buged9Cg.js.map → theme.interface-DnVNre4O.js.map} +1 -1
- package/dist/theme.js +5 -5
- package/dist/theme.service-BrUbGoeQ.cjs +1 -0
- package/dist/theme.service-BrUbGoeQ.cjs.map +1 -0
- package/dist/{theme.service-cOfPrtfe.js → theme.service-CmbOGMA8.js} +4 -4
- package/dist/theme.service-CmbOGMA8.js.map +1 -0
- package/dist/timeline.cjs +277 -0
- package/dist/timeline.cjs.map +1 -0
- package/dist/timeline.js +326 -0
- package/dist/timeline.js.map +1 -0
- package/dist/tree.cjs +2 -2
- package/dist/tree.cjs.map +1 -1
- package/dist/tree.js +15 -13
- package/dist/tree.js.map +1 -1
- package/dist/typewriter.cjs +10 -123
- package/dist/typewriter.cjs.map +1 -1
- package/dist/typewriter.js +90 -212
- package/dist/typewriter.js.map +1 -1
- package/dist/typography.cjs +3 -3
- package/dist/typography.cjs.map +1 -1
- package/dist/typography.js +18 -112
- package/dist/typography.js.map +1 -1
- package/dist/utils-Cr-YO4Np.cjs +1 -0
- package/dist/utils-Cr-YO4Np.cjs.map +1 -0
- package/dist/{utils-Bp2jhyZc.js → utils-hp-DnFf5.js} +16 -6
- package/dist/utils-hp-DnFf5.js.map +1 -0
- package/dist/utils.cjs +1 -1
- package/dist/utils.js +4 -5
- package/dist/visually-hidden.cjs +2 -2
- package/dist/visually-hidden.cjs.map +1 -1
- package/dist/visually-hidden.js +7 -5
- package/dist/visually-hidden.js.map +1 -1
- package/dist/{window-CrjZdf7Y.js → window-C7yY9yp5.js} +28 -30
- package/dist/window-C7yY9yp5.js.map +1 -0
- package/dist/window-DtUOWiAj.cjs +59 -0
- package/dist/window-DtUOWiAj.cjs.map +1 -0
- package/dist/window.cjs +1 -1
- package/dist/window.js +1 -1
- package/package.json +15 -4
- package/plugins/vite-plugin-schmancy-auto-import.ts +143 -0
- package/plugins/vite-plugin-schmancy-manifest.ts +438 -0
- package/skills/schmancy/INDEX.md +1 -1
- package/skills/schmancy/SKILL.md +17 -5
- package/skills/schmancy/mixins.md +78 -20
- package/skills/schmancy/state.md +501 -0
- package/skills/schmancy/theme.md +15 -0
- package/skills/schmancy/timeline-tile.md +95 -0
- package/src/agent/agent-bundle.test.ts +71 -54
- package/src/agent/agent-entry.ts +5 -21
- package/src/agent/helpers.ts +159 -0
- package/src/agent/schmancy-skill.ts +71 -0
- package/src/agent/virtual-manifest.d.ts +1 -12
- package/src/area/area.component.ts +7 -19
- package/src/area/area.service.test.ts +4 -5
- package/src/area/area.service.ts +4 -3
- package/src/area/route.component.ts +17 -4
- package/src/area/utils.ts +3 -2
- package/src/audio/emotional-sounds.ts +0 -2
- package/src/audio/sound.service.ts +7 -13
- package/src/autocomplete/autocomplete.ts +18 -21
- package/src/{avatar.ts → avatar/avatar.ts} +2 -2
- package/src/avatar/index.ts +1 -0
- package/src/badge/badge.ts +4 -3
- package/src/boat/boat.ts +28 -36
- package/src/breadcrumb/breadcrumb.ts +11 -19
- package/src/busy/busy.ts +4 -3
- package/src/busy/spinner.ts +4 -3
- package/src/button/button.ts +6 -11
- package/src/button/icon-button.ts +8 -12
- package/src/card/actions.ts +4 -12
- package/src/card/card.ts +5 -23
- package/src/card/content.ts +4 -12
- package/src/card/media.ts +4 -9
- package/src/charts/area-chart.ts +7 -4
- package/src/charts/pills.ts +6 -4
- package/src/checkbox/checkbox.test.ts +2 -2
- package/src/checkbox/checkbox.ts +3 -9
- package/src/chips/assist-chip.ts +6 -14
- package/src/chips/chips.ts +7 -21
- package/src/chips/filter-chip.ts +4 -3
- package/src/chips/input-chip.ts +10 -9
- package/src/chips/suggestion-chip.ts +10 -12
- package/src/code-highlight/code-highlight.ts +28 -59
- package/src/code-highlight/code-preview.ts +11 -9
- package/src/connectivity/connectivity-status.ts +4 -3
- package/src/content-drawer/drawer.ts +5 -3
- package/src/content-drawer/main.ts +5 -3
- package/src/content-drawer/sheet.ts +6 -4
- package/src/date-range/date-range-dialog.ts +2 -2
- package/src/date-range/date-range.ts +3 -2
- package/src/delay/delay.ts +2 -2
- package/src/details/details.ts +4 -17
- package/src/dialog/dialog-service.ts +2 -0
- package/src/dialog/dialog.component.ts +9 -9
- package/src/directives/drag.ts +1 -9
- package/src/directives/index.ts +0 -1
- package/src/discovery/discovery.service.ts +1 -1
- package/src/divider/divider.ts +5 -14
- package/src/dropdown/dropdown-component.ts +5 -16
- package/src/dropdown/dropdown-content.ts +7 -14
- package/src/expand/expand-root.component.ts +5 -15
- package/src/expand/expand.component.ts +4 -17
- package/src/extra/countries/countries.ts +5 -13
- package/src/extra/timezone/timezone.ts +7 -12
- package/src/form/form.test.ts +2 -2
- package/src/form/form.ts +2 -9
- package/src/icons/icon.ts +4 -3
- package/src/iframe/iframe.ts +13 -4
- package/src/index.ts +3 -3
- package/src/input/input.ts +6 -13
- package/src/json/json.ts +4 -3
- package/src/kbd/kbd.ts +4 -3
- package/src/layout/index.ts +1 -5
- package/src/layout/scroll/scroll.ts +5 -8
- package/src/lightbox/flip-directive.ts +1 -1
- package/src/lightbox/lightbox.ts +5 -14
- package/src/list/list-item.ts +4 -13
- package/src/list/list.ts +12 -10
- package/src/mailbox/email-editor.ts +17 -11
- package/src/mailbox/email-layout-selector.ts +2 -2
- package/src/mailbox/email-recipients.ts +13 -8
- package/src/mailbox/email-template-picker.ts +6 -5
- package/src/mailbox/email-viewer.ts +5 -3
- package/src/mailbox/mailbox.ts +6 -5
- package/src/map/map.ts +8 -6
- package/src/menu/menu-item.ts +5 -16
- package/src/menu/menu.ts +27 -13
- package/src/nav-drawer/appbar.ts +4 -14
- package/src/nav-drawer/content.ts +5 -14
- package/src/nav-drawer/drawer.ts +5 -18
- package/src/nav-drawer/navbar.ts +3 -17
- package/src/navigation-bar/navigation-bar-item.ts +8 -6
- package/src/navigation-bar/navigation-bar.ts +19 -19
- package/src/navigation-rail/navigation-rail-item.ts +9 -5
- package/src/navigation-rail/navigation-rail.ts +10 -14
- package/src/notification/notification-service.ts +0 -2
- package/src/notification/notification.ts +6 -3
- package/src/option/option.ts +4 -3
- package/src/overlay/overlay.animations.ts +183 -37
- package/src/overlay/overlay.component.ts +397 -190
- package/src/overlay/overlay.confirm-body.ts +21 -7
- package/src/overlay/overlay.gestures.ts +72 -36
- package/src/overlay/overlay.layout.ts +103 -1
- package/src/overlay/overlay.positioning.ts +301 -0
- package/src/overlay/overlay.service.ts +81 -3
- package/src/overlay/overlay.stack.ts +8 -10
- package/src/overlay/overlay.types.ts +83 -5
- package/src/page/page.ts +16 -11
- package/src/payment-card-form/index.ts +1 -0
- package/src/{components/form-elements → payment-card-form}/payment-card-form.ts +23 -23
- package/src/progress/progress.ts +5 -3
- package/src/qr-scanner/qr-scanner.ts +7 -30
- package/src/radio-group/radio-button.ts +3 -13
- package/src/radio-group/radio-group.ts +5 -22
- package/src/range/range.ts +4 -3
- package/src/rxjs-utils/waitForElements.ts +1 -1
- package/src/rxjs-utils/waitForElementsAll.ts +1 -1
- package/src/select/select.ts +10 -18
- package/src/sheet/hook.ts +1 -1
- package/src/sheet/sheet.ts +5 -20
- package/src/skeleton/skeleton.ts +4 -3
- package/src/slider/slide.ts +5 -3
- package/src/slider/slider.ts +5 -3
- package/src/splash-screen/splash-screen.ts +5 -3
- package/src/state/CLAUDE.md +161 -0
- package/src/state/MIGRATION.md +258 -0
- package/src/state/SCOPING.md +134 -0
- package/src/state/active-host.ts +190 -0
- package/src/state/index.ts +877 -0
- package/src/state/persist.ts +208 -0
- package/src/state/schmancy-context.ts +130 -0
- package/src/state/state.test-d.ts +227 -0
- package/src/state/state.test.ts +868 -0
- package/src/steps/schmancy-step.ts +5 -3
- package/src/steps/schmancy-steps-container.ts +5 -3
- package/src/surface/surface.ts +14 -9
- package/src/switch/switch.test.ts +2 -2
- package/src/switch/switch.ts +8 -10
- package/src/table/row.ts +7 -4
- package/src/table/table.ts +17 -14
- package/src/tabs/index.ts +0 -2
- package/src/tabs/tab.ts +2 -2
- package/src/tabs/tabs-group.ts +7 -4
- package/src/teleport/teleport.component.ts +5 -3
- package/src/textarea/textarea.ts +6 -12
- package/src/theme/theme-audio-player.ts +7 -5
- package/src/theme/theme-controller.ts +2 -2
- package/src/theme/theme.component.ts +22 -15
- package/src/theme/theme.service.ts +6 -7
- package/src/theme/theme.style.css +1 -0
- package/src/theme-button/theme-button.ts +2 -2
- package/src/timeline/index.ts +1 -0
- package/src/timeline/timeline-tile.ts +431 -0
- package/src/tree/tree.ts +4 -16
- package/src/typewriter/index.ts +1 -1
- package/src/typography/typography.ts +5 -98
- package/src/utils/intersection.ts +5 -1
- package/src/utils/overlay-stack.ts +1 -1
- package/src/utils/search.ts +2 -2
- package/src/visually-hidden/visually-hidden.ts +4 -3
- package/src/window/window-position.ts +3 -6
- package/src/window/window.ts +9 -7
- package/types/mixins/SchmancyElement.d.ts +49 -0
- package/types/mixins/formField.mixin.d.ts +4 -2
- package/types/mixins/index.d.ts +1 -0
- package/types/mixins/litElement.mixin.d.ts +11 -0
- package/types/src/agent/agent-entry.d.ts +2 -19
- package/types/src/agent/helpers.d.ts +0 -27
- package/types/src/agent/schmancy-skill.d.ts +3 -5
- package/types/src/area/area.component.d.ts +3 -17
- package/types/src/area/route.component.d.ts +14 -4
- package/types/src/audio/emotional-sounds.d.ts +0 -1
- package/types/src/audio/sound.service.d.ts +1 -1
- package/types/src/autocomplete/autocomplete.d.ts +4 -15
- package/types/src/{avatar.d.ts → avatar/avatar.d.ts} +2 -3
- package/types/src/avatar/index.d.ts +1 -0
- package/types/src/badge/badge.d.ts +3 -3
- package/types/src/boat/boat.d.ts +3 -2
- package/types/src/breadcrumb/breadcrumb.d.ts +9 -19
- package/types/src/busy/busy.d.ts +3 -3
- package/types/src/busy/spinner.d.ts +3 -3
- package/types/src/button/button.d.ts +4 -10
- package/types/src/button/icon-button.d.ts +5 -11
- package/types/src/card/actions.d.ts +3 -12
- package/types/src/card/card.d.ts +4 -24
- package/types/src/card/content.d.ts +3 -12
- package/types/src/card/media.d.ts +3 -9
- package/types/src/charts/area-chart.d.ts +3 -3
- package/types/src/charts/pills.d.ts +3 -3
- package/types/src/checkbox/checkbox.d.ts +3 -10
- package/types/src/chips/assist-chip.d.ts +5 -15
- package/types/src/chips/chips.d.ts +3 -17
- package/types/src/chips/filter-chip.d.ts +3 -3
- package/types/src/chips/input-chip.d.ts +9 -10
- package/types/src/chips/suggestion-chip.d.ts +9 -13
- package/types/src/code-highlight/code-highlight.d.ts +4 -11
- package/types/src/code-highlight/code-preview.d.ts +3 -3
- package/types/src/connectivity/connectivity-status.d.ts +3 -3
- package/types/src/content-drawer/drawer.d.ts +4 -4
- package/types/src/content-drawer/main.d.ts +3 -3
- package/types/src/content-drawer/sheet.d.ts +4 -4
- package/types/src/date-range/date-range-dialog.d.ts +2 -3
- package/types/src/date-range/date-range.d.ts +2 -3
- package/types/src/delay/delay.d.ts +2 -3
- package/types/src/details/details.d.ts +3 -14
- package/types/src/dialog/dialog.component.d.ts +9 -9
- package/types/src/directives/drag.d.ts +1 -3
- package/types/src/directives/index.d.ts +0 -1
- package/types/src/divider/divider.d.ts +3 -14
- package/types/src/dropdown/dropdown-component.d.ts +4 -17
- package/types/src/dropdown/dropdown-content.d.ts +6 -14
- package/types/src/expand/expand-root.component.d.ts +4 -14
- package/types/src/expand/expand.component.d.ts +3 -17
- package/types/src/extra/countries/countries.d.ts +3 -13
- package/types/src/extra/timezone/timezone.d.ts +4 -11
- package/types/src/form/form.d.ts +2 -9
- package/types/src/icons/icon.d.ts +3 -3
- package/types/src/iframe/iframe.d.ts +5 -3
- package/types/src/index.d.ts +3 -3
- package/types/src/input/input.d.ts +4 -11
- package/types/src/json/json.d.ts +3 -3
- package/types/src/kbd/kbd.d.ts +3 -3
- package/types/src/layout/index.d.ts +0 -4
- package/types/src/layout/scroll/scroll.d.ts +4 -8
- package/types/src/lightbox/lightbox.d.ts +3 -14
- package/types/src/list/list-item.d.ts +3 -13
- package/types/src/list/list.d.ts +11 -10
- package/types/src/mailbox/email-editor.d.ts +3 -3
- package/types/src/mailbox/email-layout-selector.d.ts +2 -3
- package/types/src/mailbox/email-recipients.d.ts +7 -3
- package/types/src/mailbox/email-template-picker.d.ts +4 -4
- package/types/src/mailbox/email-viewer.d.ts +3 -3
- package/types/src/mailbox/mailbox.d.ts +4 -4
- package/types/src/map/map.d.ts +4 -3
- package/types/src/menu/menu-item.d.ts +3 -16
- package/types/src/menu/menu.d.ts +25 -13
- package/types/src/nav-drawer/appbar.d.ts +3 -14
- package/types/src/nav-drawer/content.d.ts +3 -14
- package/types/src/nav-drawer/drawer.d.ts +3 -18
- package/types/src/nav-drawer/navbar.d.ts +3 -18
- package/types/src/navigation-bar/navigation-bar-item.d.ts +7 -6
- package/types/src/navigation-bar/navigation-bar.d.ts +13 -7
- package/types/src/navigation-rail/navigation-rail-item.d.ts +9 -6
- package/types/src/navigation-rail/navigation-rail.d.ts +10 -15
- package/types/src/notification/notification-service.d.ts +0 -1
- package/types/src/notification/notification.d.ts +3 -3
- package/types/src/option/option.d.ts +3 -3
- package/types/src/overlay/overlay.animations.d.ts +54 -6
- package/types/src/overlay/overlay.component.d.ts +39 -15
- package/types/src/overlay/overlay.confirm-body.d.ts +4 -4
- package/types/src/overlay/overlay.gestures.d.ts +26 -17
- package/types/src/overlay/overlay.layout.d.ts +27 -1
- package/types/src/overlay/overlay.positioning.d.ts +87 -0
- package/types/src/overlay/overlay.stack.d.ts +0 -2
- package/types/src/overlay/overlay.types.d.ts +59 -5
- package/types/src/page/page.d.ts +14 -11
- package/types/src/{components/form-elements → payment-card-form}/payment-card-form.d.ts +2 -3
- package/types/src/progress/progress.d.ts +3 -3
- package/types/src/qr-scanner/qr-scanner.d.ts +3 -3
- package/types/src/radio-group/radio-button.d.ts +3 -12
- package/types/src/radio-group/radio-group.d.ts +4 -20
- package/types/src/range/range.d.ts +3 -3
- package/types/src/rxjs-utils/waitForElements.d.ts +1 -1
- package/types/src/rxjs-utils/waitForElementsAll.d.ts +1 -1
- package/types/src/select/select.d.ts +4 -15
- package/types/src/sheet/sheet.d.ts +3 -20
- package/types/src/skeleton/skeleton.d.ts +3 -3
- package/types/src/slider/slide.d.ts +3 -2
- package/types/src/slider/slider.d.ts +3 -3
- package/types/src/splash-screen/splash-screen.d.ts +3 -3
- package/types/src/state/active-host.d.ts +23 -0
- package/types/src/state/index.d.ts +145 -0
- package/types/src/state/persist.d.ts +14 -0
- package/types/src/state/schmancy-context.d.ts +32 -0
- package/types/src/state/state.test-d.d.ts +131 -0
- package/types/src/state/state.test.d.ts +1 -0
- package/types/src/steps/schmancy-step.d.ts +3 -3
- package/types/src/steps/schmancy-steps-container.d.ts +3 -3
- package/types/src/surface/surface.d.ts +13 -5
- package/types/src/switch/switch.d.ts +7 -11
- package/types/src/table/row.d.ts +2 -3
- package/types/src/table/table.d.ts +4 -11
- package/types/src/tabs/index.d.ts +0 -2
- package/types/src/tabs/tab.d.ts +2 -3
- package/types/src/tabs/tabs-group.d.ts +3 -3
- package/types/src/teleport/teleport.component.d.ts +3 -3
- package/types/src/textarea/textarea.d.ts +5 -12
- package/types/src/theme/theme-audio-player.d.ts +3 -3
- package/types/src/theme/theme-controller.d.ts +2 -2
- package/types/src/theme/theme.component.d.ts +18 -13
- package/types/src/theme-button/theme-button.d.ts +2 -3
- package/types/src/timeline/index.d.ts +1 -0
- package/types/src/timeline/timeline-tile.d.ts +44 -0
- package/types/src/tree/tree.d.ts +3 -16
- package/types/src/typewriter/index.d.ts +1 -1
- package/types/src/typography/typography.d.ts +3 -36
- package/types/src/visually-hidden/visually-hidden.d.ts +3 -3
- package/types/src/window/window.d.ts +3 -3
- package/dist/agent/index.es-Dymj8REP.js +0 -489
- package/dist/agent/index.es-Dymj8REP.js.map +0 -1
- package/dist/area-BGBCMC79.js.map +0 -1
- package/dist/area-D7l9KR2N.cjs +0 -12
- package/dist/area-D7l9KR2N.cjs.map +0 -1
- package/dist/autocomplete-BPD5uraA.cjs +0 -115
- package/dist/autocomplete-BPD5uraA.cjs.map +0 -1
- package/dist/autocomplete-C2P0Soht.js.map +0 -1
- package/dist/boat-BkIO-0No.cjs +0 -80
- package/dist/boat-BkIO-0No.cjs.map +0 -1
- package/dist/boat-DXZ0k7oa.js.map +0 -1
- package/dist/busy-DGYhpTnO.cjs.map +0 -1
- package/dist/busy-iRjq6Nvd.js.map +0 -1
- package/dist/card-DjYnCckw.cjs.map +0 -1
- package/dist/card-wUTjx0EC.js.map +0 -1
- package/dist/checkbox-CiYEtw9F.cjs +0 -39
- package/dist/checkbox-CiYEtw9F.cjs.map +0 -1
- package/dist/checkbox-VBSenxgb.js.map +0 -1
- package/dist/chips-BDS9lkPa.js.map +0 -1
- package/dist/chips-D6ptH5re.cjs.map +0 -1
- package/dist/code-highlight-Bi91XHJN.js.map +0 -1
- package/dist/code-highlight-BzRmBZzz.cjs.map +0 -1
- package/dist/components-DkmEgyAc.cjs +0 -73
- package/dist/components.cjs +0 -1
- package/dist/components.js +0 -2
- package/dist/context-BerzpUhI.js +0 -3
- package/dist/context-C6dHUHhi.cjs +0 -1
- package/dist/date-range-BmFxTXiU.cjs +0 -131
- package/dist/date-range-BmFxTXiU.cjs.map +0 -1
- package/dist/date-range-ClTMg1AB.js.map +0 -1
- package/dist/date-range-inline-B9Dp2z6C.cjs +0 -43
- package/dist/delay-BHODnTg-.cjs +0 -9
- package/dist/delay-BHODnTg-.cjs.map +0 -1
- package/dist/delay-Dlk0A3he.js +0 -347
- package/dist/delay-Dlk0A3he.js.map +0 -1
- package/dist/details-CPjlqQD4.js.map +0 -1
- package/dist/details-Cz9ok9si.cjs.map +0 -1
- package/dist/dialog-service-CzDO08Gy.cjs.map +0 -1
- package/dist/dialog-service-DH-tjPuE.js.map +0 -1
- package/dist/divider-CILo3_vi.cjs.map +0 -1
- package/dist/divider-ghgyw5CU.js.map +0 -1
- package/dist/expand-CbjBr_Ds.js.map +0 -1
- package/dist/expand-r3OrSoDk.cjs +0 -141
- package/dist/expand-r3OrSoDk.cjs.map +0 -1
- package/dist/extra-BZeZOMBI.cjs.map +0 -1
- package/dist/extra-DK9MQtPJ.js.map +0 -1
- package/dist/float-CuZ8LOgB.cjs +0 -1
- package/dist/flow-BPDtbhLe.js +0 -386
- package/dist/flow-BPDtbhLe.js.map +0 -1
- package/dist/flow-Dn9AZktE.cjs +0 -1
- package/dist/flow-Dn9AZktE.cjs.map +0 -1
- package/dist/form-rCZqoAoK.js.map +0 -1
- package/dist/form-wI58M85H.cjs.map +0 -1
- package/dist/handover/agent-runtime-v2-loopback.md +0 -71
- package/dist/handover/claude-design-v2-paste.md +0 -42
- package/dist/icons-Drq4kKy2.js.map +0 -1
- package/dist/icons-DtdhaZdc.cjs +0 -52
- package/dist/icons-DtdhaZdc.cjs.map +0 -1
- package/dist/iframe-BkwwWIbQ.cjs +0 -24
- package/dist/iframe-BkwwWIbQ.cjs.map +0 -1
- package/dist/iframe-BmyHW8km.js.map +0 -1
- package/dist/index.es-BgmFX1JM.cjs +0 -1
- package/dist/index.es-BgmFX1JM.cjs.map +0 -1
- package/dist/index.es-CLyb_o3Y.js +0 -489
- package/dist/index.es-CLyb_o3Y.js.map +0 -1
- package/dist/input-BGNZlfL8.cjs +0 -51
- package/dist/input-BGNZlfL8.cjs.map +0 -1
- package/dist/input-Bc3bVISm.js.map +0 -1
- package/dist/input-chip-BQrjpjaQ.js.map +0 -1
- package/dist/input-chip-DN-cwf11.cjs.map +0 -1
- package/dist/intersection-BrXp4YTO.js +0 -12
- package/dist/intersection-BrXp4YTO.js.map +0 -1
- package/dist/intersection-DqBqnpgh.cjs +0 -1
- package/dist/intersection-DqBqnpgh.cjs.map +0 -1
- package/dist/layout-7eyMBmZk.cjs +0 -17
- package/dist/layout-7eyMBmZk.cjs.map +0 -1
- package/dist/layout-Ox6nJkzC.js +0 -268
- package/dist/layout-Ox6nJkzC.js.map +0 -1
- package/dist/lightbox-CY52Z_ig.js.map +0 -1
- package/dist/lightbox-H8Uq3AXy.cjs +0 -202
- package/dist/lightbox-H8Uq3AXy.cjs.map +0 -1
- package/dist/list-BGjVo6zb.cjs +0 -40
- package/dist/list-BGjVo6zb.cjs.map +0 -1
- package/dist/list-D7wUxu1C.js.map +0 -1
- package/dist/litElement.mixin-CszkJuNl.js +0 -12
- package/dist/litElement.mixin-CszkJuNl.js.map +0 -1
- package/dist/litElement.mixin-qh5-IIUq.cjs +0 -1
- package/dist/litElement.mixin-qh5-IIUq.cjs.map +0 -1
- package/dist/mailbox--EN-JhjV.js.map +0 -1
- package/dist/mailbox-DLiBGJhY.cjs.map +0 -1
- package/dist/map-B0S_q3ma.js.map +0 -1
- package/dist/map-EDQN0I6e.cjs +0 -80
- package/dist/map-EDQN0I6e.cjs.map +0 -1
- package/dist/menu-3edZGQ1x.cjs.map +0 -1
- package/dist/menu-COeFpb6n.js.map +0 -1
- package/dist/metric.cjs +0 -69
- package/dist/metric.cjs.map +0 -1
- package/dist/metric.js +0 -93
- package/dist/metric.js.map +0 -1
- package/dist/mixins.cjs.map +0 -1
- package/dist/mixins.js.map +0 -1
- package/dist/notification-CC-TFN5v.js.map +0 -1
- package/dist/notification-P4c-kFdH.cjs +0 -23
- package/dist/notification-P4c-kFdH.cjs.map +0 -1
- package/dist/option-BwAF4nAw.js.map +0 -1
- package/dist/option-Cu0ertuF.cjs +0 -43
- package/dist/option-Cu0ertuF.cjs.map +0 -1
- package/dist/progress-Bk_Q1Shy.js.map +0 -1
- package/dist/progress-Yz6EMNSu.cjs.map +0 -1
- package/dist/provide-CYgj58u_.cjs +0 -1
- package/dist/provide-CYgj58u_.cjs.map +0 -1
- package/dist/provide-ydIskwf2.js +0 -107
- package/dist/provide-ydIskwf2.js.map +0 -1
- package/dist/radio-group-BcdcjLNC.js.map +0 -1
- package/dist/radio-group-BpBz5tRA.cjs +0 -40
- package/dist/radio-group-BpBz5tRA.cjs.map +0 -1
- package/dist/scroll-DXQv0ejL.js.map +0 -1
- package/dist/scroll-DbZMTv0K.cjs +0 -26
- package/dist/scroll-DbZMTv0K.cjs.map +0 -1
- package/dist/search-CwMav5QB.cjs +0 -1
- package/dist/select-BV4lK2zy.cjs.map +0 -1
- package/dist/select-DKyGWDsG.js.map +0 -1
- package/dist/sheet-BAI_jH1t.cjs +0 -35
- package/dist/sheet-BAI_jH1t.cjs.map +0 -1
- package/dist/sheet-C3TLKItO.js.map +0 -1
- package/dist/sheet.service-RcDBwHmv.cjs +0 -1
- package/dist/skills/schmancy/store.md +0 -126
- package/dist/skills/store.md +0 -126
- package/dist/sound.service-BEN6Xjy_.cjs +0 -1
- package/dist/sound.service-BEN6Xjy_.cjs.map +0 -1
- package/dist/sound.service-DWZe6swU.js.map +0 -1
- package/dist/splash-screen-DbI5RgBf.js.map +0 -1
- package/dist/splash-screen-DoHRTHi8.cjs +0 -41
- package/dist/splash-screen-DoHRTHi8.cjs.map +0 -1
- package/dist/src-00DfxCJq.js.map +0 -1
- package/dist/src-C_JjQovE.cjs +0 -269
- package/dist/src-C_JjQovE.cjs.map +0 -1
- package/dist/store-CjFHCSDb.cjs +0 -1
- package/dist/store-CjFHCSDb.cjs.map +0 -1
- package/dist/store-CjzZDQt8.js +0 -1654
- package/dist/store-CjzZDQt8.js.map +0 -1
- package/dist/store.cjs +0 -1
- package/dist/store.js +0 -2
- package/dist/surface-D-GWBcsh.cjs +0 -7
- package/dist/surface-D-GWBcsh.cjs.map +0 -1
- package/dist/surface-D23JtxYP.js +0 -22
- package/dist/surface-D23JtxYP.js.map +0 -1
- package/dist/surface.mixin-DqMwoddO.js +0 -320
- package/dist/surface.mixin-DqMwoddO.js.map +0 -1
- package/dist/surface.mixin-DxOi-xo0.cjs +0 -297
- package/dist/surface.mixin-DxOi-xo0.cjs.map +0 -1
- package/dist/table-C7b73kdg.cjs +0 -63
- package/dist/table-C7b73kdg.cjs.map +0 -1
- package/dist/table-CTrhV9-k.js +0 -631
- package/dist/table-CTrhV9-k.js.map +0 -1
- package/dist/tabs-Ce55RbwF.js.map +0 -1
- package/dist/tabs-DAzB8O7w.cjs +0 -31
- package/dist/tabs-DAzB8O7w.cjs.map +0 -1
- package/dist/tailwind.mixin-DRI1oTYQ.cjs +0 -2
- package/dist/tailwind.mixin-DRI1oTYQ.cjs.map +0 -1
- package/dist/tailwind.mixin-mdQR3BEO.js +0 -219
- package/dist/tailwind.mixin-mdQR3BEO.js.map +0 -1
- package/dist/textarea-DjN1D9u0.js.map +0 -1
- package/dist/textarea-PuHxBvJA.cjs +0 -39
- package/dist/textarea-PuHxBvJA.cjs.map +0 -1
- package/dist/theme-B-IJ2r7Q.cjs +0 -181
- package/dist/theme-button-BSbYmS4p.cjs +0 -8
- package/dist/theme-button-BSbYmS4p.cjs.map +0 -1
- package/dist/theme-button-CEMeAUOL.js.map +0 -1
- package/dist/theme.service-DxJPUGlu.cjs +0 -1
- package/dist/theme.service-DxJPUGlu.cjs.map +0 -1
- package/dist/theme.service-cOfPrtfe.js.map +0 -1
- package/dist/tslib.es6-Cnt75pb6.cjs +0 -1
- package/dist/tslib.es6-Cnt75pb6.cjs.map +0 -1
- package/dist/tslib.es6-DMzzJKHV.js +0 -7
- package/dist/tslib.es6-DMzzJKHV.js.map +0 -1
- package/dist/utils-Bp2jhyZc.js.map +0 -1
- package/dist/utils-CBPQvxNW.cjs +0 -1
- package/dist/utils-CBPQvxNW.cjs.map +0 -1
- package/dist/window-CrjZdf7Y.js.map +0 -1
- package/dist/window-DTUARSrU.cjs +0 -59
- package/dist/window-DTUARSrU.cjs.map +0 -1
- package/skills/schmancy/store.md +0 -126
- package/src/components/form-elements/index.ts +0 -1
- package/src/components/index.ts +0 -1
- package/src/layout/flex/flex.scss +0 -4
- package/src/layout/flex/flex.ts +0 -74
- package/src/layout/flex/index.ts +0 -1
- package/src/layout/grid/.readme +0 -79
- package/src/layout/grid/grid.scss +0 -5
- package/src/layout/grid/grid.ts +0 -121
- package/src/layout/grid/index.ts +0 -1
- package/src/layout/layout.ts +0 -122
- package/src/layout/v2/flex.ts +0 -243
- package/src/layout/v2/index.ts +0 -1
- package/src/metric/index.ts +0 -1
- package/src/metric/metric.ts +0 -127
- package/src/store/context-array.ts +0 -358
- package/src/store/context-collection.ts +0 -218
- package/src/store/context-create.ts +0 -284
- package/src/store/context-object.ts +0 -298
- package/src/store/filter-directive.ts +0 -614
- package/src/store/index.ts +0 -10
- package/src/store/selector-hook.ts +0 -259
- package/src/store/selectors.ts +0 -289
- package/src/store/storage-manager.ts +0 -269
- package/src/store/store.class.ts +0 -239
- package/src/store/types.ts +0 -327
- package/src/tabs/tabs-compatibility.ts +0 -20
- package/src/typewriter/typewriter.ts +0 -410
- package/types/src/agent/index.d.ts +0 -1
- package/types/src/area/route.test.d.ts +0 -20
- package/types/src/button/button.test.d.ts +0 -1
- package/types/src/chips/chip.d.ts +0 -3
- package/types/src/components/index.d.ts +0 -1
- package/types/src/content-drawer/$sheet.d.ts +0 -14
- package/types/src/dialog/dailog.d.ts +0 -116
- package/types/src/dialog/dialog-content.d.ts +0 -17
- package/types/src/directives/guard.d.ts +0 -1
- package/types/src/directives/visibility.d.ts +0 -11
- package/types/src/form/form-v2.d.ts +0 -22
- package/types/src/input/input-v2.d.ts +0 -250
- package/types/src/layout/flex/flex.d.ts +0 -26
- package/types/src/layout/flex/index.d.ts +0 -1
- package/types/src/layout/grid/grid.d.ts +0 -39
- package/types/src/layout/grid/index.d.ts +0 -1
- package/types/src/layout/layout.d.ts +0 -59
- package/types/src/layout/v2/flex.d.ts +0 -65
- package/types/src/layout/v2/grid.d.ts +0 -51
- package/types/src/layout/v2/index.d.ts +0 -1
- package/types/src/lightbox/flip.directive.d.ts +0 -22
- package/types/src/metric/index.d.ts +0 -1
- package/types/src/metric/metric.d.ts +0 -39
- package/types/src/notification/outlet.d.ts +0 -10
- package/types/src/sheet/header.d.ts +0 -10
- package/types/src/store/context-array.d.ts +0 -83
- package/types/src/store/context-collection.d.ts +0 -74
- package/types/src/store/context-create.d.ts +0 -43
- package/types/src/store/context-object.d.ts +0 -46
- package/types/src/store/filter-directive.d.ts +0 -116
- package/types/src/store/immer-integration.d.ts +0 -54
- package/types/src/store/index.d.ts +0 -10
- package/types/src/store/selector-hook.d.ts +0 -46
- package/types/src/store/selectors.d.ts +0 -90
- package/types/src/store/storage-manager.d.ts +0 -48
- package/types/src/store/store.class.d.ts +0 -73
- package/types/src/store/types.d.ts +0 -241
- package/types/src/tabs/tabs-compatibility.d.ts +0 -13
- package/types/src/theme/theme.elevation.d.ts +0 -131
- package/types/src/theme/theme.motion.d.ts +0 -198
- package/types/src/theme/theme.shape.d.ts +0 -144
- package/types/src/theme/theme.state.d.ts +0 -546
- package/types/src/theme/theme.typography.d.ts +0 -74
- package/types/src/tooltip/tooltip.d.ts +0 -33
- package/types/src/typewriter/typewriter.d.ts +0 -94
- /package/dist/agent/{flow-CvG1fLW5.js → flow-CaPi2G8y.js} +0 -0
- /package/dist/agent/{vendor-material-color-DcL7ZPxx.js → vendor-material-color-Be96dpGE.js} +0 -0
- /package/dist/{animation-hXFClrIn.js → animation-BK-8BwY8.js} +0 -0
- /package/dist/{animation-CQRdLgzX.cjs → animation-CO_Csq84.cjs} +0 -0
- /package/dist/{decorate-D_utPUsC.js → decorate-23nYs4Le.js} +0 -0
- /package/dist/{decorate-F9CuyeHg.cjs → decorate-DpFmy0nm.cjs} +0 -0
- /package/dist/{hashContent-B2IntJQf.js → hashContent-1ARKIsx9.js} +0 -0
- /package/dist/{hashContent-CahnEuut.cjs → hashContent-Bp5S6T4U.cjs} +0 -0
- /package/dist/{lazy-D6R5N5v4.js → lazy-B0ia54tT.js} +0 -0
- /package/dist/{lazy-BDNnH_r7.cjs → lazy-Dq9mRRjT.cjs} +0 -0
- /package/dist/{reduced-motion-BZTLqAyl.js → reduced-motion-D-L12p7G.js} +0 -0
- /package/dist/{reduced-motion-9RjNnhIg.cjs → reduced-motion-Ds-HjMzn.cjs} +0 -0
- /package/dist/{rxjs-utils-DJbZRjp3.cjs → rxjs-utils-Csnks202.cjs} +0 -0
- /package/dist/{rxjs-utils-CKTnEKUH.js → rxjs-utils-d-ivVN84.js} +0 -0
- /package/dist/{theme.events-NuihzD_p.js → theme.events-Cv7N4Toe.js} +0 -0
- /package/dist/{theme.events-DakXxZeP.cjs → theme.events-DM4H5F2d.cjs} +0 -0
- /package/dist/{theme.interface-DTwkuAKJ.cjs → theme.interface-D9l33b-M.cjs} +0 -0
- /package/dist/{theme.interface-Buged9Cg.js → theme.interface-DnVNre4O.js} +0 -0
- /package/src/{directives/typewriter.ts → typewriter/typewriter.directive.ts} +0 -0
- /package/types/src/{components/form-elements → payment-card-form}/index.d.ts +0 -0
- /package/types/src/{directives/typewriter.d.ts → typewriter/typewriter.directive.d.ts} +0 -0
package/dist/discovery.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`./chunk-CncqDLb2.cjs`);let e=require(`rxjs`),t=require(`rxjs/operators`);var n=`schmancy-discover`,r=`schmancy-discover-response`;function i(n,r=100){let i=`${n}-where-are-you`,a=`${n}-here-i-am`;return new e.Observable(n=>{let o=(0,e.fromEvent)(window,a).pipe((0,t.takeUntil)((0,e.timer)(r)),(0,t.map)(e=>e.detail.component),(0,t.defaultIfEmpty)(null)).subscribe(e=>{n.next(e),n.complete()});return window.dispatchEvent(new CustomEvent(i,{bubbles:!0,composed:!0})),()=>o.unsubscribe()})}function a(i,a=150){let o=`discover-${Date.now()}-${Math.random().toString(36).slice(2)}`;return new e.Observable(s=>{let c=(0,e.fromEvent)(window,r).pipe((0,t.takeUntil)((0,e.timer)(a)),(0,t.map)(e=>e.detail),(0,t.map)(e=>e.requestId===o?e.element:null),(0,t.take)(1),(0,t.defaultIfEmpty)(null)).subscribe(e=>{s.next(e),s.complete()});return window.dispatchEvent(new CustomEvent(n,{detail:{selector:i,requestId:o},bubbles:!0,composed:!0})),()=>c.unsubscribe()})}exports.DISCOVER_EVENT=n,exports.DISCOVER_RESPONSE_EVENT=r,exports.discover=function(e,t=150){return/^[
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`./chunk-CncqDLb2.cjs`);let e=require(`rxjs`),t=require(`rxjs/operators`);var n=`schmancy-discover`,r=`schmancy-discover-response`;function i(n,r=100){let i=`${n}-where-are-you`,a=`${n}-here-i-am`;return new e.Observable(n=>{let o=(0,e.fromEvent)(window,a).pipe((0,t.takeUntil)((0,e.timer)(r)),(0,t.map)(e=>e.detail.component),(0,t.defaultIfEmpty)(null)).subscribe(e=>{n.next(e),n.complete()});return window.dispatchEvent(new CustomEvent(i,{bubbles:!0,composed:!0})),()=>o.unsubscribe()})}function a(i,a=150){let o=`discover-${Date.now()}-${Math.random().toString(36).slice(2)}`;return new e.Observable(s=>{let c=(0,e.fromEvent)(window,r).pipe((0,t.takeUntil)((0,e.timer)(a)),(0,t.map)(e=>e.detail),(0,t.map)(e=>e.requestId===o?e.element:null),(0,t.take)(1),(0,t.defaultIfEmpty)(null)).subscribe(e=>{s.next(e),s.complete()});return window.dispatchEvent(new CustomEvent(n,{detail:{selector:i,requestId:o},bubbles:!0,composed:!0})),()=>c.unsubscribe()})}exports.DISCOVER_EVENT=n,exports.DISCOVER_RESPONSE_EVENT=r,exports.discover=function(e,t=150){return/^[#.[]/.test(e)?a(e,t):i(e,t)},exports.discoverAllElements=function(i,a=150){let o=`discover-all-${Date.now()}-${Math.random().toString(36).slice(2)}`,s=[];return new e.Observable(c=>{let l=(0,e.fromEvent)(window,r).pipe((0,t.takeUntil)((0,e.timer)(a))).subscribe({next:e=>{e.detail.requestId===o&&s.push(e.detail.element)},complete:()=>{c.next(s),c.complete()}});return window.dispatchEvent(new CustomEvent(n,{detail:{selector:i,requestId:o},bubbles:!0,composed:!0})),()=>l.unsubscribe()})},exports.discoverAnyComponent=function(...t){return t.length===0?new e.Observable(e=>{e.next(null),e.complete()}):(0,e.race)(...t.map(e=>i(e)))},exports.discoverComponent=i,exports.discoverElement=a;
|
package/dist/discovery.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discovery.cjs","names":[],"sources":["../src/discovery/discovery.service.ts"],"sourcesContent":["import { fromEvent, timer, race, Observable } from 'rxjs'\r\nimport { takeUntil, map, defaultIfEmpty, take } from 'rxjs/operators'\r\n\r\n/**\r\n * Global discovery event names\r\n */\r\nconst DISCOVER_EVENT = 'schmancy-discover'\r\nconst DISCOVER_RESPONSE_EVENT = 'schmancy-discover-response'\r\n\r\n/**\r\n * Discovery request detail\r\n */\r\ninterface DiscoverRequest {\r\n\tselector: string\r\n\trequestId: string\r\n}\r\n\r\n/**\r\n * Discovery response detail\r\n */\r\ninterface DiscoverResponse {\r\n\trequestId: string\r\n\telement: HTMLElement\r\n}\r\n\r\n/**\r\n * Discover a component in the DOM using the WhereAreYou/HereIAm pattern.\r\n *\r\n * @param componentTag - The tag name of the component to discover (e.g., 'schmancy-navigation-rail')\r\n * @param timeout - How long to wait for a response in milliseconds (default: 100)\r\n * @returns Observable that emits the discovered component or null if not found\r\n */\r\nexport function discoverComponent<T extends HTMLElement>(\r\n\tcomponentTag: string,\r\n\ttimeout = 100,\r\n): Observable<T | null> {\r\n\tconst whereAreYouEvent = `${componentTag}-where-are-you`\r\n\tconst hereIAmEvent = `${componentTag}-here-i-am`\r\n\r\n\treturn new Observable(subscriber => {\r\n\t\tconst subscription = fromEvent<CustomEvent>(window, hereIAmEvent)\r\n\t\t\t.pipe(\r\n\t\t\t\ttakeUntil(timer(timeout)),\r\n\t\t\t\tmap(e => e.detail.component as T),\r\n\t\t\t\tdefaultIfEmpty(null),\r\n\t\t\t)\r\n\t\t\t.subscribe(component => {\r\n\t\t\t\tsubscriber.next(component)\r\n\t\t\t\tsubscriber.complete()\r\n\t\t\t})\r\n\r\n\t\twindow.dispatchEvent(\r\n\t\t\tnew CustomEvent(whereAreYouEvent, {\r\n\t\t\t\tbubbles: true,\r\n\t\t\t\tcomposed: true,\r\n\t\t\t}),\r\n\t\t)\r\n\r\n\t\treturn () => subscription.unsubscribe()\r\n\t})\r\n}\r\n\r\n/**\r\n * Discover any of multiple components using race.\r\n * Returns the first component that responds.\r\n *\r\n * @param componentTags - Array of component tag names to discover\r\n * @returns Observable that emits the first discovered component or null if none found\r\n */\r\nexport function discoverAnyComponent<T extends HTMLElement>(...componentTags: string[]): Observable<T | null> {\r\n\tif (componentTags.length === 0) {\r\n\t\treturn new Observable(subscriber => {\r\n\t\t\tsubscriber.next(null)\r\n\t\t\tsubscriber.complete()\r\n\t\t})\r\n\t}\r\n\r\n\treturn race(...componentTags.map(tag => discoverComponent<T>(tag)))\r\n}\r\n\r\n/**\r\n * Universal element discovery - finds ANY element by CSS selector across shadow DOM boundaries.\r\n * Uses event-based discovery pattern - no DOM traversal needed.\r\n *\r\n * How it works:\r\n * 1. Broadcasts a discovery request event on window\r\n * 2. All $LitElement components receive this event and check their shadow DOM\r\n * 3. If a match is found, they respond with the element\r\n *\r\n * @param selector - CSS selector (e.g., '#my-id', '.my-class', '[data-attr]')\r\n * @param timeout - How long to wait for a response in milliseconds (default: 150)\r\n * @returns Observable that emits the discovered element or null if not found\r\n *\r\n * @example\r\n * ```typescript\r\n * // Find element by ID across shadow boundaries\r\n * discoverElement('#app-card').subscribe(el => {\r\n * if (el) console.log('Found:', el)\r\n * })\r\n *\r\n * // Find element by class\r\n * discoverElement('.special-button').subscribe(el => {...})\r\n * ```\r\n */\r\nexport function discoverElement<T extends HTMLElement>(\r\n\tselector: string,\r\n\ttimeout = 150,\r\n): Observable<T | null> {\r\n\tconst requestId = `discover-${Date.now()}-${Math.random().toString(36).slice(2)}`\r\n\r\n\treturn new Observable(subscriber => {\r\n\t\tconst subscription = fromEvent<CustomEvent<DiscoverResponse>>(window, DISCOVER_RESPONSE_EVENT)\r\n\t\t\t.pipe(\r\n\t\t\t\ttakeUntil(timer(timeout)),\r\n\t\t\t\tmap(e => e.detail),\r\n\t\t\t\tmap(detail => (detail.requestId === requestId ? (detail.element as T) : null)),\r\n\t\t\t\ttake(1),\r\n\t\t\t\tdefaultIfEmpty(null),\r\n\t\t\t)\r\n\t\t\t.subscribe(element => {\r\n\t\t\t\tsubscriber.next(element)\r\n\t\t\t\tsubscriber.complete()\r\n\t\t\t})\r\n\r\n\t\twindow.dispatchEvent(\r\n\t\t\tnew CustomEvent<DiscoverRequest>(DISCOVER_EVENT, {\r\n\t\t\t\tdetail: { selector, requestId },\r\n\t\t\t\tbubbles: true,\r\n\t\t\t\tcomposed: true,\r\n\t\t\t}),\r\n\t\t)\r\n\r\n\t\treturn () => subscription.unsubscribe()\r\n\t})\r\n}\r\n\r\n/**\r\n * Discover multiple elements matching a selector.\r\n * Collects all responses within the timeout period.\r\n *\r\n * @param selector - CSS selector\r\n * @param timeout - How long to collect responses (default: 150ms)\r\n * @returns Observable that emits array of discovered elements\r\n */\r\nexport function discoverAllElements<T extends HTMLElement>(\r\n\tselector: string,\r\n\ttimeout = 150,\r\n): Observable<T[]> {\r\n\tconst requestId = `discover-all-${Date.now()}-${Math.random().toString(36).slice(2)}`\r\n\tconst elements: T[] = []\r\n\r\n\treturn new Observable(subscriber => {\r\n\t\tconst subscription = fromEvent<CustomEvent<DiscoverResponse>>(window, DISCOVER_RESPONSE_EVENT)\r\n\t\t\t.pipe(takeUntil(timer(timeout)))\r\n\t\t\t.subscribe({\r\n\t\t\t\tnext: e => {\r\n\t\t\t\t\tif (e.detail.requestId === requestId) {\r\n\t\t\t\t\t\telements.push(e.detail.element as T)\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\tcomplete: () => {\r\n\t\t\t\t\tsubscriber.next(elements)\r\n\t\t\t\t\tsubscriber.complete()\r\n\t\t\t\t},\r\n\t\t\t})\r\n\r\n\t\twindow.dispatchEvent(\r\n\t\t\tnew CustomEvent<DiscoverRequest>(DISCOVER_EVENT, {\r\n\t\t\t\tdetail: { selector, requestId },\r\n\t\t\t\tbubbles: true,\r\n\t\t\t\tcomposed: true,\r\n\t\t\t}),\r\n\t\t)\r\n\r\n\t\treturn () => subscription.unsubscribe()\r\n\t})\r\n}\r\n\r\n/**\r\n * Smart discovery - automatically detects if input is a CSS selector or component tag.\r\n *\r\n * @param query - CSS selector (starts with #, ., [) OR component tag name\r\n * @param timeout - How long to wait (default: 150ms)\r\n * @returns Observable that emits the discovered element or null\r\n *\r\n * @example\r\n * ```typescript\r\n * // CSS selector - uses discoverElement\r\n * discover('#my-element').subscribe(...)\r\n *\r\n * // Component tag - uses discoverComponent\r\n * discover('schmancy-fancy').subscribe(...)\r\n * ```\r\n */\r\nexport function discover<T extends HTMLElement>(\r\n\tquery: string,\r\n\ttimeout = 150,\r\n): Observable<T | null> {\r\n\tconst isCssSelector = /^[
|
|
1
|
+
{"version":3,"file":"discovery.cjs","names":[],"sources":["../src/discovery/discovery.service.ts"],"sourcesContent":["import { fromEvent, timer, race, Observable } from 'rxjs'\r\nimport { takeUntil, map, defaultIfEmpty, take } from 'rxjs/operators'\r\n\r\n/**\r\n * Global discovery event names\r\n */\r\nconst DISCOVER_EVENT = 'schmancy-discover'\r\nconst DISCOVER_RESPONSE_EVENT = 'schmancy-discover-response'\r\n\r\n/**\r\n * Discovery request detail\r\n */\r\ninterface DiscoverRequest {\r\n\tselector: string\r\n\trequestId: string\r\n}\r\n\r\n/**\r\n * Discovery response detail\r\n */\r\ninterface DiscoverResponse {\r\n\trequestId: string\r\n\telement: HTMLElement\r\n}\r\n\r\n/**\r\n * Discover a component in the DOM using the WhereAreYou/HereIAm pattern.\r\n *\r\n * @param componentTag - The tag name of the component to discover (e.g., 'schmancy-navigation-rail')\r\n * @param timeout - How long to wait for a response in milliseconds (default: 100)\r\n * @returns Observable that emits the discovered component or null if not found\r\n */\r\nexport function discoverComponent<T extends HTMLElement>(\r\n\tcomponentTag: string,\r\n\ttimeout = 100,\r\n): Observable<T | null> {\r\n\tconst whereAreYouEvent = `${componentTag}-where-are-you`\r\n\tconst hereIAmEvent = `${componentTag}-here-i-am`\r\n\r\n\treturn new Observable(subscriber => {\r\n\t\tconst subscription = fromEvent<CustomEvent>(window, hereIAmEvent)\r\n\t\t\t.pipe(\r\n\t\t\t\ttakeUntil(timer(timeout)),\r\n\t\t\t\tmap(e => e.detail.component as T),\r\n\t\t\t\tdefaultIfEmpty(null),\r\n\t\t\t)\r\n\t\t\t.subscribe(component => {\r\n\t\t\t\tsubscriber.next(component)\r\n\t\t\t\tsubscriber.complete()\r\n\t\t\t})\r\n\r\n\t\twindow.dispatchEvent(\r\n\t\t\tnew CustomEvent(whereAreYouEvent, {\r\n\t\t\t\tbubbles: true,\r\n\t\t\t\tcomposed: true,\r\n\t\t\t}),\r\n\t\t)\r\n\r\n\t\treturn () => subscription.unsubscribe()\r\n\t})\r\n}\r\n\r\n/**\r\n * Discover any of multiple components using race.\r\n * Returns the first component that responds.\r\n *\r\n * @param componentTags - Array of component tag names to discover\r\n * @returns Observable that emits the first discovered component or null if none found\r\n */\r\nexport function discoverAnyComponent<T extends HTMLElement>(...componentTags: string[]): Observable<T | null> {\r\n\tif (componentTags.length === 0) {\r\n\t\treturn new Observable(subscriber => {\r\n\t\t\tsubscriber.next(null)\r\n\t\t\tsubscriber.complete()\r\n\t\t})\r\n\t}\r\n\r\n\treturn race(...componentTags.map(tag => discoverComponent<T>(tag)))\r\n}\r\n\r\n/**\r\n * Universal element discovery - finds ANY element by CSS selector across shadow DOM boundaries.\r\n * Uses event-based discovery pattern - no DOM traversal needed.\r\n *\r\n * How it works:\r\n * 1. Broadcasts a discovery request event on window\r\n * 2. All $LitElement components receive this event and check their shadow DOM\r\n * 3. If a match is found, they respond with the element\r\n *\r\n * @param selector - CSS selector (e.g., '#my-id', '.my-class', '[data-attr]')\r\n * @param timeout - How long to wait for a response in milliseconds (default: 150)\r\n * @returns Observable that emits the discovered element or null if not found\r\n *\r\n * @example\r\n * ```typescript\r\n * // Find element by ID across shadow boundaries\r\n * discoverElement('#app-card').subscribe(el => {\r\n * if (el) console.log('Found:', el)\r\n * })\r\n *\r\n * // Find element by class\r\n * discoverElement('.special-button').subscribe(el => {...})\r\n * ```\r\n */\r\nexport function discoverElement<T extends HTMLElement>(\r\n\tselector: string,\r\n\ttimeout = 150,\r\n): Observable<T | null> {\r\n\tconst requestId = `discover-${Date.now()}-${Math.random().toString(36).slice(2)}`\r\n\r\n\treturn new Observable(subscriber => {\r\n\t\tconst subscription = fromEvent<CustomEvent<DiscoverResponse>>(window, DISCOVER_RESPONSE_EVENT)\r\n\t\t\t.pipe(\r\n\t\t\t\ttakeUntil(timer(timeout)),\r\n\t\t\t\tmap(e => e.detail),\r\n\t\t\t\tmap(detail => (detail.requestId === requestId ? (detail.element as T) : null)),\r\n\t\t\t\ttake(1),\r\n\t\t\t\tdefaultIfEmpty(null),\r\n\t\t\t)\r\n\t\t\t.subscribe(element => {\r\n\t\t\t\tsubscriber.next(element)\r\n\t\t\t\tsubscriber.complete()\r\n\t\t\t})\r\n\r\n\t\twindow.dispatchEvent(\r\n\t\t\tnew CustomEvent<DiscoverRequest>(DISCOVER_EVENT, {\r\n\t\t\t\tdetail: { selector, requestId },\r\n\t\t\t\tbubbles: true,\r\n\t\t\t\tcomposed: true,\r\n\t\t\t}),\r\n\t\t)\r\n\r\n\t\treturn () => subscription.unsubscribe()\r\n\t})\r\n}\r\n\r\n/**\r\n * Discover multiple elements matching a selector.\r\n * Collects all responses within the timeout period.\r\n *\r\n * @param selector - CSS selector\r\n * @param timeout - How long to collect responses (default: 150ms)\r\n * @returns Observable that emits array of discovered elements\r\n */\r\nexport function discoverAllElements<T extends HTMLElement>(\r\n\tselector: string,\r\n\ttimeout = 150,\r\n): Observable<T[]> {\r\n\tconst requestId = `discover-all-${Date.now()}-${Math.random().toString(36).slice(2)}`\r\n\tconst elements: T[] = []\r\n\r\n\treturn new Observable(subscriber => {\r\n\t\tconst subscription = fromEvent<CustomEvent<DiscoverResponse>>(window, DISCOVER_RESPONSE_EVENT)\r\n\t\t\t.pipe(takeUntil(timer(timeout)))\r\n\t\t\t.subscribe({\r\n\t\t\t\tnext: e => {\r\n\t\t\t\t\tif (e.detail.requestId === requestId) {\r\n\t\t\t\t\t\telements.push(e.detail.element as T)\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\tcomplete: () => {\r\n\t\t\t\t\tsubscriber.next(elements)\r\n\t\t\t\t\tsubscriber.complete()\r\n\t\t\t\t},\r\n\t\t\t})\r\n\r\n\t\twindow.dispatchEvent(\r\n\t\t\tnew CustomEvent<DiscoverRequest>(DISCOVER_EVENT, {\r\n\t\t\t\tdetail: { selector, requestId },\r\n\t\t\t\tbubbles: true,\r\n\t\t\t\tcomposed: true,\r\n\t\t\t}),\r\n\t\t)\r\n\r\n\t\treturn () => subscription.unsubscribe()\r\n\t})\r\n}\r\n\r\n/**\r\n * Smart discovery - automatically detects if input is a CSS selector or component tag.\r\n *\r\n * @param query - CSS selector (starts with #, ., [) OR component tag name\r\n * @param timeout - How long to wait (default: 150ms)\r\n * @returns Observable that emits the discovered element or null\r\n *\r\n * @example\r\n * ```typescript\r\n * // CSS selector - uses discoverElement\r\n * discover('#my-element').subscribe(...)\r\n *\r\n * // Component tag - uses discoverComponent\r\n * discover('schmancy-fancy').subscribe(...)\r\n * ```\r\n */\r\nexport function discover<T extends HTMLElement>(\r\n\tquery: string,\r\n\ttimeout = 150,\r\n): Observable<T | null> {\r\n\tconst isCssSelector = /^[#.[]/.test(query)\r\n\r\n\tif (isCssSelector) {\r\n\t\treturn discoverElement<T>(query, timeout)\r\n\t}\r\n\r\n\treturn discoverComponent<T>(query, timeout)\r\n}\r\n\r\n// Export event names for use in baseElement\r\nexport { DISCOVER_EVENT, DISCOVER_RESPONSE_EVENT }\r\nexport type { DiscoverRequest, DiscoverResponse }\r\n"],"mappings":"qJAMA,IAAM,EAAiB,oBACjB,EAA0B,6BAyBhC,SAAgB,EACf,EACA,EAAU,IAAA,CAEV,IAAM,EAAmB,GAAG,EAAA,gBACtB,EAAe,GAAG,EAAA,YAExB,OAAO,IAAI,EAAA,WAAW,GAAA,CACrB,IAAM,GAAA,EAAA,EAAA,WAAsC,OAAQ,EAAA,CAClD,MAAA,EAAA,EAAA,YAAA,EAAA,EAAA,OACgB,EAAA,CAAA,EAAS,EAAA,EAAA,KACrB,GAAK,EAAE,OAAO,UAAA,EAAe,EAAA,EAAA,gBAClB,KAAA,CAAA,CAEf,UAAU,GAAA,CACV,EAAW,KAAK,EAAA,CAChB,EAAW,UAAA,EAAA,CAUb,OAPA,OAAO,cACN,IAAI,YAAY,EAAkB,CACjC,QAAA,CAAS,EACT,SAAA,CAAU,EAAA,CAAA,CAAA,KAIC,EAAa,aAAA,EAAA,CA8C5B,SAAgB,EACf,EACA,EAAU,IAAA,CAEV,IAAM,EAAY,YAAY,KAAK,KAAA,CAAA,GAAS,KAAK,QAAA,CAAS,SAAS,GAAA,CAAI,MAAM,EAAA,GAE7E,OAAO,IAAI,EAAA,WAAW,GAAA,CACrB,IAAM,GAAA,EAAA,EAAA,WAAwD,OAAQ,EAAA,CACpE,MAAA,EAAA,EAAA,YAAA,EAAA,EAAA,OACgB,EAAA,CAAA,EAAS,EAAA,EAAA,KACrB,GAAK,EAAE,OAAA,EAAO,EAAA,EAAA,KACd,GAAW,EAAO,YAAc,EAAa,EAAO,QAAgB,KAAA,EAAM,EAAA,EAAA,MACzE,EAAA,EAAE,EAAA,EAAA,gBACQ,KAAA,CAAA,CAEf,UAAU,GAAA,CACV,EAAW,KAAK,EAAA,CAChB,EAAW,UAAA,EAAA,CAWb,OARA,OAAO,cACN,IAAI,YAA6B,EAAgB,CAChD,OAAQ,CAAE,SAAA,EAAU,UAAA,EAAA,CACpB,QAAA,CAAS,EACT,SAAA,CAAU,EAAA,CAAA,CAAA,KAIC,EAAa,aAAA,EAAA,CAAA,QAAA,eAAA,EAAA,QAAA,wBAAA,EAAA,QAAA,SA8D5B,SACC,EACA,EAAU,IAAA,CAIV,MAFsB,SAAS,KAAK,EAAA,CAG5B,EAAmB,EAAO,EAAA,CAG3B,EAAqB,EAAO,EAAA,EAAA,QAAA,oBA5DpC,SACC,EACA,EAAU,IAAA,CAEV,IAAM,EAAY,gBAAgB,KAAK,KAAA,CAAA,GAAS,KAAK,QAAA,CAAS,SAAS,GAAA,CAAI,MAAM,EAAA,GAC3E,EAAgB,EAAA,CAEtB,OAAO,IAAI,EAAA,WAAW,GAAA,CACrB,IAAM,GAAA,EAAA,EAAA,WAAwD,OAAQ,EAAA,CACpE,MAAA,EAAA,EAAA,YAAA,EAAA,EAAA,OAAqB,EAAA,CAAA,CAAA,CACrB,UAAU,CACV,KAAM,GAAA,CACD,EAAE,OAAO,YAAc,GAC1B,EAAS,KAAK,EAAE,OAAO,QAAA,EAGzB,aAAA,CACC,EAAW,KAAK,EAAA,CAChB,EAAW,UAAA,EAAA,CAAA,CAYd,OARA,OAAO,cACN,IAAI,YAA6B,EAAgB,CAChD,OAAQ,CAAE,SAAA,EAAU,UAAA,EAAA,CACpB,QAAA,CAAS,EACT,SAAA,CAAU,EAAA,CAAA,CAAA,KAIC,EAAa,aAAA,EAAA,EAAA,QAAA,qBAzG5B,SAAA,GAA+D,EAAA,CAC9D,OAAI,EAAc,SAAW,EACrB,IAAI,EAAA,WAAW,GAAA,CACrB,EAAW,KAAK,KAAA,CAChB,EAAW,UAAA,EAAA,EAIb,EAAA,EAAA,MAAA,GAAe,EAAc,IAAI,GAAO,EAAqB,EAAA,CAAA,CAAA,EAAA,QAAA,kBAAA,EAAA,QAAA,gBAAA"}
|
package/dist/discovery.js
CHANGED
|
@@ -56,6 +56,6 @@ function p(n, i = 150) {
|
|
|
56
56
|
});
|
|
57
57
|
}
|
|
58
58
|
function m(e, t = 150) {
|
|
59
|
-
return /^[
|
|
59
|
+
return /^[#.[]/.test(e) ? f(e, t) : u(e, t);
|
|
60
60
|
}
|
|
61
61
|
export { c as DISCOVER_EVENT, l as DISCOVER_RESPONSE_EVENT, m as discover, p as discoverAllElements, d as discoverAnyComponent, u as discoverComponent, f as discoverElement };
|
package/dist/discovery.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discovery.js","names":[],"sources":["../src/discovery/discovery.service.ts"],"sourcesContent":["import { fromEvent, timer, race, Observable } from 'rxjs'\r\nimport { takeUntil, map, defaultIfEmpty, take } from 'rxjs/operators'\r\n\r\n/**\r\n * Global discovery event names\r\n */\r\nconst DISCOVER_EVENT = 'schmancy-discover'\r\nconst DISCOVER_RESPONSE_EVENT = 'schmancy-discover-response'\r\n\r\n/**\r\n * Discovery request detail\r\n */\r\ninterface DiscoverRequest {\r\n\tselector: string\r\n\trequestId: string\r\n}\r\n\r\n/**\r\n * Discovery response detail\r\n */\r\ninterface DiscoverResponse {\r\n\trequestId: string\r\n\telement: HTMLElement\r\n}\r\n\r\n/**\r\n * Discover a component in the DOM using the WhereAreYou/HereIAm pattern.\r\n *\r\n * @param componentTag - The tag name of the component to discover (e.g., 'schmancy-navigation-rail')\r\n * @param timeout - How long to wait for a response in milliseconds (default: 100)\r\n * @returns Observable that emits the discovered component or null if not found\r\n */\r\nexport function discoverComponent<T extends HTMLElement>(\r\n\tcomponentTag: string,\r\n\ttimeout = 100,\r\n): Observable<T | null> {\r\n\tconst whereAreYouEvent = `${componentTag}-where-are-you`\r\n\tconst hereIAmEvent = `${componentTag}-here-i-am`\r\n\r\n\treturn new Observable(subscriber => {\r\n\t\tconst subscription = fromEvent<CustomEvent>(window, hereIAmEvent)\r\n\t\t\t.pipe(\r\n\t\t\t\ttakeUntil(timer(timeout)),\r\n\t\t\t\tmap(e => e.detail.component as T),\r\n\t\t\t\tdefaultIfEmpty(null),\r\n\t\t\t)\r\n\t\t\t.subscribe(component => {\r\n\t\t\t\tsubscriber.next(component)\r\n\t\t\t\tsubscriber.complete()\r\n\t\t\t})\r\n\r\n\t\twindow.dispatchEvent(\r\n\t\t\tnew CustomEvent(whereAreYouEvent, {\r\n\t\t\t\tbubbles: true,\r\n\t\t\t\tcomposed: true,\r\n\t\t\t}),\r\n\t\t)\r\n\r\n\t\treturn () => subscription.unsubscribe()\r\n\t})\r\n}\r\n\r\n/**\r\n * Discover any of multiple components using race.\r\n * Returns the first component that responds.\r\n *\r\n * @param componentTags - Array of component tag names to discover\r\n * @returns Observable that emits the first discovered component or null if none found\r\n */\r\nexport function discoverAnyComponent<T extends HTMLElement>(...componentTags: string[]): Observable<T | null> {\r\n\tif (componentTags.length === 0) {\r\n\t\treturn new Observable(subscriber => {\r\n\t\t\tsubscriber.next(null)\r\n\t\t\tsubscriber.complete()\r\n\t\t})\r\n\t}\r\n\r\n\treturn race(...componentTags.map(tag => discoverComponent<T>(tag)))\r\n}\r\n\r\n/**\r\n * Universal element discovery - finds ANY element by CSS selector across shadow DOM boundaries.\r\n * Uses event-based discovery pattern - no DOM traversal needed.\r\n *\r\n * How it works:\r\n * 1. Broadcasts a discovery request event on window\r\n * 2. All $LitElement components receive this event and check their shadow DOM\r\n * 3. If a match is found, they respond with the element\r\n *\r\n * @param selector - CSS selector (e.g., '#my-id', '.my-class', '[data-attr]')\r\n * @param timeout - How long to wait for a response in milliseconds (default: 150)\r\n * @returns Observable that emits the discovered element or null if not found\r\n *\r\n * @example\r\n * ```typescript\r\n * // Find element by ID across shadow boundaries\r\n * discoverElement('#app-card').subscribe(el => {\r\n * if (el) console.log('Found:', el)\r\n * })\r\n *\r\n * // Find element by class\r\n * discoverElement('.special-button').subscribe(el => {...})\r\n * ```\r\n */\r\nexport function discoverElement<T extends HTMLElement>(\r\n\tselector: string,\r\n\ttimeout = 150,\r\n): Observable<T | null> {\r\n\tconst requestId = `discover-${Date.now()}-${Math.random().toString(36).slice(2)}`\r\n\r\n\treturn new Observable(subscriber => {\r\n\t\tconst subscription = fromEvent<CustomEvent<DiscoverResponse>>(window, DISCOVER_RESPONSE_EVENT)\r\n\t\t\t.pipe(\r\n\t\t\t\ttakeUntil(timer(timeout)),\r\n\t\t\t\tmap(e => e.detail),\r\n\t\t\t\tmap(detail => (detail.requestId === requestId ? (detail.element as T) : null)),\r\n\t\t\t\ttake(1),\r\n\t\t\t\tdefaultIfEmpty(null),\r\n\t\t\t)\r\n\t\t\t.subscribe(element => {\r\n\t\t\t\tsubscriber.next(element)\r\n\t\t\t\tsubscriber.complete()\r\n\t\t\t})\r\n\r\n\t\twindow.dispatchEvent(\r\n\t\t\tnew CustomEvent<DiscoverRequest>(DISCOVER_EVENT, {\r\n\t\t\t\tdetail: { selector, requestId },\r\n\t\t\t\tbubbles: true,\r\n\t\t\t\tcomposed: true,\r\n\t\t\t}),\r\n\t\t)\r\n\r\n\t\treturn () => subscription.unsubscribe()\r\n\t})\r\n}\r\n\r\n/**\r\n * Discover multiple elements matching a selector.\r\n * Collects all responses within the timeout period.\r\n *\r\n * @param selector - CSS selector\r\n * @param timeout - How long to collect responses (default: 150ms)\r\n * @returns Observable that emits array of discovered elements\r\n */\r\nexport function discoverAllElements<T extends HTMLElement>(\r\n\tselector: string,\r\n\ttimeout = 150,\r\n): Observable<T[]> {\r\n\tconst requestId = `discover-all-${Date.now()}-${Math.random().toString(36).slice(2)}`\r\n\tconst elements: T[] = []\r\n\r\n\treturn new Observable(subscriber => {\r\n\t\tconst subscription = fromEvent<CustomEvent<DiscoverResponse>>(window, DISCOVER_RESPONSE_EVENT)\r\n\t\t\t.pipe(takeUntil(timer(timeout)))\r\n\t\t\t.subscribe({\r\n\t\t\t\tnext: e => {\r\n\t\t\t\t\tif (e.detail.requestId === requestId) {\r\n\t\t\t\t\t\telements.push(e.detail.element as T)\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\tcomplete: () => {\r\n\t\t\t\t\tsubscriber.next(elements)\r\n\t\t\t\t\tsubscriber.complete()\r\n\t\t\t\t},\r\n\t\t\t})\r\n\r\n\t\twindow.dispatchEvent(\r\n\t\t\tnew CustomEvent<DiscoverRequest>(DISCOVER_EVENT, {\r\n\t\t\t\tdetail: { selector, requestId },\r\n\t\t\t\tbubbles: true,\r\n\t\t\t\tcomposed: true,\r\n\t\t\t}),\r\n\t\t)\r\n\r\n\t\treturn () => subscription.unsubscribe()\r\n\t})\r\n}\r\n\r\n/**\r\n * Smart discovery - automatically detects if input is a CSS selector or component tag.\r\n *\r\n * @param query - CSS selector (starts with #, ., [) OR component tag name\r\n * @param timeout - How long to wait (default: 150ms)\r\n * @returns Observable that emits the discovered element or null\r\n *\r\n * @example\r\n * ```typescript\r\n * // CSS selector - uses discoverElement\r\n * discover('#my-element').subscribe(...)\r\n *\r\n * // Component tag - uses discoverComponent\r\n * discover('schmancy-fancy').subscribe(...)\r\n * ```\r\n */\r\nexport function discover<T extends HTMLElement>(\r\n\tquery: string,\r\n\ttimeout = 150,\r\n): Observable<T | null> {\r\n\tconst isCssSelector = /^[
|
|
1
|
+
{"version":3,"file":"discovery.js","names":[],"sources":["../src/discovery/discovery.service.ts"],"sourcesContent":["import { fromEvent, timer, race, Observable } from 'rxjs'\r\nimport { takeUntil, map, defaultIfEmpty, take } from 'rxjs/operators'\r\n\r\n/**\r\n * Global discovery event names\r\n */\r\nconst DISCOVER_EVENT = 'schmancy-discover'\r\nconst DISCOVER_RESPONSE_EVENT = 'schmancy-discover-response'\r\n\r\n/**\r\n * Discovery request detail\r\n */\r\ninterface DiscoverRequest {\r\n\tselector: string\r\n\trequestId: string\r\n}\r\n\r\n/**\r\n * Discovery response detail\r\n */\r\ninterface DiscoverResponse {\r\n\trequestId: string\r\n\telement: HTMLElement\r\n}\r\n\r\n/**\r\n * Discover a component in the DOM using the WhereAreYou/HereIAm pattern.\r\n *\r\n * @param componentTag - The tag name of the component to discover (e.g., 'schmancy-navigation-rail')\r\n * @param timeout - How long to wait for a response in milliseconds (default: 100)\r\n * @returns Observable that emits the discovered component or null if not found\r\n */\r\nexport function discoverComponent<T extends HTMLElement>(\r\n\tcomponentTag: string,\r\n\ttimeout = 100,\r\n): Observable<T | null> {\r\n\tconst whereAreYouEvent = `${componentTag}-where-are-you`\r\n\tconst hereIAmEvent = `${componentTag}-here-i-am`\r\n\r\n\treturn new Observable(subscriber => {\r\n\t\tconst subscription = fromEvent<CustomEvent>(window, hereIAmEvent)\r\n\t\t\t.pipe(\r\n\t\t\t\ttakeUntil(timer(timeout)),\r\n\t\t\t\tmap(e => e.detail.component as T),\r\n\t\t\t\tdefaultIfEmpty(null),\r\n\t\t\t)\r\n\t\t\t.subscribe(component => {\r\n\t\t\t\tsubscriber.next(component)\r\n\t\t\t\tsubscriber.complete()\r\n\t\t\t})\r\n\r\n\t\twindow.dispatchEvent(\r\n\t\t\tnew CustomEvent(whereAreYouEvent, {\r\n\t\t\t\tbubbles: true,\r\n\t\t\t\tcomposed: true,\r\n\t\t\t}),\r\n\t\t)\r\n\r\n\t\treturn () => subscription.unsubscribe()\r\n\t})\r\n}\r\n\r\n/**\r\n * Discover any of multiple components using race.\r\n * Returns the first component that responds.\r\n *\r\n * @param componentTags - Array of component tag names to discover\r\n * @returns Observable that emits the first discovered component or null if none found\r\n */\r\nexport function discoverAnyComponent<T extends HTMLElement>(...componentTags: string[]): Observable<T | null> {\r\n\tif (componentTags.length === 0) {\r\n\t\treturn new Observable(subscriber => {\r\n\t\t\tsubscriber.next(null)\r\n\t\t\tsubscriber.complete()\r\n\t\t})\r\n\t}\r\n\r\n\treturn race(...componentTags.map(tag => discoverComponent<T>(tag)))\r\n}\r\n\r\n/**\r\n * Universal element discovery - finds ANY element by CSS selector across shadow DOM boundaries.\r\n * Uses event-based discovery pattern - no DOM traversal needed.\r\n *\r\n * How it works:\r\n * 1. Broadcasts a discovery request event on window\r\n * 2. All $LitElement components receive this event and check their shadow DOM\r\n * 3. If a match is found, they respond with the element\r\n *\r\n * @param selector - CSS selector (e.g., '#my-id', '.my-class', '[data-attr]')\r\n * @param timeout - How long to wait for a response in milliseconds (default: 150)\r\n * @returns Observable that emits the discovered element or null if not found\r\n *\r\n * @example\r\n * ```typescript\r\n * // Find element by ID across shadow boundaries\r\n * discoverElement('#app-card').subscribe(el => {\r\n * if (el) console.log('Found:', el)\r\n * })\r\n *\r\n * // Find element by class\r\n * discoverElement('.special-button').subscribe(el => {...})\r\n * ```\r\n */\r\nexport function discoverElement<T extends HTMLElement>(\r\n\tselector: string,\r\n\ttimeout = 150,\r\n): Observable<T | null> {\r\n\tconst requestId = `discover-${Date.now()}-${Math.random().toString(36).slice(2)}`\r\n\r\n\treturn new Observable(subscriber => {\r\n\t\tconst subscription = fromEvent<CustomEvent<DiscoverResponse>>(window, DISCOVER_RESPONSE_EVENT)\r\n\t\t\t.pipe(\r\n\t\t\t\ttakeUntil(timer(timeout)),\r\n\t\t\t\tmap(e => e.detail),\r\n\t\t\t\tmap(detail => (detail.requestId === requestId ? (detail.element as T) : null)),\r\n\t\t\t\ttake(1),\r\n\t\t\t\tdefaultIfEmpty(null),\r\n\t\t\t)\r\n\t\t\t.subscribe(element => {\r\n\t\t\t\tsubscriber.next(element)\r\n\t\t\t\tsubscriber.complete()\r\n\t\t\t})\r\n\r\n\t\twindow.dispatchEvent(\r\n\t\t\tnew CustomEvent<DiscoverRequest>(DISCOVER_EVENT, {\r\n\t\t\t\tdetail: { selector, requestId },\r\n\t\t\t\tbubbles: true,\r\n\t\t\t\tcomposed: true,\r\n\t\t\t}),\r\n\t\t)\r\n\r\n\t\treturn () => subscription.unsubscribe()\r\n\t})\r\n}\r\n\r\n/**\r\n * Discover multiple elements matching a selector.\r\n * Collects all responses within the timeout period.\r\n *\r\n * @param selector - CSS selector\r\n * @param timeout - How long to collect responses (default: 150ms)\r\n * @returns Observable that emits array of discovered elements\r\n */\r\nexport function discoverAllElements<T extends HTMLElement>(\r\n\tselector: string,\r\n\ttimeout = 150,\r\n): Observable<T[]> {\r\n\tconst requestId = `discover-all-${Date.now()}-${Math.random().toString(36).slice(2)}`\r\n\tconst elements: T[] = []\r\n\r\n\treturn new Observable(subscriber => {\r\n\t\tconst subscription = fromEvent<CustomEvent<DiscoverResponse>>(window, DISCOVER_RESPONSE_EVENT)\r\n\t\t\t.pipe(takeUntil(timer(timeout)))\r\n\t\t\t.subscribe({\r\n\t\t\t\tnext: e => {\r\n\t\t\t\t\tif (e.detail.requestId === requestId) {\r\n\t\t\t\t\t\telements.push(e.detail.element as T)\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\tcomplete: () => {\r\n\t\t\t\t\tsubscriber.next(elements)\r\n\t\t\t\t\tsubscriber.complete()\r\n\t\t\t\t},\r\n\t\t\t})\r\n\r\n\t\twindow.dispatchEvent(\r\n\t\t\tnew CustomEvent<DiscoverRequest>(DISCOVER_EVENT, {\r\n\t\t\t\tdetail: { selector, requestId },\r\n\t\t\t\tbubbles: true,\r\n\t\t\t\tcomposed: true,\r\n\t\t\t}),\r\n\t\t)\r\n\r\n\t\treturn () => subscription.unsubscribe()\r\n\t})\r\n}\r\n\r\n/**\r\n * Smart discovery - automatically detects if input is a CSS selector or component tag.\r\n *\r\n * @param query - CSS selector (starts with #, ., [) OR component tag name\r\n * @param timeout - How long to wait (default: 150ms)\r\n * @returns Observable that emits the discovered element or null\r\n *\r\n * @example\r\n * ```typescript\r\n * // CSS selector - uses discoverElement\r\n * discover('#my-element').subscribe(...)\r\n *\r\n * // Component tag - uses discoverComponent\r\n * discover('schmancy-fancy').subscribe(...)\r\n * ```\r\n */\r\nexport function discover<T extends HTMLElement>(\r\n\tquery: string,\r\n\ttimeout = 150,\r\n): Observable<T | null> {\r\n\tconst isCssSelector = /^[#.[]/.test(query)\r\n\r\n\tif (isCssSelector) {\r\n\t\treturn discoverElement<T>(query, timeout)\r\n\t}\r\n\r\n\treturn discoverComponent<T>(query, timeout)\r\n}\r\n\r\n// Export event names for use in baseElement\r\nexport { DISCOVER_EVENT, DISCOVER_RESPONSE_EVENT }\r\nexport type { DiscoverRequest, DiscoverResponse }\r\n"],"mappings":";;AAMA,IAAM,IAAiB,qBACjB,IAA0B;AAyBhC,SAAgB,EACf,GACA,IAAU,KAAA;CAEV,IAAM,IAAmB,GAAG,EAAA,iBACtB,IAAe,GAAG,EAAA;AAExB,QAAO,IAAI,GAAW,MAAA;EACrB,IAAM,IAAe,EAAuB,QAAQ,EAAA,CAClD,KACA,EAAU,EAAM,EAAA,CAAA,EAChB,GAAI,MAAK,EAAE,OAAO,UAAA,EAClB,EAAe,KAAA,CAAA,CAEf,WAAU,MAAA;AACV,KAAW,KAAK,EAAA,EAChB,EAAW,UAAA;IAAA;AAUb,SAPA,OAAO,cACN,IAAI,YAAY,GAAkB;GACjC,SAAA,CAAS;GACT,UAAA,CAAU;GAAA,CAAA,CAAA,QAIC,EAAa,aAAA;GAAA;;AAW5B,SAAgB,EAAA,GAA+C,GAAA;AAC9D,QAAI,EAAc,WAAW,IACrB,IAAI,GAAW,MAAA;AACrB,IAAW,KAAK,KAAA,EAChB,EAAW,UAAA;GAAA,GAIN,EAAA,GAAQ,EAAc,KAAI,MAAO,EAAqB,EAAA,CAAA,CAAA;;AA2B9D,SAAgB,EACf,GACA,IAAU,KAAA;CAEV,IAAM,IAAY,YAAY,KAAK,KAAA,CAAA,GAAS,KAAK,QAAA,CAAS,SAAS,GAAA,CAAI,MAAM,EAAA;AAE7E,QAAO,IAAI,GAAW,MAAA;EACrB,IAAM,IAAe,EAAyC,QAAQ,EAAA,CACpE,KACA,EAAU,EAAM,EAAA,CAAA,EAChB,GAAI,MAAK,EAAE,OAAA,EACX,GAAI,MAAW,EAAO,cAAc,IAAa,EAAO,UAAgB,KAAA,EACxE,EAAK,EAAA,EACL,EAAe,KAAA,CAAA,CAEf,WAAU,MAAA;AACV,KAAW,KAAK,EAAA,EAChB,EAAW,UAAA;IAAA;AAWb,SARA,OAAO,cACN,IAAI,YAA6B,GAAgB;GAChD,QAAQ;IAAE,UAAA;IAAU,WAAA;IAAA;GACpB,SAAA,CAAS;GACT,UAAA,CAAU;GAAA,CAAA,CAAA,QAIC,EAAa,aAAA;GAAA;;AAY5B,SAAgB,EACf,GACA,IAAU,KAAA;CAEV,IAAM,IAAY,gBAAgB,KAAK,KAAA,CAAA,GAAS,KAAK,QAAA,CAAS,SAAS,GAAA,CAAI,MAAM,EAAA,IAC3E,IAAgB,EAAA;AAEtB,QAAO,IAAI,GAAW,MAAA;EACrB,IAAM,IAAe,EAAyC,QAAQ,EAAA,CACpE,KAAK,EAAU,EAAM,EAAA,CAAA,CAAA,CACrB,UAAU;GACV,OAAM,MAAA;AACD,MAAE,OAAO,cAAc,KAC1B,EAAS,KAAK,EAAE,OAAO,QAAA;;GAGzB,gBAAA;AACC,MAAW,KAAK,EAAA,EAChB,EAAW,UAAA;;GAAA,CAAA;AAYd,SARA,OAAO,cACN,IAAI,YAA6B,GAAgB;GAChD,QAAQ;IAAE,UAAA;IAAU,WAAA;IAAA;GACpB,SAAA,CAAS;GACT,UAAA,CAAU;GAAA,CAAA,CAAA,QAIC,EAAa,aAAA;GAAA;;AAoB5B,SAAgB,EACf,GACA,IAAU,KAAA;AAIV,QAFsB,SAAS,KAAK,EAAA,GAG5B,EAAmB,GAAO,EAAA,GAG3B,EAAqB,GAAO,EAAA;;AAAA,SAAA,KAAA,gBAAA,KAAA,yBAAA,KAAA,UAAA,KAAA,qBAAA,KAAA,sBAAA,KAAA,mBAAA,KAAA"}
|
|
@@ -1,9 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { t } from "./
|
|
3
|
-
import "./mixins.js";
|
|
1
|
+
import { s as e } from "./mixins-CcIWET41.js";
|
|
2
|
+
import { t } from "./decorate-23nYs4Le.js";
|
|
4
3
|
import { customElement as n, property as r } from "lit/decorators.js";
|
|
5
4
|
import { css as i, html as a } from "lit";
|
|
6
|
-
var o = class extends
|
|
5
|
+
var o = class extends e {
|
|
6
|
+
constructor(...e) {
|
|
7
|
+
super(...e), this.outline = "variant", this.vertical = !1, this.grow = "start";
|
|
8
|
+
}
|
|
9
|
+
static {
|
|
10
|
+
this.styles = [i`
|
|
7
11
|
:host {
|
|
8
12
|
display: block;
|
|
9
13
|
}
|
|
@@ -57,9 +61,7 @@ var o = class extends t(i`
|
|
|
57
61
|
animation: grow-vertical 400ms ease-out;
|
|
58
62
|
transform-origin: center;
|
|
59
63
|
}
|
|
60
|
-
`
|
|
61
|
-
constructor(...e) {
|
|
62
|
-
super(...e), this.outline = "variant", this.vertical = !1, this.grow = "start";
|
|
64
|
+
`];
|
|
63
65
|
}
|
|
64
66
|
set orientation(e) {
|
|
65
67
|
this.vertical = e === "vertical";
|
|
@@ -81,7 +83,7 @@ var o = class extends t(i`
|
|
|
81
83
|
></div>`;
|
|
82
84
|
}
|
|
83
85
|
};
|
|
84
|
-
|
|
86
|
+
t([r({ type: String })], o.prototype, "outline", void 0), t([r({ type: Boolean })], o.prototype, "vertical", void 0), t([r({ type: String })], o.prototype, "grow", void 0), t([r({
|
|
85
87
|
reflect: !0,
|
|
86
88
|
type: String
|
|
87
|
-
})], o.prototype, "orientation", null), o =
|
|
89
|
+
})], o.prototype, "orientation", null), o = t([n("schmancy-divider")], o);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"divider-BvJsmSPH.js","names":[],"sources":["../src/divider/divider.ts"],"sourcesContent":["// divider.ts\nimport { SchmancyElement } from '@mixins/index'\nimport { css, html } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\n@customElement('schmancy-divider')\nexport default class SchmancyDivider extends SchmancyElement {\n\tstatic styles = [css`\n\t:host {\n\t\tdisplay: block;\n\t}\n\n\t@keyframes grow-horizontal {\n\t\tfrom {\n\t\t\ttransform: scaleX(0);\n\t\t}\n\t\tto {\n\t\t\ttransform: scaleX(1);\n\t\t}\n\t}\n\n\t@keyframes grow-vertical {\n\t\tfrom {\n\t\t\ttransform: scaleY(0);\n\t\t}\n\t\tto {\n\t\t\ttransform: scaleY(1);\n\t\t}\n\t}\n\n\t/* Horizontal divider grow animations */\n\t.grow-start:not(.h-full) {\n\t\tanimation: grow-horizontal 400ms ease-out;\n\t\ttransform-origin: left;\n\t}\n\n\t.grow-end:not(.h-full) {\n\t\tanimation: grow-horizontal 400ms ease-out;\n\t\ttransform-origin: right;\n\t}\n\n\t.grow-both:not(.h-full) {\n\t\tanimation: grow-horizontal 400ms ease-out;\n\t\ttransform-origin: center;\n\t}\n\n\t/* Vertical divider grow animations */\n\t.grow-start.h-full {\n\t\tanimation: grow-vertical 400ms ease-out;\n\t\ttransform-origin: top;\n\t}\n\n\t.grow-end.h-full {\n\t\tanimation: grow-vertical 400ms ease-out;\n\t\ttransform-origin: bottom;\n\t}\n\n\t.grow-both.h-full {\n\t\tanimation: grow-vertical 400ms ease-out;\n\t\ttransform-origin: center;\n\t}\n`]\n\n\t@property({ type: String }) outline: 'default' | 'variant' = 'variant'\n\t@property({ type: Boolean }) vertical = false\n\t@property({ type: String }) grow: 'start' | 'end' | 'both' = 'start'\n\n\t/**\n\t * @deprecated Use `vertical` property instead. Will be removed in next major version.\n\t */\n\t@property({ reflect: true, type: String })\n\tset orientation(value: 'horizontal' | 'vertical') {\n\t\tthis.vertical = value === 'vertical'\n\t}\n\tget orientation(): 'horizontal' | 'vertical' {\n\t\treturn this.vertical ? 'vertical' : 'horizontal'\n\t}\n\n\tprotected render() {\n\t\treturn html`<div\n\t\t\tclass=${this.classMap({\n\t\t\t\t// Dimensions\n\t\t\t\t'w-full h-px': !this.vertical,\n\t\t\t\t'h-full w-px': this.vertical,\n\t\t\t\t// Border color\n\t\t\t\t'border-outlineVariant': this.outline === 'variant',\n\t\t\t\t'border-outline': this.outline === 'default',\n\t\t\t\t// Border style\n\t\t\t\t'border-t': !this.vertical,\n\t\t\t\t'border-l': this.vertical,\n\t\t\t\t// Grow behavior\n\t\t\t\t[`grow-${this.grow}`]: true,\n\t\t\t})}\n\t\t></div>`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-divider': SchmancyDivider\n\t}\n}\n"],"mappings":";;;;AAMe,IAAA,IAAA,cAA8B,EAAA;CAAA,YAAA,GAAA,GAAA;AAAA,QAAA,GAAA,EAAA,EAAA,KAAA,UAyDiB,WAAA,KAAA,WAAA,CACrB,GAAA,KAAA,OACqB;;CAAA;AAAA,OAAA,SA1D7C,CAAC,CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+DpB,IAAA,YACgB,GAAA;AACf,OAAK,WAAW,MAAU;;CAE3B,IAAA,cAAI;AACH,SAAO,KAAK,WAAW,aAAa;;CAGrC,SAAA;AACC,SAAO,CAAI;WACF,KAAK,SAAS;GAErB,eAAA,CAAgB,KAAK;GACrB,eAAe,KAAK;GAEpB,yBAAyB,KAAK,YAAY;GAC1C,kBAAkB,KAAK,YAAY;GAEnC,YAAA,CAAa,KAAK;GAClB,YAAY,KAAK;IAEhB,QAAQ,KAAK,SAAA,CAAS;GAAA,CAAA,CAAA;;;;GA5BzB,EAAS,EAAE,MAAM,QAAA,CAAA,CAAA,EAAS,EAAA,WAAA,WAAA,KAAA,EAAA,EAAA,EAAA,CAC1B,EAAS,EAAE,MAAM,SAAA,CAAA,CAAA,EAAU,EAAA,WAAA,YAAA,KAAA,EAAA,EAAA,EAAA,CAC3B,EAAS,EAAE,MAAM,QAAA,CAAA,CAAA,EAAS,EAAA,WAAA,QAAA,KAAA,EAAA,EAAA,EAAA,CAK1B,EAAS;CAAE,SAAA,CAAS;CAAM,MAAM;CAAA,CAAA,CAAA,EAAS,EAAA,WAAA,eAAA,KAAA,EAAA,IAAA,EAAA,CAjE1C,EAAc,mBAAA,CAAA,EAAmB,EAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
require(`./chunk-CncqDLb2.cjs`);const e=require(`./
|
|
1
|
+
require(`./chunk-CncqDLb2.cjs`);const e=require(`./mixins-De3xfjrm.cjs`),t=require(`./decorate-DpFmy0nm.cjs`);let n=require(`lit/decorators.js`),r=require(`lit`);var i=class extends e.s{constructor(...e){super(...e),this.outline=`variant`,this.vertical=!1,this.grow=`start`}static{this.styles=[r.css`
|
|
2
2
|
:host {
|
|
3
3
|
display: block;
|
|
4
4
|
}
|
|
@@ -52,6 +52,6 @@ require(`./chunk-CncqDLb2.cjs`);const e=require(`./decorate-F9CuyeHg.cjs`),t=req
|
|
|
52
52
|
animation: grow-vertical 400ms ease-out;
|
|
53
53
|
transform-origin: center;
|
|
54
54
|
}
|
|
55
|
-
`
|
|
55
|
+
`]}set orientation(e){this.vertical=e===`vertical`}get orientation(){return this.vertical?`vertical`:`horizontal`}render(){return r.html`<div
|
|
56
56
|
class=${this.classMap({"w-full h-px":!this.vertical,"h-full w-px":this.vertical,"border-outlineVariant":this.outline===`variant`,"border-outline":this.outline===`default`,"border-t":!this.vertical,"border-l":this.vertical,[`grow-${this.grow}`]:!0})}
|
|
57
|
-
></div>`}};
|
|
57
|
+
></div>`}};t.t([(0,n.property)({type:String})],i.prototype,`outline`,void 0),t.t([(0,n.property)({type:Boolean})],i.prototype,`vertical`,void 0),t.t([(0,n.property)({type:String})],i.prototype,`grow`,void 0),t.t([(0,n.property)({reflect:!0,type:String})],i.prototype,`orientation`,null),i=t.t([(0,n.customElement)(`schmancy-divider`)],i);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"divider-DPT3XnG5.cjs","names":[],"sources":["../src/divider/divider.ts"],"sourcesContent":["// divider.ts\nimport { SchmancyElement } from '@mixins/index'\nimport { css, html } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\n@customElement('schmancy-divider')\nexport default class SchmancyDivider extends SchmancyElement {\n\tstatic styles = [css`\n\t:host {\n\t\tdisplay: block;\n\t}\n\n\t@keyframes grow-horizontal {\n\t\tfrom {\n\t\t\ttransform: scaleX(0);\n\t\t}\n\t\tto {\n\t\t\ttransform: scaleX(1);\n\t\t}\n\t}\n\n\t@keyframes grow-vertical {\n\t\tfrom {\n\t\t\ttransform: scaleY(0);\n\t\t}\n\t\tto {\n\t\t\ttransform: scaleY(1);\n\t\t}\n\t}\n\n\t/* Horizontal divider grow animations */\n\t.grow-start:not(.h-full) {\n\t\tanimation: grow-horizontal 400ms ease-out;\n\t\ttransform-origin: left;\n\t}\n\n\t.grow-end:not(.h-full) {\n\t\tanimation: grow-horizontal 400ms ease-out;\n\t\ttransform-origin: right;\n\t}\n\n\t.grow-both:not(.h-full) {\n\t\tanimation: grow-horizontal 400ms ease-out;\n\t\ttransform-origin: center;\n\t}\n\n\t/* Vertical divider grow animations */\n\t.grow-start.h-full {\n\t\tanimation: grow-vertical 400ms ease-out;\n\t\ttransform-origin: top;\n\t}\n\n\t.grow-end.h-full {\n\t\tanimation: grow-vertical 400ms ease-out;\n\t\ttransform-origin: bottom;\n\t}\n\n\t.grow-both.h-full {\n\t\tanimation: grow-vertical 400ms ease-out;\n\t\ttransform-origin: center;\n\t}\n`]\n\n\t@property({ type: String }) outline: 'default' | 'variant' = 'variant'\n\t@property({ type: Boolean }) vertical = false\n\t@property({ type: String }) grow: 'start' | 'end' | 'both' = 'start'\n\n\t/**\n\t * @deprecated Use `vertical` property instead. Will be removed in next major version.\n\t */\n\t@property({ reflect: true, type: String })\n\tset orientation(value: 'horizontal' | 'vertical') {\n\t\tthis.vertical = value === 'vertical'\n\t}\n\tget orientation(): 'horizontal' | 'vertical' {\n\t\treturn this.vertical ? 'vertical' : 'horizontal'\n\t}\n\n\tprotected render() {\n\t\treturn html`<div\n\t\t\tclass=${this.classMap({\n\t\t\t\t// Dimensions\n\t\t\t\t'w-full h-px': !this.vertical,\n\t\t\t\t'h-full w-px': this.vertical,\n\t\t\t\t// Border color\n\t\t\t\t'border-outlineVariant': this.outline === 'variant',\n\t\t\t\t'border-outline': this.outline === 'default',\n\t\t\t\t// Border style\n\t\t\t\t'border-t': !this.vertical,\n\t\t\t\t'border-l': this.vertical,\n\t\t\t\t// Grow behavior\n\t\t\t\t[`grow-${this.grow}`]: true,\n\t\t\t})}\n\t\t></div>`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-divider': SchmancyDivider\n\t}\n}\n"],"mappings":"kKAMe,IAAA,EAAA,cAA8B,EAAA,CAAA,CAAA,YAAA,GAAA,EAAA,CAAA,MAAA,GAAA,EAAA,CAAA,KAAA,QAyDiB,UAAA,KAAA,SAAA,CACrB,EAAA,KAAA,KACqB,QAAA,OAAA,KAAA,OA1D7C,CAAC,EAAA,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+DpB,IAAA,YACgB,EAAA,CACf,KAAK,SAAW,IAAU,WAE3B,IAAA,aAAI,CACH,OAAO,KAAK,SAAW,WAAa,aAGrC,QAAA,CACC,MAAO,GAAA,IAAI;WACF,KAAK,SAAS,CAErB,cAAA,CAAgB,KAAK,SACrB,cAAe,KAAK,SAEpB,wBAAyB,KAAK,UAAY,UAC1C,iBAAkB,KAAK,UAAY,UAEnC,WAAA,CAAa,KAAK,SAClB,WAAY,KAAK,UAEhB,QAAQ,KAAK,QAAA,CAAS,EAAA,CAAA,CAAA;iCA5BhB,CAAE,KAAM,OAAA,CAAA,CAAA,CAAS,EAAA,UAAA,UAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UACjB,CAAE,KAAM,QAAA,CAAA,CAAA,CAAU,EAAA,UAAA,WAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAClB,CAAE,KAAM,OAAA,CAAA,CAAA,CAAS,EAAA,UAAA,OAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAKjB,CAAE,QAAA,CAAS,EAAM,KAAM,OAAA,CAAA,CAAA,CAAS,EAAA,UAAA,cAAA,KAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,eAjE5B,mBAAA,CAAA,CAAmB,EAAA"}
|
package/dist/divider.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
require(`./divider-
|
|
1
|
+
require(`./divider-DPT3XnG5.cjs`);
|
package/dist/divider.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import "./divider-
|
|
1
|
+
import "./divider-BvJsmSPH.js";
|
package/dist/dropdown.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`./chunk-CncqDLb2.cjs`);const e=require(`./
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`./chunk-CncqDLb2.cjs`);const e=require(`./mixins-De3xfjrm.cjs`),t=require(`./decorate-DpFmy0nm.cjs`);let n=require(`rxjs`),r=require(`lit/decorators.js`),i=require(`lit`),a=require(`@floating-ui/dom`);var o=class extends e.s{constructor(...e){super(...e),this.open=!1,this.placement=`bottom-start`,this.distance=8,this.portal=null,this.portalSubscriptions=[]}connectedCallback(){super.connectedCallback(),this.setupPortal(),(0,n.fromEvent)(document,`click`).pipe((0,n.filter)(e=>this.open&&!this.isEventFromSelf(e)),(0,n.takeUntil)(this.disconnecting)).subscribe(()=>{this.open=!1}),(0,n.fromEvent)(document,`keydown`).pipe((0,n.filter)(e=>this.open&&e.key===`Escape`),(0,n.takeUntil)(this.disconnecting)).subscribe(()=>{this.open=!1})}setupPortal(){let e=document.getElementById(`schmancy-portal-container`);e||(e=document.createElement(`div`),e.id=`schmancy-portal-container`,e.style.position=`fixed`,e.style.zIndex=`10000`,e.style.top=`0`,e.style.left=`0`,e.style.pointerEvents=`none`,document.body.appendChild(e));let t=document.createElement(`div`);t.className=`schmancy-dropdown-portal`,t.style.position=`absolute`,t.style.pointerEvents=`auto`,t.style.display=`none`,e.appendChild(t),this.portal=t}isEventFromSelf(e){return e.composedPath().some(e=>e===this)}disconnectedCallback(){this.cleanupPositioner?.(),this.portalSubscriptions.forEach(e=>e.unsubscribe()),this.portalSubscriptions=[],this.portal&&=(this.portal.remove(),null),super.disconnectedCallback()}toggle(){this.open=!this.open}updated(e){super.updated(e),e.has(`open`)&&(this.open?this.setupPositioner():(this.cleanupPositioner?.(),this.portal&&(this.portal.style.display=`none`,this.portal.innerHTML=``,this.portalSubscriptions.forEach(e=>e.unsubscribe()),this.portalSubscriptions=[])))}setupPositioner(){this.triggerContainer&&this.portal&&(this.portal.style.display=`block`,this.teleportContentToPortal(),this.cleanupPositioner=(0,a.autoUpdate)(this.triggerContainer,this.portal,()=>{(0,a.computePosition)(this.triggerContainer,this.portal,{placement:this.placement,middleware:[(0,a.offset)(this.distance),(0,a.flip)({fallbackPlacements:[`top-start`,`bottom-start`]}),(0,a.shift)({padding:0})]}).then(({x:e,y:t})=>{Object.assign(this.portal.style,{left:`${e}px`,top:t-8+`px`})})}))}teleportContentToPortal(){this.portal&&(this.portalSubscriptions.forEach(e=>e.unsubscribe()),this.portalSubscriptions=[],this.portal.innerHTML=``,this.contentElements.forEach(e=>{let t=e.cloneNode(!0);if(e.tagName.toLowerCase()===`schmancy-dropdown-content`){let e=(0,n.fromEvent)(t,`slotchange`).subscribe(()=>{let e=t.shadowRoot?.querySelector(`[part="content"]`);e&&e.classList.add(`schmancy-dropdown-content`)});this.portalSubscriptions.push(e)}this.portal?.appendChild(t)}))}handleTriggerClick(e){e.stopPropagation(),this.toggle()}render(){return i.html`
|
|
2
2
|
<div class="trigger-container" @click=${this.handleTriggerClick}>
|
|
3
3
|
<slot name="trigger"></slot>
|
|
4
4
|
</div>
|
|
@@ -8,7 +8,7 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`./ch
|
|
|
8
8
|
@slotchange=${()=>{this.open&&(this.teleportContentToPortal(),this.setupPositioner())}}
|
|
9
9
|
></slot>
|
|
10
10
|
</div>
|
|
11
|
-
`}};t.t([(0,
|
|
11
|
+
`}};t.t([(0,r.property)({type:Boolean,reflect:!0})],o.prototype,`open`,void 0),t.t([(0,r.property)({type:String})],o.prototype,`placement`,void 0),t.t([(0,r.property)({type:Number})],o.prototype,`distance`,void 0),t.t([(0,r.query)(`.trigger-container`)],o.prototype,`triggerContainer`,void 0),t.t([(0,r.query)(`.dropdown-content-container`)],o.prototype,`contentContainer`,void 0),t.t([(0,r.queryAssignedElements)({flatten:!0})],o.prototype,`contentElements`,void 0),t.t([(0,r.state)()],o.prototype,`portal`,void 0),t.t([(0,r.queryAssignedElements)({slot:`trigger`,flatten:!0})],o.prototype,`triggerElements`,void 0),o=t.t([(0,r.customElement)(`schmancy-dropdown`)],o);var s=class extends e.s{constructor(...e){super(...e),this.width=`auto`,this.maxHeight=`80vh`,this.shadow=!0,this.radius=`md`}static{this.styles=[i.css`
|
|
12
12
|
:host {
|
|
13
13
|
display: block;
|
|
14
14
|
position: absolute;
|
|
@@ -50,8 +50,8 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`./ch
|
|
|
50
50
|
transform-origin: top left;
|
|
51
51
|
animation: dropdownAnimation 0.1s ease-out forwards;
|
|
52
52
|
}
|
|
53
|
-
`
|
|
53
|
+
`]}render(){let e={"schmancy-dropdown-content":!0,"overflow-auto":!0,"shadow-none":!this.shadow,"rounded-none":this.radius===`none`,"rounded-sm":this.radius===`sm`,"rounded-md":this.radius===`md`,"rounded-lg":this.radius===`lg`,"rounded-full":this.radius===`full`},t={width:this.width,maxHeight:this.maxHeight};return i.html`
|
|
54
54
|
<div class=${this.classMap(e)} style=${this.styleMap(t)} part="content">
|
|
55
55
|
<slot></slot>
|
|
56
56
|
</div>
|
|
57
|
-
`}};t.t([(0,
|
|
57
|
+
`}};t.t([(0,r.property)({type:String})],s.prototype,`width`,void 0),t.t([(0,r.property)({type:String})],s.prototype,`maxHeight`,void 0),t.t([(0,r.property)({type:Boolean})],s.prototype,`shadow`,void 0),t.t([(0,r.property)({type:String})],s.prototype,`radius`,void 0),s=t.t([(0,r.customElement)(`schmancy-dropdown-content`)],s),Object.defineProperty(exports,`SchmancyDropdown`,{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,`SchmancyDropdownContent`,{enumerable:!0,get:function(){return s}});
|
package/dist/dropdown.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dropdown.cjs","names":[],"sources":["../src/dropdown/dropdown-component.ts","../src/dropdown/dropdown-content.ts"],"sourcesContent":["import { autoUpdate, computePosition, flip, offset, shift } from '@floating-ui/dom'\nimport { $LitElement } from '@mixins/index'\nimport { html } from 'lit'\nimport { customElement, property, query, queryAssignedElements, state } from 'lit/decorators.js'\nimport { filter, fromEvent, takeUntil, Subscription } from 'rxjs'\n\n/**\n * Anchored floating dropdown — a generic \"show this content relative to that trigger\" primitive. Unlike schmancy-menu (which uses the dialog service and is list-shaped), dropdown is a low-level popover anchored with Floating UI. Use when you want a custom-shaped overlay tied to a specific trigger element without the menu semantics.\n *\n * @element schmancy-dropdown\n * @summary Prefer schmancy-menu for action lists, schmancy-autocomplete for type-ahead, schmancy-tooltip for hover hints. Reach for schmancy-dropdown when none of those fit — custom filters, color pickers, inline forms anchored to a trigger.\n * @example\n * <schmancy-dropdown>\n * <schmancy-button slot=\"trigger\">Filters</schmancy-button>\n * <schmancy-dropdown-content>\n * <schmancy-form>…</schmancy-form>\n * </schmancy-dropdown-content>\n * </schmancy-dropdown>\n * @platform div - Anchored via Floating UI (autoUpdate, flip, shift). Degrades to inline content if the tag never registers — loses positioning but content stays accessible.\n * @attr open - Boolean; whether the dropdown is visible.\n * @fires open - When the dropdown opens.\n * @fires close - When the dropdown closes.\n * @slot trigger - The element that triggers the dropdown\n * @slot - Default slot for the dropdown content\n */\n@customElement('schmancy-dropdown')\nexport class SchmancyDropdown extends $LitElement() {\n\t/**\n\t * Whether the dropdown is currently open\n\t */\n\t@property({ type: Boolean, reflect: true })\n\topen = false\n\n\t/**\n\t * Placement of the dropdown relative to the trigger\n\t */\n\t@property({ type: String })\n\tplacement:\n\t\t| 'top'\n\t\t| 'top-start'\n\t\t| 'top-end'\n\t\t| 'right'\n\t\t| 'right-start'\n\t\t| 'right-end'\n\t\t| 'bottom'\n\t\t| 'bottom-start'\n\t\t| 'bottom-end'\n\t\t| 'left'\n\t\t| 'left-start'\n\t\t| 'left-end' = 'bottom-start'\n\n\t/**\n\t * Offset distance in pixels\n\t */\n\t@property({ type: Number })\n\tdistance = 8\n\n\t@query('.trigger-container') triggerContainer!: HTMLElement\n\t@query('.dropdown-content-container') contentContainer!: HTMLElement\n\t@queryAssignedElements({ flatten: true }) contentElements!: HTMLElement[]\n\t@state() private portal: HTMLElement | null = null\n\n\t@queryAssignedElements({ slot: 'trigger', flatten: true })\n\ttriggerElements!: Array<HTMLElement>\n\n\tprivate cleanupPositioner?: () => void\n\tprivate portalSubscriptions: Subscription[] = []\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback()\n\n\t\t// Create portal container for teleporting content to document body\n\t\tthis.setupPortal()\n\n\t\t// Listen for document clicks to close dropdown when clicking outside\n\t\tfromEvent<MouseEvent>(document, 'click')\n\t\t\t.pipe(\n\t\t\t\tfilter(event => this.open && !this.isEventFromSelf(event)),\n\t\t\t\ttakeUntil(this.disconnecting),\n\t\t\t)\n\t\t\t.subscribe(() => {\n\t\t\t\tthis.open = false\n\t\t\t})\n\n\t\t// Listen for escape key to close dropdown\n\t\tfromEvent<KeyboardEvent>(document, 'keydown')\n\t\t\t.pipe(\n\t\t\t\tfilter(event => this.open && event.key === 'Escape'),\n\t\t\t\ttakeUntil(this.disconnecting),\n\t\t\t)\n\t\t\t.subscribe(() => {\n\t\t\t\tthis.open = false\n\t\t\t})\n\t}\n\n\t/**\n\t * Set up the portal element for teleporting content\n\t */\n\tprivate setupPortal() {\n\t\t// Check if portal container exists\n\t\tlet portalContainer = document.getElementById('schmancy-portal-container')\n\n\t\t// Create portal container if it doesn't exist\n\t\tif (!portalContainer) {\n\t\t\tportalContainer = document.createElement('div')\n\t\t\tportalContainer.id = 'schmancy-portal-container'\n\t\t\tportalContainer.style.position = 'fixed'\n\t\t\tportalContainer.style.zIndex = '10000'\n\t\t\tportalContainer.style.top = '0'\n\t\t\tportalContainer.style.left = '0'\n\t\t\tportalContainer.style.pointerEvents = 'none'\n\t\t\tdocument.body.appendChild(portalContainer)\n\t\t}\n\n\t\t// Create portal for this specific dropdown\n\t\tconst portal = document.createElement('div')\n\t\tportal.className = 'schmancy-dropdown-portal'\n\t\tportal.style.position = 'absolute'\n\t\tportal.style.pointerEvents = 'auto'\n\t\tportal.style.display = 'none'\n\t\tportalContainer.appendChild(portal)\n\n\t\tthis.portal = portal\n\t}\n\n\t/**\n\t * Check if an event originated from within this component\n\t */\n\tprivate isEventFromSelf(event: Event): boolean {\n\t\treturn event.composedPath().some(el => el === this)\n\t}\n\n\tdisconnectedCallback() {\n\t\tthis.cleanupPositioner?.()\n\n\t\t// Clean up portal subscriptions\n\t\tthis.portalSubscriptions.forEach(subscription => subscription.unsubscribe())\n\t\tthis.portalSubscriptions = []\n\n\t\t// Remove portal when component is disconnected\n\t\tif (this.portal) {\n\t\t\tthis.portal.remove()\n\t\t\tthis.portal = null\n\t\t}\n\n\t\tsuper.disconnectedCallback()\n\t}\n\n\t/**\n\t * Toggle the dropdown open state\n\t */\n\ttoggle() {\n\t\tthis.open = !this.open\n\t}\n\n\tupdated(changedProps: Map<string, any>) {\n\t\tsuper.updated(changedProps)\n\n\t\tif (changedProps.has('open')) {\n\t\t\tif (this.open) {\n\t\t\t\tthis.setupPositioner()\n\t\t\t} else {\n\t\t\t\tthis.cleanupPositioner?.()\n\n\t\t\t\t// Hide portal when dropdown is closed\n\t\t\t\tif (this.portal) {\n\t\t\t\t\tthis.portal.style.display = 'none'\n\t\t\t\t\tthis.portal.innerHTML = ''\n\t\t\t\t\t// Clean up subscriptions when content is cleared\n\t\t\t\t\tthis.portalSubscriptions.forEach(subscription => subscription.unsubscribe())\n\t\t\t\t\tthis.portalSubscriptions = []\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Setup floating UI positioning with teleportation\n\t */\n\tprivate setupPositioner() {\n\t\tif (!this.triggerContainer || !this.portal) return\n\n\t\t// Show the portal\n\t\tthis.portal.style.display = 'block'\n\n\t\t// Move content to portal\n\t\tthis.teleportContentToPortal()\n\n\t\t// Setup positioning\n\t\tthis.cleanupPositioner = autoUpdate(this.triggerContainer, this.portal, () => {\n\t\t\tcomputePosition(this.triggerContainer, this.portal, {\n\t\t\t\tplacement: this.placement,\n\t\t\t\tmiddleware: [\n\t\t\t\t\toffset(this.distance),\n\t\t\t\t\tflip({\n\t\t\t\t\t\tfallbackPlacements: ['top-start', 'bottom-start'],\n\t\t\t\t\t}),\n\t\t\t\t\tshift({ padding: 0 }),\n\t\t\t\t],\n\t\t\t}).then(({ x, y }) => {\n\t\t\t\t// Update portal position\n\t\t\t\tObject.assign(this.portal.style, {\n\t\t\t\t\tleft: `${x}px`,\n\t\t\t\t\ttop: `${y - 8}px`,\n\t\t\t\t})\n\t\t\t})\n\t\t})\n\t}\n\n\t/**\n\t * Move slotted content to the portal\n\t */\n\tprivate teleportContentToPortal() {\n\t\tif (!this.portal) return\n\n\t\t// Clean up existing subscriptions\n\t\tthis.portalSubscriptions.forEach(subscription => subscription.unsubscribe())\n\t\tthis.portalSubscriptions = []\n\n\t\t// Clear existing content\n\t\tthis.portal.innerHTML = ''\n\n\t\t// Clone and move slotted content to portal\n\t\tthis.contentElements.forEach(element => {\n\t\t\t// Get computed styles to ensure portal content matches original styling\n\t\t\tconst clonedElement = element.cloneNode(true) as HTMLElement\n\n\t\t\t// Ensure dropdown-content elements maintain their styles when teleported\n\t\t\tif (element.tagName.toLowerCase() === 'schmancy-dropdown-content') {\n\t\t\t\tconst subscription = fromEvent(clonedElement, 'slotchange').subscribe(() => {\n\t\t\t\t\t// Propagate any slot changes to class changes on children\n\t\t\t\t\tconst contentDiv = clonedElement.shadowRoot?.querySelector('[part=\"content\"]')\n\t\t\t\t\tif (contentDiv) {\n\t\t\t\t\t\tcontentDiv.classList.add('schmancy-dropdown-content')\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\tthis.portalSubscriptions.push(subscription)\n\t\t\t}\n\n\t\t\tthis.portal?.appendChild(clonedElement)\n\t\t})\n\t}\n\n\t/**\n\t * Handle trigger click to toggle dropdown\n\t */\n\tprivate handleTriggerClick(e: Event) {\n\t\te.stopPropagation()\n\t\tthis.toggle()\n\t}\n\n\trender() {\n\t\treturn html`\n\t\t\t<div class=\"trigger-container\" @click=${this.handleTriggerClick}>\n\t\t\t\t<slot name=\"trigger\"></slot>\n\t\t\t</div>\n\n\t\t\t<div class=\"dropdown-content-container\" ?hidden=${!this.open}>\n\t\t\t\t<slot\n\t\t\t\t\t@slotchange=${() => {\n\t\t\t\t\t\tif (this.open) {\n\t\t\t\t\t\t\tthis.teleportContentToPortal()\n\t\t\t\t\t\t\tthis.setupPositioner()\n\t\t\t\t\t\t}\n\t\t\t\t\t}}\n\t\t\t\t></slot>\n\t\t\t</div>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-dropdown': SchmancyDropdown\n\t}\n}\n","import { TailwindElement } from '@mixins/index'\nimport { css, html } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\n/**\n * Content panel for a schmancy-dropdown — a styled positioned surface. Always nested inside schmancy-dropdown and placed alongside the trigger slot.\n *\n * @element schmancy-dropdown-content\n * @summary Nest this inside schmancy-dropdown (not in the trigger slot). Use the `content` CSS part to customize backgrounds / shadows / padding without shadow-root piercing.\n * @example\n * <schmancy-dropdown>\n * <schmancy-button slot=\"trigger\">Open</schmancy-button>\n * <schmancy-dropdown-content>\n * Panel contents…\n * </schmancy-dropdown-content>\n * </schmancy-dropdown>\n * @platform div - Positioned panel with theme-aware styling. Degrades to an inline div if the tag never registers.\n * @slot - Default slot for dropdown content.\n * @csspart content - The inner wrapper element; style to override panel backgrounds, shadows, padding, or borders without shadow-root piercing.\n */\n@customElement('schmancy-dropdown-content')\nexport class SchmancyDropdownContent extends TailwindElement(css`\n\t:host {\n\t\tdisplay: block;\n\t\tposition: absolute;\n\t\tz-index: 1000;\n\t\tmin-width: 10rem;\n\t\tmargin: 0;\n\t\ttext-align: left;\n\t\tlist-style: none;\n\t\tbackground-color: var(--schmancy-sys-color-surface-container);\n\t\tbackground-clip: padding-box;\n\t\tborder-radius: 0.375rem;\n\t\tbox-shadow: var(--schmancy-sys-elevation-3);\n\t\twill-change: transform;\n\t\ttransform-origin: top left;\n\t\tanimation: dropdownAnimation 0.1s ease-out forwards;\n\t}\n\n\t:host([hidden]) {\n\t\tdisplay: none;\n\t}\n\n\t@keyframes dropdownAnimation {\n\t\tfrom {\n\t\t\topacity: 0;\n\t\t\ttransform: scale(0.95);\n\t\t}\n\t\tto {\n\t\t\topacity: 1;\n\t\t\ttransform: scale(1);\n\t\t}\n\t}\n\n\t/* Apply styles to content both in the component and when teleported to the portal */\n\t.schmancy-dropdown-content {\n\t\tbackground-color: var(--schmancy-sys-color-surface-container);\n\t\tborder-radius: 0.375rem;\n\t\tbox-shadow: var(--schmancy-sys-elevation-3);\n\t\twill-change: transform;\n\t\ttransform-origin: top left;\n\t\tanimation: dropdownAnimation 0.1s ease-out forwards;\n\t}\n`) {\n\t/**\n\t * Width of the dropdown content\n\t */\n\t@property({ type: String })\n\twidth: string = 'auto'\n\n\t/**\n\t * Maximum height of the dropdown content\n\t */\n\t@property({ type: String })\n\tmaxHeight: string = '80vh'\n\n\t/**\n\t * Whether to render with a shadow\n\t */\n\t@property({ type: Boolean })\n\tshadow: boolean = true\n\n\t/**\n\t * Border radius style\n\t */\n\t@property({ type: String })\n\tradius: 'none' | 'sm' | 'md' | 'lg' | 'full' = 'md'\n\n\trender() {\n\t\tconst classes = {\n\t\t\t'schmancy-dropdown-content': true,\n\t\t\t'overflow-auto': true,\n\t\t\t'shadow-none': !this.shadow,\n\t\t\t'rounded-none': this.radius === 'none',\n\t\t\t'rounded-sm': this.radius === 'sm',\n\t\t\t'rounded-md': this.radius === 'md',\n\t\t\t'rounded-lg': this.radius === 'lg',\n\t\t\t'rounded-full': this.radius === 'full',\n\t\t}\n\n\t\tconst styles = {\n\t\t\twidth: this.width,\n\t\t\tmaxHeight: this.maxHeight,\n\t\t}\n\n\t\treturn html`\n\t\t\t<div class=${this.classMap(classes)} style=${this.styleMap(styles)} part=\"content\">\n\t\t\t\t<slot></slot>\n\t\t\t</div>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-dropdown-content': SchmancyDropdownContent\n\t}\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dropdown.cjs","names":[],"sources":["../src/dropdown/dropdown-component.ts","../src/dropdown/dropdown-content.ts"],"sourcesContent":["import { autoUpdate, computePosition, flip, offset, shift } from '@floating-ui/dom'\nimport { SchmancyElement } from '@mixins/index'\nimport { html } from 'lit'\nimport { customElement, property, query, queryAssignedElements, state } from 'lit/decorators.js'\nimport { filter, fromEvent, takeUntil, Subscription } from 'rxjs'\n\n/**\n * A dropdown component that displays content when triggered.\n *\n * @element schmancy-dropdown\n * @slot trigger - The element that triggers the dropdown\n * @slot - Default slot for the dropdown content\n */\n@customElement('schmancy-dropdown')\nexport class SchmancyDropdown extends SchmancyElement {\n\t/**\n\t * Whether the dropdown is currently open\n\t */\n\t@property({ type: Boolean, reflect: true })\n\topen = false\n\n\t/**\n\t * Placement of the dropdown relative to the trigger\n\t */\n\t@property({ type: String })\n\tplacement:\n\t\t| 'top'\n\t\t| 'top-start'\n\t\t| 'top-end'\n\t\t| 'right'\n\t\t| 'right-start'\n\t\t| 'right-end'\n\t\t| 'bottom'\n\t\t| 'bottom-start'\n\t\t| 'bottom-end'\n\t\t| 'left'\n\t\t| 'left-start'\n\t\t| 'left-end' = 'bottom-start'\n\n\t/**\n\t * Offset distance in pixels\n\t */\n\t@property({ type: Number })\n\tdistance = 8\n\n\t@query('.trigger-container') triggerContainer!: HTMLElement\n\t@query('.dropdown-content-container') contentContainer!: HTMLElement\n\t@queryAssignedElements({ flatten: true }) contentElements!: HTMLElement[]\n\t@state() private portal: HTMLElement | null = null\n\n\t@queryAssignedElements({ slot: 'trigger', flatten: true })\n\ttriggerElements!: Array<HTMLElement>\n\n\tprivate cleanupPositioner?: () => void\n\tprivate portalSubscriptions: Subscription[] = []\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback()\n\n\t\t// Create portal container for teleporting content to document body\n\t\tthis.setupPortal()\n\n\t\t// Listen for document clicks to close dropdown when clicking outside\n\t\tfromEvent<MouseEvent>(document, 'click')\n\t\t\t.pipe(\n\t\t\t\tfilter(event => this.open && !this.isEventFromSelf(event)),\n\t\t\t\ttakeUntil(this.disconnecting),\n\t\t\t)\n\t\t\t.subscribe(() => {\n\t\t\t\tthis.open = false\n\t\t\t})\n\n\t\t// Listen for escape key to close dropdown\n\t\tfromEvent<KeyboardEvent>(document, 'keydown')\n\t\t\t.pipe(\n\t\t\t\tfilter(event => this.open && event.key === 'Escape'),\n\t\t\t\ttakeUntil(this.disconnecting),\n\t\t\t)\n\t\t\t.subscribe(() => {\n\t\t\t\tthis.open = false\n\t\t\t})\n\t}\n\n\t/**\n\t * Set up the portal element for teleporting content\n\t */\n\tprivate setupPortal() {\n\t\t// Check if portal container exists\n\t\tlet portalContainer = document.getElementById('schmancy-portal-container')\n\n\t\t// Create portal container if it doesn't exist\n\t\tif (!portalContainer) {\n\t\t\tportalContainer = document.createElement('div')\n\t\t\tportalContainer.id = 'schmancy-portal-container'\n\t\t\tportalContainer.style.position = 'fixed'\n\t\t\tportalContainer.style.zIndex = '10000'\n\t\t\tportalContainer.style.top = '0'\n\t\t\tportalContainer.style.left = '0'\n\t\t\tportalContainer.style.pointerEvents = 'none'\n\t\t\tdocument.body.appendChild(portalContainer)\n\t\t}\n\n\t\t// Create portal for this specific dropdown\n\t\tconst portal = document.createElement('div')\n\t\tportal.className = 'schmancy-dropdown-portal'\n\t\tportal.style.position = 'absolute'\n\t\tportal.style.pointerEvents = 'auto'\n\t\tportal.style.display = 'none'\n\t\tportalContainer.appendChild(portal)\n\n\t\tthis.portal = portal\n\t}\n\n\t/**\n\t * Check if an event originated from within this component\n\t */\n\tprivate isEventFromSelf(event: Event): boolean {\n\t\treturn event.composedPath().some(el => el === this)\n\t}\n\n\tdisconnectedCallback() {\n\t\tthis.cleanupPositioner?.()\n\n\t\t// Clean up portal subscriptions\n\t\tthis.portalSubscriptions.forEach(subscription => subscription.unsubscribe())\n\t\tthis.portalSubscriptions = []\n\n\t\t// Remove portal when component is disconnected\n\t\tif (this.portal) {\n\t\t\tthis.portal.remove()\n\t\t\tthis.portal = null\n\t\t}\n\n\t\tsuper.disconnectedCallback()\n\t}\n\n\t/**\n\t * Toggle the dropdown open state\n\t */\n\ttoggle() {\n\t\tthis.open = !this.open\n\t}\n\n\tupdated(changedProps: Map<string, unknown>) {\n\t\tsuper.updated(changedProps)\n\n\t\tif (changedProps.has('open')) {\n\t\t\tif (this.open) {\n\t\t\t\tthis.setupPositioner()\n\t\t\t} else {\n\t\t\t\tthis.cleanupPositioner?.()\n\n\t\t\t\t// Hide portal when dropdown is closed\n\t\t\t\tif (this.portal) {\n\t\t\t\t\tthis.portal.style.display = 'none'\n\t\t\t\t\tthis.portal.innerHTML = ''\n\t\t\t\t\t// Clean up subscriptions when content is cleared\n\t\t\t\t\tthis.portalSubscriptions.forEach(subscription => subscription.unsubscribe())\n\t\t\t\t\tthis.portalSubscriptions = []\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Setup floating UI positioning with teleportation\n\t */\n\tprivate setupPositioner() {\n\t\tif (!this.triggerContainer || !this.portal) return\n\n\t\t// Show the portal\n\t\tthis.portal.style.display = 'block'\n\n\t\t// Move content to portal\n\t\tthis.teleportContentToPortal()\n\n\t\t// Setup positioning\n\t\tthis.cleanupPositioner = autoUpdate(this.triggerContainer, this.portal, () => {\n\t\t\tcomputePosition(this.triggerContainer, this.portal, {\n\t\t\t\tplacement: this.placement,\n\t\t\t\tmiddleware: [\n\t\t\t\t\toffset(this.distance),\n\t\t\t\t\tflip({\n\t\t\t\t\t\tfallbackPlacements: ['top-start', 'bottom-start'],\n\t\t\t\t\t}),\n\t\t\t\t\tshift({ padding: 0 }),\n\t\t\t\t],\n\t\t\t}).then(({ x, y }) => {\n\t\t\t\t// Update portal position\n\t\t\t\tObject.assign(this.portal.style, {\n\t\t\t\t\tleft: `${x}px`,\n\t\t\t\t\ttop: `${y - 8}px`,\n\t\t\t\t})\n\t\t\t\treturn\n\t\t\t})\n\t\t})\n\t}\n\n\t/**\n\t * Move slotted content to the portal\n\t */\n\tprivate teleportContentToPortal() {\n\t\tif (!this.portal) return\n\n\t\t// Clean up existing subscriptions\n\t\tthis.portalSubscriptions.forEach(subscription => subscription.unsubscribe())\n\t\tthis.portalSubscriptions = []\n\n\t\t// Clear existing content\n\t\tthis.portal.innerHTML = ''\n\n\t\t// Clone and move slotted content to portal\n\t\tthis.contentElements.forEach(element => {\n\t\t\t// Get computed styles to ensure portal content matches original styling\n\t\t\tconst clonedElement = element.cloneNode(true) as HTMLElement\n\n\t\t\t// Ensure dropdown-content elements maintain their styles when teleported\n\t\t\tif (element.tagName.toLowerCase() === 'schmancy-dropdown-content') {\n\t\t\t\tconst subscription = fromEvent(clonedElement, 'slotchange').subscribe(() => {\n\t\t\t\t\t// Propagate any slot changes to class changes on children\n\t\t\t\t\tconst contentDiv = clonedElement.shadowRoot?.querySelector('[part=\"content\"]')\n\t\t\t\t\tif (contentDiv) {\n\t\t\t\t\t\tcontentDiv.classList.add('schmancy-dropdown-content')\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\tthis.portalSubscriptions.push(subscription)\n\t\t\t}\n\n\t\t\tthis.portal?.appendChild(clonedElement)\n\t\t})\n\t}\n\n\t/**\n\t * Handle trigger click to toggle dropdown\n\t */\n\tprivate handleTriggerClick(e: Event) {\n\t\te.stopPropagation()\n\t\tthis.toggle()\n\t}\n\n\trender() {\n\t\treturn html`\n\t\t\t<div class=\"trigger-container\" @click=${this.handleTriggerClick}>\n\t\t\t\t<slot name=\"trigger\"></slot>\n\t\t\t</div>\n\n\t\t\t<div class=\"dropdown-content-container\" ?hidden=${!this.open}>\n\t\t\t\t<slot\n\t\t\t\t\t@slotchange=${() => {\n\t\t\t\t\t\tif (this.open) {\n\t\t\t\t\t\t\tthis.teleportContentToPortal()\n\t\t\t\t\t\t\tthis.setupPositioner()\n\t\t\t\t\t\t}\n\t\t\t\t\t}}\n\t\t\t\t></slot>\n\t\t\t</div>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-dropdown': SchmancyDropdown\n\t}\n}\n","import { SchmancyElement } from '@mixins/index'\nimport { css, html } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\n/**\n * Content container for the schmancy-dropdown component.\n *\n * @element schmancy-dropdown-content\n * @slot - Default slot for dropdown content.\n * @csspart content - The inner wrapper element; style to override panel\n * backgrounds, shadows, padding, or borders without shadow-root piercing.\n */\n@customElement('schmancy-dropdown-content')\nexport class SchmancyDropdownContent extends SchmancyElement {\n\tstatic styles = [css`\n\t:host {\n\t\tdisplay: block;\n\t\tposition: absolute;\n\t\tz-index: 1000;\n\t\tmin-width: 10rem;\n\t\tmargin: 0;\n\t\ttext-align: left;\n\t\tlist-style: none;\n\t\tbackground-color: var(--schmancy-sys-color-surface-container);\n\t\tbackground-clip: padding-box;\n\t\tborder-radius: 0.375rem;\n\t\tbox-shadow: var(--schmancy-sys-elevation-3);\n\t\twill-change: transform;\n\t\ttransform-origin: top left;\n\t\tanimation: dropdownAnimation 0.1s ease-out forwards;\n\t}\n\n\t:host([hidden]) {\n\t\tdisplay: none;\n\t}\n\n\t@keyframes dropdownAnimation {\n\t\tfrom {\n\t\t\topacity: 0;\n\t\t\ttransform: scale(0.95);\n\t\t}\n\t\tto {\n\t\t\topacity: 1;\n\t\t\ttransform: scale(1);\n\t\t}\n\t}\n\n\t/* Apply styles to content both in the component and when teleported to the portal */\n\t.schmancy-dropdown-content {\n\t\tbackground-color: var(--schmancy-sys-color-surface-container);\n\t\tborder-radius: 0.375rem;\n\t\tbox-shadow: var(--schmancy-sys-elevation-3);\n\t\twill-change: transform;\n\t\ttransform-origin: top left;\n\t\tanimation: dropdownAnimation 0.1s ease-out forwards;\n\t}\n`];\n\t/**\n\t * Width of the dropdown content\n\t */\n\t@property({ type: String })\n\twidth: string = 'auto'\n\n\t/**\n\t * Maximum height of the dropdown content\n\t */\n\t@property({ type: String })\n\tmaxHeight: string = '80vh'\n\n\t/**\n\t * Whether to render with a shadow\n\t */\n\t@property({ type: Boolean })\n\tshadow: boolean = true\n\n\t/**\n\t * Border radius style\n\t */\n\t@property({ type: String })\n\tradius: 'none' | 'sm' | 'md' | 'lg' | 'full' = 'md'\n\n\trender() {\n\t\tconst classes = {\n\t\t\t'schmancy-dropdown-content': true,\n\t\t\t'overflow-auto': true,\n\t\t\t'shadow-none': !this.shadow,\n\t\t\t'rounded-none': this.radius === 'none',\n\t\t\t'rounded-sm': this.radius === 'sm',\n\t\t\t'rounded-md': this.radius === 'md',\n\t\t\t'rounded-lg': this.radius === 'lg',\n\t\t\t'rounded-full': this.radius === 'full',\n\t\t}\n\n\t\tconst styles = {\n\t\t\twidth: this.width,\n\t\t\tmaxHeight: this.maxHeight,\n\t\t}\n\n\t\treturn html`\n\t\t\t<div class=${this.classMap(classes)} style=${this.styleMap(styles)} part=\"content\">\n\t\t\t\t<slot></slot>\n\t\t\t</div>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-dropdown-content': SchmancyDropdownContent\n\t}\n}\n"],"mappings":"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"}
|
package/dist/dropdown.js
CHANGED
|
@@ -1,19 +1,17 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { t } from "./decorate-
|
|
3
|
-
import {
|
|
4
|
-
import "
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
import { autoUpdate as p, computePosition as m, flip as h, offset as g, shift as _ } from "@floating-ui/dom";
|
|
9
|
-
var v = class extends n() {
|
|
1
|
+
import { s as e } from "./mixins-CcIWET41.js";
|
|
2
|
+
import { t } from "./decorate-23nYs4Le.js";
|
|
3
|
+
import { filter as n, fromEvent as r, takeUntil as i } from "rxjs";
|
|
4
|
+
import { customElement as a, property as o, query as s, queryAssignedElements as c, state as l } from "lit/decorators.js";
|
|
5
|
+
import { css as u, html as d } from "lit";
|
|
6
|
+
import { autoUpdate as f, computePosition as p, flip as m, offset as h, shift as g } from "@floating-ui/dom";
|
|
7
|
+
var _ = class extends e {
|
|
10
8
|
constructor(...e) {
|
|
11
9
|
super(...e), this.open = !1, this.placement = "bottom-start", this.distance = 8, this.portal = null, this.portalSubscriptions = [];
|
|
12
10
|
}
|
|
13
11
|
connectedCallback() {
|
|
14
|
-
super.connectedCallback(), this.setupPortal(),
|
|
12
|
+
super.connectedCallback(), this.setupPortal(), r(document, "click").pipe(n((e) => this.open && !this.isEventFromSelf(e)), i(this.disconnecting)).subscribe(() => {
|
|
15
13
|
this.open = !1;
|
|
16
|
-
}),
|
|
14
|
+
}), r(document, "keydown").pipe(n((e) => this.open && e.key === "Escape"), i(this.disconnecting)).subscribe(() => {
|
|
17
15
|
this.open = !1;
|
|
18
16
|
});
|
|
19
17
|
}
|
|
@@ -36,13 +34,13 @@ var v = class extends n() {
|
|
|
36
34
|
super.updated(e), e.has("open") && (this.open ? this.setupPositioner() : (this.cleanupPositioner?.(), this.portal && (this.portal.style.display = "none", this.portal.innerHTML = "", this.portalSubscriptions.forEach((e) => e.unsubscribe()), this.portalSubscriptions = [])));
|
|
37
35
|
}
|
|
38
36
|
setupPositioner() {
|
|
39
|
-
this.triggerContainer && this.portal && (this.portal.style.display = "block", this.teleportContentToPortal(), this.cleanupPositioner =
|
|
40
|
-
|
|
37
|
+
this.triggerContainer && this.portal && (this.portal.style.display = "block", this.teleportContentToPortal(), this.cleanupPositioner = f(this.triggerContainer, this.portal, () => {
|
|
38
|
+
p(this.triggerContainer, this.portal, {
|
|
41
39
|
placement: this.placement,
|
|
42
40
|
middleware: [
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
41
|
+
h(this.distance),
|
|
42
|
+
m({ fallbackPlacements: ["top-start", "bottom-start"] }),
|
|
43
|
+
g({ padding: 0 })
|
|
46
44
|
]
|
|
47
45
|
}).then(({ x: e, y: t }) => {
|
|
48
46
|
Object.assign(this.portal.style, {
|
|
@@ -56,7 +54,7 @@ var v = class extends n() {
|
|
|
56
54
|
this.portal && (this.portalSubscriptions.forEach((e) => e.unsubscribe()), this.portalSubscriptions = [], this.portal.innerHTML = "", this.contentElements.forEach((e) => {
|
|
57
55
|
let t = e.cloneNode(!0);
|
|
58
56
|
if (e.tagName.toLowerCase() === "schmancy-dropdown-content") {
|
|
59
|
-
let e =
|
|
57
|
+
let e = r(t, "slotchange").subscribe(() => {
|
|
60
58
|
let e = t.shadowRoot?.querySelector("[part=\"content\"]");
|
|
61
59
|
e && e.classList.add("schmancy-dropdown-content");
|
|
62
60
|
});
|
|
@@ -69,7 +67,7 @@ var v = class extends n() {
|
|
|
69
67
|
e.stopPropagation(), this.toggle();
|
|
70
68
|
}
|
|
71
69
|
render() {
|
|
72
|
-
return
|
|
70
|
+
return d`
|
|
73
71
|
<div class="trigger-container" @click=${this.handleTriggerClick}>
|
|
74
72
|
<slot name="trigger"></slot>
|
|
75
73
|
</div>
|
|
@@ -84,14 +82,19 @@ var v = class extends n() {
|
|
|
84
82
|
`;
|
|
85
83
|
}
|
|
86
84
|
};
|
|
87
|
-
t([
|
|
85
|
+
t([o({
|
|
88
86
|
type: Boolean,
|
|
89
87
|
reflect: !0
|
|
90
|
-
})],
|
|
88
|
+
})], _.prototype, "open", void 0), t([o({ type: String })], _.prototype, "placement", void 0), t([o({ type: Number })], _.prototype, "distance", void 0), t([s(".trigger-container")], _.prototype, "triggerContainer", void 0), t([s(".dropdown-content-container")], _.prototype, "contentContainer", void 0), t([c({ flatten: !0 })], _.prototype, "contentElements", void 0), t([l()], _.prototype, "portal", void 0), t([c({
|
|
91
89
|
slot: "trigger",
|
|
92
90
|
flatten: !0
|
|
93
|
-
})],
|
|
94
|
-
var
|
|
91
|
+
})], _.prototype, "triggerElements", void 0), _ = t([a("schmancy-dropdown")], _);
|
|
92
|
+
var v = class extends e {
|
|
93
|
+
constructor(...e) {
|
|
94
|
+
super(...e), this.width = "auto", this.maxHeight = "80vh", this.shadow = !0, this.radius = "md";
|
|
95
|
+
}
|
|
96
|
+
static {
|
|
97
|
+
this.styles = [u`
|
|
95
98
|
:host {
|
|
96
99
|
display: block;
|
|
97
100
|
position: absolute;
|
|
@@ -133,9 +136,7 @@ var y = class extends e(d`
|
|
|
133
136
|
transform-origin: top left;
|
|
134
137
|
animation: dropdownAnimation 0.1s ease-out forwards;
|
|
135
138
|
}
|
|
136
|
-
`
|
|
137
|
-
constructor(...e) {
|
|
138
|
-
super(...e), this.width = "auto", this.maxHeight = "80vh", this.shadow = !0, this.radius = "md";
|
|
139
|
+
`];
|
|
139
140
|
}
|
|
140
141
|
render() {
|
|
141
142
|
let e = {
|
|
@@ -151,12 +152,12 @@ var y = class extends e(d`
|
|
|
151
152
|
width: this.width,
|
|
152
153
|
maxHeight: this.maxHeight
|
|
153
154
|
};
|
|
154
|
-
return
|
|
155
|
+
return d`
|
|
155
156
|
<div class=${this.classMap(e)} style=${this.styleMap(t)} part="content">
|
|
156
157
|
<slot></slot>
|
|
157
158
|
</div>
|
|
158
159
|
`;
|
|
159
160
|
}
|
|
160
161
|
};
|
|
161
|
-
t([
|
|
162
|
-
export {
|
|
162
|
+
t([o({ type: String })], v.prototype, "width", void 0), t([o({ type: String })], v.prototype, "maxHeight", void 0), t([o({ type: Boolean })], v.prototype, "shadow", void 0), t([o({ type: String })], v.prototype, "radius", void 0), v = t([a("schmancy-dropdown-content")], v);
|
|
163
|
+
export { _ as SchmancyDropdown, v as SchmancyDropdownContent };
|
package/dist/dropdown.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dropdown.js","names":[],"sources":["../src/dropdown/dropdown-component.ts","../src/dropdown/dropdown-content.ts"],"sourcesContent":["import { autoUpdate, computePosition, flip, offset, shift } from '@floating-ui/dom'\nimport { $LitElement } from '@mixins/index'\nimport { html } from 'lit'\nimport { customElement, property, query, queryAssignedElements, state } from 'lit/decorators.js'\nimport { filter, fromEvent, takeUntil, Subscription } from 'rxjs'\n\n/**\n * Anchored floating dropdown — a generic \"show this content relative to that trigger\" primitive. Unlike schmancy-menu (which uses the dialog service and is list-shaped), dropdown is a low-level popover anchored with Floating UI. Use when you want a custom-shaped overlay tied to a specific trigger element without the menu semantics.\n *\n * @element schmancy-dropdown\n * @summary Prefer schmancy-menu for action lists, schmancy-autocomplete for type-ahead, schmancy-tooltip for hover hints. Reach for schmancy-dropdown when none of those fit — custom filters, color pickers, inline forms anchored to a trigger.\n * @example\n * <schmancy-dropdown>\n * <schmancy-button slot=\"trigger\">Filters</schmancy-button>\n * <schmancy-dropdown-content>\n * <schmancy-form>…</schmancy-form>\n * </schmancy-dropdown-content>\n * </schmancy-dropdown>\n * @platform div - Anchored via Floating UI (autoUpdate, flip, shift). Degrades to inline content if the tag never registers — loses positioning but content stays accessible.\n * @attr open - Boolean; whether the dropdown is visible.\n * @fires open - When the dropdown opens.\n * @fires close - When the dropdown closes.\n * @slot trigger - The element that triggers the dropdown\n * @slot - Default slot for the dropdown content\n */\n@customElement('schmancy-dropdown')\nexport class SchmancyDropdown extends $LitElement() {\n\t/**\n\t * Whether the dropdown is currently open\n\t */\n\t@property({ type: Boolean, reflect: true })\n\topen = false\n\n\t/**\n\t * Placement of the dropdown relative to the trigger\n\t */\n\t@property({ type: String })\n\tplacement:\n\t\t| 'top'\n\t\t| 'top-start'\n\t\t| 'top-end'\n\t\t| 'right'\n\t\t| 'right-start'\n\t\t| 'right-end'\n\t\t| 'bottom'\n\t\t| 'bottom-start'\n\t\t| 'bottom-end'\n\t\t| 'left'\n\t\t| 'left-start'\n\t\t| 'left-end' = 'bottom-start'\n\n\t/**\n\t * Offset distance in pixels\n\t */\n\t@property({ type: Number })\n\tdistance = 8\n\n\t@query('.trigger-container') triggerContainer!: HTMLElement\n\t@query('.dropdown-content-container') contentContainer!: HTMLElement\n\t@queryAssignedElements({ flatten: true }) contentElements!: HTMLElement[]\n\t@state() private portal: HTMLElement | null = null\n\n\t@queryAssignedElements({ slot: 'trigger', flatten: true })\n\ttriggerElements!: Array<HTMLElement>\n\n\tprivate cleanupPositioner?: () => void\n\tprivate portalSubscriptions: Subscription[] = []\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback()\n\n\t\t// Create portal container for teleporting content to document body\n\t\tthis.setupPortal()\n\n\t\t// Listen for document clicks to close dropdown when clicking outside\n\t\tfromEvent<MouseEvent>(document, 'click')\n\t\t\t.pipe(\n\t\t\t\tfilter(event => this.open && !this.isEventFromSelf(event)),\n\t\t\t\ttakeUntil(this.disconnecting),\n\t\t\t)\n\t\t\t.subscribe(() => {\n\t\t\t\tthis.open = false\n\t\t\t})\n\n\t\t// Listen for escape key to close dropdown\n\t\tfromEvent<KeyboardEvent>(document, 'keydown')\n\t\t\t.pipe(\n\t\t\t\tfilter(event => this.open && event.key === 'Escape'),\n\t\t\t\ttakeUntil(this.disconnecting),\n\t\t\t)\n\t\t\t.subscribe(() => {\n\t\t\t\tthis.open = false\n\t\t\t})\n\t}\n\n\t/**\n\t * Set up the portal element for teleporting content\n\t */\n\tprivate setupPortal() {\n\t\t// Check if portal container exists\n\t\tlet portalContainer = document.getElementById('schmancy-portal-container')\n\n\t\t// Create portal container if it doesn't exist\n\t\tif (!portalContainer) {\n\t\t\tportalContainer = document.createElement('div')\n\t\t\tportalContainer.id = 'schmancy-portal-container'\n\t\t\tportalContainer.style.position = 'fixed'\n\t\t\tportalContainer.style.zIndex = '10000'\n\t\t\tportalContainer.style.top = '0'\n\t\t\tportalContainer.style.left = '0'\n\t\t\tportalContainer.style.pointerEvents = 'none'\n\t\t\tdocument.body.appendChild(portalContainer)\n\t\t}\n\n\t\t// Create portal for this specific dropdown\n\t\tconst portal = document.createElement('div')\n\t\tportal.className = 'schmancy-dropdown-portal'\n\t\tportal.style.position = 'absolute'\n\t\tportal.style.pointerEvents = 'auto'\n\t\tportal.style.display = 'none'\n\t\tportalContainer.appendChild(portal)\n\n\t\tthis.portal = portal\n\t}\n\n\t/**\n\t * Check if an event originated from within this component\n\t */\n\tprivate isEventFromSelf(event: Event): boolean {\n\t\treturn event.composedPath().some(el => el === this)\n\t}\n\n\tdisconnectedCallback() {\n\t\tthis.cleanupPositioner?.()\n\n\t\t// Clean up portal subscriptions\n\t\tthis.portalSubscriptions.forEach(subscription => subscription.unsubscribe())\n\t\tthis.portalSubscriptions = []\n\n\t\t// Remove portal when component is disconnected\n\t\tif (this.portal) {\n\t\t\tthis.portal.remove()\n\t\t\tthis.portal = null\n\t\t}\n\n\t\tsuper.disconnectedCallback()\n\t}\n\n\t/**\n\t * Toggle the dropdown open state\n\t */\n\ttoggle() {\n\t\tthis.open = !this.open\n\t}\n\n\tupdated(changedProps: Map<string, any>) {\n\t\tsuper.updated(changedProps)\n\n\t\tif (changedProps.has('open')) {\n\t\t\tif (this.open) {\n\t\t\t\tthis.setupPositioner()\n\t\t\t} else {\n\t\t\t\tthis.cleanupPositioner?.()\n\n\t\t\t\t// Hide portal when dropdown is closed\n\t\t\t\tif (this.portal) {\n\t\t\t\t\tthis.portal.style.display = 'none'\n\t\t\t\t\tthis.portal.innerHTML = ''\n\t\t\t\t\t// Clean up subscriptions when content is cleared\n\t\t\t\t\tthis.portalSubscriptions.forEach(subscription => subscription.unsubscribe())\n\t\t\t\t\tthis.portalSubscriptions = []\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Setup floating UI positioning with teleportation\n\t */\n\tprivate setupPositioner() {\n\t\tif (!this.triggerContainer || !this.portal) return\n\n\t\t// Show the portal\n\t\tthis.portal.style.display = 'block'\n\n\t\t// Move content to portal\n\t\tthis.teleportContentToPortal()\n\n\t\t// Setup positioning\n\t\tthis.cleanupPositioner = autoUpdate(this.triggerContainer, this.portal, () => {\n\t\t\tcomputePosition(this.triggerContainer, this.portal, {\n\t\t\t\tplacement: this.placement,\n\t\t\t\tmiddleware: [\n\t\t\t\t\toffset(this.distance),\n\t\t\t\t\tflip({\n\t\t\t\t\t\tfallbackPlacements: ['top-start', 'bottom-start'],\n\t\t\t\t\t}),\n\t\t\t\t\tshift({ padding: 0 }),\n\t\t\t\t],\n\t\t\t}).then(({ x, y }) => {\n\t\t\t\t// Update portal position\n\t\t\t\tObject.assign(this.portal.style, {\n\t\t\t\t\tleft: `${x}px`,\n\t\t\t\t\ttop: `${y - 8}px`,\n\t\t\t\t})\n\t\t\t})\n\t\t})\n\t}\n\n\t/**\n\t * Move slotted content to the portal\n\t */\n\tprivate teleportContentToPortal() {\n\t\tif (!this.portal) return\n\n\t\t// Clean up existing subscriptions\n\t\tthis.portalSubscriptions.forEach(subscription => subscription.unsubscribe())\n\t\tthis.portalSubscriptions = []\n\n\t\t// Clear existing content\n\t\tthis.portal.innerHTML = ''\n\n\t\t// Clone and move slotted content to portal\n\t\tthis.contentElements.forEach(element => {\n\t\t\t// Get computed styles to ensure portal content matches original styling\n\t\t\tconst clonedElement = element.cloneNode(true) as HTMLElement\n\n\t\t\t// Ensure dropdown-content elements maintain their styles when teleported\n\t\t\tif (element.tagName.toLowerCase() === 'schmancy-dropdown-content') {\n\t\t\t\tconst subscription = fromEvent(clonedElement, 'slotchange').subscribe(() => {\n\t\t\t\t\t// Propagate any slot changes to class changes on children\n\t\t\t\t\tconst contentDiv = clonedElement.shadowRoot?.querySelector('[part=\"content\"]')\n\t\t\t\t\tif (contentDiv) {\n\t\t\t\t\t\tcontentDiv.classList.add('schmancy-dropdown-content')\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\tthis.portalSubscriptions.push(subscription)\n\t\t\t}\n\n\t\t\tthis.portal?.appendChild(clonedElement)\n\t\t})\n\t}\n\n\t/**\n\t * Handle trigger click to toggle dropdown\n\t */\n\tprivate handleTriggerClick(e: Event) {\n\t\te.stopPropagation()\n\t\tthis.toggle()\n\t}\n\n\trender() {\n\t\treturn html`\n\t\t\t<div class=\"trigger-container\" @click=${this.handleTriggerClick}>\n\t\t\t\t<slot name=\"trigger\"></slot>\n\t\t\t</div>\n\n\t\t\t<div class=\"dropdown-content-container\" ?hidden=${!this.open}>\n\t\t\t\t<slot\n\t\t\t\t\t@slotchange=${() => {\n\t\t\t\t\t\tif (this.open) {\n\t\t\t\t\t\t\tthis.teleportContentToPortal()\n\t\t\t\t\t\t\tthis.setupPositioner()\n\t\t\t\t\t\t}\n\t\t\t\t\t}}\n\t\t\t\t></slot>\n\t\t\t</div>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-dropdown': SchmancyDropdown\n\t}\n}\n","import { TailwindElement } from '@mixins/index'\nimport { css, html } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\n/**\n * Content panel for a schmancy-dropdown — a styled positioned surface. Always nested inside schmancy-dropdown and placed alongside the trigger slot.\n *\n * @element schmancy-dropdown-content\n * @summary Nest this inside schmancy-dropdown (not in the trigger slot). Use the `content` CSS part to customize backgrounds / shadows / padding without shadow-root piercing.\n * @example\n * <schmancy-dropdown>\n * <schmancy-button slot=\"trigger\">Open</schmancy-button>\n * <schmancy-dropdown-content>\n * Panel contents…\n * </schmancy-dropdown-content>\n * </schmancy-dropdown>\n * @platform div - Positioned panel with theme-aware styling. Degrades to an inline div if the tag never registers.\n * @slot - Default slot for dropdown content.\n * @csspart content - The inner wrapper element; style to override panel backgrounds, shadows, padding, or borders without shadow-root piercing.\n */\n@customElement('schmancy-dropdown-content')\nexport class SchmancyDropdownContent extends TailwindElement(css`\n\t:host {\n\t\tdisplay: block;\n\t\tposition: absolute;\n\t\tz-index: 1000;\n\t\tmin-width: 10rem;\n\t\tmargin: 0;\n\t\ttext-align: left;\n\t\tlist-style: none;\n\t\tbackground-color: var(--schmancy-sys-color-surface-container);\n\t\tbackground-clip: padding-box;\n\t\tborder-radius: 0.375rem;\n\t\tbox-shadow: var(--schmancy-sys-elevation-3);\n\t\twill-change: transform;\n\t\ttransform-origin: top left;\n\t\tanimation: dropdownAnimation 0.1s ease-out forwards;\n\t}\n\n\t:host([hidden]) {\n\t\tdisplay: none;\n\t}\n\n\t@keyframes dropdownAnimation {\n\t\tfrom {\n\t\t\topacity: 0;\n\t\t\ttransform: scale(0.95);\n\t\t}\n\t\tto {\n\t\t\topacity: 1;\n\t\t\ttransform: scale(1);\n\t\t}\n\t}\n\n\t/* Apply styles to content both in the component and when teleported to the portal */\n\t.schmancy-dropdown-content {\n\t\tbackground-color: var(--schmancy-sys-color-surface-container);\n\t\tborder-radius: 0.375rem;\n\t\tbox-shadow: var(--schmancy-sys-elevation-3);\n\t\twill-change: transform;\n\t\ttransform-origin: top left;\n\t\tanimation: dropdownAnimation 0.1s ease-out forwards;\n\t}\n`) {\n\t/**\n\t * Width of the dropdown content\n\t */\n\t@property({ type: String })\n\twidth: string = 'auto'\n\n\t/**\n\t * Maximum height of the dropdown content\n\t */\n\t@property({ type: String })\n\tmaxHeight: string = '80vh'\n\n\t/**\n\t * Whether to render with a shadow\n\t */\n\t@property({ type: Boolean })\n\tshadow: boolean = true\n\n\t/**\n\t * Border radius style\n\t */\n\t@property({ type: String })\n\tradius: 'none' | 'sm' | 'md' | 'lg' | 'full' = 'md'\n\n\trender() {\n\t\tconst classes = {\n\t\t\t'schmancy-dropdown-content': true,\n\t\t\t'overflow-auto': true,\n\t\t\t'shadow-none': !this.shadow,\n\t\t\t'rounded-none': this.radius === 'none',\n\t\t\t'rounded-sm': this.radius === 'sm',\n\t\t\t'rounded-md': this.radius === 'md',\n\t\t\t'rounded-lg': this.radius === 'lg',\n\t\t\t'rounded-full': this.radius === 'full',\n\t\t}\n\n\t\tconst styles = {\n\t\t\twidth: this.width,\n\t\t\tmaxHeight: this.maxHeight,\n\t\t}\n\n\t\treturn html`\n\t\t\t<div class=${this.classMap(classes)} style=${this.styleMap(styles)} part=\"content\">\n\t\t\t\t<slot></slot>\n\t\t\t</div>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-dropdown-content': SchmancyDropdownContent\n\t}\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dropdown.js","names":[],"sources":["../src/dropdown/dropdown-component.ts","../src/dropdown/dropdown-content.ts"],"sourcesContent":["import { autoUpdate, computePosition, flip, offset, shift } from '@floating-ui/dom'\nimport { SchmancyElement } from '@mixins/index'\nimport { html } from 'lit'\nimport { customElement, property, query, queryAssignedElements, state } from 'lit/decorators.js'\nimport { filter, fromEvent, takeUntil, Subscription } from 'rxjs'\n\n/**\n * A dropdown component that displays content when triggered.\n *\n * @element schmancy-dropdown\n * @slot trigger - The element that triggers the dropdown\n * @slot - Default slot for the dropdown content\n */\n@customElement('schmancy-dropdown')\nexport class SchmancyDropdown extends SchmancyElement {\n\t/**\n\t * Whether the dropdown is currently open\n\t */\n\t@property({ type: Boolean, reflect: true })\n\topen = false\n\n\t/**\n\t * Placement of the dropdown relative to the trigger\n\t */\n\t@property({ type: String })\n\tplacement:\n\t\t| 'top'\n\t\t| 'top-start'\n\t\t| 'top-end'\n\t\t| 'right'\n\t\t| 'right-start'\n\t\t| 'right-end'\n\t\t| 'bottom'\n\t\t| 'bottom-start'\n\t\t| 'bottom-end'\n\t\t| 'left'\n\t\t| 'left-start'\n\t\t| 'left-end' = 'bottom-start'\n\n\t/**\n\t * Offset distance in pixels\n\t */\n\t@property({ type: Number })\n\tdistance = 8\n\n\t@query('.trigger-container') triggerContainer!: HTMLElement\n\t@query('.dropdown-content-container') contentContainer!: HTMLElement\n\t@queryAssignedElements({ flatten: true }) contentElements!: HTMLElement[]\n\t@state() private portal: HTMLElement | null = null\n\n\t@queryAssignedElements({ slot: 'trigger', flatten: true })\n\ttriggerElements!: Array<HTMLElement>\n\n\tprivate cleanupPositioner?: () => void\n\tprivate portalSubscriptions: Subscription[] = []\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback()\n\n\t\t// Create portal container for teleporting content to document body\n\t\tthis.setupPortal()\n\n\t\t// Listen for document clicks to close dropdown when clicking outside\n\t\tfromEvent<MouseEvent>(document, 'click')\n\t\t\t.pipe(\n\t\t\t\tfilter(event => this.open && !this.isEventFromSelf(event)),\n\t\t\t\ttakeUntil(this.disconnecting),\n\t\t\t)\n\t\t\t.subscribe(() => {\n\t\t\t\tthis.open = false\n\t\t\t})\n\n\t\t// Listen for escape key to close dropdown\n\t\tfromEvent<KeyboardEvent>(document, 'keydown')\n\t\t\t.pipe(\n\t\t\t\tfilter(event => this.open && event.key === 'Escape'),\n\t\t\t\ttakeUntil(this.disconnecting),\n\t\t\t)\n\t\t\t.subscribe(() => {\n\t\t\t\tthis.open = false\n\t\t\t})\n\t}\n\n\t/**\n\t * Set up the portal element for teleporting content\n\t */\n\tprivate setupPortal() {\n\t\t// Check if portal container exists\n\t\tlet portalContainer = document.getElementById('schmancy-portal-container')\n\n\t\t// Create portal container if it doesn't exist\n\t\tif (!portalContainer) {\n\t\t\tportalContainer = document.createElement('div')\n\t\t\tportalContainer.id = 'schmancy-portal-container'\n\t\t\tportalContainer.style.position = 'fixed'\n\t\t\tportalContainer.style.zIndex = '10000'\n\t\t\tportalContainer.style.top = '0'\n\t\t\tportalContainer.style.left = '0'\n\t\t\tportalContainer.style.pointerEvents = 'none'\n\t\t\tdocument.body.appendChild(portalContainer)\n\t\t}\n\n\t\t// Create portal for this specific dropdown\n\t\tconst portal = document.createElement('div')\n\t\tportal.className = 'schmancy-dropdown-portal'\n\t\tportal.style.position = 'absolute'\n\t\tportal.style.pointerEvents = 'auto'\n\t\tportal.style.display = 'none'\n\t\tportalContainer.appendChild(portal)\n\n\t\tthis.portal = portal\n\t}\n\n\t/**\n\t * Check if an event originated from within this component\n\t */\n\tprivate isEventFromSelf(event: Event): boolean {\n\t\treturn event.composedPath().some(el => el === this)\n\t}\n\n\tdisconnectedCallback() {\n\t\tthis.cleanupPositioner?.()\n\n\t\t// Clean up portal subscriptions\n\t\tthis.portalSubscriptions.forEach(subscription => subscription.unsubscribe())\n\t\tthis.portalSubscriptions = []\n\n\t\t// Remove portal when component is disconnected\n\t\tif (this.portal) {\n\t\t\tthis.portal.remove()\n\t\t\tthis.portal = null\n\t\t}\n\n\t\tsuper.disconnectedCallback()\n\t}\n\n\t/**\n\t * Toggle the dropdown open state\n\t */\n\ttoggle() {\n\t\tthis.open = !this.open\n\t}\n\n\tupdated(changedProps: Map<string, unknown>) {\n\t\tsuper.updated(changedProps)\n\n\t\tif (changedProps.has('open')) {\n\t\t\tif (this.open) {\n\t\t\t\tthis.setupPositioner()\n\t\t\t} else {\n\t\t\t\tthis.cleanupPositioner?.()\n\n\t\t\t\t// Hide portal when dropdown is closed\n\t\t\t\tif (this.portal) {\n\t\t\t\t\tthis.portal.style.display = 'none'\n\t\t\t\t\tthis.portal.innerHTML = ''\n\t\t\t\t\t// Clean up subscriptions when content is cleared\n\t\t\t\t\tthis.portalSubscriptions.forEach(subscription => subscription.unsubscribe())\n\t\t\t\t\tthis.portalSubscriptions = []\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Setup floating UI positioning with teleportation\n\t */\n\tprivate setupPositioner() {\n\t\tif (!this.triggerContainer || !this.portal) return\n\n\t\t// Show the portal\n\t\tthis.portal.style.display = 'block'\n\n\t\t// Move content to portal\n\t\tthis.teleportContentToPortal()\n\n\t\t// Setup positioning\n\t\tthis.cleanupPositioner = autoUpdate(this.triggerContainer, this.portal, () => {\n\t\t\tcomputePosition(this.triggerContainer, this.portal, {\n\t\t\t\tplacement: this.placement,\n\t\t\t\tmiddleware: [\n\t\t\t\t\toffset(this.distance),\n\t\t\t\t\tflip({\n\t\t\t\t\t\tfallbackPlacements: ['top-start', 'bottom-start'],\n\t\t\t\t\t}),\n\t\t\t\t\tshift({ padding: 0 }),\n\t\t\t\t],\n\t\t\t}).then(({ x, y }) => {\n\t\t\t\t// Update portal position\n\t\t\t\tObject.assign(this.portal.style, {\n\t\t\t\t\tleft: `${x}px`,\n\t\t\t\t\ttop: `${y - 8}px`,\n\t\t\t\t})\n\t\t\t\treturn\n\t\t\t})\n\t\t})\n\t}\n\n\t/**\n\t * Move slotted content to the portal\n\t */\n\tprivate teleportContentToPortal() {\n\t\tif (!this.portal) return\n\n\t\t// Clean up existing subscriptions\n\t\tthis.portalSubscriptions.forEach(subscription => subscription.unsubscribe())\n\t\tthis.portalSubscriptions = []\n\n\t\t// Clear existing content\n\t\tthis.portal.innerHTML = ''\n\n\t\t// Clone and move slotted content to portal\n\t\tthis.contentElements.forEach(element => {\n\t\t\t// Get computed styles to ensure portal content matches original styling\n\t\t\tconst clonedElement = element.cloneNode(true) as HTMLElement\n\n\t\t\t// Ensure dropdown-content elements maintain their styles when teleported\n\t\t\tif (element.tagName.toLowerCase() === 'schmancy-dropdown-content') {\n\t\t\t\tconst subscription = fromEvent(clonedElement, 'slotchange').subscribe(() => {\n\t\t\t\t\t// Propagate any slot changes to class changes on children\n\t\t\t\t\tconst contentDiv = clonedElement.shadowRoot?.querySelector('[part=\"content\"]')\n\t\t\t\t\tif (contentDiv) {\n\t\t\t\t\t\tcontentDiv.classList.add('schmancy-dropdown-content')\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\tthis.portalSubscriptions.push(subscription)\n\t\t\t}\n\n\t\t\tthis.portal?.appendChild(clonedElement)\n\t\t})\n\t}\n\n\t/**\n\t * Handle trigger click to toggle dropdown\n\t */\n\tprivate handleTriggerClick(e: Event) {\n\t\te.stopPropagation()\n\t\tthis.toggle()\n\t}\n\n\trender() {\n\t\treturn html`\n\t\t\t<div class=\"trigger-container\" @click=${this.handleTriggerClick}>\n\t\t\t\t<slot name=\"trigger\"></slot>\n\t\t\t</div>\n\n\t\t\t<div class=\"dropdown-content-container\" ?hidden=${!this.open}>\n\t\t\t\t<slot\n\t\t\t\t\t@slotchange=${() => {\n\t\t\t\t\t\tif (this.open) {\n\t\t\t\t\t\t\tthis.teleportContentToPortal()\n\t\t\t\t\t\t\tthis.setupPositioner()\n\t\t\t\t\t\t}\n\t\t\t\t\t}}\n\t\t\t\t></slot>\n\t\t\t</div>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-dropdown': SchmancyDropdown\n\t}\n}\n","import { SchmancyElement } from '@mixins/index'\nimport { css, html } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\n/**\n * Content container for the schmancy-dropdown component.\n *\n * @element schmancy-dropdown-content\n * @slot - Default slot for dropdown content.\n * @csspart content - The inner wrapper element; style to override panel\n * backgrounds, shadows, padding, or borders without shadow-root piercing.\n */\n@customElement('schmancy-dropdown-content')\nexport class SchmancyDropdownContent extends SchmancyElement {\n\tstatic styles = [css`\n\t:host {\n\t\tdisplay: block;\n\t\tposition: absolute;\n\t\tz-index: 1000;\n\t\tmin-width: 10rem;\n\t\tmargin: 0;\n\t\ttext-align: left;\n\t\tlist-style: none;\n\t\tbackground-color: var(--schmancy-sys-color-surface-container);\n\t\tbackground-clip: padding-box;\n\t\tborder-radius: 0.375rem;\n\t\tbox-shadow: var(--schmancy-sys-elevation-3);\n\t\twill-change: transform;\n\t\ttransform-origin: top left;\n\t\tanimation: dropdownAnimation 0.1s ease-out forwards;\n\t}\n\n\t:host([hidden]) {\n\t\tdisplay: none;\n\t}\n\n\t@keyframes dropdownAnimation {\n\t\tfrom {\n\t\t\topacity: 0;\n\t\t\ttransform: scale(0.95);\n\t\t}\n\t\tto {\n\t\t\topacity: 1;\n\t\t\ttransform: scale(1);\n\t\t}\n\t}\n\n\t/* Apply styles to content both in the component and when teleported to the portal */\n\t.schmancy-dropdown-content {\n\t\tbackground-color: var(--schmancy-sys-color-surface-container);\n\t\tborder-radius: 0.375rem;\n\t\tbox-shadow: var(--schmancy-sys-elevation-3);\n\t\twill-change: transform;\n\t\ttransform-origin: top left;\n\t\tanimation: dropdownAnimation 0.1s ease-out forwards;\n\t}\n`];\n\t/**\n\t * Width of the dropdown content\n\t */\n\t@property({ type: String })\n\twidth: string = 'auto'\n\n\t/**\n\t * Maximum height of the dropdown content\n\t */\n\t@property({ type: String })\n\tmaxHeight: string = '80vh'\n\n\t/**\n\t * Whether to render with a shadow\n\t */\n\t@property({ type: Boolean })\n\tshadow: boolean = true\n\n\t/**\n\t * Border radius style\n\t */\n\t@property({ type: String })\n\tradius: 'none' | 'sm' | 'md' | 'lg' | 'full' = 'md'\n\n\trender() {\n\t\tconst classes = {\n\t\t\t'schmancy-dropdown-content': true,\n\t\t\t'overflow-auto': true,\n\t\t\t'shadow-none': !this.shadow,\n\t\t\t'rounded-none': this.radius === 'none',\n\t\t\t'rounded-sm': this.radius === 'sm',\n\t\t\t'rounded-md': this.radius === 'md',\n\t\t\t'rounded-lg': this.radius === 'lg',\n\t\t\t'rounded-full': this.radius === 'full',\n\t\t}\n\n\t\tconst styles = {\n\t\t\twidth: this.width,\n\t\t\tmaxHeight: this.maxHeight,\n\t\t}\n\n\t\treturn html`\n\t\t\t<div class=${this.classMap(classes)} style=${this.styleMap(styles)} part=\"content\">\n\t\t\t\t<slot></slot>\n\t\t\t</div>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-dropdown-content': SchmancyDropdownContent\n\t}\n}\n"],"mappings":"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"}
|