@mhmo91/schmancy 0.10.36 → 0.10.38
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 +54 -31
- package/dist/SchmancyElement-BNnyBOwk.js +286 -0
- package/dist/{SchmancyElement-C3CpdNsi.js.map → SchmancyElement-BNnyBOwk.js.map} +1 -1
- package/dist/SchmancyElement-C41uPa6l.cjs +2 -0
- package/dist/{SchmancyElement-BBzRWB1w.cjs.map → SchmancyElement-C41uPa6l.cjs.map} +1 -1
- package/dist/agent/schmancy.agent.js +2432 -2361
- package/dist/agent/schmancy.agent.js.map +1 -1
- package/dist/agent/schmancy.manifest.json +4 -22
- package/dist/area-2FrTZI_T.cjs +21 -0
- package/dist/area-2FrTZI_T.cjs.map +1 -0
- package/dist/{area-BA96mwFY.js → area-KVDzhT4s.js} +4 -4
- package/dist/area-KVDzhT4s.js.map +1 -0
- package/dist/area.cjs +1 -1
- package/dist/area.js +2 -2
- package/dist/{audio-D52h1jAT.js → audio-D3gnp15Y.js} +1 -1
- package/dist/{audio-D52h1jAT.js.map → audio-D3gnp15Y.js.map} +1 -1
- package/dist/{audio-B_jT9Xr7.cjs → audio-EaD0Ggfh.cjs} +1 -1
- package/dist/{audio-B_jT9Xr7.cjs.map → audio-EaD0Ggfh.cjs.map} +1 -1
- package/dist/audio.cjs +1 -1
- package/dist/audio.js +2 -2
- package/dist/autocomplete-DMmxsvUe.cjs +115 -0
- package/dist/autocomplete-DMmxsvUe.cjs.map +1 -0
- package/dist/{autocomplete-CI4QJXAN.js → autocomplete-DWiEqlQf.js} +96 -96
- package/dist/autocomplete-DWiEqlQf.js.map +1 -0
- 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-_N1x5U_3.js → boat-DmyG7y1V.js} +4 -4
- package/dist/{boat-_N1x5U_3.js.map → boat-DmyG7y1V.js.map} +1 -1
- package/dist/{boat-I4B1UNMc.cjs → boat-dB1_qLm0.cjs} +1 -1
- package/dist/{boat-I4B1UNMc.cjs.map → boat-dB1_qLm0.cjs.map} +1 -1
- package/dist/boat.cjs +1 -1
- package/dist/boat.js +1 -1
- package/dist/breadcrumb.cjs +3 -3
- package/dist/breadcrumb.cjs.map +1 -1
- package/dist/breadcrumb.js +4 -4
- package/dist/breadcrumb.js.map +1 -1
- package/dist/{busy-BIUonyPk.cjs → busy-Cj_PV7oC.cjs} +1 -1
- package/dist/{busy-BIUonyPk.cjs.map → busy-Cj_PV7oC.cjs.map} +1 -1
- package/dist/{busy-CCB3qKnh.js → busy-enYCTssB.js} +2 -2
- package/dist/{busy-CCB3qKnh.js.map → busy-enYCTssB.js.map} +1 -1
- package/dist/busy.cjs +1 -1
- package/dist/busy.js +1 -1
- package/dist/{button-C89bPnHt.js → button-BQSOVnHn.js} +10 -9
- package/dist/button-BQSOVnHn.js.map +1 -0
- package/dist/button-WRmXlNyw.cjs +62 -0
- package/dist/button-WRmXlNyw.cjs.map +1 -0
- package/dist/button.cjs +6 -6
- package/dist/button.cjs.map +1 -1
- package/dist/button.js +17 -16
- package/dist/button.js.map +1 -1
- package/dist/{card-CFsCgJKZ.js → card-BHTz1GwB.js} +16 -16
- package/dist/card-BHTz1GwB.js.map +1 -0
- package/dist/{card-BO93_oxQ.cjs → card-ThG_ZaQE.cjs} +3 -3
- package/dist/card-ThG_ZaQE.cjs.map +1 -0
- package/dist/card.cjs +1 -1
- package/dist/card.js +1 -1
- package/dist/{checkbox-CFUBUFtW.cjs → checkbox-C4zeib84.cjs} +2 -2
- package/dist/{checkbox-CFUBUFtW.cjs.map → checkbox-C4zeib84.cjs.map} +1 -1
- package/dist/{checkbox-Bh7q0djq.js → checkbox-Ce0DlAdW.js} +6 -6
- package/dist/{checkbox-Bh7q0djq.js.map → checkbox-Ce0DlAdW.js.map} +1 -1
- package/dist/checkbox.cjs +1 -1
- package/dist/checkbox.js +1 -1
- package/dist/{chips-BfzpsyV1.cjs → chips-B1jui8Pe.cjs} +3 -3
- package/dist/chips-B1jui8Pe.cjs.map +1 -0
- package/dist/{chips-6YaoRmeG.js → chips-DAy6v93f.js} +20 -19
- package/dist/chips-DAy6v93f.js.map +1 -0
- package/dist/chips.cjs +1 -1
- package/dist/chips.js +2 -2
- package/dist/connectivity.cjs +1 -1
- package/dist/connectivity.js +3 -3
- package/dist/content-drawer.cjs +1 -1
- package/dist/content-drawer.js +1 -1
- package/dist/cursor-glow-Ah7VXSj7.js.map +1 -1
- package/dist/cursor-glow-Bulq-38P.cjs.map +1 -1
- package/dist/{date-range-N-A249O9.cjs → date-range-BUaPgbTZ.cjs} +2 -2
- package/dist/date-range-BUaPgbTZ.cjs.map +1 -0
- package/dist/{date-range-CEo_Kjqw.js → date-range-NTpoA1in.js} +4 -4
- package/dist/date-range-NTpoA1in.js.map +1 -0
- package/dist/{date-range-inline-DFopysWF.cjs → date-range-inline-D0I6k84h.cjs} +1 -1
- package/dist/{date-range-inline-DFopysWF.cjs.map → date-range-inline-D0I6k84h.cjs.map} +1 -1
- package/dist/{date-range-inline-BwialV9j.js → date-range-inline-DjRdMZ1z.js} +2 -2
- package/dist/{date-range-inline-BwialV9j.js.map → date-range-inline-DjRdMZ1z.js.map} +1 -1
- package/dist/date-range-inline.cjs +1 -1
- package/dist/date-range-inline.js +1 -1
- package/dist/date-range.cjs +1 -1
- package/dist/date-range.js +1 -1
- package/dist/delay.cjs +1 -1
- package/dist/delay.js +2 -2
- package/dist/{details-GtpfI2hA.js → details-CY49XVfp.js} +43 -35
- package/dist/details-CY49XVfp.js.map +1 -0
- package/dist/details-DQNj2oaU.cjs +164 -0
- package/dist/details-DQNj2oaU.cjs.map +1 -0
- package/dist/details.cjs +1 -1
- package/dist/details.js +1 -1
- package/dist/{directives-CvYGSW_a.cjs → directives-Bb0S1DKZ.cjs} +4 -4
- package/dist/directives-Bb0S1DKZ.cjs.map +1 -0
- package/dist/{directives-C2dXgpCY.js → directives-Bfm1lkoy.js} +30 -23
- package/dist/directives-Bfm1lkoy.js.map +1 -0
- package/dist/directives.cjs +1 -1
- package/dist/directives.js +2 -2
- package/dist/{divider-D0pGX2VB.js → divider-BeyX_C0A.js} +2 -2
- package/dist/{divider-D0pGX2VB.js.map → divider-BeyX_C0A.js.map} +1 -1
- package/dist/{divider-rNsWCvMi.cjs → divider-Ck2C1sKl.cjs} +1 -1
- package/dist/{divider-rNsWCvMi.cjs.map → divider-Ck2C1sKl.cjs.map} +1 -1
- package/dist/divider.cjs +1 -1
- package/dist/divider.js +1 -1
- package/dist/dropdown.cjs +1 -1
- package/dist/dropdown.js +2 -2
- package/dist/{expand-FcKAzJta.js → expand-BYsSEtp6.js} +53 -53
- package/dist/expand-BYsSEtp6.js.map +1 -0
- package/dist/expand-CUF163mg.cjs +141 -0
- package/dist/expand-CUF163mg.cjs.map +1 -0
- 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-CQ1WEp3M.js → float-Cgllk_H9.js} +2 -2
- package/dist/{float-CQ1WEp3M.js.map → float-Cgllk_H9.js.map} +1 -1
- package/dist/{float-CDjgxWyy.cjs → float-OvqX0nqG.cjs} +1 -1
- package/dist/{float-CDjgxWyy.cjs.map → float-OvqX0nqG.cjs.map} +1 -1
- package/dist/float.cjs +1 -1
- package/dist/float.js +1 -1
- package/dist/form-4GKROq2P.cjs +27 -0
- package/dist/form-4GKROq2P.cjs.map +1 -0
- package/dist/{form-H24puioV.js → form-DxaV_Ose.js} +39 -39
- package/dist/form-DxaV_Ose.js.map +1 -0
- package/dist/form.cjs +3 -3
- package/dist/form.cjs.map +1 -1
- package/dist/form.js +34 -34
- package/dist/form.js.map +1 -1
- package/dist/gravity-6pL6CfIr.cjs.map +1 -1
- package/dist/gravity-sVK3zGBF.js.map +1 -1
- package/dist/handover/agent-runtime-followups.md +1 -1
- package/dist/handover/agent-runtime-v1.md +3 -3
- package/dist/{icons-DBxfN91B.js → icons-CJ2mXcBi.js} +9 -9
- package/dist/icons-CJ2mXcBi.js.map +1 -0
- package/dist/icons-sZ-LybA9.cjs +24 -0
- package/dist/icons-sZ-LybA9.cjs.map +1 -0
- package/dist/icons.cjs +1 -1
- package/dist/icons.js +1 -1
- package/dist/{iframe-BDVElN8z.js → iframe-DWvN5nGB.js} +11 -11
- package/dist/iframe-DWvN5nGB.js.map +1 -0
- package/dist/{iframe-CG-z9qev.cjs → iframe-DpCv-QH2.cjs} +7 -7
- package/dist/iframe-DpCv-QH2.cjs.map +1 -0
- package/dist/iframe.cjs +1 -1
- package/dist/iframe.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +37 -37
- package/dist/{input-Bt_o4sYo.js → input-BCCHz6tB.js} +7 -7
- package/dist/input-BCCHz6tB.js.map +1 -0
- package/dist/{input-B14Nn6xD.cjs → input-Z-3N5JMv.cjs} +2 -2
- package/dist/input-Z-3N5JMv.cjs.map +1 -0
- package/dist/{input-chip-DEqO0DXc.js → input-chip-BOrcKH-H.js} +2 -2
- package/dist/{input-chip-DEqO0DXc.js.map → input-chip-BOrcKH-H.js.map} +1 -1
- package/dist/{input-chip-ugYu9Fn9.cjs → input-chip-ChAgRCXZ.cjs} +1 -1
- package/dist/{input-chip-ugYu9Fn9.cjs.map → input-chip-ChAgRCXZ.cjs.map} +1 -1
- package/dist/input.cjs +1 -1
- package/dist/input.js +1 -1
- package/dist/json.cjs +1 -1
- package/dist/json.js +3 -3
- package/dist/kbd.cjs +1 -1
- package/dist/kbd.js +2 -2
- package/dist/{layout-BJ_43VrH.js → layout-CFiG3lNT.js} +1 -1
- package/dist/{layout-BJ_43VrH.js.map → layout-CFiG3lNT.js.map} +1 -1
- package/dist/{layout-DF9ZaQ-b.cjs → layout-DZ4dpLh9.cjs} +1 -1
- package/dist/{layout-DF9ZaQ-b.cjs.map → layout-DZ4dpLh9.cjs.map} +1 -1
- package/dist/layout.cjs +1 -1
- package/dist/layout.js +2 -2
- package/dist/lazy-BaAiIUru.js +19 -0
- package/dist/lazy-BaAiIUru.js.map +1 -0
- package/dist/lazy-C-7a4FAe.cjs +1 -0
- package/dist/lazy-C-7a4FAe.cjs.map +1 -0
- package/dist/{lightbox-ZmuoBBFT.js → lightbox-B7Y4Nij_.js} +2 -2
- package/dist/lightbox-B7Y4Nij_.js.map +1 -0
- package/dist/{lightbox-B47Zoqv-.cjs → lightbox-Dpwsn8Qr.cjs} +1 -1
- package/dist/lightbox-Dpwsn8Qr.cjs.map +1 -0
- package/dist/lightbox.cjs +1 -1
- package/dist/lightbox.js +1 -1
- package/dist/{list-CaSWrlG2.cjs → list-BhM-6dAi.cjs} +1 -1
- package/dist/{list-CaSWrlG2.cjs.map → list-BhM-6dAi.cjs.map} +1 -1
- package/dist/{list-C47xzld_.js → list-C5WVoIfJ.js} +2 -2
- package/dist/{list-C47xzld_.js.map → list-C5WVoIfJ.js.map} +1 -1
- package/dist/list.cjs +1 -1
- package/dist/list.js +1 -1
- package/dist/magnetic-DKtc4umC.cjs.map +1 -1
- package/dist/magnetic-DaOOv5Dz.js.map +1 -1
- package/dist/{menu-8RObM6Ie.js → menu-CBAAJoHu.js} +3 -3
- package/dist/{menu-8RObM6Ie.js.map → menu-CBAAJoHu.js.map} +1 -1
- package/dist/{menu-Jpsy85SX.cjs → menu-DFQjJk3H.cjs} +1 -1
- package/dist/{menu-Jpsy85SX.cjs.map → menu-DFQjJk3H.cjs.map} +1 -1
- package/dist/menu.cjs +1 -1
- package/dist/menu.js +1 -1
- package/dist/{mixins-DTzfFVyv.js → mixins-DGBI7YPO.js} +11 -11
- package/dist/mixins-DGBI7YPO.js.map +1 -0
- package/dist/{mixins-DPdzC9ZH.cjs → mixins-fIpzhVMd.cjs} +1 -1
- package/dist/mixins-fIpzhVMd.cjs.map +1 -0
- 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 +3 -3
- package/dist/navigation-rail.cjs.map +1 -1
- package/dist/navigation-rail.js +11 -10
- package/dist/navigation-rail.js.map +1 -1
- package/dist/notification-B6yDL91t.cjs +24 -0
- package/dist/notification-B6yDL91t.cjs.map +1 -0
- package/dist/{notification-Ccktcj9H.js → notification-BB9OBRCr.js} +22 -22
- package/dist/notification-BB9OBRCr.js.map +1 -0
- package/dist/notification.cjs +1 -1
- package/dist/notification.js +1 -1
- package/dist/{option-CkMxwBqU.js → option-B21ImL0k.js} +2 -2
- package/dist/{option-CkMxwBqU.js.map → option-B21ImL0k.js.map} +1 -1
- package/dist/{option-0aNiVB3Q.cjs → option-CJQM5I9q.cjs} +1 -1
- package/dist/{option-0aNiVB3Q.cjs.map → option-CJQM5I9q.cjs.map} +1 -1
- package/dist/option.cjs +1 -1
- package/dist/option.js +1 -1
- package/dist/{overlay-H3Wt_dgQ.js → overlay-CWsihJ-E.js} +75 -67
- package/dist/overlay-CWsihJ-E.js.map +1 -0
- package/dist/overlay-DkIX9Ig3.cjs +58 -0
- package/dist/overlay-DkIX9Ig3.cjs.map +1 -0
- package/dist/overlay.cjs +1 -1
- package/dist/{overlay.confirm-body-Dxn_wNm3.js → overlay.confirm-body-CPqqPNks.js} +10 -10
- package/dist/overlay.confirm-body-CPqqPNks.js.map +1 -0
- package/dist/{overlay.confirm-body-CR9xaqOE.cjs → overlay.confirm-body-DwTfiNlV.cjs} +3 -3
- package/dist/overlay.confirm-body-DwTfiNlV.cjs.map +1 -0
- package/dist/overlay.js +4 -4
- package/dist/overlay.service-DU1nqh6A.cjs +1 -0
- package/dist/{overlay.service-DEj3rfRr.cjs.map → overlay.service-DU1nqh6A.cjs.map} +1 -1
- package/dist/{overlay.service-C46kOtUi.js → overlay.service-KTgBxjFb.js} +4 -4
- package/dist/{overlay.service-C46kOtUi.js.map → overlay.service-KTgBxjFb.js.map} +1 -1
- package/dist/{progress-zs18GR6C.cjs → progress-B-Qg44XY.cjs} +1 -1
- package/dist/{progress-zs18GR6C.cjs.map → progress-B-Qg44XY.cjs.map} +1 -1
- package/dist/{progress-BK7gSq8j.js → progress-CUSS1sNz.js} +2 -2
- package/dist/{progress-BK7gSq8j.js.map → progress-CUSS1sNz.js.map} +1 -1
- package/dist/progress.cjs +1 -1
- package/dist/progress.js +1 -1
- package/dist/{radio-group-1HCpzRUB.js → radio-group-AHLvrN8O.js} +7 -7
- package/dist/radio-group-AHLvrN8O.js.map +1 -0
- package/dist/{radio-group-DbYlyPc-.cjs → radio-group-BEtvCSS1.cjs} +2 -2
- package/dist/radio-group-BEtvCSS1.cjs.map +1 -0
- package/dist/radio-group.cjs +1 -1
- package/dist/radio-group.js +1 -1
- package/dist/range.cjs +1 -1
- package/dist/range.js +2 -2
- package/dist/select-BWpV2iv-.cjs +56 -0
- package/dist/select-BWpV2iv-.cjs.map +1 -0
- package/dist/{select-CEyhNtZ2.js → select-Cawz88lG.js} +46 -46
- package/dist/select-Cawz88lG.js.map +1 -0
- package/dist/select.cjs +1 -1
- package/dist/select.js +1 -1
- package/dist/skeleton.cjs +1 -1
- package/dist/skeleton.js +2 -2
- package/dist/skills/SKILL.md +17 -11
- package/dist/skills/overlay.md +14 -7
- package/dist/skills/schmancy/SKILL.md +17 -11
- package/dist/skills/schmancy/overlay.md +14 -7
- package/dist/skills/schmancy/steps.md +68 -34
- package/dist/skills/steps.md +68 -34
- package/dist/slider.cjs +1 -1
- package/dist/slider.js +2 -2
- package/dist/{sound.service-DO4SmUUT.js → sound.service-CK-5zob-.js} +4 -3
- package/dist/sound.service-CK-5zob-.js.map +1 -0
- package/dist/{sound.service-G_8GV_6L.cjs → sound.service-D2GGaBXc.cjs} +1 -1
- package/dist/sound.service-D2GGaBXc.cjs.map +1 -0
- package/dist/{splash-screen-B1mM4_xz.js → splash-screen-BUEtjHXC.js} +13 -13
- package/dist/splash-screen-BUEtjHXC.js.map +1 -0
- package/dist/{splash-screen-cbz4bxjB.cjs → splash-screen-DqPuipox.cjs} +6 -6
- package/dist/splash-screen-DqPuipox.cjs.map +1 -0
- package/dist/splash-screen.cjs +1 -1
- package/dist/splash-screen.js +1 -1
- package/dist/{src-tncsWsTY.js → src-CIqAj3Eh.js} +45 -45
- package/dist/src-CIqAj3Eh.js.map +1 -0
- package/dist/{src-czeiuT1m.cjs → src-CYqBQTyt.cjs} +6 -6
- package/dist/src-CYqBQTyt.cjs.map +1 -0
- package/dist/{state-Cx0aoL5e.cjs → state-BxDNox-2.cjs} +1 -1
- package/dist/{state-Cx0aoL5e.cjs.map → state-BxDNox-2.cjs.map} +1 -1
- package/dist/{state-DJDp3N7J.js → state-CnZCDMT0.js} +9 -9
- package/dist/{state-DJDp3N7J.js.map → state-CnZCDMT0.js.map} +1 -1
- package/dist/state.cjs +1 -1
- package/dist/state.js +2 -2
- package/dist/steps.cjs +35 -19
- package/dist/steps.cjs.map +1 -1
- package/dist/steps.js +96 -73
- package/dist/steps.js.map +1 -1
- package/dist/{surface-CYBl8_a3.js → surface-BMdG3dKQ.js} +2 -2
- package/dist/{surface-CYBl8_a3.js.map → surface-BMdG3dKQ.js.map} +1 -1
- package/dist/{surface-C3cxTcJD.cjs → surface-CWwYD_z2.cjs} +1 -1
- package/dist/{surface-C3cxTcJD.cjs.map → surface-CWwYD_z2.cjs.map} +1 -1
- package/dist/surface.cjs +1 -1
- package/dist/surface.js +1 -1
- package/dist/switch.cjs +4 -4
- package/dist/switch.cjs.map +1 -1
- package/dist/switch.js +11 -11
- package/dist/switch.js.map +1 -1
- package/dist/table.cjs +1 -1
- package/dist/table.js +2 -2
- package/dist/{tabs-DHy93Q3N.js → tabs-CDQYDc6v.js} +2 -2
- package/dist/{tabs-DHy93Q3N.js.map → tabs-CDQYDc6v.js.map} +1 -1
- package/dist/{tabs-ORQ_Zd43.cjs → tabs-CbD9E1gd.cjs} +1 -1
- package/dist/{tabs-ORQ_Zd43.cjs.map → tabs-CbD9E1gd.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 +43 -0
- package/dist/textarea-Brgi-vD2.cjs.map +1 -0
- package/dist/{textarea-DHIMt-ly.js → textarea-MPyrMi-S.js} +4 -4
- package/dist/textarea-MPyrMi-S.js.map +1 -0
- package/dist/textarea.cjs +1 -1
- package/dist/textarea.js +1 -1
- package/dist/{theme-CJpjkqHr.cjs → theme-BMbXoqi0.cjs} +1 -1
- package/dist/{theme-CJpjkqHr.cjs.map → theme-BMbXoqi0.cjs.map} +1 -1
- package/dist/{theme-CgI9PRco.js → theme-DZu-xmVp.js} +5 -5
- package/dist/{theme-CgI9PRco.js.map → theme-DZu-xmVp.js.map} +1 -1
- package/dist/{theme-button--FuBkuVr.cjs → theme-button-B0OLb-43.cjs} +1 -1
- package/dist/{theme-button--FuBkuVr.cjs.map → theme-button-B0OLb-43.cjs.map} +1 -1
- package/dist/{theme-button-D-FXb3oO.js → theme-button-D_qGvEYs.js} +2 -2
- package/dist/{theme-button-D-FXb3oO.js.map → theme-button-D_qGvEYs.js.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-BfTK1Wtl.js → theme.service-7VkM-hVf.js} +15 -11
- package/dist/theme.service-7VkM-hVf.js.map +1 -0
- package/dist/theme.service-B15FdjOS.cjs +1 -0
- package/dist/theme.service-B15FdjOS.cjs.map +1 -0
- package/dist/tree.cjs +4 -4
- package/dist/tree.cjs.map +1 -1
- package/dist/tree.js +8 -8
- package/dist/tree.js.map +1 -1
- package/dist/{typography-CxA3sx9B.cjs → typography-D4Fo1UGh.cjs} +3 -3
- package/dist/{typography-CxA3sx9B.cjs.map → typography-D4Fo1UGh.cjs.map} +1 -1
- package/dist/{typography-BEGLfHwz.js → typography-SZhjb_4R.js} +9 -9
- package/dist/{typography-BEGLfHwz.js.map → typography-SZhjb_4R.js.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-B_n4P9az.js → window-BDVyrBnk.js} +101 -100
- package/dist/window-BDVyrBnk.js.map +1 -0
- package/dist/window-BbBYjm7R.cjs +59 -0
- package/dist/window-BbBYjm7R.cjs.map +1 -0
- package/dist/window.cjs +1 -1
- package/dist/window.js +1 -1
- package/package.json +1 -1
- package/skills/schmancy/SKILL.md +17 -11
- package/skills/schmancy/overlay.md +14 -7
- package/skills/schmancy/steps.md +68 -34
- package/src/area/area.component.ts +1 -1
- package/src/area/area.service.test.ts +2 -2
- package/src/area/area.service.ts +1 -1
- package/src/area/lazy.ts +87 -83
- package/src/audio/sound.service.ts +3 -3
- package/src/breadcrumb/breadcrumb.ts +2 -2
- package/src/button/button.ts +11 -11
- package/src/button/icon-button.ts +18 -18
- package/src/card/card.ts +16 -16
- package/src/content-drawer/drawer.ts +6 -6
- package/src/details/details.ts +55 -55
- package/src/directives/ai-badge.ts +2 -1
- package/src/directives/animate-text.ts +2 -1
- package/src/directives/art/art.directive.ts +2 -1
- package/src/directives/battery.ts +2 -1
- package/src/directives/confirm-click.ts +5 -3
- package/src/directives/cursor-glow.ts +2 -1
- package/src/directives/cycle-text.ts +2 -1
- package/src/directives/depth-of-field.ts +2 -1
- package/src/directives/drag.ts +4 -2
- package/src/directives/fyi.ts +2 -1
- package/src/directives/gravity.ts +2 -1
- package/src/directives/hummingbird.ts +2 -1
- package/src/directives/intersect.ts +3 -2
- package/src/directives/liquid.ts +2 -1
- package/src/directives/living-border.ts +2 -1
- package/src/directives/long-press.ts +2 -1
- package/src/directives/magnetic.ts +2 -1
- package/src/directives/missed-punch.ts +2 -1
- package/src/directives/nebula.ts +6 -5
- package/src/directives/overflow-within.ts +2 -1
- package/src/directives/reveal.ts +193 -118
- package/src/directives/urgent.ts +2 -1
- package/src/directives/working-snake.ts +2 -1
- package/src/expand/expand-root.component.ts +27 -27
- package/src/expand/expand.component.ts +48 -48
- package/src/form/fields/autocomplete/autocomplete.ts +154 -154
- package/src/form/fields/checkbox/checkbox.ts +4 -4
- package/src/form/fields/chips/chips.ts +2 -2
- package/src/form/fields/chips/filter-chip.ts +15 -15
- package/src/form/fields/date-range/date-range.ts +2 -2
- package/src/form/fields/input/input.ts +12 -12
- package/src/form/fields/radio-group/radio-button.ts +2 -2
- package/src/form/fields/radio-group/radio-group.ts +3 -3
- package/src/form/fields/select/select.ts +56 -56
- package/src/form/fields/switch/switch.ts +10 -10
- package/src/form/fields/textarea/textarea.ts +2 -2
- package/src/form/form-summary.ts +33 -33
- package/src/form/form.ts +45 -45
- package/src/icons/icon.ts +10 -8
- package/src/iframe/iframe.ts +11 -11
- package/src/lightbox/flip-directive.ts +2 -1
- package/src/lightbox/lightbox.directive.ts +2 -1
- package/src/nav-drawer/navbar.ts +3 -3
- package/src/navigation-rail/navigation-rail.ts +10 -10
- package/src/notification/notification.ts +22 -22
- package/src/overlay/overlay.component.ts +106 -83
- package/src/overlay/overlay.confirm-body.ts +4 -4
- package/src/overlay/overlay.service.ts +3 -3
- package/src/overlay/overlay.types.ts +4 -2
- package/src/splash-screen/splash-screen.ts +11 -11
- package/src/state/index.ts +12 -12
- package/src/state/schmancy-context.ts +9 -9
- package/src/steps/index.ts +1 -1
- package/src/steps/schmancy-step.ts +91 -65
- package/src/steps/{schmancy-steps-container.ts → schmancy-steps.ts} +18 -38
- package/src/steps/steps.context.ts +5 -4
- package/src/steps/steps.test.ts +120 -0
- package/src/teleport/teleport.component.ts +2 -2
- package/src/theme/theme.service.ts +17 -17
- package/src/tree/tree.ts +7 -7
- package/src/typography/typography.ts +7 -7
- package/src/window/window-manager.ts +20 -20
- package/src/window/window.ts +100 -100
- package/types/mixins/SchmancyElement.d.ts +3 -2
- package/types/mixins/formField.mixin.d.ts +1 -1
- package/types/src/area/area.service.d.ts +1 -1
- package/types/src/area/lazy.d.ts +0 -6
- package/types/src/audio/sound.service.d.ts +1 -2
- package/types/src/breadcrumb/breadcrumb.d.ts +1 -1
- package/types/src/button/button.d.ts +3 -3
- package/types/src/button/icon-button.d.ts +6 -7
- package/types/src/card/card.d.ts +5 -5
- package/types/src/content-drawer/drawer.d.ts +1 -1
- package/types/src/details/details.d.ts +2 -21
- package/types/src/directives/ai-badge.d.ts +2 -2
- package/types/src/directives/animate-text.d.ts +2 -2
- package/types/src/directives/art/art.directive.d.ts +2 -2
- package/types/src/directives/battery.d.ts +2 -2
- package/types/src/directives/confirm-click.d.ts +2 -2
- package/types/src/directives/cursor-glow.d.ts +2 -2
- package/types/src/directives/cycle-text.d.ts +2 -2
- package/types/src/directives/depth-of-field.d.ts +2 -2
- package/types/src/directives/drag.d.ts +4 -4
- package/types/src/directives/fyi.d.ts +2 -2
- package/types/src/directives/gravity.d.ts +2 -2
- package/types/src/directives/hummingbird.d.ts +2 -2
- package/types/src/directives/intersect.d.ts +2 -2
- package/types/src/directives/liquid.d.ts +2 -2
- package/types/src/directives/living-border.d.ts +2 -2
- package/types/src/directives/long-press.d.ts +2 -2
- package/types/src/directives/magnetic.d.ts +2 -2
- package/types/src/directives/missed-punch.d.ts +2 -2
- package/types/src/directives/nebula.d.ts +2 -2
- package/types/src/directives/overflow-within.d.ts +2 -2
- package/types/src/directives/reveal.d.ts +17 -7
- package/types/src/directives/urgent.d.ts +2 -2
- package/types/src/directives/working-snake.d.ts +2 -2
- package/types/src/expand/expand-root.component.d.ts +8 -8
- package/types/src/expand/expand.component.d.ts +11 -11
- package/types/src/form/fields/autocomplete/autocomplete.d.ts +29 -29
- package/types/src/form/fields/checkbox/checkbox.d.ts +1 -1
- package/types/src/form/fields/chips/chips.d.ts +1 -1
- package/types/src/form/fields/chips/filter-chip.d.ts +1 -2
- package/types/src/form/fields/input/input.d.ts +3 -3
- package/types/src/form/fields/radio-group/radio-button.d.ts +1 -1
- package/types/src/form/fields/radio-group/radio-group.d.ts +1 -1
- package/types/src/form/fields/select/select.d.ts +8 -8
- package/types/src/form/fields/switch/switch.d.ts +3 -3
- package/types/src/form/fields/textarea/textarea.d.ts +1 -1
- package/types/src/form/form-summary.d.ts +7 -7
- package/types/src/form/form.d.ts +11 -11
- package/types/src/icons/icon.d.ts +2 -2
- package/types/src/iframe/iframe.d.ts +3 -3
- package/types/src/lightbox/flip-directive.d.ts +2 -2
- package/types/src/lightbox/lightbox.directive.d.ts +2 -2
- package/types/src/nav-drawer/navbar.d.ts +1 -1
- package/types/src/navigation-rail/navigation-rail.d.ts +2 -2
- package/types/src/notification/notification.d.ts +8 -8
- package/types/src/overlay/overlay.component.d.ts +16 -16
- package/types/src/overlay/overlay.confirm-body.d.ts +1 -1
- package/types/src/overlay/overlay.types.d.ts +4 -2
- package/types/src/splash-screen/splash-screen.d.ts +2 -2
- package/types/src/state/index.d.ts +1 -1
- package/types/src/state/schmancy-context.d.ts +3 -3
- package/types/src/steps/index.d.ts +1 -1
- package/types/src/steps/schmancy-step.d.ts +8 -23
- package/types/src/steps/{schmancy-steps-container.d.ts → schmancy-steps.d.ts} +8 -9
- package/types/src/steps/steps.context.d.ts +2 -1
- package/types/src/steps/steps.test.d.ts +2 -0
- package/types/src/teleport/teleport.component.d.ts +1 -1
- package/types/src/theme/theme.service.d.ts +1 -4
- package/types/src/tree/tree.d.ts +3 -3
- package/types/src/typography/typography.d.ts +1 -1
- package/types/src/window/window-manager.d.ts +2 -2
- package/types/src/window/window.d.ts +20 -20
- package/dist/SchmancyElement-BBzRWB1w.cjs +0 -2
- package/dist/SchmancyElement-C3CpdNsi.js +0 -284
- package/dist/area-BA96mwFY.js.map +0 -1
- package/dist/area-DtyQDdOF.cjs +0 -21
- package/dist/area-DtyQDdOF.cjs.map +0 -1
- package/dist/autocomplete-Bts5Jwwr.cjs +0 -115
- package/dist/autocomplete-Bts5Jwwr.cjs.map +0 -1
- package/dist/autocomplete-CI4QJXAN.js.map +0 -1
- package/dist/button-C89bPnHt.js.map +0 -1
- package/dist/button-CkwQH-g3.cjs +0 -62
- package/dist/button-CkwQH-g3.cjs.map +0 -1
- package/dist/card-BO93_oxQ.cjs.map +0 -1
- package/dist/card-CFsCgJKZ.js.map +0 -1
- package/dist/chips-6YaoRmeG.js.map +0 -1
- package/dist/chips-BfzpsyV1.cjs.map +0 -1
- package/dist/date-range-CEo_Kjqw.js.map +0 -1
- package/dist/date-range-N-A249O9.cjs.map +0 -1
- package/dist/details-BLRPV8sY.cjs +0 -164
- package/dist/details-BLRPV8sY.cjs.map +0 -1
- package/dist/details-GtpfI2hA.js.map +0 -1
- package/dist/directives-C2dXgpCY.js.map +0 -1
- package/dist/directives-CvYGSW_a.cjs.map +0 -1
- package/dist/expand-FcKAzJta.js.map +0 -1
- package/dist/expand-tffQHGbZ.cjs +0 -141
- package/dist/expand-tffQHGbZ.cjs.map +0 -1
- package/dist/form-H24puioV.js.map +0 -1
- package/dist/form-VYhbbir3.cjs +0 -27
- package/dist/form-VYhbbir3.cjs.map +0 -1
- package/dist/icons-B_a1HStW.cjs +0 -24
- package/dist/icons-B_a1HStW.cjs.map +0 -1
- package/dist/icons-DBxfN91B.js.map +0 -1
- package/dist/iframe-BDVElN8z.js.map +0 -1
- package/dist/iframe-CG-z9qev.cjs.map +0 -1
- package/dist/input-B14Nn6xD.cjs.map +0 -1
- package/dist/input-Bt_o4sYo.js.map +0 -1
- package/dist/lazy-CayEFyC3.cjs +0 -1
- package/dist/lazy-CayEFyC3.cjs.map +0 -1
- package/dist/lazy-D-bO2r4m.js +0 -13
- package/dist/lazy-D-bO2r4m.js.map +0 -1
- package/dist/lightbox-B47Zoqv-.cjs.map +0 -1
- package/dist/lightbox-ZmuoBBFT.js.map +0 -1
- package/dist/mixins-DPdzC9ZH.cjs.map +0 -1
- package/dist/mixins-DTzfFVyv.js.map +0 -1
- package/dist/notification-Ccktcj9H.js.map +0 -1
- package/dist/notification-DSkB-sn0.cjs +0 -24
- package/dist/notification-DSkB-sn0.cjs.map +0 -1
- package/dist/overlay-BS-ta-zq.cjs +0 -58
- package/dist/overlay-BS-ta-zq.cjs.map +0 -1
- package/dist/overlay-H3Wt_dgQ.js.map +0 -1
- package/dist/overlay.confirm-body-CR9xaqOE.cjs.map +0 -1
- package/dist/overlay.confirm-body-Dxn_wNm3.js.map +0 -1
- package/dist/overlay.service-DEj3rfRr.cjs +0 -1
- package/dist/radio-group-1HCpzRUB.js.map +0 -1
- package/dist/radio-group-DbYlyPc-.cjs.map +0 -1
- package/dist/select-B-SSmUDe.cjs +0 -56
- package/dist/select-B-SSmUDe.cjs.map +0 -1
- package/dist/select-CEyhNtZ2.js.map +0 -1
- package/dist/sound.service-DO4SmUUT.js.map +0 -1
- package/dist/sound.service-G_8GV_6L.cjs.map +0 -1
- package/dist/splash-screen-B1mM4_xz.js.map +0 -1
- package/dist/splash-screen-cbz4bxjB.cjs.map +0 -1
- package/dist/src-czeiuT1m.cjs.map +0 -1
- package/dist/src-tncsWsTY.js.map +0 -1
- package/dist/textarea-CEUaDURR.cjs +0 -43
- package/dist/textarea-CEUaDURR.cjs.map +0 -1
- package/dist/textarea-DHIMt-ly.js.map +0 -1
- package/dist/theme.service-BfTK1Wtl.js.map +0 -1
- package/dist/theme.service-Dg7LO0Qz.cjs +0 -1
- package/dist/theme.service-Dg7LO0Qz.cjs.map +0 -1
- package/dist/window-B_n4P9az.js.map +0 -1
- package/dist/window-Vl1u1-EG.cjs +0 -59
- package/dist/window-Vl1u1-EG.cjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mixins-DPdzC9ZH.cjs","names":[],"sources":["../mixins/formField.mixin.ts","../mixins/litElement.mixin.ts","../src/surface/surface.styles.ts","../mixins/surface.mixin.ts"],"sourcesContent":["import { CSSResult, LitElement, PropertyValueMap } from 'lit'\nimport { property, state } from 'lit/decorators.js'\nimport { IBaseMixin } from './baseElement'\nimport { Constructor } from './constructor'\nimport { ITailwindElementMixin } from './tailwind.mixin'\nimport { SchmancyElement } from './SchmancyElement'\n\n/**\n * Cross-realm brand used by `<schmancy-form>` to discover form fields by\n * inheritance rather than tag-name allowlists. `Symbol.for` puts the symbol in\n * the global registry so detection works across module realms/bundles.\n */\nexport const SCHMANCY_FORM_FIELD = Symbol.for('schmancy.form-field')\n\n/**\n * Composed event a field dispatches in `connectedCallback`. `<schmancy-form>`\n * subscribes via `fromEvent(this, FIELD_CONNECT_EVENT)` and adds the field to\n * its registry. No matching disconnect event — composed events from a\n * disconnected node have an empty composed path; cleanup is via `isConnected`\n * filter at iteration time.\n */\nexport const FIELD_CONNECT_EVENT = 'schmancy:field:connect'\n\n/**\n * Validation modes.\n * - `dirty` (default per Revolute) — show errors only after value diverged.\n * - `touched` — show errors after first blur, even if value unchanged.\n * - `always` — show errors immediately (live search).\n * - `submitted` — hold all errors until submit (wizard step).\n * - `length` — fire validation only when `value.length` reaches `maxlength`\n * (Stripe pattern for predictable-length fields: ZIP, phone, card number).\n */\nexport type ValidateOn = 'always' | 'touched' | 'dirty' | 'submitted' | 'length'\n\n/**\n * Per-field error-message override map. Keys are `ValidityState` flag names;\n * values are the message to display when that flag is set. Unset flags fall\n * back to the mixin's hardcoded defaults (English).\n *\n * Use for i18n or domain-specific copy:\n * ```ts\n * <schmancy-input\n * .errorMessages=${{ valueMissing: 'Adresse e-mail requise', typeMismatch: 'Format e-mail invalide' }}\n * type=\"email\" required\n * ></schmancy-input>\n * ```\n */\nexport type ErrorMessages = Partial<Record<keyof ValidityState, string>>\n\n/**\n * Interface defining the properties and methods that the FormFieldMixin adds.\n */\nexport interface IFormFieldMixin extends Element {\n\tname: string\n\tvalue: string | string[] | boolean | number | undefined\n\tlabel: string\n\trequired: boolean\n\tdisabled: boolean\n\treadonly: boolean\n\terror: boolean\n\tvalidationMessage: string\n\thint?: string\n\tid: string\n\n\t/** Set to `true` once the user has blurred the field at least once. */\n\ttouched: boolean\n\t/** `true` when the current value differs from the captured default. */\n\tdirty: boolean\n\t/** Inverse of `dirty`. */\n\tpristine: boolean\n\t/** Set to `true` by `<schmancy-form>` on submit (forces error display). */\n\tsubmitted: boolean\n\t/** Validation mode — controls when errors display. Default `'dirty'`. */\n\tvalidateOn: ValidateOn\n\n\t/**\n\t * Per-field error-message override map (i18n hook). See `ErrorMessages`.\n\t * Unset keys fall back to the mixin's hardcoded English defaults.\n\t */\n\terrorMessages?: ErrorMessages\n\n\t/**\n\t * `ElementInternals` instance attached by the mixin. Exposed so subclasses\n\t * with non-standard validity semantics (date-range, multi-select) can\n\t * surface platform `ValidityStateFlags` directly via\n\t * `internals.setValidity({ valueMissing: true })` rather than rolling their\n\t * own `attachInternals` call.\n\t */\n\tinternals: ElementInternals | undefined\n\n\tform: HTMLFormElement | null\n\n\tcheckValidity(): boolean\n\treportValidity(): boolean\n\tsetCustomValidity(message: string): void\n\n\t/** Mark the field as touched (component should call on blur). */\n\tmarkTouched(): void\n\t/** Mark the field as submitted (called by `<schmancy-form>` on submit). */\n\tmarkSubmitted(): void\n\t/**\n\t * Clear the `submitted` flag without resetting value/touched/error.\n\t * Used by wizards: stepping back from step N to step N-1 should not\n\t * leave step N-1's fields in aggressive \"show all errors\" mode.\n\t */\n\tclearSubmitted(): void\n\n\t/**\n\t * `true` while an async validator is in flight. Broadcast as\n\t * `:state(validating)`. `<schmancy-form>` blocks submit until every\n\t * registered field's `isValidating` is back to `false`.\n\t */\n\tisValidating: boolean\n\n\t/**\n\t * Run an async validator. While the promise is pending, `isValidating` is\n\t * `true` and `:state(validating)` is broadcast. On resolve, the returned\n\t * string is passed to `setCustomValidity` — empty string clears any\n\t * existing custom error; non-empty marks the field invalid with that\n\t * message.\n\t *\n\t * Submitting the form while a validator is pending is queued — the form\n\t * waits for `Promise.all(pending validators)` to settle before proceeding.\n\t */\n\trunAsyncValidator(fn: () => Promise<string>): Promise<void>\n\n\t/**\n\t * Whether the gate for showing validation errors is open right now. Exposed\n\t * so subclasses with custom error-display channels (e.g. select renders\n\t * errors on a child input) can keep their gate consistent with the mixin's.\n\t * Subclasses should not override this — extend the truth table by changing\n\t * `validateOn` instead.\n\t */\n\t_shouldShowError(): boolean\n\n\ttoFormEntries(): Array<[string, FormDataEntryValue]>\n\tresetForm(): void\n\n\temitChange(detail: any): void\n}\n\n/** Predicate used by `<schmancy-form>` to detect mixin descendants. */\nexport function isSchmancyFormField(el: unknown): el is IFormFieldMixin {\n\treturn !!el && typeof el === 'object' && (el as any).constructor?.[SCHMANCY_FORM_FIELD] === true\n}\n\n/**\n * A mixin that adds form field capabilities to a LitElement class.\n * Components that extend this mixin are automatically discovered and\n * collected by `<schmancy-form>` — no tag-name registration needed.\n *\n * Subclasses may override `toFormEntries()` to contribute multiple\n * name/value pairs to FormData (e.g. date-range, tag-input).\n *\n * @example\n * ```ts\n * class MyInput extends FormFieldMixin(TailwindElement(css`...`)) {\n * // Your component code here\n * }\n * ```\n */\nexport function FormFieldMixin<T extends Constructor<LitElement>>(superClass: T) {\n\tclass FormFieldMixinClass extends superClass {\n\t\tstatic formAssociated = true\n\n\t\t/** Brand for cross-realm detection by `<schmancy-form>`. */\n\t\tstatic readonly [SCHMANCY_FORM_FIELD] = true\n\n\t\t// Element internals for form association\n\t\tinternals: ElementInternals | undefined\n\n\t\t/** Value snapshot captured at first render, used by `resetForm()`. */\n\t\tprotected _defaultValue: string | string[] | boolean | number | undefined = undefined\n\n\t\t@property({ type: String })\n\t\tname: string = ''\n\n\t\t@property({ reflect: true })\n\t\tvalue: string | string[] | boolean | number | undefined = ''\n\n\t\t@property({ type: String })\n\t\tlabel: string = ''\n\n\t\t@property({ type: Boolean, reflect: true })\n\t\trequired: boolean = false\n\n\t\t@property({ type: Boolean, reflect: true })\n\t\tdisabled: boolean = false\n\n\t\t@property({ type: Boolean, reflect: true })\n\t\treadonly: boolean = false\n\n\t\t@property({ type: Boolean, reflect: true })\n\t\terror: boolean = false\n\n\t\t@property({ type: String })\n\t\tvalidationMessage: string = ''\n\n\t\t@property({ type: String })\n\t\thint?: string\n\n\t\t@property({ reflect: true })\n\t\toverride id: string = `schmancy-field-${Date.now()}-${Math.floor(Math.random() * 1000)}`\n\n\t\t// ----- Validation UX state (Revolute contract) -----\n\n\t\t/** True after the user has blurred the field at least once. */\n\t\t@state() touched: boolean = false\n\n\t\t/** Set by `<schmancy-form>` on submit; persists until `resetForm()`. */\n\t\t@state() submitted: boolean = false\n\n\t\t/**\n\t\t * When errors display. Default `'dirty'` — the autofocus+cancel anti-pattern\n\t\t * is avoided because pristine fields never show errors until submit.\n\t\t */\n\t\t@property({ type: String, reflect: true })\n\t\tvalidateOn: ValidateOn = 'dirty'\n\n\t\t/**\n\t\t * Optional override for the validity-flag → message map. See\n\t\t * `ErrorMessages`. Unset keys fall back to the mixin's defaults.\n\t\t */\n\t\t@property({ attribute: false })\n\t\terrorMessages?: ErrorMessages\n\n\t\t/** True when value has been changed from the captured default. */\n\t\tget dirty(): boolean {\n\t\t\treturn this._defaultValue !== undefined && this.value !== this._defaultValue\n\t\t}\n\n\t\tget pristine(): boolean {\n\t\t\treturn !this.dirty\n\t\t}\n\n\t\tmarkTouched(): void {\n\t\t\tif (!this.touched) this.touched = true\n\t\t}\n\n\t\tmarkSubmitted(): void {\n\t\t\tif (!this.submitted) this.submitted = true\n\t\t}\n\n\t\tclearSubmitted(): void {\n\t\t\tif (this.submitted) this.submitted = false\n\t\t}\n\n\t\t/**\n\t\t * Reactive flag set while an async validator is in flight. Read by\n\t\t * `<schmancy-form>` to gate submit; broadcast as `:state(validating)`\n\t\t * for CSS spinner targeting.\n\t\t */\n\t\t@state() isValidating: boolean = false\n\n\t\tasync runAsyncValidator(fn: () => Promise<string>): Promise<void> {\n\t\t\tif (this.isValidating) {\n\t\t\t\t// Cancel-by-supersede semantics — a new call wins; the previous\n\t\t\t\t// is best-effort and its result is dropped if it resolves later.\n\t\t\t\tthis._asyncValidatorEpoch++\n\t\t\t}\n\t\t\tconst epoch = ++this._asyncValidatorEpoch\n\t\t\tthis.isValidating = true\n\t\t\ttry {\n\t\t\t\tconst message = await fn()\n\t\t\t\tif (epoch !== this._asyncValidatorEpoch) return // superseded\n\t\t\t\tthis.setCustomValidity(message)\n\t\t\t} finally {\n\t\t\t\tif (epoch === this._asyncValidatorEpoch) {\n\t\t\t\t\tthis.isValidating = false\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tprivate _asyncValidatorEpoch: number = 0\n\n\t\t/**\n\t\t * Whether `checkValidity()` should display errors right now.\n\t\t * `submitted` overrides every mode — once a submit attempt happens, the\n\t\t * field stays in live-correction mode (Phase 3) for the rest of the\n\t\t * session, and `resetForm()` is the only way back. The leading\n\t\t * underscore marks this as an internal API: subclasses may call it but\n\t\t * should not override it (extend the truth table by changing\n\t\t * `validateOn` instead).\n\t\t */\n\t\t_shouldShowError(): boolean {\n\t\t\tif (this.submitted) return true\n\t\t\tswitch (this.validateOn) {\n\t\t\t\tcase 'always':\n\t\t\t\t\treturn true\n\t\t\t\tcase 'touched':\n\t\t\t\t\treturn this.touched\n\t\t\t\tcase 'dirty':\n\t\t\t\t\treturn this.dirty\n\t\t\t\tcase 'submitted':\n\t\t\t\t\treturn false\n\t\t\t\tcase 'length':\n\t\t\t\t\t// Predictable-length fields: validate once value reaches the\n\t\t\t\t\t// maxlength constraint. Stripe pattern. Falls back to dirty\n\t\t\t\t\t// if no maxlength is set.\n\t\t\t\t\tif (typeof this.value === 'string') {\n\t\t\t\t\t\tconst max = (this as unknown as { maxlength?: number }).maxlength\n\t\t\t\t\t\tif (typeof max === 'number' && max > 0) {\n\t\t\t\t\t\t\treturn this.value.length >= max\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this.dirty\n\t\t\t}\n\t\t}\n\n\t\tconstructor(...args: any[]) {\n\t\t\tsuper(...args)\n\t\t\ttry {\n\t\t\t\tthis.internals = this.attachInternals()\n\t\t\t} catch {\n\t\t\t\tthis.internals = undefined\n\t\t\t}\n\t\t}\n\n\t\toverride connectedCallback(): void {\n\t\t\tsuper.connectedCallback()\n\t\t\t// Register with any ancestor <schmancy-form> via composed event.\n\t\t\tthis.dispatchEvent(\n\t\t\t\tnew CustomEvent(FIELD_CONNECT_EVENT, {\n\t\t\t\t\tdetail: this,\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true,\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\n\t\t/** The form this element is associated with (native FACE behavior). */\n\t\tget form(): HTMLFormElement | null {\n\t\t\treturn this.internals?.form ?? null\n\t\t}\n\n\t\tprotected firstUpdated(changedProps: PropertyValueMap<any>): void {\n\t\t\tsuper.firstUpdated?.(changedProps)\n\t\t\tif (this._defaultValue === undefined) this._defaultValue = this.value\n\t\t\t// Sync platform validity (`internals.setValidity`) once after first\n\t\t\t// render so `<form>.checkValidity()` and `:invalid` reflect truth\n\t\t\t// even when no property change has fired through `willUpdate` yet\n\t\t\t// (e.g. for required-empty fields with class-field-initialized\n\t\t\t// defaults that Lit doesn't see as \"changed\" on the first cycle).\n\t\t\tthis.checkValidity()\n\t\t}\n\n\t\tprotected willUpdate(changedProps: PropertyValueMap<any>): void {\n\t\t\tsuper.willUpdate(changedProps)\n\n\t\t\tif (changedProps.has('value')) {\n\t\t\t\tthis.internals?.setFormValue(this.value as string | File | FormData | null)\n\t\t\t\t// :state(dirty) tracks value-vs-default; recompute on every value change.\n\t\t\t\tif (this.dirty) this.internals?.states.add('dirty')\n\t\t\t\telse this.internals?.states.delete('dirty')\n\t\t\t\t// Always sync platform validity (internals.setValidity) so\n\t\t\t\t// `<form>.checkValidity()` and `:invalid` reflect truth, even\n\t\t\t\t// while the visual `error` gate stays closed for pristine\n\t\t\t\t// fields under `validateOn: 'dirty'`. The visibility gate is\n\t\t\t\t// inside checkValidity() itself.\n\t\t\t\tthis.checkValidity()\n\t\t\t}\n\n\t\t\tif (changedProps.has('required') || changedProps.has('disabled')) {\n\t\t\t\tthis.checkValidity()\n\t\t\t}\n\n\t\t\tif (changedProps.has('isValidating')) {\n\t\t\t\tif (this.isValidating) this.internals?.states.add('validating')\n\t\t\t\telse this.internals?.states.delete('validating')\n\t\t\t}\n\n\t\t\tif (changedProps.has('touched')) {\n\t\t\t\tif (this.touched) this.internals?.states.add('touched')\n\t\t\t\telse this.internals?.states.delete('touched')\n\t\t\t\t// Phase 2 — blur on a dirty field. Validate to surface the error.\n\t\t\t\tif (this.touched && this.dirty) this.checkValidity()\n\t\t\t}\n\n\t\t\tif (changedProps.has('submitted')) {\n\t\t\t\tif (this.submitted) {\n\t\t\t\t\tthis.internals?.states.add('submitted')\n\t\t\t\t\t// Phase 4 — submit forces error display regardless of dirty/touched.\n\t\t\t\t\tthis.checkValidity()\n\t\t\t\t} else {\n\t\t\t\t\tthis.internals?.states.delete('submitted')\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Note: we do not write to `internals.setValidity` from willUpdate\n\t\t\t// based on `error` / `validationMessage` changes. `checkValidity`\n\t\t\t// and `setCustomValidity` are the sole writers — overwriting the\n\t\t\t// validity flags from willUpdate would clobber structured flags\n\t\t\t// set by subclass overrides (e.g. input.ts surfaces typeMismatch /\n\t\t\t// patternMismatch / tooShort / etc.).\n\n\t\t\tif (changedProps.has('error')) {\n\t\t\t\tif (this.error) this.internals?.states.add('invalid')\n\t\t\t\telse this.internals?.states.delete('invalid')\n\t\t\t\t// ARIA reflection through ElementInternals reaches AT through shadow DOM.\n\t\t\t\tif (this.internals) this.internals.ariaInvalid = this.error ? 'true' : 'false'\n\t\t\t}\n\n\t\t\tif (changedProps.has('required') || changedProps.has('disabled')) {\n\t\t\t\tif (this.required) this.internals?.states.add('required')\n\t\t\t\telse this.internals?.states.delete('required')\n\t\t\t\t// Suppress aria-required when disabled — disabled fields shouldn't\n\t\t\t\t// announce as required to assistive tech.\n\t\t\t\tif (this.internals) {\n\t\t\t\t\tthis.internals.ariaRequired = this.required && !this.disabled ? 'true' : 'false'\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (changedProps.has('disabled')) {\n\t\t\t\tif (this.disabled) this.internals?.states.add('disabled')\n\t\t\t\telse this.internals?.states.delete('disabled')\n\t\t\t}\n\t\t\tif (changedProps.has('readonly')) {\n\t\t\t\tif (this.readonly) this.internals?.states.add('readonly')\n\t\t\t\telse this.internals?.states.delete('readonly')\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Native FACE lifecycle — called by the browser when the owning form\n\t\t * is reset. Delegates to `resetForm()` so subclasses have one\n\t\t * override point for both programmatic and user-initiated resets.\n\t\t */\n\t\tformResetCallback(): void {\n\t\t\tthis.resetForm()\n\t\t}\n\n\t\t/** Native FACE lifecycle — called when the form's disabled state changes. */\n\t\tformDisabledCallback(disabled: boolean): void {\n\t\t\tthis.disabled = disabled\n\t\t}\n\n\t\t/**\n\t\t * Native FACE lifecycle — restore value after bfcache / form autofill.\n\t\t */\n\t\tformStateRestoreCallback(state: string | File | FormData | null): void {\n\t\t\tif (state == null) return\n\t\t\tthis.value = state as any\n\t\t}\n\n\t\t/** Override to customize reset behavior; default restores `_defaultValue`. */\n\t\tresetForm(): void {\n\t\t\tthis.value = this._defaultValue ?? ''\n\t\t\tthis.error = false\n\t\t\tthis.validationMessage = ''\n\t\t\tthis.touched = false\n\t\t\tthis.submitted = false\n\t\t\tthis.internals?.setValidity({})\n\t\t}\n\n\t\t/**\n\t\t * Contribute entries to a parent FormData. Default: a single\n\t\t * `[name, value]` pair when `name` is set and value is meaningful.\n\t\t * Override for multi-entry controls (e.g. date range).\n\t\t */\n\t\ttoFormEntries(): Array<[string, FormDataEntryValue]> {\n\t\t\tif (!this.name || this.disabled) return []\n\t\t\tconst v = this.value\n\t\t\tif (v === undefined || v === null || v === '') return []\n\t\t\tif (Array.isArray(v)) return v.map(item => [this.name, String(item)] as [string, FormDataEntryValue])\n\t\t\tif (typeof v === 'boolean') return v ? [[this.name, 'on']] : []\n\t\t\treturn [[this.name, String(v)]]\n\t\t}\n\n\t\tcheckValidity(): boolean {\n\t\t\tif (this.disabled) {\n\t\t\t\tthis.internals?.setValidity({})\n\t\t\t\treturn true\n\t\t\t}\n\n\t\t\tconst requiredFailed =\n\t\t\t\tthis.required && (this.value === '' || this.value === undefined || this.value === null)\n\t\t\t// Custom errors set via setCustomValidity() are platform-truth too —\n\t\t\t// preserve them through re-validation cycles.\n\t\t\tconst customErrorSet = !!this.internals?.validity?.customError\n\t\t\tconst isValid = !requiredFailed && !customErrorSet\n\t\t\tconst requiredMessage =\n\t\t\t\tthis.errorMessages?.valueMissing ?? 'This field is required'\n\t\t\tconst defaultMessage = requiredFailed ? requiredMessage : 'Invalid value'\n\n\t\t\t// Platform validity (read by `form.checkValidity()` and `:invalid`)\n\t\t\t// is always set to the truth — independent of the visual gate.\n\t\t\tif (requiredFailed) {\n\t\t\t\tthis.internals?.setValidity(\n\t\t\t\t\t{ valueMissing: true },\n\t\t\t\t\tthis.validationMessage || defaultMessage,\n\t\t\t\t)\n\t\t\t} else if (!customErrorSet) {\n\t\t\t\t// No required failure, no custom error — clear flags.\n\t\t\t\tthis.internals?.setValidity({})\n\t\t\t}\n\t\t\t// (customErrorSet branch falls through — leave the custom validity intact.)\n\n\t\t\t// Visual `error` flag is gated. The returned boolean tells the caller\n\t\t\t// the truth; only the in-component error display is suppressed for\n\t\t\t// pristine fields under `validateOn: 'dirty'`.\n\t\t\tif (this._shouldShowError()) {\n\t\t\t\tthis.error = !isValid\n\t\t\t\tif (!isValid && !this.validationMessage) {\n\t\t\t\t\tthis.validationMessage = defaultMessage\n\t\t\t\t} else if (isValid) {\n\t\t\t\t\tthis.validationMessage = ''\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn isValid\n\t\t}\n\n\t\treportValidity(): boolean {\n\t\t\tconst isValid = this.checkValidity()\n\t\t\tif (!isValid) this.internals?.reportValidity()\n\t\t\treturn isValid\n\t\t}\n\n\t\tsetCustomValidity(message: string): void {\n\t\t\tthis.validationMessage = message\n\t\t\tthis.error = message !== ''\n\t\t\tif (message) {\n\t\t\t\tthis.internals?.setValidity({ customError: true }, message)\n\t\t\t} else {\n\t\t\t\tthis.internals?.setValidity({})\n\t\t\t}\n\t\t}\n\n\t\temitChange(detail: any): void {\n\t\t\tif ('dispatchScopedEvent' in this && typeof this.dispatchScopedEvent === 'function') {\n\t\t\t\tthis.dispatchScopedEvent('change', detail, { bubbles: true })\n\t\t\t} else {\n\t\t\t\tthis.dispatchEvent(\n\t\t\t\t\tnew CustomEvent('change', {\n\t\t\t\t\t\tdetail,\n\t\t\t\t\t\tbubbles: true,\n\t\t\t\t\t\tcomposed: true,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t}\n\n\treturn FormFieldMixinClass as Constructor<IFormFieldMixin> & T\n}\n\n/**\n * A convenience function that composes FormFieldMixin with SchmancyElement\n * to create a base class for Schmancy form components. Subclasses gain the\n * full SchmancyElement stack (SignalWatcher, _activeHost wrap, AbortSignal,\n * automatic Tailwind injection) plus the form-field semantics.\n */\nexport function SchmancyFormField<T extends CSSResult>(componentStyle?: T) {\n\tclass StyledSchmancyElement extends SchmancyElement {\n\t\tstatic styles = componentStyle ? [componentStyle] : []\n\t}\n\treturn FormFieldMixin(StyledSchmancyElement) as unknown as Constructor<IFormFieldMixin> &\n\t\tConstructor<ITailwindElementMixin> &\n\t\tConstructor<LitElement> &\n\t\tConstructor<IBaseMixin>\n}\n","import { CSSResult, LitElement } from 'lit'\nimport { IBaseMixin } from './baseElement'\nimport { Constructor } from './constructor'\nimport { SchmancyElement } from './SchmancyElement'\n\n/**\n * @deprecated Extend `SchmancyElement` directly and declare `static styles`.\n *\n * Before: extends $LitElement(css`...`)\n * After: extends SchmancyElement { static styles = [css`...`] }\n *\n * Kept as a thin alias for the migration window; will be removed in the next\n * major Schmancy release. The returned class extends `SchmancyElement` so\n * runtime semantics (Tailwind injection, `disconnecting` Subject,\n * `disconnectedSignal` AbortSignal, SignalWatcher) match exactly.\n */\nexport const $LitElement = <T extends CSSResult>(componentStyle?: T) => {\n\tclass LegacyAlias extends SchmancyElement {\n\t\tstatic styles = componentStyle ? [componentStyle] : []\n\t}\n\treturn LegacyAlias as CustomElementConstructor &\n\t\tConstructor<LitElement> &\n\t\tConstructor<IBaseMixin>\n}\n","import { css } from 'lit'\n\n/**\n * Luminous Glass surface type styles.\n *\n * Depth model: blur intensity + opacity replaces M3 tonal hierarchy.\n * - solid: opaque ground (0 blur, 100% opacity)\n * - subtle: frosted panel (4px blur, ~72% opacity)\n * - glass: full frosted glass (20px blur, ~55% opacity)\n * - luminous: glass + glow halo (24px blur, ~22% opacity)\n */\nexport const surfaceTypeStyles = css`\n\t/* ================================================================\n\t STRUCTURAL TYPES — All-glass depth model.\n\t Nothing is opaque. Every layer is translucent.\n\t Blur creates readability. Light borders isolate layers.\n\t Rule: text must ALWAYS be readable on every surface.\n\t ================================================================ */\n\n\t/* Solid — dense glass, high readability ground layer (no blur — 92% opacity is enough) */\n\t:host([type='solid']) {\n\t\t--glass-base: var(--schmancy-sys-color-surface-lowest);\n\t\t--glass-tint: var(--schmancy-sys-color-surface-on);\n\t\tbackground: color-mix(in srgb, var(--glass-base) 92%, transparent);\n\t\tcolor: var(--schmancy-sys-color-surface-on);\n\t}\n\n\t/* Subtle — bright vibrant glass: near-white tint, saturated blur, top-edge highlight */\n\t:host([type='subtle']) {\n\t\t--glass-base: var(--schmancy-sys-color-surface-lowest);\n\t\t--glass-tint: var(--schmancy-sys-color-surface-on);\n\t\tbackground: color-mix(in srgb, var(--glass-base) 30%, transparent);\n\t\tbackdrop-filter: blur(12px) saturate(160%);\n\t\t-webkit-backdrop-filter: blur(12px) saturate(160%);\n\t\tborder: 1px solid color-mix(in srgb, var(--schmancy-sys-color-outlineVariant) 60%, transparent);\n\t\tbox-shadow: inset 0 1px 0 color-mix(in srgb, var(--schmancy-sys-color-surface-on) 8%, transparent);\n\t\tcolor: var(--schmancy-sys-color-surface-on);\n\t}\n\n\t/* Glass — frosted glass, blur ensures readability */\n\t:host([type='glass']) {\n\t\t--glass-base: var(--schmancy-sys-color-surface-lowest);\n\t\t--glass-tint: var(--schmancy-sys-color-surface-on);\n\n\t\tbackground: color-mix(in srgb, var(--glass-base) 55%, transparent);\n\t\tbackdrop-filter: blur(16px) saturate(180%) brightness(1.05);\n\t\t-webkit-backdrop-filter: blur(16px) saturate(180%) brightness(1.05);\n\t\tcolor: var(--schmancy-sys-color-surface-on);\n\t\tcontain: content;\n\t\tposition: relative;\n\t\toverflow: hidden;\n\t\tisolation: isolate;\n\t}\n\n\t/* Luminous — glass + glow halo, heavy blur keeps readability */\n\t:host([type='luminous']) {\n\t\t--glass-base: var(--schmancy-sys-color-surface-lowest);\n\t\t--glass-tint: var(--schmancy-sys-color-surface-on);\n\t\t--glow-color: var(--schmancy-sys-color-primary-default);\n\n\t\tbackground: color-mix(in srgb, var(--glass-base) 42%, transparent);\n\t\tbackdrop-filter: blur(20px) saturate(200%) brightness(1.08);\n\t\t-webkit-backdrop-filter: blur(20px) saturate(200%) brightness(1.08);\n\t\tcolor: var(--schmancy-sys-color-surface-on);\n\t\tcontain: content;\n\t\tposition: relative;\n\t\toverflow: hidden;\n\t\tisolation: isolate;\n\t}\n\n\t/* ================================================================\n\t UTILITY TYPES\n\t ================================================================ */\n\n\t/* Transparent — no background */\n\t:host([type='transparent']) {\n\t\tbackground-color: transparent;\n\t\tcolor: var(--schmancy-sys-color-surface-on);\n\t}\n\n\t/* Outlined — border with luminous hover potential */\n\t:host([type='outlined']) {\n\t\tbackground-color: transparent;\n\t\tcolor: var(--schmancy-sys-color-surface-on);\n\t\tborder: 1px solid var(--schmancy-sys-color-outlineVariant);\n\t\ttransition: border-color 300ms ease, box-shadow 300ms ease;\n\t}\n\n\t/* ================================================================\n\t SEMANTIC TYPES — tinted glass for status/role\n\t ================================================================ */\n\n\t:host([type='primary']) {\n\t\tbackground: color-mix(in srgb, var(--schmancy-sys-color-primary-default) 12%, transparent);\n\t\tbackdrop-filter: blur(4px) saturate(140%);\n\t\t-webkit-backdrop-filter: blur(4px) saturate(140%);\n\t\tcolor: var(--schmancy-sys-color-primary-default);\n\t}\n\t:host([type='secondary']) {\n\t\tbackground: color-mix(in srgb, var(--schmancy-sys-color-secondary-default) 12%, transparent);\n\t\tbackdrop-filter: blur(4px) saturate(140%);\n\t\t-webkit-backdrop-filter: blur(4px) saturate(140%);\n\t\tcolor: var(--schmancy-sys-color-secondary-default);\n\t}\n\t:host([type='tertiary']) {\n\t\tbackground: color-mix(in srgb, var(--schmancy-sys-color-tertiary-default) 12%, transparent);\n\t\tbackdrop-filter: blur(4px) saturate(140%);\n\t\t-webkit-backdrop-filter: blur(4px) saturate(140%);\n\t\tcolor: var(--schmancy-sys-color-tertiary-default);\n\t}\n\t:host([type='error']) {\n\t\tbackground: color-mix(in srgb, var(--schmancy-sys-color-error-default) 12%, transparent);\n\t\tbackdrop-filter: blur(4px) saturate(140%);\n\t\t-webkit-backdrop-filter: blur(4px) saturate(140%);\n\t\tcolor: var(--schmancy-sys-color-error-onContainer);\n\t}\n\t:host([type='success']) {\n\t\tbackground: color-mix(in srgb, var(--schmancy-sys-color-success-default) 12%, transparent);\n\t\tbackdrop-filter: blur(4px) saturate(140%);\n\t\t-webkit-backdrop-filter: blur(4px) saturate(140%);\n\t\tcolor: var(--schmancy-sys-color-success-onContainer);\n\t}\n\t:host([type='warning']) {\n\t\tbackground: color-mix(in srgb, var(--schmancy-sys-color-warning-default) 12%, transparent);\n\t\tbackdrop-filter: blur(4px) saturate(140%);\n\t\t-webkit-backdrop-filter: blur(4px) saturate(140%);\n\t\tcolor: var(--schmancy-sys-color-warning-onContainer);\n\t}\n\t:host([type='info']) {\n\t\tbackground: color-mix(in srgb, var(--schmancy-sys-color-info-default) 12%, transparent);\n\t\tbackdrop-filter: blur(4px) saturate(140%);\n\t\t-webkit-backdrop-filter: blur(4px) saturate(140%);\n\t\tcolor: var(--schmancy-sys-color-info-onContainer);\n\t}\n\n\t/* ================================================================\n\t LEGACY M3 ALIASES — backward compatibility\n\t Old type names render as their new Luminous Glass equivalents.\n\t ================================================================ */\n\n\t/* solid aliases — dense glass */\n\t:host([type='surface']),\n\t:host([type='surfaceDim']),\n\t:host([type='surfaceBright']),\n\t:host([type='containerLowest']) {\n\t\t--glass-base: var(--schmancy-sys-color-surface-lowest);\n\t\t--glass-tint: var(--schmancy-sys-color-surface-on);\n\t\tbackground: color-mix(in srgb, var(--glass-base) 92%, transparent);\n\t\tcolor: var(--schmancy-sys-color-surface-on);\n\t}\n\n\t/* subtle aliases — bright vibrant glass */\n\t:host([type='containerLow']),\n\t:host([type='container']) {\n\t\t--glass-base: var(--schmancy-sys-color-surface-lowest);\n\t\t--glass-tint: var(--schmancy-sys-color-surface-on);\n\t\tbackground: color-mix(in srgb, var(--glass-base) 30%, transparent);\n\t\tbackdrop-filter: blur(12px) saturate(160%);\n\t\t-webkit-backdrop-filter: blur(12px) saturate(160%);\n\t\tborder: 1px solid color-mix(in srgb, var(--schmancy-sys-color-outlineVariant) 60%, transparent);\n\t\tbox-shadow: inset 0 1px 0 color-mix(in srgb, var(--schmancy-sys-color-surface-on) 8%, transparent);\n\t\tcolor: var(--schmancy-sys-color-surface-on);\n\t}\n\n\t/* glass aliases */\n\t:host([type='containerHigh']),\n\t:host([type='containerHighest']),\n\t:host([type='glassOforim']) {\n\t\t--glass-base: var(--schmancy-sys-color-surface-lowest);\n\t\t--glass-tint: var(--schmancy-sys-color-surface-on);\n\n\t\tbackground: color-mix(in srgb, var(--glass-base) 55%, transparent);\n\t\tbackdrop-filter: blur(16px) saturate(180%) brightness(1.05);\n\t\t-webkit-backdrop-filter: blur(16px) saturate(180%) brightness(1.05);\n\t\tcolor: var(--schmancy-sys-color-surface-on);\n\t\tposition: relative;\n\t\toverflow: hidden;\n\t\tisolation: isolate;\n\t}\n\n\t/* ================================================================\n\t REDUCED MOTION — disable glass animations\n\t ================================================================ */\n`\n\n/**\n * Surface rounded corner styles\n */\nexport const surfaceRoundedStyles = css`\n\t:host([rounded='none']) {\n\t\tborder-radius: 0;\n\t}\n\t:host([rounded='top']) {\n\t\tborder-radius: var(--schmancy-sys-shape-corner-large) var(--schmancy-sys-shape-corner-large) 0 0;\n\t}\n\t:host([rounded='left']) {\n\t\tborder-radius: var(--schmancy-sys-shape-corner-large) 0 0 var(--schmancy-sys-shape-corner-large);\n\t}\n\t:host([rounded='right']) {\n\t\tborder-radius: 0 var(--schmancy-sys-shape-corner-large) var(--schmancy-sys-shape-corner-large) 0;\n\t}\n\t:host([rounded='bottom']) {\n\t\tborder-radius: 0 0 var(--schmancy-sys-shape-corner-large) var(--schmancy-sys-shape-corner-large);\n\t}\n\t:host([rounded='all']) {\n\t\tborder-radius: var(--schmancy-sys-shape-corner-large);\n\t}\n`\n\n/**\n * Luminous glow elevation — replaces M3 dark drop shadows with primary-colored glow.\n * No ::after tint overlay — depth comes from glow intensity, not surface tint.\n */\nexport const surfaceElevationStyles = css`\n\t:host([elevation='1']) {\n\t\tbox-shadow: 0 2px 12px -2px color-mix(in srgb, var(--schmancy-sys-color-primary-default) 15%, transparent);\n\t\tposition: relative;\n\t}\n\t:host([elevation='2']) {\n\t\tbox-shadow: 0 4px 20px -2px color-mix(in srgb, var(--schmancy-sys-color-primary-default) 22%, transparent);\n\t\tposition: relative;\n\t}\n\t:host([elevation='3']) {\n\t\tbox-shadow: 0 8px 32px -4px color-mix(in srgb, var(--schmancy-sys-color-primary-default) 28%, transparent);\n\t\tposition: relative;\n\t}\n\t:host([elevation='4']) {\n\t\tbox-shadow: 0 12px 44px -4px color-mix(in srgb, var(--schmancy-sys-color-primary-default) 35%, transparent);\n\t\tposition: relative;\n\t}\n\t:host([elevation='5']) {\n\t\tbox-shadow: 0 20px 60px -4px color-mix(in srgb, var(--schmancy-sys-color-primary-default) 42%, transparent);\n\t\tposition: relative;\n\t}\n`\n\n/**\n * Surface clickable styles - luminous hover, spring active\n */\nexport const surfaceClickableStyles = css`\n\t:host([clickable]) {\n\t\tcursor: pointer;\n\t\tuser-select: none;\n\t\t-webkit-tap-highlight-color: transparent;\n\t\ttransition:\n\t\t\tfilter 200ms ease,\n\t\t\ttransform 300ms cubic-bezier(0.34, 1.56, 0.64, 1),\n\t\t\tbox-shadow 400ms ease;\n\t}\n\t:host([clickable]:hover) {\n\t\tfilter: brightness(1.03);\n\t}\n\t:host([clickable]:active) {\n\t\tfilter: brightness(0.96);\n\t\ttransform: scale(0.98);\n\t\ttransition-duration: 100ms;\n\t}\n\t:host([clickable]:focus-visible) {\n\t\toutline: 2px solid var(--schmancy-sys-color-primary-default);\n\t\toutline-offset: 2px;\n\t}\n\t@media (prefers-reduced-motion: reduce) {\n\t\t:host([clickable]) { transition: filter 150ms ease; }\n\t\t:host([clickable]:hover) { transform: none; box-shadow: none; }\n\t\t:host([clickable]:active) { transform: none; }\n\t}\n`\n\n/**\n * Combined surface styles - includes all surface styling capabilities\n */\nexport const surfaceStyles = css`\n\t${surfaceTypeStyles}\n\t${surfaceRoundedStyles}\n\t${surfaceElevationStyles}\n\t${surfaceClickableStyles}\n`\n","import type { Constructor } from './constructor'\nimport { CSSResultGroup, CSSResultOrNative, LitElement } from 'lit'\nimport { property } from 'lit/decorators.js'\nimport type { TSurfaceColor } from '../src/types/surface'\nimport { surfaceStyles } from '../src/surface/surface.styles'\n\nexport type SchmancySurfaceRounded = 'none' | 'top' | 'left' | 'right' | 'bottom' | 'all'\nexport type SchmancySurfaceElevation = 0 | 1 | 2 | 3 | 4 | 5\n\nexport declare class ISurfaceMixin {\n\trounded: SchmancySurfaceRounded\n\televation: SchmancySurfaceElevation\n\ttype: TSurfaceColor\n\tclickable: boolean\n}\n\n/**\n * SurfaceMixin - Adds surface styling properties AND styles to any LitElement\n *\n * Uses Lit's finalizeStyles hook to inject surfaceStyles CSS for all surface type selectors.\n * This is the recommended pattern for mixins that need to add styles.\n *\n * Provides these reflected properties:\n * - `rounded`: 'none' | 'top' | 'left' | 'right' | 'bottom' | 'all' - Corner rounding\n * - `elevation`: 0-5 - Shadow depth level\n * - `type`: TSurfaceColor - Surface color variant (26+ options)\n *\n * Usage:\n * ```typescript\n * import { SurfaceMixin } from '@mixins/surface.mixin'\n *\n * @customElement('my-component')\n * class MyComponent extends SurfaceMixin(TailwindElement(css`\n * :host { display: block; }\n * `)) {\n * // Component now has type, fill, rounded, elevation properties\n * // AND surfaceStyles are automatically included\n * }\n * ```\n */\nexport const SurfaceMixin = <T extends Constructor<LitElement>>(superClass: T) => {\n\tclass SurfaceMixinClass extends superClass {\n\t\t/**\n\t\t * Override finalizeStyles to inject surfaceStyles.\n\t\t * This is the Lit-recommended way for mixins to add styles.\n\t\t */\n\t\tprotected static finalizeStyles(styles?: CSSResultGroup): CSSResultOrNative[] {\n\t\t\t// Get parent's finalized styles using LitElement's method\n\t\t\tconst parentStyles = (superClass as unknown as typeof LitElement).finalizeStyles(styles)\n\t\t\t// Append surfaceStyles at the end (higher specificity)\n\t\t\treturn [...parentStyles, surfaceStyles as CSSResultOrNative]\n\t\t}\n\n\t\t/**\n\t\t * Specifies the rounding style of the component's corners.\n\t\t * @default 'none'\n\t\t */\n\t\t@property({ reflect: true })\n\t\trounded: SchmancySurfaceRounded = 'none'\n\n\t\t/**\n\t\t * Defines the elevation level (shadow depth) of the surface.\n\t\t * @default 0\n\t\t */\n\t\t@property({ type: Number, reflect: true })\n\t\televation: SchmancySurfaceElevation = 0\n\n\t\t/**\n\t\t * Specifies the surface type for styling.\n\t\t * @default 'container'\n\t\t */\n\t\t@property({ reflect: true })\n\t\ttype: TSurfaceColor = 'subtle'\n\n\t\t/**\n\t\t * Makes the surface interactive with hover, active states and cursor pointer.\n\t\t * @default false\n\t\t */\n\t\t@property({ type: Boolean, reflect: true })\n\t\tclickable = false\n\t}\n\treturn SurfaceMixinClass as Constructor<ISurfaceMixin> & T\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mixins-DTzfFVyv.js","names":[],"sources":["../mixins/formField.mixin.ts","../mixins/litElement.mixin.ts","../src/surface/surface.styles.ts","../mixins/surface.mixin.ts"],"sourcesContent":["import { CSSResult, LitElement, PropertyValueMap } from 'lit'\nimport { property, state } from 'lit/decorators.js'\nimport { IBaseMixin } from './baseElement'\nimport { Constructor } from './constructor'\nimport { ITailwindElementMixin } from './tailwind.mixin'\nimport { SchmancyElement } from './SchmancyElement'\n\n/**\n * Cross-realm brand used by `<schmancy-form>` to discover form fields by\n * inheritance rather than tag-name allowlists. `Symbol.for` puts the symbol in\n * the global registry so detection works across module realms/bundles.\n */\nexport const SCHMANCY_FORM_FIELD = Symbol.for('schmancy.form-field')\n\n/**\n * Composed event a field dispatches in `connectedCallback`. `<schmancy-form>`\n * subscribes via `fromEvent(this, FIELD_CONNECT_EVENT)` and adds the field to\n * its registry. No matching disconnect event — composed events from a\n * disconnected node have an empty composed path; cleanup is via `isConnected`\n * filter at iteration time.\n */\nexport const FIELD_CONNECT_EVENT = 'schmancy:field:connect'\n\n/**\n * Validation modes.\n * - `dirty` (default per Revolute) — show errors only after value diverged.\n * - `touched` — show errors after first blur, even if value unchanged.\n * - `always` — show errors immediately (live search).\n * - `submitted` — hold all errors until submit (wizard step).\n * - `length` — fire validation only when `value.length` reaches `maxlength`\n * (Stripe pattern for predictable-length fields: ZIP, phone, card number).\n */\nexport type ValidateOn = 'always' | 'touched' | 'dirty' | 'submitted' | 'length'\n\n/**\n * Per-field error-message override map. Keys are `ValidityState` flag names;\n * values are the message to display when that flag is set. Unset flags fall\n * back to the mixin's hardcoded defaults (English).\n *\n * Use for i18n or domain-specific copy:\n * ```ts\n * <schmancy-input\n * .errorMessages=${{ valueMissing: 'Adresse e-mail requise', typeMismatch: 'Format e-mail invalide' }}\n * type=\"email\" required\n * ></schmancy-input>\n * ```\n */\nexport type ErrorMessages = Partial<Record<keyof ValidityState, string>>\n\n/**\n * Interface defining the properties and methods that the FormFieldMixin adds.\n */\nexport interface IFormFieldMixin extends Element {\n\tname: string\n\tvalue: string | string[] | boolean | number | undefined\n\tlabel: string\n\trequired: boolean\n\tdisabled: boolean\n\treadonly: boolean\n\terror: boolean\n\tvalidationMessage: string\n\thint?: string\n\tid: string\n\n\t/** Set to `true` once the user has blurred the field at least once. */\n\ttouched: boolean\n\t/** `true` when the current value differs from the captured default. */\n\tdirty: boolean\n\t/** Inverse of `dirty`. */\n\tpristine: boolean\n\t/** Set to `true` by `<schmancy-form>` on submit (forces error display). */\n\tsubmitted: boolean\n\t/** Validation mode — controls when errors display. Default `'dirty'`. */\n\tvalidateOn: ValidateOn\n\n\t/**\n\t * Per-field error-message override map (i18n hook). See `ErrorMessages`.\n\t * Unset keys fall back to the mixin's hardcoded English defaults.\n\t */\n\terrorMessages?: ErrorMessages\n\n\t/**\n\t * `ElementInternals` instance attached by the mixin. Exposed so subclasses\n\t * with non-standard validity semantics (date-range, multi-select) can\n\t * surface platform `ValidityStateFlags` directly via\n\t * `internals.setValidity({ valueMissing: true })` rather than rolling their\n\t * own `attachInternals` call.\n\t */\n\tinternals: ElementInternals | undefined\n\n\tform: HTMLFormElement | null\n\n\tcheckValidity(): boolean\n\treportValidity(): boolean\n\tsetCustomValidity(message: string): void\n\n\t/** Mark the field as touched (component should call on blur). */\n\tmarkTouched(): void\n\t/** Mark the field as submitted (called by `<schmancy-form>` on submit). */\n\tmarkSubmitted(): void\n\t/**\n\t * Clear the `submitted` flag without resetting value/touched/error.\n\t * Used by wizards: stepping back from step N to step N-1 should not\n\t * leave step N-1's fields in aggressive \"show all errors\" mode.\n\t */\n\tclearSubmitted(): void\n\n\t/**\n\t * `true` while an async validator is in flight. Broadcast as\n\t * `:state(validating)`. `<schmancy-form>` blocks submit until every\n\t * registered field's `isValidating` is back to `false`.\n\t */\n\tisValidating: boolean\n\n\t/**\n\t * Run an async validator. While the promise is pending, `isValidating` is\n\t * `true` and `:state(validating)` is broadcast. On resolve, the returned\n\t * string is passed to `setCustomValidity` — empty string clears any\n\t * existing custom error; non-empty marks the field invalid with that\n\t * message.\n\t *\n\t * Submitting the form while a validator is pending is queued — the form\n\t * waits for `Promise.all(pending validators)` to settle before proceeding.\n\t */\n\trunAsyncValidator(fn: () => Promise<string>): Promise<void>\n\n\t/**\n\t * Whether the gate for showing validation errors is open right now. Exposed\n\t * so subclasses with custom error-display channels (e.g. select renders\n\t * errors on a child input) can keep their gate consistent with the mixin's.\n\t * Subclasses should not override this — extend the truth table by changing\n\t * `validateOn` instead.\n\t */\n\t_shouldShowError(): boolean\n\n\ttoFormEntries(): Array<[string, FormDataEntryValue]>\n\tresetForm(): void\n\n\temitChange(detail: any): void\n}\n\n/** Predicate used by `<schmancy-form>` to detect mixin descendants. */\nexport function isSchmancyFormField(el: unknown): el is IFormFieldMixin {\n\treturn !!el && typeof el === 'object' && (el as any).constructor?.[SCHMANCY_FORM_FIELD] === true\n}\n\n/**\n * A mixin that adds form field capabilities to a LitElement class.\n * Components that extend this mixin are automatically discovered and\n * collected by `<schmancy-form>` — no tag-name registration needed.\n *\n * Subclasses may override `toFormEntries()` to contribute multiple\n * name/value pairs to FormData (e.g. date-range, tag-input).\n *\n * @example\n * ```ts\n * class MyInput extends FormFieldMixin(TailwindElement(css`...`)) {\n * // Your component code here\n * }\n * ```\n */\nexport function FormFieldMixin<T extends Constructor<LitElement>>(superClass: T) {\n\tclass FormFieldMixinClass extends superClass {\n\t\tstatic formAssociated = true\n\n\t\t/** Brand for cross-realm detection by `<schmancy-form>`. */\n\t\tstatic readonly [SCHMANCY_FORM_FIELD] = true\n\n\t\t// Element internals for form association\n\t\tinternals: ElementInternals | undefined\n\n\t\t/** Value snapshot captured at first render, used by `resetForm()`. */\n\t\tprotected _defaultValue: string | string[] | boolean | number | undefined = undefined\n\n\t\t@property({ type: String })\n\t\tname: string = ''\n\n\t\t@property({ reflect: true })\n\t\tvalue: string | string[] | boolean | number | undefined = ''\n\n\t\t@property({ type: String })\n\t\tlabel: string = ''\n\n\t\t@property({ type: Boolean, reflect: true })\n\t\trequired: boolean = false\n\n\t\t@property({ type: Boolean, reflect: true })\n\t\tdisabled: boolean = false\n\n\t\t@property({ type: Boolean, reflect: true })\n\t\treadonly: boolean = false\n\n\t\t@property({ type: Boolean, reflect: true })\n\t\terror: boolean = false\n\n\t\t@property({ type: String })\n\t\tvalidationMessage: string = ''\n\n\t\t@property({ type: String })\n\t\thint?: string\n\n\t\t@property({ reflect: true })\n\t\toverride id: string = `schmancy-field-${Date.now()}-${Math.floor(Math.random() * 1000)}`\n\n\t\t// ----- Validation UX state (Revolute contract) -----\n\n\t\t/** True after the user has blurred the field at least once. */\n\t\t@state() touched: boolean = false\n\n\t\t/** Set by `<schmancy-form>` on submit; persists until `resetForm()`. */\n\t\t@state() submitted: boolean = false\n\n\t\t/**\n\t\t * When errors display. Default `'dirty'` — the autofocus+cancel anti-pattern\n\t\t * is avoided because pristine fields never show errors until submit.\n\t\t */\n\t\t@property({ type: String, reflect: true })\n\t\tvalidateOn: ValidateOn = 'dirty'\n\n\t\t/**\n\t\t * Optional override for the validity-flag → message map. See\n\t\t * `ErrorMessages`. Unset keys fall back to the mixin's defaults.\n\t\t */\n\t\t@property({ attribute: false })\n\t\terrorMessages?: ErrorMessages\n\n\t\t/** True when value has been changed from the captured default. */\n\t\tget dirty(): boolean {\n\t\t\treturn this._defaultValue !== undefined && this.value !== this._defaultValue\n\t\t}\n\n\t\tget pristine(): boolean {\n\t\t\treturn !this.dirty\n\t\t}\n\n\t\tmarkTouched(): void {\n\t\t\tif (!this.touched) this.touched = true\n\t\t}\n\n\t\tmarkSubmitted(): void {\n\t\t\tif (!this.submitted) this.submitted = true\n\t\t}\n\n\t\tclearSubmitted(): void {\n\t\t\tif (this.submitted) this.submitted = false\n\t\t}\n\n\t\t/**\n\t\t * Reactive flag set while an async validator is in flight. Read by\n\t\t * `<schmancy-form>` to gate submit; broadcast as `:state(validating)`\n\t\t * for CSS spinner targeting.\n\t\t */\n\t\t@state() isValidating: boolean = false\n\n\t\tasync runAsyncValidator(fn: () => Promise<string>): Promise<void> {\n\t\t\tif (this.isValidating) {\n\t\t\t\t// Cancel-by-supersede semantics — a new call wins; the previous\n\t\t\t\t// is best-effort and its result is dropped if it resolves later.\n\t\t\t\tthis._asyncValidatorEpoch++\n\t\t\t}\n\t\t\tconst epoch = ++this._asyncValidatorEpoch\n\t\t\tthis.isValidating = true\n\t\t\ttry {\n\t\t\t\tconst message = await fn()\n\t\t\t\tif (epoch !== this._asyncValidatorEpoch) return // superseded\n\t\t\t\tthis.setCustomValidity(message)\n\t\t\t} finally {\n\t\t\t\tif (epoch === this._asyncValidatorEpoch) {\n\t\t\t\t\tthis.isValidating = false\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tprivate _asyncValidatorEpoch: number = 0\n\n\t\t/**\n\t\t * Whether `checkValidity()` should display errors right now.\n\t\t * `submitted` overrides every mode — once a submit attempt happens, the\n\t\t * field stays in live-correction mode (Phase 3) for the rest of the\n\t\t * session, and `resetForm()` is the only way back. The leading\n\t\t * underscore marks this as an internal API: subclasses may call it but\n\t\t * should not override it (extend the truth table by changing\n\t\t * `validateOn` instead).\n\t\t */\n\t\t_shouldShowError(): boolean {\n\t\t\tif (this.submitted) return true\n\t\t\tswitch (this.validateOn) {\n\t\t\t\tcase 'always':\n\t\t\t\t\treturn true\n\t\t\t\tcase 'touched':\n\t\t\t\t\treturn this.touched\n\t\t\t\tcase 'dirty':\n\t\t\t\t\treturn this.dirty\n\t\t\t\tcase 'submitted':\n\t\t\t\t\treturn false\n\t\t\t\tcase 'length':\n\t\t\t\t\t// Predictable-length fields: validate once value reaches the\n\t\t\t\t\t// maxlength constraint. Stripe pattern. Falls back to dirty\n\t\t\t\t\t// if no maxlength is set.\n\t\t\t\t\tif (typeof this.value === 'string') {\n\t\t\t\t\t\tconst max = (this as unknown as { maxlength?: number }).maxlength\n\t\t\t\t\t\tif (typeof max === 'number' && max > 0) {\n\t\t\t\t\t\t\treturn this.value.length >= max\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this.dirty\n\t\t\t}\n\t\t}\n\n\t\tconstructor(...args: any[]) {\n\t\t\tsuper(...args)\n\t\t\ttry {\n\t\t\t\tthis.internals = this.attachInternals()\n\t\t\t} catch {\n\t\t\t\tthis.internals = undefined\n\t\t\t}\n\t\t}\n\n\t\toverride connectedCallback(): void {\n\t\t\tsuper.connectedCallback()\n\t\t\t// Register with any ancestor <schmancy-form> via composed event.\n\t\t\tthis.dispatchEvent(\n\t\t\t\tnew CustomEvent(FIELD_CONNECT_EVENT, {\n\t\t\t\t\tdetail: this,\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true,\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\n\t\t/** The form this element is associated with (native FACE behavior). */\n\t\tget form(): HTMLFormElement | null {\n\t\t\treturn this.internals?.form ?? null\n\t\t}\n\n\t\tprotected firstUpdated(changedProps: PropertyValueMap<any>): void {\n\t\t\tsuper.firstUpdated?.(changedProps)\n\t\t\tif (this._defaultValue === undefined) this._defaultValue = this.value\n\t\t\t// Sync platform validity (`internals.setValidity`) once after first\n\t\t\t// render so `<form>.checkValidity()` and `:invalid` reflect truth\n\t\t\t// even when no property change has fired through `willUpdate` yet\n\t\t\t// (e.g. for required-empty fields with class-field-initialized\n\t\t\t// defaults that Lit doesn't see as \"changed\" on the first cycle).\n\t\t\tthis.checkValidity()\n\t\t}\n\n\t\tprotected willUpdate(changedProps: PropertyValueMap<any>): void {\n\t\t\tsuper.willUpdate(changedProps)\n\n\t\t\tif (changedProps.has('value')) {\n\t\t\t\tthis.internals?.setFormValue(this.value as string | File | FormData | null)\n\t\t\t\t// :state(dirty) tracks value-vs-default; recompute on every value change.\n\t\t\t\tif (this.dirty) this.internals?.states.add('dirty')\n\t\t\t\telse this.internals?.states.delete('dirty')\n\t\t\t\t// Always sync platform validity (internals.setValidity) so\n\t\t\t\t// `<form>.checkValidity()` and `:invalid` reflect truth, even\n\t\t\t\t// while the visual `error` gate stays closed for pristine\n\t\t\t\t// fields under `validateOn: 'dirty'`. The visibility gate is\n\t\t\t\t// inside checkValidity() itself.\n\t\t\t\tthis.checkValidity()\n\t\t\t}\n\n\t\t\tif (changedProps.has('required') || changedProps.has('disabled')) {\n\t\t\t\tthis.checkValidity()\n\t\t\t}\n\n\t\t\tif (changedProps.has('isValidating')) {\n\t\t\t\tif (this.isValidating) this.internals?.states.add('validating')\n\t\t\t\telse this.internals?.states.delete('validating')\n\t\t\t}\n\n\t\t\tif (changedProps.has('touched')) {\n\t\t\t\tif (this.touched) this.internals?.states.add('touched')\n\t\t\t\telse this.internals?.states.delete('touched')\n\t\t\t\t// Phase 2 — blur on a dirty field. Validate to surface the error.\n\t\t\t\tif (this.touched && this.dirty) this.checkValidity()\n\t\t\t}\n\n\t\t\tif (changedProps.has('submitted')) {\n\t\t\t\tif (this.submitted) {\n\t\t\t\t\tthis.internals?.states.add('submitted')\n\t\t\t\t\t// Phase 4 — submit forces error display regardless of dirty/touched.\n\t\t\t\t\tthis.checkValidity()\n\t\t\t\t} else {\n\t\t\t\t\tthis.internals?.states.delete('submitted')\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Note: we do not write to `internals.setValidity` from willUpdate\n\t\t\t// based on `error` / `validationMessage` changes. `checkValidity`\n\t\t\t// and `setCustomValidity` are the sole writers — overwriting the\n\t\t\t// validity flags from willUpdate would clobber structured flags\n\t\t\t// set by subclass overrides (e.g. input.ts surfaces typeMismatch /\n\t\t\t// patternMismatch / tooShort / etc.).\n\n\t\t\tif (changedProps.has('error')) {\n\t\t\t\tif (this.error) this.internals?.states.add('invalid')\n\t\t\t\telse this.internals?.states.delete('invalid')\n\t\t\t\t// ARIA reflection through ElementInternals reaches AT through shadow DOM.\n\t\t\t\tif (this.internals) this.internals.ariaInvalid = this.error ? 'true' : 'false'\n\t\t\t}\n\n\t\t\tif (changedProps.has('required') || changedProps.has('disabled')) {\n\t\t\t\tif (this.required) this.internals?.states.add('required')\n\t\t\t\telse this.internals?.states.delete('required')\n\t\t\t\t// Suppress aria-required when disabled — disabled fields shouldn't\n\t\t\t\t// announce as required to assistive tech.\n\t\t\t\tif (this.internals) {\n\t\t\t\t\tthis.internals.ariaRequired = this.required && !this.disabled ? 'true' : 'false'\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (changedProps.has('disabled')) {\n\t\t\t\tif (this.disabled) this.internals?.states.add('disabled')\n\t\t\t\telse this.internals?.states.delete('disabled')\n\t\t\t}\n\t\t\tif (changedProps.has('readonly')) {\n\t\t\t\tif (this.readonly) this.internals?.states.add('readonly')\n\t\t\t\telse this.internals?.states.delete('readonly')\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Native FACE lifecycle — called by the browser when the owning form\n\t\t * is reset. Delegates to `resetForm()` so subclasses have one\n\t\t * override point for both programmatic and user-initiated resets.\n\t\t */\n\t\tformResetCallback(): void {\n\t\t\tthis.resetForm()\n\t\t}\n\n\t\t/** Native FACE lifecycle — called when the form's disabled state changes. */\n\t\tformDisabledCallback(disabled: boolean): void {\n\t\t\tthis.disabled = disabled\n\t\t}\n\n\t\t/**\n\t\t * Native FACE lifecycle — restore value after bfcache / form autofill.\n\t\t */\n\t\tformStateRestoreCallback(state: string | File | FormData | null): void {\n\t\t\tif (state == null) return\n\t\t\tthis.value = state as any\n\t\t}\n\n\t\t/** Override to customize reset behavior; default restores `_defaultValue`. */\n\t\tresetForm(): void {\n\t\t\tthis.value = this._defaultValue ?? ''\n\t\t\tthis.error = false\n\t\t\tthis.validationMessage = ''\n\t\t\tthis.touched = false\n\t\t\tthis.submitted = false\n\t\t\tthis.internals?.setValidity({})\n\t\t}\n\n\t\t/**\n\t\t * Contribute entries to a parent FormData. Default: a single\n\t\t * `[name, value]` pair when `name` is set and value is meaningful.\n\t\t * Override for multi-entry controls (e.g. date range).\n\t\t */\n\t\ttoFormEntries(): Array<[string, FormDataEntryValue]> {\n\t\t\tif (!this.name || this.disabled) return []\n\t\t\tconst v = this.value\n\t\t\tif (v === undefined || v === null || v === '') return []\n\t\t\tif (Array.isArray(v)) return v.map(item => [this.name, String(item)] as [string, FormDataEntryValue])\n\t\t\tif (typeof v === 'boolean') return v ? [[this.name, 'on']] : []\n\t\t\treturn [[this.name, String(v)]]\n\t\t}\n\n\t\tcheckValidity(): boolean {\n\t\t\tif (this.disabled) {\n\t\t\t\tthis.internals?.setValidity({})\n\t\t\t\treturn true\n\t\t\t}\n\n\t\t\tconst requiredFailed =\n\t\t\t\tthis.required && (this.value === '' || this.value === undefined || this.value === null)\n\t\t\t// Custom errors set via setCustomValidity() are platform-truth too —\n\t\t\t// preserve them through re-validation cycles.\n\t\t\tconst customErrorSet = !!this.internals?.validity?.customError\n\t\t\tconst isValid = !requiredFailed && !customErrorSet\n\t\t\tconst requiredMessage =\n\t\t\t\tthis.errorMessages?.valueMissing ?? 'This field is required'\n\t\t\tconst defaultMessage = requiredFailed ? requiredMessage : 'Invalid value'\n\n\t\t\t// Platform validity (read by `form.checkValidity()` and `:invalid`)\n\t\t\t// is always set to the truth — independent of the visual gate.\n\t\t\tif (requiredFailed) {\n\t\t\t\tthis.internals?.setValidity(\n\t\t\t\t\t{ valueMissing: true },\n\t\t\t\t\tthis.validationMessage || defaultMessage,\n\t\t\t\t)\n\t\t\t} else if (!customErrorSet) {\n\t\t\t\t// No required failure, no custom error — clear flags.\n\t\t\t\tthis.internals?.setValidity({})\n\t\t\t}\n\t\t\t// (customErrorSet branch falls through — leave the custom validity intact.)\n\n\t\t\t// Visual `error` flag is gated. The returned boolean tells the caller\n\t\t\t// the truth; only the in-component error display is suppressed for\n\t\t\t// pristine fields under `validateOn: 'dirty'`.\n\t\t\tif (this._shouldShowError()) {\n\t\t\t\tthis.error = !isValid\n\t\t\t\tif (!isValid && !this.validationMessage) {\n\t\t\t\t\tthis.validationMessage = defaultMessage\n\t\t\t\t} else if (isValid) {\n\t\t\t\t\tthis.validationMessage = ''\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn isValid\n\t\t}\n\n\t\treportValidity(): boolean {\n\t\t\tconst isValid = this.checkValidity()\n\t\t\tif (!isValid) this.internals?.reportValidity()\n\t\t\treturn isValid\n\t\t}\n\n\t\tsetCustomValidity(message: string): void {\n\t\t\tthis.validationMessage = message\n\t\t\tthis.error = message !== ''\n\t\t\tif (message) {\n\t\t\t\tthis.internals?.setValidity({ customError: true }, message)\n\t\t\t} else {\n\t\t\t\tthis.internals?.setValidity({})\n\t\t\t}\n\t\t}\n\n\t\temitChange(detail: any): void {\n\t\t\tif ('dispatchScopedEvent' in this && typeof this.dispatchScopedEvent === 'function') {\n\t\t\t\tthis.dispatchScopedEvent('change', detail, { bubbles: true })\n\t\t\t} else {\n\t\t\t\tthis.dispatchEvent(\n\t\t\t\t\tnew CustomEvent('change', {\n\t\t\t\t\t\tdetail,\n\t\t\t\t\t\tbubbles: true,\n\t\t\t\t\t\tcomposed: true,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t}\n\n\treturn FormFieldMixinClass as Constructor<IFormFieldMixin> & T\n}\n\n/**\n * A convenience function that composes FormFieldMixin with SchmancyElement\n * to create a base class for Schmancy form components. Subclasses gain the\n * full SchmancyElement stack (SignalWatcher, _activeHost wrap, AbortSignal,\n * automatic Tailwind injection) plus the form-field semantics.\n */\nexport function SchmancyFormField<T extends CSSResult>(componentStyle?: T) {\n\tclass StyledSchmancyElement extends SchmancyElement {\n\t\tstatic styles = componentStyle ? [componentStyle] : []\n\t}\n\treturn FormFieldMixin(StyledSchmancyElement) as unknown as Constructor<IFormFieldMixin> &\n\t\tConstructor<ITailwindElementMixin> &\n\t\tConstructor<LitElement> &\n\t\tConstructor<IBaseMixin>\n}\n","import { CSSResult, LitElement } from 'lit'\nimport { IBaseMixin } from './baseElement'\nimport { Constructor } from './constructor'\nimport { SchmancyElement } from './SchmancyElement'\n\n/**\n * @deprecated Extend `SchmancyElement` directly and declare `static styles`.\n *\n * Before: extends $LitElement(css`...`)\n * After: extends SchmancyElement { static styles = [css`...`] }\n *\n * Kept as a thin alias for the migration window; will be removed in the next\n * major Schmancy release. The returned class extends `SchmancyElement` so\n * runtime semantics (Tailwind injection, `disconnecting` Subject,\n * `disconnectedSignal` AbortSignal, SignalWatcher) match exactly.\n */\nexport const $LitElement = <T extends CSSResult>(componentStyle?: T) => {\n\tclass LegacyAlias extends SchmancyElement {\n\t\tstatic styles = componentStyle ? [componentStyle] : []\n\t}\n\treturn LegacyAlias as CustomElementConstructor &\n\t\tConstructor<LitElement> &\n\t\tConstructor<IBaseMixin>\n}\n","import { css } from 'lit'\n\n/**\n * Luminous Glass surface type styles.\n *\n * Depth model: blur intensity + opacity replaces M3 tonal hierarchy.\n * - solid: opaque ground (0 blur, 100% opacity)\n * - subtle: frosted panel (4px blur, ~72% opacity)\n * - glass: full frosted glass (20px blur, ~55% opacity)\n * - luminous: glass + glow halo (24px blur, ~22% opacity)\n */\nexport const surfaceTypeStyles = css`\n\t/* ================================================================\n\t STRUCTURAL TYPES — All-glass depth model.\n\t Nothing is opaque. Every layer is translucent.\n\t Blur creates readability. Light borders isolate layers.\n\t Rule: text must ALWAYS be readable on every surface.\n\t ================================================================ */\n\n\t/* Solid — dense glass, high readability ground layer (no blur — 92% opacity is enough) */\n\t:host([type='solid']) {\n\t\t--glass-base: var(--schmancy-sys-color-surface-lowest);\n\t\t--glass-tint: var(--schmancy-sys-color-surface-on);\n\t\tbackground: color-mix(in srgb, var(--glass-base) 92%, transparent);\n\t\tcolor: var(--schmancy-sys-color-surface-on);\n\t}\n\n\t/* Subtle — bright vibrant glass: near-white tint, saturated blur, top-edge highlight */\n\t:host([type='subtle']) {\n\t\t--glass-base: var(--schmancy-sys-color-surface-lowest);\n\t\t--glass-tint: var(--schmancy-sys-color-surface-on);\n\t\tbackground: color-mix(in srgb, var(--glass-base) 30%, transparent);\n\t\tbackdrop-filter: blur(12px) saturate(160%);\n\t\t-webkit-backdrop-filter: blur(12px) saturate(160%);\n\t\tborder: 1px solid color-mix(in srgb, var(--schmancy-sys-color-outlineVariant) 60%, transparent);\n\t\tbox-shadow: inset 0 1px 0 color-mix(in srgb, var(--schmancy-sys-color-surface-on) 8%, transparent);\n\t\tcolor: var(--schmancy-sys-color-surface-on);\n\t}\n\n\t/* Glass — frosted glass, blur ensures readability */\n\t:host([type='glass']) {\n\t\t--glass-base: var(--schmancy-sys-color-surface-lowest);\n\t\t--glass-tint: var(--schmancy-sys-color-surface-on);\n\n\t\tbackground: color-mix(in srgb, var(--glass-base) 55%, transparent);\n\t\tbackdrop-filter: blur(16px) saturate(180%) brightness(1.05);\n\t\t-webkit-backdrop-filter: blur(16px) saturate(180%) brightness(1.05);\n\t\tcolor: var(--schmancy-sys-color-surface-on);\n\t\tcontain: content;\n\t\tposition: relative;\n\t\toverflow: hidden;\n\t\tisolation: isolate;\n\t}\n\n\t/* Luminous — glass + glow halo, heavy blur keeps readability */\n\t:host([type='luminous']) {\n\t\t--glass-base: var(--schmancy-sys-color-surface-lowest);\n\t\t--glass-tint: var(--schmancy-sys-color-surface-on);\n\t\t--glow-color: var(--schmancy-sys-color-primary-default);\n\n\t\tbackground: color-mix(in srgb, var(--glass-base) 42%, transparent);\n\t\tbackdrop-filter: blur(20px) saturate(200%) brightness(1.08);\n\t\t-webkit-backdrop-filter: blur(20px) saturate(200%) brightness(1.08);\n\t\tcolor: var(--schmancy-sys-color-surface-on);\n\t\tcontain: content;\n\t\tposition: relative;\n\t\toverflow: hidden;\n\t\tisolation: isolate;\n\t}\n\n\t/* ================================================================\n\t UTILITY TYPES\n\t ================================================================ */\n\n\t/* Transparent — no background */\n\t:host([type='transparent']) {\n\t\tbackground-color: transparent;\n\t\tcolor: var(--schmancy-sys-color-surface-on);\n\t}\n\n\t/* Outlined — border with luminous hover potential */\n\t:host([type='outlined']) {\n\t\tbackground-color: transparent;\n\t\tcolor: var(--schmancy-sys-color-surface-on);\n\t\tborder: 1px solid var(--schmancy-sys-color-outlineVariant);\n\t\ttransition: border-color 300ms ease, box-shadow 300ms ease;\n\t}\n\n\t/* ================================================================\n\t SEMANTIC TYPES — tinted glass for status/role\n\t ================================================================ */\n\n\t:host([type='primary']) {\n\t\tbackground: color-mix(in srgb, var(--schmancy-sys-color-primary-default) 12%, transparent);\n\t\tbackdrop-filter: blur(4px) saturate(140%);\n\t\t-webkit-backdrop-filter: blur(4px) saturate(140%);\n\t\tcolor: var(--schmancy-sys-color-primary-default);\n\t}\n\t:host([type='secondary']) {\n\t\tbackground: color-mix(in srgb, var(--schmancy-sys-color-secondary-default) 12%, transparent);\n\t\tbackdrop-filter: blur(4px) saturate(140%);\n\t\t-webkit-backdrop-filter: blur(4px) saturate(140%);\n\t\tcolor: var(--schmancy-sys-color-secondary-default);\n\t}\n\t:host([type='tertiary']) {\n\t\tbackground: color-mix(in srgb, var(--schmancy-sys-color-tertiary-default) 12%, transparent);\n\t\tbackdrop-filter: blur(4px) saturate(140%);\n\t\t-webkit-backdrop-filter: blur(4px) saturate(140%);\n\t\tcolor: var(--schmancy-sys-color-tertiary-default);\n\t}\n\t:host([type='error']) {\n\t\tbackground: color-mix(in srgb, var(--schmancy-sys-color-error-default) 12%, transparent);\n\t\tbackdrop-filter: blur(4px) saturate(140%);\n\t\t-webkit-backdrop-filter: blur(4px) saturate(140%);\n\t\tcolor: var(--schmancy-sys-color-error-onContainer);\n\t}\n\t:host([type='success']) {\n\t\tbackground: color-mix(in srgb, var(--schmancy-sys-color-success-default) 12%, transparent);\n\t\tbackdrop-filter: blur(4px) saturate(140%);\n\t\t-webkit-backdrop-filter: blur(4px) saturate(140%);\n\t\tcolor: var(--schmancy-sys-color-success-onContainer);\n\t}\n\t:host([type='warning']) {\n\t\tbackground: color-mix(in srgb, var(--schmancy-sys-color-warning-default) 12%, transparent);\n\t\tbackdrop-filter: blur(4px) saturate(140%);\n\t\t-webkit-backdrop-filter: blur(4px) saturate(140%);\n\t\tcolor: var(--schmancy-sys-color-warning-onContainer);\n\t}\n\t:host([type='info']) {\n\t\tbackground: color-mix(in srgb, var(--schmancy-sys-color-info-default) 12%, transparent);\n\t\tbackdrop-filter: blur(4px) saturate(140%);\n\t\t-webkit-backdrop-filter: blur(4px) saturate(140%);\n\t\tcolor: var(--schmancy-sys-color-info-onContainer);\n\t}\n\n\t/* ================================================================\n\t LEGACY M3 ALIASES — backward compatibility\n\t Old type names render as their new Luminous Glass equivalents.\n\t ================================================================ */\n\n\t/* solid aliases — dense glass */\n\t:host([type='surface']),\n\t:host([type='surfaceDim']),\n\t:host([type='surfaceBright']),\n\t:host([type='containerLowest']) {\n\t\t--glass-base: var(--schmancy-sys-color-surface-lowest);\n\t\t--glass-tint: var(--schmancy-sys-color-surface-on);\n\t\tbackground: color-mix(in srgb, var(--glass-base) 92%, transparent);\n\t\tcolor: var(--schmancy-sys-color-surface-on);\n\t}\n\n\t/* subtle aliases — bright vibrant glass */\n\t:host([type='containerLow']),\n\t:host([type='container']) {\n\t\t--glass-base: var(--schmancy-sys-color-surface-lowest);\n\t\t--glass-tint: var(--schmancy-sys-color-surface-on);\n\t\tbackground: color-mix(in srgb, var(--glass-base) 30%, transparent);\n\t\tbackdrop-filter: blur(12px) saturate(160%);\n\t\t-webkit-backdrop-filter: blur(12px) saturate(160%);\n\t\tborder: 1px solid color-mix(in srgb, var(--schmancy-sys-color-outlineVariant) 60%, transparent);\n\t\tbox-shadow: inset 0 1px 0 color-mix(in srgb, var(--schmancy-sys-color-surface-on) 8%, transparent);\n\t\tcolor: var(--schmancy-sys-color-surface-on);\n\t}\n\n\t/* glass aliases */\n\t:host([type='containerHigh']),\n\t:host([type='containerHighest']),\n\t:host([type='glassOforim']) {\n\t\t--glass-base: var(--schmancy-sys-color-surface-lowest);\n\t\t--glass-tint: var(--schmancy-sys-color-surface-on);\n\n\t\tbackground: color-mix(in srgb, var(--glass-base) 55%, transparent);\n\t\tbackdrop-filter: blur(16px) saturate(180%) brightness(1.05);\n\t\t-webkit-backdrop-filter: blur(16px) saturate(180%) brightness(1.05);\n\t\tcolor: var(--schmancy-sys-color-surface-on);\n\t\tposition: relative;\n\t\toverflow: hidden;\n\t\tisolation: isolate;\n\t}\n\n\t/* ================================================================\n\t REDUCED MOTION — disable glass animations\n\t ================================================================ */\n`\n\n/**\n * Surface rounded corner styles\n */\nexport const surfaceRoundedStyles = css`\n\t:host([rounded='none']) {\n\t\tborder-radius: 0;\n\t}\n\t:host([rounded='top']) {\n\t\tborder-radius: var(--schmancy-sys-shape-corner-large) var(--schmancy-sys-shape-corner-large) 0 0;\n\t}\n\t:host([rounded='left']) {\n\t\tborder-radius: var(--schmancy-sys-shape-corner-large) 0 0 var(--schmancy-sys-shape-corner-large);\n\t}\n\t:host([rounded='right']) {\n\t\tborder-radius: 0 var(--schmancy-sys-shape-corner-large) var(--schmancy-sys-shape-corner-large) 0;\n\t}\n\t:host([rounded='bottom']) {\n\t\tborder-radius: 0 0 var(--schmancy-sys-shape-corner-large) var(--schmancy-sys-shape-corner-large);\n\t}\n\t:host([rounded='all']) {\n\t\tborder-radius: var(--schmancy-sys-shape-corner-large);\n\t}\n`\n\n/**\n * Luminous glow elevation — replaces M3 dark drop shadows with primary-colored glow.\n * No ::after tint overlay — depth comes from glow intensity, not surface tint.\n */\nexport const surfaceElevationStyles = css`\n\t:host([elevation='1']) {\n\t\tbox-shadow: 0 2px 12px -2px color-mix(in srgb, var(--schmancy-sys-color-primary-default) 15%, transparent);\n\t\tposition: relative;\n\t}\n\t:host([elevation='2']) {\n\t\tbox-shadow: 0 4px 20px -2px color-mix(in srgb, var(--schmancy-sys-color-primary-default) 22%, transparent);\n\t\tposition: relative;\n\t}\n\t:host([elevation='3']) {\n\t\tbox-shadow: 0 8px 32px -4px color-mix(in srgb, var(--schmancy-sys-color-primary-default) 28%, transparent);\n\t\tposition: relative;\n\t}\n\t:host([elevation='4']) {\n\t\tbox-shadow: 0 12px 44px -4px color-mix(in srgb, var(--schmancy-sys-color-primary-default) 35%, transparent);\n\t\tposition: relative;\n\t}\n\t:host([elevation='5']) {\n\t\tbox-shadow: 0 20px 60px -4px color-mix(in srgb, var(--schmancy-sys-color-primary-default) 42%, transparent);\n\t\tposition: relative;\n\t}\n`\n\n/**\n * Surface clickable styles - luminous hover, spring active\n */\nexport const surfaceClickableStyles = css`\n\t:host([clickable]) {\n\t\tcursor: pointer;\n\t\tuser-select: none;\n\t\t-webkit-tap-highlight-color: transparent;\n\t\ttransition:\n\t\t\tfilter 200ms ease,\n\t\t\ttransform 300ms cubic-bezier(0.34, 1.56, 0.64, 1),\n\t\t\tbox-shadow 400ms ease;\n\t}\n\t:host([clickable]:hover) {\n\t\tfilter: brightness(1.03);\n\t}\n\t:host([clickable]:active) {\n\t\tfilter: brightness(0.96);\n\t\ttransform: scale(0.98);\n\t\ttransition-duration: 100ms;\n\t}\n\t:host([clickable]:focus-visible) {\n\t\toutline: 2px solid var(--schmancy-sys-color-primary-default);\n\t\toutline-offset: 2px;\n\t}\n\t@media (prefers-reduced-motion: reduce) {\n\t\t:host([clickable]) { transition: filter 150ms ease; }\n\t\t:host([clickable]:hover) { transform: none; box-shadow: none; }\n\t\t:host([clickable]:active) { transform: none; }\n\t}\n`\n\n/**\n * Combined surface styles - includes all surface styling capabilities\n */\nexport const surfaceStyles = css`\n\t${surfaceTypeStyles}\n\t${surfaceRoundedStyles}\n\t${surfaceElevationStyles}\n\t${surfaceClickableStyles}\n`\n","import type { Constructor } from './constructor'\nimport { CSSResultGroup, CSSResultOrNative, LitElement } from 'lit'\nimport { property } from 'lit/decorators.js'\nimport type { TSurfaceColor } from '../src/types/surface'\nimport { surfaceStyles } from '../src/surface/surface.styles'\n\nexport type SchmancySurfaceRounded = 'none' | 'top' | 'left' | 'right' | 'bottom' | 'all'\nexport type SchmancySurfaceElevation = 0 | 1 | 2 | 3 | 4 | 5\n\nexport declare class ISurfaceMixin {\n\trounded: SchmancySurfaceRounded\n\televation: SchmancySurfaceElevation\n\ttype: TSurfaceColor\n\tclickable: boolean\n}\n\n/**\n * SurfaceMixin - Adds surface styling properties AND styles to any LitElement\n *\n * Uses Lit's finalizeStyles hook to inject surfaceStyles CSS for all surface type selectors.\n * This is the recommended pattern for mixins that need to add styles.\n *\n * Provides these reflected properties:\n * - `rounded`: 'none' | 'top' | 'left' | 'right' | 'bottom' | 'all' - Corner rounding\n * - `elevation`: 0-5 - Shadow depth level\n * - `type`: TSurfaceColor - Surface color variant (26+ options)\n *\n * Usage:\n * ```typescript\n * import { SurfaceMixin } from '@mixins/surface.mixin'\n *\n * @customElement('my-component')\n * class MyComponent extends SurfaceMixin(TailwindElement(css`\n * :host { display: block; }\n * `)) {\n * // Component now has type, fill, rounded, elevation properties\n * // AND surfaceStyles are automatically included\n * }\n * ```\n */\nexport const SurfaceMixin = <T extends Constructor<LitElement>>(superClass: T) => {\n\tclass SurfaceMixinClass extends superClass {\n\t\t/**\n\t\t * Override finalizeStyles to inject surfaceStyles.\n\t\t * This is the Lit-recommended way for mixins to add styles.\n\t\t */\n\t\tprotected static finalizeStyles(styles?: CSSResultGroup): CSSResultOrNative[] {\n\t\t\t// Get parent's finalized styles using LitElement's method\n\t\t\tconst parentStyles = (superClass as unknown as typeof LitElement).finalizeStyles(styles)\n\t\t\t// Append surfaceStyles at the end (higher specificity)\n\t\t\treturn [...parentStyles, surfaceStyles as CSSResultOrNative]\n\t\t}\n\n\t\t/**\n\t\t * Specifies the rounding style of the component's corners.\n\t\t * @default 'none'\n\t\t */\n\t\t@property({ reflect: true })\n\t\trounded: SchmancySurfaceRounded = 'none'\n\n\t\t/**\n\t\t * Defines the elevation level (shadow depth) of the surface.\n\t\t * @default 0\n\t\t */\n\t\t@property({ type: Number, reflect: true })\n\t\televation: SchmancySurfaceElevation = 0\n\n\t\t/**\n\t\t * Specifies the surface type for styling.\n\t\t * @default 'container'\n\t\t */\n\t\t@property({ reflect: true })\n\t\ttype: TSurfaceColor = 'subtle'\n\n\t\t/**\n\t\t * Makes the surface interactive with hover, active states and cursor pointer.\n\t\t * @default false\n\t\t */\n\t\t@property({ type: Boolean, reflect: true })\n\t\tclickable = false\n\t}\n\treturn SurfaceMixinClass as Constructor<ISurfaceMixin> & T\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"notification-Ccktcj9H.js","names":[],"sources":["../src/notification/notification.scss?inline","../src/notification/notification.ts","../src/notification/notification-service.ts","../src/notification/notify.ts"],"sourcesContent":[":host {\n\tdisplay: block;\n}\n\n.notification {\n\tposition: relative;\n\tdisplay: flex;\n\talign-items: stretch;\n\tmax-width: 360px;\n\toverflow: hidden;\n\n\t/* Asymmetric radius: 4px left, 14px right */\n\tborder-radius: 4px 14px 14px 4px;\n\toutline: 1px solid color-mix(in srgb, var(--schmancy-sys-color-outline-variant) 50%, transparent);\n\n\tbackground: linear-gradient(\n\t\t180deg,\n\t\tcolor-mix(in srgb, var(--schmancy-sys-color-surface-container) 100%, transparent),\n\t\tcolor-mix(in srgb, var(--schmancy-sys-color-surface-containerHigh) 100%, transparent)\n\t);\n\n\tcolor: var(--schmancy-sys-color-surface-on);\n\n\t/* Type-colored luminous glow — tightened */\n\t--notification-glow-color: var(--schmancy-sys-color-primary-default);\n\tbox-shadow:\n\t\t0 6px 28px -10px color-mix(in srgb, var(--notification-glow-color) 22%, transparent),\n\t\t0 1px 0 0 color-mix(in srgb, var(--schmancy-sys-color-outline-variant) 30%, transparent);\n\n\ttransition:\n\t\tbox-shadow 300ms ease,\n\t\ttransform 300ms cubic-bezier(0.34, 1.56, 0.64, 1);\n\n\t&.info {\n\t\t--notification-glow-color: var(--schmancy-sys-color-primary-default);\n\t\t--notification-accent: var(--schmancy-sys-color-primary-default);\n\t}\n\t&.success {\n\t\t--notification-glow-color: var(--schmancy-sys-color-success-default);\n\t\t--notification-accent: var(--schmancy-sys-color-success-default);\n\t}\n\t&.warning {\n\t\t--notification-glow-color: var(--schmancy-sys-color-tertiary-default);\n\t\t--notification-accent: var(--schmancy-sys-color-tertiary-default);\n\t}\n\t&.error {\n\t\t--notification-glow-color: var(--schmancy-sys-color-error-default);\n\t\t--notification-accent: var(--schmancy-sys-color-error-default);\n\t}\n\n\t&.hovered {\n\t\tbox-shadow:\n\t\t\t0 10px 36px -8px color-mix(in srgb, var(--notification-glow-color) 34%, transparent),\n\t\t\t0 1px 0 0 color-mix(in srgb, var(--schmancy-sys-color-outline-variant) 30%, transparent);\n\t\ttransform: translateY(-2px);\n\n\t\t.accent-rail {\n\t\t\twidth: 4px;\n\t\t}\n\t}\n\n\t@media (prefers-reduced-motion: reduce) {\n\t\ttransition: box-shadow 200ms ease;\n\n\t\t&.hovered {\n\t\t\ttransform: none;\n\t\t}\n\t}\n}\n\n/* Vertical accent rail — left edge */\n.accent-rail {\n\tflex-shrink: 0;\n\twidth: 3px;\n\tbackground: var(--notification-accent, var(--schmancy-sys-color-primary-default));\n\tborder-radius: 4px 0 0 4px;\n\ttransition: width 200ms ease;\n\talign-self: stretch;\n}\n\n/* Card body */\n.content {\n\tflex: 1;\n\tmin-width: 0;\n\tpadding: 14px 36px 14px 18px;\n}\n\n/* Monospace uppercase type tag */\n.type-tag {\n\tdisplay: block;\n\tfont-family: ui-monospace, 'Cascadia Code', 'Source Code Pro', Menlo, Consolas, monospace;\n\tfont-size: 10px;\n\tletter-spacing: 0.14em;\n\ttext-transform: uppercase;\n\topacity: 0.7;\n\tcolor: var(--notification-accent, var(--schmancy-sys-color-primary-default));\n\tmargin-bottom: 4px;\n\tline-height: 1;\n}\n\n/* Serif display title */\n.title {\n\tfont-family: ui-serif, Georgia, Cambria, 'Times New Roman', serif;\n\tfont-weight: 500;\n\tfont-size: 15px;\n\tline-height: 1.3;\n\tmargin-bottom: 3px;\n\tcolor: var(--schmancy-sys-color-surface-on);\n}\n\n/* Body message */\n.message {\n\tfont-family: ui-sans-serif, system-ui, -apple-system, sans-serif;\n\tfont-size: 13px;\n\tline-height: 1.45;\n\topacity: 0.72;\n}\n\n/* Close button — 28×28 hit target, × glyph */\n.close {\n\tposition: absolute;\n\ttop: 6px;\n\tright: 6px;\n\twidth: 28px;\n\theight: 28px;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tbackground: none;\n\tborder: none;\n\tfont-size: 18px;\n\tfont-weight: 400;\n\tcolor: var(--schmancy-sys-color-surface-onVariant);\n\tcursor: pointer;\n\tpadding: 0;\n\tline-height: 1;\n\topacity: 0.4;\n\tborder-radius: 50%;\n\ttransition: opacity 200ms ease;\n\n\t&:hover {\n\t\topacity: 0.85;\n\t}\n\n\t&:focus-visible {\n\t\toutline: none;\n\t\topacity: 1;\n\t\tbox-shadow: 0 0 0 2px var(--notification-accent, var(--schmancy-sys-color-primary-default));\n\t}\n}\n\n/* Progress hairline — top edge */\n.progress {\n\tposition: absolute;\n\ttop: 0;\n\tbottom: auto;\n\tleft: 0;\n\tright: 0;\n}\n","import { SchmancyElement } from '@mixins/index'\nimport { html, unsafeCSS } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { BehaviorSubject, timer, interval, NEVER } from 'rxjs'\nimport { switchMap, takeUntil, map, tap, distinctUntilChanged } from 'rxjs/operators'\nimport '../progress/progress'\nimport style from './notification.scss?inline'\n\nexport type NotificationType = 'info' | 'success' | 'warning' | 'error'\n\n/**\n * @fires close - When notification is closed\n */\n@customElement('sch-notification')\nexport default class SchmancyNotification extends SchmancyElement {\n\tstatic styles = [unsafeCSS(style)]\n\n\t@property({ type: String }) title = ''\n\t@property({ type: String }) message = ''\n\t@property({ type: String }) type: NotificationType = 'info'\n\t@property({ type: Boolean }) closable = true\n\t@property({ type: Number }) duration = 5000\n\t@property({ type: String }) id = `notification-${Date.now()}-${Math.floor(Math.random() * 10000)}`\n\t@property({ type: Boolean }) playSound = true\n\t@property({ type: Boolean }) showProgress = false\n\t// startPosition retained for API compatibility — not used in entrance animation\n\t@property({ type: Object }) startPosition: { x: number; y: number } = { x: 0, y: 0 }\n\n\t@state() private _visible = true\n\t@state() private _progress = 100\n\t@state() private _hovered = false\n\t@state() private _closing = false\n\n\tprivate paused$ = new BehaviorSubject<boolean>(false)\n\tprivate startTime = 0\n\tprivate pausedAt = 0\n\tprivate elapsedBeforePause = 0\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback()\n\n\t\tthis.style.position = 'fixed'\n\t\tthis.style.top = '16px'\n\t\tthis.style.right = '16px'\n\t\tthis.style.zIndex = '10001'\n\t\tthis.style.opacity = '0'\n\n\t\tthis.updateComplete.then(() => {\n\t\t\tthis.animateIn()\n\t\t\treturn\n\t\t})\n\n\t\tif (this.duration > 0) {\n\t\t\tthis.setupAutoClose()\n\t\t\tthis.setupProgressUpdates()\n\t\t}\n\n\t\tif (this.playSound) {\n\t\t\tthis._playSound()\n\t\t}\n\t}\n\n\tprivate async animateIn() {\n\t\tconst reduced = window.matchMedia('(prefers-reduced-motion: reduce)').matches\n\t\tawait this.animate(\n\t\t\treduced\n\t\t\t\t? [{ opacity: 0 }, { opacity: 1 }]\n\t\t\t\t: [\n\t\t\t\t\t\t{ transform: 'translateX(40px) scale(0.96)', opacity: 0 },\n\t\t\t\t\t\t{ transform: 'translateX(0) scale(1)', opacity: 1 },\n\t\t\t\t\t],\n\t\t\t{\n\t\t\t\tduration: reduced ? 200 : 360,\n\t\t\t\teasing: 'cubic-bezier(0.22, 1, 0.36, 1)',\n\t\t\t\tfill: 'forwards',\n\t\t\t},\n\t\t).finished\n\t}\n\n\tprivate setupAutoClose() {\n\t\tif (this.duration <= 0) return\n\n\t\tthis.startTime = Date.now()\n\t\tthis.elapsedBeforePause = 0\n\n\t\tthis.paused$\n\t\t\t.pipe(\n\t\t\t\tswitchMap(paused => {\n\t\t\t\t\tif (paused) {\n\t\t\t\t\t\tthis.pausedAt = Date.now()\n\t\t\t\t\t\tthis.elapsedBeforePause += this.pausedAt - this.startTime\n\t\t\t\t\t\treturn NEVER\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.startTime = Date.now()\n\t\t\t\t\t\tconst remaining = this.duration - this.elapsedBeforePause\n\t\t\t\t\t\tif (remaining <= 0) {\n\t\t\t\t\t\t\tthis.close()\n\t\t\t\t\t\t\treturn NEVER\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn timer(remaining)\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t\ttakeUntil(this.disconnecting),\n\t\t\t)\n\t\t\t.subscribe(() => this.close())\n\t}\n\n\tprivate setupProgressUpdates() {\n\t\tif (this.duration <= 0) return\n\n\t\tinterval(16)\n\t\t\t.pipe(\n\t\t\t\tswitchMap(() =>\n\t\t\t\t\tthis.paused$.pipe(\n\t\t\t\t\t\tmap(paused => {\n\t\t\t\t\t\t\tif (paused) return this._progress\n\t\t\t\t\t\t\tconst elapsed = this.elapsedBeforePause + (Date.now() - this.startTime)\n\t\t\t\t\t\t\tconst remaining = Math.max(0, this.duration - elapsed)\n\t\t\t\t\t\t\treturn (remaining / this.duration) * 100\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t\tdistinctUntilChanged(),\n\t\t\t\ttap(progress => {\n\t\t\t\t\tthis._progress = progress\n\t\t\t\t}),\n\t\t\t\ttakeUntil(this.disconnecting),\n\t\t\t)\n\t\t\t.subscribe()\n\t}\n\n\tprivate _playSound() {\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent('playsound', {\n\t\t\t\tdetail: { type: this.type },\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t}),\n\t\t)\n\t}\n\n\tprivate _handleMouseEnter() {\n\t\tthis._hovered = true\n\t\tthis.paused$.next(true)\n\t}\n\n\tprivate _handleMouseLeave() {\n\t\tthis._hovered = false\n\t\tthis.paused$.next(false)\n\t}\n\n\tpublic async close() {\n\t\tif (this._closing) return\n\t\tthis._closing = true\n\t\tthis._visible = false\n\n\t\tawait this.animate(\n\t\t\t[\n\t\t\t\t{ transform: 'translateX(0) scale(1)', opacity: 1 },\n\t\t\t\t{ transform: 'translateX(20px) scale(0.98)', opacity: 0 },\n\t\t\t],\n\t\t\t{\n\t\t\t\tduration: 180,\n\t\t\t\teasing: 'cubic-bezier(0.4, 0, 1, 1)',\n\t\t\t\tfill: 'forwards',\n\t\t\t},\n\t\t).finished\n\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent('close', {\n\t\t\t\tdetail: { id: this.id },\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t}),\n\t\t)\n\t}\n\n\tprivate _getTypeLabel(): string {\n\t\tswitch (this.type) {\n\t\t\tcase 'success':\n\t\t\t\treturn 'SUCCESS'\n\t\t\tcase 'warning':\n\t\t\t\treturn 'WARNING'\n\t\t\tcase 'error':\n\t\t\t\treturn 'ERROR'\n\t\t\tdefault:\n\t\t\t\treturn 'INFO'\n\t\t}\n\t}\n\n\trender() {\n\t\tif (!this._visible && this._closing) return html``\n\n\t\treturn html`\n\t\t\t<div\n\t\t\t\tclass=\"notification ${this.type} ${this._closing ? 'closing' : ''} ${this._hovered ? 'hovered' : ''}\"\n\t\t\t\trole=\"alert\"\n\t\t\t\t@mouseenter=${this._handleMouseEnter}\n\t\t\t\t@mouseleave=${this._handleMouseLeave}\n\t\t\t>\n\t\t\t\t${this.showProgress || this.duration > 0\n\t\t\t\t\t? html`<schmancy-progress\n\t\t\t\t\t\t\tclass=\"progress\"\n\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t.value=${this._progress}\n\t\t\t\t\t\t\t?indeterminate=${this.showProgress && this.duration === 0}\n\t\t\t\t\t\t></schmancy-progress>`\n\t\t\t\t\t: ''}\n\t\t\t\t<div class=\"accent-rail\"></div>\n\t\t\t\t<div class=\"content\">\n\t\t\t\t\t<span class=\"type-tag\">${this._getTypeLabel()}</span>\n\t\t\t\t\t${this.title ? html`<div class=\"title\">${this.title}</div>` : ''}\n\t\t\t\t\t<div class=\"message\">${this.message}</div>\n\t\t\t\t</div>\n\t\t\t\t${this.closable\n\t\t\t\t\t? html`\n\t\t\t\t\t\t\t<button class=\"close\" aria-label=\"Close notification\" @click=${this.close}>×</button>\n\t\t\t\t\t\t`\n\t\t\t\t\t: ''}\n\t\t\t</div>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'sch-notification': SchmancyNotification\n\t}\n}\n","import { fromEvent } from 'rxjs'\nimport { $sounds, type Feeling } from '../audio'\nimport SchmancyNotification, { NotificationType } from './notification'\n\nexport interface NotificationOptions {\n\tid?: string\n\ttitle?: string\n\tmessage: string\n\ttype?: NotificationType\n\tduration?: number\n\tclosable?: boolean\n\tplaySound?: boolean\n\tshowProgress?: boolean\n}\n\nconst typeToFeeling: Record<NotificationType, Feeling> = {\n\tinfo: 'curious',\n\tsuccess: 'content',\n\twarning: 'anxious',\n\terror: 'disappointed',\n}\n\nconst typeDurations: Record<NotificationType, number> = {\n\tsuccess: 1500,\n\tinfo: 2000,\n\twarning: 2500,\n\terror: 2500,\n}\n\n$sounds.setVolume(0.1)\n\n// Track last mouse position via RxJS\nlet lastClickPosition = { x: window.innerWidth - 100, y: 50 }\nif (typeof window !== 'undefined') {\n\tfromEvent<MouseEvent>(window, 'mousedown', { capture: true, passive: true } as AddEventListenerOptions).subscribe(\n\t\te => {\n\t\t\tlastClickPosition = { x: e.clientX, y: e.clientY }\n\t\t},\n\t)\n}\n\nlet currentNotification: SchmancyNotification | null = null\nconst notificationStack: string[] = []\n\nfunction show(options: NotificationOptions): string {\n\tconst id = options.id ?? `notification-${Date.now()}-${Math.floor(Math.random() * 10000)}`\n\tnotificationStack.push(id)\n\n\tif (currentNotification) {\n\t\tcurrentNotification.remove()\n\t\tcurrentNotification = null\n\t}\n\n\tconst notification = document.createElement('sch-notification') as SchmancyNotification\n\tnotification.id = id\n\tnotification.title = options.title ?? ''\n\tnotification.message = options.message\n\tnotification.type = options.type ?? 'info'\n\tnotification.duration = options.duration ?? 1000\n\tnotification.closable = options.closable !== false\n\tnotification.playSound = false\n\tnotification.showProgress = options.showProgress ?? false\n\tnotification.startPosition = { ...lastClickPosition }\n\n\tif (options.playSound !== false) {\n\t\t$sounds.play(typeToFeeling[notification.type])\n\t}\n\n\tfromEvent(notification, 'close').subscribe(() => {\n\t\tconst index = notificationStack.indexOf(id)\n\t\tif (index > -1) notificationStack.splice(index, 1)\n\t\tnotification.remove()\n\t\tif (currentNotification === notification) currentNotification = null\n\t})\n\n\tdocument.body.appendChild(notification)\n\tcurrentNotification = notification\n\treturn id\n}\n\n/**\n * Global notification (toast) utility. Fire-and-forget API for success,\n * error, info, and warning toasts, plus a low-level `show` for custom\n * notifications.\n *\n * @service\n * @summary Toast notifications — success, error, info, warning.\n * @method show(options: NotificationOptions) - Low-level; show any NotificationOptions.\n * @method success(message, options?) - Green success toast.\n * @method error(message, options?) - Red error toast.\n * @method info(message, options?) - Blue informational toast.\n * @method warning(message, options?) - Amber warning toast.\n */\nexport const $notify = {\n\tshow,\n\n\tinfo: (message?: string, options: Partial<Omit<NotificationOptions, 'message' | 'type'>> = {}): string =>\n\t\tshow({\n\t\t\tmessage: message ?? '',\n\t\t\ttype: 'info',\n\t\t\tduration: message ? (options.duration ?? typeDurations.info) : 1,\n\t\t\t...options,\n\t\t}),\n\n\tsuccess: (message?: string, options: Partial<Omit<NotificationOptions, 'message' | 'type'>> = {}): string =>\n\t\tshow({\n\t\t\tmessage: message ?? '',\n\t\t\ttype: 'success',\n\t\t\tduration: message ? (options.duration ?? typeDurations.success) : 1,\n\t\t\t...options,\n\t\t}),\n\n\twarning: (message?: string, options: Partial<Omit<NotificationOptions, 'message' | 'type'>> = {}): string =>\n\t\tshow({\n\t\t\tmessage: message ?? '',\n\t\t\ttype: 'warning',\n\t\t\tduration: message ? (options.duration ?? typeDurations.warning) : 1,\n\t\t\t...options,\n\t\t}),\n\n\terror: (message?: string, options: Partial<Omit<NotificationOptions, 'message' | 'type'>> = {}): string =>\n\t\tshow({\n\t\t\tmessage: message ?? '',\n\t\t\ttype: 'error',\n\t\t\tduration: message ? (options.duration ?? typeDurations.error) : 1,\n\t\t\t...options,\n\t\t}),\n\n\tcustomDuration: (\n\t\tmessage: string,\n\t\tduration: number,\n\t\toptions: Partial<Omit<NotificationOptions, 'message' | 'duration'>> = {},\n\t): string => show({ message, duration, ...options }),\n\n\tpersistent: (message: string, options: Partial<Omit<NotificationOptions, 'message' | 'duration'>> = {}): string =>\n\t\tshow({ message, duration: 0, ...options }),\n\n\tdismiss: (id?: string): void => {\n\t\tconst targetId = id ? (notificationStack.splice(notificationStack.indexOf(id), 1)[0]) : notificationStack.pop()\n\t\tif (targetId && currentNotification?.id === targetId) currentNotification.close()\n\t},\n\n\tupdate: (id: string, options: Partial<NotificationOptions>): void => {\n\t\tif (currentNotification?.id !== id) return\n\t\tif (options.title !== undefined) currentNotification.title = options.title\n\t\tif (options.message !== undefined) currentNotification.message = options.message\n\t\tif (options.type !== undefined) currentNotification.type = options.type\n\t},\n}\n\n","import { Observable, tap, finalize, catchError } from 'rxjs'\r\nimport { $notify, NotificationOptions } from './notification-service'\r\n\r\nexport interface NotifyOptions {\r\n\t/**\r\n\t * Message to show while the operation is in progress\r\n\t */\r\n\tloadingMessage?: string\r\n\t/**\r\n\t * Message to show when the operation completes successfully\r\n\t */\r\n\tsuccessMessage?: string\r\n\t/**\r\n\t * Message to show when the operation fails (can be a function to format error)\r\n\t */\r\n\terrorMessage?: string | ((error: any) => string)\r\n\t/**\r\n\t * Type of notification for loading state\r\n\t */\r\n\tloadingType?: NotificationOptions['type']\r\n\t/**\r\n\t * Type of notification for success state\r\n\t */\r\n\tsuccessType?: NotificationOptions['type']\r\n\t/**\r\n\t * Type of notification for error state\r\n\t */\r\n\terrorType?: NotificationOptions['type']\r\n\t/**\r\n\t * Whether to auto-dismiss the loading notification on complete/error\r\n\t */\r\n\tautoDismissLoading?: boolean\r\n\t/**\r\n\t * Duration for success notification (ms). Use 0 for persistent\r\n\t */\r\n\tsuccessDuration?: number\r\n\t/**\r\n\t * Duration for error notification (ms). Use 0 for persistent\r\n\t */\r\n\terrorDuration?: number\r\n}\r\n\r\n/**\r\n * Wraps an Observable with notification lifecycle management.\r\n * Shows a loading notification with progress indicator, then auto-dismisses and shows success/error notification.\r\n * \r\n * @example\r\n * ```typescript\r\n * // Basic usage with progress indicator\r\n * someApiCall().pipe(\r\n * notify({\r\n * loadingMessage: 'Loading data...',\r\n * successMessage: 'Data loaded successfully!',\r\n * errorMessage: 'Failed to load data'\r\n * })\r\n * ).subscribe()\r\n * \r\n * // With custom durations\r\n * saveData().pipe(\r\n * notify({\r\n * loadingMessage: 'Saving...',\r\n * successMessage: 'Saved!',\r\n * successDuration: 5000, // Success stays for 5 seconds\r\n * errorMessage: (err) => `Save failed: ${err.message}`,\r\n * errorDuration: 0 // Error is persistent until dismissed\r\n * })\r\n * ).subscribe()\r\n * \r\n * // Full configuration example\r\n * uploadFile().pipe(\r\n * notify({\r\n * loadingMessage: 'Uploading file...',\r\n * loadingType: 'info',\r\n * successMessage: 'Upload complete!',\r\n * successType: 'success',\r\n * successDuration: 3000,\r\n * errorMessage: (err) => `Upload failed: ${err.message}`,\r\n * errorType: 'error',\r\n * errorDuration: 10000,\r\n * autoDismissLoading: true\r\n * })\r\n * ).subscribe()\r\n * ```\r\n */\r\nexport function notify<T>(options: NotifyOptions) {\r\n\treturn (source: Observable<T>): Observable<T> => {\r\n\t\tlet loadingNotificationId: string | undefined\r\n\r\n\t\t// Show loading notification if message provided\r\n\t\tif (options.loadingMessage) {\r\n\t\t\tloadingNotificationId = $notify.show({\r\n\t\t\t\tmessage: options.loadingMessage,\r\n\t\t\t\ttype: options.loadingType || 'info',\r\n\t\t\t\tduration: 0, // Persistent until dismissed\r\n\t\t\t\tshowProgress: true, // Show indeterminate progress by default\r\n\t\t\t})\r\n\t\t}\r\n\r\n\t\treturn source.pipe(\r\n\t\t\ttap((value) => {\r\n\t\t\t\t// Check if the emitted value contains progress information\r\n\t\t\t\t// Common patterns: { progress: number }, { loaded: number, total: number }, etc.\r\n\t\t\t\tif (loadingNotificationId && typeof value === 'object' && value !== null) {\r\n\t\t\t\t\tlet progress: number | undefined\r\n\t\t\t\t\t\r\n\t\t\t\t\t// Check for different progress patterns\r\n\t\t\t\t\tif ('progress' in value && typeof (value as any).progress === 'number') {\r\n\t\t\t\t\t\tprogress = (value as any).progress\r\n\t\t\t\t\t} else if ('loaded' in value && 'total' in value) {\r\n\t\t\t\t\t\tconst loaded = (value as any).loaded\r\n\t\t\t\t\t\tconst total = (value as any).total\r\n\t\t\t\t\t\tif (typeof loaded === 'number' && typeof total === 'number' && total > 0) {\r\n\t\t\t\t\t\t\tprogress = (loaded / total) * 100\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t\t// Update notification with progress if available\r\n\t\t\t\t\tif (progress !== undefined) {\r\n\t\t\t\t\t\t// We need to update the progress of the notification\r\n\t\t\t\t\t\t// For now, we'll update the message to show progress percentage\r\n\t\t\t\t\t\t$notify.update?.(loadingNotificationId, {\r\n\t\t\t\t\t\t\tmessage: `${options.loadingMessage} (${Math.round(progress)}%)`,\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t// Check if this is the final success emission (not a progress update)\r\n\t\t\t\t// Typically file uploads emit progress events then a final result\r\n\t\t\t\tconst isProgressUpdate = typeof value === 'object' && value !== null && \r\n\t\t\t\t\t('progress' in value || ('loaded' in value && 'total' in value))\r\n\t\t\t\t\r\n\t\t\t\tif (!isProgressUpdate) {\r\n\t\t\t\t\t// On successful final emission, dismiss loading and show success\r\n\t\t\t\t\tif (loadingNotificationId && options.autoDismissLoading !== false) {\r\n\t\t\t\t\t\t$notify.dismiss(loadingNotificationId)\r\n\t\t\t\t\t\tloadingNotificationId = undefined\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (options.successMessage) {\r\n\t\t\t\t\t\t$notify.show({\r\n\t\t\t\t\t\t\tmessage: options.successMessage,\r\n\t\t\t\t\t\t\ttype: options.successType || 'success',\r\n\t\t\t\t\t\t\tduration: options.successDuration ?? 2000,\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}),\r\n\t\t\tcatchError((error) => {\r\n\t\t\t\t// On error, dismiss loading and show error\r\n\t\t\t\tif (loadingNotificationId && options.autoDismissLoading !== false) {\r\n\t\t\t\t\t$notify.dismiss(loadingNotificationId)\r\n\t\t\t\t\tloadingNotificationId = undefined\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (options.errorMessage) {\r\n\t\t\t\t\tconst message = typeof options.errorMessage === 'function' \r\n\t\t\t\t\t\t? options.errorMessage(error)\r\n\t\t\t\t\t\t: options.errorMessage\r\n\t\t\t\t\t\r\n\t\t\t\t\t$notify.show({\r\n\t\t\t\t\t\tmessage,\r\n\t\t\t\t\t\ttype: options.errorType || 'error',\r\n\t\t\t\t\t\tduration: options.errorDuration ?? 3000,\r\n\t\t\t\t\t})\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Re-throw the error to maintain the error flow\r\n\t\t\t\tthrow error\r\n\t\t\t}),\r\n\t\t\tfinalize(() => {\r\n\t\t\t\t// Clean up any remaining loading notification\r\n\t\t\t\tif (loadingNotificationId && options.autoDismissLoading !== false) {\r\n\t\t\t\t\t$notify.dismiss(loadingNotificationId)\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t)\r\n\t}\r\n}\r\n\r\n/**\r\n * Simplified version for API calls that just need loading and auto-dismiss.\r\n * Perfect for fire-and-forget operations where you want to show progress.\r\n * \r\n * @example\r\n * ```typescript\r\n * downloadData().pipe(\r\n * notifyProgress('Downloading...')\r\n * ).subscribe()\r\n * \r\n * // With custom messages\r\n * saveDocument().pipe(\r\n * notifyProgress('Saving document...', 'Document saved!', 'Save failed')\r\n * ).subscribe()\r\n * ```\r\n */\r\nexport function notifyProgress<T>(\r\n\tloadingMessage: string,\r\n\tsuccessMessage?: string,\r\n\terrorMessage?: string\r\n) {\r\n\treturn notify<T>({\r\n\t\tloadingMessage,\r\n\t\tsuccessMessage: successMessage || undefined,\r\n\t\terrorMessage: errorMessage || undefined,\r\n\t\tautoDismissLoading: true,\r\n\t})\r\n}"],"mappings":"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"}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
require(`./chunk-CncqDLb2.cjs`);const e=require(`./SchmancyElement-BBzRWB1w.cjs`);require(`./mixins-DPdzC9ZH.cjs`);const t=require(`./audio-B_jT9Xr7.cjs`);require(`./progress-zs18GR6C.cjs`);let n=require(`rxjs`),r=require(`rxjs/operators`),i=require(`lit/decorators.js`),a=require(`lit`);var o=class extends e.t{constructor(...e){super(...e),this.title=``,this.message=``,this.type=`info`,this.closable=!0,this.duration=5e3,this.id=`notification-${Date.now()}-${Math.floor(1e4*Math.random())}`,this.playSound=!0,this.showProgress=!1,this.startPosition={x:0,y:0},this._visible=!0,this._progress=100,this._hovered=!1,this._closing=!1,this.paused$=new n.BehaviorSubject(!1),this.startTime=0,this.pausedAt=0,this.elapsedBeforePause=0}static{this.styles=[(0,a.unsafeCSS)(`:host{display:block}.notification{outline:1px solid color-mix(in srgb, var(--schmancy-sys-color-outline-variant) 50%, transparent);background:linear-gradient(180deg, color-mix(in srgb, var(--schmancy-sys-color-surface-container) 100%, transparent), color-mix(in srgb, var(--schmancy-sys-color-surface-containerHigh) 100%, transparent));max-width:360px;color:var(--schmancy-sys-color-surface-on);--notification-glow-color:var(--schmancy-sys-color-primary-default);box-shadow:0 6px 28px -10px color-mix(in srgb, var(--notification-glow-color) 22%, transparent), 0 1px 0 0 color-mix(in srgb, var(--schmancy-sys-color-outline-variant) 30%, transparent);border-radius:4px 14px 14px 4px;align-items:stretch;transition:box-shadow .3s,transform .3s cubic-bezier(.34,1.56,.64,1);display:flex;position:relative;overflow:hidden}.notification.info{--notification-glow-color:var(--schmancy-sys-color-primary-default);--notification-accent:var(--schmancy-sys-color-primary-default)}.notification.success{--notification-glow-color:var(--schmancy-sys-color-success-default);--notification-accent:var(--schmancy-sys-color-success-default)}.notification.warning{--notification-glow-color:var(--schmancy-sys-color-tertiary-default);--notification-accent:var(--schmancy-sys-color-tertiary-default)}.notification.error{--notification-glow-color:var(--schmancy-sys-color-error-default);--notification-accent:var(--schmancy-sys-color-error-default)}.notification.hovered{box-shadow:0 10px 36px -8px color-mix(in srgb, var(--notification-glow-color) 34%, transparent), 0 1px 0 0 color-mix(in srgb, var(--schmancy-sys-color-outline-variant) 30%, transparent);transform:translateY(-2px)}.notification.hovered .accent-rail{width:4px}@media (prefers-reduced-motion:reduce){.notification{transition:box-shadow .2s}.notification.hovered{transform:none}}.accent-rail{background:var(--notification-accent,var(--schmancy-sys-color-primary-default));border-radius:4px 0 0 4px;flex-shrink:0;align-self:stretch;width:3px;transition:width .2s}.content{flex:1;min-width:0;padding:14px 36px 14px 18px}.type-tag{letter-spacing:.14em;text-transform:uppercase;opacity:.7;color:var(--notification-accent,var(--schmancy-sys-color-primary-default));margin-bottom:4px;font-family:ui-monospace,Cascadia Code,Source Code Pro,Menlo,Consolas,monospace;font-size:10px;line-height:1;display:block}.title{color:var(--schmancy-sys-color-surface-on);margin-bottom:3px;font-family:ui-serif,Georgia,Cambria,Times New Roman,serif;font-size:15px;font-weight:500;line-height:1.3}.message{opacity:.72;font-family:ui-sans-serif,system-ui,-apple-system,sans-serif;font-size:13px;line-height:1.45}.close{width:28px;height:28px;color:var(--schmancy-sys-color-surface-onVariant);cursor:pointer;opacity:.4;background:0 0;border:none;border-radius:50%;justify-content:center;align-items:center;padding:0;font-size:18px;font-weight:400;line-height:1;transition:opacity .2s;display:flex;position:absolute;top:6px;right:6px}.close:hover{opacity:.85}.close:focus-visible{opacity:1;box-shadow:0 0 0 2px var(--notification-accent,var(--schmancy-sys-color-primary-default));outline:none}.progress{position:absolute;inset:0 0 auto}`)]}connectedCallback(){super.connectedCallback(),this.style.position=`fixed`,this.style.top=`16px`,this.style.right=`16px`,this.style.zIndex=`10001`,this.style.opacity=`0`,this.updateComplete.then(()=>{this.animateIn()}),this.duration>0&&(this.setupAutoClose(),this.setupProgressUpdates()),this.playSound&&this._playSound()}async animateIn(){let e=window.matchMedia(`(prefers-reduced-motion: reduce)`).matches;await this.animate(e?[{opacity:0},{opacity:1}]:[{transform:`translateX(40px) scale(0.96)`,opacity:0},{transform:`translateX(0) scale(1)`,opacity:1}],{duration:e?200:360,easing:`cubic-bezier(0.22, 1, 0.36, 1)`,fill:`forwards`}).finished}setupAutoClose(){this.duration<=0||(this.startTime=Date.now(),this.elapsedBeforePause=0,this.paused$.pipe((0,r.switchMap)(e=>{if(e)return this.pausedAt=Date.now(),this.elapsedBeforePause+=this.pausedAt-this.startTime,n.NEVER;{this.startTime=Date.now();let e=this.duration-this.elapsedBeforePause;return e<=0?(this.close(),n.NEVER):(0,n.timer)(e)}}),(0,r.takeUntil)(this.disconnecting)).subscribe(()=>this.close()))}setupProgressUpdates(){this.duration<=0||(0,n.interval)(16).pipe((0,r.switchMap)(()=>this.paused$.pipe((0,r.map)(e=>{if(e)return this._progress;let t=this.elapsedBeforePause+(Date.now()-this.startTime);return Math.max(0,this.duration-t)/this.duration*100}))),(0,r.distinctUntilChanged)(),(0,r.tap)(e=>{this._progress=e}),(0,r.takeUntil)(this.disconnecting)).subscribe()}_playSound(){this.dispatchEvent(new CustomEvent(`playsound`,{detail:{type:this.type},bubbles:!0,composed:!0}))}_handleMouseEnter(){this._hovered=!0,this.paused$.next(!0)}_handleMouseLeave(){this._hovered=!1,this.paused$.next(!1)}async close(){this._closing||(this._closing=!0,this._visible=!1,await this.animate([{transform:`translateX(0) scale(1)`,opacity:1},{transform:`translateX(20px) scale(0.98)`,opacity:0}],{duration:180,easing:`cubic-bezier(0.4, 0, 1, 1)`,fill:`forwards`}).finished,this.dispatchEvent(new CustomEvent(`close`,{detail:{id:this.id},bubbles:!0,composed:!0})))}_getTypeLabel(){switch(this.type){case`success`:return`SUCCESS`;case`warning`:return`WARNING`;case`error`:return`ERROR`;default:return`INFO`}}render(){return!this._visible&&this._closing?a.html``:a.html`
|
|
2
|
-
<div
|
|
3
|
-
class="notification ${this.type} ${this._closing?`closing`:``} ${this._hovered?`hovered`:``}"
|
|
4
|
-
role="alert"
|
|
5
|
-
@mouseenter=${this._handleMouseEnter}
|
|
6
|
-
@mouseleave=${this._handleMouseLeave}
|
|
7
|
-
>
|
|
8
|
-
${this.showProgress||this.duration>0?a.html`<schmancy-progress
|
|
9
|
-
class="progress"
|
|
10
|
-
size="xs"
|
|
11
|
-
.value=${this._progress}
|
|
12
|
-
?indeterminate=${this.showProgress&&this.duration===0}
|
|
13
|
-
></schmancy-progress>`:``}
|
|
14
|
-
<div class="accent-rail"></div>
|
|
15
|
-
<div class="content">
|
|
16
|
-
<span class="type-tag">${this._getTypeLabel()}</span>
|
|
17
|
-
${this.title?a.html`<div class="title">${this.title}</div>`:``}
|
|
18
|
-
<div class="message">${this.message}</div>
|
|
19
|
-
</div>
|
|
20
|
-
${this.closable?a.html`
|
|
21
|
-
<button class="close" aria-label="Close notification" @click=${this.close}>×</button>
|
|
22
|
-
`:``}
|
|
23
|
-
</div>
|
|
24
|
-
`}};e.u([(0,i.property)({type:String})],o.prototype,`title`,void 0),e.u([(0,i.property)({type:String})],o.prototype,`message`,void 0),e.u([(0,i.property)({type:String})],o.prototype,`type`,void 0),e.u([(0,i.property)({type:Boolean})],o.prototype,`closable`,void 0),e.u([(0,i.property)({type:Number})],o.prototype,`duration`,void 0),e.u([(0,i.property)({type:String})],o.prototype,`id`,void 0),e.u([(0,i.property)({type:Boolean})],o.prototype,`playSound`,void 0),e.u([(0,i.property)({type:Boolean})],o.prototype,`showProgress`,void 0),e.u([(0,i.property)({type:Object})],o.prototype,`startPosition`,void 0),e.u([(0,i.state)()],o.prototype,`_visible`,void 0),e.u([(0,i.state)()],o.prototype,`_progress`,void 0),e.u([(0,i.state)()],o.prototype,`_hovered`,void 0),e.u([(0,i.state)()],o.prototype,`_closing`,void 0);var s=o=e.u([(0,i.customElement)(`sch-notification`)],o),c={info:`curious`,success:`content`,warning:`anxious`,error:`disappointed`},l=1500,u=2e3,d=2500,f=2500;t.t.setVolume(.1);var p={x:window.innerWidth-100,y:50};typeof window<`u`&&(0,n.fromEvent)(window,`mousedown`,{capture:!0,passive:!0}).subscribe(e=>{p={x:e.clientX,y:e.clientY}});var m=null,h=[];function g(e){let r=e.id??`notification-${Date.now()}-${Math.floor(1e4*Math.random())}`;h.push(r),m&&=(m.remove(),null);let i=document.createElement(`sch-notification`);return i.id=r,i.title=e.title??``,i.message=e.message,i.type=e.type??`info`,i.duration=e.duration??1e3,i.closable=!1!==e.closable,i.playSound=!1,i.showProgress=e.showProgress??!1,i.startPosition={...p},!1!==e.playSound&&t.t.play(c[i.type]),(0,n.fromEvent)(i,`close`).subscribe(()=>{let e=h.indexOf(r);e>-1&&h.splice(e,1),i.remove(),m===i&&(m=null)}),document.body.appendChild(i),m=i,r}var _={show:g,info:(e,t={})=>g({message:e??``,type:`info`,duration:e?t.duration??u:1,...t}),success:(e,t={})=>g({message:e??``,type:`success`,duration:e?t.duration??l:1,...t}),warning:(e,t={})=>g({message:e??``,type:`warning`,duration:e?t.duration??d:1,...t}),error:(e,t={})=>g({message:e??``,type:`error`,duration:e?t.duration??f:1,...t}),customDuration:(e,t,n={})=>g({message:e,duration:t,...n}),persistent:(e,t={})=>g({message:e,duration:0,...t}),dismiss:e=>{let t=e?h.splice(h.indexOf(e),1)[0]:h.pop();t&&m?.id===t&&m.close()},update:(e,t)=>{m?.id===e&&(t.title!==void 0&&(m.title=t.title),t.message!==void 0&&(m.message=t.message),t.type!==void 0&&(m.type=t.type))}};function v(e){return t=>{let r;return e.loadingMessage&&(r=_.show({message:e.loadingMessage,type:e.loadingType||`info`,duration:0,showProgress:!0})),t.pipe((0,n.tap)(t=>{if(r&&typeof t==`object`&&t){let n;if(`progress`in t&&typeof t.progress==`number`)n=t.progress;else if(`loaded`in t&&`total`in t){let e=t.loaded,r=t.total;typeof e==`number`&&typeof r==`number`&&r>0&&(n=e/r*100)}n!==void 0&&_.update?.(r,{message:`${e.loadingMessage} (${Math.round(n)}%)`})}typeof t==`object`&&t&&(`progress`in t||`loaded`in t&&`total`in t)||(r&&!1!==e.autoDismissLoading&&(_.dismiss(r),r=void 0),e.successMessage&&_.show({message:e.successMessage,type:e.successType||`success`,duration:e.successDuration??2e3}))}),(0,n.catchError)(t=>{if(r&&!1!==e.autoDismissLoading&&(_.dismiss(r),r=void 0),e.errorMessage){let n=typeof e.errorMessage==`function`?e.errorMessage(t):e.errorMessage;_.show({message:n,type:e.errorType||`error`,duration:e.errorDuration??3e3})}throw t}),(0,n.finalize)(()=>{r&&!1!==e.autoDismissLoading&&_.dismiss(r)}))}}function y(e,t,n){return v({loadingMessage:e,successMessage:t||void 0,errorMessage:n||void 0,autoDismissLoading:!0})}Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return v}});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"notification-DSkB-sn0.cjs","names":[],"sources":["../src/notification/notification.scss?inline","../src/notification/notification.ts","../src/notification/notification-service.ts","../src/notification/notify.ts"],"sourcesContent":[":host {\n\tdisplay: block;\n}\n\n.notification {\n\tposition: relative;\n\tdisplay: flex;\n\talign-items: stretch;\n\tmax-width: 360px;\n\toverflow: hidden;\n\n\t/* Asymmetric radius: 4px left, 14px right */\n\tborder-radius: 4px 14px 14px 4px;\n\toutline: 1px solid color-mix(in srgb, var(--schmancy-sys-color-outline-variant) 50%, transparent);\n\n\tbackground: linear-gradient(\n\t\t180deg,\n\t\tcolor-mix(in srgb, var(--schmancy-sys-color-surface-container) 100%, transparent),\n\t\tcolor-mix(in srgb, var(--schmancy-sys-color-surface-containerHigh) 100%, transparent)\n\t);\n\n\tcolor: var(--schmancy-sys-color-surface-on);\n\n\t/* Type-colored luminous glow — tightened */\n\t--notification-glow-color: var(--schmancy-sys-color-primary-default);\n\tbox-shadow:\n\t\t0 6px 28px -10px color-mix(in srgb, var(--notification-glow-color) 22%, transparent),\n\t\t0 1px 0 0 color-mix(in srgb, var(--schmancy-sys-color-outline-variant) 30%, transparent);\n\n\ttransition:\n\t\tbox-shadow 300ms ease,\n\t\ttransform 300ms cubic-bezier(0.34, 1.56, 0.64, 1);\n\n\t&.info {\n\t\t--notification-glow-color: var(--schmancy-sys-color-primary-default);\n\t\t--notification-accent: var(--schmancy-sys-color-primary-default);\n\t}\n\t&.success {\n\t\t--notification-glow-color: var(--schmancy-sys-color-success-default);\n\t\t--notification-accent: var(--schmancy-sys-color-success-default);\n\t}\n\t&.warning {\n\t\t--notification-glow-color: var(--schmancy-sys-color-tertiary-default);\n\t\t--notification-accent: var(--schmancy-sys-color-tertiary-default);\n\t}\n\t&.error {\n\t\t--notification-glow-color: var(--schmancy-sys-color-error-default);\n\t\t--notification-accent: var(--schmancy-sys-color-error-default);\n\t}\n\n\t&.hovered {\n\t\tbox-shadow:\n\t\t\t0 10px 36px -8px color-mix(in srgb, var(--notification-glow-color) 34%, transparent),\n\t\t\t0 1px 0 0 color-mix(in srgb, var(--schmancy-sys-color-outline-variant) 30%, transparent);\n\t\ttransform: translateY(-2px);\n\n\t\t.accent-rail {\n\t\t\twidth: 4px;\n\t\t}\n\t}\n\n\t@media (prefers-reduced-motion: reduce) {\n\t\ttransition: box-shadow 200ms ease;\n\n\t\t&.hovered {\n\t\t\ttransform: none;\n\t\t}\n\t}\n}\n\n/* Vertical accent rail — left edge */\n.accent-rail {\n\tflex-shrink: 0;\n\twidth: 3px;\n\tbackground: var(--notification-accent, var(--schmancy-sys-color-primary-default));\n\tborder-radius: 4px 0 0 4px;\n\ttransition: width 200ms ease;\n\talign-self: stretch;\n}\n\n/* Card body */\n.content {\n\tflex: 1;\n\tmin-width: 0;\n\tpadding: 14px 36px 14px 18px;\n}\n\n/* Monospace uppercase type tag */\n.type-tag {\n\tdisplay: block;\n\tfont-family: ui-monospace, 'Cascadia Code', 'Source Code Pro', Menlo, Consolas, monospace;\n\tfont-size: 10px;\n\tletter-spacing: 0.14em;\n\ttext-transform: uppercase;\n\topacity: 0.7;\n\tcolor: var(--notification-accent, var(--schmancy-sys-color-primary-default));\n\tmargin-bottom: 4px;\n\tline-height: 1;\n}\n\n/* Serif display title */\n.title {\n\tfont-family: ui-serif, Georgia, Cambria, 'Times New Roman', serif;\n\tfont-weight: 500;\n\tfont-size: 15px;\n\tline-height: 1.3;\n\tmargin-bottom: 3px;\n\tcolor: var(--schmancy-sys-color-surface-on);\n}\n\n/* Body message */\n.message {\n\tfont-family: ui-sans-serif, system-ui, -apple-system, sans-serif;\n\tfont-size: 13px;\n\tline-height: 1.45;\n\topacity: 0.72;\n}\n\n/* Close button — 28×28 hit target, × glyph */\n.close {\n\tposition: absolute;\n\ttop: 6px;\n\tright: 6px;\n\twidth: 28px;\n\theight: 28px;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tbackground: none;\n\tborder: none;\n\tfont-size: 18px;\n\tfont-weight: 400;\n\tcolor: var(--schmancy-sys-color-surface-onVariant);\n\tcursor: pointer;\n\tpadding: 0;\n\tline-height: 1;\n\topacity: 0.4;\n\tborder-radius: 50%;\n\ttransition: opacity 200ms ease;\n\n\t&:hover {\n\t\topacity: 0.85;\n\t}\n\n\t&:focus-visible {\n\t\toutline: none;\n\t\topacity: 1;\n\t\tbox-shadow: 0 0 0 2px var(--notification-accent, var(--schmancy-sys-color-primary-default));\n\t}\n}\n\n/* Progress hairline — top edge */\n.progress {\n\tposition: absolute;\n\ttop: 0;\n\tbottom: auto;\n\tleft: 0;\n\tright: 0;\n}\n","import { SchmancyElement } from '@mixins/index'\nimport { html, unsafeCSS } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { BehaviorSubject, timer, interval, NEVER } from 'rxjs'\nimport { switchMap, takeUntil, map, tap, distinctUntilChanged } from 'rxjs/operators'\nimport '../progress/progress'\nimport style from './notification.scss?inline'\n\nexport type NotificationType = 'info' | 'success' | 'warning' | 'error'\n\n/**\n * @fires close - When notification is closed\n */\n@customElement('sch-notification')\nexport default class SchmancyNotification extends SchmancyElement {\n\tstatic styles = [unsafeCSS(style)]\n\n\t@property({ type: String }) title = ''\n\t@property({ type: String }) message = ''\n\t@property({ type: String }) type: NotificationType = 'info'\n\t@property({ type: Boolean }) closable = true\n\t@property({ type: Number }) duration = 5000\n\t@property({ type: String }) id = `notification-${Date.now()}-${Math.floor(Math.random() * 10000)}`\n\t@property({ type: Boolean }) playSound = true\n\t@property({ type: Boolean }) showProgress = false\n\t// startPosition retained for API compatibility — not used in entrance animation\n\t@property({ type: Object }) startPosition: { x: number; y: number } = { x: 0, y: 0 }\n\n\t@state() private _visible = true\n\t@state() private _progress = 100\n\t@state() private _hovered = false\n\t@state() private _closing = false\n\n\tprivate paused$ = new BehaviorSubject<boolean>(false)\n\tprivate startTime = 0\n\tprivate pausedAt = 0\n\tprivate elapsedBeforePause = 0\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback()\n\n\t\tthis.style.position = 'fixed'\n\t\tthis.style.top = '16px'\n\t\tthis.style.right = '16px'\n\t\tthis.style.zIndex = '10001'\n\t\tthis.style.opacity = '0'\n\n\t\tthis.updateComplete.then(() => {\n\t\t\tthis.animateIn()\n\t\t\treturn\n\t\t})\n\n\t\tif (this.duration > 0) {\n\t\t\tthis.setupAutoClose()\n\t\t\tthis.setupProgressUpdates()\n\t\t}\n\n\t\tif (this.playSound) {\n\t\t\tthis._playSound()\n\t\t}\n\t}\n\n\tprivate async animateIn() {\n\t\tconst reduced = window.matchMedia('(prefers-reduced-motion: reduce)').matches\n\t\tawait this.animate(\n\t\t\treduced\n\t\t\t\t? [{ opacity: 0 }, { opacity: 1 }]\n\t\t\t\t: [\n\t\t\t\t\t\t{ transform: 'translateX(40px) scale(0.96)', opacity: 0 },\n\t\t\t\t\t\t{ transform: 'translateX(0) scale(1)', opacity: 1 },\n\t\t\t\t\t],\n\t\t\t{\n\t\t\t\tduration: reduced ? 200 : 360,\n\t\t\t\teasing: 'cubic-bezier(0.22, 1, 0.36, 1)',\n\t\t\t\tfill: 'forwards',\n\t\t\t},\n\t\t).finished\n\t}\n\n\tprivate setupAutoClose() {\n\t\tif (this.duration <= 0) return\n\n\t\tthis.startTime = Date.now()\n\t\tthis.elapsedBeforePause = 0\n\n\t\tthis.paused$\n\t\t\t.pipe(\n\t\t\t\tswitchMap(paused => {\n\t\t\t\t\tif (paused) {\n\t\t\t\t\t\tthis.pausedAt = Date.now()\n\t\t\t\t\t\tthis.elapsedBeforePause += this.pausedAt - this.startTime\n\t\t\t\t\t\treturn NEVER\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.startTime = Date.now()\n\t\t\t\t\t\tconst remaining = this.duration - this.elapsedBeforePause\n\t\t\t\t\t\tif (remaining <= 0) {\n\t\t\t\t\t\t\tthis.close()\n\t\t\t\t\t\t\treturn NEVER\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn timer(remaining)\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t\ttakeUntil(this.disconnecting),\n\t\t\t)\n\t\t\t.subscribe(() => this.close())\n\t}\n\n\tprivate setupProgressUpdates() {\n\t\tif (this.duration <= 0) return\n\n\t\tinterval(16)\n\t\t\t.pipe(\n\t\t\t\tswitchMap(() =>\n\t\t\t\t\tthis.paused$.pipe(\n\t\t\t\t\t\tmap(paused => {\n\t\t\t\t\t\t\tif (paused) return this._progress\n\t\t\t\t\t\t\tconst elapsed = this.elapsedBeforePause + (Date.now() - this.startTime)\n\t\t\t\t\t\t\tconst remaining = Math.max(0, this.duration - elapsed)\n\t\t\t\t\t\t\treturn (remaining / this.duration) * 100\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t\tdistinctUntilChanged(),\n\t\t\t\ttap(progress => {\n\t\t\t\t\tthis._progress = progress\n\t\t\t\t}),\n\t\t\t\ttakeUntil(this.disconnecting),\n\t\t\t)\n\t\t\t.subscribe()\n\t}\n\n\tprivate _playSound() {\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent('playsound', {\n\t\t\t\tdetail: { type: this.type },\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t}),\n\t\t)\n\t}\n\n\tprivate _handleMouseEnter() {\n\t\tthis._hovered = true\n\t\tthis.paused$.next(true)\n\t}\n\n\tprivate _handleMouseLeave() {\n\t\tthis._hovered = false\n\t\tthis.paused$.next(false)\n\t}\n\n\tpublic async close() {\n\t\tif (this._closing) return\n\t\tthis._closing = true\n\t\tthis._visible = false\n\n\t\tawait this.animate(\n\t\t\t[\n\t\t\t\t{ transform: 'translateX(0) scale(1)', opacity: 1 },\n\t\t\t\t{ transform: 'translateX(20px) scale(0.98)', opacity: 0 },\n\t\t\t],\n\t\t\t{\n\t\t\t\tduration: 180,\n\t\t\t\teasing: 'cubic-bezier(0.4, 0, 1, 1)',\n\t\t\t\tfill: 'forwards',\n\t\t\t},\n\t\t).finished\n\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent('close', {\n\t\t\t\tdetail: { id: this.id },\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t}),\n\t\t)\n\t}\n\n\tprivate _getTypeLabel(): string {\n\t\tswitch (this.type) {\n\t\t\tcase 'success':\n\t\t\t\treturn 'SUCCESS'\n\t\t\tcase 'warning':\n\t\t\t\treturn 'WARNING'\n\t\t\tcase 'error':\n\t\t\t\treturn 'ERROR'\n\t\t\tdefault:\n\t\t\t\treturn 'INFO'\n\t\t}\n\t}\n\n\trender() {\n\t\tif (!this._visible && this._closing) return html``\n\n\t\treturn html`\n\t\t\t<div\n\t\t\t\tclass=\"notification ${this.type} ${this._closing ? 'closing' : ''} ${this._hovered ? 'hovered' : ''}\"\n\t\t\t\trole=\"alert\"\n\t\t\t\t@mouseenter=${this._handleMouseEnter}\n\t\t\t\t@mouseleave=${this._handleMouseLeave}\n\t\t\t>\n\t\t\t\t${this.showProgress || this.duration > 0\n\t\t\t\t\t? html`<schmancy-progress\n\t\t\t\t\t\t\tclass=\"progress\"\n\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t.value=${this._progress}\n\t\t\t\t\t\t\t?indeterminate=${this.showProgress && this.duration === 0}\n\t\t\t\t\t\t></schmancy-progress>`\n\t\t\t\t\t: ''}\n\t\t\t\t<div class=\"accent-rail\"></div>\n\t\t\t\t<div class=\"content\">\n\t\t\t\t\t<span class=\"type-tag\">${this._getTypeLabel()}</span>\n\t\t\t\t\t${this.title ? html`<div class=\"title\">${this.title}</div>` : ''}\n\t\t\t\t\t<div class=\"message\">${this.message}</div>\n\t\t\t\t</div>\n\t\t\t\t${this.closable\n\t\t\t\t\t? html`\n\t\t\t\t\t\t\t<button class=\"close\" aria-label=\"Close notification\" @click=${this.close}>×</button>\n\t\t\t\t\t\t`\n\t\t\t\t\t: ''}\n\t\t\t</div>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'sch-notification': SchmancyNotification\n\t}\n}\n","import { fromEvent } from 'rxjs'\nimport { $sounds, type Feeling } from '../audio'\nimport SchmancyNotification, { NotificationType } from './notification'\n\nexport interface NotificationOptions {\n\tid?: string\n\ttitle?: string\n\tmessage: string\n\ttype?: NotificationType\n\tduration?: number\n\tclosable?: boolean\n\tplaySound?: boolean\n\tshowProgress?: boolean\n}\n\nconst typeToFeeling: Record<NotificationType, Feeling> = {\n\tinfo: 'curious',\n\tsuccess: 'content',\n\twarning: 'anxious',\n\terror: 'disappointed',\n}\n\nconst typeDurations: Record<NotificationType, number> = {\n\tsuccess: 1500,\n\tinfo: 2000,\n\twarning: 2500,\n\terror: 2500,\n}\n\n$sounds.setVolume(0.1)\n\n// Track last mouse position via RxJS\nlet lastClickPosition = { x: window.innerWidth - 100, y: 50 }\nif (typeof window !== 'undefined') {\n\tfromEvent<MouseEvent>(window, 'mousedown', { capture: true, passive: true } as AddEventListenerOptions).subscribe(\n\t\te => {\n\t\t\tlastClickPosition = { x: e.clientX, y: e.clientY }\n\t\t},\n\t)\n}\n\nlet currentNotification: SchmancyNotification | null = null\nconst notificationStack: string[] = []\n\nfunction show(options: NotificationOptions): string {\n\tconst id = options.id ?? `notification-${Date.now()}-${Math.floor(Math.random() * 10000)}`\n\tnotificationStack.push(id)\n\n\tif (currentNotification) {\n\t\tcurrentNotification.remove()\n\t\tcurrentNotification = null\n\t}\n\n\tconst notification = document.createElement('sch-notification') as SchmancyNotification\n\tnotification.id = id\n\tnotification.title = options.title ?? ''\n\tnotification.message = options.message\n\tnotification.type = options.type ?? 'info'\n\tnotification.duration = options.duration ?? 1000\n\tnotification.closable = options.closable !== false\n\tnotification.playSound = false\n\tnotification.showProgress = options.showProgress ?? false\n\tnotification.startPosition = { ...lastClickPosition }\n\n\tif (options.playSound !== false) {\n\t\t$sounds.play(typeToFeeling[notification.type])\n\t}\n\n\tfromEvent(notification, 'close').subscribe(() => {\n\t\tconst index = notificationStack.indexOf(id)\n\t\tif (index > -1) notificationStack.splice(index, 1)\n\t\tnotification.remove()\n\t\tif (currentNotification === notification) currentNotification = null\n\t})\n\n\tdocument.body.appendChild(notification)\n\tcurrentNotification = notification\n\treturn id\n}\n\n/**\n * Global notification (toast) utility. Fire-and-forget API for success,\n * error, info, and warning toasts, plus a low-level `show` for custom\n * notifications.\n *\n * @service\n * @summary Toast notifications — success, error, info, warning.\n * @method show(options: NotificationOptions) - Low-level; show any NotificationOptions.\n * @method success(message, options?) - Green success toast.\n * @method error(message, options?) - Red error toast.\n * @method info(message, options?) - Blue informational toast.\n * @method warning(message, options?) - Amber warning toast.\n */\nexport const $notify = {\n\tshow,\n\n\tinfo: (message?: string, options: Partial<Omit<NotificationOptions, 'message' | 'type'>> = {}): string =>\n\t\tshow({\n\t\t\tmessage: message ?? '',\n\t\t\ttype: 'info',\n\t\t\tduration: message ? (options.duration ?? typeDurations.info) : 1,\n\t\t\t...options,\n\t\t}),\n\n\tsuccess: (message?: string, options: Partial<Omit<NotificationOptions, 'message' | 'type'>> = {}): string =>\n\t\tshow({\n\t\t\tmessage: message ?? '',\n\t\t\ttype: 'success',\n\t\t\tduration: message ? (options.duration ?? typeDurations.success) : 1,\n\t\t\t...options,\n\t\t}),\n\n\twarning: (message?: string, options: Partial<Omit<NotificationOptions, 'message' | 'type'>> = {}): string =>\n\t\tshow({\n\t\t\tmessage: message ?? '',\n\t\t\ttype: 'warning',\n\t\t\tduration: message ? (options.duration ?? typeDurations.warning) : 1,\n\t\t\t...options,\n\t\t}),\n\n\terror: (message?: string, options: Partial<Omit<NotificationOptions, 'message' | 'type'>> = {}): string =>\n\t\tshow({\n\t\t\tmessage: message ?? '',\n\t\t\ttype: 'error',\n\t\t\tduration: message ? (options.duration ?? typeDurations.error) : 1,\n\t\t\t...options,\n\t\t}),\n\n\tcustomDuration: (\n\t\tmessage: string,\n\t\tduration: number,\n\t\toptions: Partial<Omit<NotificationOptions, 'message' | 'duration'>> = {},\n\t): string => show({ message, duration, ...options }),\n\n\tpersistent: (message: string, options: Partial<Omit<NotificationOptions, 'message' | 'duration'>> = {}): string =>\n\t\tshow({ message, duration: 0, ...options }),\n\n\tdismiss: (id?: string): void => {\n\t\tconst targetId = id ? (notificationStack.splice(notificationStack.indexOf(id), 1)[0]) : notificationStack.pop()\n\t\tif (targetId && currentNotification?.id === targetId) currentNotification.close()\n\t},\n\n\tupdate: (id: string, options: Partial<NotificationOptions>): void => {\n\t\tif (currentNotification?.id !== id) return\n\t\tif (options.title !== undefined) currentNotification.title = options.title\n\t\tif (options.message !== undefined) currentNotification.message = options.message\n\t\tif (options.type !== undefined) currentNotification.type = options.type\n\t},\n}\n\n","import { Observable, tap, finalize, catchError } from 'rxjs'\r\nimport { $notify, NotificationOptions } from './notification-service'\r\n\r\nexport interface NotifyOptions {\r\n\t/**\r\n\t * Message to show while the operation is in progress\r\n\t */\r\n\tloadingMessage?: string\r\n\t/**\r\n\t * Message to show when the operation completes successfully\r\n\t */\r\n\tsuccessMessage?: string\r\n\t/**\r\n\t * Message to show when the operation fails (can be a function to format error)\r\n\t */\r\n\terrorMessage?: string | ((error: any) => string)\r\n\t/**\r\n\t * Type of notification for loading state\r\n\t */\r\n\tloadingType?: NotificationOptions['type']\r\n\t/**\r\n\t * Type of notification for success state\r\n\t */\r\n\tsuccessType?: NotificationOptions['type']\r\n\t/**\r\n\t * Type of notification for error state\r\n\t */\r\n\terrorType?: NotificationOptions['type']\r\n\t/**\r\n\t * Whether to auto-dismiss the loading notification on complete/error\r\n\t */\r\n\tautoDismissLoading?: boolean\r\n\t/**\r\n\t * Duration for success notification (ms). Use 0 for persistent\r\n\t */\r\n\tsuccessDuration?: number\r\n\t/**\r\n\t * Duration for error notification (ms). Use 0 for persistent\r\n\t */\r\n\terrorDuration?: number\r\n}\r\n\r\n/**\r\n * Wraps an Observable with notification lifecycle management.\r\n * Shows a loading notification with progress indicator, then auto-dismisses and shows success/error notification.\r\n * \r\n * @example\r\n * ```typescript\r\n * // Basic usage with progress indicator\r\n * someApiCall().pipe(\r\n * notify({\r\n * loadingMessage: 'Loading data...',\r\n * successMessage: 'Data loaded successfully!',\r\n * errorMessage: 'Failed to load data'\r\n * })\r\n * ).subscribe()\r\n * \r\n * // With custom durations\r\n * saveData().pipe(\r\n * notify({\r\n * loadingMessage: 'Saving...',\r\n * successMessage: 'Saved!',\r\n * successDuration: 5000, // Success stays for 5 seconds\r\n * errorMessage: (err) => `Save failed: ${err.message}`,\r\n * errorDuration: 0 // Error is persistent until dismissed\r\n * })\r\n * ).subscribe()\r\n * \r\n * // Full configuration example\r\n * uploadFile().pipe(\r\n * notify({\r\n * loadingMessage: 'Uploading file...',\r\n * loadingType: 'info',\r\n * successMessage: 'Upload complete!',\r\n * successType: 'success',\r\n * successDuration: 3000,\r\n * errorMessage: (err) => `Upload failed: ${err.message}`,\r\n * errorType: 'error',\r\n * errorDuration: 10000,\r\n * autoDismissLoading: true\r\n * })\r\n * ).subscribe()\r\n * ```\r\n */\r\nexport function notify<T>(options: NotifyOptions) {\r\n\treturn (source: Observable<T>): Observable<T> => {\r\n\t\tlet loadingNotificationId: string | undefined\r\n\r\n\t\t// Show loading notification if message provided\r\n\t\tif (options.loadingMessage) {\r\n\t\t\tloadingNotificationId = $notify.show({\r\n\t\t\t\tmessage: options.loadingMessage,\r\n\t\t\t\ttype: options.loadingType || 'info',\r\n\t\t\t\tduration: 0, // Persistent until dismissed\r\n\t\t\t\tshowProgress: true, // Show indeterminate progress by default\r\n\t\t\t})\r\n\t\t}\r\n\r\n\t\treturn source.pipe(\r\n\t\t\ttap((value) => {\r\n\t\t\t\t// Check if the emitted value contains progress information\r\n\t\t\t\t// Common patterns: { progress: number }, { loaded: number, total: number }, etc.\r\n\t\t\t\tif (loadingNotificationId && typeof value === 'object' && value !== null) {\r\n\t\t\t\t\tlet progress: number | undefined\r\n\t\t\t\t\t\r\n\t\t\t\t\t// Check for different progress patterns\r\n\t\t\t\t\tif ('progress' in value && typeof (value as any).progress === 'number') {\r\n\t\t\t\t\t\tprogress = (value as any).progress\r\n\t\t\t\t\t} else if ('loaded' in value && 'total' in value) {\r\n\t\t\t\t\t\tconst loaded = (value as any).loaded\r\n\t\t\t\t\t\tconst total = (value as any).total\r\n\t\t\t\t\t\tif (typeof loaded === 'number' && typeof total === 'number' && total > 0) {\r\n\t\t\t\t\t\t\tprogress = (loaded / total) * 100\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t\t// Update notification with progress if available\r\n\t\t\t\t\tif (progress !== undefined) {\r\n\t\t\t\t\t\t// We need to update the progress of the notification\r\n\t\t\t\t\t\t// For now, we'll update the message to show progress percentage\r\n\t\t\t\t\t\t$notify.update?.(loadingNotificationId, {\r\n\t\t\t\t\t\t\tmessage: `${options.loadingMessage} (${Math.round(progress)}%)`,\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t// Check if this is the final success emission (not a progress update)\r\n\t\t\t\t// Typically file uploads emit progress events then a final result\r\n\t\t\t\tconst isProgressUpdate = typeof value === 'object' && value !== null && \r\n\t\t\t\t\t('progress' in value || ('loaded' in value && 'total' in value))\r\n\t\t\t\t\r\n\t\t\t\tif (!isProgressUpdate) {\r\n\t\t\t\t\t// On successful final emission, dismiss loading and show success\r\n\t\t\t\t\tif (loadingNotificationId && options.autoDismissLoading !== false) {\r\n\t\t\t\t\t\t$notify.dismiss(loadingNotificationId)\r\n\t\t\t\t\t\tloadingNotificationId = undefined\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (options.successMessage) {\r\n\t\t\t\t\t\t$notify.show({\r\n\t\t\t\t\t\t\tmessage: options.successMessage,\r\n\t\t\t\t\t\t\ttype: options.successType || 'success',\r\n\t\t\t\t\t\t\tduration: options.successDuration ?? 2000,\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}),\r\n\t\t\tcatchError((error) => {\r\n\t\t\t\t// On error, dismiss loading and show error\r\n\t\t\t\tif (loadingNotificationId && options.autoDismissLoading !== false) {\r\n\t\t\t\t\t$notify.dismiss(loadingNotificationId)\r\n\t\t\t\t\tloadingNotificationId = undefined\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (options.errorMessage) {\r\n\t\t\t\t\tconst message = typeof options.errorMessage === 'function' \r\n\t\t\t\t\t\t? options.errorMessage(error)\r\n\t\t\t\t\t\t: options.errorMessage\r\n\t\t\t\t\t\r\n\t\t\t\t\t$notify.show({\r\n\t\t\t\t\t\tmessage,\r\n\t\t\t\t\t\ttype: options.errorType || 'error',\r\n\t\t\t\t\t\tduration: options.errorDuration ?? 3000,\r\n\t\t\t\t\t})\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Re-throw the error to maintain the error flow\r\n\t\t\t\tthrow error\r\n\t\t\t}),\r\n\t\t\tfinalize(() => {\r\n\t\t\t\t// Clean up any remaining loading notification\r\n\t\t\t\tif (loadingNotificationId && options.autoDismissLoading !== false) {\r\n\t\t\t\t\t$notify.dismiss(loadingNotificationId)\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t)\r\n\t}\r\n}\r\n\r\n/**\r\n * Simplified version for API calls that just need loading and auto-dismiss.\r\n * Perfect for fire-and-forget operations where you want to show progress.\r\n * \r\n * @example\r\n * ```typescript\r\n * downloadData().pipe(\r\n * notifyProgress('Downloading...')\r\n * ).subscribe()\r\n * \r\n * // With custom messages\r\n * saveDocument().pipe(\r\n * notifyProgress('Saving document...', 'Document saved!', 'Save failed')\r\n * ).subscribe()\r\n * ```\r\n */\r\nexport function notifyProgress<T>(\r\n\tloadingMessage: string,\r\n\tsuccessMessage?: string,\r\n\terrorMessage?: string\r\n) {\r\n\treturn notify<T>({\r\n\t\tloadingMessage,\r\n\t\tsuccessMessage: successMessage || undefined,\r\n\t\terrorMessage: errorMessage || undefined,\r\n\t\tautoDismissLoading: true,\r\n\t})\r\n}"],"mappings":"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"}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
require(`./chunk-CncqDLb2.cjs`);const e=require(`./SchmancyElement-BBzRWB1w.cjs`);require(`./mixins-DPdzC9ZH.cjs`);const t=require(`./animation-CCOIW4wJ.cjs`),n=require(`./reduced-motion-Ds-HjMzn.cjs`),r=require(`./layout-DF9ZaQ-b.cjs`),i=require(`./overlay.service-DEj3rfRr.cjs`);require(`./overlay.confirm-body-CR9xaqOE.cjs`);let a=require(`rxjs`),o=require(`lit/decorators.js`),s=require(`lit`),c=require(`lit/directives/when.js`),l=require(`@floating-ui/dom`);var u=n.t.value;n.t.subscribe(e=>{u=e});var d=`--schmancy-overlay-origin-x`,f=`--schmancy-overlay-origin-y`,p=`var(${d}, 50%) var(${f}, 50%)`;function m(e){return Number.isNaN(e)||!Number.isFinite(e)?50:Math.max(0,Math.min(100,e))}function h(e){let{surface:t,dragHandle:n,until$:r}=e;return new a.Observable(e=>{let i=n??t,o=new a.Subject,s=!1,c=null,l=0,u=0,d=0;return(0,a.merge)((0,a.fromEvent)(i,`pointerdown`).pipe((0,a.filter)(e=>e.isPrimary&&(e.pointerType!==`mouse`||e.button===0)),(0,a.filter)(e=>{if(n)return!0;let r=t.getBoundingClientRect();return e.clientY-r.top<=40}),(0,a.tap)(e=>{s=!0,c=e.pointerId,l=e.clientY,u=performance.now(),d=0,t.style.transition=`none`,t.style.willChange=`transform`;try{i.setPointerCapture?.(e.pointerId)}catch{}})),(0,a.fromEvent)(i,`pointermove`).pipe((0,a.filter)(()=>s),(0,a.filter)(e=>e.pointerId===c),(0,a.tap)(e=>{d=function(e){if(e>=0)return e;let t=-e;return-Math.max(0,8*(Math.log(t+1)-2))}(e.clientY-l),t.style.transform=`translateY(${d}px)`,e.cancelable&&e.preventDefault()})),(0,a.merge)((0,a.fromEvent)(i,`pointerup`),(0,a.fromEvent)(i,`pointercancel`),(0,a.fromEvent)(i,`lostpointercapture`)).pipe((0,a.filter)(()=>s),(0,a.filter)(e=>e.pointerId===c),(0,a.tap)(()=>{s=!1;let n=c;c=null;try{n!==null&&i.releasePointerCapture?.(n)}catch{}let r=Math.max(1,performance.now()-u),a=d/r,o=t.getBoundingClientRect().height,l=Math.min(80,.25*o),f=d>l||d>20&&a>.4;t.style.willChange=``,f?(t.style.transition=`transform 300ms cubic-bezier(0.16, 1, 0.3, 1)`,t.style.transform=`translateY(100%)`,e.next(`dismiss`),e.complete()):(t.style.transition=`transform 300ms cubic-bezier(0.16, 1, 0.3, 1)`,t.style.transform=`translateY(0)`)}))).pipe((0,a.takeUntil)((0,a.merge)(o,r))).subscribe(),()=>{o.next(),o.complete(),t.style.transition=``,t.style.transform=``,t.style.willChange=``}}).pipe((0,a.take)(1))}function g(e){return e.anchor===void 0?`sheet`:`anchored`}function _(e,t){return{x:e,y:t,width:0,height:0,left:e,right:e,top:t,bottom:t,toJSON:()=>({x:e,y:t,width:0,height:0,left:e,right:e,top:t,bottom:t})}}var v=Object.freeze({popover:typeof HTMLElement<`u`&&`popover`in HTMLElement.prototype&&typeof HTMLElement.prototype.showPopover==`function`,cssAnchor:typeof CSS<`u`&&typeof CSS.supports==`function`&&CSS.supports(`anchor-name: --x`)});function y(e){if(!v.popover)throw Error(`positionPopoverAPI requires Popover API support`);e.setAttribute(`popover`,`manual`);try{e.showPopover()}catch{}return()=>{try{e.hidePopover?.()}catch{}e.removeAttribute(`popover`)}}function b(e,t,n={}){return new a.Observable(r=>{let i=t.el??t.virtual;if(!i)return void r.error(Error(`positionFloatingUI requires an element or virtual anchor`));let a=n.placement??`bottom-start`,o=n.padding??16,s=n.offsetPx??8,c=(0,l.autoUpdate)(i,e,async()=>{try{let{x:t,y:n}=await(0,l.computePosition)(i,e,{strategy:`fixed`,placement:a,middleware:[(0,l.offset)(s),(0,l.flip)({padding:o,fallbackPlacements:x(a)}),(0,l.shift)({padding:o}),(0,l.size)({padding:o,apply({availableWidth:e,availableHeight:t,elements:n}){n.floating.style.maxWidth=`${Math.max(0,e)}px`,n.floating.style.maxHeight=`${Math.max(0,t)}px`}})]});Object.assign(e.style,{position:`fixed`,left:`${Math.round(t)}px`,top:`${Math.round(n)}px`,transform:`none`}),r.next()}catch(e){r.error(e)}},{ancestorScroll:!0,ancestorResize:!0,elementResize:!1!==n.track});return()=>{c()}})}function x(e){switch(e){case`bottom-start`:return[`top-start`,`bottom-end`,`top-end`];case`bottom-end`:return[`top-end`,`bottom-start`,`top-start`];case`top-start`:return[`bottom-start`,`top-end`,`bottom-end`];case`top-end`:return[`bottom-end`,`top-start`,`bottom-start`];case`left-start`:return[`right-start`,`left-end`,`right-end`];case`left-end`:return[`right-end`,`left-start`,`right-start`];case`right-start`:return[`left-start`,`right-end`,`left-end`];case`right-end`:return[`left-end`,`right-start`,`left-start`];case`top`:return[`bottom`,`left`,`right`];case`bottom`:return[`top`,`left`,`right`];case`left`:return[`right`,`top`,`bottom`];case`right`:return[`left`,`top`,`bottom`];default:return[`top-start`,`bottom-end`]}}var S=`overlay-mount`,C=class extends e.t{constructor(...e){super(...e),this.layout=`sheet`,this.dismissable=!0,this.modal=!0,this.tier=`modal`,this._active=!1,this._full=!1,this._closed$=new a.Subject,this._mounted=!1,this._closing=!1,this._lastFocusedElement=null,this._inertedSiblings=[],this._lastReResolveAt=0,this.onBackdropClick=()=>{this.dismissable&&this.close(`backdrop`)}}static{this.styles=[s.css`
|
|
2
|
-
:host {
|
|
3
|
-
position: fixed;
|
|
4
|
-
inset: 0;
|
|
5
|
-
z-index: 10000;
|
|
6
|
-
display: none;
|
|
7
|
-
pointer-events: none;
|
|
8
|
-
}
|
|
9
|
-
:host([active]) {
|
|
10
|
-
display: block;
|
|
11
|
-
}
|
|
12
|
-
/* Vertical-gradient scrim — Tailwind's bg-gradient utilities cannot reach
|
|
13
|
-
* these color-mix percentages with sufficient control. */
|
|
14
|
-
.backdrop {
|
|
15
|
-
background: linear-gradient(
|
|
16
|
-
to bottom,
|
|
17
|
-
color-mix(in srgb, var(--schmancy-sys-color-scrim) 18%, transparent) 0%,
|
|
18
|
-
color-mix(in srgb, var(--schmancy-sys-color-scrim) 56%, transparent) 100%
|
|
19
|
-
);
|
|
20
|
-
-webkit-backdrop-filter: blur(16px) saturate(160%);
|
|
21
|
-
backdrop-filter: blur(16px) saturate(160%);
|
|
22
|
-
}
|
|
23
|
-
/* Popover top-layer surfaces — UA defaults push surface off-screen. */
|
|
24
|
-
.surface:popover-open {
|
|
25
|
-
margin: 0;
|
|
26
|
-
border: 0;
|
|
27
|
-
}
|
|
28
|
-
/* Modal tier promotes the whole shell (scrim + surface) into the top
|
|
29
|
-
* layer so every overlay — anchored or modal — shares ONE stacking
|
|
30
|
-
* domain ordered strictly by show() time. Neutralize the UA popover
|
|
31
|
-
* box so the shell stays full-viewport. */
|
|
32
|
-
.shell:popover-open {
|
|
33
|
-
inset: 0;
|
|
34
|
-
margin: 0;
|
|
35
|
-
border: 0;
|
|
36
|
-
width: 100%;
|
|
37
|
-
height: 100%;
|
|
38
|
-
max-width: none;
|
|
39
|
-
max-height: none;
|
|
40
|
-
background: transparent;
|
|
41
|
-
overflow: visible;
|
|
42
|
-
}
|
|
43
|
-
`]}get closed$(){return this._closed$.asObservable()}async open(e,t){if(this._mounted)throw Error(`schmancy-overlay: open() called twice on the same element`);this._mounted=!0,this.dismissable=!1!==t.dismissable,this._full=t.full??!1,this._rawAnchor=t.anchor,this._anchorOriginAnchor=t.anchor,this._resolvedAnchor=function(e){if(!e)return;if(typeof HTMLElement<`u`&&e instanceof HTMLElement)return{el:e};if(typeof e.getBoundingClientRect==`function`)return{virtual:{getBoundingClientRect:()=>e.getBoundingClientRect()}};if(typeof e.width==`number`&&typeof e.height==`number`&&typeof e.left==`number`&&typeof e.top==`number`){let t=e;return{virtual:{getBoundingClientRect:()=>t}}}if(typeof e.clientX==`number`&&typeof e.clientY==`number`){let t=e,n=_(t.clientX,t.clientY);return{virtual:{getBoundingClientRect:()=>n}}}if(e.touches!==void 0&&e.touches.length>0){let t=e.touches[0],n=_(t.clientX,t.clientY);return{virtual:{getBoundingClientRect:()=>n}}}let t=e,n=_(t.x,t.y);return{virtual:{getBoundingClientRect:()=>n}}}(t.anchor),this._active=!0,this.setAttribute(`active`,``),await this.updateComplete;let n=this.renderRoot.querySelector(`#${S}`);if(!n)throw Error(`schmancy-overlay: mount point missing`);var r;if(await w(e,n,t.props),this.layout=t.as??g({anchor:t.anchor}),this.modal=this.layout===`sheet`,this.tier=this.modal?`modal`:this._resolvedAnchor?(r=this._resolvedAnchor,v.popover&&v.cssAnchor&&r.el?`css-anchor`:v.popover?`popover-fui`:`fui-only`):`modal`,await this.updateComplete,this.tier===`css-anchor`&&this._resolvedAnchor?.el&&this.shadowRoot){this._positionerTeardown=function(e,t,n,r={id:``}){if(!t.el)throw Error(`positionCSSAnchor requires an element anchor`);let i=t.el,a=`--ov-${r.id||Math.random().toString(36).slice(2,10)}`,o=r.placement??`bottom-start`,s=i.style.getPropertyValue(`anchor-name`);i.style.setProperty(`anchor-name`,a);let c=new CSSStyleSheet;return c.replaceSync(`\n\t\t${e.localName}[data-overlay-ref="${r.id}"] {\n\t\t\tposition-anchor: ${a};\n\t\t\t${function(e){switch(e){case`top`:case`top-start`:return`bottom: anchor(top); left: anchor(start);`;case`top-end`:return`bottom: anchor(top); right: anchor(end);`;case`bottom`:case`bottom-start`:return`top: anchor(bottom); left: anchor(start);`;case`bottom-end`:return`top: anchor(bottom); right: anchor(end);`;case`left`:case`left-start`:return`right: anchor(left); top: anchor(start);`;case`left-end`:return`right: anchor(left); bottom: anchor(end);`;case`right`:case`right-start`:return`left: anchor(right); top: anchor(start);`;case`right-end`:return`left: anchor(right); bottom: anchor(end);`}}(o)}\n\t\t\tmargin: 8px;\n\t\t\tposition-try-fallbacks:\n\t\t\t\tflip-block,\n\t\t\t\tflip-inline,\n\t\t\t\tflip-block flip-inline;\n\t\t}\n\t`),e.dataset.overlayRef=r.id,n.adoptedStyleSheets=[...n.adoptedStyleSheets,c],()=>{s?i.style.setProperty(`anchor-name`,s):i.style.removeProperty(`anchor-name`),n.adoptedStyleSheets=n.adoptedStyleSheets.filter(e=>e!==c),delete e.dataset.overlayRef}}(this._surface,this._resolvedAnchor,this.shadowRoot,{id:`ov-${Math.random().toString(36).slice(2,10)}`,placement:t.preferredPlacement??`bottom-start`});let e=y(this._surface),n=this._positionerTeardown;this._positionerTeardown=()=>{e(),n?.()}}else if(this.tier===`popover-fui`&&this._resolvedAnchor){let e=y(this._surface),n=b(this._surface,this._resolvedAnchor,{placement:t.preferredPlacement??`bottom-start`,offsetPx:8,track:!1!==t.track}).pipe((0,a.takeUntil)(this.disconnecting)).subscribe();this._positionerTeardown=()=>{e(),n.unsubscribe()}}else if(this.tier===`fui-only`&&this._resolvedAnchor){let e=b(this._surface,this._resolvedAnchor,{placement:t.preferredPlacement??`bottom-start`,offsetPx:8,track:!1!==t.track}).pipe((0,a.takeUntil)(this.disconnecting)).subscribe();this._positionerTeardown=()=>e.unsubscribe()}else if(this.tier===`modal`&&this._shell)try{this._positionerTeardown=y(this._shell)}catch{}this.setAnchorOriginVars(),this.wireFocusTrap(),this.wireCloseTriggers(t.signal),this.wireResizeObserver(n),await this.playAnimations(`in`)}async close(e,t){if(!this._closing&&this._mounted){this._closing=!0;try{await this.playAnimations(`out`)}catch{}if(this.releaseFocusTrap(),this._positionerTeardown){try{this._positionerTeardown()}catch{}this._positionerTeardown=void 0}this._active=!1,this.removeAttribute(`active`),this._closed$.next({reason:e,result:t}),this._closed$.complete()}}render(){if(!this._active)return s.html``;let e=this.layout===`sheet`?this._full?`left-0 right-0 bottom-0 w-full h-[90dvh] rounded-t-[28px] shadow-overlay flex flex-col overflow-hidden`:`left-0 right-0 bottom-0 w-full max-h-[90dvh] rounded-t-[28px] shadow-overlay overflow-auto`:`max-w-[min(480px,calc(100vw-2rem))] max-h-[90dvh] rounded-3xl shadow-overlay-anchored overflow-auto`;return s.html`
|
|
44
|
-
<div class="shell fixed inset-0 pointer-events-none" part="shell">
|
|
45
|
-
${(0,c.when)(this.modal,()=>s.html`<div class="backdrop fixed inset-0 pointer-events-auto" part="backdrop" @click=${this.onBackdropClick}></div>`)}
|
|
46
|
-
<section
|
|
47
|
-
class="${`surface fixed pointer-events-auto bg-surface-container/85 text-surface-on backdrop-blur-md border border-surface-on/8`} ${e}"
|
|
48
|
-
part="surface"
|
|
49
|
-
data-layout=${this.layout}
|
|
50
|
-
data-tier=${this.tier}
|
|
51
|
-
role=${this.modal?`dialog`:`region`}
|
|
52
|
-
aria-modal=${this.modal?`true`:`false`}
|
|
53
|
-
tabindex="-1"
|
|
54
|
-
>
|
|
55
|
-
<div id=${S} class=${this.layout===`sheet`&&this._full?`flex-1 min-h-0 overflow-hidden`:``}></div>
|
|
56
|
-
</section>
|
|
57
|
-
</div>
|
|
58
|
-
`}setAnchorOriginVars(){let e=this._surface;if(!e)return;let t=e.getBoundingClientRect(),n=this.layout!==`sheet`||this._anchorOriginAnchor?function(e,t){if(!e)return{[d]:`50%`,[f]:`50%`};let{x:n,y:r}=function(e){if(typeof e.getBoundingClientRect==`function`){let t=e.getBoundingClientRect();return{x:t.left+t.width/2,y:t.top+t.height/2}}if(typeof e.width==`number`&&typeof e.height==`number`&&typeof e.left==`number`&&typeof e.top==`number`){let t=e;return{x:t.left+t.width/2,y:t.top+t.height/2}}if(typeof e.clientX==`number`&&typeof e.clientY==`number`){let t=e;return{x:t.clientX,y:t.clientY}}if(e.touches!==void 0&&e.touches.length>0){let t=e.touches[0];return{x:t.clientX,y:t.clientY}}let t=e;return{x:t.x,y:t.y}}(e);if(!t.width||!t.height)return{[d]:`50%`,[f]:`50%`};let i=m((n-t.left)/t.width*100),a=m((r-t.top)/t.height*100);return{[d]:`${i}%`,[f]:`${a}%`}}(this._anchorOriginAnchor,t):{"--schmancy-overlay-origin-x":`50%`,"--schmancy-overlay-origin-y":`100%`};for(let[t,r]of Object.entries(n))e.style.setProperty(t,r)}wireFocusTrap(){if(!this.modal)return;this._lastFocusedElement=document.activeElement??null;let e=this.parentElement;if(e){this._inertedSiblings=[];for(let t of Array.from(e.children))t!==this&&t instanceof HTMLElement&&!t.inert&&(t.inert=!0,this._inertedSiblings.push(t))}queueMicrotask(()=>{(this._surface?.querySelector(`[autofocus]`)??this._surface)?.focus()})}releaseFocusTrap(){for(let e of this._inertedSiblings)e.inert=!1;this._inertedSiblings=[];try{this._lastFocusedElement?.focus?.()}catch{}this._lastFocusedElement=null}wireCloseTriggers(e){let t=this.disconnecting;if(e?.aborted)return void queueMicrotask(()=>{this.close(`abort`)});let n=(0,a.fromEvent)(this,`close`).pipe((0,a.filter)(e=>e instanceof CustomEvent),(0,a.tap)(e=>e.stopPropagation()),(0,a.map)(e=>({reason:`structured`,result:e.detail}))),r=(0,a.fromEvent)(this,`submit`).pipe((0,a.filter)(e=>{let t=e.target;return!!t&&t.method===`dialog`}),(0,a.tap)(e=>e.preventDefault()),(0,a.map)(e=>({reason:`native-submit`,result:e.submitter?.value??``}))),o=(0,a.fromEvent)(document,`keydown`).pipe((0,a.filter)(e=>e.key===`Escape`),(0,a.tap)(e=>e.preventDefault()),(0,a.filter)(()=>this.dismissable),(0,a.map)(()=>({reason:`escape`})),(0,a.take)(1)),s=this.tier===`modal`?null:(0,a.fromEvent)(document,`pointerdown`,{capture:!0}).pipe((0,a.filter)(e=>{if(!this.dismissable)return!1;let t=e.composedPath();if(this._surface&&t.includes(this._surface)||this._resolvedAnchor?.el&&t.includes(this._resolvedAnchor.el))return!1;let n=i.s(),r=n.findIndex(e=>e.element===this);if(r!==-1)for(let e=r+1;e<n.length;e++){if(t.includes(n[e].element))return!1;let r=n[e].element.shadowRoot?.querySelector(`.surface`);if(r&&t.includes(r))return!1}return!0}),(0,a.map)(()=>({reason:`backdrop`})),(0,a.take)(1)),c=this.layout===`sheet`&&this.dismissable?h({surface:this._surface,until$:(0,a.merge)(t,this._closed$)}).pipe((0,a.take)(1),(0,a.map)(()=>({reason:`swipe`}))):null,l=e?(0,a.fromEvent)(e,`abort`).pipe((0,a.take)(1),(0,a.map)(()=>({reason:`abort`}))):null;(0,a.merge)(n,r,o,s??a.EMPTY,c??a.EMPTY,l??a.EMPTY).pipe((0,a.takeUntil)(t)).subscribe(({reason:e,result:t})=>{this.close(e,t)})}wireResizeObserver(e){r.t(e).pipe((0,a.map)(e=>{let t=e[0];if(!t)return null;let n=t.contentRect;return{w:n.width,h:n.height}}),(0,a.filter)(e=>e!==null),(0,a.distinctUntilChanged)((e,t)=>e.w===t.w&&e.h===t.h),(0,a.debounceTime)(80),(0,a.takeUntil)((0,a.merge)(this.disconnecting,this._closed$))).subscribe(e=>this.maybeReResolve(e))}async maybeReResolve(e){if(this._closing)return;let n=g({anchor:this._rawAnchor});if(n===this.layout||performance.now()-this._lastReResolveAt<600||(r=this.layout,i=n,r!==`anchored`||i!==`sheet`))return;var r,i;let a=this._surface,o=a.getBoundingClientRect();this.layout=n,await this.updateComplete;let s=function(e,n){return u?{keyframes:[{transform:`none`},{transform:`none`}],options:{duration:1,easing:`linear`,fill:`forwards`}}:{keyframes:[{transform:`translate(${e.left-n.left}px, ${e.top-n.top}px) scale(${n.width>0?e.width/n.width:1}, ${n.height>0?e.height/n.height:1})`,transformOrigin:`top left`},{transform:`none`,transformOrigin:`top left`}],options:{duration:t.d.duration,easing:t._(t.d),fill:`forwards`}}}(o,a.getBoundingClientRect());try{await a.animate(s.keyframes,s.options).finished}catch{}this._lastReResolveAt=performance.now()}async playAnimations(e){let n=this._surface;if(!n)return;let r=function(e,n){if(u)return n===`in`?{keyframes:[{opacity:0,transform:`none`},{opacity:1,transform:`none`}],options:{duration:1,easing:`linear`,fill:`forwards`}}:{keyframes:[{opacity:1,transform:`none`},{opacity:0,transform:`none`}],options:{duration:1,easing:`linear`,fill:`forwards`}};switch(e){case`sheet`:return n===`in`?{keyframes:[{opacity:0,transform:`translateY(100%)`},{opacity:1,transform:`translateY(0)`}],options:{duration:t.f.duration,easing:t._(t.f),fill:`forwards`}}:{keyframes:[{opacity:1,transform:`translateY(0)`},{opacity:0,transform:`translateY(100%)`}],options:{duration:150,easing:t._(t.d),fill:`forwards`}};case`anchored`:return n===`in`?{keyframes:[{opacity:0,transform:`scale(0.85)`,transformOrigin:p},{opacity:1,transform:`scale(1)`,transformOrigin:p}],options:{duration:t.f.duration,easing:t._(t.f),fill:`forwards`}}:{keyframes:[{opacity:1,transform:`scale(1)`,transformOrigin:p},{opacity:0,transform:`scale(0.92)`,transformOrigin:p}],options:{duration:150,easing:t._(t.d),fill:`forwards`}}}}(this.layout,e),i=[n.animate(r.keyframes,r.options).finished.catch(()=>{})],a=this._backdrop;this.modal&&a&&i.push(a.animate(e===`in`?[{opacity:0},{opacity:1}]:[{opacity:1},{opacity:0}],{duration:r.options.duration,easing:e===`in`?`ease-out`:`ease-in`,fill:`forwards`}).finished.catch(()=>{})),await Promise.all(i)}};async function w(e,t,n){if(typeof(r=e)==`function`&&!r.prototype)return w(e(),t,n);var r;if(function(e){return typeof e==`object`&&!!e&&`_$litType$`in e}(e))return(0,s.render)(e,t),t;if(e instanceof HTMLElement)return n&&Object.assign(e,n),t.appendChild(e),e;if(function(e){return typeof e==`function`&&(`preload`in e||`_promise`in e)}(e))return w((await e()).default,t,n);if(typeof e==`function`){let r=new e;return n&&Object.assign(r,n),t.appendChild(r),r}if(typeof e==`string`){let r=document.createElement(e);return n&&Object.assign(r,n),t.appendChild(r),r}throw Error(`schmancy-overlay: unsupported content type`)}e.u([(0,o.property)({type:String,reflect:!0})],C.prototype,`layout`,void 0),e.u([(0,o.property)({type:Boolean,reflect:!0})],C.prototype,`dismissable`,void 0),e.u([(0,o.property)({type:Boolean,reflect:!0})],C.prototype,`modal`,void 0),e.u([(0,o.property)({type:String,reflect:!0})],C.prototype,`tier`,void 0),e.u([(0,o.state)()],C.prototype,`_active`,void 0),e.u([(0,o.state)()],C.prototype,`_full`,void 0),e.u([(0,o.query)(`.backdrop`)],C.prototype,`_backdrop`,void 0),e.u([(0,o.query)(`.surface`)],C.prototype,`_surface`,void 0),e.u([(0,o.query)(`.shell`)],C.prototype,`_shell`,void 0),C=e.u([(0,o.customElement)(`schmancy-overlay`)],C),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return C}});
|