@mhmo91/schmancy 0.9.4 → 0.9.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +13 -0
- package/README.md +14 -4
- package/custom-elements.json +493 -718
- package/dist/.claude-plugin/plugin.json +13 -0
- package/dist/animation-Bcwh107v.cjs.map +1 -0
- package/dist/animation-CXKSuUoE.js.map +1 -0
- package/dist/area-BARjKpE9.js +590 -0
- package/dist/area-BARjKpE9.js.map +1 -0
- package/dist/area-D9b9dHQr.cjs +12 -0
- package/dist/area-D9b9dHQr.cjs.map +1 -0
- package/dist/area.cjs +1 -1
- package/dist/area.js +1 -1
- package/dist/audio-C7TzWI8M.js +335 -0
- package/dist/audio-C7TzWI8M.js.map +1 -0
- package/dist/audio-DUVz7Ars.cjs +1 -0
- package/dist/audio-DUVz7Ars.cjs.map +1 -0
- package/dist/audio.cjs +1 -1
- package/dist/audio.js +2 -2
- package/dist/autocomplete-AI2CCJmK.cjs +115 -0
- package/dist/autocomplete-AI2CCJmK.cjs.map +1 -0
- package/dist/autocomplete-DOimwVMP.js +404 -0
- package/dist/autocomplete-DOimwVMP.js.map +1 -0
- package/dist/autocomplete.cjs +1 -1
- package/dist/autocomplete.js +1 -1
- package/dist/badge.cjs +1 -1
- package/dist/badge.js +1 -1
- package/dist/boat-Bk4u-LzT.cjs +80 -0
- package/dist/boat-Bk4u-LzT.cjs.map +1 -0
- package/dist/boat-DrghVeWK.js +347 -0
- package/dist/boat-DrghVeWK.js.map +1 -0
- package/dist/boat.cjs +1 -1
- package/dist/boat.js +1 -1
- package/dist/breadcrumb.cjs +34 -0
- package/dist/breadcrumb.cjs.map +1 -0
- package/dist/breadcrumb.js +73 -0
- package/dist/breadcrumb.js.map +1 -0
- package/dist/busy-BmFfwyz_.js +168 -0
- package/dist/busy-BmFfwyz_.js.map +1 -0
- package/dist/busy-c_q_F8O0.cjs +134 -0
- package/dist/busy-c_q_F8O0.cjs.map +1 -0
- package/dist/busy.cjs +1 -1
- package/dist/busy.js +1 -1
- package/dist/button.cjs +4 -4
- package/dist/button.cjs.map +1 -1
- package/dist/button.js +25 -6
- package/dist/button.js.map +1 -1
- package/dist/card-BADJHUMA.js +285 -0
- package/dist/card-BADJHUMA.js.map +1 -0
- package/dist/card-C_E944_Z.cjs +177 -0
- package/dist/card-C_E944_Z.cjs.map +1 -0
- package/dist/card.cjs +1 -1
- package/dist/card.js +1 -1
- package/dist/charts.cjs +3 -3
- package/dist/charts.cjs.map +1 -1
- package/dist/charts.js +2 -2
- package/dist/checkbox-D7rvCrGk.js +629 -0
- package/dist/checkbox-D7rvCrGk.js.map +1 -0
- package/dist/checkbox-ZqDoCagB.cjs +39 -0
- package/dist/checkbox-ZqDoCagB.cjs.map +1 -0
- package/dist/checkbox.cjs +1 -1
- package/dist/checkbox.js +1 -1
- package/dist/chips-Cux635Qs.cjs +253 -0
- package/dist/chips-Cux635Qs.cjs.map +1 -0
- package/dist/chips-vdzIsesI.js +655 -0
- package/dist/chips-vdzIsesI.js.map +1 -0
- package/dist/chips.cjs +1 -1
- package/dist/chips.js +2 -2
- package/dist/code-highlight-C9lKek2p.cjs +190 -0
- package/dist/code-highlight-C9lKek2p.cjs.map +1 -0
- package/dist/code-highlight-D6yruol6.js +291 -0
- package/dist/code-highlight-D6yruol6.js.map +1 -0
- package/dist/code-highlight.cjs +1 -1
- package/dist/code-highlight.js +1 -1
- package/dist/components-ByRyEzz5.cjs +73 -0
- package/dist/components-ByRyEzz5.cjs.map +1 -0
- package/dist/components-DSvPKR9Q.js +730 -0
- package/dist/components-DSvPKR9Q.js.map +1 -0
- package/dist/components.cjs +1 -1
- package/dist/components.js +1 -1
- package/dist/connectivity.cjs +7 -7
- package/dist/connectivity.cjs.map +1 -1
- package/dist/connectivity.js +5 -4
- package/dist/connectivity.js.map +1 -1
- package/dist/content-drawer.cjs +1 -1
- package/dist/content-drawer.js +1 -1
- package/dist/cursor-glow-82y5h3E4.cjs +1 -0
- package/dist/cursor-glow-82y5h3E4.cjs.map +1 -0
- package/dist/cursor-glow-C2YRrB8Z.js +46 -0
- package/dist/cursor-glow-C2YRrB8Z.js.map +1 -0
- package/dist/date-range-DJsavigf.cjs +131 -0
- package/dist/date-range-DJsavigf.cjs.map +1 -0
- package/dist/date-range-inline-B87TDYI6.js +267 -0
- package/dist/date-range-inline-B87TDYI6.js.map +1 -0
- package/dist/date-range-inline-De-M0VmL.cjs +43 -0
- package/dist/date-range-inline-De-M0VmL.cjs.map +1 -0
- package/dist/date-range-inline.cjs +1 -1
- package/dist/date-range-inline.js +1 -1
- package/dist/date-range-tEX2Jx2j.js +946 -0
- package/dist/date-range-tEX2Jx2j.js.map +1 -0
- package/dist/date-range.cjs +1 -1
- package/dist/date-range.js +1 -1
- package/dist/delay-BvVdfhAR.cjs +9 -0
- package/dist/delay-BvVdfhAR.cjs.map +1 -0
- package/dist/delay-CZw37zps.js +347 -0
- package/dist/delay-CZw37zps.js.map +1 -0
- package/dist/delay.cjs +1 -1
- package/dist/delay.js +1 -1
- package/dist/details-Bhz8_whd.cjs +168 -0
- package/dist/details-Bhz8_whd.cjs.map +1 -0
- package/dist/details-D7VTnLOh.js +294 -0
- package/dist/details-D7VTnLOh.js.map +1 -0
- package/dist/details.cjs +1 -1
- package/dist/details.js +1 -1
- package/dist/dialog-service-ClFrOWf4.js +193 -0
- package/dist/dialog-service-ClFrOWf4.js.map +1 -0
- package/dist/dialog-service-DcuAavp2.cjs +1 -0
- package/dist/dialog-service-DcuAavp2.cjs.map +1 -0
- package/dist/dialog.cjs +18 -11
- package/dist/dialog.cjs.map +1 -1
- package/dist/dialog.js +66 -43
- package/dist/dialog.js.map +1 -1
- package/dist/directives.cjs +1 -1
- package/dist/directives.js +5 -5
- package/dist/divider-S0bHwCCS.cjs +57 -0
- package/dist/divider-S0bHwCCS.cjs.map +1 -0
- package/dist/divider-zS232JDr.js +87 -0
- package/dist/divider-zS232JDr.js.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 +8 -7
- package/dist/dropdown.js.map +1 -1
- package/dist/expand-BXt9SqAF.js +337 -0
- package/dist/expand-BXt9SqAF.js.map +1 -0
- package/dist/expand-Dr7TFXpl.cjs +141 -0
- package/dist/expand-Dr7TFXpl.cjs.map +1 -0
- package/dist/expand.cjs +1 -1
- package/dist/expand.js +1 -1
- package/dist/extra-BmZTXAp0.cjs +31 -0
- package/dist/extra-BmZTXAp0.cjs.map +1 -0
- package/dist/extra-COYhsOyZ.js +3435 -0
- package/dist/extra-COYhsOyZ.js.map +1 -0
- package/dist/extra.cjs +1 -1
- package/dist/extra.js +1 -1
- package/dist/float-CSRW-Rrd.cjs +1 -0
- package/dist/float-CSRW-Rrd.cjs.map +1 -0
- package/dist/float-DCXafWh6.js +5 -0
- package/dist/float-DCXafWh6.js.map +1 -0
- package/dist/float.cjs +1 -1
- package/dist/float.js +1 -1
- package/dist/flow-CqgDEIqK.js.map +1 -0
- package/dist/flow-DSu4PLt1.cjs.map +1 -0
- package/dist/form-CAY9GSCd.cjs +1 -0
- package/dist/form-CAY9GSCd.cjs.map +1 -0
- package/dist/form-D2cJ58TB.js +68 -0
- package/dist/form-D2cJ58TB.js.map +1 -0
- package/dist/form.cjs +1 -1
- package/dist/form.js +2 -1
- package/dist/hashContent-kKvXKFa9.cjs.map +1 -0
- package/dist/hashContent-nD2uWwi2.js.map +1 -0
- package/dist/icons-BbaI9Zf-.js +162 -0
- package/dist/icons-BbaI9Zf-.js.map +1 -0
- package/dist/icons-DPUeLS_Y.cjs +52 -0
- package/dist/icons-DPUeLS_Y.cjs.map +1 -0
- package/dist/icons.cjs +1 -1
- package/dist/icons.js +1 -1
- package/dist/iframe-CEDOvkql.js +45 -0
- package/dist/iframe-CEDOvkql.js.map +1 -0
- package/dist/iframe-Ct50FYXq.cjs +24 -0
- package/dist/iframe-Ct50FYXq.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 +65 -59
- package/dist/input-DMjpf6V8.cjs +51 -0
- package/dist/input-DMjpf6V8.cjs.map +1 -0
- package/dist/input-Ri72dn5t.js +364 -0
- package/dist/input-Ri72dn5t.js.map +1 -0
- package/dist/input-chip-BhjGVpc3.cjs +146 -0
- package/dist/input-chip-BhjGVpc3.cjs.map +1 -0
- package/dist/input-chip-CI4__N8w.js +305 -0
- package/dist/input-chip-CI4__N8w.js.map +1 -0
- package/dist/input.cjs +1 -1
- package/dist/input.js +1 -1
- package/dist/intersection-D1v1UCVv.cjs.map +1 -0
- package/dist/intersection-LfEsy29T.js.map +1 -0
- package/dist/json.cjs +3 -3
- package/dist/json.cjs.map +1 -1
- package/dist/json.js +5 -4
- package/dist/json.js.map +1 -1
- package/dist/kbd.cjs +28 -0
- package/dist/kbd.cjs.map +1 -0
- package/dist/kbd.js +45 -0
- package/dist/kbd.js.map +1 -0
- package/dist/layout-BE2ld1IY.js +94 -0
- package/dist/layout-BE2ld1IY.js.map +1 -0
- package/dist/layout-D7xOqMkJ.cjs +17 -0
- package/dist/layout-D7xOqMkJ.cjs.map +1 -0
- package/dist/layout-PZCF3kwl.cjs +1 -0
- package/dist/layout-PZCF3kwl.cjs.map +1 -0
- package/dist/layout-uAQpJN31.js +268 -0
- package/dist/layout-uAQpJN31.js.map +1 -0
- package/dist/layout.cjs +1 -1
- package/dist/layout.js +2 -2
- package/dist/lightbox-C0OEHns9.js +679 -0
- package/dist/lightbox-C0OEHns9.js.map +1 -0
- package/dist/lightbox-cXRnvHMN.cjs +202 -0
- package/dist/lightbox-cXRnvHMN.cjs.map +1 -0
- package/dist/lightbox.cjs +1 -1
- package/dist/lightbox.js +1 -1
- package/dist/list-CmJ5h35b.cjs +40 -0
- package/dist/list-CmJ5h35b.cjs.map +1 -0
- package/dist/list-d1mHar5p.js +106 -0
- package/dist/list-d1mHar5p.js.map +1 -0
- package/dist/list.cjs +1 -1
- package/dist/list.js +1 -1
- package/dist/litElement.mixin-Bj2q1yPw.cjs +1 -0
- package/dist/litElement.mixin-Bj2q1yPw.cjs.map +1 -0
- package/dist/litElement.mixin-CncaUoxz.js +12 -0
- package/dist/litElement.mixin-CncaUoxz.js.map +1 -0
- package/dist/magnetic-Dj52WplI.js +47 -0
- package/dist/magnetic-Dj52WplI.js.map +1 -0
- package/dist/magnetic-aBBnj_vk.cjs +1 -0
- package/dist/magnetic-aBBnj_vk.cjs.map +1 -0
- package/dist/mailbox-BmChskZc.cjs +1142 -0
- package/dist/mailbox-BmChskZc.cjs.map +1 -0
- package/dist/mailbox-C4-E93be.js +1585 -0
- package/dist/mailbox-C4-E93be.js.map +1 -0
- package/dist/mailbox.cjs +1 -1
- package/dist/mailbox.js +1 -1
- package/dist/map-DHyYLhvy.js +206 -0
- package/dist/map-DHyYLhvy.js.map +1 -0
- package/dist/map-DYEvlNl0.cjs +80 -0
- package/dist/map-DYEvlNl0.cjs.map +1 -0
- package/dist/map.cjs +1 -1
- package/dist/map.js +1 -1
- package/dist/menu-BlPTI6H9.cjs +23 -0
- package/dist/menu-BlPTI6H9.cjs.map +1 -0
- package/dist/menu-DFDBADp4.js +51 -0
- package/dist/menu-DFDBADp4.js.map +1 -0
- package/dist/menu.cjs +1 -1
- package/dist/menu.js +1 -1
- package/dist/mixins.cjs +1 -1
- package/dist/mixins.cjs.map +1 -1
- package/dist/mixins.js +43 -15
- package/dist/mixins.js.map +1 -1
- package/dist/nav-drawer.cjs +1 -1
- package/dist/nav-drawer.js +1 -1
- package/dist/navigation-bar.cjs +1 -1
- package/dist/navigation-bar.js +1 -1
- package/dist/navigation-rail.cjs +3 -3
- package/dist/navigation-rail.cjs.map +1 -1
- package/dist/navigation-rail.js +2 -2
- package/dist/notification-DGpv8g2H.js +304 -0
- package/dist/notification-DGpv8g2H.js.map +1 -0
- package/dist/notification-DKVWYhqs.cjs +23 -0
- package/dist/notification-DKVWYhqs.cjs.map +1 -0
- package/dist/notification.cjs +1 -1
- package/dist/notification.js +1 -1
- package/dist/option-BD2eh458.js +98 -0
- package/dist/option-BD2eh458.js.map +1 -0
- package/dist/option-LtSDy2xf.cjs +43 -0
- package/dist/option-LtSDy2xf.cjs.map +1 -0
- package/dist/option.cjs +1 -1
- package/dist/option.js +1 -1
- package/dist/overlay-stack-CEYGD9T1.cjs.map +1 -0
- package/dist/overlay-stack-Ca4EK2Mu.js.map +1 -0
- package/dist/page.cjs +2 -2
- package/dist/page.cjs.map +1 -1
- package/dist/page.js +5 -5
- package/dist/progress-B5ChDPbB.cjs +51 -0
- package/dist/progress-B5ChDPbB.cjs.map +1 -0
- package/dist/progress-CE1Pk2hi.js +128 -0
- package/dist/progress-CE1Pk2hi.js.map +1 -0
- package/dist/progress.cjs +1 -1
- package/dist/progress.js +1 -1
- package/dist/provide-BZ9lq_Be.cjs +1 -0
- package/dist/provide-BZ9lq_Be.cjs.map +1 -0
- package/dist/provide-jn1Fj1vv.js +107 -0
- package/dist/provide-jn1Fj1vv.js.map +1 -0
- package/dist/qr-scanner.cjs +2 -2
- package/dist/qr-scanner.cjs.map +1 -1
- package/dist/qr-scanner.js +2 -2
- package/dist/radio-group-Cd9pZ2MR.cjs +40 -0
- package/dist/radio-group-Cd9pZ2MR.cjs.map +1 -0
- package/dist/radio-group-CyRHgIF3.js +106 -0
- package/dist/radio-group-CyRHgIF3.js.map +1 -0
- package/dist/radio-group.cjs +1 -1
- package/dist/radio-group.js +1 -1
- package/dist/range.cjs +4 -4
- package/dist/range.cjs.map +1 -1
- package/dist/range.js +4 -3
- package/dist/range.js.map +1 -1
- package/dist/reduced-motion-B83yZbcO.js.map +1 -0
- package/dist/reduced-motion-DR32yKEO.cjs.map +1 -0
- package/dist/rxjs-utils-Bldch1RO.js.map +1 -0
- package/dist/rxjs-utils-hAgKC7vk.cjs.map +1 -0
- package/dist/rxjs-utils.cjs +1 -1
- package/dist/rxjs-utils.js +1 -1
- package/dist/scroll-C_iNOi7E.cjs +26 -0
- package/dist/scroll-C_iNOi7E.cjs.map +1 -0
- package/dist/scroll-DoliwpRu.js +113 -0
- package/dist/scroll-DoliwpRu.js.map +1 -0
- package/dist/search-BlGJ6uJv.js.map +1 -0
- package/dist/search-C8eAOzBm.cjs.map +1 -0
- package/dist/select-CWWuZ2iJ.cjs +56 -0
- package/dist/select-CWWuZ2iJ.cjs.map +1 -0
- package/dist/select-_vHPXi30.js +305 -0
- package/dist/select-_vHPXi30.js.map +1 -0
- package/dist/select.cjs +1 -1
- package/dist/select.js +1 -1
- package/dist/sheet-i1KtxGIj.js +168 -0
- package/dist/sheet-i1KtxGIj.js.map +1 -0
- package/dist/sheet-r0oEYIdi.cjs +35 -0
- package/dist/sheet-r0oEYIdi.cjs.map +1 -0
- package/dist/sheet.cjs +1 -1
- package/dist/sheet.js +2 -2
- package/dist/sheet.service-Cr13Oo6G.cjs +1 -0
- package/dist/sheet.service-Cr13Oo6G.cjs.map +1 -0
- package/dist/sheet.service-DUO5_kmI.js +86 -0
- package/dist/sheet.service-DUO5_kmI.js.map +1 -0
- package/dist/skeleton.cjs +33 -0
- package/dist/skeleton.cjs.map +1 -0
- package/dist/skeleton.js +58 -0
- package/dist/skeleton.js.map +1 -0
- package/dist/skills/INDEX.md +73 -0
- package/dist/skills/SKILL.md +120 -0
- package/dist/skills/breadcrumb.md +53 -0
- package/dist/skills/kbd.md +40 -0
- package/dist/skills/schmancy/INDEX.md +73 -0
- package/dist/skills/schmancy/SKILL.md +120 -0
- package/dist/skills/schmancy/breadcrumb.md +53 -0
- package/dist/skills/schmancy/kbd.md +40 -0
- package/dist/skills/schmancy/skeleton.md +40 -0
- package/dist/skills/schmancy/splash-screen.md +60 -0
- package/dist/skills/schmancy/switch.md +58 -0
- package/dist/skills/schmancy/tooltip.md +38 -0
- package/dist/skills/schmancy/visually-hidden.md +41 -0
- package/dist/skills/skeleton.md +40 -0
- package/dist/skills/splash-screen.md +60 -0
- package/dist/skills/switch.md +58 -0
- package/dist/skills/tooltip.md +38 -0
- package/dist/skills/visually-hidden.md +41 -0
- package/dist/slider.cjs +3 -3
- package/dist/slider.cjs.map +1 -1
- package/dist/slider.js +2 -2
- package/dist/sound.service-BjSoGjmT.cjs +1 -0
- package/dist/sound.service-BjSoGjmT.cjs.map +1 -0
- package/dist/sound.service-cdkw3Wkv.js +2353 -0
- package/dist/sound.service-cdkw3Wkv.js.map +1 -0
- package/dist/splash-screen-CquyPP1C.cjs +41 -0
- package/dist/splash-screen-CquyPP1C.cjs.map +1 -0
- package/dist/splash-screen-CvucPkpD.js +83 -0
- package/dist/splash-screen-CvucPkpD.js.map +1 -0
- package/dist/splash-screen.cjs +1 -0
- package/dist/splash-screen.js +1 -0
- package/dist/src-Bemk2C2P.cjs +269 -0
- package/dist/src-Bemk2C2P.cjs.map +1 -0
- package/dist/src-f5a3W9Mj.js +1251 -0
- package/dist/src-f5a3W9Mj.js.map +1 -0
- package/dist/steps.cjs +10 -10
- package/dist/steps.cjs.map +1 -1
- package/dist/steps.js +10 -9
- package/dist/steps.js.map +1 -1
- package/dist/store-Bmj6rvZY.js.map +1 -0
- package/dist/store-CO4nJyGj.cjs.map +1 -0
- package/dist/store.cjs +1 -1
- package/dist/store.js +1 -1
- package/dist/surface-CDufon40.cjs +7 -0
- package/dist/surface-CDufon40.cjs.map +1 -0
- package/dist/surface-CkEYJCae.js +22 -0
- package/dist/surface-CkEYJCae.js.map +1 -0
- package/dist/surface.cjs +1 -1
- package/dist/surface.js +1 -1
- package/dist/surface.mixin-CSKqQH-0.cjs +297 -0
- package/dist/surface.mixin-CSKqQH-0.cjs.map +1 -0
- package/dist/surface.mixin-DqMwoddO.js +320 -0
- package/dist/surface.mixin-DqMwoddO.js.map +1 -0
- package/dist/switch.cjs +69 -0
- package/dist/switch.cjs.map +1 -0
- package/dist/switch.js +132 -0
- package/dist/switch.js.map +1 -0
- package/dist/table-DWc1mkpj.cjs +63 -0
- package/dist/table-DWc1mkpj.cjs.map +1 -0
- package/dist/table-P6VGG7NK.js +631 -0
- package/dist/table-P6VGG7NK.js.map +1 -0
- package/dist/table.cjs +1 -1
- package/dist/table.js +1 -1
- package/dist/tabs-CjGjGrqY.js +126 -0
- package/dist/tabs-CjGjGrqY.js.map +1 -0
- package/dist/tabs-DGJEKuhC.cjs +31 -0
- package/dist/tabs-DGJEKuhC.cjs.map +1 -0
- package/dist/tabs.cjs +1 -1
- package/dist/tabs.js +1 -1
- package/dist/tailwind.mixin-Cpa-VnnX.cjs +2 -0
- package/dist/tailwind.mixin-Cpa-VnnX.cjs.map +1 -0
- package/dist/tailwind.mixin-DufHBjmb.js +219 -0
- package/dist/tailwind.mixin-DufHBjmb.js.map +1 -0
- package/dist/teleport.cjs +1 -1
- package/dist/teleport.js +1 -1
- package/dist/textarea-DZT_Ofp5.js +209 -0
- package/dist/textarea-DZT_Ofp5.js.map +1 -0
- package/dist/textarea-jmTOXrzl.cjs +39 -0
- package/dist/textarea-jmTOXrzl.cjs.map +1 -0
- package/dist/textarea.cjs +1 -1
- package/dist/textarea.js +1 -1
- package/dist/theme-CCKqaksQ.cjs +181 -0
- package/dist/theme-CCKqaksQ.cjs.map +1 -0
- package/dist/theme-CEc32pAv.js +4122 -0
- package/dist/theme-CEc32pAv.js.map +1 -0
- package/dist/theme-button-BsJcv-Zv.cjs +8 -0
- package/dist/theme-button-BsJcv-Zv.cjs.map +1 -0
- package/dist/theme-button-dOiAvdKU.js +20 -0
- package/dist/theme-button-dOiAvdKU.js.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-Bw3mYjUA.js.map +1 -0
- package/dist/theme.events-EznKK2Y0.cjs.map +1 -0
- package/dist/theme.interface-CM26m9te.cjs.map +1 -0
- package/dist/theme.interface-FAUIgbIq.js.map +1 -0
- package/dist/theme.js +5 -5
- package/dist/theme.service-ETiKUwVy.cjs +1 -0
- package/dist/theme.service-ETiKUwVy.cjs.map +1 -0
- package/dist/theme.service-_qP5WvB9.js +108 -0
- package/dist/theme.service-_qP5WvB9.js.map +1 -0
- package/dist/tooltip.cjs +1 -6
- package/dist/tooltip.cjs.map +1 -1
- package/dist/tooltip.js +51 -135
- package/dist/tooltip.js.map +1 -1
- package/dist/tree.cjs +14 -5
- package/dist/tree.cjs.map +1 -1
- package/dist/tree.js +28 -6
- package/dist/tree.js.map +1 -1
- package/dist/tslib.es6-Bd-92OW3.cjs +1 -0
- package/dist/tslib.es6-Bd-92OW3.cjs.map +1 -0
- package/dist/tslib.es6-CI1onEZb.js +7 -0
- package/dist/tslib.es6-CI1onEZb.js.map +1 -0
- package/dist/typewriter-ByIL2Mh-.cjs +123 -0
- package/dist/typewriter-ByIL2Mh-.cjs.map +1 -0
- package/dist/typewriter-vOQ3bDLb.js +701 -0
- package/dist/typewriter-vOQ3bDLb.js.map +1 -0
- package/dist/typewriter.cjs +1 -1
- package/dist/typewriter.js +1 -1
- package/dist/typography.cjs +4 -4
- package/dist/typography.cjs.map +1 -1
- package/dist/typography.js +10 -9
- package/dist/typography.js.map +1 -1
- package/dist/utils-Cq0m3LYo.js +259 -0
- package/dist/utils-Cq0m3LYo.js.map +1 -0
- package/dist/utils-D2kE-6zc.cjs +1 -0
- package/dist/utils-D2kE-6zc.cjs.map +1 -0
- package/dist/utils.cjs +1 -1
- package/dist/utils.js +5 -5
- package/dist/visually-hidden.cjs +13 -0
- package/dist/visually-hidden.cjs.map +1 -0
- package/dist/visually-hidden.js +24 -0
- package/dist/visually-hidden.js.map +1 -0
- package/dist/window-BS7ZQjgH.cjs +59 -0
- package/dist/window-BS7ZQjgH.cjs.map +1 -0
- package/dist/window-WnAihpsA.js +548 -0
- package/dist/window-WnAihpsA.js.map +1 -0
- package/dist/window.cjs +1 -1
- package/dist/window.js +1 -1
- package/mixins/formField.mixin.ts +96 -69
- package/mixins/tailwind.css +11 -0
- package/package.json +19 -28
- package/skills/schmancy/INDEX.md +73 -0
- package/skills/schmancy/SKILL.md +120 -0
- package/skills/schmancy/animation.md +64 -0
- package/skills/schmancy/area.md +141 -0
- package/skills/schmancy/audio.md +69 -0
- package/skills/schmancy/autocomplete.md +53 -0
- package/skills/schmancy/avatar.md +47 -0
- package/skills/schmancy/badge.md +41 -0
- package/skills/schmancy/boat.md +47 -0
- package/skills/schmancy/breadcrumb.md +53 -0
- package/skills/schmancy/busy.md +36 -0
- package/skills/schmancy/button.md +59 -0
- package/skills/schmancy/card.md +53 -0
- package/skills/schmancy/charts.md +93 -0
- package/skills/schmancy/checkbox.md +36 -0
- package/skills/schmancy/chips.md +87 -0
- package/skills/schmancy/code-highlight.md +47 -0
- package/skills/schmancy/connectivity.md +36 -0
- package/skills/schmancy/content-drawer.md +65 -0
- package/skills/schmancy/date-range-inline.md +44 -0
- package/skills/schmancy/date-range.md +50 -0
- package/skills/schmancy/delay.md +50 -0
- package/skills/schmancy/details.md +66 -0
- package/skills/schmancy/dialog.md +69 -0
- package/skills/schmancy/directives.md +298 -0
- package/skills/schmancy/discovery.md +67 -0
- package/skills/schmancy/divider.md +31 -0
- package/skills/schmancy/dropdown.md +47 -0
- package/skills/schmancy/expand.md +63 -0
- package/skills/schmancy/extra.md +59 -0
- package/skills/schmancy/float.md +14 -0
- package/skills/schmancy/form.md +49 -0
- package/skills/schmancy/icons.md +44 -0
- package/skills/schmancy/iframe.md +44 -0
- package/skills/schmancy/input.md +56 -0
- package/skills/schmancy/json.md +33 -0
- package/skills/schmancy/kbd.md +40 -0
- package/skills/schmancy/layout.md +63 -0
- package/skills/schmancy/lightbox.md +36 -0
- package/skills/schmancy/list.md +67 -0
- package/skills/schmancy/mailbox.md +102 -0
- package/skills/schmancy/map.md +55 -0
- package/skills/schmancy/menu.md +39 -0
- package/skills/schmancy/mixins.md +99 -0
- package/skills/schmancy/nav-drawer.md +52 -0
- package/skills/schmancy/navigation-bar.md +48 -0
- package/skills/schmancy/navigation-rail.md +62 -0
- package/skills/schmancy/notification.md +60 -0
- package/skills/schmancy/option.md +43 -0
- package/skills/schmancy/page.md +42 -0
- package/skills/schmancy/progress.md +30 -0
- package/skills/schmancy/qr-scanner.md +51 -0
- package/skills/schmancy/radio-group.md +50 -0
- package/skills/schmancy/range.md +47 -0
- package/skills/schmancy/rxjs-utils.md +60 -0
- package/skills/schmancy/select.md +49 -0
- package/skills/schmancy/sheet.md +76 -0
- package/skills/schmancy/skeleton.md +40 -0
- package/skills/schmancy/slider.md +43 -0
- package/skills/schmancy/splash-screen.md +60 -0
- package/skills/schmancy/steps.md +53 -0
- package/skills/schmancy/store.md +126 -0
- package/skills/schmancy/surface.md +86 -0
- package/skills/schmancy/switch.md +58 -0
- package/skills/schmancy/table.md +60 -0
- package/skills/schmancy/tabs.md +49 -0
- package/skills/schmancy/teleport.md +55 -0
- package/skills/schmancy/textarea.md +48 -0
- package/skills/schmancy/theme-button.md +26 -0
- package/skills/schmancy/theme.md +58 -0
- package/skills/schmancy/tooltip.md +38 -0
- package/skills/schmancy/tree.md +53 -0
- package/skills/schmancy/typewriter.md +46 -0
- package/skills/schmancy/typography.md +53 -0
- package/skills/schmancy/utils.md +95 -0
- package/skills/schmancy/visually-hidden.md +41 -0
- package/skills/schmancy/window.md +67 -0
- package/src/audio/emotional-sounds.ts +2 -4
- package/src/autocomplete/autocomplete.ts +52 -2
- package/src/breadcrumb/breadcrumb.ts +109 -0
- package/src/breadcrumb/index.ts +1 -0
- package/src/button/button.ts +40 -0
- package/src/button/icon-button.ts +2 -1
- package/src/checkbox/checkbox.test.ts +113 -0
- package/src/checkbox/checkbox.ts +41 -1
- package/src/chips/filter-chip.ts +15 -0
- package/src/chips/input-chip.ts +7 -0
- package/src/date-range/date-range-helpers.ts +0 -71
- package/src/dialog/dialog-base.mixin.ts +11 -0
- package/src/dialog/dialog.component.ts +28 -8
- package/src/dropdown/dropdown-content.ts +3 -1
- package/src/form/form.test.ts +137 -0
- package/src/form/form.ts +142 -158
- package/src/form/index.ts +2 -2
- package/src/icons/icon.ts +1 -0
- package/src/index.ts +6 -0
- package/src/kbd/index.ts +1 -0
- package/src/kbd/kbd.ts +59 -0
- package/src/skeleton/index.ts +1 -0
- package/src/skeleton/skeleton.ts +78 -0
- package/src/splash-screen/index.ts +1 -0
- package/src/splash-screen/splash-screen.ts +154 -0
- package/src/switch/index.ts +1 -0
- package/src/switch/switch.test.ts +93 -0
- package/src/switch/switch.ts +180 -0
- package/src/test-utils/a11y.ts +35 -0
- package/src/textarea/textarea.ts +32 -2
- package/src/tooltip/index.ts +1 -2
- package/src/tree/tree.ts +27 -2
- package/src/visually-hidden/index.ts +1 -0
- package/src/visually-hidden/visually-hidden.ts +39 -0
- package/src/window/window-position.ts +1 -74
- package/types/mixins/formField.mixin.d.ts +15 -8
- package/types/src/audio/emotional-sounds.d.ts +0 -2
- package/types/src/autocomplete/autocomplete.d.ts +7 -0
- package/types/src/breadcrumb/breadcrumb.d.ts +38 -0
- package/types/src/breadcrumb/index.d.ts +1 -0
- package/types/src/button/button.d.ts +7 -0
- package/types/src/button/icon-button.d.ts +2 -1
- package/types/src/checkbox/checkbox.d.ts +6 -0
- package/types/src/checkbox/checkbox.test.d.ts +1 -0
- package/types/src/chips/filter-chip.d.ts +3 -0
- package/types/src/chips/input-chip.d.ts +1 -0
- package/types/src/date-range/date-range-helpers.d.ts +0 -12
- package/types/src/dialog/dialog.component.d.ts +6 -0
- package/types/src/dropdown/dropdown-content.d.ts +3 -1
- package/types/src/form/form-v2.d.ts +12 -63
- package/types/src/form/form.d.ts +58 -40
- package/types/src/form/form.test.d.ts +4 -0
- package/types/src/form/index.d.ts +1 -1
- package/types/src/icons/icon.d.ts +1 -0
- package/types/src/index.d.ts +6 -0
- package/types/src/kbd/index.d.ts +1 -0
- package/types/src/kbd/kbd.d.ts +25 -0
- package/types/src/skeleton/index.d.ts +1 -0
- package/types/src/skeleton/skeleton.d.ts +27 -0
- package/types/src/splash-screen/index.d.ts +1 -0
- package/types/src/splash-screen/splash-screen.d.ts +60 -0
- package/types/src/switch/index.d.ts +1 -0
- package/types/src/switch/switch.d.ts +54 -0
- package/types/src/switch/switch.test.d.ts +1 -0
- package/types/src/test-utils/a11y.d.ts +11 -0
- package/types/src/textarea/textarea.d.ts +5 -1
- package/types/src/tooltip/index.d.ts +0 -1
- package/types/src/tree/tree.d.ts +5 -0
- package/types/src/visually-hidden/index.d.ts +1 -0
- package/types/src/visually-hidden/visually-hidden.d.ts +21 -0
- package/types/src/window/window-position.d.ts +1 -35
- package/ai/INDEX.md +0 -72
- package/ai/tooltip.md +0 -38
- package/dist/ai/INDEX.md +0 -72
- package/dist/ai/tooltip.md +0 -38
- package/dist/animation-BK-8BwY8.js.map +0 -1
- package/dist/animation-CO_Csq84.cjs.map +0 -1
- package/dist/area-CRoGqD_u.js +0 -590
- package/dist/area-CRoGqD_u.js.map +0 -1
- package/dist/area-JPykB7A9.cjs +0 -12
- package/dist/area-JPykB7A9.cjs.map +0 -1
- package/dist/audio-DtYYgzYD.cjs +0 -1
- package/dist/audio-DtYYgzYD.cjs.map +0 -1
- package/dist/audio-kz8UgPTO.js +0 -335
- package/dist/audio-kz8UgPTO.js.map +0 -1
- package/dist/autocomplete-5rVhbieU.cjs +0 -111
- package/dist/autocomplete-5rVhbieU.cjs.map +0 -1
- package/dist/autocomplete-BllPQwr8.js +0 -378
- package/dist/autocomplete-BllPQwr8.js.map +0 -1
- package/dist/boat-BDTQ-du9.js +0 -347
- package/dist/boat-BDTQ-du9.js.map +0 -1
- package/dist/boat-DYEAZ8Qj.cjs +0 -80
- package/dist/boat-DYEAZ8Qj.cjs.map +0 -1
- package/dist/busy-ChDAeaKF.js +0 -167
- package/dist/busy-ChDAeaKF.js.map +0 -1
- package/dist/busy-Dj7Xn0Z0.cjs +0 -134
- package/dist/busy-Dj7Xn0Z0.cjs.map +0 -1
- package/dist/card-BvPWVEJX.cjs +0 -177
- package/dist/card-BvPWVEJX.cjs.map +0 -1
- package/dist/card-DZFPRPqs.js +0 -284
- package/dist/card-DZFPRPqs.js.map +0 -1
- package/dist/checkbox-BC_37rsG.cjs +0 -39
- package/dist/checkbox-BC_37rsG.cjs.map +0 -1
- package/dist/checkbox-GSSjqo6w.js +0 -610
- package/dist/checkbox-GSSjqo6w.js.map +0 -1
- package/dist/chips-B19XS8Xc.cjs +0 -253
- package/dist/chips-B19XS8Xc.cjs.map +0 -1
- package/dist/chips-B9oAEfE_.js +0 -645
- package/dist/chips-B9oAEfE_.js.map +0 -1
- package/dist/code-highlight-DCk5lJY-.js +0 -290
- package/dist/code-highlight-DCk5lJY-.js.map +0 -1
- package/dist/code-highlight-fSLrlgOb.cjs +0 -190
- package/dist/code-highlight-fSLrlgOb.cjs.map +0 -1
- package/dist/components-COsM6sJZ.js +0 -730
- package/dist/components-COsM6sJZ.js.map +0 -1
- package/dist/components-CyD6a7gQ.cjs +0 -73
- package/dist/components-CyD6a7gQ.cjs.map +0 -1
- package/dist/cursor-glow-Ah7VXSj7.js +0 -46
- package/dist/cursor-glow-Ah7VXSj7.js.map +0 -1
- package/dist/cursor-glow-DtSy_PJd.cjs +0 -1
- package/dist/cursor-glow-DtSy_PJd.cjs.map +0 -1
- package/dist/date-range-Sfyco9-n.js +0 -946
- package/dist/date-range-Sfyco9-n.js.map +0 -1
- package/dist/date-range-ZAaQB22I.cjs +0 -131
- package/dist/date-range-ZAaQB22I.cjs.map +0 -1
- package/dist/date-range-inline-Bl8qbiQF.js +0 -267
- package/dist/date-range-inline-Bl8qbiQF.js.map +0 -1
- package/dist/date-range-inline-m7nLjOMI.cjs +0 -43
- package/dist/date-range-inline-m7nLjOMI.cjs.map +0 -1
- package/dist/delay-7boauN6N.cjs +0 -9
- package/dist/delay-7boauN6N.cjs.map +0 -1
- package/dist/delay-CgX6m0HN.js +0 -346
- package/dist/delay-CgX6m0HN.js.map +0 -1
- package/dist/details-BHnk8l4q.cjs +0 -168
- package/dist/details-BHnk8l4q.cjs.map +0 -1
- package/dist/details-BPkUg8Cq.js +0 -293
- package/dist/details-BPkUg8Cq.js.map +0 -1
- package/dist/dialog-service-NZEvyEK-.js +0 -193
- package/dist/dialog-service-NZEvyEK-.js.map +0 -1
- package/dist/dialog-service-VnW4gkmE.cjs +0 -1
- package/dist/dialog-service-VnW4gkmE.cjs.map +0 -1
- package/dist/divider-CW9a7MMj.js +0 -87
- package/dist/divider-CW9a7MMj.js.map +0 -1
- package/dist/divider-_khrhrZo.cjs +0 -57
- package/dist/divider-_khrhrZo.cjs.map +0 -1
- package/dist/expand-Cp7-PH8b.cjs +0 -141
- package/dist/expand-Cp7-PH8b.cjs.map +0 -1
- package/dist/expand-iQ7EOMP7.js +0 -336
- package/dist/expand-iQ7EOMP7.js.map +0 -1
- package/dist/extra-IKAiJJhv.cjs +0 -31
- package/dist/extra-IKAiJJhv.cjs.map +0 -1
- package/dist/extra-wEpvEFbK.js +0 -3435
- package/dist/extra-wEpvEFbK.js.map +0 -1
- package/dist/float-BQ_urmMs.js +0 -5
- package/dist/float-BQ_urmMs.js.map +0 -1
- package/dist/float-D5rNC82i.cjs +0 -1
- package/dist/float-D5rNC82i.cjs.map +0 -1
- package/dist/flow-Bbwn6dRN.cjs.map +0 -1
- package/dist/flow-CUj0fDT_.js.map +0 -1
- package/dist/form-BqN1AGFj.cjs +0 -1
- package/dist/form-BqN1AGFj.cjs.map +0 -1
- package/dist/form-CajC5HnO.js +0 -270
- package/dist/form-CajC5HnO.js.map +0 -1
- package/dist/hashContent-DYM21p6t.js.map +0 -1
- package/dist/hashContent-DaeGmY-p.cjs.map +0 -1
- package/dist/icons-B57_93VV.cjs +0 -52
- package/dist/icons-B57_93VV.cjs.map +0 -1
- package/dist/icons-BDqiGXrO.js +0 -161
- package/dist/icons-BDqiGXrO.js.map +0 -1
- package/dist/iframe-DNHL3GIk.cjs +0 -24
- package/dist/iframe-DNHL3GIk.cjs.map +0 -1
- package/dist/iframe-WnWPIrBG.js +0 -44
- package/dist/iframe-WnWPIrBG.js.map +0 -1
- package/dist/input-BiSrTcrR.cjs +0 -51
- package/dist/input-BiSrTcrR.cjs.map +0 -1
- package/dist/input-VaXHFrRn.js +0 -364
- package/dist/input-VaXHFrRn.js.map +0 -1
- package/dist/input-chip-Dy-AiP55.cjs +0 -146
- package/dist/input-chip-Dy-AiP55.cjs.map +0 -1
- package/dist/input-chip-QejNcRnS.js +0 -301
- package/dist/input-chip-QejNcRnS.js.map +0 -1
- package/dist/intersection-BPLpqYEd.js.map +0 -1
- package/dist/intersection-CZpaIHeT.cjs.map +0 -1
- package/dist/layout-4C-6_cre.cjs +0 -1
- package/dist/layout-4C-6_cre.cjs.map +0 -1
- package/dist/layout-CnsXeCAy.js +0 -267
- package/dist/layout-CnsXeCAy.js.map +0 -1
- package/dist/layout-DNYG3phx.cjs +0 -17
- package/dist/layout-DNYG3phx.cjs.map +0 -1
- package/dist/layout-yxSlLybo.js +0 -94
- package/dist/layout-yxSlLybo.js.map +0 -1
- package/dist/lightbox-BrI1Z31s.js +0 -678
- package/dist/lightbox-BrI1Z31s.js.map +0 -1
- package/dist/lightbox-CmACf0t5.cjs +0 -202
- package/dist/lightbox-CmACf0t5.cjs.map +0 -1
- package/dist/list-Cm-jjXxM.js +0 -105
- package/dist/list-Cm-jjXxM.js.map +0 -1
- package/dist/list-swIL9VDv.cjs +0 -40
- package/dist/list-swIL9VDv.cjs.map +0 -1
- package/dist/litElement.mixin-3llHwB-8.cjs +0 -1
- package/dist/litElement.mixin-3llHwB-8.cjs.map +0 -1
- package/dist/litElement.mixin-6jJYHCrZ.js +0 -12
- package/dist/litElement.mixin-6jJYHCrZ.js.map +0 -1
- package/dist/magnetic-BZGFxAWG.js +0 -47
- package/dist/magnetic-BZGFxAWG.js.map +0 -1
- package/dist/magnetic-Dux4QwO4.cjs +0 -1
- package/dist/magnetic-Dux4QwO4.cjs.map +0 -1
- package/dist/mailbox-BuvsVaAQ.js +0 -1584
- package/dist/mailbox-BuvsVaAQ.js.map +0 -1
- package/dist/mailbox-D6LkQcN5.cjs +0 -1142
- package/dist/mailbox-D6LkQcN5.cjs.map +0 -1
- package/dist/map-CQiKAxC3.js +0 -205
- package/dist/map-CQiKAxC3.js.map +0 -1
- package/dist/map-D5NN4VET.cjs +0 -80
- package/dist/map-D5NN4VET.cjs.map +0 -1
- package/dist/menu-C1x04YZw.js +0 -51
- package/dist/menu-C1x04YZw.js.map +0 -1
- package/dist/menu-CkgMO9K5.cjs +0 -23
- package/dist/menu-CkgMO9K5.cjs.map +0 -1
- package/dist/notification-BnBgxjF-.js +0 -304
- package/dist/notification-BnBgxjF-.js.map +0 -1
- package/dist/notification-CZFEhWxc.cjs +0 -23
- package/dist/notification-CZFEhWxc.cjs.map +0 -1
- package/dist/option-BrxCVwSx.cjs +0 -43
- package/dist/option-BrxCVwSx.cjs.map +0 -1
- package/dist/option-DBO8xZwd.js +0 -97
- package/dist/option-DBO8xZwd.js.map +0 -1
- package/dist/overlay-stack-DQey9Qph.cjs.map +0 -1
- package/dist/overlay-stack-DT1SdaGW.js.map +0 -1
- package/dist/progress-Db2e4_Zd.cjs +0 -51
- package/dist/progress-Db2e4_Zd.cjs.map +0 -1
- package/dist/progress-DeiHxXo7.js +0 -128
- package/dist/progress-DeiHxXo7.js.map +0 -1
- package/dist/provide-C1aQhxYo.js +0 -107
- package/dist/provide-C1aQhxYo.js.map +0 -1
- package/dist/provide-DHnhQtCH.cjs +0 -1
- package/dist/provide-DHnhQtCH.cjs.map +0 -1
- package/dist/radio-group-Cspwd-Vw.cjs +0 -40
- package/dist/radio-group-Cspwd-Vw.cjs.map +0 -1
- package/dist/radio-group-zSO0AkJf.js +0 -105
- package/dist/radio-group-zSO0AkJf.js.map +0 -1
- package/dist/reduced-motion-D-L12p7G.js.map +0 -1
- package/dist/reduced-motion-Ds05GPyz.cjs.map +0 -1
- package/dist/rxjs-utils-BSjmI9-Q.js.map +0 -1
- package/dist/rxjs-utils-DCsfzeap.cjs.map +0 -1
- package/dist/scroll-QMCmbbDv.cjs +0 -26
- package/dist/scroll-QMCmbbDv.cjs.map +0 -1
- package/dist/scroll-cBDzye64.js +0 -112
- package/dist/scroll-cBDzye64.js.map +0 -1
- package/dist/search-C4dFHYbX.js.map +0 -1
- package/dist/search-Ds8tt7Et.cjs.map +0 -1
- package/dist/select-Ct37l3lg.cjs +0 -56
- package/dist/select-Ct37l3lg.cjs.map +0 -1
- package/dist/select-c6HbWvKP.js +0 -305
- package/dist/select-c6HbWvKP.js.map +0 -1
- package/dist/sheet-BMXcUiIm.js +0 -168
- package/dist/sheet-BMXcUiIm.js.map +0 -1
- package/dist/sheet-CQec-bCV.cjs +0 -35
- package/dist/sheet-CQec-bCV.cjs.map +0 -1
- package/dist/sheet.service-BcPV3Du4.js +0 -86
- package/dist/sheet.service-BcPV3Du4.js.map +0 -1
- package/dist/sheet.service-Dumvr1HT.cjs +0 -1
- package/dist/sheet.service-Dumvr1HT.cjs.map +0 -1
- package/dist/sound.service-Bu3EQLv2.cjs +0 -1
- package/dist/sound.service-Bu3EQLv2.cjs.map +0 -1
- package/dist/sound.service-m3BrSfuH.js +0 -2353
- package/dist/sound.service-m3BrSfuH.js.map +0 -1
- package/dist/src-BLngW2bl.js +0 -1244
- package/dist/src-BLngW2bl.js.map +0 -1
- package/dist/src-BtQVyqMy.cjs +0 -269
- package/dist/src-BtQVyqMy.cjs.map +0 -1
- package/dist/store-CorvD3bT.cjs.map +0 -1
- package/dist/store-DYqDLAvT.js.map +0 -1
- package/dist/surface-BjKZoJxK.cjs +0 -7
- package/dist/surface-BjKZoJxK.cjs.map +0 -1
- package/dist/surface-pK8hME5c.js +0 -21
- package/dist/surface-pK8hME5c.js.map +0 -1
- package/dist/surface.mixin-C5sDI1-_.cjs +0 -297
- package/dist/surface.mixin-C5sDI1-_.cjs.map +0 -1
- package/dist/surface.mixin-CBNRpJum.js +0 -320
- package/dist/surface.mixin-CBNRpJum.js.map +0 -1
- package/dist/table-BXIHX9h4.js +0 -631
- package/dist/table-BXIHX9h4.js.map +0 -1
- package/dist/table-CiqgZzSd.cjs +0 -63
- package/dist/table-CiqgZzSd.cjs.map +0 -1
- package/dist/tabs-CKa-W4qA.cjs +0 -31
- package/dist/tabs-CKa-W4qA.cjs.map +0 -1
- package/dist/tabs-nbV5eblZ.js +0 -125
- package/dist/tabs-nbV5eblZ.js.map +0 -1
- package/dist/tailwind.mixin-BCJOOX1_.js +0 -225
- package/dist/tailwind.mixin-BCJOOX1_.js.map +0 -1
- package/dist/tailwind.mixin-BF1Huas7.cjs +0 -2
- package/dist/tailwind.mixin-BF1Huas7.cjs.map +0 -1
- package/dist/textarea-Cp1ZE60O.cjs +0 -35
- package/dist/textarea-Cp1ZE60O.cjs.map +0 -1
- package/dist/textarea-D7q8exMg.js +0 -195
- package/dist/textarea-D7q8exMg.js.map +0 -1
- package/dist/theme-Da4SPq9X.cjs +0 -181
- package/dist/theme-Da4SPq9X.cjs.map +0 -1
- package/dist/theme-_VPV6Bxh.js +0 -4121
- package/dist/theme-_VPV6Bxh.js.map +0 -1
- package/dist/theme-button--sX8A-m1.js +0 -19
- package/dist/theme-button--sX8A-m1.js.map +0 -1
- package/dist/theme-button-Ci8VQ7KW.cjs +0 -8
- package/dist/theme-button-Ci8VQ7KW.cjs.map +0 -1
- package/dist/theme.events-Cv7N4Toe.js.map +0 -1
- package/dist/theme.events-DM4H5F2d.cjs.map +0 -1
- package/dist/theme.interface-CXloMUCw.js.map +0 -1
- package/dist/theme.interface-Da23QAYb.cjs.map +0 -1
- package/dist/theme.service-C_tjlqgy.cjs +0 -1
- package/dist/theme.service-C_tjlqgy.cjs.map +0 -1
- package/dist/theme.service-D9lEas89.js +0 -108
- package/dist/theme.service-D9lEas89.js.map +0 -1
- package/dist/tslib.es6-D7BIeDVB.cjs.map +0 -1
- package/dist/tslib.es6-ErZEp3OO.js.map +0 -1
- package/dist/typewriter-B2TnHPjw.cjs +0 -123
- package/dist/typewriter-B2TnHPjw.cjs.map +0 -1
- package/dist/typewriter-BrZNa8T-.js +0 -700
- package/dist/typewriter-BrZNa8T-.js.map +0 -1
- package/dist/utils-BcaKtQuA.cjs +0 -1
- package/dist/utils-BcaKtQuA.cjs.map +0 -1
- package/dist/utils-CoU7M2YS.js +0 -259
- package/dist/utils-CoU7M2YS.js.map +0 -1
- package/dist/window-CM1ycigo.js +0 -548
- package/dist/window-CM1ycigo.js.map +0 -1
- package/dist/window-Uii13x_r.cjs +0 -59
- package/dist/window-Uii13x_r.cjs.map +0 -1
- package/src/form/form-v2.ts +0 -268
- package/src/layout/v2/grid.ts +0 -93
- package/src/notification/outlet.ts +0 -16
- package/src/store/immer-integration.ts +0 -99
- package/src/tooltip/tooltip.ts +0 -216
- /package/dist/{animation-CO_Csq84.cjs → animation-Bcwh107v.cjs} +0 -0
- /package/dist/{animation-BK-8BwY8.js → animation-CXKSuUoE.js} +0 -0
- /package/dist/{tslib.es6-ErZEp3OO.js → decorate-D_utPUsC.js} +0 -0
- /package/dist/{tslib.es6-D7BIeDVB.cjs → decorate-F9CuyeHg.cjs} +0 -0
- /package/dist/{flow-CUj0fDT_.js → flow-CqgDEIqK.js} +0 -0
- /package/dist/{flow-Bbwn6dRN.cjs → flow-DSu4PLt1.cjs} +0 -0
- /package/dist/{hashContent-DaeGmY-p.cjs → hashContent-kKvXKFa9.cjs} +0 -0
- /package/dist/{hashContent-DYM21p6t.js → hashContent-nD2uWwi2.js} +0 -0
- /package/dist/{intersection-CZpaIHeT.cjs → intersection-D1v1UCVv.cjs} +0 -0
- /package/dist/{intersection-BPLpqYEd.js → intersection-LfEsy29T.js} +0 -0
- /package/dist/{overlay-stack-DQey9Qph.cjs → overlay-stack-CEYGD9T1.cjs} +0 -0
- /package/dist/{overlay-stack-DT1SdaGW.js → overlay-stack-Ca4EK2Mu.js} +0 -0
- /package/dist/{reduced-motion-D-L12p7G.js → reduced-motion-B83yZbcO.js} +0 -0
- /package/dist/{reduced-motion-Ds05GPyz.cjs → reduced-motion-DR32yKEO.cjs} +0 -0
- /package/dist/{rxjs-utils-BSjmI9-Q.js → rxjs-utils-Bldch1RO.js} +0 -0
- /package/dist/{rxjs-utils-DCsfzeap.cjs → rxjs-utils-hAgKC7vk.cjs} +0 -0
- /package/dist/{search-C4dFHYbX.js → search-BlGJ6uJv.js} +0 -0
- /package/dist/{search-Ds8tt7Et.cjs → search-C8eAOzBm.cjs} +0 -0
- /package/{ai → dist/skills}/animation.md +0 -0
- /package/{ai → dist/skills}/area.md +0 -0
- /package/{ai → dist/skills}/audio.md +0 -0
- /package/{ai → dist/skills}/autocomplete.md +0 -0
- /package/{ai → dist/skills}/avatar.md +0 -0
- /package/{ai → dist/skills}/badge.md +0 -0
- /package/{ai → dist/skills}/boat.md +0 -0
- /package/{ai → dist/skills}/busy.md +0 -0
- /package/{ai → dist/skills}/button.md +0 -0
- /package/{ai → dist/skills}/card.md +0 -0
- /package/{ai → dist/skills}/charts.md +0 -0
- /package/{ai → dist/skills}/checkbox.md +0 -0
- /package/{ai → dist/skills}/chips.md +0 -0
- /package/{ai → dist/skills}/code-highlight.md +0 -0
- /package/{ai → dist/skills}/connectivity.md +0 -0
- /package/{ai → dist/skills}/content-drawer.md +0 -0
- /package/{ai → dist/skills}/date-range-inline.md +0 -0
- /package/{ai → dist/skills}/date-range.md +0 -0
- /package/{ai → dist/skills}/delay.md +0 -0
- /package/{ai → dist/skills}/details.md +0 -0
- /package/{ai → dist/skills}/dialog.md +0 -0
- /package/{ai → dist/skills}/directives.md +0 -0
- /package/{ai → dist/skills}/discovery.md +0 -0
- /package/{ai → dist/skills}/divider.md +0 -0
- /package/{ai → dist/skills}/dropdown.md +0 -0
- /package/{ai → dist/skills}/expand.md +0 -0
- /package/{ai → dist/skills}/extra.md +0 -0
- /package/{ai → dist/skills}/float.md +0 -0
- /package/{ai → dist/skills}/form.md +0 -0
- /package/{ai → dist/skills}/icons.md +0 -0
- /package/{ai → dist/skills}/iframe.md +0 -0
- /package/{ai → dist/skills}/input.md +0 -0
- /package/{ai → dist/skills}/json.md +0 -0
- /package/{ai → dist/skills}/layout.md +0 -0
- /package/{ai → dist/skills}/lightbox.md +0 -0
- /package/{ai → dist/skills}/list.md +0 -0
- /package/{ai → dist/skills}/mailbox.md +0 -0
- /package/{ai → dist/skills}/map.md +0 -0
- /package/{ai → dist/skills}/menu.md +0 -0
- /package/{ai → dist/skills}/mixins.md +0 -0
- /package/{ai → dist/skills}/nav-drawer.md +0 -0
- /package/{ai → dist/skills}/navigation-bar.md +0 -0
- /package/{ai → dist/skills}/navigation-rail.md +0 -0
- /package/{ai → dist/skills}/notification.md +0 -0
- /package/{ai → dist/skills}/option.md +0 -0
- /package/{ai → dist/skills}/page.md +0 -0
- /package/{ai → dist/skills}/progress.md +0 -0
- /package/{ai → dist/skills}/qr-scanner.md +0 -0
- /package/{ai → dist/skills}/radio-group.md +0 -0
- /package/{ai → dist/skills}/range.md +0 -0
- /package/{ai → dist/skills}/rxjs-utils.md +0 -0
- /package/dist/{ai → skills/schmancy}/animation.md +0 -0
- /package/dist/{ai → skills/schmancy}/area.md +0 -0
- /package/dist/{ai → skills/schmancy}/audio.md +0 -0
- /package/dist/{ai → skills/schmancy}/autocomplete.md +0 -0
- /package/dist/{ai → skills/schmancy}/avatar.md +0 -0
- /package/dist/{ai → skills/schmancy}/badge.md +0 -0
- /package/dist/{ai → skills/schmancy}/boat.md +0 -0
- /package/dist/{ai → skills/schmancy}/busy.md +0 -0
- /package/dist/{ai → skills/schmancy}/button.md +0 -0
- /package/dist/{ai → skills/schmancy}/card.md +0 -0
- /package/dist/{ai → skills/schmancy}/charts.md +0 -0
- /package/dist/{ai → skills/schmancy}/checkbox.md +0 -0
- /package/dist/{ai → skills/schmancy}/chips.md +0 -0
- /package/dist/{ai → skills/schmancy}/code-highlight.md +0 -0
- /package/dist/{ai → skills/schmancy}/connectivity.md +0 -0
- /package/dist/{ai → skills/schmancy}/content-drawer.md +0 -0
- /package/dist/{ai → skills/schmancy}/date-range-inline.md +0 -0
- /package/dist/{ai → skills/schmancy}/date-range.md +0 -0
- /package/dist/{ai → skills/schmancy}/delay.md +0 -0
- /package/dist/{ai → skills/schmancy}/details.md +0 -0
- /package/dist/{ai → skills/schmancy}/dialog.md +0 -0
- /package/dist/{ai → skills/schmancy}/directives.md +0 -0
- /package/dist/{ai → skills/schmancy}/discovery.md +0 -0
- /package/dist/{ai → skills/schmancy}/divider.md +0 -0
- /package/dist/{ai → skills/schmancy}/dropdown.md +0 -0
- /package/dist/{ai → skills/schmancy}/expand.md +0 -0
- /package/dist/{ai → skills/schmancy}/extra.md +0 -0
- /package/dist/{ai → skills/schmancy}/float.md +0 -0
- /package/dist/{ai → skills/schmancy}/form.md +0 -0
- /package/dist/{ai → skills/schmancy}/icons.md +0 -0
- /package/dist/{ai → skills/schmancy}/iframe.md +0 -0
- /package/dist/{ai → skills/schmancy}/input.md +0 -0
- /package/dist/{ai → skills/schmancy}/json.md +0 -0
- /package/dist/{ai → skills/schmancy}/layout.md +0 -0
- /package/dist/{ai → skills/schmancy}/lightbox.md +0 -0
- /package/dist/{ai → skills/schmancy}/list.md +0 -0
- /package/dist/{ai → skills/schmancy}/mailbox.md +0 -0
- /package/dist/{ai → skills/schmancy}/map.md +0 -0
- /package/dist/{ai → skills/schmancy}/menu.md +0 -0
- /package/dist/{ai → skills/schmancy}/mixins.md +0 -0
- /package/dist/{ai → skills/schmancy}/nav-drawer.md +0 -0
- /package/dist/{ai → skills/schmancy}/navigation-bar.md +0 -0
- /package/dist/{ai → skills/schmancy}/navigation-rail.md +0 -0
- /package/dist/{ai → skills/schmancy}/notification.md +0 -0
- /package/dist/{ai → skills/schmancy}/option.md +0 -0
- /package/dist/{ai → skills/schmancy}/page.md +0 -0
- /package/dist/{ai → skills/schmancy}/progress.md +0 -0
- /package/dist/{ai → skills/schmancy}/qr-scanner.md +0 -0
- /package/dist/{ai → skills/schmancy}/radio-group.md +0 -0
- /package/dist/{ai → skills/schmancy}/range.md +0 -0
- /package/dist/{ai → skills/schmancy}/rxjs-utils.md +0 -0
- /package/{ai → dist/skills/schmancy}/select.md +0 -0
- /package/{ai → dist/skills/schmancy}/sheet.md +0 -0
- /package/{ai → dist/skills/schmancy}/slider.md +0 -0
- /package/{ai → dist/skills/schmancy}/steps.md +0 -0
- /package/{ai → dist/skills/schmancy}/store.md +0 -0
- /package/{ai → dist/skills/schmancy}/surface.md +0 -0
- /package/{ai → dist/skills/schmancy}/table.md +0 -0
- /package/{ai → dist/skills/schmancy}/tabs.md +0 -0
- /package/{ai → dist/skills/schmancy}/teleport.md +0 -0
- /package/{ai → dist/skills/schmancy}/textarea.md +0 -0
- /package/{ai → dist/skills/schmancy}/theme-button.md +0 -0
- /package/{ai → dist/skills/schmancy}/theme.md +0 -0
- /package/{ai → dist/skills/schmancy}/tree.md +0 -0
- /package/{ai → dist/skills/schmancy}/typewriter.md +0 -0
- /package/{ai → dist/skills/schmancy}/typography.md +0 -0
- /package/{ai → dist/skills/schmancy}/utils.md +0 -0
- /package/{ai → dist/skills/schmancy}/window.md +0 -0
- /package/dist/{ai → skills}/select.md +0 -0
- /package/dist/{ai → skills}/sheet.md +0 -0
- /package/dist/{ai → skills}/slider.md +0 -0
- /package/dist/{ai → skills}/steps.md +0 -0
- /package/dist/{ai → skills}/store.md +0 -0
- /package/dist/{ai → skills}/surface.md +0 -0
- /package/dist/{ai → skills}/table.md +0 -0
- /package/dist/{ai → skills}/tabs.md +0 -0
- /package/dist/{ai → skills}/teleport.md +0 -0
- /package/dist/{ai → skills}/textarea.md +0 -0
- /package/dist/{ai → skills}/theme-button.md +0 -0
- /package/dist/{ai → skills}/theme.md +0 -0
- /package/dist/{ai → skills}/tree.md +0 -0
- /package/dist/{ai → skills}/typewriter.md +0 -0
- /package/dist/{ai → skills}/typography.md +0 -0
- /package/dist/{ai → skills}/utils.md +0 -0
- /package/dist/{ai → skills}/window.md +0 -0
- /package/dist/{store-DYqDLAvT.js → store-Bmj6rvZY.js} +0 -0
- /package/dist/{store-CorvD3bT.cjs → store-CO4nJyGj.cjs} +0 -0
- /package/dist/{theme.events-Cv7N4Toe.js → theme.events-Bw3mYjUA.js} +0 -0
- /package/dist/{theme.events-DM4H5F2d.cjs → theme.events-EznKK2Y0.cjs} +0 -0
- /package/dist/{theme.interface-Da23QAYb.cjs → theme.interface-CM26m9te.cjs} +0 -0
- /package/dist/{theme.interface-CXloMUCw.js → theme.interface-FAUIgbIq.js} +0 -0
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 * 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 $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 container for the schmancy-dropdown component.\n *\n * @element schmancy-dropdown-content\n * @slot - Default slot for dropdown content\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 { $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 * 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 $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 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 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":"kWAcO,IAAA,EAAA,cAA+B,EAAA,GAAA,AAAA,CAAA,YAAA,GAAA,EAAA,CAAA,MAAA,GAAA,EAAA,CAAA,KAAA,KAAA,CAK9B,EAAA,KAAA,UAkBS,eAAA,KAAA,SAML,EAAA,KAAA,OAKmC,KAAA,KAAA,oBAMA,EAAA,CAE9C,mBAAA,CACC,MAAM,mBAAA,CAGN,KAAK,aAAA,EAGL,EAAA,EAAA,WAAsB,SAAU,QAAA,CAC9B,MAAA,EAAA,EAAA,QACO,GAAS,KAAK,MAAA,CAAS,KAAK,gBAAgB,EAAA,CAAA,EAAO,EAAA,EAAA,WAChD,KAAK,cAAA,CAAA,CAEf,cAAA,CACA,KAAK,KAAA,CAAO,GAAA,EAId,EAAA,EAAA,WAAyB,SAAU,UAAA,CACjC,MAAA,EAAA,EAAA,QACO,GAAS,KAAK,MAAQ,EAAM,MAAQ,SAAR,EAAiB,EAAA,EAAA,WAC1C,KAAK,cAAA,CAAA,CAEf,cAAA,CACA,KAAK,KAAA,CAAO,GAAA,CAOf,aAAA,CAEC,IAAI,EAAkB,SAAS,eAAe,4BAAA,CAGzC,IACJ,EAAkB,SAAS,cAAc,MAAA,CACzC,EAAgB,GAAK,4BACrB,EAAgB,MAAM,SAAW,QACjC,EAAgB,MAAM,OAAS,QAC/B,EAAgB,MAAM,IAAM,IAC5B,EAAgB,MAAM,KAAO,IAC7B,EAAgB,MAAM,cAAgB,OACtC,SAAS,KAAK,YAAY,EAAA,EAI3B,IAAM,EAAS,SAAS,cAAc,MAAA,CACtC,EAAO,UAAY,2BACnB,EAAO,MAAM,SAAW,WACxB,EAAO,MAAM,cAAgB,OAC7B,EAAO,MAAM,QAAU,OACvB,EAAgB,YAAY,EAAA,CAE5B,KAAK,OAAS,EAMf,gBAAwB,EAAA,CACvB,OAAO,EAAM,cAAA,CAAe,KAAK,GAAM,IAAO,KAAA,CAG/C,sBAAA,CACC,KAAK,qBAAA,CAGL,KAAK,oBAAoB,QAAQ,GAAgB,EAAa,aAAA,CAAA,CAC9D,KAAK,oBAAsB,EAAA,CAGvB,AAEH,KAAK,UADL,KAAK,OAAO,QAAA,CACE,MAGf,MAAM,sBAAA,CAMP,QAAA,CACC,KAAK,KAAA,CAAQ,KAAK,KAGnB,QAAQ,EAAA,CACP,MAAM,QAAQ,EAAA,CAEV,EAAa,IAAI,OAAA,GAChB,KAAK,KACR,KAAK,iBAAA,EAEL,KAAK,qBAAA,CAGD,KAAK,SACR,KAAK,OAAO,MAAM,QAAU,OAC5B,KAAK,OAAO,UAAY,GAExB,KAAK,oBAAoB,QAAQ,GAAgB,EAAa,aAAA,CAAA,CAC9D,KAAK,oBAAsB,EAAA,IAS/B,iBAAA,CACM,KAAK,kBAAqB,KAAK,SAGpC,KAAK,OAAO,MAAM,QAAU,QAG5B,KAAK,yBAAA,CAGL,KAAK,mBAAA,EAAA,EAAA,YAA+B,KAAK,iBAAkB,KAAK,WAAA,EAC/D,EAAA,EAAA,iBAAgB,KAAK,iBAAkB,KAAK,OAAQ,CACnD,UAAW,KAAK,UAChB,WAAY,EAAA,EAAA,EAAA,QACJ,KAAK,SAAA,EAAA,EAAA,EAAA,MACP,CACJ,mBAAoB,CAAC,YAAa,eAAA,CAAA,CAAA,EAAA,EAAA,EAAA,OAE7B,CAAE,QAAS,EAAA,CAAA,CAAA,CAAA,CAAA,CAEhB,MAAA,CAAQ,EAAA,EAAG,EAAA,KAAA,CAEb,OAAO,OAAO,KAAK,OAAO,MAAO,CAChC,KAAM,GAAG,EAAA,IACT,IAAQ,EAAI,EAAP,KAAA,CAAA,EAAA,EAAA,EAST,yBAAA,CACM,KAAK,SAGV,KAAK,oBAAoB,QAAQ,GAAgB,EAAa,aAAA,CAAA,CAC9D,KAAK,oBAAsB,EAAA,CAG3B,KAAK,OAAO,UAAY,GAGxB,KAAK,gBAAgB,QAAQ,GAAA,CAE5B,IAAM,EAAgB,EAAQ,UAAA,CAAU,EAAA,CAGxC,GAAI,EAAQ,QAAQ,aAAA,GAAkB,4BAA6B,CAClE,IAAM,GAAA,EAAA,EAAA,WAAyB,EAAe,aAAA,CAAc,cAAA,CAE3D,IAAM,EAAa,EAAc,YAAY,cAAc,mBAAA,CACvD,GACH,EAAW,UAAU,IAAI,4BAAA,EAAA,CAG3B,KAAK,oBAAoB,KAAK,EAAA,CAG/B,KAAK,QAAQ,YAAY,EAAA,EAAA,EAO3B,mBAA2B,EAAA,CAC1B,EAAE,iBAAA,CACF,KAAK,QAAA,CAGN,QAAA,CACC,MAAO,GAAA,IAAI;2CAC8B,KAAK,mBAAA;;;;sDAIM,KAAK,KAAA;;wBAGjD,KAAK,OACR,KAAK,yBAAA,CACL,KAAK,iBAAA,GAAA;;;0BAxOD,CAAE,KAAM,QAAS,QAAA,CAAS,EAAA,CAAA,CAAA,CAAO,EAAA,UAAA,OAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAMjC,CAAE,KAAM,OAAA,CAAA,CAAA,CAAS,EAAA,UAAA,YAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAkBjB,CAAE,KAAM,OAAA,CAAA,CAAA,CAAS,EAAA,UAAA,WAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAGpB,qBAAA,CAAA,CAAqB,EAAA,UAAA,mBAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OACrB,8BAAA,CAAA,CAA8B,EAAA,UAAA,mBAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,uBACd,CAAE,QAAA,CAAS,EAAA,CAAA,CAAA,CAAO,EAAA,UAAA,kBAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,QAAA,CAAA,CACjC,EAAA,UAAA,SAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,uBAEe,CAAE,KAAM,UAAW,QAAA,CAAS,EAAA,CAAA,CAAA,CAAO,EAAA,UAAA,kBAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,eArC5C,oBAAA,CAAA,CAAoB,EAAA,CCA5B,IAAA,EAAA,cAAsC,EAAA,EAAgB,EAAA,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4CA+C/C,OAAA,KAAA,UAMI,OAAA,KAAA,OAAA,CAMF,EAAA,KAAA,OAM6B,KAE/C,QAAA,CACC,IAAM,EAAU,CACf,4BAAA,CAA6B,EAC7B,gBAAA,CAAiB,EACjB,cAAA,CAAgB,KAAK,OACrB,eAAgB,KAAK,SAAW,OAChC,aAAc,KAAK,SAAW,KAC9B,aAAc,KAAK,SAAW,KAC9B,aAAc,KAAK,SAAW,KAC9B,eAAgB,KAAK,SAAW,OAAX,CAGhB,EAAS,CACd,MAAO,KAAK,MACZ,UAAW,KAAK,UAAA,CAGjB,MAAO,GAAA,IAAI;gBACG,KAAK,SAAS,EAAA,CAAA,SAAkB,KAAK,SAAS,EAAA,CAAA;;;0BAvCnD,CAAE,KAAM,OAAA,CAAA,CAAA,CAAS,EAAA,UAAA,QAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAMjB,CAAE,KAAM,OAAA,CAAA,CAAA,CAAS,EAAA,UAAA,YAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAMjB,CAAE,KAAM,QAAA,CAAA,CAAA,CAAU,EAAA,UAAA,SAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAMlB,CAAE,KAAM,OAAA,CAAA,CAAA,CAAS,EAAA,UAAA,SAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,eAjEb,4BAAA,CAAA,CAA4B,EAAA,CAAA,OAAA,eAAA,QAAA,mBAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,GAAA,CAAA,CAAA,OAAA,eAAA,QAAA,0BAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,GAAA,CAAA"}
|
package/dist/dropdown.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { t
|
|
1
|
+
import { t as e } from "./tailwind.mixin-DufHBjmb.js";
|
|
2
|
+
import { t } from "./decorate-D_utPUsC.js";
|
|
3
|
+
import { t as n } from "./litElement.mixin-CncaUoxz.js";
|
|
3
4
|
import "./mixins.js";
|
|
4
5
|
import { filter as r, fromEvent as i, takeUntil as a } from "rxjs";
|
|
5
6
|
import { customElement as o, property as s, query as c, queryAssignedElements as l, state as u } from "lit/decorators.js";
|
|
@@ -83,14 +84,14 @@ var v = class extends n() {
|
|
|
83
84
|
`;
|
|
84
85
|
}
|
|
85
86
|
};
|
|
86
|
-
|
|
87
|
+
t([s({
|
|
87
88
|
type: Boolean,
|
|
88
89
|
reflect: !0
|
|
89
|
-
})], v.prototype, "open", void 0),
|
|
90
|
+
})], v.prototype, "open", void 0), t([s({ type: String })], v.prototype, "placement", void 0), t([s({ type: Number })], v.prototype, "distance", void 0), t([c(".trigger-container")], v.prototype, "triggerContainer", void 0), t([c(".dropdown-content-container")], v.prototype, "contentContainer", void 0), t([l({ flatten: !0 })], v.prototype, "contentElements", void 0), t([u()], v.prototype, "portal", void 0), t([l({
|
|
90
91
|
slot: "trigger",
|
|
91
92
|
flatten: !0
|
|
92
|
-
})], v.prototype, "triggerElements", void 0), v =
|
|
93
|
-
var y = class extends
|
|
93
|
+
})], v.prototype, "triggerElements", void 0), v = t([o("schmancy-dropdown")], v);
|
|
94
|
+
var y = class extends e(d`
|
|
94
95
|
:host {
|
|
95
96
|
display: block;
|
|
96
97
|
position: absolute;
|
|
@@ -157,5 +158,5 @@ var y = class extends t(d`
|
|
|
157
158
|
`;
|
|
158
159
|
}
|
|
159
160
|
};
|
|
160
|
-
|
|
161
|
+
t([s({ type: String })], y.prototype, "width", void 0), t([s({ type: String })], y.prototype, "maxHeight", void 0), t([s({ type: Boolean })], y.prototype, "shadow", void 0), t([s({ type: String })], y.prototype, "radius", void 0), y = t([o("schmancy-dropdown-content")], y);
|
|
161
162
|
export { v as SchmancyDropdown, y 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 * 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 $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 container for the schmancy-dropdown component.\n *\n * @element schmancy-dropdown-content\n * @slot - Default slot for dropdown content\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 { $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 * 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 $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 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 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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"}
|
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
import { t as e } from "./tailwind.mixin-DufHBjmb.js";
|
|
2
|
+
import { t } from "./decorate-D_utPUsC.js";
|
|
3
|
+
import { t as n } from "./surface.mixin-DqMwoddO.js";
|
|
4
|
+
import "./mixins.js";
|
|
5
|
+
import { d as r, f as i } from "./animation-CXKSuUoE.js";
|
|
6
|
+
import { t as a } from "./reduced-motion-B83yZbcO.js";
|
|
7
|
+
import "./surface-CkEYJCae.js";
|
|
8
|
+
import { filter as o, fromEvent as s, lastValueFrom as c } from "rxjs";
|
|
9
|
+
import { takeUntil as l, tap as u } from "rxjs/operators";
|
|
10
|
+
import { styleMap as d } from "lit/directives/style-map.js";
|
|
11
|
+
import { customElement as f, property as p, state as m } from "lit/decorators.js";
|
|
12
|
+
import { css as h, html as g, nothing as _ } from "lit";
|
|
13
|
+
import { createRef as v, ref as y } from "lit/directives/ref.js";
|
|
14
|
+
var b = class extends n(e(h`
|
|
15
|
+
:host {
|
|
16
|
+
display: contents;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.portal-panel {
|
|
20
|
+
position: fixed;
|
|
21
|
+
transform-origin: top left;
|
|
22
|
+
will-change: clip-path, opacity;
|
|
23
|
+
border-radius: 1rem;
|
|
24
|
+
box-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.5);
|
|
25
|
+
z-index: 9999;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.minimize-btn {
|
|
29
|
+
position: absolute;
|
|
30
|
+
top: 0.5rem;
|
|
31
|
+
right: 0.5rem;
|
|
32
|
+
z-index: 1;
|
|
33
|
+
display: flex;
|
|
34
|
+
align-items: center;
|
|
35
|
+
justify-content: center;
|
|
36
|
+
width: 2rem;
|
|
37
|
+
height: 2rem;
|
|
38
|
+
border-radius: 9999px;
|
|
39
|
+
border: none;
|
|
40
|
+
background: transparent;
|
|
41
|
+
cursor: pointer;
|
|
42
|
+
opacity: 0.5;
|
|
43
|
+
transition: opacity 150ms, background 150ms;
|
|
44
|
+
color: inherit;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.minimize-btn:hover {
|
|
48
|
+
opacity: 1;
|
|
49
|
+
background: rgb(0 0 0 / 0.08);
|
|
50
|
+
}
|
|
51
|
+
`)) {
|
|
52
|
+
constructor(...e) {
|
|
53
|
+
super(...e), this.type = "solid", this.isOpen = !1, this.summaryRect = null, this._panelRef = v(), this._backdropRef = v(), this._btnRef = v(), this._owner = null, this._hideIndicator = !1, this._backdrop = !0;
|
|
54
|
+
}
|
|
55
|
+
prepare(e, t, n = !1, r = !0) {
|
|
56
|
+
this.summaryRect = e, this._owner = t, this._hideIndicator = n, this._backdrop = r;
|
|
57
|
+
}
|
|
58
|
+
async triggerOpen() {
|
|
59
|
+
this.isOpen = !0, await this.updateComplete;
|
|
60
|
+
let e = this._panelRef.value;
|
|
61
|
+
if (!e) return;
|
|
62
|
+
let t = this.summaryRect;
|
|
63
|
+
Object.assign(e.style, {
|
|
64
|
+
visibility: "hidden",
|
|
65
|
+
top: `${t.top}px`,
|
|
66
|
+
left: `${t.left}px`,
|
|
67
|
+
minWidth: `${t.width}px`,
|
|
68
|
+
width: "max-content",
|
|
69
|
+
maxWidth: window.innerWidth - t.left + "px",
|
|
70
|
+
height: "auto",
|
|
71
|
+
maxHeight: window.innerHeight - 32 + "px",
|
|
72
|
+
overflowY: "auto"
|
|
73
|
+
});
|
|
74
|
+
let n = e.getBoundingClientRect(), r = n.width, i = n.height, a = t.top, o = t.left;
|
|
75
|
+
a + i > window.innerHeight && (a = Math.max(0, t.bottom - i)), o + r > window.innerWidth && (o = Math.max(0, window.innerWidth - r));
|
|
76
|
+
let s = Math.max(0, t.top - a), c = Math.max(0, t.left - o), l = Math.max(0, o + r - (t.left + t.width)), u = Math.max(0, a + i - (t.top + t.height));
|
|
77
|
+
Object.assign(e.style, {
|
|
78
|
+
visibility: "",
|
|
79
|
+
top: `${a}px`,
|
|
80
|
+
left: `${o}px`,
|
|
81
|
+
minWidth: `${t.width}px`,
|
|
82
|
+
width: `${r}px`,
|
|
83
|
+
height: `${i}px`,
|
|
84
|
+
maxWidth: "",
|
|
85
|
+
maxHeight: "",
|
|
86
|
+
clipPath: `inset(${s}px ${l}px ${u}px ${c}px round 0.5rem)`
|
|
87
|
+
}), this._animateOpen(s, l, u, c, a);
|
|
88
|
+
}
|
|
89
|
+
async triggerClose(e) {
|
|
90
|
+
await this._animateClose(e), this.isOpen = !1, this.summaryRect = null;
|
|
91
|
+
}
|
|
92
|
+
_animateOpen(e, t, n, i, o) {
|
|
93
|
+
let s = this._panelRef.value;
|
|
94
|
+
if (!s) return;
|
|
95
|
+
if (a.value) return void (s.style.clipPath = "");
|
|
96
|
+
let c = this._backdropRef.value;
|
|
97
|
+
c && c.animate([{ opacity: 0 }, { opacity: 1 }], {
|
|
98
|
+
duration: r.duration,
|
|
99
|
+
easing: r.easingFallback,
|
|
100
|
+
fill: "forwards"
|
|
101
|
+
});
|
|
102
|
+
let l = [{
|
|
103
|
+
clipPath: `inset(${e}px ${t}px ${n}px ${i}px round 0.5rem)`,
|
|
104
|
+
opacity: .9
|
|
105
|
+
}, {
|
|
106
|
+
clipPath: "inset(0px 0px 0px 0px round 1rem)",
|
|
107
|
+
opacity: 1
|
|
108
|
+
}];
|
|
109
|
+
s.animate(l, {
|
|
110
|
+
duration: r.duration,
|
|
111
|
+
easing: r.easingFallback,
|
|
112
|
+
fill: "forwards"
|
|
113
|
+
}).finished.then(() => {
|
|
114
|
+
s.isConnected && (s.style.clipPath = "", s.style.height = "auto", s.style.maxHeight = window.innerHeight - o - 16 + "px");
|
|
115
|
+
});
|
|
116
|
+
let u = this._btnRef.value;
|
|
117
|
+
u && u.animate([{ transform: "rotate(0deg)" }, { transform: "rotate(180deg)" }], {
|
|
118
|
+
duration: r.duration,
|
|
119
|
+
easing: r.easingFallback,
|
|
120
|
+
fill: "forwards"
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
_animateClose(e) {
|
|
124
|
+
let t = this._panelRef.value;
|
|
125
|
+
if (!t || a.value) return Promise.resolve();
|
|
126
|
+
let n = t.getBoundingClientRect(), i = Math.max(0, e.top - n.top), o = Math.max(0, e.left - n.left), s = Math.max(0, n.right - e.right), c = Math.max(0, n.bottom - e.bottom), l = Math.round(.4 * r.duration), u = "cubic-bezier(0.4, 0, 1, 1)", d = [{
|
|
127
|
+
clipPath: "inset(0px 0px 0px 0px round 1rem)",
|
|
128
|
+
opacity: 1
|
|
129
|
+
}, {
|
|
130
|
+
clipPath: `inset(${i}px ${s}px ${c}px ${o}px round 0.5rem)`,
|
|
131
|
+
opacity: .6
|
|
132
|
+
}], f = t.animate(d, {
|
|
133
|
+
duration: l,
|
|
134
|
+
easing: u,
|
|
135
|
+
fill: "forwards"
|
|
136
|
+
}), p = this._backdropRef.value;
|
|
137
|
+
p && p.animate([{ opacity: 1 }, { opacity: 0 }], {
|
|
138
|
+
duration: l,
|
|
139
|
+
easing: u,
|
|
140
|
+
fill: "forwards"
|
|
141
|
+
});
|
|
142
|
+
let m = this._btnRef.value;
|
|
143
|
+
return m && m.animate([{ transform: "rotate(180deg)" }, { transform: "rotate(0deg)" }], {
|
|
144
|
+
duration: l,
|
|
145
|
+
easing: u,
|
|
146
|
+
fill: "forwards"
|
|
147
|
+
}), f.finished;
|
|
148
|
+
}
|
|
149
|
+
render() {
|
|
150
|
+
return this.isOpen ? g`
|
|
151
|
+
${this._backdrop ? g`
|
|
152
|
+
<div
|
|
153
|
+
${y(this._backdropRef)}
|
|
154
|
+
class="fixed inset-0 z-9998 backdrop-blur-sm backdrop-saturate-150 backdrop-brightness-105 bg-black/[0.07] will-change-[opacity]"
|
|
155
|
+
@click=${() => this._owner?.close?.()}
|
|
156
|
+
></div>
|
|
157
|
+
` : _}
|
|
158
|
+
<schmancy-surface
|
|
159
|
+
${y(this._panelRef)}
|
|
160
|
+
class="portal-panel"
|
|
161
|
+
type=${this.type}
|
|
162
|
+
style="overflow-y: auto;"
|
|
163
|
+
>
|
|
164
|
+
${this._hideIndicator ? _ : g`
|
|
165
|
+
<button
|
|
166
|
+
${y(this._btnRef)}
|
|
167
|
+
class="minimize-btn"
|
|
168
|
+
aria-label="Minimize"
|
|
169
|
+
@click=${() => this._owner?.close?.()}
|
|
170
|
+
>
|
|
171
|
+
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" aria-hidden="true">
|
|
172
|
+
<path d="M19 9L12 16L5 9" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
173
|
+
</svg>
|
|
174
|
+
</button>
|
|
175
|
+
`}
|
|
176
|
+
<slot></slot>
|
|
177
|
+
</schmancy-surface>
|
|
178
|
+
` : _;
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
t([p({ reflect: !0 })], b.prototype, "type", void 0), t([m()], b.prototype, "isOpen", void 0), b = t([f("schmancy-expand-root")], b);
|
|
182
|
+
var x = "schmancy-expand-request-close", S = class extends e(h`
|
|
183
|
+
:host {
|
|
184
|
+
display: block;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
summary::-webkit-details-marker {
|
|
188
|
+
display: none;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
summary {
|
|
192
|
+
list-style: none;
|
|
193
|
+
color: inherit;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
.inline-grid {
|
|
197
|
+
display: grid;
|
|
198
|
+
grid-template-rows: 0fr;
|
|
199
|
+
overflow: hidden;
|
|
200
|
+
transition: grid-template-rows 300ms cubic-bezier(0.22, 1.25, 0.36, 1),
|
|
201
|
+
opacity 300ms cubic-bezier(0.22, 1.25, 0.36, 1);
|
|
202
|
+
opacity: 0;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
.inline-grid[data-open] {
|
|
206
|
+
grid-template-rows: 1fr;
|
|
207
|
+
opacity: 1;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
.inline-grid > .inner {
|
|
211
|
+
min-height: 0;
|
|
212
|
+
overflow: hidden;
|
|
213
|
+
}
|
|
214
|
+
`) {
|
|
215
|
+
constructor(...e) {
|
|
216
|
+
super(...e), this.summary = "", this.open = !1, this.summaryPadding = "", this.contentPadding = "", this.hideIndicator = !1, this.indicatorRotate = 90, this.backdrop = !0, this.inline = !1, this._summaryRef = v(), this._contentSlotRef = v(), this._root = null, this._movedNodes = [];
|
|
217
|
+
}
|
|
218
|
+
connectedCallback() {
|
|
219
|
+
super.connectedCallback(), s(window, "keydown").pipe(o((e) => e.key === "Escape"), o(() => this.open), u(() => {
|
|
220
|
+
this._handleClose();
|
|
221
|
+
}), l(this.disconnecting)).subscribe(), s(document, "pointerdown").pipe(o(() => this.open), o((e) => !!this._root && !e.composedPath().includes(this._root)), u(() => {
|
|
222
|
+
this._handleClose();
|
|
223
|
+
}), l(this.disconnecting)).subscribe();
|
|
224
|
+
}
|
|
225
|
+
disconnectedCallback() {
|
|
226
|
+
super.disconnectedCallback(), this._movedNodes.length > 0 && (this._movedNodes.forEach((e) => this.appendChild(e)), this._movedNodes = []), this._root && this._root.children.length === 0 && (this._root.remove(), this._root = null);
|
|
227
|
+
}
|
|
228
|
+
async _getOrCreateRoot() {
|
|
229
|
+
let e = await c(this.discover("schmancy-theme")) ?? document.querySelector("schmancy-theme") ?? document.body, t = e.querySelector("schmancy-expand-root");
|
|
230
|
+
return t || (t = new b(), e.appendChild(t)), t;
|
|
231
|
+
}
|
|
232
|
+
close() {
|
|
233
|
+
this._handleClose();
|
|
234
|
+
}
|
|
235
|
+
expand() {
|
|
236
|
+
this.open || this._expand();
|
|
237
|
+
}
|
|
238
|
+
updated(e) {
|
|
239
|
+
super.updated(e), e.has("open") && this.open && !this.inline && !this._root && this._expand();
|
|
240
|
+
}
|
|
241
|
+
_toggle() {
|
|
242
|
+
this.inline ? (this.open = !this.open, this._animateIndicator(this.open)) : this.open || this._expand();
|
|
243
|
+
}
|
|
244
|
+
_handleSummaryClick(e) {
|
|
245
|
+
e.preventDefault(), this._toggle();
|
|
246
|
+
}
|
|
247
|
+
async _expand() {
|
|
248
|
+
if (this.inline) return this.open = !0, void this._animateIndicator(!0);
|
|
249
|
+
let e = await this._getOrCreateRoot();
|
|
250
|
+
this._root = e;
|
|
251
|
+
let t = this._summaryRef.value, n = this._contentSlotRef.value;
|
|
252
|
+
if (!t || !n) return;
|
|
253
|
+
let r = t.getBoundingClientRect(), i = n.assignedElements({ flatten: !0 });
|
|
254
|
+
i.length !== 0 && (e.prepare(r, this, this.hideIndicator, this.backdrop), this._movedNodes = [...i], this._movedNodes.forEach((t) => e.appendChild(t)), e.triggerOpen(), this._animateIndicator(!0), this.open = !0);
|
|
255
|
+
}
|
|
256
|
+
async _handleClose() {
|
|
257
|
+
if (this.inline) return this._animateIndicator(!1), void (this.open = !1);
|
|
258
|
+
let e = this._root, t = this._summaryRef.value;
|
|
259
|
+
if (!e || !t) return;
|
|
260
|
+
let n = t.getBoundingClientRect();
|
|
261
|
+
this._animateIndicator(!1), await e.triggerClose(n), this._movedNodes.forEach((e) => this.appendChild(e)), this._movedNodes = [], this.open = !1;
|
|
262
|
+
}
|
|
263
|
+
_animateIndicator(e) {
|
|
264
|
+
if (a.value) return;
|
|
265
|
+
let t = this.shadowRoot?.querySelector(".indicator");
|
|
266
|
+
t && (this._currentIndicatorAnim?.cancel(), this._currentIndicatorAnim = t.animate([{ transform: `rotate(${e ? "0deg" : `${this.indicatorRotate}deg`})` }, { transform: `rotate(${e ? `${this.indicatorRotate}deg` : "0deg"})` }], {
|
|
267
|
+
duration: i.duration,
|
|
268
|
+
easing: i.easingFallback,
|
|
269
|
+
fill: "forwards"
|
|
270
|
+
}));
|
|
271
|
+
}
|
|
272
|
+
render() {
|
|
273
|
+
let e = this.classMap({
|
|
274
|
+
[this.summaryPadding]: !0,
|
|
275
|
+
"select-none relative flex items-center gap-2 rounded-xl transition-all duration-150": !0,
|
|
276
|
+
"hover:brightness-[0.92] active:brightness-[0.85] cursor-pointer group": !0,
|
|
277
|
+
"flex-row-reverse": !0
|
|
278
|
+
});
|
|
279
|
+
return g`
|
|
280
|
+
<div class="w-full rounded-xl">
|
|
281
|
+
<div
|
|
282
|
+
${y(this._summaryRef)}
|
|
283
|
+
class=${e}
|
|
284
|
+
tabindex="0"
|
|
285
|
+
role="button"
|
|
286
|
+
@click=${this._handleSummaryClick}
|
|
287
|
+
@keydown=${(e) => {
|
|
288
|
+
e.key !== "Enter" && e.key !== " " || (e.preventDefault(), this._toggle());
|
|
289
|
+
}}
|
|
290
|
+
>
|
|
291
|
+
${this.hideIndicator ? _ : g`
|
|
292
|
+
<span class="indicator flex items-center justify-center w-5 h-5 rounded-full shrink-0 opacity-70 group-hover:opacity-100 will-change-transform">
|
|
293
|
+
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true">
|
|
294
|
+
<path
|
|
295
|
+
d="M9 6L15 12L9 18"
|
|
296
|
+
stroke="currentColor"
|
|
297
|
+
stroke-width="2"
|
|
298
|
+
stroke-linecap="round"
|
|
299
|
+
stroke-linejoin="round"
|
|
300
|
+
/>
|
|
301
|
+
</svg>
|
|
302
|
+
</span>
|
|
303
|
+
`}
|
|
304
|
+
|
|
305
|
+
<span class="flex-1 font-medium text-base min-w-0">
|
|
306
|
+
<slot name="summary">${this.summary}</slot>
|
|
307
|
+
</span>
|
|
308
|
+
|
|
309
|
+
<slot name="actions"></slot>
|
|
310
|
+
</div>
|
|
311
|
+
|
|
312
|
+
${this.inline ? g`
|
|
313
|
+
<div class="inline-grid" ?data-open=${this.open}>
|
|
314
|
+
<div class="inner">
|
|
315
|
+
<slot ${y(this._contentSlotRef)}></slot>
|
|
316
|
+
</div>
|
|
317
|
+
</div>
|
|
318
|
+
` : g`
|
|
319
|
+
<div style=${d(this.open ? {} : { display: "none" })}>
|
|
320
|
+
<slot ${y(this._contentSlotRef)}></slot>
|
|
321
|
+
</div>
|
|
322
|
+
`}
|
|
323
|
+
</div>
|
|
324
|
+
`;
|
|
325
|
+
}
|
|
326
|
+
};
|
|
327
|
+
t([p()], S.prototype, "summary", void 0), t([p({
|
|
328
|
+
type: Boolean,
|
|
329
|
+
reflect: !0
|
|
330
|
+
})], S.prototype, "open", void 0), t([p({ attribute: "summary-padding" })], S.prototype, "summaryPadding", void 0), t([p({ attribute: "content-padding" })], S.prototype, "contentPadding", void 0), t([p({
|
|
331
|
+
type: Boolean,
|
|
332
|
+
attribute: "hide-indicator"
|
|
333
|
+
})], S.prototype, "hideIndicator", void 0), t([p({
|
|
334
|
+
type: Number,
|
|
335
|
+
attribute: "indicator-rotate"
|
|
336
|
+
})], S.prototype, "indicatorRotate", void 0), t([p({ type: Boolean })], S.prototype, "backdrop", void 0), t([p({ type: Boolean })], S.prototype, "inline", void 0), S = t([f("schmancy-expand")], S);
|
|
337
|
+
export { b as n, x as t };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expand-BXt9SqAF.js","names":[],"sources":["../src/expand/expand-root.component.ts","../src/expand/expand.component.ts"],"sourcesContent":["import { css, html, nothing } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { createRef, ref } from 'lit/directives/ref.js'\nimport { TailwindElement, SurfaceMixin } from '@mixins/index'\nimport type { TSurfaceColor } from '@schmancy/types'\nimport { SPRING_SMOOTH } from '../utils/animation.js'\nimport { reducedMotion$ } from '../directives/reduced-motion'\nimport '../surface/surface.js'\n\n@customElement('schmancy-expand-root')\nexport class SchmancyExpandRoot extends SurfaceMixin(TailwindElement(css`\n\t:host {\n\t\tdisplay: contents;\n\t}\n\n\t.portal-panel {\n\t\tposition: fixed;\n\t\ttransform-origin: top left;\n\t\twill-change: clip-path, opacity;\n\t\tborder-radius: 1rem;\n\t\tbox-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.5);\n\t\tz-index: 9999;\n\t}\n\n\t.minimize-btn {\n\t\tposition: absolute;\n\t\ttop: 0.5rem;\n\t\tright: 0.5rem;\n\t\tz-index: 1;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: 2rem;\n\t\theight: 2rem;\n\t\tborder-radius: 9999px;\n\t\tborder: none;\n\t\tbackground: transparent;\n\t\tcursor: pointer;\n\t\topacity: 0.5;\n\t\ttransition: opacity 150ms, background 150ms;\n\t\tcolor: inherit;\n\t}\n\n\t.minimize-btn:hover {\n\t\topacity: 1;\n\t\tbackground: rgb(0 0 0 / 0.08);\n\t}\n`)) {\n\t@property({ reflect: true }) override type: TSurfaceColor = 'solid'\n\t@state() isOpen = false\n\tprivate summaryRect: DOMRect | null = null\n\n\tprivate _panelRef = createRef<HTMLElement>()\n\tprivate _backdropRef = createRef<HTMLDivElement>()\n\tprivate _btnRef = createRef<HTMLButtonElement>()\n\tprivate _owner: (Element & { close?: () => void }) | null = null\n\tprivate _hideIndicator = false\n\tprivate _backdrop = true\n\n\t/** Called by schmancy-expand before nodes are moved */\n\tprepare(rect: DOMRect, owner: Element, hideIndicator = false, backdrop = true) {\n\t\tthis.summaryRect = rect\n\t\tthis._owner = owner as Element & { close?: () => void }\n\t\tthis._hideIndicator = hideIndicator\n\t\tthis._backdrop = backdrop\n\t}\n\n\t/** Called by schmancy-expand after nodes are moved in */\n\tasync triggerOpen() {\n\t\tthis.isOpen = true\n\t\tawait this.updateComplete\n\n\t\tconst panel = this._panelRef.value\n\t\tif (!panel) return\n\n\t\tconst src = this.summaryRect!\n\n\t\t// 1. Anchor at summary's top-left, measure natural content size\n\t\t// Use nearly full viewport height for measurement so content near the bottom\n\t\t// of the screen isn't artificially capped — the positioning step will move the panel up.\n\t\tObject.assign(panel.style, {\n\t\t\tvisibility: 'hidden',\n\t\t\ttop: `${src.top}px`,\n\t\t\tleft: `${src.left}px`,\n\t\t\tminWidth: `${src.width}px`,\n\t\t\twidth: 'max-content',\n\t\t\tmaxWidth: `${window.innerWidth - src.left}px`,\n\t\t\theight: 'auto',\n\t\t\tmaxHeight: `${window.innerHeight - 32}px`,\n\t\t\toverflowY: 'auto',\n\t\t})\n\n\t\tconst measured = panel.getBoundingClientRect()\n\t\tconst finalW = measured.width\n\t\tconst finalH = measured.height\n\n\t\t// 2. Adjust position so panel stays within viewport\n\t\tlet finalTop = src.top\n\t\tlet finalLeft = src.left\n\t\tif (finalTop + finalH > window.innerHeight) {\n\t\t\tfinalTop = Math.max(0, src.bottom - finalH)\n\t\t}\n\t\tif (finalLeft + finalW > window.innerWidth) {\n\t\t\tfinalLeft = Math.max(0, window.innerWidth - finalW)\n\t\t}\n\n\t\t// 3. Compute clip-path insets — summary rect expressed relative to panel final position\n\t\t// These insets shrink the visible area down to exactly the summary box\n\t\tconst insetTop = Math.max(0, src.top - finalTop)\n\t\tconst insetLeft = Math.max(0, src.left - finalLeft)\n\t\tconst insetRight = Math.max(0, finalLeft + finalW - (src.left + src.width))\n\t\tconst insetBottom = Math.max(0, finalTop + finalH - (src.top + src.height))\n\n\t\t// 4. Place panel at final size + position, masked to summary bounds (no flash)\n\t\tObject.assign(panel.style, {\n\t\t\tvisibility: '',\n\t\t\ttop: `${finalTop}px`,\n\t\t\tleft: `${finalLeft}px`,\n\t\t\tminWidth: `${src.width}px`,\n\t\t\twidth: `${finalW}px`,\n\t\t\theight: `${finalH}px`,\n\t\t\tmaxWidth: '',\n\t\t\tmaxHeight: '',\n\t\t\tclipPath: `inset(${insetTop}px ${insetRight}px ${insetBottom}px ${insetLeft}px round 0.5rem)`,\n\t\t})\n\n\t\t// 5. Animate the mask open — content revealed, not stretched\n\t\tthis._animateOpen(insetTop, insetRight, insetBottom, insetLeft, finalTop)\n\t}\n\n\t/** Animate close, return Promise resolving when done */\n\tasync triggerClose(targetRect: DOMRect): Promise<void> {\n\t\tawait this._animateClose(targetRect)\n\t\tthis.isOpen = false\n\t\tthis.summaryRect = null\n\t}\n\n\tprivate _animateOpen(insetTop: number, insetRight: number, insetBottom: number, insetLeft: number, finalTop: number) {\n\t\tconst panel = this._panelRef.value\n\t\tif (!panel) return\n\n\t\tif (reducedMotion$.value) {\n\t\t\tpanel.style.clipPath = ''\n\t\t\treturn\n\t\t}\n\n\t\tconst backdrop = this._backdropRef.value\n\t\tif (backdrop) {\n\t\t\tbackdrop.animate([{ opacity: 0 }, { opacity: 1 }], {\n\t\t\t\tduration: SPRING_SMOOTH.duration,\n\t\t\t\teasing: SPRING_SMOOTH.easingFallback,\n\t\t\t\tfill: 'forwards',\n\t\t\t})\n\t\t}\n\n\t\tconst keyframes: Keyframe[] = [\n\t\t\t{\n\t\t\t\tclipPath: `inset(${insetTop}px ${insetRight}px ${insetBottom}px ${insetLeft}px round 0.5rem)`,\n\t\t\t\topacity: 0.9,\n\t\t\t},\n\t\t\t{\n\t\t\t\tclipPath: 'inset(0px 0px 0px 0px round 1rem)',\n\t\t\t\topacity: 1,\n\t\t\t},\n\t\t]\n\n\t\tconst anim = panel.animate(keyframes, {\n\t\t\tduration: SPRING_SMOOTH.duration,\n\t\t\teasing: SPRING_SMOOTH.easingFallback,\n\t\t\tfill: 'forwards',\n\t\t})\n\n\t\t// Clear clip-path and fixed dimensions after animation so content can grow naturally,\n\t\t// but cap at viewport height so overflow-y: auto can scroll\n\t\tanim.finished.then(() => {\n\t\t\tif (panel.isConnected) {\n\t\t\t\tpanel.style.clipPath = ''\n\t\t\t\tpanel.style.height = 'auto'\n\t\t\t\tpanel.style.maxHeight = `${window.innerHeight - finalTop - 16}px`\n\t\t\t}\n\t\t})\n\n\t\tconst btn = this._btnRef.value\n\t\tif (btn) {\n\t\t\tbtn.animate([{ transform: 'rotate(0deg)' }, { transform: 'rotate(180deg)' }], {\n\t\t\t\tduration: SPRING_SMOOTH.duration,\n\t\t\t\teasing: SPRING_SMOOTH.easingFallback,\n\t\t\t\tfill: 'forwards',\n\t\t\t})\n\t\t}\n\t}\n\n\tprivate _animateClose(targetRect: DOMRect): Promise<void> {\n\t\tconst panel = this._panelRef.value\n\t\tif (!panel) return Promise.resolve()\n\t\tif (reducedMotion$.value) return Promise.resolve()\n\n\t\t// Compute insets to mask panel back down to the summary box\n\t\tconst panelRect = panel.getBoundingClientRect()\n\t\tconst insetTop = Math.max(0, targetRect.top - panelRect.top)\n\t\tconst insetLeft = Math.max(0, targetRect.left - panelRect.left)\n\t\tconst insetRight = Math.max(0, panelRect.right - targetRect.right)\n\t\tconst insetBottom = Math.max(0, panelRect.bottom - targetRect.bottom)\n\n\t\tconst closeDuration = Math.round(SPRING_SMOOTH.duration * 0.4)\n\t\tconst closeEasing = 'cubic-bezier(0.4, 0, 1, 1)'\n\n\t\tconst closeKeyframes: Keyframe[] = [\n\t\t\t{ clipPath: 'inset(0px 0px 0px 0px round 1rem)', opacity: 1 },\n\t\t\t{\n\t\t\t\tclipPath: `inset(${insetTop}px ${insetRight}px ${insetBottom}px ${insetLeft}px round 0.5rem)`,\n\t\t\t\topacity: 0.6,\n\t\t\t},\n\t\t]\n\n\t\tconst anim = panel.animate(closeKeyframes, { duration: closeDuration, easing: closeEasing, fill: 'forwards' })\n\n\t\tconst backdrop = this._backdropRef.value\n\t\tif (backdrop) {\n\t\t\tbackdrop.animate([{ opacity: 1 }, { opacity: 0 }], {\n\t\t\t\tduration: closeDuration,\n\t\t\t\teasing: closeEasing,\n\t\t\t\tfill: 'forwards',\n\t\t\t})\n\t\t}\n\n\t\tconst btn = this._btnRef.value\n\t\tif (btn) {\n\t\t\tbtn.animate([{ transform: 'rotate(180deg)' }, { transform: 'rotate(0deg)' }], {\n\t\t\t\tduration: closeDuration,\n\t\t\t\teasing: closeEasing,\n\t\t\t\tfill: 'forwards',\n\t\t\t})\n\t\t}\n\n\t\treturn anim.finished as unknown as Promise<void>\n\t}\n\n\trender() {\n\t\tif (!this.isOpen) return nothing\n\n\t\treturn html`\n\t\t\t${this._backdrop ? html`\n\t\t\t\t<div\n\t\t\t\t\t${ref(this._backdropRef)}\n\t\t\t\t\tclass=\"fixed inset-0 z-9998 backdrop-blur-sm backdrop-saturate-150 backdrop-brightness-105 bg-black/[0.07] will-change-[opacity]\"\n\t\t\t\t\t@click=${() => this._owner?.close?.()}\n\t\t\t\t></div>\n\t\t\t` : nothing}\n\t\t\t<schmancy-surface\n\t\t\t\t${ref(this._panelRef)}\n\t\t\t\tclass=\"portal-panel\"\n\t\t\t\ttype=${this.type}\n\t\t\t\tstyle=\"overflow-y: auto;\"\n\t\t\t>\n\t\t\t\t${!this._hideIndicator ? html`\n\t\t\t\t\t<button\n\t\t\t\t\t\t${ref(this._btnRef)}\n\t\t\t\t\t\tclass=\"minimize-btn\"\n\t\t\t\t\t\taria-label=\"Minimize\"\n\t\t\t\t\t\t@click=${() => this._owner?.close?.()}\n\t\t\t\t\t>\n\t\t\t\t\t\t<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t<path d=\"M19 9L12 16L5 9\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</button>\n\t\t\t\t` : nothing}\n\t\t\t\t<slot></slot>\n\t\t\t</schmancy-surface>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-expand-root': SchmancyExpandRoot\n\t}\n}\n","import { css, html, nothing } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport { createRef, ref } from 'lit/directives/ref.js'\nimport { styleMap } from 'lit/directives/style-map.js'\nimport { filter, fromEvent, lastValueFrom } from 'rxjs'\nimport { tap, takeUntil } from 'rxjs/operators'\nimport { TailwindElement } from '@mixins/index'\nimport { SPRING_SNAPPY } from '../utils/animation.js'\nimport { reducedMotion$ } from '../directives/reduced-motion'\nimport { SchmancyExpandRoot } from './expand-root.component.js'\n\n/** Dispatch this event on window to close whichever schmancy-expand is currently open */\nexport const SCHMANCY_EXPAND_REQUEST_CLOSE = 'schmancy-expand-request-close'\n\n@customElement('schmancy-expand')\nexport default class SchmancyExpand extends TailwindElement(css`\n\t:host {\n\t\tdisplay: block;\n\t}\n\n\tsummary::-webkit-details-marker {\n\t\tdisplay: none;\n\t}\n\n\tsummary {\n\t\tlist-style: none;\n\t\tcolor: inherit;\n\t}\n\n\t.inline-grid {\n\t\tdisplay: grid;\n\t\tgrid-template-rows: 0fr;\n\t\toverflow: hidden;\n\t\ttransition: grid-template-rows 300ms cubic-bezier(0.22, 1.25, 0.36, 1),\n\t\t opacity 300ms cubic-bezier(0.22, 1.25, 0.36, 1);\n\t\topacity: 0;\n\t}\n\n\t.inline-grid[data-open] {\n\t\tgrid-template-rows: 1fr;\n\t\topacity: 1;\n\t}\n\n\t.inline-grid > .inner {\n\t\tmin-height: 0;\n\t\toverflow: hidden;\n\t}\n`) {\n\t@property() summary = ''\n\n\t@property({ type: Boolean, reflect: true }) open = false\n\n\t@property({ attribute: 'summary-padding' }) summaryPadding = ''\n\n\t@property({ attribute: 'content-padding' }) contentPadding = ''\n\n\t@property({ type: Boolean, attribute: 'hide-indicator' }) hideIndicator = false\n\n\t@property({ type: Number, attribute: 'indicator-rotate' }) indicatorRotate = 90\n\n\t@property({ type: Boolean }) backdrop = true\n\n\t@property({ type: Boolean }) inline = false\n\n\tprivate _summaryRef = createRef<HTMLElement>()\n\tprivate _contentSlotRef = createRef<HTMLSlotElement>()\n\tprivate _root: SchmancyExpandRoot | null = null\n\tprivate _movedNodes: Element[] = []\n\tprivate _currentIndicatorAnim: Animation | undefined\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback()\n\n\t\t// Close on Escape key\n\t\tfromEvent<KeyboardEvent>(window, 'keydown')\n\t\t\t.pipe(\n\t\t\t\tfilter(e => e.key === 'Escape'),\n\t\t\t\tfilter(() => this.open),\n\t\t\t\ttap(() => void this._handleClose()),\n\t\t\t\ttakeUntil(this.disconnecting),\n\t\t\t)\n\t\t\t.subscribe()\n\n\t\t// Close on click outside the portal panel\n\t\tfromEvent<PointerEvent>(document, 'pointerdown')\n\t\t\t.pipe(\n\t\t\t\tfilter(() => this.open),\n\t\t\t\tfilter(e => !!this._root && !e.composedPath().includes(this._root)),\n\t\t\t\ttap(() => void this._handleClose()),\n\t\t\t\ttakeUntil(this.disconnecting),\n\t\t\t)\n\t\t\t.subscribe()\n\t}\n\n\tdisconnectedCallback() {\n\t\tsuper.disconnectedCallback()\n\t\tif (this._movedNodes.length > 0) {\n\t\t\tthis._movedNodes.forEach(n => this.appendChild(n))\n\t\t\tthis._movedNodes = []\n\t\t}\n\t\tif (this._root && this._root.children.length === 0) {\n\t\t\tthis._root.remove()\n\t\t\tthis._root = null\n\t\t}\n\t}\n\n\tprivate async _getOrCreateRoot(): Promise<SchmancyExpandRoot> {\n\t\tconst theme = await lastValueFrom(this.discover<HTMLElement>('schmancy-theme'))\n\t\tconst container: HTMLElement = theme ?? document.querySelector('schmancy-theme') ?? document.body\n\t\tlet root = container.querySelector('schmancy-expand-root') as SchmancyExpandRoot | null\n\t\tif (!root) {\n\t\t\troot = new SchmancyExpandRoot()\n\t\t\tcontainer.appendChild(root)\n\t\t}\n\t\treturn root\n\t}\n\n\t/** Close the expand portal, animating back to the summary position. */\n\tpublic close(): void {\n\t\tvoid this._handleClose()\n\t}\n\n\t/** Programmatically open the expand portal. */\n\tpublic expand(): void {\n\t\tif (this.open) return\n\t\tvoid this._expand()\n\t}\n\n\tprotected override updated(changed: Map<PropertyKey, unknown>) {\n\t\tsuper.updated(changed)\n\t\tif (changed.has('open') && this.open && !this.inline && !this._root) {\n\t\t\tvoid this._expand()\n\t\t}\n\t}\n\n\tprivate _toggle() {\n\t\tif (this.inline) {\n\t\t\tthis.open = !this.open\n\t\t\tthis._animateIndicator(this.open)\n\t\t} else if (!this.open) {\n\t\t\tvoid this._expand()\n\t\t}\n\t}\n\n\tprivate _handleSummaryClick(e: MouseEvent) {\n\t\te.preventDefault()\n\t\tthis._toggle()\n\t}\n\n\tprivate async _expand() {\n\t\tif (this.inline) {\n\t\t\tthis.open = true\n\t\t\tthis._animateIndicator(true)\n\t\t\treturn\n\t\t}\n\n\t\tconst root = await this._getOrCreateRoot()\n\t\tthis._root = root\n\t\tconst summary = this._summaryRef.value\n\t\tconst contentSlot = this._contentSlotRef.value\n\t\tif (!summary || !contentSlot) return\n\n\t\tconst summaryRect = summary.getBoundingClientRect()\n\t\tconst nodes = contentSlot.assignedElements({ flatten: true })\n\t\tif (nodes.length === 0) return\n\n\t\troot.prepare(summaryRect, this, this.hideIndicator, this.backdrop)\n\n\t\tthis._movedNodes = [...nodes]\n\t\tthis._movedNodes.forEach(n => root.appendChild(n))\n\n\t\troot.triggerOpen()\n\n\t\tthis._animateIndicator(true)\n\t\tthis.open = true\n\t}\n\n\tasync _handleClose() {\n\t\tif (this.inline) {\n\t\t\tthis._animateIndicator(false)\n\t\t\tthis.open = false\n\t\t\treturn\n\t\t}\n\n\t\tconst root = this._root\n\t\tconst summary = this._summaryRef.value\n\t\tif (!root || !summary) return\n\n\t\tconst summaryRect = summary.getBoundingClientRect()\n\t\tthis._animateIndicator(false)\n\n\t\tawait root.triggerClose(summaryRect)\n\n\t\tthis._movedNodes.forEach(n => this.appendChild(n))\n\t\tthis._movedNodes = []\n\t\tthis.open = false\n\t}\n\n\tprivate _animateIndicator(isOpen: boolean) {\n\t\tif (reducedMotion$.value) return\n\n\t\tconst indicator = this.shadowRoot?.querySelector('.indicator') as HTMLElement | null\n\t\tif (!indicator) return\n\n\t\tthis._currentIndicatorAnim?.cancel()\n\t\tthis._currentIndicatorAnim = indicator.animate(\n\t\t\t[\n\t\t\t\t{ transform: `rotate(${isOpen ? '0deg' : `${this.indicatorRotate}deg`})` },\n\t\t\t\t{ transform: `rotate(${isOpen ? `${this.indicatorRotate}deg` : '0deg'})` },\n\t\t\t],\n\t\t\t{\n\t\t\t\tduration: SPRING_SNAPPY.duration,\n\t\t\t\teasing: SPRING_SNAPPY.easingFallback,\n\t\t\t\tfill: 'forwards',\n\t\t\t},\n\t\t)\n\t}\n\n\trender() {\n\t\tconst summaryClasses = this.classMap({\n\t\t\t[this.summaryPadding]: true,\n\t\t\t'select-none relative flex items-center gap-2 rounded-xl transition-all duration-150': true,\n\t\t\t'hover:brightness-[0.92] active:brightness-[0.85] cursor-pointer group': true,\n\t\t\t'flex-row-reverse': true,\n\t\t})\n\n\t\treturn html`\n\t\t\t<div class=\"w-full rounded-xl\">\n\t\t\t\t<div\n\t\t\t\t\t${ref(this._summaryRef)}\n\t\t\t\t\tclass=${summaryClasses}\n\t\t\t\t\ttabindex=\"0\"\n\t\t\t\t\trole=\"button\"\n\t\t\t\t\t@click=${this._handleSummaryClick}\n\t\t\t\t\t@keydown=${(e: KeyboardEvent) => {\n\t\t\t\t\t\tif (e.key === 'Enter' || e.key === ' ') {\n\t\t\t\t\t\t\te.preventDefault()\n\t\t\t\t\t\t\tthis._toggle()\n\t\t\t\t\t\t}\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t${!this.hideIndicator\n\t\t\t\t\t\t? html`\n\t\t\t\t\t\t\t\t<span class=\"indicator flex items-center justify-center w-5 h-5 rounded-full shrink-0 opacity-70 group-hover:opacity-100 will-change-transform\">\n\t\t\t\t\t\t\t\t\t<svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\td=\"M9 6L15 12L9 18\"\n\t\t\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t`\n\t\t\t\t\t\t: nothing}\n\n\t\t\t\t\t<span class=\"flex-1 font-medium text-base min-w-0\">\n\t\t\t\t\t\t<slot name=\"summary\">${this.summary}</slot>\n\t\t\t\t\t</span>\n\n\t\t\t\t\t<slot name=\"actions\"></slot>\n\t\t\t\t</div>\n\n\t\t\t\t${this.inline\n\t\t\t\t\t? html`\n\t\t\t\t\t\t<div class=\"inline-grid\" ?data-open=${this.open}>\n\t\t\t\t\t\t\t<div class=\"inner\">\n\t\t\t\t\t\t\t\t<slot ${ref(this._contentSlotRef)}></slot>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`\n\t\t\t\t\t: html`\n\t\t\t\t\t\t<div style=${styleMap(this.open ? {} : { display: 'none' })}>\n\t\t\t\t\t\t\t<slot ${ref(this._contentSlotRef)}></slot>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`}\n\t\t\t</div>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-expand': SchmancyExpand\n\t}\n}\n"],"mappings":"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"}
|