@mhmo91/schmancy 0.10.40 → 0.10.42
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/custom-elements.json +27 -100
- package/dist/SchmancyElement-OG71FtNv.js +286 -0
- package/dist/{SchmancyElement-BNnyBOwk.js.map → SchmancyElement-OG71FtNv.js.map} +1 -1
- package/dist/SchmancyElement-PS1u0j1B.cjs +2 -0
- package/dist/{SchmancyElement-C41uPa6l.cjs.map → SchmancyElement-PS1u0j1B.cjs.map} +1 -1
- package/dist/agent/schmancy.agent.js +48 -213
- package/dist/agent/schmancy.agent.js.map +1 -1
- package/dist/agent/schmancy.manifest.json +10 -36
- package/dist/{area-2FrTZI_T.cjs → area-CaEI33G0.cjs} +1 -1
- package/dist/{area-2FrTZI_T.cjs.map → area-CaEI33G0.cjs.map} +1 -1
- package/dist/{area-KVDzhT4s.js → area-DtCNCb8w.js} +2 -2
- package/dist/{area-KVDzhT4s.js.map → area-DtCNCb8w.js.map} +1 -1
- package/dist/area.cjs +1 -1
- package/dist/area.js +1 -1
- package/dist/{audio-EaD0Ggfh.cjs → audio-B924fI5N.cjs} +1 -1
- package/dist/{audio-EaD0Ggfh.cjs.map → audio-B924fI5N.cjs.map} +1 -1
- package/dist/{audio-D3gnp15Y.js → audio-DdN76ikW.js} +1 -1
- package/dist/{audio-D3gnp15Y.js.map → audio-DdN76ikW.js.map} +1 -1
- package/dist/audio.cjs +1 -1
- package/dist/audio.js +2 -2
- package/dist/{autocomplete-DMmxsvUe.cjs → autocomplete-Dq3BkitV.cjs} +1 -1
- package/dist/{autocomplete-DMmxsvUe.cjs.map → autocomplete-Dq3BkitV.cjs.map} +1 -1
- package/dist/{autocomplete-DWiEqlQf.js → autocomplete-UNOknYUz.js} +3 -3
- package/dist/{autocomplete-DWiEqlQf.js.map → autocomplete-UNOknYUz.js.map} +1 -1
- package/dist/autocomplete.cjs +1 -1
- package/dist/autocomplete.js +1 -1
- package/dist/avatar.cjs +1 -1
- package/dist/avatar.js +3 -3
- package/dist/badge.cjs +1 -1
- package/dist/badge.js +1 -1
- package/dist/{boat-BeqA9_ms.js → boat-BZah1Sf9.js} +5 -7
- package/dist/{boat-BeqA9_ms.js.map → boat-BZah1Sf9.js.map} +1 -1
- package/dist/{boat-BJPl_Jti.cjs → boat-D3bEjxf8.cjs} +2 -4
- package/dist/{boat-BJPl_Jti.cjs.map → boat-D3bEjxf8.cjs.map} +1 -1
- package/dist/boat.cjs +1 -1
- package/dist/boat.js +1 -1
- package/dist/breadcrumb.cjs +1 -1
- package/dist/breadcrumb.js +2 -2
- package/dist/{busy-Cj_PV7oC.cjs → busy--WqiXKnl.cjs} +1 -1
- package/dist/{busy-Cj_PV7oC.cjs.map → busy--WqiXKnl.cjs.map} +1 -1
- package/dist/{busy-enYCTssB.js → busy-DzXyO0z6.js} +2 -2
- package/dist/{busy-enYCTssB.js.map → busy-DzXyO0z6.js.map} +1 -1
- package/dist/busy.cjs +1 -1
- package/dist/busy.js +1 -1
- package/dist/{button-B9RfBt-n.cjs → button-CTvS5YX4.cjs} +1 -1
- package/dist/{button-B9RfBt-n.cjs.map → button-CTvS5YX4.cjs.map} +1 -1
- package/dist/{button-D6LJC-HC.js → button-DgoDfcJx.js} +2 -2
- package/dist/{button-D6LJC-HC.js.map → button-DgoDfcJx.js.map} +1 -1
- package/dist/button.cjs +1 -1
- package/dist/button.js +3 -3
- package/dist/{card-BHTz1GwB.js → card-C6ijJZpF.js} +2 -2
- package/dist/{card-BHTz1GwB.js.map → card-C6ijJZpF.js.map} +1 -1
- package/dist/{card-ThG_ZaQE.cjs → card-Ci3_9Dd4.cjs} +1 -1
- package/dist/{card-ThG_ZaQE.cjs.map → card-Ci3_9Dd4.cjs.map} +1 -1
- package/dist/card.cjs +1 -1
- package/dist/card.js +1 -1
- package/dist/{checkbox-Ce0DlAdW.js → checkbox-7vEPZuGC.js} +2 -2
- package/dist/{checkbox-Ce0DlAdW.js.map → checkbox-7vEPZuGC.js.map} +1 -1
- package/dist/{checkbox-C4zeib84.cjs → checkbox-DXKdxkXE.cjs} +1 -1
- package/dist/{checkbox-C4zeib84.cjs.map → checkbox-DXKdxkXE.cjs.map} +1 -1
- package/dist/checkbox.cjs +1 -1
- package/dist/checkbox.js +1 -1
- package/dist/{chips-wfJ7YtWv.cjs → chips-9eG-96_D.cjs} +1 -1
- package/dist/{chips-wfJ7YtWv.cjs.map → chips-9eG-96_D.cjs.map} +1 -1
- package/dist/{chips-BoZSpSh_.js → chips-DF7akwz7.js} +4 -4
- package/dist/{chips-BoZSpSh_.js.map → chips-DF7akwz7.js.map} +1 -1
- package/dist/chips.cjs +1 -1
- package/dist/chips.js +2 -2
- package/dist/connectivity.cjs +2 -4
- package/dist/connectivity.cjs.map +1 -1
- package/dist/connectivity.js +4 -6
- package/dist/connectivity.js.map +1 -1
- package/dist/content-drawer.cjs +1 -1
- package/dist/content-drawer.js +1 -1
- package/dist/{date-range-DJrdpzev.js → date-range-C13_R3OA.js} +3 -3
- package/dist/{date-range-DJrdpzev.js.map → date-range-C13_R3OA.js.map} +1 -1
- package/dist/{date-range-BHSzlwSL.cjs → date-range-Q2xj5Syc.cjs} +1 -1
- package/dist/{date-range-BHSzlwSL.cjs.map → date-range-Q2xj5Syc.cjs.map} +1 -1
- package/dist/{date-range-inline-DjRdMZ1z.js → date-range-inline-BnOD-ddB.js} +2 -2
- package/dist/{date-range-inline-DjRdMZ1z.js.map → date-range-inline-BnOD-ddB.js.map} +1 -1
- package/dist/{date-range-inline-D0I6k84h.cjs → date-range-inline-DV2c_gWM.cjs} +1 -1
- package/dist/{date-range-inline-D0I6k84h.cjs.map → date-range-inline-DV2c_gWM.cjs.map} +1 -1
- package/dist/date-range-inline.cjs +1 -1
- package/dist/date-range-inline.js +1 -1
- package/dist/date-range.cjs +1 -1
- package/dist/date-range.js +1 -1
- package/dist/delay.cjs +1 -1
- package/dist/delay.js +2 -2
- package/dist/{details-DQNj2oaU.cjs → details-B2-jECBh.cjs} +3 -2
- package/dist/details-B2-jECBh.cjs.map +1 -0
- package/dist/{details-CY49XVfp.js → details-ByF66CyY.js} +4 -3
- package/dist/details-ByF66CyY.js.map +1 -0
- package/dist/details.cjs +1 -1
- package/dist/details.js +1 -1
- package/dist/{directives-BvRTjCFa.js → directives-BL7mzVsA.js} +3 -3
- package/dist/{directives-BvRTjCFa.js.map → directives-BL7mzVsA.js.map} +1 -1
- package/dist/{directives-BZIRQDBq.cjs → directives-DCb_LA9R.cjs} +1 -1
- package/dist/{directives-BZIRQDBq.cjs.map → directives-DCb_LA9R.cjs.map} +1 -1
- package/dist/directives.cjs +1 -1
- package/dist/directives.js +2 -2
- package/dist/{divider-Ck2C1sKl.cjs → divider-Bv2QiOZL.cjs} +1 -1
- package/dist/{divider-Ck2C1sKl.cjs.map → divider-Bv2QiOZL.cjs.map} +1 -1
- package/dist/{divider-BeyX_C0A.js → divider-gYuz0zDU.js} +2 -2
- package/dist/{divider-BeyX_C0A.js.map → divider-gYuz0zDU.js.map} +1 -1
- package/dist/divider.cjs +1 -1
- package/dist/divider.js +1 -1
- package/dist/dropdown.cjs +1 -1
- package/dist/dropdown.js +2 -2
- package/dist/{expand-CUF163mg.cjs → expand-B9IUGVtc.cjs} +1 -1
- package/dist/{expand-CUF163mg.cjs.map → expand-B9IUGVtc.cjs.map} +1 -1
- package/dist/{expand-BYsSEtp6.js → expand-cZ8rfCWP.js} +3 -3
- package/dist/{expand-BYsSEtp6.js.map → expand-cZ8rfCWP.js.map} +1 -1
- package/dist/expand.cjs +1 -1
- package/dist/expand.js +1 -1
- package/dist/fab.cjs +1 -1
- package/dist/fab.js +2 -2
- package/dist/{float-OvqX0nqG.cjs → float-DkGyWSWy.cjs} +1 -1
- package/dist/{float-OvqX0nqG.cjs.map → float-DkGyWSWy.cjs.map} +1 -1
- package/dist/{float-Cgllk_H9.js → float-zn3DgXBT.js} +2 -2
- package/dist/{float-Cgllk_H9.js.map → float-zn3DgXBT.js.map} +1 -1
- package/dist/float.cjs +1 -1
- package/dist/float.js +1 -1
- package/dist/{form-4GKROq2P.cjs → form-DowzVsgI.cjs} +1 -1
- package/dist/{form-4GKROq2P.cjs.map → form-DowzVsgI.cjs.map} +1 -1
- package/dist/{form-DxaV_Ose.js → form-tG7LwDm4.js} +3 -3
- package/dist/{form-DxaV_Ose.js.map → form-tG7LwDm4.js.map} +1 -1
- package/dist/form.cjs +1 -1
- package/dist/form.js +12 -12
- package/dist/handover/agent-runtime-followups.md +1 -1
- package/dist/handover/agent-runtime-v1.md +3 -3
- package/dist/{icons-sZ-LybA9.cjs → icons-BZeCloP9.cjs} +1 -1
- package/dist/{icons-sZ-LybA9.cjs.map → icons-BZeCloP9.cjs.map} +1 -1
- package/dist/{icons-CJ2mXcBi.js → icons-Dup5skuk.js} +2 -2
- package/dist/{icons-CJ2mXcBi.js.map → icons-Dup5skuk.js.map} +1 -1
- package/dist/icons.cjs +1 -1
- package/dist/icons.js +1 -1
- package/dist/{iframe-DpCv-QH2.cjs → iframe-CDJjnNmo.cjs} +1 -1
- package/dist/{iframe-DpCv-QH2.cjs.map → iframe-CDJjnNmo.cjs.map} +1 -1
- package/dist/{iframe-DWvN5nGB.js → iframe-Xc3EPMZT.js} +2 -2
- package/dist/{iframe-DWvN5nGB.js.map → iframe-Xc3EPMZT.js.map} +1 -1
- package/dist/iframe.cjs +1 -1
- package/dist/iframe.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +34 -34
- package/dist/{input-Z-3N5JMv.cjs → input-DnmC6J1T.cjs} +1 -1
- package/dist/{input-Z-3N5JMv.cjs.map → input-DnmC6J1T.cjs.map} +1 -1
- package/dist/{input-BCCHz6tB.js → input-cTyDxW9L.js} +2 -2
- package/dist/{input-BCCHz6tB.js.map → input-cTyDxW9L.js.map} +1 -1
- package/dist/{input-chip-ChAgRCXZ.cjs → input-chip-CV91URyU.cjs} +1 -1
- package/dist/{input-chip-ChAgRCXZ.cjs.map → input-chip-CV91URyU.cjs.map} +1 -1
- package/dist/{input-chip-BOrcKH-H.js → input-chip-CYI17YOq.js} +2 -2
- package/dist/{input-chip-BOrcKH-H.js.map → input-chip-CYI17YOq.js.map} +1 -1
- package/dist/input.cjs +1 -1
- package/dist/input.js +1 -1
- package/dist/json.cjs +1 -1
- package/dist/json.js +3 -3
- package/dist/kbd.cjs +1 -1
- package/dist/kbd.js +2 -2
- package/dist/{layout-DZ4dpLh9.cjs → layout-CNlZSJFU.cjs} +1 -1
- package/dist/{layout-DZ4dpLh9.cjs.map → layout-CNlZSJFU.cjs.map} +1 -1
- package/dist/{layout-CFiG3lNT.js → layout-DDxw0EwL.js} +1 -1
- package/dist/{layout-CFiG3lNT.js.map → layout-DDxw0EwL.js.map} +1 -1
- package/dist/layout.cjs +1 -1
- package/dist/layout.js +2 -2
- package/dist/{lightbox-B7Y4Nij_.js → lightbox-CH-y3rYB.js} +2 -2
- package/dist/{lightbox-B7Y4Nij_.js.map → lightbox-CH-y3rYB.js.map} +1 -1
- package/dist/{lightbox-Dpwsn8Qr.cjs → lightbox-CvtqoInF.cjs} +1 -1
- package/dist/{lightbox-Dpwsn8Qr.cjs.map → lightbox-CvtqoInF.cjs.map} +1 -1
- package/dist/lightbox.cjs +1 -1
- package/dist/lightbox.js +1 -1
- package/dist/{list-BhM-6dAi.cjs → list-Dl8KfxrF.cjs} +2 -2
- package/dist/{list-BhM-6dAi.cjs.map → list-Dl8KfxrF.cjs.map} +1 -1
- package/dist/{list-C5WVoIfJ.js → list-DrsawQ5R.js} +10 -3
- package/dist/{list-C5WVoIfJ.js.map → list-DrsawQ5R.js.map} +1 -1
- package/dist/list.cjs +1 -1
- package/dist/list.js +1 -1
- package/dist/{menu-GZARYp6I.cjs → menu-BFRcTe3o.cjs} +1 -1
- package/dist/{menu-GZARYp6I.cjs.map → menu-BFRcTe3o.cjs.map} +1 -1
- package/dist/{menu-Dvi_tQgH.js → menu-CsY5lMqY.js} +3 -3
- package/dist/{menu-Dvi_tQgH.js.map → menu-CsY5lMqY.js.map} +1 -1
- package/dist/menu.cjs +1 -1
- package/dist/menu.js +1 -1
- package/dist/{mixins-fIpzhVMd.cjs → mixins-BoMURWag.cjs} +2 -72
- package/dist/{mixins-fIpzhVMd.cjs.map → mixins-BoMURWag.cjs.map} +1 -1
- package/dist/{mixins-DGBI7YPO.js → mixins-bCEXbwJV.js} +3 -79
- package/dist/{mixins-DGBI7YPO.js.map → mixins-bCEXbwJV.js.map} +1 -1
- package/dist/mixins.cjs +1 -1
- package/dist/mixins.js +2 -2
- package/dist/nav-drawer.cjs +1 -1
- package/dist/nav-drawer.js +1 -1
- package/dist/navigation-bar.cjs +1 -1
- package/dist/navigation-bar.js +1 -1
- package/dist/navigation-rail.cjs +1 -1
- package/dist/navigation-rail.js +2 -2
- package/dist/{notification-BB9OBRCr.js → notification-DFKRMmSq.js} +4 -4
- package/dist/{notification-BB9OBRCr.js.map → notification-DFKRMmSq.js.map} +1 -1
- package/dist/{notification-B6yDL91t.cjs → notification-FBf3Mb2e.cjs} +1 -1
- package/dist/{notification-B6yDL91t.cjs.map → notification-FBf3Mb2e.cjs.map} +1 -1
- package/dist/notification.cjs +1 -1
- package/dist/notification.js +1 -1
- package/dist/{option-B21ImL0k.js → option-Ct0lGdH3.js} +2 -2
- package/dist/{option-B21ImL0k.js.map → option-Ct0lGdH3.js.map} +1 -1
- package/dist/{option-CJQM5I9q.cjs → option-Il1KpU8M.cjs} +1 -1
- package/dist/{option-CJQM5I9q.cjs.map → option-Il1KpU8M.cjs.map} +1 -1
- package/dist/option.cjs +1 -1
- package/dist/option.js +1 -1
- package/dist/{overlay-DwJWVyk2.js → overlay-Bh8Q_R01.js} +5 -5
- package/dist/{overlay-DwJWVyk2.js.map → overlay-Bh8Q_R01.js.map} +1 -1
- package/dist/{overlay-N0trD-4u.cjs → overlay-sRXiMkjn.cjs} +1 -1
- package/dist/{overlay-N0trD-4u.cjs.map → overlay-sRXiMkjn.cjs.map} +1 -1
- package/dist/overlay.cjs +1 -1
- package/dist/{overlay.confirm-body-DwzKhXxM.js → overlay.confirm-body-CQihsR20.js} +6 -6
- package/dist/{overlay.confirm-body-DwzKhXxM.js.map → overlay.confirm-body-CQihsR20.js.map} +1 -1
- package/dist/{overlay.confirm-body-CtXIi421.cjs → overlay.confirm-body-Jc1EuMGs.cjs} +1 -1
- package/dist/{overlay.confirm-body-CtXIi421.cjs.map → overlay.confirm-body-Jc1EuMGs.cjs.map} +1 -1
- package/dist/overlay.js +3 -3
- package/dist/{overlay.service-Dbu5uP9E.cjs → overlay.service-9Dp3g7ot.cjs} +1 -1
- package/dist/{overlay.service-Dbu5uP9E.cjs.map → overlay.service-9Dp3g7ot.cjs.map} +1 -1
- package/dist/{overlay.service-BDLi0p5M.js → overlay.service-BXPgS7ay.js} +2 -2
- package/dist/{overlay.service-BDLi0p5M.js.map → overlay.service-BXPgS7ay.js.map} +1 -1
- package/dist/{progress-B-Qg44XY.cjs → progress-CWC5XYZ_.cjs} +1 -1
- package/dist/{progress-B-Qg44XY.cjs.map → progress-CWC5XYZ_.cjs.map} +1 -1
- package/dist/{progress-CUSS1sNz.js → progress-CYLshdo2.js} +2 -2
- package/dist/{progress-CUSS1sNz.js.map → progress-CYLshdo2.js.map} +1 -1
- package/dist/progress.cjs +1 -1
- package/dist/progress.js +1 -1
- package/dist/{radio-group-BEtvCSS1.cjs → radio-group-6kCgOgBL.cjs} +1 -1
- package/dist/{radio-group-BEtvCSS1.cjs.map → radio-group-6kCgOgBL.cjs.map} +1 -1
- package/dist/{radio-group-AHLvrN8O.js → radio-group-bZtZHOj_.js} +2 -2
- package/dist/{radio-group-AHLvrN8O.js.map → radio-group-bZtZHOj_.js.map} +1 -1
- package/dist/radio-group.cjs +1 -1
- package/dist/radio-group.js +1 -1
- package/dist/range.cjs +1 -1
- package/dist/range.js +2 -2
- package/dist/{select-CGBsblDA.js → select-CU3X-PIa.js} +3 -3
- package/dist/{select-CGBsblDA.js.map → select-CU3X-PIa.js.map} +1 -1
- package/dist/{select-LWdPs7b_.cjs → select-MXsF8KsU.cjs} +1 -1
- package/dist/{select-LWdPs7b_.cjs.map → select-MXsF8KsU.cjs.map} +1 -1
- package/dist/select.cjs +1 -1
- package/dist/select.js +1 -1
- package/dist/skeleton.cjs +1 -1
- package/dist/skeleton.js +2 -2
- package/dist/skills/schmancy/surface.md +51 -27
- package/dist/skills/surface.md +51 -27
- package/dist/slider.cjs +1 -1
- package/dist/slider.js +2 -2
- package/dist/{sound.service-CK-5zob-.js → sound.service-B4ZmXpH9.js} +1 -1
- package/dist/{sound.service-CK-5zob-.js.map → sound.service-B4ZmXpH9.js.map} +1 -1
- package/dist/{sound.service-D2GGaBXc.cjs → sound.service-DjlMvicQ.cjs} +1 -1
- package/dist/{sound.service-D2GGaBXc.cjs.map → sound.service-DjlMvicQ.cjs.map} +1 -1
- package/dist/{splash-screen-DqPuipox.cjs → splash-screen-CN9dZcqC.cjs} +1 -1
- package/dist/{splash-screen-DqPuipox.cjs.map → splash-screen-CN9dZcqC.cjs.map} +1 -1
- package/dist/{splash-screen-BUEtjHXC.js → splash-screen-emCLYoVl.js} +2 -2
- package/dist/{splash-screen-BUEtjHXC.js.map → splash-screen-emCLYoVl.js.map} +1 -1
- package/dist/splash-screen.cjs +1 -1
- package/dist/splash-screen.js +1 -1
- package/dist/{src-Dmqjtcmp.js → src-DGDTkOvC.js} +160 -252
- package/dist/src-DGDTkOvC.js.map +1 -0
- package/dist/{src-SAXA4LEH.cjs → src-DK3111z_.cjs} +7 -31
- package/dist/src-DK3111z_.cjs.map +1 -0
- package/dist/{state-BxDNox-2.cjs → state-CumAEPQH.cjs} +1 -1
- package/dist/{state-BxDNox-2.cjs.map → state-CumAEPQH.cjs.map} +1 -1
- package/dist/{state-CnZCDMT0.js → state-DMd_FUeA.js} +1 -1
- package/dist/{state-CnZCDMT0.js.map → state-DMd_FUeA.js.map} +1 -1
- package/dist/state.cjs +1 -1
- package/dist/state.js +2 -2
- package/dist/steps.cjs +1 -1
- package/dist/steps.js +2 -2
- package/dist/{surface-CWwYD_z2.cjs → surface-DGI-FBoi.cjs} +1 -1
- package/dist/surface-DGI-FBoi.cjs.map +1 -0
- package/dist/{surface-BMdG3dKQ.js → surface-DNiYigsX.js} +2 -2
- package/dist/surface-DNiYigsX.js.map +1 -0
- package/dist/surface.cjs +1 -1
- package/dist/surface.js +1 -1
- package/dist/switch.cjs +1 -1
- package/dist/switch.js +2 -2
- package/dist/table.cjs +2 -2
- package/dist/table.cjs.map +1 -1
- package/dist/table.js +3 -3
- package/dist/table.js.map +1 -1
- package/dist/{tabs-CDQYDc6v.js → tabs-4T_4kCf-.js} +2 -2
- package/dist/{tabs-CDQYDc6v.js.map → tabs-4T_4kCf-.js.map} +1 -1
- package/dist/{tabs-CbD9E1gd.cjs → tabs-Byxxt-AH.cjs} +1 -1
- package/dist/{tabs-CbD9E1gd.cjs.map → tabs-Byxxt-AH.cjs.map} +1 -1
- package/dist/tabs.cjs +1 -1
- package/dist/tabs.js +1 -1
- package/dist/teleport.cjs +1 -1
- package/dist/teleport.js +1 -1
- package/dist/{textarea-Brgi-vD2.cjs → textarea-BwYwH9fu.cjs} +1 -1
- package/dist/{textarea-Brgi-vD2.cjs.map → textarea-BwYwH9fu.cjs.map} +1 -1
- package/dist/{textarea-MPyrMi-S.js → textarea-kkYNk1ET.js} +2 -2
- package/dist/{textarea-MPyrMi-S.js.map → textarea-kkYNk1ET.js.map} +1 -1
- package/dist/textarea.cjs +1 -1
- package/dist/textarea.js +1 -1
- package/dist/{theme-BMbXoqi0.cjs → theme-BG0EnzYP.cjs} +2 -2
- package/dist/{theme-BMbXoqi0.cjs.map → theme-BG0EnzYP.cjs.map} +1 -1
- package/dist/{theme-DZu-xmVp.js → theme-DwQBl6sr.js} +6 -6
- package/dist/{theme-DZu-xmVp.js.map → theme-DwQBl6sr.js.map} +1 -1
- package/dist/{theme-button-D_qGvEYs.js → theme-button-BD8anzsZ.js} +2 -2
- package/dist/{theme-button-D_qGvEYs.js.map → theme-button-BD8anzsZ.js.map} +1 -1
- package/dist/{theme-button-B0OLb-43.cjs → theme-button-DlrNoCMA.cjs} +1 -1
- package/dist/{theme-button-B0OLb-43.cjs.map → theme-button-DlrNoCMA.cjs.map} +1 -1
- package/dist/theme-button.cjs +1 -1
- package/dist/theme-button.js +1 -1
- package/dist/theme.cjs +1 -1
- package/dist/theme.js +3 -3
- package/dist/{theme.service-7VkM-hVf.js → theme.service-Dv_55nfE.js} +1 -1
- package/dist/{theme.service-7VkM-hVf.js.map → theme.service-Dv_55nfE.js.map} +1 -1
- package/dist/{theme.service-B15FdjOS.cjs → theme.service-pjkTM209.cjs} +1 -1
- package/dist/{theme.service-B15FdjOS.cjs.map → theme.service-pjkTM209.cjs.map} +1 -1
- package/dist/tree.cjs +1 -1
- package/dist/tree.js +2 -2
- package/dist/{typography-SZhjb_4R.js → typography-BVkU11_q.js} +2 -2
- package/dist/{typography-SZhjb_4R.js.map → typography-BVkU11_q.js.map} +1 -1
- package/dist/{typography-D4Fo1UGh.cjs → typography-aaQaIcNc.cjs} +1 -1
- package/dist/{typography-D4Fo1UGh.cjs.map → typography-aaQaIcNc.cjs.map} +1 -1
- package/dist/typography.cjs +1 -1
- package/dist/typography.js +1 -1
- package/dist/visually-hidden.cjs +1 -1
- package/dist/visually-hidden.js +2 -2
- package/dist/{window-BDVyrBnk.js → window-C76zstbV.js} +7 -8
- package/dist/window-C76zstbV.js.map +1 -0
- package/dist/window-CmB9XZzT.cjs +58 -0
- package/dist/window-CmB9XZzT.cjs.map +1 -0
- package/dist/window.cjs +1 -1
- package/dist/window.js +1 -1
- package/package.json +1 -1
- package/skills/schmancy/surface.md +51 -27
- package/src/badge/badge.ts +48 -200
- package/src/boat/boat.ts +1 -3
- package/src/connectivity/connectivity-status.ts +1 -3
- package/src/details/details.ts +1 -1
- package/src/list/list.ts +1 -1
- package/src/surface/surface.styles.ts +2 -87
- package/src/surface/surface.ts +8 -8
- package/src/table/table.ts +1 -1
- package/src/theme/theme-audio-player.ts +1 -1
- package/src/window/window.ts +3 -6
- package/types/mixins/surface.mixin.d.ts +8 -14
- package/types/src/badge/badge.d.ts +15 -48
- package/types/src/surface/surface.d.ts +9 -7
- package/types/src/surface/surface.styles.d.ts +2 -14
- package/types/src/window/window.d.ts +0 -1
- package/dist/SchmancyElement-BNnyBOwk.js +0 -286
- package/dist/SchmancyElement-C41uPa6l.cjs +0 -2
- package/dist/details-CY49XVfp.js.map +0 -1
- package/dist/details-DQNj2oaU.cjs.map +0 -1
- package/dist/src-Dmqjtcmp.js.map +0 -1
- package/dist/src-SAXA4LEH.cjs.map +0 -1
- package/dist/surface-BMdG3dKQ.js.map +0 -1
- package/dist/surface-CWwYD_z2.cjs.map +0 -1
- package/dist/window-BDVyrBnk.js.map +0 -1
- package/dist/window-BbBYjm7R.cjs +0 -59
- package/dist/window-BbBYjm7R.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form-4GKROq2P.cjs","names":[],"sources":["../src/form/form-state.ts","../src/form/form.ts"],"sourcesContent":["/**\n * Form-level submit state — consumed by `<schmancy-form>` and any descendant\n * (e.g. `<schmancy-button type=\"submit\">` to drive its loading/aria-busy).\n *\n * `<schmancy-form>` wraps its render output in `<schmancy-context\n * .provides=${[formSubmitState]}>` so each instance gets an isolated copy\n * via the schmancy state library's resolveContextual mechanism. Reads of\n * `formSubmitState.value` and writes via `formSubmitState.set(...)` inside\n * the form's subtree resolve to the per-form copy automatically — no\n * `@lit/context` plumbing in user code.\n */\n\nimport { state } from '../state'\n\nexport type FormError = {\n\tmessage: string\n\tcode?: string\n}\n\nexport type FormSubmitState = {\n\tstatus: 'idle' | 'submitting' | 'success' | 'error'\n\terror: FormError | null\n\t/** Increments on every submit attempt — RHF parity. */\n\tsubmitCount: number\n}\n\nexport const formSubmitState = state<FormSubmitState>('schmancy/form-submit').memory({\n\tstatus: 'idle',\n\terror: null,\n\tsubmitCount: 0,\n})\n","/**\n * `<schmancy-form>` — schmancy form owner with isolated submit state.\n *\n * Architecture:\n * - Extends `SchmancyElement` (shadow DOM, RxJS + `disconnecting` conventions).\n * - Renders content inside `<schmancy-context .provides=${[formSubmitState]}>`\n * so each form instance gets an isolated copy of the submit state via the\n * schmancy state library — no `@lit/context` plumbing in user code.\n * - Inner `<form novalidate>` is the native-semantics trigger for Enter-key\n * submit and `type=submit` button activation.\n * - Fields self-register via `FIELD_CONNECT_EVENT` (composed event from\n * `FormFieldMixin.connectedCallback`). Stale refs (from disconnected\n * fields) are filtered by `isConnected` at iteration time.\n *\n * Schema seam — pass any `{ parse(input): T }` object (zod, valibot, ArkType,\n * etc.) via the `schema` property to get typed `submit` event detail.\n */\n\nimport { css, html } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { fromEvent, takeUntil } from 'rxjs'\nimport { SchmancyElement } from '../../mixins'\nimport { FIELD_CONNECT_EVENT, type IFormFieldMixin } from '../../mixins/formField.mixin'\nimport { formSubmitState, type FormSubmitState, type FormError } from './form-state'\n\n/** Structural type matching zod, valibot, ArkType, etc. — any schema with `.parse()`. */\nexport interface ParseSchema<T = unknown> {\n\tparse(input: unknown): T\n}\n\nconst isButton = (node: EventTarget): node is HTMLElement => {\n\tif (!(node instanceof HTMLElement)) return false\n\treturn node.tagName === 'BUTTON' || node.tagName === 'SCHMANCY-BUTTON'\n}\n\n/** Submit event detail. `data` is typed when `schema` is set. */\nexport type SchmancyFormSubmitDetail<T = Record<string, FormDataEntryValue>> = {\n\tdata: T\n\tformData: FormData\n\t/**\n\t * Register a promise that gates the form's success/error state. If unused,\n\t * the form synchronously flips to `success` after dispatch. If used,\n\t * `success`/`error` reflect the promise's outcome.\n\t */\n\tuntil(p: Promise<unknown>): void\n}\n\n@customElement('schmancy-form')\nexport default class SchmancyForm<TSchema extends ParseSchema | undefined = undefined>\n\textends SchmancyElement {\n\tstatic styles = css`\n\t\t:host { display: block; }\n\t`\n\n\tpublic static readonly tagName: string = 'schmancy-form'\n\n\t/**\n\t * Optional schema for parsing FormData on submit. Anything with a\n\t * `.parse(input)` method works (zod, valibot, ArkType). When set, the\n\t * `submit` event's `detail.data` is typed `z.infer<TSchema>`.\n\t */\n\t@property({ attribute: false })\n\tschema?: TSchema\n\n\t/** Skip built-in browser constraint validation. Mirrors `<form novalidate>`. */\n\t@property({ type: Boolean })\n\tnovalidate: boolean = true\n\n\tprivate fields = new Set<IFormFieldMixin>()\n\tprivate submitting = false\n\n\t/**\n\t * Local mirror of the submit-state status — drives the inline live region\n\t * synchronously. Independent of the schmancy-state library's resolution\n\t * chain (which has known cross-await fallback semantics) so the AT-facing\n\t * announcement is always correct for this form instance.\n\t */\n\t@state() private liveStatus: 'idle' | 'submitting' | 'success' | 'error' = 'idle'\n\t@state() private liveError: string = ''\n\tprivate internals: ElementInternals | undefined = (() => {\n\t\ttry {\n\t\t\treturn this.attachInternals()\n\t\t} catch {\n\t\t\treturn undefined\n\t\t}\n\t})()\n\n\toverride connectedCallback(): void {\n\t\tsuper.connectedCallback()\n\n\t\t// Forbid nested <schmancy-form>.\n\t\tif (this.parentElement?.closest('schmancy-form')) {\n\t\t\tconsole.error('[schmancy-form] nested <schmancy-form> is not supported')\n\t\t\treturn\n\t\t}\n\n\t\t// Field registry — composed event from FormFieldMixin.connectedCallback.\n\t\tfromEvent<CustomEvent<IFormFieldMixin>>(this, FIELD_CONNECT_EVENT)\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe(e => this.fields.add(e.detail))\n\n\t\t// Submit-trigger interception — slotted descendants live in light DOM\n\t\t// while the inner <form> is in shadow DOM, so native form-association\n\t\t// across the shadow boundary doesn't work for `<button type=submit>`.\n\t\t// Capture clicks on type=submit buttons (native + schmancy-button) and\n\t\t// Enter keys on registered fields, then call the inner form's\n\t\t// requestSubmit() which fires the same native submit event handler\n\t\t// chain that a directly-associated button would have triggered.\n\t\tfromEvent<MouseEvent>(this, 'click')\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe(e => this.maybeRequestSubmit(e))\n\t\tfromEvent<KeyboardEvent>(this, 'keydown')\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe(e => {\n\t\t\t\tif (e.key !== 'Enter' || e.shiftKey) return\n\t\t\t\t// Skip Enter inside <textarea> (newline) and contenteditable.\n\t\t\t\tconst target = e.target as HTMLElement | null\n\t\t\t\tif (target?.tagName === 'TEXTAREA') return\n\t\t\t\tif (target?.isContentEditable) return\n\t\t\t\tthis.maybeRequestSubmit(e)\n\t\t\t})\n\t}\n\n\tprivate maybeRequestSubmit(e: Event): void {\n\t\t// On click: trigger only when the target is a type=submit button.\n\t\t// On keydown(Enter): always trigger if focus is on a registered field.\n\t\t// type=reset is handled separately in maybeReset.\n\t\tif (e.type === 'click') {\n\t\t\tconst path = e.composedPath()\n\t\t\tconst resetBtn = path.find(\n\t\t\t\tnode => isButton(node) && node.getAttribute('type') === 'reset',\n\t\t\t)\n\t\t\tif (resetBtn) {\n\t\t\t\te.preventDefault()\n\t\t\t\tconst form = this.shadowRoot?.querySelector('form')\n\t\t\t\tform?.reset()\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst submitBtn = path.find(\n\t\t\t\tnode => isButton(node) && node.getAttribute('type') === 'submit',\n\t\t\t)\n\t\t\tif (!submitBtn) return\n\t\t\te.preventDefault()\n\t\t}\n\t\tconst form = this.shadowRoot?.querySelector('form')\n\t\tform?.requestSubmit()\n\t}\n\n\t/** Active fields — drops stale refs from disconnected nodes. */\n\tprivate get activeFields(): IFormFieldMixin[] {\n\t\treturn [...this.fields].filter(f => f.isConnected)\n\t}\n\n\tprivate async onSubmit(e: SubmitEvent): Promise<void> {\n\t\te.preventDefault()\n\t\te.stopPropagation()\n\t\tif (this.submitting) return\n\n\t\t// If any field has an async validator pending, wait for them all to\n\t\t// settle before deciding validity. This is the hard-block model: the\n\t\t// user clicks submit, the form holds (aria-busy=\"true\"), waits for\n\t\t// validators, then proceeds with the truth they reported.\n\t\tconst pendingValidators = this.activeFields.filter(f => f.isValidating)\n\t\tif (pendingValidators.length > 0) {\n\t\t\tthis.broadcastStatus('submitting')\n\t\t\tawait new Promise<void>(resolve => {\n\t\t\t\tconst tick = () => {\n\t\t\t\t\tif (this.activeFields.every(f => !f.isValidating)) resolve()\n\t\t\t\t\telse requestAnimationFrame(tick)\n\t\t\t\t}\n\t\t\t\ttick()\n\t\t\t})\n\t\t}\n\n\t\t// Phase 4 — submit forces error display on every field.\n\t\tthis.activeFields.forEach(f => f.markSubmitted())\n\n\t\t// Validate; success path entered ONLY if all valid.\n\t\tconst allValid = this.activeFields.every(f => f.checkValidity())\n\t\tconst fs = formSubmitState.value\n\t\tif (!allValid) {\n\t\t\tformSubmitState.set({\n\t\t\t\t...fs,\n\t\t\t\tstatus: 'error',\n\t\t\t\terror: { message: 'Validation failed' },\n\t\t\t})\n\t\t\tthis.broadcastStatus('error', 'Validation failed. Please correct the highlighted fields.')\n\t\t\tconst firstInvalid = this.activeFields.find(f => f.error) as unknown as\n\t\t\t\t| HTMLElement\n\t\t\t\t| undefined\n\t\t\tfirstInvalid?.focus()\n\t\t\treturn\n\t\t}\n\n\t\tthis.submitting = true\n\t\tformSubmitState.set({\n\t\t\t...fs,\n\t\t\tstatus: 'submitting',\n\t\t\terror: null,\n\t\t\tsubmitCount: fs.submitCount + 1,\n\t\t})\n\t\tthis.broadcastStatus('submitting')\n\n\t\t// Build payload from the registered fields' contracted toFormEntries().\n\t\tconst formData = new FormData()\n\t\tfor (const field of this.activeFields) {\n\t\t\tfor (const [k, v] of field.toFormEntries()) formData.append(k, v)\n\t\t}\n\t\tconst raw = Object.fromEntries(formData)\n\t\tconst data = this.schema ? this.schema.parse(raw) : raw\n\n\t\t// Awaitable submit — consumers register promises via e.detail.until(p).\n\t\tconst pending: Promise<unknown>[] = []\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent<SchmancyFormSubmitDetail<unknown>>('submit', {\n\t\t\t\tdetail: {\n\t\t\t\t\tdata,\n\t\t\t\t\tformData,\n\t\t\t\t\tuntil: (p: Promise<unknown>) => pending.push(p),\n\t\t\t\t},\n\t\t\t}),\n\t\t)\n\n\t\ttry {\n\t\t\tawait Promise.all(pending)\n\t\t\tformSubmitState.set({\n\t\t\t\t...formSubmitState.value,\n\t\t\t\tstatus: 'success',\n\t\t\t\terror: null,\n\t\t\t})\n\t\t\tthis.broadcastStatus('success')\n\t\t} catch (err) {\n\t\t\tconst message = err instanceof Error ? err.message : String(err)\n\t\t\tformSubmitState.set({\n\t\t\t\t...formSubmitState.value,\n\t\t\t\tstatus: 'error',\n\t\t\t\terror: { message },\n\t\t\t})\n\t\t\tthis.broadcastStatus('error', message)\n\t\t} finally {\n\t\t\tthis.submitting = false\n\t\t}\n\t}\n\n\tprivate onReset(e: Event): void {\n\t\te.stopPropagation()\n\t\tthis.activeFields.forEach(f => f.resetForm())\n\t\tformSubmitState.set({ status: 'idle', error: null, submitCount: 0 })\n\t\tthis.broadcastStatus('idle')\n\t\tthis.dispatchEvent(new CustomEvent('reset'))\n\t}\n\n\tprivate broadcastStatus(status: FormSubmitState['status'], errorMessage?: string): void {\n\t\tthis.liveStatus = status\n\t\tthis.liveError = errorMessage ?? ''\n\t\tconst states = this.internals?.states\n\t\tif (states) {\n\t\t\tfor (const s of ['submitting', 'success', 'error', 'idle']) states.delete(s)\n\t\t\tstates.add(status)\n\t\t}\n\t\t// aria-busy on the host while submitting (WCAG 2.2 AA — disabled buttons\n\t\t// drop from tab order; keep them focusable, signal busy via aria).\n\t\tif (status === 'submitting') this.setAttribute('aria-busy', 'true')\n\t\telse this.removeAttribute('aria-busy')\n\t\t// Public formstate event — external state stores subscribe without\n\t\t// having to consume formSubmitState directly.\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent<FormSubmitState>('formstate', {\n\t\t\t\tdetail: { ...formSubmitState.value },\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t}),\n\t\t)\n\t}\n\n\t/**\n\t * Server-side error mapping (RHF `setError(name, ...)`-equivalent).\n\t * Sets `setCustomValidity(message)` on the matching field and ensures the\n\t * error displays by marking it submitted.\n\t */\n\tpublic setFieldError(name: string, message: string): boolean {\n\t\tconst field = this.activeFields.find(f => f.name === name)\n\t\tif (!field) return false\n\t\tfield.setCustomValidity(message)\n\t\tfield.markSubmitted()\n\t\treturn true\n\t}\n\n\t/**\n\t * Top-of-form error (RHF `setError('root.serverError', ...)`-equivalent).\n\t * Flips form status to 'error' with a structured `FormError`.\n\t */\n\tpublic setFormError(message: string, code?: string): void {\n\t\tformSubmitState.set({\n\t\t\t...formSubmitState.value,\n\t\t\tstatus: 'error',\n\t\t\terror: { message, code } as FormError,\n\t\t})\n\t\tthis.broadcastStatus('error', message)\n\t}\n\n\t/**\n\t * Clear the `submitted` flag on every registered field without resetting\n\t * their values. Wizard pattern: stepping back from a later step should not\n\t * leave the earlier step's fields in aggressive \"show all errors\" mode\n\t * (which `submitted = true` triggers via the `shouldShowError()` gate).\n\t *\n\t * Pristine fields with `validateOn: 'dirty'` go quiet again. Fields the\n\t * user actually dirtied keep showing their errors (correct UX — those are\n\t * still genuine mistakes the user can see).\n\t */\n\tpublic clearSubmitted(): void {\n\t\tthis.activeFields.forEach(f => f.clearSubmitted())\n\t\tformSubmitState.set({\n\t\t\t...formSubmitState.value,\n\t\t\tstatus: 'idle',\n\t\t\terror: null,\n\t\t})\n\t\tthis.broadcastStatus('idle')\n\t}\n\n\t/** Programmatically submit via the native submitter pipeline. */\n\tpublic submit(): boolean {\n\t\tconst form = this.shadowRoot?.querySelector('form')\n\t\tif (!form) return false\n\t\tform.requestSubmit()\n\t\treturn true\n\t}\n\n\t/** Programmatically reset via native `form.reset()`. */\n\tpublic reset(): void {\n\t\tconst form = this.shadowRoot?.querySelector('form')\n\t\tform?.reset()\n\t}\n\n\tpublic reportValidity(): boolean {\n\t\treturn this.activeFields.every(f => f.reportValidity())\n\t}\n\n\tpublic checkValidity(): boolean {\n\t\treturn this.activeFields.every(f => f.checkValidity())\n\t}\n\n\t/** Snapshot of current form values from the registered fields. */\n\tpublic getFormData(): FormData {\n\t\tconst formData = new FormData()\n\t\tfor (const field of this.activeFields) {\n\t\t\tfor (const [k, v] of field.toFormEntries()) formData.append(k, v)\n\t\t}\n\t\treturn formData\n\t}\n\n\trender() {\n\t\treturn html`\n\t\t\t<schmancy-context .provides=${[formSubmitState]}>\n\t\t\t\t<form\n\t\t\t\t\t?novalidate=${this.novalidate}\n\t\t\t\t\t@submit=${this.onSubmit}\n\t\t\t\t\t@reset=${this.onReset}\n\t\t\t\t>\n\t\t\t\t\t<slot></slot>\n\t\t\t\t</form>\n\t\t\t\t<!--\n\t\t\t\t\tForm-level live region — assistive tech announces server-side\n\t\t\t\t\tform errors (validation summary, network failure, server reject)\n\t\t\t\t\there. Visually hidden via the .sr-only convention; consumers\n\t\t\t\t\trender their own visible banner from formSubmitState if they\n\t\t\t\t\twant one. Empty content while idle/submitting/success — only\n\t\t\t\t\terror states populate the region. WCAG 4.1.3 (Status Messages).\n\t\t\t\t-->\n\t\t\t\t<div\n\t\t\t\t\trole=\"status\"\n\t\t\t\t\taria-live=\"assertive\"\n\t\t\t\t\taria-atomic=\"true\"\n\t\t\t\t\tclass=\"sr-only\"\n\t\t\t\t>${this.liveStatus === 'error' ? this.liveError : ''}</div>\n\t\t\t</schmancy-context>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-form': SchmancyForm\n\t}\n}\n\n// Retained type surfaces — kept exported because downstream code may import\n// them as documentation. The new implementation no longer uses them\n// internally.\n\nexport interface FormElement extends HTMLElement {\n\tname?: string\n\tvalue?: string\n\tdisabled?: boolean\n\ttype?: string\n\tdefaultValue?: string\n}\n\nexport interface CheckableFormElement extends FormElement {\n\tchecked?: boolean\n}\n\nexport interface ValidatableFormElement extends FormElement {\n\treportValidity?: () => boolean\n\tcheckValidity?: () => boolean\n}\n\nexport interface FormEventMap {\n\tsubmit: CustomEvent<SchmancyFormSubmitDetail<unknown>>\n\treset: CustomEvent\n\tformstate: CustomEvent<FormSubmitState>\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"form-DowzVsgI.cjs","names":[],"sources":["../src/form/form-state.ts","../src/form/form.ts"],"sourcesContent":["/**\n * Form-level submit state — consumed by `<schmancy-form>` and any descendant\n * (e.g. `<schmancy-button type=\"submit\">` to drive its loading/aria-busy).\n *\n * `<schmancy-form>` wraps its render output in `<schmancy-context\n * .provides=${[formSubmitState]}>` so each instance gets an isolated copy\n * via the schmancy state library's resolveContextual mechanism. Reads of\n * `formSubmitState.value` and writes via `formSubmitState.set(...)` inside\n * the form's subtree resolve to the per-form copy automatically — no\n * `@lit/context` plumbing in user code.\n */\n\nimport { state } from '../state'\n\nexport type FormError = {\n\tmessage: string\n\tcode?: string\n}\n\nexport type FormSubmitState = {\n\tstatus: 'idle' | 'submitting' | 'success' | 'error'\n\terror: FormError | null\n\t/** Increments on every submit attempt — RHF parity. */\n\tsubmitCount: number\n}\n\nexport const formSubmitState = state<FormSubmitState>('schmancy/form-submit').memory({\n\tstatus: 'idle',\n\terror: null,\n\tsubmitCount: 0,\n})\n","/**\n * `<schmancy-form>` — schmancy form owner with isolated submit state.\n *\n * Architecture:\n * - Extends `SchmancyElement` (shadow DOM, RxJS + `disconnecting` conventions).\n * - Renders content inside `<schmancy-context .provides=${[formSubmitState]}>`\n * so each form instance gets an isolated copy of the submit state via the\n * schmancy state library — no `@lit/context` plumbing in user code.\n * - Inner `<form novalidate>` is the native-semantics trigger for Enter-key\n * submit and `type=submit` button activation.\n * - Fields self-register via `FIELD_CONNECT_EVENT` (composed event from\n * `FormFieldMixin.connectedCallback`). Stale refs (from disconnected\n * fields) are filtered by `isConnected` at iteration time.\n *\n * Schema seam — pass any `{ parse(input): T }` object (zod, valibot, ArkType,\n * etc.) via the `schema` property to get typed `submit` event detail.\n */\n\nimport { css, html } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { fromEvent, takeUntil } from 'rxjs'\nimport { SchmancyElement } from '../../mixins'\nimport { FIELD_CONNECT_EVENT, type IFormFieldMixin } from '../../mixins/formField.mixin'\nimport { formSubmitState, type FormSubmitState, type FormError } from './form-state'\n\n/** Structural type matching zod, valibot, ArkType, etc. — any schema with `.parse()`. */\nexport interface ParseSchema<T = unknown> {\n\tparse(input: unknown): T\n}\n\nconst isButton = (node: EventTarget): node is HTMLElement => {\n\tif (!(node instanceof HTMLElement)) return false\n\treturn node.tagName === 'BUTTON' || node.tagName === 'SCHMANCY-BUTTON'\n}\n\n/** Submit event detail. `data` is typed when `schema` is set. */\nexport type SchmancyFormSubmitDetail<T = Record<string, FormDataEntryValue>> = {\n\tdata: T\n\tformData: FormData\n\t/**\n\t * Register a promise that gates the form's success/error state. If unused,\n\t * the form synchronously flips to `success` after dispatch. If used,\n\t * `success`/`error` reflect the promise's outcome.\n\t */\n\tuntil(p: Promise<unknown>): void\n}\n\n@customElement('schmancy-form')\nexport default class SchmancyForm<TSchema extends ParseSchema | undefined = undefined>\n\textends SchmancyElement {\n\tstatic styles = css`\n\t\t:host { display: block; }\n\t`\n\n\tpublic static readonly tagName: string = 'schmancy-form'\n\n\t/**\n\t * Optional schema for parsing FormData on submit. Anything with a\n\t * `.parse(input)` method works (zod, valibot, ArkType). When set, the\n\t * `submit` event's `detail.data` is typed `z.infer<TSchema>`.\n\t */\n\t@property({ attribute: false })\n\tschema?: TSchema\n\n\t/** Skip built-in browser constraint validation. Mirrors `<form novalidate>`. */\n\t@property({ type: Boolean })\n\tnovalidate: boolean = true\n\n\tprivate fields = new Set<IFormFieldMixin>()\n\tprivate submitting = false\n\n\t/**\n\t * Local mirror of the submit-state status — drives the inline live region\n\t * synchronously. Independent of the schmancy-state library's resolution\n\t * chain (which has known cross-await fallback semantics) so the AT-facing\n\t * announcement is always correct for this form instance.\n\t */\n\t@state() private liveStatus: 'idle' | 'submitting' | 'success' | 'error' = 'idle'\n\t@state() private liveError: string = ''\n\tprivate internals: ElementInternals | undefined = (() => {\n\t\ttry {\n\t\t\treturn this.attachInternals()\n\t\t} catch {\n\t\t\treturn undefined\n\t\t}\n\t})()\n\n\toverride connectedCallback(): void {\n\t\tsuper.connectedCallback()\n\n\t\t// Forbid nested <schmancy-form>.\n\t\tif (this.parentElement?.closest('schmancy-form')) {\n\t\t\tconsole.error('[schmancy-form] nested <schmancy-form> is not supported')\n\t\t\treturn\n\t\t}\n\n\t\t// Field registry — composed event from FormFieldMixin.connectedCallback.\n\t\tfromEvent<CustomEvent<IFormFieldMixin>>(this, FIELD_CONNECT_EVENT)\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe(e => this.fields.add(e.detail))\n\n\t\t// Submit-trigger interception — slotted descendants live in light DOM\n\t\t// while the inner <form> is in shadow DOM, so native form-association\n\t\t// across the shadow boundary doesn't work for `<button type=submit>`.\n\t\t// Capture clicks on type=submit buttons (native + schmancy-button) and\n\t\t// Enter keys on registered fields, then call the inner form's\n\t\t// requestSubmit() which fires the same native submit event handler\n\t\t// chain that a directly-associated button would have triggered.\n\t\tfromEvent<MouseEvent>(this, 'click')\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe(e => this.maybeRequestSubmit(e))\n\t\tfromEvent<KeyboardEvent>(this, 'keydown')\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe(e => {\n\t\t\t\tif (e.key !== 'Enter' || e.shiftKey) return\n\t\t\t\t// Skip Enter inside <textarea> (newline) and contenteditable.\n\t\t\t\tconst target = e.target as HTMLElement | null\n\t\t\t\tif (target?.tagName === 'TEXTAREA') return\n\t\t\t\tif (target?.isContentEditable) return\n\t\t\t\tthis.maybeRequestSubmit(e)\n\t\t\t})\n\t}\n\n\tprivate maybeRequestSubmit(e: Event): void {\n\t\t// On click: trigger only when the target is a type=submit button.\n\t\t// On keydown(Enter): always trigger if focus is on a registered field.\n\t\t// type=reset is handled separately in maybeReset.\n\t\tif (e.type === 'click') {\n\t\t\tconst path = e.composedPath()\n\t\t\tconst resetBtn = path.find(\n\t\t\t\tnode => isButton(node) && node.getAttribute('type') === 'reset',\n\t\t\t)\n\t\t\tif (resetBtn) {\n\t\t\t\te.preventDefault()\n\t\t\t\tconst form = this.shadowRoot?.querySelector('form')\n\t\t\t\tform?.reset()\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst submitBtn = path.find(\n\t\t\t\tnode => isButton(node) && node.getAttribute('type') === 'submit',\n\t\t\t)\n\t\t\tif (!submitBtn) return\n\t\t\te.preventDefault()\n\t\t}\n\t\tconst form = this.shadowRoot?.querySelector('form')\n\t\tform?.requestSubmit()\n\t}\n\n\t/** Active fields — drops stale refs from disconnected nodes. */\n\tprivate get activeFields(): IFormFieldMixin[] {\n\t\treturn [...this.fields].filter(f => f.isConnected)\n\t}\n\n\tprivate async onSubmit(e: SubmitEvent): Promise<void> {\n\t\te.preventDefault()\n\t\te.stopPropagation()\n\t\tif (this.submitting) return\n\n\t\t// If any field has an async validator pending, wait for them all to\n\t\t// settle before deciding validity. This is the hard-block model: the\n\t\t// user clicks submit, the form holds (aria-busy=\"true\"), waits for\n\t\t// validators, then proceeds with the truth they reported.\n\t\tconst pendingValidators = this.activeFields.filter(f => f.isValidating)\n\t\tif (pendingValidators.length > 0) {\n\t\t\tthis.broadcastStatus('submitting')\n\t\t\tawait new Promise<void>(resolve => {\n\t\t\t\tconst tick = () => {\n\t\t\t\t\tif (this.activeFields.every(f => !f.isValidating)) resolve()\n\t\t\t\t\telse requestAnimationFrame(tick)\n\t\t\t\t}\n\t\t\t\ttick()\n\t\t\t})\n\t\t}\n\n\t\t// Phase 4 — submit forces error display on every field.\n\t\tthis.activeFields.forEach(f => f.markSubmitted())\n\n\t\t// Validate; success path entered ONLY if all valid.\n\t\tconst allValid = this.activeFields.every(f => f.checkValidity())\n\t\tconst fs = formSubmitState.value\n\t\tif (!allValid) {\n\t\t\tformSubmitState.set({\n\t\t\t\t...fs,\n\t\t\t\tstatus: 'error',\n\t\t\t\terror: { message: 'Validation failed' },\n\t\t\t})\n\t\t\tthis.broadcastStatus('error', 'Validation failed. Please correct the highlighted fields.')\n\t\t\tconst firstInvalid = this.activeFields.find(f => f.error) as unknown as\n\t\t\t\t| HTMLElement\n\t\t\t\t| undefined\n\t\t\tfirstInvalid?.focus()\n\t\t\treturn\n\t\t}\n\n\t\tthis.submitting = true\n\t\tformSubmitState.set({\n\t\t\t...fs,\n\t\t\tstatus: 'submitting',\n\t\t\terror: null,\n\t\t\tsubmitCount: fs.submitCount + 1,\n\t\t})\n\t\tthis.broadcastStatus('submitting')\n\n\t\t// Build payload from the registered fields' contracted toFormEntries().\n\t\tconst formData = new FormData()\n\t\tfor (const field of this.activeFields) {\n\t\t\tfor (const [k, v] of field.toFormEntries()) formData.append(k, v)\n\t\t}\n\t\tconst raw = Object.fromEntries(formData)\n\t\tconst data = this.schema ? this.schema.parse(raw) : raw\n\n\t\t// Awaitable submit — consumers register promises via e.detail.until(p).\n\t\tconst pending: Promise<unknown>[] = []\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent<SchmancyFormSubmitDetail<unknown>>('submit', {\n\t\t\t\tdetail: {\n\t\t\t\t\tdata,\n\t\t\t\t\tformData,\n\t\t\t\t\tuntil: (p: Promise<unknown>) => pending.push(p),\n\t\t\t\t},\n\t\t\t}),\n\t\t)\n\n\t\ttry {\n\t\t\tawait Promise.all(pending)\n\t\t\tformSubmitState.set({\n\t\t\t\t...formSubmitState.value,\n\t\t\t\tstatus: 'success',\n\t\t\t\terror: null,\n\t\t\t})\n\t\t\tthis.broadcastStatus('success')\n\t\t} catch (err) {\n\t\t\tconst message = err instanceof Error ? err.message : String(err)\n\t\t\tformSubmitState.set({\n\t\t\t\t...formSubmitState.value,\n\t\t\t\tstatus: 'error',\n\t\t\t\terror: { message },\n\t\t\t})\n\t\t\tthis.broadcastStatus('error', message)\n\t\t} finally {\n\t\t\tthis.submitting = false\n\t\t}\n\t}\n\n\tprivate onReset(e: Event): void {\n\t\te.stopPropagation()\n\t\tthis.activeFields.forEach(f => f.resetForm())\n\t\tformSubmitState.set({ status: 'idle', error: null, submitCount: 0 })\n\t\tthis.broadcastStatus('idle')\n\t\tthis.dispatchEvent(new CustomEvent('reset'))\n\t}\n\n\tprivate broadcastStatus(status: FormSubmitState['status'], errorMessage?: string): void {\n\t\tthis.liveStatus = status\n\t\tthis.liveError = errorMessage ?? ''\n\t\tconst states = this.internals?.states\n\t\tif (states) {\n\t\t\tfor (const s of ['submitting', 'success', 'error', 'idle']) states.delete(s)\n\t\t\tstates.add(status)\n\t\t}\n\t\t// aria-busy on the host while submitting (WCAG 2.2 AA — disabled buttons\n\t\t// drop from tab order; keep them focusable, signal busy via aria).\n\t\tif (status === 'submitting') this.setAttribute('aria-busy', 'true')\n\t\telse this.removeAttribute('aria-busy')\n\t\t// Public formstate event — external state stores subscribe without\n\t\t// having to consume formSubmitState directly.\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent<FormSubmitState>('formstate', {\n\t\t\t\tdetail: { ...formSubmitState.value },\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t}),\n\t\t)\n\t}\n\n\t/**\n\t * Server-side error mapping (RHF `setError(name, ...)`-equivalent).\n\t * Sets `setCustomValidity(message)` on the matching field and ensures the\n\t * error displays by marking it submitted.\n\t */\n\tpublic setFieldError(name: string, message: string): boolean {\n\t\tconst field = this.activeFields.find(f => f.name === name)\n\t\tif (!field) return false\n\t\tfield.setCustomValidity(message)\n\t\tfield.markSubmitted()\n\t\treturn true\n\t}\n\n\t/**\n\t * Top-of-form error (RHF `setError('root.serverError', ...)`-equivalent).\n\t * Flips form status to 'error' with a structured `FormError`.\n\t */\n\tpublic setFormError(message: string, code?: string): void {\n\t\tformSubmitState.set({\n\t\t\t...formSubmitState.value,\n\t\t\tstatus: 'error',\n\t\t\terror: { message, code } as FormError,\n\t\t})\n\t\tthis.broadcastStatus('error', message)\n\t}\n\n\t/**\n\t * Clear the `submitted` flag on every registered field without resetting\n\t * their values. Wizard pattern: stepping back from a later step should not\n\t * leave the earlier step's fields in aggressive \"show all errors\" mode\n\t * (which `submitted = true` triggers via the `shouldShowError()` gate).\n\t *\n\t * Pristine fields with `validateOn: 'dirty'` go quiet again. Fields the\n\t * user actually dirtied keep showing their errors (correct UX — those are\n\t * still genuine mistakes the user can see).\n\t */\n\tpublic clearSubmitted(): void {\n\t\tthis.activeFields.forEach(f => f.clearSubmitted())\n\t\tformSubmitState.set({\n\t\t\t...formSubmitState.value,\n\t\t\tstatus: 'idle',\n\t\t\terror: null,\n\t\t})\n\t\tthis.broadcastStatus('idle')\n\t}\n\n\t/** Programmatically submit via the native submitter pipeline. */\n\tpublic submit(): boolean {\n\t\tconst form = this.shadowRoot?.querySelector('form')\n\t\tif (!form) return false\n\t\tform.requestSubmit()\n\t\treturn true\n\t}\n\n\t/** Programmatically reset via native `form.reset()`. */\n\tpublic reset(): void {\n\t\tconst form = this.shadowRoot?.querySelector('form')\n\t\tform?.reset()\n\t}\n\n\tpublic reportValidity(): boolean {\n\t\treturn this.activeFields.every(f => f.reportValidity())\n\t}\n\n\tpublic checkValidity(): boolean {\n\t\treturn this.activeFields.every(f => f.checkValidity())\n\t}\n\n\t/** Snapshot of current form values from the registered fields. */\n\tpublic getFormData(): FormData {\n\t\tconst formData = new FormData()\n\t\tfor (const field of this.activeFields) {\n\t\t\tfor (const [k, v] of field.toFormEntries()) formData.append(k, v)\n\t\t}\n\t\treturn formData\n\t}\n\n\trender() {\n\t\treturn html`\n\t\t\t<schmancy-context .provides=${[formSubmitState]}>\n\t\t\t\t<form\n\t\t\t\t\t?novalidate=${this.novalidate}\n\t\t\t\t\t@submit=${this.onSubmit}\n\t\t\t\t\t@reset=${this.onReset}\n\t\t\t\t>\n\t\t\t\t\t<slot></slot>\n\t\t\t\t</form>\n\t\t\t\t<!--\n\t\t\t\t\tForm-level live region — assistive tech announces server-side\n\t\t\t\t\tform errors (validation summary, network failure, server reject)\n\t\t\t\t\there. Visually hidden via the .sr-only convention; consumers\n\t\t\t\t\trender their own visible banner from formSubmitState if they\n\t\t\t\t\twant one. Empty content while idle/submitting/success — only\n\t\t\t\t\terror states populate the region. WCAG 4.1.3 (Status Messages).\n\t\t\t\t-->\n\t\t\t\t<div\n\t\t\t\t\trole=\"status\"\n\t\t\t\t\taria-live=\"assertive\"\n\t\t\t\t\taria-atomic=\"true\"\n\t\t\t\t\tclass=\"sr-only\"\n\t\t\t\t>${this.liveStatus === 'error' ? this.liveError : ''}</div>\n\t\t\t</schmancy-context>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-form': SchmancyForm\n\t}\n}\n\n// Retained type surfaces — kept exported because downstream code may import\n// them as documentation. The new implementation no longer uses them\n// internally.\n\nexport interface FormElement extends HTMLElement {\n\tname?: string\n\tvalue?: string\n\tdisabled?: boolean\n\ttype?: string\n\tdefaultValue?: string\n}\n\nexport interface CheckableFormElement extends FormElement {\n\tchecked?: boolean\n}\n\nexport interface ValidatableFormElement extends FormElement {\n\treportValidity?: () => boolean\n\tcheckValidity?: () => boolean\n}\n\nexport interface FormEventMap {\n\tsubmit: CustomEvent<SchmancyFormSubmitDetail<unknown>>\n\treset: CustomEvent\n\tformstate: CustomEvent<FormSubmitState>\n}\n"],"mappings":"6NA0BA,IAAa,EAAkB,EAAA,EAAuB,sBAAA,EAAwB,OAAO,CACpF,OAAQ,OACR,MAAO,KACP,YAAa,CAAA,CAAA,ECCR,EAAY,GACX,aAAgB,cACf,EAAK,UAAY,UAAY,EAAK,UAAY,mBAgBvC,EAAA,cACN,EAAA,CAAA,CAAA,YAAA,GAAA,EAAA,CAAA,MAAA,GAAA,CAAA,EAAA,KAAA,WAAA,CAiBc,EAAA,KAAA,OAEL,IAAI,IAAA,KAAA,WAAA,CACA,EAAA,KAAA,WAQsD,OAAA,KAAA,UACtC,GAAA,KAAA,eAAA,CAEpC,GAAA,CACC,OAAO,KAAK,gBAAA,CACb,MAAA,CACC,MACD,CACD,GAAA,CAAA,CAAA,OAAA,KAAA,OAnCgB,EAAA,GAAG;;uBAIsB,eAAA,CAiCzC,mBAAA,CACC,MAAM,kBAAA,EAGF,KAAK,eAAe,QAAQ,eAAA,KAMhC,EAAA,EAAA,WAAwC,KAAM,EAAA,CAAA,EAC5C,MAAA,EAAA,EAAA,WAAe,KAAK,aAAA,CAAA,EACpB,UAAU,GAAK,KAAK,OAAO,IAAI,EAAE,MAAA,CAAA,GASnC,EAAA,EAAA,WAAsB,KAAM,OAAA,EAC1B,MAAA,EAAA,EAAA,WAAe,KAAK,aAAA,CAAA,EACpB,UAAU,GAAK,KAAK,mBAAmB,CAAA,CAAA,GACzC,EAAA,EAAA,WAAyB,KAAM,SAAA,EAC7B,MAAA,EAAA,EAAA,WAAe,KAAK,aAAA,CAAA,EACpB,UAAU,GAAA,CACV,GAAI,EAAE,MAAQ,SAAW,EAAE,SAAU,OAErC,IAAM,EAAS,EAAE,OACb,GAAQ,UAAY,aACpB,GAAQ,mBACZ,KAAK,mBAAmB,CAAA,EAAA,CAAA,EAE3B,CAEA,mBAA2B,EAAA,CAI1B,GAAI,EAAE,OAAS,QAAS,CACvB,IAAM,EAAO,EAAE,aAAA,EAIf,GAHiB,EAAK,KACrB,GAAQ,EAAS,CAAA,GAAS,EAAK,aAAa,MAAA,IAAY,OAAZ,EAM5C,OAHA,EAAE,eAAA,EAAA,KACW,KAAK,YAAY,cAAc,MAAA,IACtC,MAAA,EAMP,GAAA,CAHkB,EAAK,KACtB,GAAQ,EAAS,CAAA,GAAS,EAAK,aAAa,MAAA,IAAY,QAAZ,EAE7B,OAChB,EAAE,eAAA,CACH,EACa,KAAK,YAAY,cAAc,MAAA,IACtC,cAAA,CACP,CAGA,IAAA,cAAY,CACX,MAAO,CAAA,GAAI,KAAK,MAAA,EAAQ,OAAO,GAAK,EAAE,WAAA,CACvC,CAEA,MAAA,SAAuB,EAAA,CAGtB,GAFA,EAAE,eAAA,EACF,EAAE,gBAAA,EACE,KAAK,WAAY,OAMK,KAAK,aAAa,OAAO,GAAK,EAAE,YAAA,EACpC,OAAS,IAC9B,KAAK,gBAAgB,YAAA,EAAA,MACf,IAAI,QAAc,GAAA,CACvB,IAAM,MAAA,CACD,KAAK,aAAa,MAAM,GAAA,CAAM,EAAE,YAAA,EAAe,EAAA,EAC9C,sBAAsB,CAAA,CAAA,EAE5B,EAAA,CAAA,CAAA,GAKF,KAAK,aAAa,QAAQ,GAAK,EAAE,cAAA,CAAA,EAGjC,IAAM,EAAW,KAAK,aAAa,MAAM,GAAK,EAAE,cAAA,CAAA,EAC1C,EAAK,EAAgB,MAC3B,GAAA,CAAK,EAWJ,OAVA,EAAgB,IAAI,CAAA,GAChB,EACH,OAAQ,QACR,MAAO,CAAE,QAAS,mBAAA,CAAA,CAAA,EAEnB,KAAK,gBAAgB,QAAS,2DAAA,EAAA,KAI9B,KAH0B,aAAa,KAAK,GAAK,EAAE,KAAA,GAGrC,MAAA,EAIf,KAAK,WAAA,CAAa,EAClB,EAAgB,IAAI,CAAA,GAChB,EACH,OAAQ,aACR,MAAO,KACP,YAAa,EAAG,YAAc,CAAA,CAAA,EAE/B,KAAK,gBAAgB,YAAA,EAGrB,IAAM,EAAW,IAAI,SACrB,IAAK,IAAM,KAAS,KAAK,aACxB,IAAK,GAAA,CAAO,EAAG,KAAM,EAAM,cAAA,EAAiB,EAAS,OAAO,EAAG,CAAA,EAEhE,IAAM,EAAM,OAAO,YAAY,CAAA,EACzB,EAAO,KAAK,OAAS,KAAK,OAAO,MAAM,CAAA,EAAO,EAG9C,EAA8B,CAAA,EACpC,KAAK,cACJ,IAAI,YAA+C,SAAU,CAC5D,OAAQ,CACP,KAAA,EACA,SAAA,EACA,MAAQ,GAAwB,EAAQ,KAAK,CAAA,CAAA,CAAA,CAAA,CAAA,EAKhD,GAAA,CAAA,MACO,QAAQ,IAAI,CAAA,EAClB,EAAgB,IAAI,CAAA,GAChB,EAAgB,MACnB,OAAQ,UACR,MAAO,IAAA,CAAA,EAER,KAAK,gBAAgB,SAAA,CACtB,OAAS,EAAA,CACR,IAAM,EAAU,aAAe,MAAQ,EAAI,QAAU,OAAO,CAAA,EAC5D,EAAgB,IAAI,CAAA,GAChB,EAAgB,MACnB,OAAQ,QACR,MAAO,CAAE,QAAA,CAAA,CAAA,CAAA,EAEV,KAAK,gBAAgB,QAAS,CAAA,CAC/B,QAAA,CACC,KAAK,WAAA,CAAa,CACnB,CACD,CAEA,QAAgB,EAAA,CACf,EAAE,gBAAA,EACF,KAAK,aAAa,QAAQ,GAAK,EAAE,UAAA,CAAA,EACjC,EAAgB,IAAI,CAAE,OAAQ,OAAQ,MAAO,KAAM,YAAa,CAAA,CAAA,EAChE,KAAK,gBAAgB,MAAA,EACrB,KAAK,cAAc,IAAI,YAAY,OAAA,CAAA,CACpC,CAEA,gBAAwB,EAAmC,EAAA,CAC1D,KAAK,WAAa,EAClB,KAAK,UAAY,GAAgB,GACjC,IAAM,EAAS,KAAK,WAAW,OAC/B,GAAI,EAAQ,CACX,IAAK,IAAM,IAAK,CAAC,aAAc,UAAW,QAAS,MAAA,EAAS,EAAO,OAAO,CAAA,EAC1E,EAAO,IAAI,CAAA,CACZ,CAGI,IAAW,aAAc,KAAK,aAAa,YAAa,MAAA,EACvD,KAAK,gBAAgB,WAAA,EAG1B,KAAK,cACJ,IAAI,YAA6B,YAAa,CAC7C,OAAQ,CAAA,GAAK,EAAgB,KAAA,EAC7B,QAAA,CAAS,EACT,SAAA,CAAU,CAAA,CAAA,CAAA,CAGb,CAOA,cAAqB,EAAc,EAAA,CAClC,IAAM,EAAQ,KAAK,aAAa,KAAK,GAAK,EAAE,OAAS,CAAA,EACrD,MAAA,CAAA,CAAK,IACL,EAAM,kBAAkB,CAAA,EACxB,EAAM,cAAA,EAAA,CACC,EACR,CAMA,aAAoB,EAAiB,EAAA,CACpC,EAAgB,IAAI,CAAA,GAChB,EAAgB,MACnB,OAAQ,QACR,MAAO,CAAE,QAAA,EAAS,KAAA,CAAA,CAAA,CAAA,EAEnB,KAAK,gBAAgB,QAAS,CAAA,CAC/B,CAYA,gBAAA,CACC,KAAK,aAAa,QAAQ,GAAK,EAAE,eAAA,CAAA,EACjC,EAAgB,IAAI,CAAA,GAChB,EAAgB,MACnB,OAAQ,OACR,MAAO,IAAA,CAAA,EAER,KAAK,gBAAgB,MAAA,CACtB,CAGA,QAAA,CACC,IAAM,EAAO,KAAK,YAAY,cAAc,MAAA,EAC5C,MAAA,CAAA,CAAK,IACL,EAAK,cAAA,EAAA,CACE,EACR,CAGA,OAAA,EACc,KAAK,YAAY,cAAc,MAAA,IACtC,MAAA,CACP,CAEA,gBAAA,CACC,OAAO,KAAK,aAAa,MAAM,GAAK,EAAE,eAAA,CAAA,CACvC,CAEA,eAAA,CACC,OAAO,KAAK,aAAa,MAAM,GAAK,EAAE,cAAA,CAAA,CACvC,CAGA,aAAA,CACC,IAAM,EAAW,IAAI,SACrB,IAAK,IAAM,KAAS,KAAK,aACxB,IAAK,GAAA,CAAO,EAAG,KAAM,EAAM,cAAA,EAAiB,EAAS,OAAO,EAAG,CAAA,EAEhE,OAAO,CACR,CAEA,QAAA,CACC,MAAO,GAAA,IAAI;iCACoB,CAAC,CAAA,EAAA;;mBAEf,KAAK,WAAA;eACT,KAAK,SAAA;cACN,KAAK,QAAA;;;;;;;;;;;;;;;;;OAiBZ,KAAK,aAAe,QAAU,KAAK,UAAY,GAAA;;GAGrD,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UA7TU,CAAE,UAAA,CAAW,CAAA,CAAA,CAAA,EAAO,EAAA,UAAA,SAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAIpB,CAAE,KAAM,OAAA,CAAA,CAAA,EAAS,EAAA,UAAA,aAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,CAAA,EAYpB,EAAA,UAAA,aAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,CAAA,EACA,EAAA,UAAA,YAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,eA/BO,eAAA,CAAA,EAAe,CAAA,EAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,CAAA,CAAA,CAAA,EAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,CAAA,CAAA,CAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { t as e, u as t } from "./SchmancyElement-
|
|
2
|
-
import { r as n } from "./mixins-
|
|
3
|
-
import { s as r } from "./state-
|
|
1
|
+
import { t as e, u as t } from "./SchmancyElement-OG71FtNv.js";
|
|
2
|
+
import { r as n } from "./mixins-bCEXbwJV.js";
|
|
3
|
+
import { s as r } from "./state-DMd_FUeA.js";
|
|
4
4
|
import { fromEvent as i, takeUntil as a } from "rxjs";
|
|
5
5
|
import { customElement as o, property as s, state as c } from "lit/decorators.js";
|
|
6
6
|
import { css as l, html as u } from "lit";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form-DxaV_Ose.js","names":[],"sources":["../src/form/form-state.ts","../src/form/form.ts"],"sourcesContent":["/**\n * Form-level submit state — consumed by `<schmancy-form>` and any descendant\n * (e.g. `<schmancy-button type=\"submit\">` to drive its loading/aria-busy).\n *\n * `<schmancy-form>` wraps its render output in `<schmancy-context\n * .provides=${[formSubmitState]}>` so each instance gets an isolated copy\n * via the schmancy state library's resolveContextual mechanism. Reads of\n * `formSubmitState.value` and writes via `formSubmitState.set(...)` inside\n * the form's subtree resolve to the per-form copy automatically — no\n * `@lit/context` plumbing in user code.\n */\n\nimport { state } from '../state'\n\nexport type FormError = {\n\tmessage: string\n\tcode?: string\n}\n\nexport type FormSubmitState = {\n\tstatus: 'idle' | 'submitting' | 'success' | 'error'\n\terror: FormError | null\n\t/** Increments on every submit attempt — RHF parity. */\n\tsubmitCount: number\n}\n\nexport const formSubmitState = state<FormSubmitState>('schmancy/form-submit').memory({\n\tstatus: 'idle',\n\terror: null,\n\tsubmitCount: 0,\n})\n","/**\n * `<schmancy-form>` — schmancy form owner with isolated submit state.\n *\n * Architecture:\n * - Extends `SchmancyElement` (shadow DOM, RxJS + `disconnecting` conventions).\n * - Renders content inside `<schmancy-context .provides=${[formSubmitState]}>`\n * so each form instance gets an isolated copy of the submit state via the\n * schmancy state library — no `@lit/context` plumbing in user code.\n * - Inner `<form novalidate>` is the native-semantics trigger for Enter-key\n * submit and `type=submit` button activation.\n * - Fields self-register via `FIELD_CONNECT_EVENT` (composed event from\n * `FormFieldMixin.connectedCallback`). Stale refs (from disconnected\n * fields) are filtered by `isConnected` at iteration time.\n *\n * Schema seam — pass any `{ parse(input): T }` object (zod, valibot, ArkType,\n * etc.) via the `schema` property to get typed `submit` event detail.\n */\n\nimport { css, html } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { fromEvent, takeUntil } from 'rxjs'\nimport { SchmancyElement } from '../../mixins'\nimport { FIELD_CONNECT_EVENT, type IFormFieldMixin } from '../../mixins/formField.mixin'\nimport { formSubmitState, type FormSubmitState, type FormError } from './form-state'\n\n/** Structural type matching zod, valibot, ArkType, etc. — any schema with `.parse()`. */\nexport interface ParseSchema<T = unknown> {\n\tparse(input: unknown): T\n}\n\nconst isButton = (node: EventTarget): node is HTMLElement => {\n\tif (!(node instanceof HTMLElement)) return false\n\treturn node.tagName === 'BUTTON' || node.tagName === 'SCHMANCY-BUTTON'\n}\n\n/** Submit event detail. `data` is typed when `schema` is set. */\nexport type SchmancyFormSubmitDetail<T = Record<string, FormDataEntryValue>> = {\n\tdata: T\n\tformData: FormData\n\t/**\n\t * Register a promise that gates the form's success/error state. If unused,\n\t * the form synchronously flips to `success` after dispatch. If used,\n\t * `success`/`error` reflect the promise's outcome.\n\t */\n\tuntil(p: Promise<unknown>): void\n}\n\n@customElement('schmancy-form')\nexport default class SchmancyForm<TSchema extends ParseSchema | undefined = undefined>\n\textends SchmancyElement {\n\tstatic styles = css`\n\t\t:host { display: block; }\n\t`\n\n\tpublic static readonly tagName: string = 'schmancy-form'\n\n\t/**\n\t * Optional schema for parsing FormData on submit. Anything with a\n\t * `.parse(input)` method works (zod, valibot, ArkType). When set, the\n\t * `submit` event's `detail.data` is typed `z.infer<TSchema>`.\n\t */\n\t@property({ attribute: false })\n\tschema?: TSchema\n\n\t/** Skip built-in browser constraint validation. Mirrors `<form novalidate>`. */\n\t@property({ type: Boolean })\n\tnovalidate: boolean = true\n\n\tprivate fields = new Set<IFormFieldMixin>()\n\tprivate submitting = false\n\n\t/**\n\t * Local mirror of the submit-state status — drives the inline live region\n\t * synchronously. Independent of the schmancy-state library's resolution\n\t * chain (which has known cross-await fallback semantics) so the AT-facing\n\t * announcement is always correct for this form instance.\n\t */\n\t@state() private liveStatus: 'idle' | 'submitting' | 'success' | 'error' = 'idle'\n\t@state() private liveError: string = ''\n\tprivate internals: ElementInternals | undefined = (() => {\n\t\ttry {\n\t\t\treturn this.attachInternals()\n\t\t} catch {\n\t\t\treturn undefined\n\t\t}\n\t})()\n\n\toverride connectedCallback(): void {\n\t\tsuper.connectedCallback()\n\n\t\t// Forbid nested <schmancy-form>.\n\t\tif (this.parentElement?.closest('schmancy-form')) {\n\t\t\tconsole.error('[schmancy-form] nested <schmancy-form> is not supported')\n\t\t\treturn\n\t\t}\n\n\t\t// Field registry — composed event from FormFieldMixin.connectedCallback.\n\t\tfromEvent<CustomEvent<IFormFieldMixin>>(this, FIELD_CONNECT_EVENT)\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe(e => this.fields.add(e.detail))\n\n\t\t// Submit-trigger interception — slotted descendants live in light DOM\n\t\t// while the inner <form> is in shadow DOM, so native form-association\n\t\t// across the shadow boundary doesn't work for `<button type=submit>`.\n\t\t// Capture clicks on type=submit buttons (native + schmancy-button) and\n\t\t// Enter keys on registered fields, then call the inner form's\n\t\t// requestSubmit() which fires the same native submit event handler\n\t\t// chain that a directly-associated button would have triggered.\n\t\tfromEvent<MouseEvent>(this, 'click')\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe(e => this.maybeRequestSubmit(e))\n\t\tfromEvent<KeyboardEvent>(this, 'keydown')\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe(e => {\n\t\t\t\tif (e.key !== 'Enter' || e.shiftKey) return\n\t\t\t\t// Skip Enter inside <textarea> (newline) and contenteditable.\n\t\t\t\tconst target = e.target as HTMLElement | null\n\t\t\t\tif (target?.tagName === 'TEXTAREA') return\n\t\t\t\tif (target?.isContentEditable) return\n\t\t\t\tthis.maybeRequestSubmit(e)\n\t\t\t})\n\t}\n\n\tprivate maybeRequestSubmit(e: Event): void {\n\t\t// On click: trigger only when the target is a type=submit button.\n\t\t// On keydown(Enter): always trigger if focus is on a registered field.\n\t\t// type=reset is handled separately in maybeReset.\n\t\tif (e.type === 'click') {\n\t\t\tconst path = e.composedPath()\n\t\t\tconst resetBtn = path.find(\n\t\t\t\tnode => isButton(node) && node.getAttribute('type') === 'reset',\n\t\t\t)\n\t\t\tif (resetBtn) {\n\t\t\t\te.preventDefault()\n\t\t\t\tconst form = this.shadowRoot?.querySelector('form')\n\t\t\t\tform?.reset()\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst submitBtn = path.find(\n\t\t\t\tnode => isButton(node) && node.getAttribute('type') === 'submit',\n\t\t\t)\n\t\t\tif (!submitBtn) return\n\t\t\te.preventDefault()\n\t\t}\n\t\tconst form = this.shadowRoot?.querySelector('form')\n\t\tform?.requestSubmit()\n\t}\n\n\t/** Active fields — drops stale refs from disconnected nodes. */\n\tprivate get activeFields(): IFormFieldMixin[] {\n\t\treturn [...this.fields].filter(f => f.isConnected)\n\t}\n\n\tprivate async onSubmit(e: SubmitEvent): Promise<void> {\n\t\te.preventDefault()\n\t\te.stopPropagation()\n\t\tif (this.submitting) return\n\n\t\t// If any field has an async validator pending, wait for them all to\n\t\t// settle before deciding validity. This is the hard-block model: the\n\t\t// user clicks submit, the form holds (aria-busy=\"true\"), waits for\n\t\t// validators, then proceeds with the truth they reported.\n\t\tconst pendingValidators = this.activeFields.filter(f => f.isValidating)\n\t\tif (pendingValidators.length > 0) {\n\t\t\tthis.broadcastStatus('submitting')\n\t\t\tawait new Promise<void>(resolve => {\n\t\t\t\tconst tick = () => {\n\t\t\t\t\tif (this.activeFields.every(f => !f.isValidating)) resolve()\n\t\t\t\t\telse requestAnimationFrame(tick)\n\t\t\t\t}\n\t\t\t\ttick()\n\t\t\t})\n\t\t}\n\n\t\t// Phase 4 — submit forces error display on every field.\n\t\tthis.activeFields.forEach(f => f.markSubmitted())\n\n\t\t// Validate; success path entered ONLY if all valid.\n\t\tconst allValid = this.activeFields.every(f => f.checkValidity())\n\t\tconst fs = formSubmitState.value\n\t\tif (!allValid) {\n\t\t\tformSubmitState.set({\n\t\t\t\t...fs,\n\t\t\t\tstatus: 'error',\n\t\t\t\terror: { message: 'Validation failed' },\n\t\t\t})\n\t\t\tthis.broadcastStatus('error', 'Validation failed. Please correct the highlighted fields.')\n\t\t\tconst firstInvalid = this.activeFields.find(f => f.error) as unknown as\n\t\t\t\t| HTMLElement\n\t\t\t\t| undefined\n\t\t\tfirstInvalid?.focus()\n\t\t\treturn\n\t\t}\n\n\t\tthis.submitting = true\n\t\tformSubmitState.set({\n\t\t\t...fs,\n\t\t\tstatus: 'submitting',\n\t\t\terror: null,\n\t\t\tsubmitCount: fs.submitCount + 1,\n\t\t})\n\t\tthis.broadcastStatus('submitting')\n\n\t\t// Build payload from the registered fields' contracted toFormEntries().\n\t\tconst formData = new FormData()\n\t\tfor (const field of this.activeFields) {\n\t\t\tfor (const [k, v] of field.toFormEntries()) formData.append(k, v)\n\t\t}\n\t\tconst raw = Object.fromEntries(formData)\n\t\tconst data = this.schema ? this.schema.parse(raw) : raw\n\n\t\t// Awaitable submit — consumers register promises via e.detail.until(p).\n\t\tconst pending: Promise<unknown>[] = []\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent<SchmancyFormSubmitDetail<unknown>>('submit', {\n\t\t\t\tdetail: {\n\t\t\t\t\tdata,\n\t\t\t\t\tformData,\n\t\t\t\t\tuntil: (p: Promise<unknown>) => pending.push(p),\n\t\t\t\t},\n\t\t\t}),\n\t\t)\n\n\t\ttry {\n\t\t\tawait Promise.all(pending)\n\t\t\tformSubmitState.set({\n\t\t\t\t...formSubmitState.value,\n\t\t\t\tstatus: 'success',\n\t\t\t\terror: null,\n\t\t\t})\n\t\t\tthis.broadcastStatus('success')\n\t\t} catch (err) {\n\t\t\tconst message = err instanceof Error ? err.message : String(err)\n\t\t\tformSubmitState.set({\n\t\t\t\t...formSubmitState.value,\n\t\t\t\tstatus: 'error',\n\t\t\t\terror: { message },\n\t\t\t})\n\t\t\tthis.broadcastStatus('error', message)\n\t\t} finally {\n\t\t\tthis.submitting = false\n\t\t}\n\t}\n\n\tprivate onReset(e: Event): void {\n\t\te.stopPropagation()\n\t\tthis.activeFields.forEach(f => f.resetForm())\n\t\tformSubmitState.set({ status: 'idle', error: null, submitCount: 0 })\n\t\tthis.broadcastStatus('idle')\n\t\tthis.dispatchEvent(new CustomEvent('reset'))\n\t}\n\n\tprivate broadcastStatus(status: FormSubmitState['status'], errorMessage?: string): void {\n\t\tthis.liveStatus = status\n\t\tthis.liveError = errorMessage ?? ''\n\t\tconst states = this.internals?.states\n\t\tif (states) {\n\t\t\tfor (const s of ['submitting', 'success', 'error', 'idle']) states.delete(s)\n\t\t\tstates.add(status)\n\t\t}\n\t\t// aria-busy on the host while submitting (WCAG 2.2 AA — disabled buttons\n\t\t// drop from tab order; keep them focusable, signal busy via aria).\n\t\tif (status === 'submitting') this.setAttribute('aria-busy', 'true')\n\t\telse this.removeAttribute('aria-busy')\n\t\t// Public formstate event — external state stores subscribe without\n\t\t// having to consume formSubmitState directly.\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent<FormSubmitState>('formstate', {\n\t\t\t\tdetail: { ...formSubmitState.value },\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t}),\n\t\t)\n\t}\n\n\t/**\n\t * Server-side error mapping (RHF `setError(name, ...)`-equivalent).\n\t * Sets `setCustomValidity(message)` on the matching field and ensures the\n\t * error displays by marking it submitted.\n\t */\n\tpublic setFieldError(name: string, message: string): boolean {\n\t\tconst field = this.activeFields.find(f => f.name === name)\n\t\tif (!field) return false\n\t\tfield.setCustomValidity(message)\n\t\tfield.markSubmitted()\n\t\treturn true\n\t}\n\n\t/**\n\t * Top-of-form error (RHF `setError('root.serverError', ...)`-equivalent).\n\t * Flips form status to 'error' with a structured `FormError`.\n\t */\n\tpublic setFormError(message: string, code?: string): void {\n\t\tformSubmitState.set({\n\t\t\t...formSubmitState.value,\n\t\t\tstatus: 'error',\n\t\t\terror: { message, code } as FormError,\n\t\t})\n\t\tthis.broadcastStatus('error', message)\n\t}\n\n\t/**\n\t * Clear the `submitted` flag on every registered field without resetting\n\t * their values. Wizard pattern: stepping back from a later step should not\n\t * leave the earlier step's fields in aggressive \"show all errors\" mode\n\t * (which `submitted = true` triggers via the `shouldShowError()` gate).\n\t *\n\t * Pristine fields with `validateOn: 'dirty'` go quiet again. Fields the\n\t * user actually dirtied keep showing their errors (correct UX — those are\n\t * still genuine mistakes the user can see).\n\t */\n\tpublic clearSubmitted(): void {\n\t\tthis.activeFields.forEach(f => f.clearSubmitted())\n\t\tformSubmitState.set({\n\t\t\t...formSubmitState.value,\n\t\t\tstatus: 'idle',\n\t\t\terror: null,\n\t\t})\n\t\tthis.broadcastStatus('idle')\n\t}\n\n\t/** Programmatically submit via the native submitter pipeline. */\n\tpublic submit(): boolean {\n\t\tconst form = this.shadowRoot?.querySelector('form')\n\t\tif (!form) return false\n\t\tform.requestSubmit()\n\t\treturn true\n\t}\n\n\t/** Programmatically reset via native `form.reset()`. */\n\tpublic reset(): void {\n\t\tconst form = this.shadowRoot?.querySelector('form')\n\t\tform?.reset()\n\t}\n\n\tpublic reportValidity(): boolean {\n\t\treturn this.activeFields.every(f => f.reportValidity())\n\t}\n\n\tpublic checkValidity(): boolean {\n\t\treturn this.activeFields.every(f => f.checkValidity())\n\t}\n\n\t/** Snapshot of current form values from the registered fields. */\n\tpublic getFormData(): FormData {\n\t\tconst formData = new FormData()\n\t\tfor (const field of this.activeFields) {\n\t\t\tfor (const [k, v] of field.toFormEntries()) formData.append(k, v)\n\t\t}\n\t\treturn formData\n\t}\n\n\trender() {\n\t\treturn html`\n\t\t\t<schmancy-context .provides=${[formSubmitState]}>\n\t\t\t\t<form\n\t\t\t\t\t?novalidate=${this.novalidate}\n\t\t\t\t\t@submit=${this.onSubmit}\n\t\t\t\t\t@reset=${this.onReset}\n\t\t\t\t>\n\t\t\t\t\t<slot></slot>\n\t\t\t\t</form>\n\t\t\t\t<!--\n\t\t\t\t\tForm-level live region — assistive tech announces server-side\n\t\t\t\t\tform errors (validation summary, network failure, server reject)\n\t\t\t\t\there. Visually hidden via the .sr-only convention; consumers\n\t\t\t\t\trender their own visible banner from formSubmitState if they\n\t\t\t\t\twant one. Empty content while idle/submitting/success — only\n\t\t\t\t\terror states populate the region. WCAG 4.1.3 (Status Messages).\n\t\t\t\t-->\n\t\t\t\t<div\n\t\t\t\t\trole=\"status\"\n\t\t\t\t\taria-live=\"assertive\"\n\t\t\t\t\taria-atomic=\"true\"\n\t\t\t\t\tclass=\"sr-only\"\n\t\t\t\t>${this.liveStatus === 'error' ? this.liveError : ''}</div>\n\t\t\t</schmancy-context>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-form': SchmancyForm\n\t}\n}\n\n// Retained type surfaces — kept exported because downstream code may import\n// them as documentation. The new implementation no longer uses them\n// internally.\n\nexport interface FormElement extends HTMLElement {\n\tname?: string\n\tvalue?: string\n\tdisabled?: boolean\n\ttype?: string\n\tdefaultValue?: string\n}\n\nexport interface CheckableFormElement extends FormElement {\n\tchecked?: boolean\n}\n\nexport interface ValidatableFormElement extends FormElement {\n\treportValidity?: () => boolean\n\tcheckValidity?: () => boolean\n}\n\nexport interface FormEventMap {\n\tsubmit: CustomEvent<SchmancyFormSubmitDetail<unknown>>\n\treset: CustomEvent\n\tformstate: CustomEvent<FormSubmitState>\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"form-tG7LwDm4.js","names":[],"sources":["../src/form/form-state.ts","../src/form/form.ts"],"sourcesContent":["/**\n * Form-level submit state — consumed by `<schmancy-form>` and any descendant\n * (e.g. `<schmancy-button type=\"submit\">` to drive its loading/aria-busy).\n *\n * `<schmancy-form>` wraps its render output in `<schmancy-context\n * .provides=${[formSubmitState]}>` so each instance gets an isolated copy\n * via the schmancy state library's resolveContextual mechanism. Reads of\n * `formSubmitState.value` and writes via `formSubmitState.set(...)` inside\n * the form's subtree resolve to the per-form copy automatically — no\n * `@lit/context` plumbing in user code.\n */\n\nimport { state } from '../state'\n\nexport type FormError = {\n\tmessage: string\n\tcode?: string\n}\n\nexport type FormSubmitState = {\n\tstatus: 'idle' | 'submitting' | 'success' | 'error'\n\terror: FormError | null\n\t/** Increments on every submit attempt — RHF parity. */\n\tsubmitCount: number\n}\n\nexport const formSubmitState = state<FormSubmitState>('schmancy/form-submit').memory({\n\tstatus: 'idle',\n\terror: null,\n\tsubmitCount: 0,\n})\n","/**\n * `<schmancy-form>` — schmancy form owner with isolated submit state.\n *\n * Architecture:\n * - Extends `SchmancyElement` (shadow DOM, RxJS + `disconnecting` conventions).\n * - Renders content inside `<schmancy-context .provides=${[formSubmitState]}>`\n * so each form instance gets an isolated copy of the submit state via the\n * schmancy state library — no `@lit/context` plumbing in user code.\n * - Inner `<form novalidate>` is the native-semantics trigger for Enter-key\n * submit and `type=submit` button activation.\n * - Fields self-register via `FIELD_CONNECT_EVENT` (composed event from\n * `FormFieldMixin.connectedCallback`). Stale refs (from disconnected\n * fields) are filtered by `isConnected` at iteration time.\n *\n * Schema seam — pass any `{ parse(input): T }` object (zod, valibot, ArkType,\n * etc.) via the `schema` property to get typed `submit` event detail.\n */\n\nimport { css, html } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { fromEvent, takeUntil } from 'rxjs'\nimport { SchmancyElement } from '../../mixins'\nimport { FIELD_CONNECT_EVENT, type IFormFieldMixin } from '../../mixins/formField.mixin'\nimport { formSubmitState, type FormSubmitState, type FormError } from './form-state'\n\n/** Structural type matching zod, valibot, ArkType, etc. — any schema with `.parse()`. */\nexport interface ParseSchema<T = unknown> {\n\tparse(input: unknown): T\n}\n\nconst isButton = (node: EventTarget): node is HTMLElement => {\n\tif (!(node instanceof HTMLElement)) return false\n\treturn node.tagName === 'BUTTON' || node.tagName === 'SCHMANCY-BUTTON'\n}\n\n/** Submit event detail. `data` is typed when `schema` is set. */\nexport type SchmancyFormSubmitDetail<T = Record<string, FormDataEntryValue>> = {\n\tdata: T\n\tformData: FormData\n\t/**\n\t * Register a promise that gates the form's success/error state. If unused,\n\t * the form synchronously flips to `success` after dispatch. If used,\n\t * `success`/`error` reflect the promise's outcome.\n\t */\n\tuntil(p: Promise<unknown>): void\n}\n\n@customElement('schmancy-form')\nexport default class SchmancyForm<TSchema extends ParseSchema | undefined = undefined>\n\textends SchmancyElement {\n\tstatic styles = css`\n\t\t:host { display: block; }\n\t`\n\n\tpublic static readonly tagName: string = 'schmancy-form'\n\n\t/**\n\t * Optional schema for parsing FormData on submit. Anything with a\n\t * `.parse(input)` method works (zod, valibot, ArkType). When set, the\n\t * `submit` event's `detail.data` is typed `z.infer<TSchema>`.\n\t */\n\t@property({ attribute: false })\n\tschema?: TSchema\n\n\t/** Skip built-in browser constraint validation. Mirrors `<form novalidate>`. */\n\t@property({ type: Boolean })\n\tnovalidate: boolean = true\n\n\tprivate fields = new Set<IFormFieldMixin>()\n\tprivate submitting = false\n\n\t/**\n\t * Local mirror of the submit-state status — drives the inline live region\n\t * synchronously. Independent of the schmancy-state library's resolution\n\t * chain (which has known cross-await fallback semantics) so the AT-facing\n\t * announcement is always correct for this form instance.\n\t */\n\t@state() private liveStatus: 'idle' | 'submitting' | 'success' | 'error' = 'idle'\n\t@state() private liveError: string = ''\n\tprivate internals: ElementInternals | undefined = (() => {\n\t\ttry {\n\t\t\treturn this.attachInternals()\n\t\t} catch {\n\t\t\treturn undefined\n\t\t}\n\t})()\n\n\toverride connectedCallback(): void {\n\t\tsuper.connectedCallback()\n\n\t\t// Forbid nested <schmancy-form>.\n\t\tif (this.parentElement?.closest('schmancy-form')) {\n\t\t\tconsole.error('[schmancy-form] nested <schmancy-form> is not supported')\n\t\t\treturn\n\t\t}\n\n\t\t// Field registry — composed event from FormFieldMixin.connectedCallback.\n\t\tfromEvent<CustomEvent<IFormFieldMixin>>(this, FIELD_CONNECT_EVENT)\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe(e => this.fields.add(e.detail))\n\n\t\t// Submit-trigger interception — slotted descendants live in light DOM\n\t\t// while the inner <form> is in shadow DOM, so native form-association\n\t\t// across the shadow boundary doesn't work for `<button type=submit>`.\n\t\t// Capture clicks on type=submit buttons (native + schmancy-button) and\n\t\t// Enter keys on registered fields, then call the inner form's\n\t\t// requestSubmit() which fires the same native submit event handler\n\t\t// chain that a directly-associated button would have triggered.\n\t\tfromEvent<MouseEvent>(this, 'click')\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe(e => this.maybeRequestSubmit(e))\n\t\tfromEvent<KeyboardEvent>(this, 'keydown')\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe(e => {\n\t\t\t\tif (e.key !== 'Enter' || e.shiftKey) return\n\t\t\t\t// Skip Enter inside <textarea> (newline) and contenteditable.\n\t\t\t\tconst target = e.target as HTMLElement | null\n\t\t\t\tif (target?.tagName === 'TEXTAREA') return\n\t\t\t\tif (target?.isContentEditable) return\n\t\t\t\tthis.maybeRequestSubmit(e)\n\t\t\t})\n\t}\n\n\tprivate maybeRequestSubmit(e: Event): void {\n\t\t// On click: trigger only when the target is a type=submit button.\n\t\t// On keydown(Enter): always trigger if focus is on a registered field.\n\t\t// type=reset is handled separately in maybeReset.\n\t\tif (e.type === 'click') {\n\t\t\tconst path = e.composedPath()\n\t\t\tconst resetBtn = path.find(\n\t\t\t\tnode => isButton(node) && node.getAttribute('type') === 'reset',\n\t\t\t)\n\t\t\tif (resetBtn) {\n\t\t\t\te.preventDefault()\n\t\t\t\tconst form = this.shadowRoot?.querySelector('form')\n\t\t\t\tform?.reset()\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst submitBtn = path.find(\n\t\t\t\tnode => isButton(node) && node.getAttribute('type') === 'submit',\n\t\t\t)\n\t\t\tif (!submitBtn) return\n\t\t\te.preventDefault()\n\t\t}\n\t\tconst form = this.shadowRoot?.querySelector('form')\n\t\tform?.requestSubmit()\n\t}\n\n\t/** Active fields — drops stale refs from disconnected nodes. */\n\tprivate get activeFields(): IFormFieldMixin[] {\n\t\treturn [...this.fields].filter(f => f.isConnected)\n\t}\n\n\tprivate async onSubmit(e: SubmitEvent): Promise<void> {\n\t\te.preventDefault()\n\t\te.stopPropagation()\n\t\tif (this.submitting) return\n\n\t\t// If any field has an async validator pending, wait for them all to\n\t\t// settle before deciding validity. This is the hard-block model: the\n\t\t// user clicks submit, the form holds (aria-busy=\"true\"), waits for\n\t\t// validators, then proceeds with the truth they reported.\n\t\tconst pendingValidators = this.activeFields.filter(f => f.isValidating)\n\t\tif (pendingValidators.length > 0) {\n\t\t\tthis.broadcastStatus('submitting')\n\t\t\tawait new Promise<void>(resolve => {\n\t\t\t\tconst tick = () => {\n\t\t\t\t\tif (this.activeFields.every(f => !f.isValidating)) resolve()\n\t\t\t\t\telse requestAnimationFrame(tick)\n\t\t\t\t}\n\t\t\t\ttick()\n\t\t\t})\n\t\t}\n\n\t\t// Phase 4 — submit forces error display on every field.\n\t\tthis.activeFields.forEach(f => f.markSubmitted())\n\n\t\t// Validate; success path entered ONLY if all valid.\n\t\tconst allValid = this.activeFields.every(f => f.checkValidity())\n\t\tconst fs = formSubmitState.value\n\t\tif (!allValid) {\n\t\t\tformSubmitState.set({\n\t\t\t\t...fs,\n\t\t\t\tstatus: 'error',\n\t\t\t\terror: { message: 'Validation failed' },\n\t\t\t})\n\t\t\tthis.broadcastStatus('error', 'Validation failed. Please correct the highlighted fields.')\n\t\t\tconst firstInvalid = this.activeFields.find(f => f.error) as unknown as\n\t\t\t\t| HTMLElement\n\t\t\t\t| undefined\n\t\t\tfirstInvalid?.focus()\n\t\t\treturn\n\t\t}\n\n\t\tthis.submitting = true\n\t\tformSubmitState.set({\n\t\t\t...fs,\n\t\t\tstatus: 'submitting',\n\t\t\terror: null,\n\t\t\tsubmitCount: fs.submitCount + 1,\n\t\t})\n\t\tthis.broadcastStatus('submitting')\n\n\t\t// Build payload from the registered fields' contracted toFormEntries().\n\t\tconst formData = new FormData()\n\t\tfor (const field of this.activeFields) {\n\t\t\tfor (const [k, v] of field.toFormEntries()) formData.append(k, v)\n\t\t}\n\t\tconst raw = Object.fromEntries(formData)\n\t\tconst data = this.schema ? this.schema.parse(raw) : raw\n\n\t\t// Awaitable submit — consumers register promises via e.detail.until(p).\n\t\tconst pending: Promise<unknown>[] = []\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent<SchmancyFormSubmitDetail<unknown>>('submit', {\n\t\t\t\tdetail: {\n\t\t\t\t\tdata,\n\t\t\t\t\tformData,\n\t\t\t\t\tuntil: (p: Promise<unknown>) => pending.push(p),\n\t\t\t\t},\n\t\t\t}),\n\t\t)\n\n\t\ttry {\n\t\t\tawait Promise.all(pending)\n\t\t\tformSubmitState.set({\n\t\t\t\t...formSubmitState.value,\n\t\t\t\tstatus: 'success',\n\t\t\t\terror: null,\n\t\t\t})\n\t\t\tthis.broadcastStatus('success')\n\t\t} catch (err) {\n\t\t\tconst message = err instanceof Error ? err.message : String(err)\n\t\t\tformSubmitState.set({\n\t\t\t\t...formSubmitState.value,\n\t\t\t\tstatus: 'error',\n\t\t\t\terror: { message },\n\t\t\t})\n\t\t\tthis.broadcastStatus('error', message)\n\t\t} finally {\n\t\t\tthis.submitting = false\n\t\t}\n\t}\n\n\tprivate onReset(e: Event): void {\n\t\te.stopPropagation()\n\t\tthis.activeFields.forEach(f => f.resetForm())\n\t\tformSubmitState.set({ status: 'idle', error: null, submitCount: 0 })\n\t\tthis.broadcastStatus('idle')\n\t\tthis.dispatchEvent(new CustomEvent('reset'))\n\t}\n\n\tprivate broadcastStatus(status: FormSubmitState['status'], errorMessage?: string): void {\n\t\tthis.liveStatus = status\n\t\tthis.liveError = errorMessage ?? ''\n\t\tconst states = this.internals?.states\n\t\tif (states) {\n\t\t\tfor (const s of ['submitting', 'success', 'error', 'idle']) states.delete(s)\n\t\t\tstates.add(status)\n\t\t}\n\t\t// aria-busy on the host while submitting (WCAG 2.2 AA — disabled buttons\n\t\t// drop from tab order; keep them focusable, signal busy via aria).\n\t\tif (status === 'submitting') this.setAttribute('aria-busy', 'true')\n\t\telse this.removeAttribute('aria-busy')\n\t\t// Public formstate event — external state stores subscribe without\n\t\t// having to consume formSubmitState directly.\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent<FormSubmitState>('formstate', {\n\t\t\t\tdetail: { ...formSubmitState.value },\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t}),\n\t\t)\n\t}\n\n\t/**\n\t * Server-side error mapping (RHF `setError(name, ...)`-equivalent).\n\t * Sets `setCustomValidity(message)` on the matching field and ensures the\n\t * error displays by marking it submitted.\n\t */\n\tpublic setFieldError(name: string, message: string): boolean {\n\t\tconst field = this.activeFields.find(f => f.name === name)\n\t\tif (!field) return false\n\t\tfield.setCustomValidity(message)\n\t\tfield.markSubmitted()\n\t\treturn true\n\t}\n\n\t/**\n\t * Top-of-form error (RHF `setError('root.serverError', ...)`-equivalent).\n\t * Flips form status to 'error' with a structured `FormError`.\n\t */\n\tpublic setFormError(message: string, code?: string): void {\n\t\tformSubmitState.set({\n\t\t\t...formSubmitState.value,\n\t\t\tstatus: 'error',\n\t\t\terror: { message, code } as FormError,\n\t\t})\n\t\tthis.broadcastStatus('error', message)\n\t}\n\n\t/**\n\t * Clear the `submitted` flag on every registered field without resetting\n\t * their values. Wizard pattern: stepping back from a later step should not\n\t * leave the earlier step's fields in aggressive \"show all errors\" mode\n\t * (which `submitted = true` triggers via the `shouldShowError()` gate).\n\t *\n\t * Pristine fields with `validateOn: 'dirty'` go quiet again. Fields the\n\t * user actually dirtied keep showing their errors (correct UX — those are\n\t * still genuine mistakes the user can see).\n\t */\n\tpublic clearSubmitted(): void {\n\t\tthis.activeFields.forEach(f => f.clearSubmitted())\n\t\tformSubmitState.set({\n\t\t\t...formSubmitState.value,\n\t\t\tstatus: 'idle',\n\t\t\terror: null,\n\t\t})\n\t\tthis.broadcastStatus('idle')\n\t}\n\n\t/** Programmatically submit via the native submitter pipeline. */\n\tpublic submit(): boolean {\n\t\tconst form = this.shadowRoot?.querySelector('form')\n\t\tif (!form) return false\n\t\tform.requestSubmit()\n\t\treturn true\n\t}\n\n\t/** Programmatically reset via native `form.reset()`. */\n\tpublic reset(): void {\n\t\tconst form = this.shadowRoot?.querySelector('form')\n\t\tform?.reset()\n\t}\n\n\tpublic reportValidity(): boolean {\n\t\treturn this.activeFields.every(f => f.reportValidity())\n\t}\n\n\tpublic checkValidity(): boolean {\n\t\treturn this.activeFields.every(f => f.checkValidity())\n\t}\n\n\t/** Snapshot of current form values from the registered fields. */\n\tpublic getFormData(): FormData {\n\t\tconst formData = new FormData()\n\t\tfor (const field of this.activeFields) {\n\t\t\tfor (const [k, v] of field.toFormEntries()) formData.append(k, v)\n\t\t}\n\t\treturn formData\n\t}\n\n\trender() {\n\t\treturn html`\n\t\t\t<schmancy-context .provides=${[formSubmitState]}>\n\t\t\t\t<form\n\t\t\t\t\t?novalidate=${this.novalidate}\n\t\t\t\t\t@submit=${this.onSubmit}\n\t\t\t\t\t@reset=${this.onReset}\n\t\t\t\t>\n\t\t\t\t\t<slot></slot>\n\t\t\t\t</form>\n\t\t\t\t<!--\n\t\t\t\t\tForm-level live region — assistive tech announces server-side\n\t\t\t\t\tform errors (validation summary, network failure, server reject)\n\t\t\t\t\there. Visually hidden via the .sr-only convention; consumers\n\t\t\t\t\trender their own visible banner from formSubmitState if they\n\t\t\t\t\twant one. Empty content while idle/submitting/success — only\n\t\t\t\t\terror states populate the region. WCAG 4.1.3 (Status Messages).\n\t\t\t\t-->\n\t\t\t\t<div\n\t\t\t\t\trole=\"status\"\n\t\t\t\t\taria-live=\"assertive\"\n\t\t\t\t\taria-atomic=\"true\"\n\t\t\t\t\tclass=\"sr-only\"\n\t\t\t\t>${this.liveStatus === 'error' ? this.liveError : ''}</div>\n\t\t\t</schmancy-context>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-form': SchmancyForm\n\t}\n}\n\n// Retained type surfaces — kept exported because downstream code may import\n// them as documentation. The new implementation no longer uses them\n// internally.\n\nexport interface FormElement extends HTMLElement {\n\tname?: string\n\tvalue?: string\n\tdisabled?: boolean\n\ttype?: string\n\tdefaultValue?: string\n}\n\nexport interface CheckableFormElement extends FormElement {\n\tchecked?: boolean\n}\n\nexport interface ValidatableFormElement extends FormElement {\n\treportValidity?: () => boolean\n\tcheckValidity?: () => boolean\n}\n\nexport interface FormEventMap {\n\tsubmit: CustomEvent<SchmancyFormSubmitDetail<unknown>>\n\treset: CustomEvent\n\tformstate: CustomEvent<FormSubmitState>\n}\n"],"mappings":"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"}
|
package/dist/form.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`./chunk-CncqDLb2.cjs`);const e=require(`./SchmancyElement-
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`./chunk-CncqDLb2.cjs`);const e=require(`./SchmancyElement-PS1u0j1B.cjs`);require(`./mixins-BoMURWag.cjs`),require(`./autocomplete-Dq3BkitV.cjs`);const t=require(`./input-chip-CV91URyU.cjs`),n=require(`./checkbox-DXKdxkXE.cjs`),r=require(`./chips-9eG-96_D.cjs`),i=require(`./date-range-Q2xj5Syc.cjs`),a=require(`./form-DowzVsgI.cjs`),o=require(`./input-DnmC6J1T.cjs`);require(`./input.cjs`);const s=require(`./radio-group-6kCgOgBL.cjs`),c=require(`./range.cjs`),l=require(`./select-MXsF8KsU.cjs`),u=require(`./switch.cjs`);require(`./textarea-BwYwH9fu.cjs`);let d=require(`lit/decorators.js`),f=require(`lit`);var p=class extends e.t{constructor(...e){super(...e),this.bump=0,this.form=null}connectedCallback(){super.connectedCallback(),this.form=this.closest(`schmancy-form`),this.form&&(this.formObserver=new MutationObserver(()=>{this.bump++}),this.formObserver.observe(this.form,{attributes:!0,subtree:!0}),(async()=>{await this.form?.updateComplete;let e=this.form?.shadowRoot?.querySelector(`[role="status"]`);e&&this.formObserver?.observe(e,{childList:!0,characterData:!0,subtree:!0}),this.bump++})())}disconnectedCallback(){this.formObserver?.disconnect(),this.formObserver=void 0,super.disconnectedCallback()}readFormStatus(){return this.form?this.form.matches(`:state(error)`)?`error`:this.form.matches(`:state(submitting)`)?`submitting`:this.form.matches(`:state(success)`)?`success`:`idle`:`idle`}readFormMessage(){return(this.form?.shadowRoot?.querySelector(`[role="status"]`))?.textContent?.trim()??``}readInvalidFields(){if(!this.form)return[];let e=[];for(let t of Array.from(this.form.querySelectorAll(`*`))){if(!(t instanceof HTMLElement))continue;let n=!1;try{n=t.matches(`:state(invalid)`)}catch{continue}if(!n)continue;let r=t;e.push({id:r.id,label:r.label||r.name||`(field)`,message:r.validationMessage||`Invalid value`})}return e}render(){if(this.bump,this.readFormStatus()!==`error`)return f.nothing;let e=this.readFormMessage(),t=this.readInvalidFields(),n=t.length;return f.html`
|
|
2
2
|
<div role="alert" aria-labelledby="schmancy-form-summary-heading">
|
|
3
3
|
<h2 id="schmancy-form-summary-heading">${this.heading??(n===0?`There is a problem with this form`:`There ${n===1?`is`:`are`} ${n} problem${n===1?``:`s`} with this form`)}</h2>
|
|
4
4
|
${e?f.html`<p>${e}</p>`:f.nothing}
|
package/dist/form.js
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import { t as e, u as t } from "./SchmancyElement-
|
|
2
|
-
import "./mixins-
|
|
3
|
-
import "./autocomplete-
|
|
4
|
-
import { t as n } from "./input-chip-
|
|
5
|
-
import { t as r } from "./checkbox-
|
|
6
|
-
import { n as i, r as a, t as o } from "./chips-
|
|
7
|
-
import { n as s, t as c } from "./date-range-
|
|
8
|
-
import { n as l, t as u } from "./form-
|
|
9
|
-
import { n as d, t as f } from "./input-
|
|
1
|
+
import { t as e, u as t } from "./SchmancyElement-OG71FtNv.js";
|
|
2
|
+
import "./mixins-bCEXbwJV.js";
|
|
3
|
+
import "./autocomplete-UNOknYUz.js";
|
|
4
|
+
import { t as n } from "./input-chip-CYI17YOq.js";
|
|
5
|
+
import { t as r } from "./checkbox-7vEPZuGC.js";
|
|
6
|
+
import { n as i, r as a, t as o } from "./chips-DF7akwz7.js";
|
|
7
|
+
import { n as s, t as c } from "./date-range-C13_R3OA.js";
|
|
8
|
+
import { n as l, t as u } from "./form-tG7LwDm4.js";
|
|
9
|
+
import { n as d, t as f } from "./input-cTyDxW9L.js";
|
|
10
10
|
import "./input.js";
|
|
11
|
-
import { n as p, t as m } from "./radio-group-
|
|
11
|
+
import { n as p, t as m } from "./radio-group-bZtZHOj_.js";
|
|
12
12
|
import { SchmancyRange as h } from "./range.js";
|
|
13
|
-
import { t as g } from "./select-
|
|
13
|
+
import { t as g } from "./select-CU3X-PIa.js";
|
|
14
14
|
import { SchmancySwitch as _ } from "./switch.js";
|
|
15
|
-
import "./textarea-
|
|
15
|
+
import "./textarea-kkYNk1ET.js";
|
|
16
16
|
import { customElement as v, property as y, state as b } from "lit/decorators.js";
|
|
17
17
|
import { html as x, nothing as S } from "lit";
|
|
18
18
|
var C = class extends e {
|
|
@@ -203,7 +203,7 @@ The manifest already has everything needed; the package is just the JSON-RPC wra
|
|
|
203
203
|
|
|
204
204
|
**Problem.** `handover/agent-runtime-v1.md` had `<PENDING>` placeholders that we manually replaced with `0.9.13` after the first publish. Future handover docs will have the same issue.
|
|
205
205
|
|
|
206
|
-
**Fix.** A build step that substitutes `0.10.
|
|
206
|
+
**Fix.** A build step that substitutes `0.10.42` in `handover/**/*.md` against `package.json`'s `version` field on every build. `dist/handover/**/*.md` gets the rendered version; the source stays templated.
|
|
207
207
|
|
|
208
208
|
**Effort:** ~30 min (one sed step or a tiny script).
|
|
209
209
|
|
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
## The URLs you asked for
|
|
8
8
|
|
|
9
9
|
```
|
|
10
|
-
https://esm.sh/@mhmo91/schmancy/agent@0.10.
|
|
11
|
-
https://esm.sh/@mhmo91/schmancy/agent/manifest@0.10.
|
|
10
|
+
https://esm.sh/@mhmo91/schmancy/agent@0.10.42
|
|
11
|
+
https://esm.sh/@mhmo91/schmancy/agent/manifest@0.10.42
|
|
12
12
|
```
|
|
13
13
|
|
|
14
14
|
`0.9.13` is the first release containing `/agent`; every subsequent publish serves the same subpath. `npm view @mhmo91/schmancy version` always returns the current pin if you want to float forward.
|
|
@@ -20,7 +20,7 @@ One script tag. No bundler, no bare specifiers, no npm install.
|
|
|
20
20
|
```html
|
|
21
21
|
<!doctype html>
|
|
22
22
|
<script type="module">
|
|
23
|
-
import { $dialog, theme } from 'https://esm.sh/@mhmo91/schmancy/agent@0.10.
|
|
23
|
+
import { $dialog, theme } from 'https://esm.sh/@mhmo91/schmancy/agent@0.10.42';
|
|
24
24
|
</script>
|
|
25
25
|
<schmancy-theme root scheme="dark">
|
|
26
26
|
<schmancy-surface type="solid" fill="all">
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
require(`./chunk-CncqDLb2.cjs`);const e=require(`./SchmancyElement-
|
|
1
|
+
require(`./chunk-CncqDLb2.cjs`);const e=require(`./SchmancyElement-PS1u0j1B.cjs`);require(`./mixins-BoMURWag.cjs`);let t=require(`lit/decorators.js`),n=require(`lit`);var r=class extends e.t{constructor(...e){super(...e),this.name=``}static{this.styles=[n.css`
|
|
2
2
|
:host {
|
|
3
3
|
display: inline-flex;
|
|
4
4
|
place-items: center;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icons-
|
|
1
|
+
{"version":3,"file":"icons-BZeCloP9.cjs","names":[],"sources":["../src/icons/icon.ts"],"sourcesContent":["import { SchmancyElement } from '@mixins/index'\nimport { css, html, nothing, svg } from 'lit'\nimport { customElement, state } from 'lit/decorators.js'\n\ndeclare global {\n interface Window {\n // eslint-disable-next-line no-underscore-dangle -- public runtime contract: global populated by the external schmancy-icons Vite plugin; renaming breaks consumers\n __siIcons?: Record<string, string>\n }\n}\n\n/**\n * @element schmancy-icon\n * Renders a Material Symbol inline as SVG — path data comes from\n * window.__siIcons populated by the schmancy-icons Vite plugin.\n *\n * Size: set font-size on the host via Tailwind (e.g. class=\"text-2xl\").\n * Color: inherits currentColor.\n * Active fill: use the \"-fill\" variant name: \"home-fill\".\n *\n * Usage:\n * <schmancy-icon>home</schmancy-icon>\n * <schmancy-icon class=\"text-lg text-primary-default\">delete</schmancy-icon>\n * <schmancy-icon>${active ? 'home-fill' : 'home'}</schmancy-icon>\n */\n@customElement('schmancy-icon')\nexport default class SchmancyIcon extends SchmancyElement {\n\tstatic styles = [css`\n\t\t:host {\n\t\t\tdisplay: inline-flex;\n\t\t\tplace-items: center;\n\t\t\tplace-content: center;\n\t\t\tfont-size: 24px;\n\t\t\twidth: 1em;\n\t\t\theight: 1em;\n\t\t\tflex-shrink: 0;\n\t\t\tcolor: inherit;\n\t\t}\n\n\t\tsvg {\n\t\t\twidth: 100%;\n\t\t\theight: 100%;\n\t\t\tfill: currentColor;\n\t\t\toverflow: visible;\n\t\t}\n\t`]\n\n\t@state() private name = ''\n\n\tprivate observer?: MutationObserver\n\n\toverride connectedCallback(): void {\n\t\tsuper.connectedCallback()\n\t\tthis.name = this.textContent?.trim() ?? ''\n\t\tthis.observer = new MutationObserver(() => {\n\t\t\tthis.name = this.textContent?.trim() ?? ''\n\t\t})\n\t\tthis.observer.observe(this, { childList: true, characterData: true, subtree: true })\n\t\tthis.setAttribute('aria-hidden', 'true')\n\t\tthis.setAttribute('translate', 'no')\n\t}\n\n\toverride disconnectedCallback(): void {\n\t\tsuper.disconnectedCallback()\n\t\tthis.observer?.disconnect()\n\t}\n\n\tprotected override render(): unknown {\n\t\t// eslint-disable-next-line no-underscore-dangle -- public runtime contract: see Window.__siIcons declaration above\n\t\tconst path = window.__siIcons?.[this.name]\n\t\treturn html`\n\t\t\t<slot style=\"display:none\"></slot>\n\t\t\t${path\n\t\t\t\t? html`<svg viewBox=\"0 -960 960 960\" xmlns=\"http://www.w3.org/2000/svg\">\n\t\t\t\t\t\t${svg`<path d=\"${path}\"/>`}\n\t\t\t\t\t</svg>`\n\t\t\t\t: nothing}\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-icon': SchmancyIcon\n\t}\n}\n"],"mappings":"uKA0Be,IAAA,EAAA,cAA2B,EAAA,CAAA,CAAA,YAAA,GAAA,EAAA,CAAA,MAAA,GAAA,CAAA,EAAA,KAAA,KAqBjB,EAAA,CAAA,OAAA,KAAA,OApBR,CAAC,EAAA,GAAG;;;;;;;;;;;;;;;;;;IAwBpB,mBAAA,CACC,MAAM,kBAAA,EACN,KAAK,KAAO,KAAK,aAAa,KAAA,GAAU,GACxC,KAAK,SAAW,IAAI,qBAAA,CACnB,KAAK,KAAO,KAAK,aAAa,KAAA,GAAU,EAAA,CAAA,EAEzC,KAAK,SAAS,QAAQ,KAAM,CAAE,UAAA,CAAW,EAAM,cAAA,CAAe,EAAM,QAAA,CAAS,CAAA,CAAA,EAC7E,KAAK,aAAa,cAAe,MAAA,EACjC,KAAK,aAAa,YAAa,IAAA,CAChC,CAEA,sBAAA,CACC,MAAM,qBAAA,EACN,KAAK,UAAU,WAAA,CAChB,CAEA,QAAA,CAEC,IAAM,EAAO,OAAO,YAAY,KAAK,MACrC,MAAO,GAAA,IAAI;;KAER,EACC,EAAA,IAAI;QACF,EAAA,GAAG,YAAY,EAAA,KAAA;aAEjB,EAAA,QAAA;GAEL,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,CAAA,EA/BO,EAAA,UAAA,OAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,eAtBO,eAAA,CAAA,EAAe,CAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { t as e, u as t } from "./SchmancyElement-
|
|
2
|
-
import "./mixins-
|
|
1
|
+
import { t as e, u as t } from "./SchmancyElement-OG71FtNv.js";
|
|
2
|
+
import "./mixins-bCEXbwJV.js";
|
|
3
3
|
import { customElement as n, state as r } from "lit/decorators.js";
|
|
4
4
|
import { css as i, html as a, nothing as o, svg as s } from "lit";
|
|
5
5
|
var c = class extends e {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icons-
|
|
1
|
+
{"version":3,"file":"icons-Dup5skuk.js","names":[],"sources":["../src/icons/icon.ts"],"sourcesContent":["import { SchmancyElement } from '@mixins/index'\nimport { css, html, nothing, svg } from 'lit'\nimport { customElement, state } from 'lit/decorators.js'\n\ndeclare global {\n interface Window {\n // eslint-disable-next-line no-underscore-dangle -- public runtime contract: global populated by the external schmancy-icons Vite plugin; renaming breaks consumers\n __siIcons?: Record<string, string>\n }\n}\n\n/**\n * @element schmancy-icon\n * Renders a Material Symbol inline as SVG — path data comes from\n * window.__siIcons populated by the schmancy-icons Vite plugin.\n *\n * Size: set font-size on the host via Tailwind (e.g. class=\"text-2xl\").\n * Color: inherits currentColor.\n * Active fill: use the \"-fill\" variant name: \"home-fill\".\n *\n * Usage:\n * <schmancy-icon>home</schmancy-icon>\n * <schmancy-icon class=\"text-lg text-primary-default\">delete</schmancy-icon>\n * <schmancy-icon>${active ? 'home-fill' : 'home'}</schmancy-icon>\n */\n@customElement('schmancy-icon')\nexport default class SchmancyIcon extends SchmancyElement {\n\tstatic styles = [css`\n\t\t:host {\n\t\t\tdisplay: inline-flex;\n\t\t\tplace-items: center;\n\t\t\tplace-content: center;\n\t\t\tfont-size: 24px;\n\t\t\twidth: 1em;\n\t\t\theight: 1em;\n\t\t\tflex-shrink: 0;\n\t\t\tcolor: inherit;\n\t\t}\n\n\t\tsvg {\n\t\t\twidth: 100%;\n\t\t\theight: 100%;\n\t\t\tfill: currentColor;\n\t\t\toverflow: visible;\n\t\t}\n\t`]\n\n\t@state() private name = ''\n\n\tprivate observer?: MutationObserver\n\n\toverride connectedCallback(): void {\n\t\tsuper.connectedCallback()\n\t\tthis.name = this.textContent?.trim() ?? ''\n\t\tthis.observer = new MutationObserver(() => {\n\t\t\tthis.name = this.textContent?.trim() ?? ''\n\t\t})\n\t\tthis.observer.observe(this, { childList: true, characterData: true, subtree: true })\n\t\tthis.setAttribute('aria-hidden', 'true')\n\t\tthis.setAttribute('translate', 'no')\n\t}\n\n\toverride disconnectedCallback(): void {\n\t\tsuper.disconnectedCallback()\n\t\tthis.observer?.disconnect()\n\t}\n\n\tprotected override render(): unknown {\n\t\t// eslint-disable-next-line no-underscore-dangle -- public runtime contract: see Window.__siIcons declaration above\n\t\tconst path = window.__siIcons?.[this.name]\n\t\treturn html`\n\t\t\t<slot style=\"display:none\"></slot>\n\t\t\t${path\n\t\t\t\t? html`<svg viewBox=\"0 -960 960 960\" xmlns=\"http://www.w3.org/2000/svg\">\n\t\t\t\t\t\t${svg`<path d=\"${path}\"/>`}\n\t\t\t\t\t</svg>`\n\t\t\t\t: nothing}\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-icon': SchmancyIcon\n\t}\n}\n"],"mappings":";;;;AA0Be,IAAA,IAAA,cAA2B,EAAA;CAAA,YAAA,GAAA,GAAA;EAAA,MAAA,GAAA,CAAA,GAAA,KAAA,OAqBjB;CAAA;CAAA;EAAA,KAAA,SApBR,CAAC,CAAG;;;;;;;;;;;;;;;;;;;;CAwBpB,oBAAA;EACC,MAAM,kBAAA,GACN,KAAK,OAAO,KAAK,aAAa,KAAA,KAAU,IACxC,KAAK,WAAW,IAAI,uBAAA;GACnB,KAAK,OAAO,KAAK,aAAa,KAAA,KAAU;EAAA,CAAA,GAEzC,KAAK,SAAS,QAAQ,MAAM;GAAE,WAAA,CAAW;GAAM,eAAA,CAAe;GAAM,SAAA,CAAS;EAAA,CAAA,GAC7E,KAAK,aAAa,eAAe,MAAA,GACjC,KAAK,aAAa,aAAa,IAAA;CAChC;CAEA,uBAAA;EACC,MAAM,qBAAA,GACN,KAAK,UAAU,WAAA;CAChB;CAEA,SAAA;EAEC,IAAM,IAAO,OAAO,YAAY,KAAK;EACrC,OAAO,CAAI;;KAER,IACC,CAAI;QACF,CAAG,YAAY,EAAA,KAAA;eAEjB,EAAA;;CAEL;AAAA;AAAA,EAAA,CA/BC,EAAA,CAAA,GAAM,EAAA,WAAA,QAAA,KAAA,CAAA,GAAA,IAAA,EAAA,CAtBP,EAAc,eAAA,CAAA,GAAe,CAAA"}
|
package/dist/icons.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
require(`./icons-
|
|
1
|
+
require(`./icons-BZeCloP9.cjs`);
|
package/dist/icons.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import "./icons-
|
|
1
|
+
import "./icons-Dup5skuk.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
require(`./chunk-CncqDLb2.cjs`);const e=require(`./SchmancyElement-
|
|
1
|
+
require(`./chunk-CncqDLb2.cjs`);const e=require(`./SchmancyElement-PS1u0j1B.cjs`);require(`./mixins-BoMURWag.cjs`);let t=require(`lit/decorators.js`),n=require(`lit`),r=require(`lit/directives/ref.js`);var i=class extends e.t{constructor(...e){super(...e),this.html=``,this.css=``,this.baseCss=`html,body{margin:0;padding:0;overflow:hidden;background:#fff;color:#1a1a1a;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Arial,sans-serif;font-size:14px;line-height:1.6;word-wrap:break-word;overflow-wrap:break-word}
|
|
2
2
|
body{padding:16px}
|
|
3
3
|
p{margin:0 0 1em}p:last-child{margin-bottom:0}
|
|
4
4
|
ul,ol{margin:0 0 1em;padding-left:1.5em}li{margin-bottom:.25em}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iframe-
|
|
1
|
+
{"version":3,"file":"iframe-CDJjnNmo.cjs","names":[],"sources":["../src/iframe/iframe.ts"],"sourcesContent":["import { SchmancyElement } from '@mixins/index'\nimport { css, html, PropertyValues } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { createRef, ref } from 'lit/directives/ref.js'\n\n/** Sensible document reset for iframe content — font, spacing, word-wrap */\nconst DEFAULT_BASE_CSS = `html,body{margin:0;padding:0;overflow:hidden;background:#fff;color:#1a1a1a;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Arial,sans-serif;font-size:14px;line-height:1.6;word-wrap:break-word;overflow-wrap:break-word}\nbody{padding:16px}\np{margin:0 0 1em}p:last-child{margin-bottom:0}\nul,ol{margin:0 0 1em;padding-left:1.5em}li{margin-bottom:.25em}\nh1,h2,h3,h4{margin:0 0 .5em;line-height:1.3}h1{font-size:1.5em}h2{font-size:1.25em}h3{font-size:1.1em}h4{font-size:1em}\nhr{border:none;border-top:1px solid #dadce0;margin:1em 0}\nimg{max-width:100%;height:auto}\ntable{border-collapse:collapse;max-width:100%}td,th{padding:4px 8px;border:1px solid #dadce0}\nblockquote{margin:0 0 1em;padding:.5em 0 .5em 1em;border-left:3px solid #dadce0;color:#5f6368}\npre{background:#f5f5f5;padding:.75em;border-radius:4px;overflow-x:auto;font-size:.9em}\ncode{background:#f5f5f5;padding:.1em .3em;border-radius:3px;font-size:.9em}`\n\n/**\n * Renders an HTML fragment inside a sandboxed, auto-sizing iframe.\n *\n * @slot - (none)\n * @fires load — native iframe load event\n *\n * @example\n * ```html\n * <schmancy-iframe .html=${bodyHtml} .css=${extraStyles}></schmancy-iframe>\n * ```\n */\n@customElement('schmancy-iframe')\nexport default class SchmancyIframe extends SchmancyElement {\n\tstatic styles = [css`\n\t:host {\n\t\tdisplay: block;\n\t}\n\tiframe {\n\t\tborder: 0;\n\t\twidth: 100%;\n\t}\n`];\n\t/** HTML body fragment to render inside the iframe */\n\t@property({ type: String }) html = ''\n\n\t/** Additional CSS injected after the base styles (consumer-specific) */\n\t@property({ type: String }) css = ''\n\n\t/** Base document CSS (font, spacing, resets). Override for fully custom styling */\n\t@property({ type: String }) baseCss = DEFAULT_BASE_CSS\n\n\t/** iframe sandbox attribute */\n\t@property({ type: String }) sandbox = 'allow-same-origin allow-popups'\n\n\t/** Minimum height in pixels */\n\t@property({ type: Number }) minHeight = 60\n\n\t@state() private height = 60\n\tprivate srcdoc = ''\n\tprivate iframeRef = createRef<HTMLIFrameElement>()\n\n\tprotected willUpdate(changed: PropertyValues) {\n\t\tif (changed.has('html') || changed.has('css') || changed.has('baseCss')) {\n\t\t\tthis.srcdoc = this.html ? this.buildSrcdoc() : ''\n\t\t\tthis.height = this.minHeight\n\t\t}\n\t}\n\n\tprotected updated(changed: PropertyValues) {\n\t\tif (changed.has('sandbox')) {\n\t\t\tthis.iframeRef.value?.setAttribute('sandbox', this.sandbox)\n\t\t}\n\t}\n\n\tprivate buildSrcdoc(): string {\n\t\tconst styles = this.css ? `${this.baseCss}\\n${this.css}` : this.baseCss\n\t\treturn `<!DOCTYPE html><html><head>\n<meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n<base target=\"_blank\">\n<style>${styles}</style></head><body>${this.html}</body></html>`\n\t}\n\n\tprivate onLoad(e: Event) {\n\t\tconst iframe = e.target as HTMLIFrameElement\n\t\ttry {\n\t\t\tconst doc = iframe.contentDocument\n\t\t\tif (!doc) return\n\t\t\tthis.height = Math.max(doc.documentElement.scrollHeight, this.minHeight)\n\t\t} catch {\n\t\t\tthis.height = Math.max(200, this.minHeight)\n\t\t}\n\t}\n\n\tprotected render() {\n\t\tif (!this.html) return html``\n\t\treturn html`<iframe\n\t\t\t${ref(this.iframeRef)}\n\t\t\t.srcdoc=${this.srcdoc}\n\t\t\tstyle=\"height:${this.height}px;min-height:${this.minHeight}px;overflow:hidden\"\n\t\t\t@load=${this.onLoad}\n\t\t></iframe>`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-iframe': SchmancyIframe\n\t}\n}\n"],"mappings":"0MAMA,IAwBe,EAAA,cAA6B,EAAA,CAAA,CAAA,YAAA,GAAA,EAAA,CAAA,MAAA,GAAA,CAAA,EAAA,KAAA,KAWR,GAAA,KAAA,IAGD,GAAA,KAAA,QAtCV;;;;;;;;;;6EAAA,KAAA,QA4Cc,iCAAA,KAAA,UAGE,GAAA,KAAA,OAEd,GAAA,KAAA,OACT,GAAA,KAAA,WAAA,EAAA,EAAA,WAAA,CAAA,CAAA,OAAA,KAAA,OAzBD,CAAC,EAAA,GAAG;;;;;;;;GA4BpB,WAAqB,EAAA,EAChB,EAAQ,IAAI,MAAA,GAAW,EAAQ,IAAI,KAAA,GAAU,EAAQ,IAAI,SAAA,KAC5D,KAAK,OAAS,KAAK,KAAO,KAAK,YAAA,EAAgB,GAC/C,KAAK,OAAS,KAAK,UAErB,CAEA,QAAkB,EAAA,CACb,EAAQ,IAAI,SAAA,GACf,KAAK,UAAU,OAAO,aAAa,UAAW,KAAK,OAAA,CAErD,CAEA,aAAA,CAEC,MAAO,0JADQ,KAAK,IAAM,GAAG,KAAK,QAAA,IAAY,KAAK,MAAQ,KAAK,QAAA,uBAI3B,KAAK,KAAA,eAC3C,CAEA,OAAe,EAAA,CACd,IAAM,EAAS,EAAE,OACjB,GAAA,CACC,IAAM,EAAM,EAAO,gBACnB,GAAA,CAAK,EAAK,OACV,KAAK,OAAS,KAAK,IAAI,EAAI,gBAAgB,aAAc,KAAK,SAAA,CAC/D,MAAA,CACC,KAAK,OAAS,KAAK,IAAI,IAAK,KAAK,SAAA,CAClC,CACD,CAEA,QAAA,CACC,OAAK,KAAK,KACH,EAAA,IAAI;eACJ,KAAK,SAAA,EAAA;aACD,KAAK,OAAA;mBACC,KAAK,OAAA,gBAAuB,KAAK,UAAA;WACzC,KAAK,OAAA;cALS,EAAA,IAAI,EAO5B,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UA1DU,CAAE,KAAM,MAAA,CAAA,CAAA,EAAQ,EAAA,UAAA,OAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAGhB,CAAE,KAAM,MAAA,CAAA,CAAA,EAAQ,EAAA,UAAA,MAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAGhB,CAAE,KAAM,MAAA,CAAA,CAAA,EAAQ,EAAA,UAAA,UAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAGhB,CAAE,KAAM,MAAA,CAAA,CAAA,EAAQ,EAAA,UAAA,UAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAGhB,CAAE,KAAM,MAAA,CAAA,CAAA,EAAQ,EAAA,UAAA,YAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,CAAA,EAEnB,EAAA,UAAA,SAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,eA1BO,iBAAA,CAAA,EAAiB,CAAA,EAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,CAAA,CAAA,CAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { t as e, u as t } from "./SchmancyElement-
|
|
2
|
-
import "./mixins-
|
|
1
|
+
import { t as e, u as t } from "./SchmancyElement-OG71FtNv.js";
|
|
2
|
+
import "./mixins-bCEXbwJV.js";
|
|
3
3
|
import { customElement as n, property as r, state as i } from "lit/decorators.js";
|
|
4
4
|
import { css as a, html as o } from "lit";
|
|
5
5
|
import { createRef as s, ref as c } from "lit/directives/ref.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iframe-
|
|
1
|
+
{"version":3,"file":"iframe-Xc3EPMZT.js","names":[],"sources":["../src/iframe/iframe.ts"],"sourcesContent":["import { SchmancyElement } from '@mixins/index'\nimport { css, html, PropertyValues } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { createRef, ref } from 'lit/directives/ref.js'\n\n/** Sensible document reset for iframe content — font, spacing, word-wrap */\nconst DEFAULT_BASE_CSS = `html,body{margin:0;padding:0;overflow:hidden;background:#fff;color:#1a1a1a;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Arial,sans-serif;font-size:14px;line-height:1.6;word-wrap:break-word;overflow-wrap:break-word}\nbody{padding:16px}\np{margin:0 0 1em}p:last-child{margin-bottom:0}\nul,ol{margin:0 0 1em;padding-left:1.5em}li{margin-bottom:.25em}\nh1,h2,h3,h4{margin:0 0 .5em;line-height:1.3}h1{font-size:1.5em}h2{font-size:1.25em}h3{font-size:1.1em}h4{font-size:1em}\nhr{border:none;border-top:1px solid #dadce0;margin:1em 0}\nimg{max-width:100%;height:auto}\ntable{border-collapse:collapse;max-width:100%}td,th{padding:4px 8px;border:1px solid #dadce0}\nblockquote{margin:0 0 1em;padding:.5em 0 .5em 1em;border-left:3px solid #dadce0;color:#5f6368}\npre{background:#f5f5f5;padding:.75em;border-radius:4px;overflow-x:auto;font-size:.9em}\ncode{background:#f5f5f5;padding:.1em .3em;border-radius:3px;font-size:.9em}`\n\n/**\n * Renders an HTML fragment inside a sandboxed, auto-sizing iframe.\n *\n * @slot - (none)\n * @fires load — native iframe load event\n *\n * @example\n * ```html\n * <schmancy-iframe .html=${bodyHtml} .css=${extraStyles}></schmancy-iframe>\n * ```\n */\n@customElement('schmancy-iframe')\nexport default class SchmancyIframe extends SchmancyElement {\n\tstatic styles = [css`\n\t:host {\n\t\tdisplay: block;\n\t}\n\tiframe {\n\t\tborder: 0;\n\t\twidth: 100%;\n\t}\n`];\n\t/** HTML body fragment to render inside the iframe */\n\t@property({ type: String }) html = ''\n\n\t/** Additional CSS injected after the base styles (consumer-specific) */\n\t@property({ type: String }) css = ''\n\n\t/** Base document CSS (font, spacing, resets). Override for fully custom styling */\n\t@property({ type: String }) baseCss = DEFAULT_BASE_CSS\n\n\t/** iframe sandbox attribute */\n\t@property({ type: String }) sandbox = 'allow-same-origin allow-popups'\n\n\t/** Minimum height in pixels */\n\t@property({ type: Number }) minHeight = 60\n\n\t@state() private height = 60\n\tprivate srcdoc = ''\n\tprivate iframeRef = createRef<HTMLIFrameElement>()\n\n\tprotected willUpdate(changed: PropertyValues) {\n\t\tif (changed.has('html') || changed.has('css') || changed.has('baseCss')) {\n\t\t\tthis.srcdoc = this.html ? this.buildSrcdoc() : ''\n\t\t\tthis.height = this.minHeight\n\t\t}\n\t}\n\n\tprotected updated(changed: PropertyValues) {\n\t\tif (changed.has('sandbox')) {\n\t\t\tthis.iframeRef.value?.setAttribute('sandbox', this.sandbox)\n\t\t}\n\t}\n\n\tprivate buildSrcdoc(): string {\n\t\tconst styles = this.css ? `${this.baseCss}\\n${this.css}` : this.baseCss\n\t\treturn `<!DOCTYPE html><html><head>\n<meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n<base target=\"_blank\">\n<style>${styles}</style></head><body>${this.html}</body></html>`\n\t}\n\n\tprivate onLoad(e: Event) {\n\t\tconst iframe = e.target as HTMLIFrameElement\n\t\ttry {\n\t\t\tconst doc = iframe.contentDocument\n\t\t\tif (!doc) return\n\t\t\tthis.height = Math.max(doc.documentElement.scrollHeight, this.minHeight)\n\t\t} catch {\n\t\t\tthis.height = Math.max(200, this.minHeight)\n\t\t}\n\t}\n\n\tprotected render() {\n\t\tif (!this.html) return html``\n\t\treturn html`<iframe\n\t\t\t${ref(this.iframeRef)}\n\t\t\t.srcdoc=${this.srcdoc}\n\t\t\tstyle=\"height:${this.height}px;min-height:${this.minHeight}px;overflow:hidden\"\n\t\t\t@load=${this.onLoad}\n\t\t></iframe>`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-iframe': SchmancyIframe\n\t}\n}\n"],"mappings":";;;;;AAMA,IAwBe,IAAA,cAA6B,EAAA;CAAA,YAAA,GAAA,GAAA;EAAA,MAAA,GAAA,CAAA,GAAA,KAAA,OAWR,IAAA,KAAA,MAGD,IAAA,KAAA,UAtCV,27BAAA,KAAA,UA4Cc,kCAAA,KAAA,YAGE,IAAA,KAAA,SAEd,IAAA,KAAA,SACT,IAAA,KAAA,YACG,EAAA;CAAA;CAAA;EAAA,KAAA,SA1BJ,CAAC,CAAG;;;;;;;;;;CA4BpB,WAAqB,GAAA;EAAA,CAChB,EAAQ,IAAI,MAAA,KAAW,EAAQ,IAAI,KAAA,KAAU,EAAQ,IAAI,SAAA,OAC5D,KAAK,SAAS,KAAK,OAAO,KAAK,YAAA,IAAgB,IAC/C,KAAK,SAAS,KAAK;CAErB;CAEA,QAAkB,GAAA;EACb,EAAQ,IAAI,SAAA,KACf,KAAK,UAAU,OAAO,aAAa,WAAW,KAAK,OAAA;CAErD;CAEA,cAAA;EAEC,OAAO,0JADQ,KAAK,MAAM,GAAG,KAAK,QAAA,IAAY,KAAK,QAAQ,KAAK,QAAA,uBAI3B,KAAK,KAAA;CAC3C;CAEA,OAAe,GAAA;EACd,IAAM,IAAS,EAAE;EACjB,IAAA;GACC,IAAM,IAAM,EAAO;GACnB,IAAA,CAAK,GAAK;GACV,KAAK,SAAS,KAAK,IAAI,EAAI,gBAAgB,cAAc,KAAK,SAAA;EAC/D,QAAA;GACC,KAAK,SAAS,KAAK,IAAI,KAAK,KAAK,SAAA;EAClC;CACD;CAEA,SAAA;EACC,OAAK,KAAK,OACH,CAAI;KACR,EAAI,KAAK,SAAA,EAAA;aACD,KAAK,OAAA;mBACC,KAAK,OAAA,gBAAuB,KAAK,UAAA;WACzC,KAAK,OAAA;gBALS,CAAI;CAO5B;AAAA;AAAA,EAAA,CA1DC,EAAS,EAAE,MAAM,OAAA,CAAA,CAAA,GAAQ,EAAA,WAAA,QAAA,KAAA,CAAA,GAAA,EAAA,CAGzB,EAAS,EAAE,MAAM,OAAA,CAAA,CAAA,GAAQ,EAAA,WAAA,OAAA,KAAA,CAAA,GAAA,EAAA,CAGzB,EAAS,EAAE,MAAM,OAAA,CAAA,CAAA,GAAQ,EAAA,WAAA,WAAA,KAAA,CAAA,GAAA,EAAA,CAGzB,EAAS,EAAE,MAAM,OAAA,CAAA,CAAA,GAAQ,EAAA,WAAA,WAAA,KAAA,CAAA,GAAA,EAAA,CAGzB,EAAS,EAAE,MAAM,OAAA,CAAA,CAAA,GAAQ,EAAA,WAAA,aAAA,KAAA,CAAA,GAAA,EAAA,CAEzB,EAAA,CAAA,GAAM,EAAA,WAAA,UAAA,KAAA,CAAA;AAAA,IAAA,IAAA,IAAA,EAAA,CA1BP,EAAc,iBAAA,CAAA,GAAiB,CAAA;AAAA,SAAA,KAAA"}
|
package/dist/iframe.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./iframe-
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./iframe-CDJjnNmo.cjs`);exports.SchmancyIframe=e.t;
|
package/dist/iframe.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as e } from "./iframe-
|
|
1
|
+
import { t as e } from "./iframe-Xc3EPMZT.js";
|
|
2
2
|
export { e as SchmancyIframe };
|
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`./chunk-CncqDLb2.cjs`);const e=require(`./SchmancyElement-C41uPa6l.cjs`),t=require(`./area-2FrTZI_T.cjs`),n=require(`./lazy-C-7a4FAe.cjs`),r=require(`./state-BxDNox-2.cjs`),i=require(`./sound.service-D2GGaBXc.cjs`),a=require(`./audio-EaD0Ggfh.cjs`),o=require(`./search-DPKoC-dT.cjs`),s=require(`./input-chip-ChAgRCXZ.cjs`),c=require(`./animation-CCOIW4wJ.cjs`),l=require(`./directives-BZIRQDBq.cjs`),ee=require(`./reduced-motion-Ds-HjMzn.cjs`),u=require(`./cursor-glow-Bulq-38P.cjs`),d=require(`./theme.service-B15FdjOS.cjs`),f=require(`./layout-DZ4dpLh9.cjs`),te=require(`./overlay-stack-Bdr9lOqi.cjs`),ne=require(`./gravity-6pL6CfIr.cjs`),p=require(`./discovery.service-CIa3Eeuk.cjs`),m=require(`./magnetic-DKtc4umC.cjs`),h=require(`./src-SAXA4LEH.cjs`),g=require(`./overlay.service-Dbu5uP9E.cjs`),_=require(`./boat-BJPl_Jti.cjs`),re=require(`./button-B9RfBt-n.cjs`),ie=require(`./button.cjs`),ae=require(`./checkbox-C4zeib84.cjs`),v=require(`./chips-wfJ7YtWv.cjs`),y=require(`./connectivity.cjs`),b=require(`./date-range-BHSzlwSL.cjs`),x=require(`./date-range-inline-D0I6k84h.cjs`),S=require(`./delay.cjs`),oe=require(`./details-DQNj2oaU.cjs`),C=require(`./dropdown.cjs`),w=require(`./surface-CWwYD_z2.cjs`),T=require(`./expand-CUF163mg.cjs`),se=require(`./fab.cjs`),E=require(`./window-BbBYjm7R.cjs`),D=require(`./float-OvqX0nqG.cjs`),O=require(`./form-4GKROq2P.cjs`),k=require(`./input-Z-3N5JMv.cjs`),A=require(`./radio-group-BEtvCSS1.cjs`),j=require(`./range.cjs`),M=require(`./theme.interface-CSt7JUBD.cjs`),N=require(`./select-LWdPs7b_.cjs`),P=require(`./switch.cjs`),F=require(`./form.cjs`),I=require(`./iframe-DpCv-QH2.cjs`),L=require(`./notification-B6yDL91t.cjs`),R=require(`./json.cjs`),z=require(`./layout.cjs`),B=require(`./lightbox-Dpwsn8Qr.cjs`),V=require(`./list-BhM-6dAi.cjs`),H=require(`./navigation-rail.cjs`),U=require(`./overlay-N0trD-4u.cjs`),W=require(`./typography-D4Fo1UGh.cjs`),G=require(`./overlay.confirm-body-CtXIi421.cjs`),K=require(`./rxjs-utils-Csnks202.cjs`),q=require(`./slider.cjs`),J=require(`./steps.cjs`),Y=require(`./table.cjs`),X=require(`./theme-BMbXoqi0.cjs`),ce=require(`./tooltip.cjs`),le=require(`./tree.cjs`),ue=require(`./types.cjs`),de=require(`./typewriter.cjs`),Z=require(`./utils-DTa3QHxk.cjs`),fe=require(`./avatar.cjs`),Q=require(`./breadcrumb.cjs`),pe=require(`./kbd.cjs`),me=require(`./skeleton.cjs`),he=require(`./visually-hidden.cjs`);let $=require(`@lit-labs/signals`);exports.$drawer=h.p,exports.$notify=L.r,exports.$sounds=a.t,exports.ANIMATION_CSS_VARS=c.t,exports.BLACKBIRD_EASING=c.n,exports.DISCOVER_EVENT=p.t,exports.DISCOVER_RESPONSE_EVENT=p.n,exports.DURATION_BACKDROP=c.r,exports.DURATION_ENTER=c.i,exports.DURATION_EXIT=c.a,exports.DragDirective=l.h,exports.DropDirective=l.g,exports.EASE_IN=c.o,exports.EASE_OUT=c.s,exports.EmotionalSoundGenerator=a.n,exports.FINDING_MORTIES=t.b,exports.GRID_ANIMATION_CSS=c.c,exports.HERE_RICKY=t.x,exports.HISTORY_STRATEGY=t.v,exports.HereMorty=h.n,Object.defineProperty(exports,`List`,{enumerable:!0,get:function(){return V.t}}),exports.Numbers=Z.t,Object.defineProperty(exports,`RadioButton`,{enumerable:!0,get:function(){return A.t}}),Object.defineProperty(exports,`RadioGroup`,{enumerable:!0,get:function(){return A.n}}),exports.SCHMANCY_EXPAND_REQUEST_CLOSE=T.t,exports.SPRING_BOUNCY=c.l,exports.SPRING_GENTLE=c.u,exports.SPRING_SMOOTH=c.d,exports.SPRING_SNAPPY=c.f,Object.defineProperty(exports,`ScBadgeV2`,{enumerable:!0,get:function(){return h.w}}),Object.defineProperty(exports,`SchmancyArea`,{enumerable:!0,get:function(){return t._}}),Object.defineProperty(exports,`SchmancyAssistChip`,{enumerable:!0,get:function(){return v.r}}),Object.defineProperty(exports,`SchmancyAvatar`,{enumerable:!0,get:function(){return fe.SchmancyAvatar}}),Object.defineProperty(exports,`SchmancyBadgeV2`,{enumerable:!0,get:function(){return h.T}}),exports.SchmancyBoat=_.t,Object.defineProperty(exports,`SchmancyBreadcrumb`,{enumerable:!0,get:function(){return Q.SchmancyBreadcrumb}}),Object.defineProperty(exports,`SchmancyBreadcrumbItem`,{enumerable:!0,get:function(){return Q.SchmancyBreadcrumbItem}}),Object.defineProperty(exports,`SchmancyButton`,{enumerable:!0,get:function(){return re.t}}),Object.defineProperty(exports,`SchmancyCheckbox`,{enumerable:!0,get:function(){return ae.t}}),exports.SchmancyChip=v.n,exports.SchmancyFilterChip=v.n,Object.defineProperty(exports,`SchmancyConnectivityStatus`,{enumerable:!0,get:function(){return y.SchmancyConnectivityStatus}}),Object.defineProperty(exports,`SchmancyContentDrawer`,{enumerable:!0,get:function(){return h._}}),exports.SchmancyContentDrawerID=h.v,Object.defineProperty(exports,`SchmancyContentDrawerMain`,{enumerable:!0,get:function(){return h.g}}),exports.SchmancyContentDrawerMaxHeight=h.y,exports.SchmancyContentDrawerMinWidth=h.b,Object.defineProperty(exports,`SchmancyContentDrawerSheet`,{enumerable:!0,get:function(){return h.h}}),exports.SchmancyContentDrawerSheetMode=h.x,exports.SchmancyContentDrawerSheetState=h.S,exports.SchmancyContext=r.s,Object.defineProperty(exports,`SchmancyDataTable`,{enumerable:!0,get:function(){return Y.SchmancyDataTable}}),Object.defineProperty(exports,`SchmancyDateRange`,{enumerable:!0,get:function(){return b.t}}),exports.SchmancyDateRangeInline=x.t,Object.defineProperty(exports,`SchmancyDelay`,{enumerable:!0,get:function(){return S.SchmancyDelay}}),exports.SchmancyDetails=oe.t,Object.defineProperty(exports,`SchmancyDrawerAppbar`,{enumerable:!0,get:function(){return h.f}}),exports.SchmancyDrawerNavbarMode=h.l,exports.SchmancyDrawerNavbarState=h.u,Object.defineProperty(exports,`SchmancyDropdown`,{enumerable:!0,get:function(){return C.SchmancyDropdown}}),Object.defineProperty(exports,`SchmancyDropdownContent`,{enumerable:!0,get:function(){return C.SchmancyDropdownContent}}),exports.SchmancyEvents=ue.SchmancyEvents,Object.defineProperty(exports,`SchmancyExpandRoot`,{enumerable:!0,get:function(){return T.n}}),Object.defineProperty(exports,`SchmancyFab`,{enumerable:!0,get:function(){return se.SchmancyFab}}),exports.SchmancyFloat=D.t,exports.SchmancyForm=O.t,Object.defineProperty(exports,`SchmancyFormSummary`,{enumerable:!0,get:function(){return F.SchmancyFormSummary}}),exports.SchmancyGenerateMoodAudioEvent=X.n,exports.SchmancyIframe=I.t,exports.SchmancyInput=k.n,Object.defineProperty(exports,`SchmancyInputChip`,{enumerable:!0,get:function(){return s.t}}),Object.defineProperty(exports,`SchmancyInputCompat`,{enumerable:!0,get:function(){return k.t}}),Object.defineProperty(exports,`SchmancyJson`,{enumerable:!0,get:function(){return R.SchmancyJson}}),Object.defineProperty(exports,`SchmancyKbd`,{enumerable:!0,get:function(){return pe.SchmancyKbd}}),Object.defineProperty(exports,`SchmancyLightbox`,{enumerable:!0,get:function(){return B.i}}),Object.defineProperty(exports,`SchmancyListItem`,{enumerable:!0,get:function(){return V.n}}),exports.SchmancyListTypeContext=V.r,Object.defineProperty(exports,`SchmancyNavigationBar`,{enumerable:!0,get:function(){return h.a}}),Object.defineProperty(exports,`SchmancyNavigationBarItem`,{enumerable:!0,get:function(){return h.o}}),Object.defineProperty(exports,`SchmancyNavigationDrawer`,{enumerable:!0,get:function(){return h.c}}),Object.defineProperty(exports,`SchmancyNavigationDrawerContent`,{enumerable:!0,get:function(){return h.d}}),Object.defineProperty(exports,`SchmancyNavigationDrawerSidebar`,{enumerable:!0,get:function(){return h.s}}),Object.defineProperty(exports,`SchmancyNavigationRail`,{enumerable:!0,get:function(){return H.SchmancyNavigationRail}}),Object.defineProperty(exports,`SchmancyNavigationRailItem`,{enumerable:!0,get:function(){return H.SchmancyNavigationRailItem}}),exports.SchmancyNotification=L.i,Object.defineProperty(exports,`SchmancyOverlay`,{enumerable:!0,get:function(){return U.t}}),Object.defineProperty(exports,`SchmancyOverlayPromptBody`,{enumerable:!0,get:function(){return G.t}}),Object.defineProperty(exports,`SchmancyRange`,{enumerable:!0,get:function(){return j.SchmancyRange}}),Object.defineProperty(exports,`SchmancyRoute`,{enumerable:!0,get:function(){return t.y}}),Object.defineProperty(exports,`SchmancyScroll`,{enumerable:!0,get:function(){return z.SchmancyScroll}}),Object.defineProperty(exports,`SchmancySelect`,{enumerable:!0,get:function(){return N.t}}),Object.defineProperty(exports,`SchmancySkeleton`,{enumerable:!0,get:function(){return me.SchmancySkeleton}}),Object.defineProperty(exports,`SchmancySlide`,{enumerable:!0,get:function(){return q.SchmancySlide}}),Object.defineProperty(exports,`SchmancySlider`,{enumerable:!0,get:function(){return q.SchmancySlider}}),Object.defineProperty(exports,`SchmancyStep`,{enumerable:!0,get:function(){return J.SchmancyStep}}),Object.defineProperty(exports,`SchmancySteps`,{enumerable:!0,get:function(){return J.SchmancySteps}}),Object.defineProperty(exports,`SchmancySuggestionChip`,{enumerable:!0,get:function(){return v.t}}),Object.defineProperty(exports,`SchmancySurface`,{enumerable:!0,get:function(){return w.t}}),exports.SchmancySurfaceTypeContext=w.n,Object.defineProperty(exports,`SchmancySwitch`,{enumerable:!0,get:function(){return P.SchmancySwitch}}),Object.defineProperty(exports,`SchmancyTableRow`,{enumerable:!0,get:function(){return Y.SchmancyTableRow}}),Object.defineProperty(exports,`SchmancyTeleportation`,{enumerable:!0,get:function(){return h.t}}),exports.SchmancyTheme=M.t,Object.defineProperty(exports,`SchmancyThemeAudioPlayer`,{enumerable:!0,get:function(){return X.r}}),Object.defineProperty(exports,`SchmancyThemeComponent`,{enumerable:!0,get:function(){return X.a}}),Object.defineProperty(exports,`SchmancyThemeController`,{enumerable:!0,get:function(){return X.i}}),Object.defineProperty(exports,`SchmancyThemeControllerBoat`,{enumerable:!0,get:function(){return X.t}}),Object.defineProperty(exports,`SchmancyTree`,{enumerable:!0,get:function(){return le.SchmancyTree}}),Object.defineProperty(exports,`SchmancyTypography`,{enumerable:!0,get:function(){return W.t}}),Object.defineProperty(exports,`SchmancyVisuallyHidden`,{enumerable:!0,get:function(){return he.SchmancyVisuallyHidden}}),exports.SchmancyWindow=E.t,Object.defineProperty(exports,`SchmnacyIconButton`,{enumerable:!0,get:function(){return ie.SchmnacyIconButton}}),Object.defineProperty(exports,`Signal`,{enumerable:!0,get:function(){return $.Signal}}),exports.StepsController=J.StepsController,exports.ThemeHereIAm=d.r,exports.ThemeWhereAreYou=d.i,exports.WhereAreYouRicky=h.r,exports._activeHost=e.r,exports.aiBadge=l.O,exports.animateText=l.k,exports.area=t.S,exports.art=l.D,exports.beta=l.C,exports.bindState=r.t,exports.buildQueryString=t.t,exports.color=l.S,exports.compareActiveRoutes=t.n,exports.compareCustomElementConstructors=t.r,exports.compareRouteActions=t.i,Object.defineProperty(exports,`computed`,{enumerable:!0,get:function(){return $.computed}}),exports.confirm=g.t,exports.confirmClick=l.x,exports.createAnimation=c.p,exports.createDarkTonalPaletteFromBaseColor=X.s,exports.createDismissAnimation=c.m,exports.createLightTonalPaletteFromBaseColor=X.c,exports.createRevealAnimation=c.h,exports.createRouteCacheKey=t.a,exports.createScaleAnimation=c.g,exports.cursorGlow=u.t,exports.cycleText=l.b,exports.debounce=t.o,exports.decodeData=t.h,exports.decodeRouteState=t.s,exports.deepMerge=t.c,exports.delayContext=S.delayContext,exports.depthOfField=l.y,exports.discover=p.r,exports.discoverAllElements=p.i,exports.discoverAnyComponent=p.a,exports.discoverComponent=p.o,exports.discoverElement=p.s,exports.dismissAll=g.n,exports.drag=l._,exports.drop=l.v,exports.effect=r.n,exports.encodeData=t.g,exports.encodeRouteState=t.l,exports.extractQueryParams=t.u,exports.fill=l.m,exports.flip=B.r,exports.formSubmitState=O.n,exports.formatTheme=X.l,exports.fromResizeObserver=f.t,exports.fullHeight=f.n,exports.fullWidth=f.r,exports.futureCell=l.E,exports.fyi=l.p,exports.getEasing=c._,exports.getTagName=t.d,exports.gravity=ne.t,exports.hummingbird=l.f,exports.intersect=l.d,exports.intersection$=Z.n,exports.isBeta=l.w,exports.isObject=t.f,exports.lazy=n.t,exports.lightbox=B.t,exports.lightboxDirective=B.n,exports.liquid=l.u,exports.livingBorder=l.l,exports.longPress=l.c,exports.magnetic=m.t,exports.missedPunch=l.s,exports.mutationObserver=K.t,exports.nebula=l.o,exports.normalizeTagName=t.p,exports.notify=L.t,exports.notifyProgress=L.n,exports.observe=r.r,exports.openOverlays$=g.r,exports.overflowWithin=l.r,exports.overlayEvents=g.i,exports.overlayStack=te.t,exports.prefersReducedMotion=c.v,exports.prompt=g.a,exports.reducedMotion$=ee.t,exports.reveal=l.a,exports.ripple=l.i,exports.routerHistory=t.C,exports.sanitizeRouteState=t.m,exports.schmancyContentDrawer=h.C,exports.schmancyContext=r.i,exports.schmancyNavDrawer=h.m,exports.schmancySound=i.t,exports.schmancyTheme=d.t,exports.setBetaPredicate=l.T,exports.show=g.o,exports.similarity=o.t,exports.sound=i.n,exports.state=r.a,exports.stateFromObservable=r.o,exports.stepsContext=J.stepsContext,exports.tailwindAnimations=c.y,exports.tailwindStyles=X.o,exports.teleport=h.i,exports.theme=d.n,exports.themeContext=e.d,exports.tooltip=ce.tooltip,exports.typewriter=de.typewriter,exports.urgent=l.n,exports.validateInitialDateRange=b.n,exports.windowManager=E.n,exports.workingSnake=l.t;
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`./chunk-CncqDLb2.cjs`);const e=require(`./SchmancyElement-PS1u0j1B.cjs`),t=require(`./area-CaEI33G0.cjs`),n=require(`./lazy-C-7a4FAe.cjs`),r=require(`./state-CumAEPQH.cjs`),i=require(`./sound.service-DjlMvicQ.cjs`),a=require(`./audio-B924fI5N.cjs`),o=require(`./search-DPKoC-dT.cjs`),s=require(`./input-chip-CV91URyU.cjs`),c=require(`./animation-CCOIW4wJ.cjs`),l=require(`./directives-DCb_LA9R.cjs`),ee=require(`./reduced-motion-Ds-HjMzn.cjs`),u=require(`./cursor-glow-Bulq-38P.cjs`),d=require(`./theme.service-pjkTM209.cjs`),f=require(`./layout-CNlZSJFU.cjs`),te=require(`./overlay-stack-Bdr9lOqi.cjs`),ne=require(`./gravity-6pL6CfIr.cjs`),p=require(`./discovery.service-CIa3Eeuk.cjs`),m=require(`./magnetic-DKtc4umC.cjs`),h=require(`./src-DK3111z_.cjs`),g=require(`./overlay.service-9Dp3g7ot.cjs`),_=require(`./boat-D3bEjxf8.cjs`),re=require(`./button-CTvS5YX4.cjs`),ie=require(`./button.cjs`),ae=require(`./checkbox-DXKdxkXE.cjs`),v=require(`./chips-9eG-96_D.cjs`),y=require(`./connectivity.cjs`),b=require(`./date-range-Q2xj5Syc.cjs`),x=require(`./date-range-inline-DV2c_gWM.cjs`),S=require(`./delay.cjs`),oe=require(`./details-B2-jECBh.cjs`),C=require(`./dropdown.cjs`),w=require(`./surface-DGI-FBoi.cjs`),T=require(`./expand-B9IUGVtc.cjs`),se=require(`./fab.cjs`),E=require(`./window-CmB9XZzT.cjs`),D=require(`./float-DkGyWSWy.cjs`),O=require(`./form-DowzVsgI.cjs`),k=require(`./input-DnmC6J1T.cjs`),A=require(`./radio-group-6kCgOgBL.cjs`),j=require(`./range.cjs`),M=require(`./theme.interface-CSt7JUBD.cjs`),N=require(`./select-MXsF8KsU.cjs`),P=require(`./switch.cjs`),F=require(`./form.cjs`),I=require(`./iframe-CDJjnNmo.cjs`),L=require(`./notification-FBf3Mb2e.cjs`),R=require(`./json.cjs`),z=require(`./layout.cjs`),B=require(`./lightbox-CvtqoInF.cjs`),V=require(`./list-Dl8KfxrF.cjs`),H=require(`./navigation-rail.cjs`),U=require(`./overlay-sRXiMkjn.cjs`),W=require(`./typography-aaQaIcNc.cjs`),G=require(`./overlay.confirm-body-Jc1EuMGs.cjs`),K=require(`./rxjs-utils-Csnks202.cjs`),q=require(`./slider.cjs`),J=require(`./steps.cjs`),Y=require(`./table.cjs`),X=require(`./theme-BG0EnzYP.cjs`),ce=require(`./tooltip.cjs`),le=require(`./tree.cjs`),ue=require(`./types.cjs`),de=require(`./typewriter.cjs`),Z=require(`./utils-DTa3QHxk.cjs`),fe=require(`./avatar.cjs`),Q=require(`./breadcrumb.cjs`),pe=require(`./kbd.cjs`),me=require(`./skeleton.cjs`),he=require(`./visually-hidden.cjs`);let $=require(`@lit-labs/signals`);exports.$drawer=h.p,exports.$notify=L.r,exports.$sounds=a.t,exports.ANIMATION_CSS_VARS=c.t,exports.BLACKBIRD_EASING=c.n,exports.DISCOVER_EVENT=p.t,exports.DISCOVER_RESPONSE_EVENT=p.n,exports.DURATION_BACKDROP=c.r,exports.DURATION_ENTER=c.i,exports.DURATION_EXIT=c.a,exports.DragDirective=l.h,exports.DropDirective=l.g,exports.EASE_IN=c.o,exports.EASE_OUT=c.s,exports.EmotionalSoundGenerator=a.n,exports.FINDING_MORTIES=t.b,exports.GRID_ANIMATION_CSS=c.c,exports.HERE_RICKY=t.x,exports.HISTORY_STRATEGY=t.v,exports.HereMorty=h.n,Object.defineProperty(exports,`List`,{enumerable:!0,get:function(){return V.t}}),exports.Numbers=Z.t,Object.defineProperty(exports,`RadioButton`,{enumerable:!0,get:function(){return A.t}}),Object.defineProperty(exports,`RadioGroup`,{enumerable:!0,get:function(){return A.n}}),exports.SCHMANCY_EXPAND_REQUEST_CLOSE=T.t,exports.SPRING_BOUNCY=c.l,exports.SPRING_GENTLE=c.u,exports.SPRING_SMOOTH=c.d,exports.SPRING_SNAPPY=c.f,Object.defineProperty(exports,`ScBadgeV2`,{enumerable:!0,get:function(){return h.w}}),Object.defineProperty(exports,`SchmancyArea`,{enumerable:!0,get:function(){return t._}}),Object.defineProperty(exports,`SchmancyAssistChip`,{enumerable:!0,get:function(){return v.r}}),Object.defineProperty(exports,`SchmancyAvatar`,{enumerable:!0,get:function(){return fe.SchmancyAvatar}}),Object.defineProperty(exports,`SchmancyBadgeV2`,{enumerable:!0,get:function(){return h.T}}),exports.SchmancyBoat=_.t,Object.defineProperty(exports,`SchmancyBreadcrumb`,{enumerable:!0,get:function(){return Q.SchmancyBreadcrumb}}),Object.defineProperty(exports,`SchmancyBreadcrumbItem`,{enumerable:!0,get:function(){return Q.SchmancyBreadcrumbItem}}),Object.defineProperty(exports,`SchmancyButton`,{enumerable:!0,get:function(){return re.t}}),Object.defineProperty(exports,`SchmancyCheckbox`,{enumerable:!0,get:function(){return ae.t}}),exports.SchmancyChip=v.n,exports.SchmancyFilterChip=v.n,Object.defineProperty(exports,`SchmancyConnectivityStatus`,{enumerable:!0,get:function(){return y.SchmancyConnectivityStatus}}),Object.defineProperty(exports,`SchmancyContentDrawer`,{enumerable:!0,get:function(){return h._}}),exports.SchmancyContentDrawerID=h.v,Object.defineProperty(exports,`SchmancyContentDrawerMain`,{enumerable:!0,get:function(){return h.g}}),exports.SchmancyContentDrawerMaxHeight=h.y,exports.SchmancyContentDrawerMinWidth=h.b,Object.defineProperty(exports,`SchmancyContentDrawerSheet`,{enumerable:!0,get:function(){return h.h}}),exports.SchmancyContentDrawerSheetMode=h.x,exports.SchmancyContentDrawerSheetState=h.S,exports.SchmancyContext=r.s,Object.defineProperty(exports,`SchmancyDataTable`,{enumerable:!0,get:function(){return Y.SchmancyDataTable}}),Object.defineProperty(exports,`SchmancyDateRange`,{enumerable:!0,get:function(){return b.t}}),exports.SchmancyDateRangeInline=x.t,Object.defineProperty(exports,`SchmancyDelay`,{enumerable:!0,get:function(){return S.SchmancyDelay}}),exports.SchmancyDetails=oe.t,Object.defineProperty(exports,`SchmancyDrawerAppbar`,{enumerable:!0,get:function(){return h.f}}),exports.SchmancyDrawerNavbarMode=h.l,exports.SchmancyDrawerNavbarState=h.u,Object.defineProperty(exports,`SchmancyDropdown`,{enumerable:!0,get:function(){return C.SchmancyDropdown}}),Object.defineProperty(exports,`SchmancyDropdownContent`,{enumerable:!0,get:function(){return C.SchmancyDropdownContent}}),exports.SchmancyEvents=ue.SchmancyEvents,Object.defineProperty(exports,`SchmancyExpandRoot`,{enumerable:!0,get:function(){return T.n}}),Object.defineProperty(exports,`SchmancyFab`,{enumerable:!0,get:function(){return se.SchmancyFab}}),exports.SchmancyFloat=D.t,exports.SchmancyForm=O.t,Object.defineProperty(exports,`SchmancyFormSummary`,{enumerable:!0,get:function(){return F.SchmancyFormSummary}}),exports.SchmancyGenerateMoodAudioEvent=X.n,exports.SchmancyIframe=I.t,exports.SchmancyInput=k.n,Object.defineProperty(exports,`SchmancyInputChip`,{enumerable:!0,get:function(){return s.t}}),Object.defineProperty(exports,`SchmancyInputCompat`,{enumerable:!0,get:function(){return k.t}}),Object.defineProperty(exports,`SchmancyJson`,{enumerable:!0,get:function(){return R.SchmancyJson}}),Object.defineProperty(exports,`SchmancyKbd`,{enumerable:!0,get:function(){return pe.SchmancyKbd}}),Object.defineProperty(exports,`SchmancyLightbox`,{enumerable:!0,get:function(){return B.i}}),Object.defineProperty(exports,`SchmancyListItem`,{enumerable:!0,get:function(){return V.n}}),exports.SchmancyListTypeContext=V.r,Object.defineProperty(exports,`SchmancyNavigationBar`,{enumerable:!0,get:function(){return h.a}}),Object.defineProperty(exports,`SchmancyNavigationBarItem`,{enumerable:!0,get:function(){return h.o}}),Object.defineProperty(exports,`SchmancyNavigationDrawer`,{enumerable:!0,get:function(){return h.c}}),Object.defineProperty(exports,`SchmancyNavigationDrawerContent`,{enumerable:!0,get:function(){return h.d}}),Object.defineProperty(exports,`SchmancyNavigationDrawerSidebar`,{enumerable:!0,get:function(){return h.s}}),Object.defineProperty(exports,`SchmancyNavigationRail`,{enumerable:!0,get:function(){return H.SchmancyNavigationRail}}),Object.defineProperty(exports,`SchmancyNavigationRailItem`,{enumerable:!0,get:function(){return H.SchmancyNavigationRailItem}}),exports.SchmancyNotification=L.i,Object.defineProperty(exports,`SchmancyOverlay`,{enumerable:!0,get:function(){return U.t}}),Object.defineProperty(exports,`SchmancyOverlayPromptBody`,{enumerable:!0,get:function(){return G.t}}),Object.defineProperty(exports,`SchmancyRange`,{enumerable:!0,get:function(){return j.SchmancyRange}}),Object.defineProperty(exports,`SchmancyRoute`,{enumerable:!0,get:function(){return t.y}}),Object.defineProperty(exports,`SchmancyScroll`,{enumerable:!0,get:function(){return z.SchmancyScroll}}),Object.defineProperty(exports,`SchmancySelect`,{enumerable:!0,get:function(){return N.t}}),Object.defineProperty(exports,`SchmancySkeleton`,{enumerable:!0,get:function(){return me.SchmancySkeleton}}),Object.defineProperty(exports,`SchmancySlide`,{enumerable:!0,get:function(){return q.SchmancySlide}}),Object.defineProperty(exports,`SchmancySlider`,{enumerable:!0,get:function(){return q.SchmancySlider}}),Object.defineProperty(exports,`SchmancyStep`,{enumerable:!0,get:function(){return J.SchmancyStep}}),Object.defineProperty(exports,`SchmancySteps`,{enumerable:!0,get:function(){return J.SchmancySteps}}),Object.defineProperty(exports,`SchmancySuggestionChip`,{enumerable:!0,get:function(){return v.t}}),Object.defineProperty(exports,`SchmancySurface`,{enumerable:!0,get:function(){return w.t}}),exports.SchmancySurfaceTypeContext=w.n,Object.defineProperty(exports,`SchmancySwitch`,{enumerable:!0,get:function(){return P.SchmancySwitch}}),Object.defineProperty(exports,`SchmancyTableRow`,{enumerable:!0,get:function(){return Y.SchmancyTableRow}}),Object.defineProperty(exports,`SchmancyTeleportation`,{enumerable:!0,get:function(){return h.t}}),exports.SchmancyTheme=M.t,Object.defineProperty(exports,`SchmancyThemeAudioPlayer`,{enumerable:!0,get:function(){return X.r}}),Object.defineProperty(exports,`SchmancyThemeComponent`,{enumerable:!0,get:function(){return X.a}}),Object.defineProperty(exports,`SchmancyThemeController`,{enumerable:!0,get:function(){return X.i}}),Object.defineProperty(exports,`SchmancyThemeControllerBoat`,{enumerable:!0,get:function(){return X.t}}),Object.defineProperty(exports,`SchmancyTree`,{enumerable:!0,get:function(){return le.SchmancyTree}}),Object.defineProperty(exports,`SchmancyTypography`,{enumerable:!0,get:function(){return W.t}}),Object.defineProperty(exports,`SchmancyVisuallyHidden`,{enumerable:!0,get:function(){return he.SchmancyVisuallyHidden}}),exports.SchmancyWindow=E.t,Object.defineProperty(exports,`SchmnacyIconButton`,{enumerable:!0,get:function(){return ie.SchmnacyIconButton}}),Object.defineProperty(exports,`Signal`,{enumerable:!0,get:function(){return $.Signal}}),exports.StepsController=J.StepsController,exports.ThemeHereIAm=d.r,exports.ThemeWhereAreYou=d.i,exports.WhereAreYouRicky=h.r,exports._activeHost=e.r,exports.aiBadge=l.O,exports.animateText=l.k,exports.area=t.S,exports.art=l.D,exports.beta=l.C,exports.bindState=r.t,exports.buildQueryString=t.t,exports.color=l.S,exports.compareActiveRoutes=t.n,exports.compareCustomElementConstructors=t.r,exports.compareRouteActions=t.i,Object.defineProperty(exports,`computed`,{enumerable:!0,get:function(){return $.computed}}),exports.confirm=g.t,exports.confirmClick=l.x,exports.createAnimation=c.p,exports.createDarkTonalPaletteFromBaseColor=X.s,exports.createDismissAnimation=c.m,exports.createLightTonalPaletteFromBaseColor=X.c,exports.createRevealAnimation=c.h,exports.createRouteCacheKey=t.a,exports.createScaleAnimation=c.g,exports.cursorGlow=u.t,exports.cycleText=l.b,exports.debounce=t.o,exports.decodeData=t.h,exports.decodeRouteState=t.s,exports.deepMerge=t.c,exports.delayContext=S.delayContext,exports.depthOfField=l.y,exports.discover=p.r,exports.discoverAllElements=p.i,exports.discoverAnyComponent=p.a,exports.discoverComponent=p.o,exports.discoverElement=p.s,exports.dismissAll=g.n,exports.drag=l._,exports.drop=l.v,exports.effect=r.n,exports.encodeData=t.g,exports.encodeRouteState=t.l,exports.extractQueryParams=t.u,exports.fill=l.m,exports.flip=B.r,exports.formSubmitState=O.n,exports.formatTheme=X.l,exports.fromResizeObserver=f.t,exports.fullHeight=f.n,exports.fullWidth=f.r,exports.futureCell=l.E,exports.fyi=l.p,exports.getEasing=c._,exports.getTagName=t.d,exports.gravity=ne.t,exports.hummingbird=l.f,exports.intersect=l.d,exports.intersection$=Z.n,exports.isBeta=l.w,exports.isObject=t.f,exports.lazy=n.t,exports.lightbox=B.t,exports.lightboxDirective=B.n,exports.liquid=l.u,exports.livingBorder=l.l,exports.longPress=l.c,exports.magnetic=m.t,exports.missedPunch=l.s,exports.mutationObserver=K.t,exports.nebula=l.o,exports.normalizeTagName=t.p,exports.notify=L.t,exports.notifyProgress=L.n,exports.observe=r.r,exports.openOverlays$=g.r,exports.overflowWithin=l.r,exports.overlayEvents=g.i,exports.overlayStack=te.t,exports.prefersReducedMotion=c.v,exports.prompt=g.a,exports.reducedMotion$=ee.t,exports.reveal=l.a,exports.ripple=l.i,exports.routerHistory=t.C,exports.sanitizeRouteState=t.m,exports.schmancyContentDrawer=h.C,exports.schmancyContext=r.i,exports.schmancyNavDrawer=h.m,exports.schmancySound=i.t,exports.schmancyTheme=d.t,exports.setBetaPredicate=l.T,exports.show=g.o,exports.similarity=o.t,exports.sound=i.n,exports.state=r.a,exports.stateFromObservable=r.o,exports.stepsContext=J.stepsContext,exports.tailwindAnimations=c.y,exports.tailwindStyles=X.o,exports.teleport=h.i,exports.theme=d.n,exports.themeContext=e.d,exports.tooltip=ce.tooltip,exports.typewriter=de.typewriter,exports.urgent=l.n,exports.validateInitialDateRange=b.n,exports.windowManager=E.n,exports.workingSnake=l.t;
|