@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":"select-B-SSmUDe.cjs","names":[],"sources":["../src/form/fields/select/select.ts"],"sourcesContent":["import { autoUpdate, computePosition, flip, offset, shift } from '@floating-ui/dom'\nimport { SchmancyFormField } from '@mixins/index'\nimport { color } from '@schmancy/directives'\nimport SchmancyInput from '@schmancy/input/input'\nimport SchmancyOption from '@schmancy/option/option'\nimport { SchmancyTheme } from '@schmancy/theme/theme.interface'\nimport { css, html, PropertyValues, TemplateResult } from 'lit'\nimport { customElement, property, query, queryAssignedElements, state } from 'lit/decorators.js'\nimport { classMap } from 'lit/directives/class-map.js'\nimport { ifDefined } from 'lit/directives/if-defined.js'\nimport { BehaviorSubject, combineLatest, fromEvent, Subject, takeUntil } from 'rxjs'\nimport { tap, withLatestFrom } from 'rxjs/operators'\n\nexport type SchmancySelectChangeEvent = CustomEvent<{\n\tvalue: string | string[]\n}>\n\n/**\n * Select dropdown component with single and multi-select support.\n *\n * @prop {string} name - Name attribute for form submission\n * @prop {string} label - Label text displayed above the select\n * @prop {string} placeholder - Placeholder text when no value is selected\n * @prop {boolean} required - Whether the field is required\n * @prop {boolean} multi - Enable multi-select mode\n * @prop {string} value - Selected value (single select mode)\n * @prop {string[]} values - Selected values (multi-select mode)\n */\n@customElement('schmancy-select')\nexport class SchmancySelect extends SchmancyFormField() {\n\tstatic styles = [css`\n\t:host {\n\t\tdisplay: block;\n\t\tposition: relative;\n\t}\n\n\t[role='listbox'] {\n\t\toverflow-y: auto;\n\t\toutline: none;\n\t}\n`]\n\n\t// FACE wiring (formAssociated, internals, attachInternals) comes from\n\t// SchmancyFormField. Same for: name, required, disabled, validationMessage,\n\t// validateOn, touched/dirty/pristine/submitted, markTouched/markSubmitted,\n\t// formResetCallback, formDisabledCallback, FIELD_CONNECT_EVENT dispatch.\n\n\t@property({ type: String }) placeholder = ''\n\n\t// Override `value` with the narrowed select-specific type and a custom\n\t// getter/setter pair backed by reactive subjects.\n\t@property({ type: String, reflect: true })\n\toverride get value(): string | string[] {\n\t\treturn this.multi\n\t\t\t? (this._selectedValues$?.value ?? [])\n\t\t\t: (this._selectedValue$?.value ?? '')\n\t}\n\toverride set value(val: string | string[]) {\n\t\tif (!this._selectedValue$ || !this._selectedValues$) return\n\t\tif (this.multi) {\n\t\t\tconst values = Array.isArray(val)\n\t\t\t\t? val\n\t\t\t\t: val ? String(val).split(',').map(v => v.trim()).filter(Boolean) : []\n\t\t\tthis._selectedValues$.next(values)\n\t\t} else {\n\t\t\tthis._selectedValue$.next(val == null ? '' : String(val))\n\t\t}\n\t}\n\n\t// Values property for multi-select mode\n\t@property({ type: Array })\n\tget values() {\n\t\treturn [...this._selectedValues$.value]\n\t}\n\tset values(vals: string[]) {\n\t\tthis._selectedValues$.next(Array.isArray(vals) ? [...vals] : [])\n\t}\n\n\t@property({ type: Boolean }) multi = false\n\t// `label` and `hint` come from the mixin.\n\t// M3 aligned sizes: 24dp (xxs) → 32dp (xs) → 40dp (sm) → 48dp (md) → 56dp (lg)\n\t@property({ type: String }) size: 'xxs' | 'xs' | 'sm' | 'md' | 'lg' = 'md'\n\n\t// Internal states\n\t@state() private isOpen = false\n\t@state() private valueLabel = ''\n\t@state() private isValid = true\n\n\t// Store the initial/default value for reset behavior. Distinct from the\n\t// mixin's `_defaultValue` (which is `string` only); select needs the wider\n\t// shape so resetForm can restore arrays for multi-select.\n\t@state() private selectDefaultValue: string | string[] = ''\n\n\t@query('ul') private ul!: HTMLUListElement\n\t@query('sch-input') private inputRef!: SchmancyInput\n\t@queryAssignedElements({ flatten: true }) private options!: SchmancyOption[]\n\tprivate cleanupPositioner?: () => void\n\n\t// Reactive state management\n\tprivate _options$ = new BehaviorSubject<SchmancyOption[]>([])\n\tprivate _selectedValue$ = new BehaviorSubject<string>('')\n\tprivate _selectedValues$ = new BehaviorSubject<string[]>([])\n\tprivate _optionSelect$ = new Subject<SchmancyOption>()\n\n\t/**\n\t * Tracks whether the user has actively interacted (clicked/typed/keyed\n\t * inside the dropdown). Distinct from the mixin's `touched` (which fires on\n\t * blur). Used to gate dropdown-positioning side-effects on user-driven\n\t * actions versus programmatic state changes.\n\t */\n\t@state() _userInteracted = false\n\n\t// Reference to current focused option (for keyboard navigation)\n\t@state() private _focusedOptionId = ''\n\n\toverride connectedCallback() {\n\t\tsuper.connectedCallback()\n\t\tif (!this.id) {\n\t\t\tthis.id = `schmancy-select-${Math.random().toString(36).substring(2, 9)}`\n\t\t}\n\n\t\t// Store initial value for reset\n\t\tthis.selectDefaultValue = this.value\n\n\t\t// Add keyboard handling to host element\n\t\tfromEvent<KeyboardEvent>(this, 'keydown').pipe(takeUntil(this.disconnecting)).subscribe(this.handleKeyDown)\n\n\t\t// Setup reactive pipelines\n\t\tthis._setupReactivePipelines()\n\t}\n\n\toverride disconnectedCallback() {\n\t\tsuper.disconnectedCallback()\n\t\tthis.cleanupPositioner?.()\n\t\t// Form event listeners are automatically cleaned up via takeUntil(this.disconnecting)\n\t}\n\n\tfirstUpdated() {\n\t\tthis.syncSelection()\n\t\tthis.setupOptionsAccessibility()\n\n\t\t// Initially hide any validation errors until user interacts\n\t\tif (this.inputRef) {\n\t\t\tthis.inputRef.error = false\n\t\t}\n\t}\n\n\toverride updated(changedProps: PropertyValues) {\n\t\tsuper.updated(changedProps)\n\n\t\tif (changedProps.has('value')) {\n\t\t\t// Multi-select serializes to a comma-joined scalar on FormData; the\n\t\t\t// mixin's willUpdate already called setFormValue with the raw\n\t\t\t// value, override here for the joined-string shape.\n\t\t\tconst formValue = this.multi\n\t\t\t\t? this._selectedValues$.value.join(',')\n\t\t\t\t: this._selectedValue$.value\n\t\t\tthis.internals?.setFormValue(formValue)\n\n\t\t\t// `dirty` is a mixin getter (value !== _defaultValue); no manual flag.\n\t\t\t// Mixin's willUpdate already calls checkValidity when _shouldShowError().\n\t\t}\n\n\t\t// When open state changes, setup or cleanup the dropdown positioner\n\t\tif (changedProps.has('isOpen')) {\n\t\t\tif (this.isOpen) {\n\t\t\t\tthis.positionDropdown()\n\t\t\t} else {\n\t\t\t\tthis.cleanupPositioner?.()\n\t\t\t}\n\t\t}\n\t}\n\n\t// `shouldShowValidation` removed — replaced by mixin's `_shouldShowError()`.\n\n\tprivate syncSelection() {\n\t\tif (this.multi) {\n\t\t\t// Read directly from the BehaviorSubject to avoid string conversion issues\n\t\t\tconst selectedValues = this._selectedValues$.value\n\t\t\tthis.options?.forEach(o => (o.selected = selectedValues.includes(o.value))) // Update option selected state\n\t\t\tthis.valueLabel =\n\t\t\t\tselectedValues.length > 0\n\t\t\t\t\t? this.options\n\t\t\t\t\t\t\t?.filter(o => selectedValues.includes(o.value))\n\t\t\t\t\t\t\t.map(o => o.label || o.textContent || '')\n\t\t\t\t\t\t\t.join(', ') || this.placeholder\n\t\t\t\t\t: this.placeholder\n\t\t} else {\n\t\t\t// Single select - read from BehaviorSubject\n\t\t\tconst currentValue = this._selectedValue$.value\n\t\t\tthis.options?.forEach(o => {\n\t\t\t\t// Set selected property on each option based on matching value\n\t\t\t\to.selected = o.value === currentValue\n\t\t\t})\n\t\t\tconst selectedOption = this.options?.find(o => o.value === currentValue)\n\t\t\tthis.valueLabel = selectedOption ? (selectedOption.label || selectedOption.textContent || '') : this.placeholder\n\t\t}\n\t}\n\n\tprivate setupOptionsAccessibility() {\n\t\tthis.options?.forEach((option, index) => {\n\t\t\toption.setAttribute('role', 'option')\n\t\t\tif (!option.id) {\n\t\t\t\toption.id = `${this.id}-option-${index}`\n\t\t\t}\n\n\t\t\t// Set tabindex to -1 so they're focusable programmatically but not in the tab order\n\t\t\toption.tabIndex = -1\n\n\t\t\toption.setAttribute(\n\t\t\t\t'aria-selected',\n\t\t\t\tString(this.multi ? this._selectedValues$.value.includes(option.value) : option.value === this._selectedValue$.value),\n\t\t\t)\n\t\t})\n\t}\n\n\tprivate async positionDropdown() {\n\t\tconst reference = this.renderRoot.querySelector('.trigger') as HTMLElement\n\t\tif (!reference || !this.ul) return\n\n\t\tthis.cleanupPositioner = autoUpdate(reference, this.ul, async () => {\n\t\t\t// Get viewport dimensions\n\t\t\tconst viewportHeight = window.innerHeight\n\t\t\tconst triggerRect = reference.getBoundingClientRect()\n\n\t\t\t// Calculate available space below and above\n\t\t\tconst spaceBelow = viewportHeight - triggerRect.bottom\n\t\t\tconst spaceAbove = triggerRect.top\n\n\t\t\t// Calculate max height - use 75% of the largest available space, but at least 150px\n\t\t\tconst maxHeight = Math.max(Math.max(spaceBelow, spaceAbove) * 0.75, 150)\n\n\t\t\t// Determine if we should flip\n\t\t\tconst shouldFlip = spaceBelow < 200 && spaceAbove > spaceBelow\n\n\t\t\t// Apply max height\n\t\t\tthis.ul.style.maxHeight = `${maxHeight}px`\n\n\t\t\tconst { x, y } = await computePosition(reference, this.ul, {\n\t\t\t\tplacement: shouldFlip ? 'top-start' : 'bottom-start',\n\t\t\t\tmiddleware: [offset(5), flip(), shift({ padding: 5 })],\n\t\t\t})\n\n\t\t\tObject.assign(this.ul.style, {\n\t\t\t\tleft: `${x}px`,\n\t\t\t\ttop: `${y}px`,\n\t\t\t\tposition: 'absolute',\n\t\t\t\twidth: `${reference.offsetWidth}px`, // Match the width of the trigger\n\t\t\t})\n\t\t})\n\t}\n\n\tprivate handleKeyDown = (e: KeyboardEvent) => {\n\t\t// Don't handle keyboard events when disabled\n\t\tif (this.disabled) {\n\t\t\treturn\n\t\t}\n\n\t\tif (!this.isOpen) {\n\t\t\tif (['Enter', ' ', 'ArrowDown'].includes(e.key)) {\n\t\t\t\te.preventDefault()\n\t\t\t\tthis.openDropdown(false)\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\t// Find current focused option\n\t\tconst options = Array.from(this.options || [])\n\t\tconst current = options.findIndex(o => o.id === this._focusedOptionId) ?? -1\n\n\t\tswitch (e.key) {\n\t\t\tcase 'Escape':\n\t\t\t\te.preventDefault()\n\t\t\t\tthis.closeDropdown()\n\t\t\t\tbreak\n\t\t\tcase 'ArrowDown':\n\t\t\t\te.preventDefault()\n\t\t\t\tthis.focusOption(options, Math.min(current + 1, options.length - 1))\n\t\t\t\tbreak\n\t\t\tcase 'ArrowUp':\n\t\t\t\te.preventDefault()\n\t\t\t\tthis.focusOption(options, Math.max(current - 1, 0))\n\t\t\t\tbreak\n\t\t\tcase 'Home':\n\t\t\t\te.preventDefault()\n\t\t\t\tthis.focusOption(options, 0)\n\t\t\t\tbreak\n\t\t\tcase 'End':\n\t\t\t\te.preventDefault()\n\t\t\t\tthis.focusOption(options, options.length - 1)\n\t\t\t\tbreak\n\t\t\tcase 'Enter':\n\t\t\tcase ' ':\n\t\t\t\te.preventDefault()\n\t\t\t\tif (this._focusedOptionId) {\n\t\t\t\t\tconst focusedOption = options.find(opt => opt.id === this._focusedOptionId)\n\t\t\t\t\tif (focusedOption) {\n\t\t\t\t\t\tthis.handleOptionSelect(focusedOption.value)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\tcase 'Tab':\n\t\t\t\tthis.closeDropdown()\n\t\t\t\tbreak\n\t\t}\n\t}\n\n\tprivate focusOption(options: SchmancyOption[], index: number) {\n\t\tconst option = options[index]\n\t\tif (option) {\n\t\t\toption.focus()\n\t\t\tthis._focusedOptionId = option.id\n\n\t\t\t// Update aria-activedescendant on the combobox\n\t\t\tconst combobox = this.renderRoot.querySelector('.trigger')\n\t\t\tif (combobox) {\n\t\t\t\tcombobox.setAttribute('aria-activedescendant', option.id)\n\t\t\t}\n\n\t\t\t// Ensure option is visible in the scrollable area\n\t\t\tif (this.ul && option.offsetTop !== undefined) {\n\t\t\t\t// Get position info\n\t\t\t\tconst optionTop = option.offsetTop\n\t\t\t\tconst optionHeight = option.offsetHeight\n\t\t\t\tconst scrollTop = this.ul.scrollTop\n\t\t\t\tconst ulHeight = this.ul.clientHeight\n\n\t\t\t\t// Scroll into view if needed\n\t\t\t\tif (optionTop < scrollTop) {\n\t\t\t\t\tthis.ul.scrollTop = optionTop\n\t\t\t\t} else if (optionTop + optionHeight > scrollTop + ulHeight) {\n\t\t\t\t\tthis.ul.scrollTop = optionTop + optionHeight - ulHeight\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async openDropdown(report = false) {\n\t\t// Don't open if disabled\n\t\tif (this.disabled) {\n\t\t\treturn\n\t\t}\n\n\t\t// Don't mark as touched on opening - we'll do that on closing\n\t\t// so errors only show after interaction is complete\n\n\t\tthis.isOpen = true\n\t\tawait this.updateComplete\n\n\t\t// Focus first or selected option\n\t\tconst options = Array.from(this.options || [])\n\t\tconst selectedIndex = this.multi ? 0 : options.findIndex(o => o.value === this._selectedValue$.value)\n\n\t\tthis.focusOption(options, Math.max(selectedIndex, 0))\n\n\t\t// Don't automatically validate when opening\n\t\t// Only validate if explicitly requested (like from a form submission)\n\t\tif (report) this.reportValidity()\n\t}\n\n\tprivate closeDropdown() {\n\t\t// Only mark as touched if the user actually interacted with the component\n\t\t// and made a selection or explicitly closed it without selecting\n\t\tif (this._userInteracted) {\n\t\t\tthis.touched = true\n\t\t}\n\n\t\tthis.isOpen = false\n\t\tthis._focusedOptionId = ''\n\n\t\t// Update combobox to remove aria-activedescendant\n\t\tconst combobox = this.renderRoot.querySelector<HTMLElement>('.trigger')\n\t\tif (combobox) {\n\t\t\tcombobox.removeAttribute('aria-activedescendant')\n\t\t\tcombobox?.focus()\n\t\t}\n\n\t\t// Only check validity when closing if the user has actually interacted\n\t\t// with the component and validation should be shown\n\t\tif (this._userInteracted && this._shouldShowError()) {\n\t\t\tthis.checkValidity()\n\t\t}\n\t}\n\n\tprivate _setupReactivePipelines() {\n\t\t// Listen for option-select events from child options\n\t\tfromEvent<CustomEvent>(this, 'option-select')\n\t\t\t.pipe(\n\t\t\t\ttap((e) => {\n\t\t\t\t\te.stopPropagation() // Prevent event from bubbling further\n\t\t\t\t\tconst option = this.options.find(o => o.value === e.detail.value)\n\t\t\t\t\tif (option) {\n\t\t\t\t\t\tthis._optionSelect$.next(option)\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()\n\n\t\t// Handle option selection through reactive pipeline\n\t\tthis._optionSelect$\n\t\t\t.pipe(\n\t\t\t\twithLatestFrom(this._selectedValue$, this._selectedValues$),\n\t\t\t\ttap(([option, _, currentValues]) => {\n\t\t\t\t\tthis._userInteracted = true\n\t\t\t\t\tthis.markTouched()\n\t\t\t\t\t// `dirty` is a mixin getter; setting `value` below triggers it\n\n\t\t\t\t\tif (this.multi) {\n\t\t\t\t\t\tconst index = currentValues.indexOf(option.value)\n\t\t\t\t\t\tconst newValues = index > -1\n\t\t\t\t\t\t\t? [...currentValues.slice(0, index), ...currentValues.slice(index + 1)]\n\t\t\t\t\t\t\t: [...currentValues, option.value]\n\t\t\t\t\t\tthis._selectedValues$.next(newValues)\n\n\t\t\t\t\t\t// Update form value\n\t\t\t\t\t\tthis.internals?.setFormValue(newValues.join(','))\n\n\t\t\t\t\t\t// Update display label\n\t\t\t\t\t\tthis.valueLabel = newValues.length > 0\n\t\t\t\t\t\t\t? this.options\n\t\t\t\t\t\t\t\t\t.filter(o => newValues.includes(o.value))\n\t\t\t\t\t\t\t\t\t.map(o => o.label || o.textContent || '')\n\t\t\t\t\t\t\t\t\t.join(', ')\n\t\t\t\t\t\t\t: this.placeholder\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Single select\n\t\t\t\t\t\tthis._selectedValue$.next(option.value)\n\n\t\t\t\t\t\t// Update form value\n\t\t\t\t\t\tthis.internals?.setFormValue(option.value)\n\n\t\t\t\t\t\tthis.valueLabel = option.label || option.textContent || this.placeholder\n\t\t\t\t\t\tthis.closeDropdown()\n\t\t\t\t\t}\n\n\t\t\t\t\t// Update the option's accessibility state\n\t\t\t\t\tthis.setupOptionsAccessibility()\n\n\t\t\t\t\t// Dispatch change event\n\t\t\t\t\tthis._fireChangeEvent()\n\t\t\t\t}),\n\t\t\t\ttakeUntil(this.disconnecting)\n\t\t\t)\n\t\t\t.subscribe()\n\n\t\t// Options management pipeline - bind pointerdown events exactly like autocomplete\n\t\tthis._options$\n\t\t\t.pipe(\n\t\t\t\ttap((options) => {\n\t\t\t\t\toptions.forEach((option, index) => {\n\t\t\t\t\t\toption.setAttribute('role', 'option')\n\t\t\t\t\t\toption.tabIndex = -1\n\t\t\t\t\t\tif (!option.id) {\n\t\t\t\t\t\t\toption.id = `${this.id}-option-${index}`\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Use data-event-bound to prevent duplicate bindings\n\t\t\t\t\t\tif (!option.hasAttribute('data-event-bound')) {\n\t\t\t\t\t\t\t// Use click event instead of pointerdown for better mobile UX\n\t\t\t\t\t\t\t// This allows users to scroll through options without immediately selecting\n\t\t\t\t\t\t\tfromEvent(option, 'click').pipe(\n\t\t\t\t\t\t\t\ttap(e => {\n\t\t\t\t\t\t\t\t\te.stopPropagation()\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\ttakeUntil(this.disconnecting)\n\t\t\t\t\t\t\t).subscribe(() => this._optionSelect$.next(option))\n\t\t\t\t\t\t\toption.setAttribute('data-event-bound', 'true')\n\t\t\t\t\t\t}\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()\n\n\t\t// Selection sync pipeline - sync selected states with value changes\n\t\tcombineLatest([this._selectedValue$, this._selectedValues$, this._options$])\n\t\t\t.pipe(\n\t\t\t\ttap(([singleValue, multiValues, options]) => {\n\t\t\t\t\tif (options.length === 0) return\n\n\t\t\t\t\tif (this.multi) {\n\t\t\t\t\t\toptions.forEach(option => {\n\t\t\t\t\t\t\toption.selected = multiValues.includes(option.value)\n\t\t\t\t\t\t})\n\t\t\t\t\t} else {\n\t\t\t\t\t\toptions.forEach(option => {\n\t\t\t\t\t\t\toption.selected = option.value === singleValue\n\t\t\t\t\t\t})\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()\n\t}\n\n\tprivate handleOptionSelect(value: string) {\n\t\t// This method is now called from keyboard navigation only\n\t\tconst option = this.options.find(o => o.value === value)\n\t\tif (option) {\n\t\t\tthis._optionSelect$.next(option)\n\t\t}\n\t}\n\n\tprivate _fireChangeEvent() {\n\t\t// Get the current value based on multi/single mode\n\t\tconst value = this.multi ? this._selectedValues$.value : this._selectedValue$.value\n\n\t\t// Dispatch only one change event with the value in detail\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent<SchmancySelectChangeEvent['detail']>('change', {\n\t\t\t\tdetail: { value },\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t}),\n\t\t)\n\n\t\t// Then check validity (only show error if validation should be shown)\n\t\tthis.checkValidity()\n\t}\n\n\tpublic checkValidity(): boolean {\n\t\t// Disabled fields are always valid\n\t\tif (this.disabled) {\n\t\t\treturn true\n\t\t}\n\n\t\t// Determine if the select is empty based on whether it's multi-select or single-select\n\t\tconst isEmpty = this.multi\n\t\t\t? this._selectedValues$.value.length === 0\n\t\t\t: !this._selectedValue$.value\n\n\t\t// Check if the value is valid (not empty when required)\n\t\tconst isValid = !(this.required && isEmpty)\n\n\t\t// Set the validity state\n\t\tthis.isValid = isValid\n\n\t\tif (!this.isValid) {\n\t\t\tthis.validationMessage = 'Please select an option.'\n\t\t\tthis.internals?.setValidity({ valueMissing: true }, 'Please select an option.', this.inputRef)\n\t\t} else {\n\t\t\t// Clear validation message\n\t\t\tthis.validationMessage = ''\n\t\t\tthis.internals?.setValidity({})\n\t\t}\n\n\t\t// Update the input component to reflect our validation state\n\t\tif (this.inputRef && this.hasUpdated) {\n\t\t\tconst showError = !this.isValid && this._shouldShowError()\n\t\t\tthis.inputRef.error = showError\n\t\t\tthis.inputRef.hint = showError ? this.validationMessage : this.hint\n\t\t}\n\n\t\treturn this.isValid\n\t}\n\n\tpublic reportValidity(): boolean {\n\t\t// Force validation display regardless of validation strategy\n\t\tconst valid = this.checkValidity()\n\n\t\t// Force the input to show validation errors\n\t\tif (this.inputRef) {\n\t\t\t// Set the input's error state\n\t\t\tthis.inputRef.error = !valid\n\t\t\tthis.inputRef.hint = !valid ? this.validationMessage : this.hint\n\n\t\t\t// If invalid and not already open, automatically open the dropdown to show options\n\t\t\tif (!valid && !this.isOpen) {\n\t\t\t\t// Open the dropdown but don't mark as user interaction yet\n\t\t\t\t// This helps users immediately see available options when validation fails\n\t\t\t\tthis.openDropdown(false)\n\t\t\t}\n\n\t\t\t// Only call reportValidity on the input if invalid to show the native popup\n\t\t\tif (!valid) {\n\t\t\t\tthis.inputRef.reportValidity()\n\t\t\t}\n\t\t}\n\n\t\treturn valid\n\t}\n\n\t// `markTouched`, `markSubmitted`, `touched`, `dirty`, `pristine`, `submitted`,\n\t// `error` (storage) — all from the mixin. Select's `error` semantics\n\t// (errors-while-open suppression) live in render() via _shouldShowError() +\n\t// !isOpen, not as a separate getter.\n\n\t/**\n\t * Multi-value-aware `toFormEntries`. Single-select emits one `[name,value]`;\n\t * multi-select emits N entries with the same name (canonical FormData shape\n\t * for repeated fields).\n\t */\n\toverride toFormEntries(): Array<[string, FormDataEntryValue]> {\n\t\tif (!this.name || this.disabled) return []\n\t\tconst v = this.value\n\t\tif (v === undefined || v === null || v === '') return []\n\t\tif (Array.isArray(v))\n\t\t\treturn v.map(item => [this.name, String(item)] as [string, FormDataEntryValue])\n\t\treturn [[this.name, String(v)]]\n\t}\n\n\toverride setCustomValidity(message: string) {\n\t\tthis.validationMessage = message\n\t\tif (message) {\n\t\t\tthis.isValid = false\n\t\t\tthis.internals?.setValidity({ customError: true }, message, this.inputRef)\n\t\t} else {\n\t\t\tthis.isValid = true\n\t\t\tthis.internals?.setValidity({})\n\t\t}\n\n\t\t// Update input if needed\n\t\tif (this.inputRef && this._shouldShowError()) {\n\t\t\tthis.inputRef.error = !this.isValid\n\t\t\tthis.inputRef.hint = !this.isValid ? this.validationMessage : this.hint\n\t\t}\n\t}\n\n\t/**\n\t * Reset to the snapshot captured at connect time. Mixin's `resetForm`\n\t * handles touched/submitted/error/validationMessage; the override layers on\n\t * select-specific cleanup (value subjects, label, validity).\n\t */\n\toverride resetForm(): void {\n\t\t// Restore value (multi-aware) before super so the mixin's _defaultValue\n\t\t// reset doesn't clobber the array-shape we need.\n\t\tthis.value = this.selectDefaultValue\n\t\tthis.valueLabel = this.placeholder\n\t\tthis.isValid = true\n\t\tthis._userInteracted = false\n\t\tthis.internals?.setValidity({})\n\t\tsuper.resetForm()\n\t\tif (this.inputRef) {\n\t\t\tthis.inputRef.error = false\n\t\t\tthis.inputRef.hint = this.hint\n\t\t}\n\t}\n\n\t/** Back-compat alias for callers that used the previous public API. */\n\tpublic reset(): void {\n\t\tthis.resetForm()\n\t}\n\n\trender(): TemplateResult {\n\t\t// Determine if we should show errors based on the validation strategy and interaction\n\t\t// Never show errors on initial render or if the dropdown is open\n\t\tconst showErrors = !this.isValid && this._shouldShowError() && !this.isOpen\n\n\t\t// Add caret icon based on open state\n\t\tconst caretIcon = this.isOpen\n\t\t\t? html`<span class=\"absolute right-3 top-1/2 transform -translate-y-1/2\">▲</span>`\n\t\t\t: html`<span class=\"absolute right-3 top-1/2 transform -translate-y-1/2\">▼</span>`\n\n\t\treturn html`\n\t\t\t<div class=\"relative ${this.disabled ? 'opacity-60 cursor-not-allowed' : ''}\">\n\t\t\t\t<sch-input\n\t\t\t\t\t.name=${this.name ?? ''}\n\t\t\t\t\ttabIndex=${this.disabled ? '-1' : '0'}\n\t\t\t\t\tclass=\"trigger\"\n\t\t\t\t\trole=\"combobox\"\n\t\t\t\t\taria-haspopup=\"listbox\"\n\t\t\t\t\taria-expanded=${this.isOpen}\n\t\t\t\t\taria-controls=\"options\"\n\t\t\t\t\taria-autocomplete=\"none\"\n\t\t\t\t\taria-required=${this.required}\n\t\t\t\t\taria-activedescendant=${ifDefined(this._focusedOptionId || undefined)}\n\t\t\t\t\taria-disabled=${this.disabled}\n\t\t\t\t\t.label=${this.label}\n\t\t\t\t\t.placeholder=${this.placeholder}\n\t\t\t\t\t.value=${this.valueLabel}\n\t\t\t\t\t.required=${this.required}\n\t\t\t\t\t.disabled=${this.disabled}\n\t\t\t\t\t.hint=${showErrors ? this.validationMessage : this.hint}\n\t\t\t\t\t.error=${showErrors}\n\t\t\t\t\t.validateOn=${this.validateOn}\n\t\t\t\t\t.size=${this.size}\n\t\t\t\t\t.readonly=${true}\n\t\t\t\t\tclickable\n\t\t\t\t\t@click=${(e: MouseEvent) => {\n\t\t\t\t\t\t// Don't process clicks if disabled\n\t\t\t\t\t\tif (this.disabled) {\n\t\t\t\t\t\t\te.preventDefault()\n\t\t\t\t\t\t\te.stopPropagation()\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// On first click, don't count this as user interaction yet\n\t\t\t\t\t\tif (!this.isOpen) {\n\t\t\t\t\t\t\t// Open without triggering validation - we'll validate when they close\n\t\t\t\t\t\t\tthis.openDropdown(false)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Mark as interacted when they close the dropdown\n\t\t\t\t\t\t\tthis._userInteracted = true\n\t\t\t\t\t\t\tthis.closeDropdown()\n\t\t\t\t\t\t}\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t${caretIcon}\n\t\t\t\t</sch-input>\n\n\t\t\t\t<!-- Overlay for capturing clicks outside when dropdown is open -->\n\t\t\t\t${this.isOpen\n\t\t\t\t\t? html` <div class=\"fixed inset-0 z-10\" @click=${this.closeDropdown} tabindex=\"-1\" aria-hidden=\"true\"></div> `\n\t\t\t\t\t: ''}\n\n\t\t\t\t<ul\n\t\t\t\t\tid=\"options\"\n\t\t\t\t\trole=\"listbox\"\n\t\t\t\t\taria-multiselectable=${this.multi}\n\t\t\t\t\tclass=${classMap({\n\t\t\t\t\t\t'absolute min-w-full w-full z-20 mt-1 rounded-md shadow-lg': true,\n\t\t\t\t\t\thidden: !this.isOpen,\n\t\t\t\t\t})}\n\t\t\t\t\t${color({\n\t\t\t\t\t\tbgColor: SchmancyTheme.sys.color.surface.low,\n\t\t\t\t\t\tcolor: SchmancyTheme.sys.color.surface.on,\n\t\t\t\t\t})}\n\t\t\t\t>\n\t\t\t\t\t<slot\n\t\t\t\t\t\t@slotchange=${() => {\n\t\t\t\t\t\t\tthis._options$.next(this.options)\n\t\t\t\t\t\t\t// Sync selection state when options re-render\n\t\t\t\t\t\t\tthis.syncSelection()\n\t\t\t\t\t\t}}\n\t\t\t\t\t></slot>\n\t\t\t\t</ul>\n\t\t\t</div>\n\t\t`\n\t}\n}\n\n// Don't export 'select' here as it conflicts with the store's select decorator\n// export const select = SchmancySelect\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-select': SchmancySelect\n\t}\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"select-CEyhNtZ2.js","names":[],"sources":["../src/form/fields/select/select.ts"],"sourcesContent":["import { autoUpdate, computePosition, flip, offset, shift } from '@floating-ui/dom'\nimport { SchmancyFormField } from '@mixins/index'\nimport { color } from '@schmancy/directives'\nimport SchmancyInput from '@schmancy/input/input'\nimport SchmancyOption from '@schmancy/option/option'\nimport { SchmancyTheme } from '@schmancy/theme/theme.interface'\nimport { css, html, PropertyValues, TemplateResult } from 'lit'\nimport { customElement, property, query, queryAssignedElements, state } from 'lit/decorators.js'\nimport { classMap } from 'lit/directives/class-map.js'\nimport { ifDefined } from 'lit/directives/if-defined.js'\nimport { BehaviorSubject, combineLatest, fromEvent, Subject, takeUntil } from 'rxjs'\nimport { tap, withLatestFrom } from 'rxjs/operators'\n\nexport type SchmancySelectChangeEvent = CustomEvent<{\n\tvalue: string | string[]\n}>\n\n/**\n * Select dropdown component with single and multi-select support.\n *\n * @prop {string} name - Name attribute for form submission\n * @prop {string} label - Label text displayed above the select\n * @prop {string} placeholder - Placeholder text when no value is selected\n * @prop {boolean} required - Whether the field is required\n * @prop {boolean} multi - Enable multi-select mode\n * @prop {string} value - Selected value (single select mode)\n * @prop {string[]} values - Selected values (multi-select mode)\n */\n@customElement('schmancy-select')\nexport class SchmancySelect extends SchmancyFormField() {\n\tstatic styles = [css`\n\t:host {\n\t\tdisplay: block;\n\t\tposition: relative;\n\t}\n\n\t[role='listbox'] {\n\t\toverflow-y: auto;\n\t\toutline: none;\n\t}\n`]\n\n\t// FACE wiring (formAssociated, internals, attachInternals) comes from\n\t// SchmancyFormField. Same for: name, required, disabled, validationMessage,\n\t// validateOn, touched/dirty/pristine/submitted, markTouched/markSubmitted,\n\t// formResetCallback, formDisabledCallback, FIELD_CONNECT_EVENT dispatch.\n\n\t@property({ type: String }) placeholder = ''\n\n\t// Override `value` with the narrowed select-specific type and a custom\n\t// getter/setter pair backed by reactive subjects.\n\t@property({ type: String, reflect: true })\n\toverride get value(): string | string[] {\n\t\treturn this.multi\n\t\t\t? (this._selectedValues$?.value ?? [])\n\t\t\t: (this._selectedValue$?.value ?? '')\n\t}\n\toverride set value(val: string | string[]) {\n\t\tif (!this._selectedValue$ || !this._selectedValues$) return\n\t\tif (this.multi) {\n\t\t\tconst values = Array.isArray(val)\n\t\t\t\t? val\n\t\t\t\t: val ? String(val).split(',').map(v => v.trim()).filter(Boolean) : []\n\t\t\tthis._selectedValues$.next(values)\n\t\t} else {\n\t\t\tthis._selectedValue$.next(val == null ? '' : String(val))\n\t\t}\n\t}\n\n\t// Values property for multi-select mode\n\t@property({ type: Array })\n\tget values() {\n\t\treturn [...this._selectedValues$.value]\n\t}\n\tset values(vals: string[]) {\n\t\tthis._selectedValues$.next(Array.isArray(vals) ? [...vals] : [])\n\t}\n\n\t@property({ type: Boolean }) multi = false\n\t// `label` and `hint` come from the mixin.\n\t// M3 aligned sizes: 24dp (xxs) → 32dp (xs) → 40dp (sm) → 48dp (md) → 56dp (lg)\n\t@property({ type: String }) size: 'xxs' | 'xs' | 'sm' | 'md' | 'lg' = 'md'\n\n\t// Internal states\n\t@state() private isOpen = false\n\t@state() private valueLabel = ''\n\t@state() private isValid = true\n\n\t// Store the initial/default value for reset behavior. Distinct from the\n\t// mixin's `_defaultValue` (which is `string` only); select needs the wider\n\t// shape so resetForm can restore arrays for multi-select.\n\t@state() private selectDefaultValue: string | string[] = ''\n\n\t@query('ul') private ul!: HTMLUListElement\n\t@query('sch-input') private inputRef!: SchmancyInput\n\t@queryAssignedElements({ flatten: true }) private options!: SchmancyOption[]\n\tprivate cleanupPositioner?: () => void\n\n\t// Reactive state management\n\tprivate _options$ = new BehaviorSubject<SchmancyOption[]>([])\n\tprivate _selectedValue$ = new BehaviorSubject<string>('')\n\tprivate _selectedValues$ = new BehaviorSubject<string[]>([])\n\tprivate _optionSelect$ = new Subject<SchmancyOption>()\n\n\t/**\n\t * Tracks whether the user has actively interacted (clicked/typed/keyed\n\t * inside the dropdown). Distinct from the mixin's `touched` (which fires on\n\t * blur). Used to gate dropdown-positioning side-effects on user-driven\n\t * actions versus programmatic state changes.\n\t */\n\t@state() _userInteracted = false\n\n\t// Reference to current focused option (for keyboard navigation)\n\t@state() private _focusedOptionId = ''\n\n\toverride connectedCallback() {\n\t\tsuper.connectedCallback()\n\t\tif (!this.id) {\n\t\t\tthis.id = `schmancy-select-${Math.random().toString(36).substring(2, 9)}`\n\t\t}\n\n\t\t// Store initial value for reset\n\t\tthis.selectDefaultValue = this.value\n\n\t\t// Add keyboard handling to host element\n\t\tfromEvent<KeyboardEvent>(this, 'keydown').pipe(takeUntil(this.disconnecting)).subscribe(this.handleKeyDown)\n\n\t\t// Setup reactive pipelines\n\t\tthis._setupReactivePipelines()\n\t}\n\n\toverride disconnectedCallback() {\n\t\tsuper.disconnectedCallback()\n\t\tthis.cleanupPositioner?.()\n\t\t// Form event listeners are automatically cleaned up via takeUntil(this.disconnecting)\n\t}\n\n\tfirstUpdated() {\n\t\tthis.syncSelection()\n\t\tthis.setupOptionsAccessibility()\n\n\t\t// Initially hide any validation errors until user interacts\n\t\tif (this.inputRef) {\n\t\t\tthis.inputRef.error = false\n\t\t}\n\t}\n\n\toverride updated(changedProps: PropertyValues) {\n\t\tsuper.updated(changedProps)\n\n\t\tif (changedProps.has('value')) {\n\t\t\t// Multi-select serializes to a comma-joined scalar on FormData; the\n\t\t\t// mixin's willUpdate already called setFormValue with the raw\n\t\t\t// value, override here for the joined-string shape.\n\t\t\tconst formValue = this.multi\n\t\t\t\t? this._selectedValues$.value.join(',')\n\t\t\t\t: this._selectedValue$.value\n\t\t\tthis.internals?.setFormValue(formValue)\n\n\t\t\t// `dirty` is a mixin getter (value !== _defaultValue); no manual flag.\n\t\t\t// Mixin's willUpdate already calls checkValidity when _shouldShowError().\n\t\t}\n\n\t\t// When open state changes, setup or cleanup the dropdown positioner\n\t\tif (changedProps.has('isOpen')) {\n\t\t\tif (this.isOpen) {\n\t\t\t\tthis.positionDropdown()\n\t\t\t} else {\n\t\t\t\tthis.cleanupPositioner?.()\n\t\t\t}\n\t\t}\n\t}\n\n\t// `shouldShowValidation` removed — replaced by mixin's `_shouldShowError()`.\n\n\tprivate syncSelection() {\n\t\tif (this.multi) {\n\t\t\t// Read directly from the BehaviorSubject to avoid string conversion issues\n\t\t\tconst selectedValues = this._selectedValues$.value\n\t\t\tthis.options?.forEach(o => (o.selected = selectedValues.includes(o.value))) // Update option selected state\n\t\t\tthis.valueLabel =\n\t\t\t\tselectedValues.length > 0\n\t\t\t\t\t? this.options\n\t\t\t\t\t\t\t?.filter(o => selectedValues.includes(o.value))\n\t\t\t\t\t\t\t.map(o => o.label || o.textContent || '')\n\t\t\t\t\t\t\t.join(', ') || this.placeholder\n\t\t\t\t\t: this.placeholder\n\t\t} else {\n\t\t\t// Single select - read from BehaviorSubject\n\t\t\tconst currentValue = this._selectedValue$.value\n\t\t\tthis.options?.forEach(o => {\n\t\t\t\t// Set selected property on each option based on matching value\n\t\t\t\to.selected = o.value === currentValue\n\t\t\t})\n\t\t\tconst selectedOption = this.options?.find(o => o.value === currentValue)\n\t\t\tthis.valueLabel = selectedOption ? (selectedOption.label || selectedOption.textContent || '') : this.placeholder\n\t\t}\n\t}\n\n\tprivate setupOptionsAccessibility() {\n\t\tthis.options?.forEach((option, index) => {\n\t\t\toption.setAttribute('role', 'option')\n\t\t\tif (!option.id) {\n\t\t\t\toption.id = `${this.id}-option-${index}`\n\t\t\t}\n\n\t\t\t// Set tabindex to -1 so they're focusable programmatically but not in the tab order\n\t\t\toption.tabIndex = -1\n\n\t\t\toption.setAttribute(\n\t\t\t\t'aria-selected',\n\t\t\t\tString(this.multi ? this._selectedValues$.value.includes(option.value) : option.value === this._selectedValue$.value),\n\t\t\t)\n\t\t})\n\t}\n\n\tprivate async positionDropdown() {\n\t\tconst reference = this.renderRoot.querySelector('.trigger') as HTMLElement\n\t\tif (!reference || !this.ul) return\n\n\t\tthis.cleanupPositioner = autoUpdate(reference, this.ul, async () => {\n\t\t\t// Get viewport dimensions\n\t\t\tconst viewportHeight = window.innerHeight\n\t\t\tconst triggerRect = reference.getBoundingClientRect()\n\n\t\t\t// Calculate available space below and above\n\t\t\tconst spaceBelow = viewportHeight - triggerRect.bottom\n\t\t\tconst spaceAbove = triggerRect.top\n\n\t\t\t// Calculate max height - use 75% of the largest available space, but at least 150px\n\t\t\tconst maxHeight = Math.max(Math.max(spaceBelow, spaceAbove) * 0.75, 150)\n\n\t\t\t// Determine if we should flip\n\t\t\tconst shouldFlip = spaceBelow < 200 && spaceAbove > spaceBelow\n\n\t\t\t// Apply max height\n\t\t\tthis.ul.style.maxHeight = `${maxHeight}px`\n\n\t\t\tconst { x, y } = await computePosition(reference, this.ul, {\n\t\t\t\tplacement: shouldFlip ? 'top-start' : 'bottom-start',\n\t\t\t\tmiddleware: [offset(5), flip(), shift({ padding: 5 })],\n\t\t\t})\n\n\t\t\tObject.assign(this.ul.style, {\n\t\t\t\tleft: `${x}px`,\n\t\t\t\ttop: `${y}px`,\n\t\t\t\tposition: 'absolute',\n\t\t\t\twidth: `${reference.offsetWidth}px`, // Match the width of the trigger\n\t\t\t})\n\t\t})\n\t}\n\n\tprivate handleKeyDown = (e: KeyboardEvent) => {\n\t\t// Don't handle keyboard events when disabled\n\t\tif (this.disabled) {\n\t\t\treturn\n\t\t}\n\n\t\tif (!this.isOpen) {\n\t\t\tif (['Enter', ' ', 'ArrowDown'].includes(e.key)) {\n\t\t\t\te.preventDefault()\n\t\t\t\tthis.openDropdown(false)\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\t// Find current focused option\n\t\tconst options = Array.from(this.options || [])\n\t\tconst current = options.findIndex(o => o.id === this._focusedOptionId) ?? -1\n\n\t\tswitch (e.key) {\n\t\t\tcase 'Escape':\n\t\t\t\te.preventDefault()\n\t\t\t\tthis.closeDropdown()\n\t\t\t\tbreak\n\t\t\tcase 'ArrowDown':\n\t\t\t\te.preventDefault()\n\t\t\t\tthis.focusOption(options, Math.min(current + 1, options.length - 1))\n\t\t\t\tbreak\n\t\t\tcase 'ArrowUp':\n\t\t\t\te.preventDefault()\n\t\t\t\tthis.focusOption(options, Math.max(current - 1, 0))\n\t\t\t\tbreak\n\t\t\tcase 'Home':\n\t\t\t\te.preventDefault()\n\t\t\t\tthis.focusOption(options, 0)\n\t\t\t\tbreak\n\t\t\tcase 'End':\n\t\t\t\te.preventDefault()\n\t\t\t\tthis.focusOption(options, options.length - 1)\n\t\t\t\tbreak\n\t\t\tcase 'Enter':\n\t\t\tcase ' ':\n\t\t\t\te.preventDefault()\n\t\t\t\tif (this._focusedOptionId) {\n\t\t\t\t\tconst focusedOption = options.find(opt => opt.id === this._focusedOptionId)\n\t\t\t\t\tif (focusedOption) {\n\t\t\t\t\t\tthis.handleOptionSelect(focusedOption.value)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\tcase 'Tab':\n\t\t\t\tthis.closeDropdown()\n\t\t\t\tbreak\n\t\t}\n\t}\n\n\tprivate focusOption(options: SchmancyOption[], index: number) {\n\t\tconst option = options[index]\n\t\tif (option) {\n\t\t\toption.focus()\n\t\t\tthis._focusedOptionId = option.id\n\n\t\t\t// Update aria-activedescendant on the combobox\n\t\t\tconst combobox = this.renderRoot.querySelector('.trigger')\n\t\t\tif (combobox) {\n\t\t\t\tcombobox.setAttribute('aria-activedescendant', option.id)\n\t\t\t}\n\n\t\t\t// Ensure option is visible in the scrollable area\n\t\t\tif (this.ul && option.offsetTop !== undefined) {\n\t\t\t\t// Get position info\n\t\t\t\tconst optionTop = option.offsetTop\n\t\t\t\tconst optionHeight = option.offsetHeight\n\t\t\t\tconst scrollTop = this.ul.scrollTop\n\t\t\t\tconst ulHeight = this.ul.clientHeight\n\n\t\t\t\t// Scroll into view if needed\n\t\t\t\tif (optionTop < scrollTop) {\n\t\t\t\t\tthis.ul.scrollTop = optionTop\n\t\t\t\t} else if (optionTop + optionHeight > scrollTop + ulHeight) {\n\t\t\t\t\tthis.ul.scrollTop = optionTop + optionHeight - ulHeight\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async openDropdown(report = false) {\n\t\t// Don't open if disabled\n\t\tif (this.disabled) {\n\t\t\treturn\n\t\t}\n\n\t\t// Don't mark as touched on opening - we'll do that on closing\n\t\t// so errors only show after interaction is complete\n\n\t\tthis.isOpen = true\n\t\tawait this.updateComplete\n\n\t\t// Focus first or selected option\n\t\tconst options = Array.from(this.options || [])\n\t\tconst selectedIndex = this.multi ? 0 : options.findIndex(o => o.value === this._selectedValue$.value)\n\n\t\tthis.focusOption(options, Math.max(selectedIndex, 0))\n\n\t\t// Don't automatically validate when opening\n\t\t// Only validate if explicitly requested (like from a form submission)\n\t\tif (report) this.reportValidity()\n\t}\n\n\tprivate closeDropdown() {\n\t\t// Only mark as touched if the user actually interacted with the component\n\t\t// and made a selection or explicitly closed it without selecting\n\t\tif (this._userInteracted) {\n\t\t\tthis.touched = true\n\t\t}\n\n\t\tthis.isOpen = false\n\t\tthis._focusedOptionId = ''\n\n\t\t// Update combobox to remove aria-activedescendant\n\t\tconst combobox = this.renderRoot.querySelector<HTMLElement>('.trigger')\n\t\tif (combobox) {\n\t\t\tcombobox.removeAttribute('aria-activedescendant')\n\t\t\tcombobox?.focus()\n\t\t}\n\n\t\t// Only check validity when closing if the user has actually interacted\n\t\t// with the component and validation should be shown\n\t\tif (this._userInteracted && this._shouldShowError()) {\n\t\t\tthis.checkValidity()\n\t\t}\n\t}\n\n\tprivate _setupReactivePipelines() {\n\t\t// Listen for option-select events from child options\n\t\tfromEvent<CustomEvent>(this, 'option-select')\n\t\t\t.pipe(\n\t\t\t\ttap((e) => {\n\t\t\t\t\te.stopPropagation() // Prevent event from bubbling further\n\t\t\t\t\tconst option = this.options.find(o => o.value === e.detail.value)\n\t\t\t\t\tif (option) {\n\t\t\t\t\t\tthis._optionSelect$.next(option)\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()\n\n\t\t// Handle option selection through reactive pipeline\n\t\tthis._optionSelect$\n\t\t\t.pipe(\n\t\t\t\twithLatestFrom(this._selectedValue$, this._selectedValues$),\n\t\t\t\ttap(([option, _, currentValues]) => {\n\t\t\t\t\tthis._userInteracted = true\n\t\t\t\t\tthis.markTouched()\n\t\t\t\t\t// `dirty` is a mixin getter; setting `value` below triggers it\n\n\t\t\t\t\tif (this.multi) {\n\t\t\t\t\t\tconst index = currentValues.indexOf(option.value)\n\t\t\t\t\t\tconst newValues = index > -1\n\t\t\t\t\t\t\t? [...currentValues.slice(0, index), ...currentValues.slice(index + 1)]\n\t\t\t\t\t\t\t: [...currentValues, option.value]\n\t\t\t\t\t\tthis._selectedValues$.next(newValues)\n\n\t\t\t\t\t\t// Update form value\n\t\t\t\t\t\tthis.internals?.setFormValue(newValues.join(','))\n\n\t\t\t\t\t\t// Update display label\n\t\t\t\t\t\tthis.valueLabel = newValues.length > 0\n\t\t\t\t\t\t\t? this.options\n\t\t\t\t\t\t\t\t\t.filter(o => newValues.includes(o.value))\n\t\t\t\t\t\t\t\t\t.map(o => o.label || o.textContent || '')\n\t\t\t\t\t\t\t\t\t.join(', ')\n\t\t\t\t\t\t\t: this.placeholder\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Single select\n\t\t\t\t\t\tthis._selectedValue$.next(option.value)\n\n\t\t\t\t\t\t// Update form value\n\t\t\t\t\t\tthis.internals?.setFormValue(option.value)\n\n\t\t\t\t\t\tthis.valueLabel = option.label || option.textContent || this.placeholder\n\t\t\t\t\t\tthis.closeDropdown()\n\t\t\t\t\t}\n\n\t\t\t\t\t// Update the option's accessibility state\n\t\t\t\t\tthis.setupOptionsAccessibility()\n\n\t\t\t\t\t// Dispatch change event\n\t\t\t\t\tthis._fireChangeEvent()\n\t\t\t\t}),\n\t\t\t\ttakeUntil(this.disconnecting)\n\t\t\t)\n\t\t\t.subscribe()\n\n\t\t// Options management pipeline - bind pointerdown events exactly like autocomplete\n\t\tthis._options$\n\t\t\t.pipe(\n\t\t\t\ttap((options) => {\n\t\t\t\t\toptions.forEach((option, index) => {\n\t\t\t\t\t\toption.setAttribute('role', 'option')\n\t\t\t\t\t\toption.tabIndex = -1\n\t\t\t\t\t\tif (!option.id) {\n\t\t\t\t\t\t\toption.id = `${this.id}-option-${index}`\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Use data-event-bound to prevent duplicate bindings\n\t\t\t\t\t\tif (!option.hasAttribute('data-event-bound')) {\n\t\t\t\t\t\t\t// Use click event instead of pointerdown for better mobile UX\n\t\t\t\t\t\t\t// This allows users to scroll through options without immediately selecting\n\t\t\t\t\t\t\tfromEvent(option, 'click').pipe(\n\t\t\t\t\t\t\t\ttap(e => {\n\t\t\t\t\t\t\t\t\te.stopPropagation()\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\ttakeUntil(this.disconnecting)\n\t\t\t\t\t\t\t).subscribe(() => this._optionSelect$.next(option))\n\t\t\t\t\t\t\toption.setAttribute('data-event-bound', 'true')\n\t\t\t\t\t\t}\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()\n\n\t\t// Selection sync pipeline - sync selected states with value changes\n\t\tcombineLatest([this._selectedValue$, this._selectedValues$, this._options$])\n\t\t\t.pipe(\n\t\t\t\ttap(([singleValue, multiValues, options]) => {\n\t\t\t\t\tif (options.length === 0) return\n\n\t\t\t\t\tif (this.multi) {\n\t\t\t\t\t\toptions.forEach(option => {\n\t\t\t\t\t\t\toption.selected = multiValues.includes(option.value)\n\t\t\t\t\t\t})\n\t\t\t\t\t} else {\n\t\t\t\t\t\toptions.forEach(option => {\n\t\t\t\t\t\t\toption.selected = option.value === singleValue\n\t\t\t\t\t\t})\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()\n\t}\n\n\tprivate handleOptionSelect(value: string) {\n\t\t// This method is now called from keyboard navigation only\n\t\tconst option = this.options.find(o => o.value === value)\n\t\tif (option) {\n\t\t\tthis._optionSelect$.next(option)\n\t\t}\n\t}\n\n\tprivate _fireChangeEvent() {\n\t\t// Get the current value based on multi/single mode\n\t\tconst value = this.multi ? this._selectedValues$.value : this._selectedValue$.value\n\n\t\t// Dispatch only one change event with the value in detail\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent<SchmancySelectChangeEvent['detail']>('change', {\n\t\t\t\tdetail: { value },\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t}),\n\t\t)\n\n\t\t// Then check validity (only show error if validation should be shown)\n\t\tthis.checkValidity()\n\t}\n\n\tpublic checkValidity(): boolean {\n\t\t// Disabled fields are always valid\n\t\tif (this.disabled) {\n\t\t\treturn true\n\t\t}\n\n\t\t// Determine if the select is empty based on whether it's multi-select or single-select\n\t\tconst isEmpty = this.multi\n\t\t\t? this._selectedValues$.value.length === 0\n\t\t\t: !this._selectedValue$.value\n\n\t\t// Check if the value is valid (not empty when required)\n\t\tconst isValid = !(this.required && isEmpty)\n\n\t\t// Set the validity state\n\t\tthis.isValid = isValid\n\n\t\tif (!this.isValid) {\n\t\t\tthis.validationMessage = 'Please select an option.'\n\t\t\tthis.internals?.setValidity({ valueMissing: true }, 'Please select an option.', this.inputRef)\n\t\t} else {\n\t\t\t// Clear validation message\n\t\t\tthis.validationMessage = ''\n\t\t\tthis.internals?.setValidity({})\n\t\t}\n\n\t\t// Update the input component to reflect our validation state\n\t\tif (this.inputRef && this.hasUpdated) {\n\t\t\tconst showError = !this.isValid && this._shouldShowError()\n\t\t\tthis.inputRef.error = showError\n\t\t\tthis.inputRef.hint = showError ? this.validationMessage : this.hint\n\t\t}\n\n\t\treturn this.isValid\n\t}\n\n\tpublic reportValidity(): boolean {\n\t\t// Force validation display regardless of validation strategy\n\t\tconst valid = this.checkValidity()\n\n\t\t// Force the input to show validation errors\n\t\tif (this.inputRef) {\n\t\t\t// Set the input's error state\n\t\t\tthis.inputRef.error = !valid\n\t\t\tthis.inputRef.hint = !valid ? this.validationMessage : this.hint\n\n\t\t\t// If invalid and not already open, automatically open the dropdown to show options\n\t\t\tif (!valid && !this.isOpen) {\n\t\t\t\t// Open the dropdown but don't mark as user interaction yet\n\t\t\t\t// This helps users immediately see available options when validation fails\n\t\t\t\tthis.openDropdown(false)\n\t\t\t}\n\n\t\t\t// Only call reportValidity on the input if invalid to show the native popup\n\t\t\tif (!valid) {\n\t\t\t\tthis.inputRef.reportValidity()\n\t\t\t}\n\t\t}\n\n\t\treturn valid\n\t}\n\n\t// `markTouched`, `markSubmitted`, `touched`, `dirty`, `pristine`, `submitted`,\n\t// `error` (storage) — all from the mixin. Select's `error` semantics\n\t// (errors-while-open suppression) live in render() via _shouldShowError() +\n\t// !isOpen, not as a separate getter.\n\n\t/**\n\t * Multi-value-aware `toFormEntries`. Single-select emits one `[name,value]`;\n\t * multi-select emits N entries with the same name (canonical FormData shape\n\t * for repeated fields).\n\t */\n\toverride toFormEntries(): Array<[string, FormDataEntryValue]> {\n\t\tif (!this.name || this.disabled) return []\n\t\tconst v = this.value\n\t\tif (v === undefined || v === null || v === '') return []\n\t\tif (Array.isArray(v))\n\t\t\treturn v.map(item => [this.name, String(item)] as [string, FormDataEntryValue])\n\t\treturn [[this.name, String(v)]]\n\t}\n\n\toverride setCustomValidity(message: string) {\n\t\tthis.validationMessage = message\n\t\tif (message) {\n\t\t\tthis.isValid = false\n\t\t\tthis.internals?.setValidity({ customError: true }, message, this.inputRef)\n\t\t} else {\n\t\t\tthis.isValid = true\n\t\t\tthis.internals?.setValidity({})\n\t\t}\n\n\t\t// Update input if needed\n\t\tif (this.inputRef && this._shouldShowError()) {\n\t\t\tthis.inputRef.error = !this.isValid\n\t\t\tthis.inputRef.hint = !this.isValid ? this.validationMessage : this.hint\n\t\t}\n\t}\n\n\t/**\n\t * Reset to the snapshot captured at connect time. Mixin's `resetForm`\n\t * handles touched/submitted/error/validationMessage; the override layers on\n\t * select-specific cleanup (value subjects, label, validity).\n\t */\n\toverride resetForm(): void {\n\t\t// Restore value (multi-aware) before super so the mixin's _defaultValue\n\t\t// reset doesn't clobber the array-shape we need.\n\t\tthis.value = this.selectDefaultValue\n\t\tthis.valueLabel = this.placeholder\n\t\tthis.isValid = true\n\t\tthis._userInteracted = false\n\t\tthis.internals?.setValidity({})\n\t\tsuper.resetForm()\n\t\tif (this.inputRef) {\n\t\t\tthis.inputRef.error = false\n\t\t\tthis.inputRef.hint = this.hint\n\t\t}\n\t}\n\n\t/** Back-compat alias for callers that used the previous public API. */\n\tpublic reset(): void {\n\t\tthis.resetForm()\n\t}\n\n\trender(): TemplateResult {\n\t\t// Determine if we should show errors based on the validation strategy and interaction\n\t\t// Never show errors on initial render or if the dropdown is open\n\t\tconst showErrors = !this.isValid && this._shouldShowError() && !this.isOpen\n\n\t\t// Add caret icon based on open state\n\t\tconst caretIcon = this.isOpen\n\t\t\t? html`<span class=\"absolute right-3 top-1/2 transform -translate-y-1/2\">▲</span>`\n\t\t\t: html`<span class=\"absolute right-3 top-1/2 transform -translate-y-1/2\">▼</span>`\n\n\t\treturn html`\n\t\t\t<div class=\"relative ${this.disabled ? 'opacity-60 cursor-not-allowed' : ''}\">\n\t\t\t\t<sch-input\n\t\t\t\t\t.name=${this.name ?? ''}\n\t\t\t\t\ttabIndex=${this.disabled ? '-1' : '0'}\n\t\t\t\t\tclass=\"trigger\"\n\t\t\t\t\trole=\"combobox\"\n\t\t\t\t\taria-haspopup=\"listbox\"\n\t\t\t\t\taria-expanded=${this.isOpen}\n\t\t\t\t\taria-controls=\"options\"\n\t\t\t\t\taria-autocomplete=\"none\"\n\t\t\t\t\taria-required=${this.required}\n\t\t\t\t\taria-activedescendant=${ifDefined(this._focusedOptionId || undefined)}\n\t\t\t\t\taria-disabled=${this.disabled}\n\t\t\t\t\t.label=${this.label}\n\t\t\t\t\t.placeholder=${this.placeholder}\n\t\t\t\t\t.value=${this.valueLabel}\n\t\t\t\t\t.required=${this.required}\n\t\t\t\t\t.disabled=${this.disabled}\n\t\t\t\t\t.hint=${showErrors ? this.validationMessage : this.hint}\n\t\t\t\t\t.error=${showErrors}\n\t\t\t\t\t.validateOn=${this.validateOn}\n\t\t\t\t\t.size=${this.size}\n\t\t\t\t\t.readonly=${true}\n\t\t\t\t\tclickable\n\t\t\t\t\t@click=${(e: MouseEvent) => {\n\t\t\t\t\t\t// Don't process clicks if disabled\n\t\t\t\t\t\tif (this.disabled) {\n\t\t\t\t\t\t\te.preventDefault()\n\t\t\t\t\t\t\te.stopPropagation()\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// On first click, don't count this as user interaction yet\n\t\t\t\t\t\tif (!this.isOpen) {\n\t\t\t\t\t\t\t// Open without triggering validation - we'll validate when they close\n\t\t\t\t\t\t\tthis.openDropdown(false)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Mark as interacted when they close the dropdown\n\t\t\t\t\t\t\tthis._userInteracted = true\n\t\t\t\t\t\t\tthis.closeDropdown()\n\t\t\t\t\t\t}\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t${caretIcon}\n\t\t\t\t</sch-input>\n\n\t\t\t\t<!-- Overlay for capturing clicks outside when dropdown is open -->\n\t\t\t\t${this.isOpen\n\t\t\t\t\t? html` <div class=\"fixed inset-0 z-10\" @click=${this.closeDropdown} tabindex=\"-1\" aria-hidden=\"true\"></div> `\n\t\t\t\t\t: ''}\n\n\t\t\t\t<ul\n\t\t\t\t\tid=\"options\"\n\t\t\t\t\trole=\"listbox\"\n\t\t\t\t\taria-multiselectable=${this.multi}\n\t\t\t\t\tclass=${classMap({\n\t\t\t\t\t\t'absolute min-w-full w-full z-20 mt-1 rounded-md shadow-lg': true,\n\t\t\t\t\t\thidden: !this.isOpen,\n\t\t\t\t\t})}\n\t\t\t\t\t${color({\n\t\t\t\t\t\tbgColor: SchmancyTheme.sys.color.surface.low,\n\t\t\t\t\t\tcolor: SchmancyTheme.sys.color.surface.on,\n\t\t\t\t\t})}\n\t\t\t\t>\n\t\t\t\t\t<slot\n\t\t\t\t\t\t@slotchange=${() => {\n\t\t\t\t\t\t\tthis._options$.next(this.options)\n\t\t\t\t\t\t\t// Sync selection state when options re-render\n\t\t\t\t\t\t\tthis.syncSelection()\n\t\t\t\t\t\t}}\n\t\t\t\t\t></slot>\n\t\t\t\t</ul>\n\t\t\t</div>\n\t\t`\n\t}\n}\n\n// Don't export 'select' here as it conflicts with the store's select decorator\n// export const select = SchmancySelect\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-select': SchmancySelect\n\t}\n}\n"],"mappings":";;;;;;;;;;;AA6BO,IAAA,IAAA,cAA6B,EAAA,EAAA;CAAA,YAAA,GAAA,GAAA;EAAA,MAAA,GAAA,CAAA,GAAA,KAAA,cAkBO,IAAA,KAAA,QAAA,CA+BL,GAAA,KAAA,OAGiC,MAAA,KAAA,SAAA,CAG5C,GAAA,KAAA,aACI,IAAA,KAAA,UAAA,CACH,GAAA,KAAA,qBAK8B,IAAA,KAAA,YAQrC,IAAI,EAAkC,CAAA,CAAA,GAAA,KAAA,kBAChC,IAAI,EAAwB,EAAA,GAAA,KAAA,mBAC3B,IAAI,EAA0B,CAAA,CAAA,GAAA,KAAA,iBAChC,IAAI,KAAA,KAAA,kBAAA,CAQF,GAAA,KAAA,mBAGS,IAAA,KAAA,iBA2IX,MAAA;GAExB,IAAI,KAAK,UACR;GAGD,IAAA,CAAK,KAAK,QAKT,OAAA,MAJI;IAAC;IAAS;IAAK;GAAA,EAAa,SAAS,EAAE,GAAA,MAC1C,EAAE,eAAA,GACF,KAAK,aAAA,CAAa,CAAA;GAMpB,IAAM,IAAU,MAAM,KAAK,KAAK,WAAW,CAAA,CAAA,GACrC,IAAU,EAAQ,WAAU,MAAK,EAAE,OAAO,KAAK,gBAAA,KAAA;GAErD,QAAQ,EAAE,KAAV;IACC,KAAK;KACJ,EAAE,eAAA,GACF,KAAK,cAAA;KACL;IACD,KAAK;KACJ,EAAE,eAAA,GACF,KAAK,YAAY,GAAS,KAAK,IAAI,IAAU,GAAG,EAAQ,SAAS,CAAA,CAAA;KACjE;IACD,KAAK;KACJ,EAAE,eAAA,GACF,KAAK,YAAY,GAAS,KAAK,IAAI,IAAU,GAAG,CAAA,CAAA;KAChD;IACD,KAAK;KACJ,EAAE,eAAA,GACF,KAAK,YAAY,GAAS,CAAA;KAC1B;IACD,KAAK;KACJ,EAAE,eAAA,GACF,KAAK,YAAY,GAAS,EAAQ,SAAS,CAAA;KAC3C;IACD,KAAK;IACL,KAAK;KAEJ,IADA,EAAE,eAAA,GACE,KAAK,kBAAkB;MAC1B,IAAM,IAAgB,EAAQ,MAAK,MAAO,EAAI,OAAO,KAAK,gBAAA;MACtD,KACH,KAAK,mBAAmB,EAAc,KAAA;KAExC;KACA;IACD,KAAK,OACJ,KAAK,cAAA;GAAA;EAAA;CAAA;CAAA;EAAA,KAAA,SAhRQ,CAAC,CAAG;;;;;;;;;;;;CAqBpB,IAAA,QACa;EACZ,OAAO,KAAK,QACR,KAAK,kBAAkB,SAAS,CAAA,IAChC,KAAK,iBAAiB,SAAS;CACpC;CACA,IAAA,MAAmB,GAAA;EAClB,IAAK,KAAK,mBAAoB,KAAK,kBACnC,IAAI,KAAK,OAAO;GACf,IAAM,IAAS,MAAM,QAAQ,CAAA,IAC1B,IACA,IAAM,OAAO,CAAA,EAAK,MAAM,GAAA,EAAK,KAAI,MAAK,EAAE,KAAA,CAAA,EAAQ,OAAO,OAAA,IAAW,CAAA;GACrE,KAAK,iBAAiB,KAAK,CAAA;EAC5B,OACC,KAAK,gBAAgB,KAAK,KAAO,OAAO,KAAK,OAAO,CAAA,CAAA;CAEtD;CAGA,IAAA,SACI;EACH,OAAO,CAAA,GAAI,KAAK,iBAAiB,KAAA;CAClC;CACA,IAAA,OAAW,GAAA;EACV,KAAK,iBAAiB,KAAK,MAAM,QAAQ,CAAA,IAAQ,CAAA,GAAI,CAAA,IAAQ,CAAA,CAAA;CAC9D;CAuCA,oBAAA;EACC,MAAM,kBAAA,GACD,AACJ,KAAK,OAAK,mBAAmB,KAAK,OAAA,EAAS,SAAS,EAAA,EAAI,UAAU,GAAG,CAAA,KAItE,KAAK,qBAAqB,KAAK,OAG/B,EAAyB,MAAM,SAAA,EAAW,KAAK,EAAU,KAAK,aAAA,CAAA,EAAgB,UAAU,KAAK,aAAA,GAG7F,KAAK,wBAAA;CACN;CAEA,uBAAA;EACC,MAAM,qBAAA,GACN,KAAK,oBAAA;CAEN;CAEA,eAAA;EACC,KAAK,cAAA,GACL,KAAK,0BAAA,GAGD,KAAK,aACR,KAAK,SAAS,QAAA,CAAQ;CAExB;CAEA,QAAiB,GAAA;EAGhB,IAFA,MAAM,QAAQ,CAAA,GAEV,EAAa,IAAI,OAAA,GAAU;GAI9B,IAAM,IAAY,KAAK,QACpB,KAAK,iBAAiB,MAAM,KAAK,GAAA,IACjC,KAAK,gBAAgB;GACxB,KAAK,WAAW,aAAa,CAAA;EAI9B;EAGI,EAAa,IAAI,QAAA,MAChB,KAAK,SACR,KAAK,iBAAA,IAEL,KAAK,oBAAA;CAGR;CAIA,gBAAA;EACC,IAAI,KAAK,OAAO;GAEf,IAAM,IAAiB,KAAK,iBAAiB;GAC7C,KAAK,SAAS,SAAQ,MAAM,EAAE,WAAW,EAAe,SAAS,EAAE,KAAA,CAAA,GACnE,KAAK,aACJ,EAAe,SAAS,KACrB,KAAK,SACH,QAAO,MAAK,EAAe,SAAS,EAAE,KAAA,CAAA,EACvC,KAAI,MAAK,EAAE,SAAS,EAAE,eAAe,EAAA,EACrC,KAAK,IAAA,KACN,KAAK;EACV,OAAO;GAEN,IAAM,IAAe,KAAK,gBAAgB;GAC1C,KAAK,SAAS,SAAQ,MAAA;IAErB,EAAE,WAAW,EAAE,UAAU;GAAA,CAAA;GAE1B,IAAM,IAAiB,KAAK,SAAS,MAAK,MAAK,EAAE,UAAU,CAAA;GAC3D,KAAK,aAAa,IAAkB,EAAe,SAAS,EAAe,eAAe,KAAM,KAAK;EACtG;CACD;CAEA,4BAAA;EACC,KAAK,SAAS,SAAS,GAAQ,MAAA;GAC9B,EAAO,aAAa,QAAQ,QAAA,GACvB,AACJ,EAAO,OAAK,GAAG,KAAK,GAAA,UAAa,KAIlC,EAAO,WAAA,IAEP,EAAO,aACN,iBACA,OAAO,KAAK,QAAQ,KAAK,iBAAiB,MAAM,SAAS,EAAO,KAAA,IAAS,EAAO,UAAU,KAAK,gBAAgB,KAAA,CAAA;EAAA,CAAA;CAGlH;CAEA,MAAA,mBAAc;EACb,IAAM,IAAY,KAAK,WAAW,cAAc,UAAA;EAC3C,KAAc,KAAK,OAExB,KAAK,oBAAoB,EAAW,GAAW,KAAK,IAAI,YAAA;GAEvD,IAAM,IAAiB,OAAO,aACxB,IAAc,EAAU,sBAAA,GAGxB,IAAa,IAAiB,EAAY,QAC1C,IAAa,EAAY,KAGzB,IAAY,KAAK,IAAuC,MAAnC,KAAK,IAAI,GAAY,CAAA,GAAoB,GAAA,GAG9D,IAAa,IAAa,OAAO,IAAa;GAGpD,KAAK,GAAG,MAAM,YAAY,GAAG,EAAA;GAE7B,IAAA,EAAM,GAAE,GAAA,GAAG,MAAA,MAAY,EAAgB,GAAW,KAAK,IAAI;IAC1D,WAAW,IAAa,cAAc;IACtC,YAAY;KAAC,EAAO,CAAA;KAAI,EAAA;KAAQ,EAAM,EAAE,SAAS,EAAA,CAAA;IAAA;GAAA,CAAA;GAGlD,OAAO,OAAO,KAAK,GAAG,OAAO;IAC5B,MAAM,GAAG,EAAA;IACT,KAAK,GAAG,EAAA;IACR,UAAU;IACV,OAAO,GAAG,EAAU,YAAA;GAAA,CAAA;EAAA,CAAA;CAGvB;CAyDA,YAAoB,GAA2B,GAAA;EAC9C,IAAM,IAAS,EAAQ;EACvB,IAAI,GAAQ;GACX,EAAO,MAAA,GACP,KAAK,mBAAmB,EAAO;GAG/B,IAAM,IAAW,KAAK,WAAW,cAAc,UAAA;GAM/C,IALI,KACH,EAAS,aAAa,yBAAyB,EAAO,EAAA,GAInD,KAAK,MAAM,EAAO,cAAb,KAA2B,GAAW;IAE9C,IAAM,IAAY,EAAO,WACnB,IAAe,EAAO,cACtB,IAAY,KAAK,GAAG,WACpB,IAAW,KAAK,GAAG;IAGrB,IAAY,IACf,KAAK,GAAG,YAAY,IACV,IAAY,IAAe,IAAY,MACjD,KAAK,GAAG,YAAY,IAAY,IAAe;GAEjD;EACD;CACD;CAEA,MAAA,aAA2B,IAAA,CAAS,GAAA;EAEnC,IAAI,KAAK,UACR;EAMD,KAAK,SAAA,CAAS,GAAA,MACR,KAAK;EAGX,IAAM,IAAU,MAAM,KAAK,KAAK,WAAW,CAAA,CAAA,GACrC,IAAgB,KAAK,QAAQ,IAAI,EAAQ,WAAU,MAAK,EAAE,UAAU,KAAK,gBAAgB,KAAA;EAE/F,KAAK,YAAY,GAAS,KAAK,IAAI,GAAe,CAAA,CAAA,GAI9C,KAAQ,KAAK,eAAA;CAClB;CAEA,gBAAA;EAGK,KAAK,oBACR,KAAK,UAAA,CAAU,IAGhB,KAAK,SAAA,CAAS,GACd,KAAK,mBAAmB;EAGxB,IAAM,IAAW,KAAK,WAAW,cAA2B,UAAA;EACxD,MACH,EAAS,gBAAgB,uBAAA,GACzB,GAAU,MAAA,IAKP,KAAK,mBAAmB,KAAK,iBAAA,KAChC,KAAK,cAAA;CAEP;CAEA,0BAAA;EAEC,EAAuB,MAAM,eAAA,EAC3B,KACA,GAAK,MAAA;GACJ,EAAE,gBAAA;GACF,IAAM,IAAS,KAAK,QAAQ,MAAK,MAAK,EAAE,UAAU,EAAE,OAAO,KAAA;GACvD,KACH,KAAK,eAAe,KAAK,CAAA;EAAA,CAAA,GAG3B,EAAU,KAAK,aAAA,CAAA,EAEf,UAAA,GAGF,KAAK,eACH,KACA,EAAe,KAAK,iBAAiB,KAAK,gBAAA,GAC1C,GAAA,CAAM,GAAQ,GAAG,OAAA;GAKhB,IAJA,KAAK,kBAAA,CAAkB,GACvB,KAAK,YAAA,GAGD,KAAK,OAAO;IACf,IAAM,IAAQ,EAAc,QAAQ,EAAO,KAAA,GACrC,IAAY,IAAA,KACf,CAAA,GAAI,EAAc,MAAM,GAAG,CAAA,GAAA,GAAW,EAAc,MAAM,IAAQ,CAAA,CAAA,IAClE,CAAA,GAAI,GAAe,EAAO,KAAA;IAC7B,KAAK,iBAAiB,KAAK,CAAA,GAG3B,KAAK,WAAW,aAAa,EAAU,KAAK,GAAA,CAAA,GAG5C,KAAK,aAAa,EAAU,SAAS,IAClC,KAAK,QACJ,QAAO,MAAK,EAAU,SAAS,EAAE,KAAA,CAAA,EACjC,KAAI,MAAK,EAAE,SAAS,EAAE,eAAe,EAAA,EACrC,KAAK,IAAA,IACN,KAAK;GACT,OAEC,KAAK,gBAAgB,KAAK,EAAO,KAAA,GAGjC,KAAK,WAAW,aAAa,EAAO,KAAA,GAEpC,KAAK,aAAa,EAAO,SAAS,EAAO,eAAe,KAAK,aAC7D,KAAK,cAAA;GAIN,KAAK,0BAAA,GAGL,KAAK,iBAAA;EAAA,CAAA,GAEN,EAAU,KAAK,aAAA,CAAA,EAEf,UAAA,GAGF,KAAK,UACH,KACA,GAAK,MAAA;GACJ,EAAQ,SAAS,GAAQ,MAAA;IACxB,EAAO,aAAa,QAAQ,QAAA,GAC5B,EAAO,WAAA,IACF,AACJ,EAAO,OAAK,GAAG,KAAK,GAAA,UAAa,KAG7B,EAAO,aAAa,kBAAA,MAGxB,EAAU,GAAQ,OAAA,EAAS,KAC1B,GAAI,MAAA;KACH,EAAE,gBAAA;IAAA,CAAA,GAEH,EAAU,KAAK,aAAA,CAAA,EACd,gBAAgB,KAAK,eAAe,KAAK,CAAA,CAAA,GAC3C,EAAO,aAAa,oBAAoB,MAAA;GAAA,CAAA;EAAA,CAAA,GAI3C,EAAU,KAAK,aAAA,CAAA,EAEf,UAAA,GAGF,EAAc;GAAC,KAAK;GAAiB,KAAK;GAAkB,KAAK;EAAA,CAAA,EAC/D,KACA,GAAA,CAAM,GAAa,GAAa,OAAA;GACR,AAAnB,EAAQ,WAAW,MAEnB,KAAK,QACR,EAAQ,SAAQ,MAAA;IACf,EAAO,WAAW,EAAY,SAAS,EAAO,KAAA;GAAA,CAAA,IAG/C,EAAQ,SAAQ,MAAA;IACf,EAAO,WAAW,EAAO,UAAU;GAAA,CAAA;EAAA,CAAA,GAItC,EAAU,KAAK,aAAA,CAAA,EAEf,UAAA;CACH;CAEA,mBAA2B,GAAA;EAE1B,IAAM,IAAS,KAAK,QAAQ,MAAK,MAAK,EAAE,UAAU,CAAA;EAC9C,KACH,KAAK,eAAe,KAAK,CAAA;CAE3B;CAEA,mBAAA;EAEC,IAAM,IAAQ,KAAK,QAAQ,KAAK,iBAAiB,QAAQ,KAAK,gBAAgB;EAG9E,KAAK,cACJ,IAAI,YAAiD,UAAU;GAC9D,QAAQ,EAAE,OAAA,EAAA;GACV,SAAA,CAAS;GACT,UAAA,CAAU;EAAA,CAAA,CAAA,GAKZ,KAAK,cAAA;CACN;CAEA,gBAAA;EAEC,IAAI,KAAK,UACR,OAAA,CAAO;EAIR,IAAM,IAAU,KAAK,QAClB,KAAK,iBAAiB,MAAM,WAAW,IAAX,CAC3B,KAAK,gBAAgB,OAGnB,IAAA,EAAY,KAAK,YAAY;EAenC,IAZA,KAAK,UAAU,GAEV,KAAK,WAKT,KAAK,oBAAoB,IACzB,KAAK,WAAW,YAAY,CAAC,CAAA,MAL7B,KAAK,oBAAoB,4BACzB,KAAK,WAAW,YAAY,EAAE,cAAA,CAAc,EAAA,GAAQ,4BAA4B,KAAK,QAAA,IAQlF,KAAK,YAAY,KAAK,YAAY;GACrC,IAAM,IAAA,CAAa,KAAK,WAAW,KAAK,iBAAA;GACxC,KAAK,SAAS,QAAQ,GACtB,KAAK,SAAS,OAAO,IAAY,KAAK,oBAAoB,KAAK;EAChE;EAEA,OAAO,KAAK;CACb;CAEA,iBAAA;EAEC,IAAM,IAAQ,KAAK,cAAA;EAqBnB,OAlBI,KAAK,aAER,KAAK,SAAS,QAAA,CAAS,GACvB,KAAK,SAAS,OAAQ,IAAiC,KAAK,OAA9B,KAAK,mBAG9B,KAAU,KAAK,UAGnB,KAAK,aAAA,CAAa,CAAA,GAId,KACJ,KAAK,SAAS,eAAA,IAIT;CACR;CAYA,gBAAA;EACC,IAAA,CAAK,KAAK,QAAQ,KAAK,UAAU,OAAO,CAAA;EACxC,IAAM,IAAI,KAAK;EACf,OAAI,KAAA,QAAiC,MAAM,KAAW,CAAA,IAClD,MAAM,QAAQ,CAAA,IACV,EAAE,KAAI,MAAQ,CAAC,KAAK,MAAM,OAAO,CAAA,CAAA,CAAA,IAClC,CAAC,CAAC,KAAK,MAAM,OAAO,CAAA,CAAA,CAAA;CAC5B;CAEA,kBAA2B,GAAA;EAC1B,KAAK,oBAAoB,GACrB,KACH,KAAK,UAAA,CAAU,GACf,KAAK,WAAW,YAAY,EAAE,aAAA,CAAa,EAAA,GAAQ,GAAS,KAAK,QAAA,MAEjE,KAAK,UAAA,CAAU,GACf,KAAK,WAAW,YAAY,CAAC,CAAA,IAI1B,KAAK,YAAY,KAAK,iBAAA,MACzB,KAAK,SAAS,QAAA,CAAS,KAAK,SAC5B,KAAK,SAAS,OAAQ,KAAK,UAAmC,KAAK,OAA9B,KAAK;CAE5C;CAOA,YAAA;EAGC,KAAK,QAAQ,KAAK,oBAClB,KAAK,aAAa,KAAK,aACvB,KAAK,UAAA,CAAU,GACf,KAAK,kBAAA,CAAkB,GACvB,KAAK,WAAW,YAAY,CAAC,CAAA,GAC7B,MAAM,UAAA,GACF,KAAK,aACR,KAAK,SAAS,QAAA,CAAQ,GACtB,KAAK,SAAS,OAAO,KAAK;CAE5B;CAGA,QAAA;EACC,KAAK,UAAA;CACN;CAEA,SAAA;EAGC,IAAM,IAAA,CAAc,KAAK,WAAW,KAAK,iBAAA,KAAA,CAAuB,KAAK,QAG/D,IAAY,KAAK,SACpB,CAAI,+EACJ,CAAI;EAEP,OAAO,CAAI;0BACa,KAAK,WAAW,kCAAkC,GAAA;;aAE/D,KAAK,QAAQ,GAAA;gBACV,KAAK,WAAW,OAAO,IAAA;;;;qBAIlB,KAAK,OAAA;;;qBAGL,KAAK,SAAA;6BACG,EAAU,KAAK,oBAAA,KAAoB,CAAA,EAAA;qBAC3C,KAAK,SAAA;cACZ,KAAK,MAAA;oBACC,KAAK,YAAA;cACX,KAAK,WAAA;iBACF,KAAK,SAAA;iBACL,KAAK,SAAA;aACT,IAAa,KAAK,oBAAoB,KAAK,KAAA;cAC1C,EAAA;mBACK,KAAK,WAAA;aACX,KAAK,KAAA;kBACD,EAAA;;eAEF,MAAA;GAET,IAAI,KAAK,UAGR,OAFA,EAAE,eAAA,GAAA,KACF,EAAE,gBAAA;GAKE,KAAK,UAKT,KAAK,kBAAA,CAAkB,GACvB,KAAK,cAAA,KAJL,KAAK,aAAA,CAAa,CAAA;EAAA,EAAA;;OAQlB,EAAA;;;;MAID,KAAK,SACJ,CAAI,2CAA2C,KAAK,cAAA,6CACpD,GAAA;;;;;4BAKqB,KAAK,MAAA;aACpB,EAAS;GAChB,6DAAA,CAA6D;GAC7D,QAAA,CAAS,KAAK;EAAA,CAAA,EAAA;OAEb,EAAM;GACP,SAAS,EAAc,IAAI,MAAM,QAAQ;GACzC,OAAO,EAAc,IAAI,MAAM,QAAQ;EAAA,CAAA,EAAA;;;;GAKtC,KAAK,UAAU,KAAK,KAAK,OAAA,GAEzB,KAAK,cAAA;EAAA,EAAA;;;;;CAMX;AAAA;AAAA,EAAA,CAzqBC,EAAS,EAAE,MAAM,OAAA,CAAA,CAAA,GAAQ,EAAA,WAAA,eAAA,KAAA,CAAA,GAAA,EAAA,CAIzB,EAAS;CAAE,MAAM;CAAQ,SAAA,CAAS;AAAA,CAAA,CAAA,GAAM,EAAA,WAAA,SAAA,IAAA,GAAA,EAAA,CAmBxC,EAAS,EAAE,MAAM,MAAA,CAAA,CAAA,GAAO,EAAA,WAAA,UAAA,IAAA,GAAA,EAAA,CAQxB,EAAS,EAAE,MAAM,QAAA,CAAA,CAAA,GAAS,EAAA,WAAA,SAAA,KAAA,CAAA,GAAA,EAAA,CAG1B,EAAS,EAAE,MAAM,OAAA,CAAA,CAAA,GAAQ,EAAA,WAAA,QAAA,KAAA,CAAA,GAAA,EAAA,CAGzB,EAAA,CAAA,GAAM,EAAA,WAAA,UAAA,KAAA,CAAA,GAAA,EAAA,CACN,EAAA,CAAA,GAAM,EAAA,WAAA,cAAA,KAAA,CAAA,GAAA,EAAA,CACN,EAAA,CAAA,GAAM,EAAA,WAAA,WAAA,KAAA,CAAA,GAAA,EAAA,CAKN,EAAA,CAAA,GAAM,EAAA,WAAA,sBAAA,KAAA,CAAA,GAAA,EAAA,CAEN,EAAM,IAAA,CAAA,GAAI,EAAA,WAAA,MAAA,KAAA,CAAA,GAAA,EAAA,CACV,EAAM,WAAA,CAAA,GAAW,EAAA,WAAA,YAAA,KAAA,CAAA,GAAA,EAAA,CACjB,EAAsB,EAAE,SAAA,CAAS,EAAA,CAAA,CAAA,GAAM,EAAA,WAAA,WAAA,KAAA,CAAA,GAAA,EAAA,CAevC,EAAA,CAAA,GAAM,EAAA,WAAA,mBAAA,KAAA,CAAA,GAAA,EAAA,CAGN,EAAA,CAAA,GAAM,EAAA,WAAA,oBAAA,KAAA,CAAA,GAAA,IAAA,EAAA,CArFP,EAAc,iBAAA,CAAA,GAAiB,CAAA;AAAA,SAAA,KAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sound.service-DO4SmUUT.js","names":[],"sources":["../src/audio/sound.service.ts"],"sourcesContent":["/**\n * Schmancy Sound Service\n *\n * Centralized sound management following the theme service pattern.\n * Provides reactive observables for sound state and methods to control sounds.\n *\n * @example\n * ```typescript\n * import { sound } from '@schmancy/audio'\n *\n * // Play a feeling sound\n * sound.play('joyful')\n *\n * // Set volume\n * sound.setVolume(0.2)\n *\n * // Apply AI-generated sound theme\n * sound.setTheme(aiGeneratedTheme)\n *\n * // Reset to defaults\n * sound.resetTheme()\n *\n * // Subscribe to theme changes\n * sound.theme$.subscribe(theme => {\n * console.log('Current theme:', theme?.name ?? 'default')\n * })\n * ```\n */\n\nimport { BehaviorSubject, distinctUntilChanged, map, shareReplay } from 'rxjs'\nimport { state } from '../state'\nimport type {\n\tFeeling,\n\tFeelingCategory,\n\tFeelingSound,\n\tPuffParams,\n\tSoundTheme,\n\tSoundThemeSettings,\n\tToneParams,\n} from '../types/mood-audio.types'\n\n// ============================================================================\n// CONTEXT\n// ============================================================================\n\n/** Sound settings — persists to localStorage under namespace `schmancy/sound`. */\nconst SoundContext = state<SoundThemeSettings>('schmancy/sound').local({\n\ttheme: null,\n\tvolume: 0.15,\n\tmuted: false,\n})\n\n// ============================================================================\n// DEFAULT SOUND THEME\n// ============================================================================\n\n/**\n * Default sound definitions for all feelings\n * These are used when no custom theme is applied\n */\nconst DEFAULT_SOUNDS: Record<Feeling, FeelingSound> = {\n\t// ========== HAPPY / PLEASANT ==========\n\tjoyful: {\n\t\tpuffs: [\n\t\t\t{ startTime: 0, duration: 0.08, frequency: 3000, volume: 0.3 },\n\t\t\t{ startTime: 0.06, duration: 0.1, frequency: 3500, volume: 0.35 },\n\t\t],\n\t\ttones: [\n\t\t\t{ startTime: 0.02, duration: 0.15, frequency: 784, volume: 0.25, type: 'sine' },\n\t\t\t{ startTime: 0.1, duration: 0.2, frequency: 988, volume: 0.3, type: 'sine' },\n\t\t\t{ startTime: 0.18, duration: 0.25, frequency: 1175, volume: 0.25, type: 'sine' },\n\t\t],\n\t},\n\tcontent: {\n\t\tpuffs: [{ startTime: 0, duration: 0.2, frequency: 1500, volume: 0.25 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.05, duration: 0.3, frequency: 523, volume: 0.2, type: 'sine', filterFrequency: 800 },\n\t\t\t{ startTime: 0.15, duration: 0.35, frequency: 659, volume: 0.15, type: 'sine', filterFrequency: 800 },\n\t\t],\n\t},\n\texcited: {\n\t\tpuffs: [\n\t\t\t{ startTime: 0, duration: 0.06, frequency: 2500, volume: 0.25 },\n\t\t\t{ startTime: 0.05, duration: 0.06, frequency: 3000, volume: 0.3 },\n\t\t\t{ startTime: 0.1, duration: 0.08, frequency: 3500, volume: 0.35 },\n\t\t],\n\t\ttones: [\n\t\t\t{ startTime: 0.02, duration: 0.12, frequency: 880, volume: 0.2, type: 'sine' },\n\t\t\t{ startTime: 0.08, duration: 0.12, frequency: 1047, volume: 0.25, type: 'sine' },\n\t\t\t{ startTime: 0.14, duration: 0.15, frequency: 1319, volume: 0.3, type: 'sine' },\n\t\t],\n\t},\n\tproud: {\n\t\tpuffs: [{ startTime: 0, duration: 0.15, frequency: 1800, volume: 0.3 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.05, duration: 0.25, frequency: 523, volume: 0.25, type: 'sine' },\n\t\t\t{ startTime: 0.08, duration: 0.25, frequency: 659, volume: 0.2, type: 'sine' },\n\t\t\t{ startTime: 0.11, duration: 0.3, frequency: 784, volume: 0.25, type: 'sine' },\n\t\t],\n\t},\n\thopeful: {\n\t\tpuffs: [{ startTime: 0, duration: 0.12, frequency: 2200, volume: 0.2 }],\n\t\ttones: [{ startTime: 0.03, duration: 0.3, frequency: 659, volume: 0.2, type: 'sine', frequencyEnd: 880 }],\n\t},\n\trelieved: {\n\t\tpuffs: [{ startTime: 0, duration: 0.25, frequency: 1200, volume: 0.35 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.1, duration: 0.35, frequency: 659, volume: 0.2, type: 'sine', filterFrequency: 800 },\n\t\t\t{ startTime: 0.25, duration: 0.4, frequency: 523, volume: 0.15, type: 'sine', filterFrequency: 800 },\n\t\t],\n\t},\n\tgrateful: {\n\t\tpuffs: [{ startTime: 0, duration: 0.15, frequency: 1500, volume: 0.25 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.05, duration: 0.3, frequency: 440, volume: 0.2, type: 'sine', filterFrequency: 800 },\n\t\t\t{ startTime: 0.15, duration: 0.35, frequency: 523, volume: 0.2, type: 'sine', filterFrequency: 800 },\n\t\t\t{ startTime: 0.25, duration: 0.4, frequency: 659, volume: 0.15, type: 'sine', filterFrequency: 800 },\n\t\t],\n\t},\n\tpeaceful: {\n\t\tpuffs: [{ startTime: 0, duration: 0.3, frequency: 800, volume: 0.15 }],\n\t\ttones: [{ startTime: 0.1, duration: 0.5, frequency: 392, volume: 0.12, type: 'sine', filterFrequency: 500 }],\n\t},\n\tplayful: {\n\t\tpuffs: [\n\t\t\t{ startTime: 0, duration: 0.05, frequency: 2800, volume: 0.2 },\n\t\t\t{ startTime: 0.08, duration: 0.05, frequency: 3200, volume: 0.25 },\n\t\t\t{ startTime: 0.14, duration: 0.06, frequency: 2800, volume: 0.2 },\n\t\t],\n\t\ttones: [\n\t\t\t{ startTime: 0.03, duration: 0.1, frequency: 784, volume: 0.2, type: 'sine' },\n\t\t\t{ startTime: 0.1, duration: 0.08, frequency: 988, volume: 0.25, type: 'sine' },\n\t\t\t{ startTime: 0.16, duration: 0.12, frequency: 784, volume: 0.2, type: 'sine' },\n\t\t],\n\t},\n\tamused: {\n\t\tpuffs: [\n\t\t\t{ startTime: 0, duration: 0.04, frequency: 2500, volume: 0.2 },\n\t\t\t{ startTime: 0.06, duration: 0.04, frequency: 2800, volume: 0.22 },\n\t\t\t{ startTime: 0.11, duration: 0.05, frequency: 2600, volume: 0.18 },\n\t\t],\n\t\ttones: [{ startTime: 0.05, duration: 0.15, frequency: 880, volume: 0.15, type: 'sine' }],\n\t},\n\tcurious: {\n\t\tpuffs: [{ startTime: 0, duration: 0.1, frequency: 2000, volume: 0.2 }],\n\t\ttones: [{ startTime: 0.03, duration: 0.2, frequency: 659, volume: 0.2, type: 'sine', frequencyEnd: 880 }],\n\t},\n\tinspired: {\n\t\tpuffs: [{ startTime: 0, duration: 0.1, frequency: 2500, volume: 0.25 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.05, duration: 0.3, frequency: 523, volume: 0.2, type: 'sine' },\n\t\t\t{ startTime: 0.07, duration: 0.28, frequency: 784.5, volume: 0.16, type: 'sine' },\n\t\t\t{ startTime: 0.09, duration: 0.26, frequency: 1046, volume: 0.12, type: 'sine' },\n\t\t],\n\t},\n\tconfident: {\n\t\tpuffs: [{ startTime: 0, duration: 0.12, frequency: 1500, volume: 0.3 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.04, duration: 0.2, frequency: 523, volume: 0.25, type: 'sine' },\n\t\t\t{ startTime: 0.06, duration: 0.22, frequency: 659, volume: 0.2, type: 'sine' },\n\t\t],\n\t},\n\tloved: {\n\t\tpuffs: [{ startTime: 0, duration: 0.2, frequency: 1000, volume: 0.2 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.08, duration: 0.4, frequency: 392, volume: 0.18, type: 'sine', filterFrequency: 600 },\n\t\t\t{ startTime: 0.2, duration: 0.45, frequency: 494, volume: 0.15, type: 'sine', filterFrequency: 600 },\n\t\t],\n\t},\n\tcomforted: {\n\t\tpuffs: [{ startTime: 0, duration: 0.25, frequency: 900, volume: 0.18 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.1, duration: 0.35, frequency: 523, volume: 0.15, type: 'sine', filterFrequency: 800 },\n\t\t\t{ startTime: 0.25, duration: 0.4, frequency: 440, volume: 0.12, type: 'sine', filterFrequency: 800 },\n\t\t],\n\t},\n\tenergized: {\n\t\tpuffs: [\n\t\t\t{ startTime: 0, duration: 0.05, frequency: 3000, volume: 0.25 },\n\t\t\t{ startTime: 0.04, duration: 0.05, frequency: 3500, volume: 0.28 },\n\t\t],\n\t\ttones: [\n\t\t\t{ startTime: 0.02, duration: 0.1, frequency: 784, volume: 0.2, type: 'sine' },\n\t\t\t{ startTime: 0.08, duration: 0.12, frequency: 988, volume: 0.25, type: 'sine' },\n\t\t\t{ startTime: 0.14, duration: 0.15, frequency: 1175, volume: 0.22, type: 'sine' },\n\t\t],\n\t},\n\tcelebrated: {\n\t\tpuffs: [{ startTime: 0, duration: 0.08, frequency: 2500, volume: 0.2 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.02, duration: 0.18, frequency: 523, volume: 0.22, type: 'sine' },\n\t\t\t{ startTime: 0.08, duration: 0.18, frequency: 659, volume: 0.24, type: 'sine' },\n\t\t\t{ startTime: 0.14, duration: 0.2, frequency: 784, volume: 0.26, type: 'sine' },\n\t\t\t{ startTime: 0.22, duration: 0.3, frequency: 1047, volume: 0.22, type: 'sine' },\n\t\t],\n\t},\n\n\t// ========== SAD / LOW ==========\n\tsad: {\n\t\tpuffs: [{ startTime: 0, duration: 0.3, frequency: 600, volume: 0.25 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.1, duration: 0.4, frequency: 392, volume: 0.2, type: 'sine', filterFrequency: 400 },\n\t\t\t{ startTime: 0.3, duration: 0.45, frequency: 294, volume: 0.15, type: 'sine', filterFrequency: 350 },\n\t\t],\n\t},\n\tlonely: {\n\t\tpuffs: [{ startTime: 0, duration: 0.2, frequency: 700, volume: 0.2 }],\n\t\ttones: [{ startTime: 0.15, duration: 0.5, frequency: 330, volume: 0.12, type: 'sine', filterFrequency: 450 }],\n\t},\n\tdisappointed: {\n\t\tpuffs: [{ startTime: 0, duration: 0.25, frequency: 800, volume: 0.25 }],\n\t\ttones: [{ startTime: 0.08, duration: 0.3, frequency: 523, volume: 0.18, type: 'sine', frequencyEnd: 349 }],\n\t},\n\theartbroken: {\n\t\tpuffs: [{ startTime: 0, duration: 0.3, frequency: 600, volume: 0.25 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.1, duration: 0.4, frequency: 392, volume: 0.2, type: 'sine', filterFrequency: 400 },\n\t\t\t{ startTime: 0.3, duration: 0.45, frequency: 294, volume: 0.15, type: 'sine', filterFrequency: 350 },\n\t\t],\n\t},\n\tgrieving: {\n\t\tpuffs: [{ startTime: 0, duration: 0.3, frequency: 600, volume: 0.25 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.1, duration: 0.4, frequency: 392, volume: 0.2, type: 'sine', filterFrequency: 400 },\n\t\t\t{ startTime: 0.3, duration: 0.45, frequency: 294, volume: 0.15, type: 'sine', filterFrequency: 350 },\n\t\t],\n\t},\n\thopeless: {\n\t\tpuffs: [{ startTime: 0, duration: 0.2, frequency: 700, volume: 0.2 }],\n\t\ttones: [{ startTime: 0.15, duration: 0.5, frequency: 330, volume: 0.12, type: 'sine', filterFrequency: 450 }],\n\t},\n\tempty: {\n\t\tpuffs: [{ startTime: 0, duration: 0.2, frequency: 700, volume: 0.2 }],\n\t\ttones: [{ startTime: 0.15, duration: 0.5, frequency: 330, volume: 0.12, type: 'sine', filterFrequency: 450 }],\n\t},\n\tdiscouraged: {\n\t\tpuffs: [{ startTime: 0, duration: 0.25, frequency: 800, volume: 0.25 }],\n\t\ttones: [{ startTime: 0.08, duration: 0.3, frequency: 523, volume: 0.18, type: 'sine', frequencyEnd: 349 }],\n\t},\n\tmelancholic: {\n\t\tpuffs: [{ startTime: 0, duration: 0.3, frequency: 700, volume: 0.18 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.1, duration: 0.45, frequency: 440, volume: 0.15, type: 'sine', filterFrequency: 500 },\n\t\t\t{ startTime: 0.3, duration: 0.5, frequency: 392, volume: 0.12, type: 'sine', filterFrequency: 450 },\n\t\t],\n\t},\n\thomesick: {\n\t\tpuffs: [{ startTime: 0, duration: 0.25, frequency: 800, volume: 0.15 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.1, duration: 0.4, frequency: 440, volume: 0.12, type: 'sine', filterFrequency: 500 },\n\t\t\t{ startTime: 0.3, duration: 0.45, frequency: 392, volume: 0.1, type: 'sine', filterFrequency: 450 },\n\t\t],\n\t},\n\thurt: {\n\t\tpuffs: [{ startTime: 0, duration: 0.3, frequency: 600, volume: 0.25 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.1, duration: 0.4, frequency: 392, volume: 0.2, type: 'sine', filterFrequency: 400 },\n\t\t\t{ startTime: 0.3, duration: 0.45, frequency: 294, volume: 0.15, type: 'sine', filterFrequency: 350 },\n\t\t],\n\t},\n\tmiserable: {\n\t\tpuffs: [{ startTime: 0, duration: 0.3, frequency: 600, volume: 0.25 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.1, duration: 0.4, frequency: 392, volume: 0.2, type: 'sine', filterFrequency: 400 },\n\t\t\t{ startTime: 0.3, duration: 0.45, frequency: 294, volume: 0.15, type: 'sine', filterFrequency: 350 },\n\t\t],\n\t},\n\tregretful: {\n\t\tpuffs: [{ startTime: 0, duration: 0.3, frequency: 700, volume: 0.18 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.1, duration: 0.45, frequency: 440, volume: 0.15, type: 'sine', filterFrequency: 500 },\n\t\t\t{ startTime: 0.3, duration: 0.5, frequency: 392, volume: 0.12, type: 'sine', filterFrequency: 450 },\n\t\t],\n\t},\n\tashamed: {\n\t\tpuffs: [{ startTime: 0, duration: 0.25, frequency: 800, volume: 0.25 }],\n\t\ttones: [{ startTime: 0.08, duration: 0.3, frequency: 523, volume: 0.18, type: 'sine', frequencyEnd: 349 }],\n\t},\n\tinferior: {\n\t\tpuffs: [{ startTime: 0, duration: 0.25, frequency: 800, volume: 0.25 }],\n\t\ttones: [{ startTime: 0.08, duration: 0.3, frequency: 523, volume: 0.18, type: 'sine', frequencyEnd: 349 }],\n\t},\n\n\t// ========== ANXIOUS / FEARFUL ==========\n\tanxious: {\n\t\tpuffs: [\n\t\t\t{ startTime: 0, duration: 0.08, frequency: 1800, volume: 0.2 },\n\t\t\t{ startTime: 0.12, duration: 0.08, frequency: 1900, volume: 0.22 },\n\t\t],\n\t\ttones: [{ startTime: 0.03, duration: 0.25, frequency: 440, volume: 0.15, type: 'sine' }],\n\t\tdescription: 'Tight, quick puffs with uncertain wobble',\n\t},\n\tworried: {\n\t\tpuffs: [{ startTime: 0, duration: 0.15, frequency: 1200, volume: 0.2 }],\n\t\ttones: [{ startTime: 0.05, duration: 0.25, frequency: 349, volume: 0.15, type: 'sine', frequencyEnd: 392 }],\n\t},\n\tafraid: {\n\t\tpuffs: [\n\t\t\t{ startTime: 0, duration: 0.08, frequency: 1800, volume: 0.2 },\n\t\t\t{ startTime: 0.12, duration: 0.08, frequency: 1900, volume: 0.22 },\n\t\t],\n\t\ttones: [{ startTime: 0.03, duration: 0.25, frequency: 440, volume: 0.15, type: 'sine' }],\n\t},\n\tterrified: {\n\t\tpuffs: [{ startTime: 0, duration: 0.04, frequency: 3500, volume: 0.3 }],\n\t\ttones: [\n\t\t\t{ startTime: 0, duration: 0.08, frequency: 1047, volume: 0.25, type: 'sine' },\n\t\t\t{ startTime: 0.05, duration: 0.15, frequency: 880, volume: 0.15, type: 'sine' },\n\t\t],\n\t},\n\tpanicked: {\n\t\tpuffs: [{ startTime: 0, duration: 0.04, frequency: 3500, volume: 0.3 }],\n\t\ttones: [\n\t\t\t{ startTime: 0, duration: 0.08, frequency: 1047, volume: 0.25, type: 'sine' },\n\t\t\t{ startTime: 0.05, duration: 0.15, frequency: 880, volume: 0.15, type: 'sine' },\n\t\t],\n\t},\n\tnervous: {\n\t\tpuffs: [\n\t\t\t{ startTime: 0, duration: 0.05, frequency: 2000, volume: 0.18 },\n\t\t\t{ startTime: 0.08, duration: 0.05, frequency: 2100, volume: 0.18 },\n\t\t\t{ startTime: 0.15, duration: 0.06, frequency: 2000, volume: 0.16 },\n\t\t],\n\t\ttones: [{ startTime: 0.04, duration: 0.2, frequency: 494, volume: 0.12, type: 'sine' }],\n\t},\n\tuneasy: {\n\t\tpuffs: [{ startTime: 0, duration: 0.15, frequency: 1200, volume: 0.2 }],\n\t\ttones: [{ startTime: 0.05, duration: 0.25, frequency: 349, volume: 0.15, type: 'sine', frequencyEnd: 392 }],\n\t},\n\tinsecure: {\n\t\tpuffs: [\n\t\t\t{ startTime: 0, duration: 0.05, frequency: 2000, volume: 0.18 },\n\t\t\t{ startTime: 0.08, duration: 0.05, frequency: 2100, volume: 0.18 },\n\t\t\t{ startTime: 0.15, duration: 0.06, frequency: 2000, volume: 0.16 },\n\t\t],\n\t\ttones: [{ startTime: 0.04, duration: 0.2, frequency: 494, volume: 0.12, type: 'sine' }],\n\t},\n\toverwhelmed: {\n\t\tpuffs: [\n\t\t\t{ startTime: 0, duration: 0.08, frequency: 1800, volume: 0.2 },\n\t\t\t{ startTime: 0.12, duration: 0.08, frequency: 1900, volume: 0.22 },\n\t\t],\n\t\ttones: [{ startTime: 0.03, duration: 0.25, frequency: 440, volume: 0.15, type: 'sine' }],\n\t},\n\tstressed: {\n\t\tpuffs: [\n\t\t\t{ startTime: 0, duration: 0.08, frequency: 1800, volume: 0.2 },\n\t\t\t{ startTime: 0.12, duration: 0.08, frequency: 1900, volume: 0.22 },\n\t\t],\n\t\ttones: [{ startTime: 0.03, duration: 0.25, frequency: 440, volume: 0.15, type: 'sine' }],\n\t},\n\ttense: {\n\t\tpuffs: [\n\t\t\t{ startTime: 0, duration: 0.08, frequency: 1800, volume: 0.2 },\n\t\t\t{ startTime: 0.12, duration: 0.08, frequency: 1900, volume: 0.22 },\n\t\t],\n\t\ttones: [{ startTime: 0.03, duration: 0.25, frequency: 440, volume: 0.15, type: 'sine' }],\n\t},\n\tapprehensive: {\n\t\tpuffs: [{ startTime: 0, duration: 0.15, frequency: 1200, volume: 0.2 }],\n\t\ttones: [{ startTime: 0.05, duration: 0.25, frequency: 349, volume: 0.15, type: 'sine', frequencyEnd: 392 }],\n\t},\n\tstartled: {\n\t\tpuffs: [{ startTime: 0, duration: 0.04, frequency: 3500, volume: 0.3 }],\n\t\ttones: [\n\t\t\t{ startTime: 0, duration: 0.08, frequency: 1047, volume: 0.25, type: 'sine' },\n\t\t\t{ startTime: 0.05, duration: 0.15, frequency: 880, volume: 0.15, type: 'sine' },\n\t\t],\n\t},\n\tsuspicious: {\n\t\tpuffs: [{ startTime: 0, duration: 0.15, frequency: 1200, volume: 0.2 }],\n\t\ttones: [{ startTime: 0.05, duration: 0.25, frequency: 349, volume: 0.15, type: 'sine', frequencyEnd: 392 }],\n\t},\n\tvulnerable: {\n\t\tpuffs: [\n\t\t\t{ startTime: 0, duration: 0.05, frequency: 2000, volume: 0.18 },\n\t\t\t{ startTime: 0.08, duration: 0.05, frequency: 2100, volume: 0.18 },\n\t\t\t{ startTime: 0.15, duration: 0.06, frequency: 2000, volume: 0.16 },\n\t\t],\n\t\ttones: [{ startTime: 0.04, duration: 0.2, frequency: 494, volume: 0.12, type: 'sine' }],\n\t},\n\n\t// ========== ANGRY / FRUSTRATED ==========\n\tannoyed: {\n\t\tpuffs: [{ startTime: 0, duration: 0.1, frequency: 1000, volume: 0.25 }],\n\t\ttones: [{ startTime: 0.03, duration: 0.2, frequency: 294, volume: 0.18, type: 'sine', filterFrequency: 400 }],\n\t},\n\tirritated: {\n\t\tpuffs: [{ startTime: 0, duration: 0.1, frequency: 1000, volume: 0.25 }],\n\t\ttones: [{ startTime: 0.03, duration: 0.2, frequency: 294, volume: 0.18, type: 'sine', filterFrequency: 400 }],\n\t},\n\tfrustrated: {\n\t\tpuffs: [{ startTime: 0, duration: 0.12, frequency: 900, volume: 0.28 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.04, duration: 0.15, frequency: 349, volume: 0.2, type: 'sine' },\n\t\t\t{ startTime: 0.12, duration: 0.12, frequency: 330, volume: 0.18, type: 'sine' },\n\t\t],\n\t},\n\tangry: {\n\t\tpuffs: [{ startTime: 0, duration: 0.12, frequency: 900, volume: 0.28 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.04, duration: 0.15, frequency: 349, volume: 0.2, type: 'sine' },\n\t\t\t{ startTime: 0.12, duration: 0.12, frequency: 330, volume: 0.18, type: 'sine' },\n\t\t],\n\t},\n\tenraged: {\n\t\tpuffs: [{ startTime: 0, duration: 0.12, frequency: 900, volume: 0.28 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.04, duration: 0.15, frequency: 349, volume: 0.2, type: 'sine' },\n\t\t\t{ startTime: 0.12, duration: 0.12, frequency: 330, volume: 0.18, type: 'sine' },\n\t\t],\n\t},\n\tbitter: {\n\t\tpuffs: [{ startTime: 0, duration: 0.12, frequency: 900, volume: 0.28 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.04, duration: 0.15, frequency: 349, volume: 0.2, type: 'sine' },\n\t\t\t{ startTime: 0.12, duration: 0.12, frequency: 330, volume: 0.18, type: 'sine' },\n\t\t],\n\t},\n\tresentful: {\n\t\tpuffs: [{ startTime: 0, duration: 0.1, frequency: 1000, volume: 0.25 }],\n\t\ttones: [{ startTime: 0.03, duration: 0.2, frequency: 294, volume: 0.18, type: 'sine', filterFrequency: 400 }],\n\t},\n\tjealous: {\n\t\tpuffs: [{ startTime: 0, duration: 0.1, frequency: 1000, volume: 0.25 }],\n\t\ttones: [{ startTime: 0.03, duration: 0.2, frequency: 294, volume: 0.18, type: 'sine', filterFrequency: 400 }],\n\t},\n\tenvious: {\n\t\tpuffs: [{ startTime: 0, duration: 0.1, frequency: 1000, volume: 0.25 }],\n\t\ttones: [{ startTime: 0.03, duration: 0.2, frequency: 294, volume: 0.18, type: 'sine', filterFrequency: 400 }],\n\t},\n\tindignant: {\n\t\tpuffs: [{ startTime: 0, duration: 0.12, frequency: 900, volume: 0.28 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.04, duration: 0.15, frequency: 349, volume: 0.2, type: 'sine' },\n\t\t\t{ startTime: 0.12, duration: 0.12, frequency: 330, volume: 0.18, type: 'sine' },\n\t\t],\n\t},\n\timpatient: {\n\t\tpuffs: [\n\t\t\t{ startTime: 0, duration: 0.04, frequency: 1500, volume: 0.2 },\n\t\t\t{ startTime: 0.08, duration: 0.04, frequency: 1500, volume: 0.2 },\n\t\t\t{ startTime: 0.16, duration: 0.04, frequency: 1500, volume: 0.22 },\n\t\t],\n\t\ttones: [{ startTime: 0.06, duration: 0.1, frequency: 523, volume: 0.15, type: 'sine' }],\n\t},\n\thostile: {\n\t\tpuffs: [{ startTime: 0, duration: 0.12, frequency: 900, volume: 0.28 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.04, duration: 0.15, frequency: 349, volume: 0.2, type: 'sine' },\n\t\t\t{ startTime: 0.12, duration: 0.12, frequency: 330, volume: 0.18, type: 'sine' },\n\t\t],\n\t},\n\tcontemptuous: {\n\t\tpuffs: [{ startTime: 0, duration: 0.1, frequency: 1000, volume: 0.25 }],\n\t\ttones: [{ startTime: 0.03, duration: 0.2, frequency: 294, volume: 0.18, type: 'sine', filterFrequency: 400 }],\n\t},\n\n\t// ========== TIRED / DRAINED ==========\n\ttired: {\n\t\tpuffs: [{ startTime: 0, duration: 0.35, frequency: 500, volume: 0.2 }],\n\t\ttones: [{ startTime: 0.1, duration: 0.4, frequency: 330, volume: 0.12, type: 'sine', filterFrequency: 350 }],\n\t},\n\texhausted: {\n\t\tpuffs: [{ startTime: 0, duration: 0.45, frequency: 400, volume: 0.18 }],\n\t\ttones: [{ startTime: 0.15, duration: 0.5, frequency: 294, volume: 0.1, type: 'sine', filterFrequency: 300 }],\n\t},\n\tdrained: {\n\t\tpuffs: [{ startTime: 0, duration: 0.45, frequency: 400, volume: 0.18 }],\n\t\ttones: [{ startTime: 0.15, duration: 0.5, frequency: 294, volume: 0.1, type: 'sine', filterFrequency: 300 }],\n\t},\n\tburnedOut: {\n\t\tpuffs: [{ startTime: 0, duration: 0.45, frequency: 400, volume: 0.18 }],\n\t\ttones: [{ startTime: 0.15, duration: 0.5, frequency: 294, volume: 0.1, type: 'sine', filterFrequency: 300 }],\n\t},\n\tnumb: {\n\t\tpuffs: [{ startTime: 0, duration: 0.45, frequency: 400, volume: 0.18 }],\n\t\ttones: [{ startTime: 0.15, duration: 0.5, frequency: 294, volume: 0.1, type: 'sine', filterFrequency: 300 }],\n\t},\n\tbored: {\n\t\tpuffs: [{ startTime: 0, duration: 0.25, frequency: 600, volume: 0.15 }],\n\t\ttones: [{ startTime: 0.1, duration: 0.3, frequency: 349, volume: 0.1, type: 'sine', filterFrequency: 400 }],\n\t},\n\tunmotivated: {\n\t\tpuffs: [{ startTime: 0, duration: 0.25, frequency: 600, volume: 0.15 }],\n\t\ttones: [{ startTime: 0.1, duration: 0.3, frequency: 349, volume: 0.1, type: 'sine', filterFrequency: 400 }],\n\t},\n\tapathetic: {\n\t\tpuffs: [{ startTime: 0, duration: 0.25, frequency: 600, volume: 0.15 }],\n\t\ttones: [{ startTime: 0.1, duration: 0.3, frequency: 349, volume: 0.1, type: 'sine', filterFrequency: 400 }],\n\t},\n\trestless: {\n\t\tpuffs: [{ startTime: 0, duration: 0.35, frequency: 500, volume: 0.2 }],\n\t\ttones: [{ startTime: 0.1, duration: 0.4, frequency: 330, volume: 0.12, type: 'sine', filterFrequency: 350 }],\n\t},\n\n\t// ========== CALM / GROUNDED ==========\n\tcalm: {\n\t\tpuffs: [{ startTime: 0, duration: 0.3, frequency: 600, volume: 0.12 }],\n\t\ttones: [{ startTime: 0.1, duration: 0.5, frequency: 392, volume: 0.1, type: 'sine', filterFrequency: 500 }],\n\t},\n\trelaxed: {\n\t\tpuffs: [{ startTime: 0, duration: 0.35, frequency: 700, volume: 0.15 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.15, duration: 0.45, frequency: 440, volume: 0.1, type: 'sine', filterFrequency: 800 },\n\t\t\t{ startTime: 0.35, duration: 0.5, frequency: 392, volume: 0.08, type: 'sine', filterFrequency: 800 },\n\t\t],\n\t},\n\tatEase: {\n\t\tpuffs: [{ startTime: 0, duration: 0.35, frequency: 700, volume: 0.15 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.15, duration: 0.45, frequency: 440, volume: 0.1, type: 'sine', filterFrequency: 800 },\n\t\t\t{ startTime: 0.35, duration: 0.5, frequency: 392, volume: 0.08, type: 'sine', filterFrequency: 800 },\n\t\t],\n\t},\n\tbalanced: {\n\t\tpuffs: [{ startTime: 0, duration: 0.3, frequency: 600, volume: 0.12 }],\n\t\ttones: [{ startTime: 0.1, duration: 0.5, frequency: 392, volume: 0.1, type: 'sine', filterFrequency: 500 }],\n\t},\n\tstable: {\n\t\tpuffs: [{ startTime: 0, duration: 0.25, frequency: 500, volume: 0.2 }],\n\t\ttones: [{ startTime: 0.1, duration: 0.4, frequency: 262, volume: 0.15, type: 'sine', filterFrequency: 350 }],\n\t},\n\tsecure: {\n\t\tpuffs: [{ startTime: 0, duration: 0.3, frequency: 700, volume: 0.15 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.1, duration: 0.4, frequency: 349, volume: 0.12, type: 'sine', filterFrequency: 800 },\n\t\t\t{ startTime: 0.25, duration: 0.45, frequency: 440, volume: 0.1, type: 'sine', filterFrequency: 800 },\n\t\t],\n\t},\n\tsafe: {\n\t\tpuffs: [{ startTime: 0, duration: 0.3, frequency: 700, volume: 0.15 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.1, duration: 0.4, frequency: 349, volume: 0.12, type: 'sine', filterFrequency: 800 },\n\t\t\t{ startTime: 0.25, duration: 0.45, frequency: 440, volume: 0.1, type: 'sine', filterFrequency: 800 },\n\t\t],\n\t},\n\tcentered: {\n\t\tpuffs: [{ startTime: 0, duration: 0.25, frequency: 500, volume: 0.2 }],\n\t\ttones: [{ startTime: 0.1, duration: 0.4, frequency: 262, volume: 0.15, type: 'sine', filterFrequency: 350 }],\n\t},\n\tgrounded: {\n\t\tpuffs: [{ startTime: 0, duration: 0.25, frequency: 500, volume: 0.2 }],\n\t\ttones: [{ startTime: 0.1, duration: 0.4, frequency: 262, volume: 0.15, type: 'sine', filterFrequency: 350 }],\n\t},\n\taccepting: {\n\t\tpuffs: [{ startTime: 0, duration: 0.3, frequency: 600, volume: 0.12 }],\n\t\ttones: [{ startTime: 0.1, duration: 0.5, frequency: 392, volume: 0.1, type: 'sine', filterFrequency: 500 }],\n\t},\n\n\t// ========== CONNECTED / SOCIAL ==========\n\tconnected: {\n\t\tpuffs: [{ startTime: 0, duration: 0.2, frequency: 1200, volume: 0.18 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.08, duration: 0.3, frequency: 440, volume: 0.15, type: 'sine', filterFrequency: 800 },\n\t\t\t{ startTime: 0.12, duration: 0.32, frequency: 523, volume: 0.12, type: 'sine', filterFrequency: 800 },\n\t\t],\n\t},\n\taccepted: {\n\t\tpuffs: [{ startTime: 0, duration: 0.15, frequency: 1500, volume: 0.2 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.05, duration: 0.25, frequency: 440, volume: 0.15, type: 'sine', filterFrequency: 800 },\n\t\t\t{ startTime: 0.15, duration: 0.3, frequency: 523, volume: 0.18, type: 'sine', filterFrequency: 800 },\n\t\t],\n\t},\n\tincluded: {\n\t\tpuffs: [{ startTime: 0, duration: 0.2, frequency: 1200, volume: 0.18 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.08, duration: 0.3, frequency: 440, volume: 0.15, type: 'sine', filterFrequency: 800 },\n\t\t\t{ startTime: 0.12, duration: 0.32, frequency: 523, volume: 0.12, type: 'sine', filterFrequency: 800 },\n\t\t],\n\t},\n\tbelonging: {\n\t\tpuffs: [{ startTime: 0, duration: 0.2, frequency: 1200, volume: 0.18 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.08, duration: 0.3, frequency: 440, volume: 0.15, type: 'sine', filterFrequency: 800 },\n\t\t\t{ startTime: 0.12, duration: 0.32, frequency: 523, volume: 0.12, type: 'sine', filterFrequency: 800 },\n\t\t],\n\t},\n\tappreciated: {\n\t\tpuffs: [{ startTime: 0, duration: 0.15, frequency: 1500, volume: 0.2 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.05, duration: 0.25, frequency: 440, volume: 0.15, type: 'sine', filterFrequency: 800 },\n\t\t\t{ startTime: 0.15, duration: 0.3, frequency: 523, volume: 0.18, type: 'sine', filterFrequency: 800 },\n\t\t],\n\t},\n\tvalued: {\n\t\tpuffs: [{ startTime: 0, duration: 0.15, frequency: 1500, volume: 0.2 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.05, duration: 0.25, frequency: 440, volume: 0.15, type: 'sine', filterFrequency: 800 },\n\t\t\t{ startTime: 0.15, duration: 0.3, frequency: 523, volume: 0.18, type: 'sine', filterFrequency: 800 },\n\t\t],\n\t},\n\trespected: {\n\t\tpuffs: [{ startTime: 0, duration: 0.15, frequency: 1500, volume: 0.2 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.05, duration: 0.25, frequency: 440, volume: 0.15, type: 'sine', filterFrequency: 800 },\n\t\t\t{ startTime: 0.15, duration: 0.3, frequency: 523, volume: 0.18, type: 'sine', filterFrequency: 800 },\n\t\t],\n\t},\n\tsupported: {\n\t\tpuffs: [{ startTime: 0, duration: 0.25, frequency: 900, volume: 0.18 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.1, duration: 0.35, frequency: 349, volume: 0.12, type: 'sine', filterFrequency: 800 },\n\t\t\t{ startTime: 0.15, duration: 0.4, frequency: 440, volume: 0.1, type: 'sine', filterFrequency: 800 },\n\t\t],\n\t},\n\tprotective: {\n\t\tpuffs: [{ startTime: 0, duration: 0.25, frequency: 900, volume: 0.18 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.1, duration: 0.35, frequency: 349, volume: 0.12, type: 'sine', filterFrequency: 800 },\n\t\t\t{ startTime: 0.15, duration: 0.4, frequency: 440, volume: 0.1, type: 'sine', filterFrequency: 800 },\n\t\t],\n\t},\n\tcompassionate: {\n\t\tpuffs: [{ startTime: 0, duration: 0.2, frequency: 1200, volume: 0.18 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.08, duration: 0.3, frequency: 440, volume: 0.15, type: 'sine', filterFrequency: 800 },\n\t\t\t{ startTime: 0.12, duration: 0.32, frequency: 523, volume: 0.12, type: 'sine', filterFrequency: 800 },\n\t\t],\n\t},\n\tempathetic: {\n\t\tpuffs: [{ startTime: 0, duration: 0.2, frequency: 1200, volume: 0.18 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.08, duration: 0.3, frequency: 440, volume: 0.15, type: 'sine', filterFrequency: 800 },\n\t\t\t{ startTime: 0.12, duration: 0.32, frequency: 523, volume: 0.12, type: 'sine', filterFrequency: 800 },\n\t\t],\n\t},\n\n\t// ========== MIXED / COMPLICATED ==========\n\tconflicted: {\n\t\tpuffs: [{ startTime: 0, duration: 0.12, frequency: 1200, volume: 0.18 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.04, duration: 0.2, frequency: 440, volume: 0.12, type: 'sine', frequencyEnd: 494 },\n\t\t\t{ startTime: 0.15, duration: 0.15, frequency: 466, volume: 0.1, type: 'sine' },\n\t\t],\n\t},\n\tconfused: {\n\t\tpuffs: [{ startTime: 0, duration: 0.12, frequency: 1200, volume: 0.18 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.04, duration: 0.2, frequency: 440, volume: 0.12, type: 'sine', frequencyEnd: 494 },\n\t\t\t{ startTime: 0.15, duration: 0.15, frequency: 466, volume: 0.1, type: 'sine' },\n\t\t],\n\t},\n\tambivalent: {\n\t\tpuffs: [{ startTime: 0, duration: 0.12, frequency: 1200, volume: 0.18 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.04, duration: 0.2, frequency: 440, volume: 0.12, type: 'sine', frequencyEnd: 494 },\n\t\t\t{ startTime: 0.15, duration: 0.15, frequency: 466, volume: 0.1, type: 'sine' },\n\t\t],\n\t},\n\tnostalgic: {\n\t\tpuffs: [{ startTime: 0, duration: 0.25, frequency: 800, volume: 0.15 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.1, duration: 0.4, frequency: 440, volume: 0.12, type: 'sine', filterFrequency: 500 },\n\t\t\t{ startTime: 0.3, duration: 0.45, frequency: 392, volume: 0.1, type: 'sine', filterFrequency: 450 },\n\t\t],\n\t},\n\tguilty: {\n\t\tpuffs: [{ startTime: 0, duration: 0.25, frequency: 800, volume: 0.25 }],\n\t\ttones: [{ startTime: 0.08, duration: 0.3, frequency: 523, volume: 0.18, type: 'sine', frequencyEnd: 349 }],\n\t},\n\tembarrassed: {\n\t\tpuffs: [\n\t\t\t{ startTime: 0, duration: 0.05, frequency: 2000, volume: 0.18 },\n\t\t\t{ startTime: 0.08, duration: 0.05, frequency: 2100, volume: 0.18 },\n\t\t\t{ startTime: 0.15, duration: 0.06, frequency: 2000, volume: 0.16 },\n\t\t],\n\t\ttones: [{ startTime: 0.04, duration: 0.2, frequency: 494, volume: 0.12, type: 'sine' }],\n\t},\n\tsurprised: {\n\t\tpuffs: [{ startTime: 0, duration: 0.06, frequency: 2800, volume: 0.25 }],\n\t\ttones: [{ startTime: 0.02, duration: 0.15, frequency: 659, volume: 0.2, type: 'sine', frequencyEnd: 988 }],\n\t},\n\tshocked: {\n\t\tpuffs: [{ startTime: 0, duration: 0.04, frequency: 3500, volume: 0.3 }],\n\t\ttones: [\n\t\t\t{ startTime: 0, duration: 0.08, frequency: 1047, volume: 0.25, type: 'sine' },\n\t\t\t{ startTime: 0.05, duration: 0.15, frequency: 880, volume: 0.15, type: 'sine' },\n\t\t],\n\t},\n\tawestruck: {\n\t\tpuffs: [{ startTime: 0, duration: 0.2, frequency: 1500, volume: 0.2 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.08, duration: 0.4, frequency: 440, volume: 0.15, type: 'sine' },\n\t\t\t{ startTime: 0.1, duration: 0.38, frequency: 660, volume: 0.12, type: 'sine' },\n\t\t\t{ startTime: 0.12, duration: 0.36, frequency: 880, volume: 0.09, type: 'sine' },\n\t\t],\n\t},\n\tskeptical: {\n\t\tpuffs: [{ startTime: 0, duration: 0.12, frequency: 1200, volume: 0.18 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.04, duration: 0.2, frequency: 440, volume: 0.12, type: 'sine', frequencyEnd: 494 },\n\t\t\t{ startTime: 0.15, duration: 0.15, frequency: 466, volume: 0.1, type: 'sine' },\n\t\t],\n\t},\n}\n\n// ============================================================================\n// SOUND SERVICE\n// ============================================================================\n\n/**\n * Sound Service - Provides centralized sound management for Schmancy components\n *\n * Following the theme service pattern:\n * - Has default sounds as fallback\n * - Can receive custom sound theme from AI\n * - Reactive observables for state changes\n * - Persists settings to session storage\n */\nclass SoundService {\n\tprivate static instance: SoundService\n\n\t/** Audio context for Web Audio API */\n\tprivate audioContext: AudioContext | null = null\n\n\t// Public observables derived from context\n\t// Don't use distinctUntilChanged for theme - we need all emissions including storage loads\n\tpublic readonly theme$ = SoundContext.$.pipe(\n\t\tmap(settings => settings.theme),\n\t\tshareReplay(1)\n\t)\n\n\tpublic readonly volume$ = SoundContext.$.pipe(\n\t\tmap(settings => settings.volume),\n\t\tdistinctUntilChanged(),\n\t\tshareReplay(1)\n\t)\n\n\tpublic readonly muted$ = SoundContext.$.pipe(\n\t\tmap(settings => settings.muted),\n\t\tdistinctUntilChanged(),\n\t\tshareReplay(1)\n\t)\n\n\t/** BehaviorSubject for current theme name (for debugging/display) */\n\tprivate readonly _themeName$ = new BehaviorSubject<string>('default')\n\tpublic readonly themeName$ = this._themeName$.asObservable()\n\n\t// Getters for synchronous access\n\tget theme(): SoundTheme | null {\n\t\treturn SoundContext.value.theme\n\t}\n\n\tget volume(): number {\n\t\treturn SoundContext.value.volume\n\t}\n\n\tget muted(): boolean {\n\t\treturn SoundContext.value.muted\n\t}\n\n\tget themeName(): string {\n\t\treturn this.theme?.name ?? 'default'\n\t}\n\n\tprivate constructor() {\n\t\t// Subscribe to theme changes to update theme name\n\t\tthis.theme$.subscribe(theme => {\n\t\t\tthis._themeName$.next(theme?.name ?? 'default')\n\t\t})\n\t}\n\n\t// ==========================================================================\n\t// AUDIO CONTEXT MANAGEMENT\n\t// ==========================================================================\n\n\tprivate getContext(): AudioContext {\n\t\tif (!this.audioContext) {\n\t\t\tconst AudioContextClass =\n\t\t\t\twindow.AudioContext || (window as unknown as { webkitAudioContext: typeof AudioContext }).webkitAudioContext\n\t\t\tthis.audioContext = new AudioContextClass()\n\t\t}\n\t\tif (this.audioContext.state === 'suspended') {\n\t\t\tthis.audioContext.resume()\n\t\t}\n\t\treturn this.audioContext\n\t}\n\n\t// ==========================================================================\n\t// SOUND PRIMITIVES\n\t// ==========================================================================\n\n\t/** Play a puff (breath/air) sound */\n\tprivate playPuff(startTime: number, params: PuffParams, masterVolume: number): void {\n\t\tconst ctx = this.getContext()\n\t\tconst bufferSize = Math.floor(ctx.sampleRate * params.duration)\n\t\tconst buffer = ctx.createBuffer(1, bufferSize, ctx.sampleRate)\n\t\tconst data = buffer.getChannelData(0)\n\n\t\tfor (let i = 0; i < bufferSize; i++) {\n\t\t\tdata[i] = Math.random() * 2 - 1\n\t\t}\n\n\t\tconst noise = ctx.createBufferSource()\n\t\tnoise.buffer = buffer\n\n\t\tconst filter = ctx.createBiquadFilter()\n\t\tfilter.type = 'bandpass'\n\t\tfilter.frequency.value = params.frequency\n\t\tfilter.Q.value = 0.7\n\n\t\tconst gain = ctx.createGain()\n\t\tgain.gain.setValueAtTime(0, startTime)\n\t\tgain.gain.linearRampToValueAtTime(params.volume * masterVolume, startTime + 0.015)\n\t\tgain.gain.exponentialRampToValueAtTime(0.001, startTime + params.duration)\n\n\t\tnoise.connect(filter).connect(gain).connect(ctx.destination)\n\t\tnoise.start(startTime)\n\t\tnoise.stop(startTime + params.duration)\n\t}\n\n\t/** Play a tone (musical) sound */\n\tprivate playTone(startTime: number, params: ToneParams, masterVolume: number): void {\n\t\tconst ctx = this.getContext()\n\t\tconst osc = ctx.createOscillator()\n\t\tconst gain = ctx.createGain()\n\n\t\tosc.type = params.type\n\t\tosc.frequency.setValueAtTime(params.frequency, startTime)\n\n\t\tif (params.frequencyEnd) {\n\t\t\tosc.frequency.exponentialRampToValueAtTime(params.frequencyEnd, startTime + params.duration * 0.8)\n\t\t}\n\n\t\t// Apply filter if specified\n\t\tlet lastNode: AudioNode = osc\n\t\tif (params.filterFrequency) {\n\t\t\tconst filter = ctx.createBiquadFilter()\n\t\t\tfilter.type = 'lowpass'\n\t\t\tfilter.frequency.value = params.filterFrequency\n\t\t\tosc.connect(filter)\n\t\t\tlastNode = filter\n\t\t}\n\n\t\tgain.gain.setValueAtTime(0, startTime)\n\t\tgain.gain.linearRampToValueAtTime(params.volume * masterVolume, startTime + 0.02)\n\t\tgain.gain.exponentialRampToValueAtTime(0.001, startTime + params.duration)\n\n\t\tlastNode.connect(gain).connect(ctx.destination)\n\t\tosc.start(startTime)\n\t\tosc.stop(startTime + params.duration)\n\t}\n\n\t// ==========================================================================\n\t// PUBLIC API - THEME MANAGEMENT\n\t// ==========================================================================\n\n\t/**\n\t * Set a custom sound theme (e.g., from AI generation)\n\t * @param theme The sound theme to apply\n\t */\n\tpublic setTheme(theme: SoundTheme): void {\n\t\tSoundContext.set({ theme })\n\t}\n\n\t/**\n\t * Reset to default sounds (removes custom theme)\n\t */\n\tpublic resetTheme(): void {\n\t\tSoundContext.set({ theme: null })\n\t}\n\n\t/**\n\t * Set volume level (0.0 - 1.0)\n\t * @param volume Volume level\n\t */\n\tpublic setVolume(volume: number): void {\n\t\tSoundContext.set({ volume: Math.max(0, Math.min(1, volume)) })\n\t}\n\n\t/**\n\t * Mute all sounds\n\t */\n\tpublic mute(): void {\n\t\tSoundContext.set({ muted: true })\n\t}\n\n\t/**\n\t * Unmute sounds\n\t */\n\tpublic unmute(): void {\n\t\tSoundContext.set({ muted: false })\n\t}\n\n\t/**\n\t * Toggle mute state\n\t */\n\tpublic toggleMute(): void {\n\t\tSoundContext.set({ muted: !this.muted })\n\t}\n\n\t// ==========================================================================\n\t// PUBLIC API - SOUND PLAYBACK\n\t// ==========================================================================\n\n\t/**\n\t * Get the sound definition for a feeling\n\t * Uses custom theme if available, falls back to defaults\n\t */\n\tpublic getSoundForFeeling(feeling: Feeling): FeelingSound {\n\t\tconst customTheme = this.theme\n\n\t\t// Try custom theme first\n\t\tif (customTheme?.feelings?.[feeling]) {\n\t\t\treturn customTheme.feelings[feeling]!\n\t\t}\n\n\t\t// Try category default from custom theme\n\t\tif (customTheme?.categoryDefaults) {\n\t\t\tconst category = this.getCategoryForFeeling(feeling)\n\t\t\tif (customTheme.categoryDefaults[category]) {\n\t\t\t\treturn customTheme.categoryDefaults[category]!\n\t\t\t}\n\t\t}\n\n\t\t// Fall back to defaults\n\t\treturn DEFAULT_SOUNDS[feeling]\n\t}\n\n\t/**\n\t * Get the category for a feeling\n\t */\n\tprivate getCategoryForFeeling(feeling: Feeling): FeelingCategory {\n\t\tconst happyFeelings: Feeling[] = [\n\t\t\t'joyful',\n\t\t\t'content',\n\t\t\t'excited',\n\t\t\t'proud',\n\t\t\t'hopeful',\n\t\t\t'relieved',\n\t\t\t'grateful',\n\t\t\t'peaceful',\n\t\t\t'playful',\n\t\t\t'amused',\n\t\t\t'curious',\n\t\t\t'inspired',\n\t\t\t'confident',\n\t\t\t'loved',\n\t\t\t'comforted',\n\t\t\t'energized',\n\t\t\t'celebrated',\n\t\t]\n\t\tconst sadFeelings: Feeling[] = [\n\t\t\t'sad',\n\t\t\t'lonely',\n\t\t\t'disappointed',\n\t\t\t'heartbroken',\n\t\t\t'grieving',\n\t\t\t'hopeless',\n\t\t\t'empty',\n\t\t\t'discouraged',\n\t\t\t'melancholic',\n\t\t\t'homesick',\n\t\t\t'hurt',\n\t\t\t'miserable',\n\t\t\t'regretful',\n\t\t\t'ashamed',\n\t\t\t'inferior',\n\t\t]\n\t\tconst anxiousFeelings: Feeling[] = [\n\t\t\t'anxious',\n\t\t\t'worried',\n\t\t\t'afraid',\n\t\t\t'terrified',\n\t\t\t'panicked',\n\t\t\t'nervous',\n\t\t\t'uneasy',\n\t\t\t'insecure',\n\t\t\t'overwhelmed',\n\t\t\t'stressed',\n\t\t\t'tense',\n\t\t\t'apprehensive',\n\t\t\t'startled',\n\t\t\t'suspicious',\n\t\t\t'vulnerable',\n\t\t]\n\t\tconst angryFeelings: Feeling[] = [\n\t\t\t'annoyed',\n\t\t\t'irritated',\n\t\t\t'frustrated',\n\t\t\t'angry',\n\t\t\t'enraged',\n\t\t\t'bitter',\n\t\t\t'resentful',\n\t\t\t'jealous',\n\t\t\t'envious',\n\t\t\t'indignant',\n\t\t\t'impatient',\n\t\t\t'hostile',\n\t\t\t'contemptuous',\n\t\t]\n\t\tconst tiredFeelings: Feeling[] = ['tired', 'exhausted', 'drained', 'burnedOut', 'numb', 'bored', 'unmotivated', 'apathetic', 'restless']\n\t\tconst calmFeelings: Feeling[] = ['calm', 'relaxed', 'atEase', 'balanced', 'stable', 'secure', 'safe', 'centered', 'grounded', 'accepting']\n\t\tconst connectedFeelings: Feeling[] = [\n\t\t\t'connected',\n\t\t\t'accepted',\n\t\t\t'included',\n\t\t\t'belonging',\n\t\t\t'appreciated',\n\t\t\t'valued',\n\t\t\t'respected',\n\t\t\t'supported',\n\t\t\t'protective',\n\t\t\t'compassionate',\n\t\t\t'empathetic',\n\t\t]\n\n\t\tif (happyFeelings.includes(feeling)) return 'happy'\n\t\tif (sadFeelings.includes(feeling)) return 'sad'\n\t\tif (anxiousFeelings.includes(feeling)) return 'anxious'\n\t\tif (angryFeelings.includes(feeling)) return 'angry'\n\t\tif (tiredFeelings.includes(feeling)) return 'tired'\n\t\tif (calmFeelings.includes(feeling)) return 'calm'\n\t\tif (connectedFeelings.includes(feeling)) return 'connected'\n\t\treturn 'mixed'\n\t}\n\n\t/**\n\t * Play a feeling sound\n\t * @param feeling The feeling to play\n\t */\n\tpublic play(feeling: Feeling): void {\n\t\tif (this.muted) return\n\n\t\tconst sound = this.getSoundForFeeling(feeling)\n\t\tconst ctx = this.getContext()\n\t\tconst now = ctx.currentTime\n\n\t\t// Calculate master volume (theme + user setting)\n\t\tconst themeMasterVolume = this.theme?.masterVolume ?? 1\n\t\tconst masterVolume = this.volume * themeMasterVolume\n\n\t\t// Play puffs\n\t\tsound.puffs.forEach(puff => {\n\t\t\tthis.playPuff(now + puff.startTime, puff, masterVolume)\n\t\t})\n\n\t\t// Play tones\n\t\tsound.tones.forEach(tone => {\n\t\t\tthis.playTone(now + tone.startTime, tone, masterVolume)\n\t\t})\n\t}\n\n\t/**\n\t * Dispose audio context\n\t */\n\tpublic dispose(): void {\n\t\tif (this.audioContext) {\n\t\t\tthis.audioContext.close()\n\t\t\tthis.audioContext = null\n\t\t}\n\t}\n\n\t/**\n\t * Get singleton instance\n\t */\n\tstatic getInstance(): SoundService {\n\t\tif (!SoundService.instance) {\n\t\t\tSoundService.instance = new SoundService()\n\t\t}\n\t\treturn SoundService.instance\n\t}\n}\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\n/** Global sound service singleton */\nexport const sound = SoundService.getInstance()\nexport const schmancySound = sound // Alias for consistency with theme\n"],"mappings":";;AA8CA,IAAM,IAAe,EAA0B,gBAAA,EAAkB,MAAM;CACtE,OAAO;CACP,QAAQ;CACR,OAAA,CAAO;AAAA,CAAA,GAWF,IAAgD;CAErD,QAAQ;EACP,OAAO,CACN;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAM,QAAQ;EAAA,GACzD;GAAE,WAAW;GAAM,UAAU;GAAK,WAAW;GAAM,QAAQ;EAAA,CAAA;EAE5D,OAAO;GACN;IAAE,WAAW;IAAM,UAAU;IAAM,WAAW;IAAK,QAAQ;IAAM,MAAM;GAAA;GACvE;IAAE,WAAW;IAAK,UAAU;IAAK,WAAW;IAAK,QAAQ;IAAK,MAAM;GAAA;GACpE;IAAE,WAAW;IAAM,UAAU;IAAM,WAAW;IAAM,QAAQ;IAAM,MAAM;GAAA;EAAA;CAAA;CAG1E,SAAS;EACR,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAK,WAAW;GAAM,QAAQ;EAAA,CAAA;EAChE,OAAO,CACN;GAAE,WAAW;GAAM,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAK,MAAM;GAAQ,iBAAiB;EAAA,GAC9F;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAGlG,SAAS;EACR,OAAO;GACN;IAAE,WAAW;IAAG,UAAU;IAAM,WAAW;IAAM,QAAQ;GAAA;GACzD;IAAE,WAAW;IAAM,UAAU;IAAM,WAAW;IAAM,QAAQ;GAAA;GAC5D;IAAE,WAAW;IAAK,UAAU;IAAM,WAAW;IAAM,QAAQ;GAAA;EAAA;EAE5D,OAAO;GACN;IAAE,WAAW;IAAM,UAAU;IAAM,WAAW;IAAK,QAAQ;IAAK,MAAM;GAAA;GACtE;IAAE,WAAW;IAAM,UAAU;IAAM,WAAW;IAAM,QAAQ;IAAM,MAAM;GAAA;GACxE;IAAE,WAAW;IAAM,UAAU;IAAM,WAAW;IAAM,QAAQ;IAAK,MAAM;GAAA;EAAA;CAAA;CAGzE,OAAO;EACN,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAM,QAAQ;EAAA,CAAA;EACjE,OAAO;GACN;IAAE,WAAW;IAAM,UAAU;IAAM,WAAW;IAAK,QAAQ;IAAM,MAAM;GAAA;GACvE;IAAE,WAAW;IAAM,UAAU;IAAM,WAAW;IAAK,QAAQ;IAAK,MAAM;GAAA;GACtE;IAAE,WAAW;IAAM,UAAU;IAAK,WAAW;IAAK,QAAQ;IAAM,MAAM;GAAA;EAAA;CAAA;CAGxE,SAAS;EACR,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAM,QAAQ;EAAA,CAAA;EACjE,OAAO,CAAC;GAAE,WAAW;GAAM,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAK,MAAM;GAAQ,cAAc;EAAA,CAAA;CAAA;CAEpG,UAAU;EACT,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAM,QAAQ;EAAA,CAAA;EACjE,OAAO,CACN;GAAE,WAAW;GAAK,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAK,MAAM;GAAQ,iBAAiB;EAAA,GAC9F;GAAE,WAAW;GAAM,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAGjG,UAAU;EACT,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAM,QAAQ;EAAA,CAAA;EACjE,OAAO;GACN;IAAE,WAAW;IAAM,UAAU;IAAK,WAAW;IAAK,QAAQ;IAAK,MAAM;IAAQ,iBAAiB;GAAA;GAC9F;IAAE,WAAW;IAAM,UAAU;IAAM,WAAW;IAAK,QAAQ;IAAK,MAAM;IAAQ,iBAAiB;GAAA;GAC/F;IAAE,WAAW;IAAM,UAAU;IAAK,WAAW;IAAK,QAAQ;IAAM,MAAM;IAAQ,iBAAiB;GAAA;EAAA;CAAA;CAGjG,UAAU;EACT,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAK,WAAW;GAAK,QAAQ;EAAA,CAAA;EAC/D,OAAO,CAAC;GAAE,WAAW;GAAK,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAEvG,SAAS;EACR,OAAO;GACN;IAAE,WAAW;IAAG,UAAU;IAAM,WAAW;IAAM,QAAQ;GAAA;GACzD;IAAE,WAAW;IAAM,UAAU;IAAM,WAAW;IAAM,QAAQ;GAAA;GAC5D;IAAE,WAAW;IAAM,UAAU;IAAM,WAAW;IAAM,QAAQ;GAAA;EAAA;EAE7D,OAAO;GACN;IAAE,WAAW;IAAM,UAAU;IAAK,WAAW;IAAK,QAAQ;IAAK,MAAM;GAAA;GACrE;IAAE,WAAW;IAAK,UAAU;IAAM,WAAW;IAAK,QAAQ;IAAM,MAAM;GAAA;GACtE;IAAE,WAAW;IAAM,UAAU;IAAM,WAAW;IAAK,QAAQ;IAAK,MAAM;GAAA;EAAA;CAAA;CAGxE,QAAQ;EACP,OAAO;GACN;IAAE,WAAW;IAAG,UAAU;IAAM,WAAW;IAAM,QAAQ;GAAA;GACzD;IAAE,WAAW;IAAM,UAAU;IAAM,WAAW;IAAM,QAAQ;GAAA;GAC5D;IAAE,WAAW;IAAM,UAAU;IAAM,WAAW;IAAM,QAAQ;GAAA;EAAA;EAE7D,OAAO,CAAC;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAM,MAAM;EAAA,CAAA;CAAA;CAEhF,SAAS;EACR,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAK,WAAW;GAAM,QAAQ;EAAA,CAAA;EAChE,OAAO,CAAC;GAAE,WAAW;GAAM,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAK,MAAM;GAAQ,cAAc;EAAA,CAAA;CAAA;CAEpG,UAAU;EACT,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAK,WAAW;GAAM,QAAQ;EAAA,CAAA;EAChE,OAAO;GACN;IAAE,WAAW;IAAM,UAAU;IAAK,WAAW;IAAK,QAAQ;IAAK,MAAM;GAAA;GACrE;IAAE,WAAW;IAAM,UAAU;IAAM,WAAW;IAAO,QAAQ;IAAM,MAAM;GAAA;GACzE;IAAE,WAAW;IAAM,UAAU;IAAM,WAAW;IAAM,QAAQ;IAAM,MAAM;GAAA;EAAA;CAAA;CAG1E,WAAW;EACV,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAM,QAAQ;EAAA,CAAA;EACjE,OAAO,CACN;GAAE,WAAW;GAAM,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAM,MAAM;EAAA,GACtE;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAK,MAAM;EAAA,CAAA;CAAA;CAGxE,OAAO;EACN,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAK,WAAW;GAAM,QAAQ;EAAA,CAAA;EAChE,OAAO,CACN;GAAE,WAAW;GAAM,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,GAC/F;GAAE,WAAW;GAAK,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAGjG,WAAW;EACV,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAK,QAAQ;EAAA,CAAA;EAChE,OAAO,CACN;GAAE,WAAW;GAAK,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,GAC/F;GAAE,WAAW;GAAM,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAGjG,WAAW;EACV,OAAO,CACN;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAM,QAAQ;EAAA,GACzD;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAM,QAAQ;EAAA,CAAA;EAE7D,OAAO;GACN;IAAE,WAAW;IAAM,UAAU;IAAK,WAAW;IAAK,QAAQ;IAAK,MAAM;GAAA;GACrE;IAAE,WAAW;IAAM,UAAU;IAAM,WAAW;IAAK,QAAQ;IAAM,MAAM;GAAA;GACvE;IAAE,WAAW;IAAM,UAAU;IAAM,WAAW;IAAM,QAAQ;IAAM,MAAM;GAAA;EAAA;CAAA;CAG1E,YAAY;EACX,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAM,QAAQ;EAAA,CAAA;EACjE,OAAO;GACN;IAAE,WAAW;IAAM,UAAU;IAAM,WAAW;IAAK,QAAQ;IAAM,MAAM;GAAA;GACvE;IAAE,WAAW;IAAM,UAAU;IAAM,WAAW;IAAK,QAAQ;IAAM,MAAM;GAAA;GACvE;IAAE,WAAW;IAAM,UAAU;IAAK,WAAW;IAAK,QAAQ;IAAM,MAAM;GAAA;GACtE;IAAE,WAAW;IAAM,UAAU;IAAK,WAAW;IAAM,QAAQ;IAAM,MAAM;GAAA;EAAA;CAAA;CAKzE,KAAK;EACJ,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAK,WAAW;GAAK,QAAQ;EAAA,CAAA;EAC/D,OAAO,CACN;GAAE,WAAW;GAAK,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAK,MAAM;GAAQ,iBAAiB;EAAA,GAC7F;GAAE,WAAW;GAAK,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAGjG,QAAQ;EACP,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAK,WAAW;GAAK,QAAQ;EAAA,CAAA;EAC/D,OAAO,CAAC;GAAE,WAAW;GAAM,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAExG,cAAc;EACb,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAK,QAAQ;EAAA,CAAA;EAChE,OAAO,CAAC;GAAE,WAAW;GAAM,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,cAAc;EAAA,CAAA;CAAA;CAErG,aAAa;EACZ,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAK,WAAW;GAAK,QAAQ;EAAA,CAAA;EAC/D,OAAO,CACN;GAAE,WAAW;GAAK,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAK,MAAM;GAAQ,iBAAiB;EAAA,GAC7F;GAAE,WAAW;GAAK,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAGjG,UAAU;EACT,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAK,WAAW;GAAK,QAAQ;EAAA,CAAA;EAC/D,OAAO,CACN;GAAE,WAAW;GAAK,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAK,MAAM;GAAQ,iBAAiB;EAAA,GAC7F;GAAE,WAAW;GAAK,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAGjG,UAAU;EACT,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAK,WAAW;GAAK,QAAQ;EAAA,CAAA;EAC/D,OAAO,CAAC;GAAE,WAAW;GAAM,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAExG,OAAO;EACN,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAK,WAAW;GAAK,QAAQ;EAAA,CAAA;EAC/D,OAAO,CAAC;GAAE,WAAW;GAAM,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAExG,aAAa;EACZ,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAK,QAAQ;EAAA,CAAA;EAChE,OAAO,CAAC;GAAE,WAAW;GAAM,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,cAAc;EAAA,CAAA;CAAA;CAErG,aAAa;EACZ,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAK,WAAW;GAAK,QAAQ;EAAA,CAAA;EAC/D,OAAO,CACN;GAAE,WAAW;GAAK,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,GAC/F;GAAE,WAAW;GAAK,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAGhG,UAAU;EACT,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAK,QAAQ;EAAA,CAAA;EAChE,OAAO,CACN;GAAE,WAAW;GAAK,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,GAC9F;GAAE,WAAW;GAAK,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAK,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAGhG,MAAM;EACL,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAK,WAAW;GAAK,QAAQ;EAAA,CAAA;EAC/D,OAAO,CACN;GAAE,WAAW;GAAK,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAK,MAAM;GAAQ,iBAAiB;EAAA,GAC7F;GAAE,WAAW;GAAK,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAGjG,WAAW;EACV,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAK,WAAW;GAAK,QAAQ;EAAA,CAAA;EAC/D,OAAO,CACN;GAAE,WAAW;GAAK,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAK,MAAM;GAAQ,iBAAiB;EAAA,GAC7F;GAAE,WAAW;GAAK,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAGjG,WAAW;EACV,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAK,WAAW;GAAK,QAAQ;EAAA,CAAA;EAC/D,OAAO,CACN;GAAE,WAAW;GAAK,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,GAC/F;GAAE,WAAW;GAAK,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAGhG,SAAS;EACR,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAK,QAAQ;EAAA,CAAA;EAChE,OAAO,CAAC;GAAE,WAAW;GAAM,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,cAAc;EAAA,CAAA;CAAA;CAErG,UAAU;EACT,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAK,QAAQ;EAAA,CAAA;EAChE,OAAO,CAAC;GAAE,WAAW;GAAM,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,cAAc;EAAA,CAAA;CAAA;CAIrG,SAAS;EACR,OAAO,CACN;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAM,QAAQ;EAAA,GACzD;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAM,QAAQ;EAAA,CAAA;EAE7D,OAAO,CAAC;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAM,MAAM;EAAA,CAAA;EAC/E,aAAa;CAAA;CAEd,SAAS;EACR,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAM,QAAQ;EAAA,CAAA;EACjE,OAAO,CAAC;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,cAAc;EAAA,CAAA;CAAA;CAEtG,QAAQ;EACP,OAAO,CACN;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAM,QAAQ;EAAA,GACzD;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAM,QAAQ;EAAA,CAAA;EAE7D,OAAO,CAAC;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAM,MAAM;EAAA,CAAA;CAAA;CAEhF,WAAW;EACV,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAM,QAAQ;EAAA,CAAA;EACjE,OAAO,CACN;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAM,QAAQ;GAAM,MAAM;EAAA,GACrE;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAM,MAAM;EAAA,CAAA;CAAA;CAGzE,UAAU;EACT,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAM,QAAQ;EAAA,CAAA;EACjE,OAAO,CACN;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAM,QAAQ;GAAM,MAAM;EAAA,GACrE;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAM,MAAM;EAAA,CAAA;CAAA;CAGzE,SAAS;EACR,OAAO;GACN;IAAE,WAAW;IAAG,UAAU;IAAM,WAAW;IAAM,QAAQ;GAAA;GACzD;IAAE,WAAW;IAAM,UAAU;IAAM,WAAW;IAAM,QAAQ;GAAA;GAC5D;IAAE,WAAW;IAAM,UAAU;IAAM,WAAW;IAAM,QAAQ;GAAA;EAAA;EAE7D,OAAO,CAAC;GAAE,WAAW;GAAM,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAM,MAAM;EAAA,CAAA;CAAA;CAE/E,QAAQ;EACP,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAM,QAAQ;EAAA,CAAA;EACjE,OAAO,CAAC;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,cAAc;EAAA,CAAA;CAAA;CAEtG,UAAU;EACT,OAAO;GACN;IAAE,WAAW;IAAG,UAAU;IAAM,WAAW;IAAM,QAAQ;GAAA;GACzD;IAAE,WAAW;IAAM,UAAU;IAAM,WAAW;IAAM,QAAQ;GAAA;GAC5D;IAAE,WAAW;IAAM,UAAU;IAAM,WAAW;IAAM,QAAQ;GAAA;EAAA;EAE7D,OAAO,CAAC;GAAE,WAAW;GAAM,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAM,MAAM;EAAA,CAAA;CAAA;CAE/E,aAAa;EACZ,OAAO,CACN;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAM,QAAQ;EAAA,GACzD;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAM,QAAQ;EAAA,CAAA;EAE7D,OAAO,CAAC;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAM,MAAM;EAAA,CAAA;CAAA;CAEhF,UAAU;EACT,OAAO,CACN;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAM,QAAQ;EAAA,GACzD;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAM,QAAQ;EAAA,CAAA;EAE7D,OAAO,CAAC;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAM,MAAM;EAAA,CAAA;CAAA;CAEhF,OAAO;EACN,OAAO,CACN;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAM,QAAQ;EAAA,GACzD;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAM,QAAQ;EAAA,CAAA;EAE7D,OAAO,CAAC;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAM,MAAM;EAAA,CAAA;CAAA;CAEhF,cAAc;EACb,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAM,QAAQ;EAAA,CAAA;EACjE,OAAO,CAAC;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,cAAc;EAAA,CAAA;CAAA;CAEtG,UAAU;EACT,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAM,QAAQ;EAAA,CAAA;EACjE,OAAO,CACN;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAM,QAAQ;GAAM,MAAM;EAAA,GACrE;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAM,MAAM;EAAA,CAAA;CAAA;CAGzE,YAAY;EACX,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAM,QAAQ;EAAA,CAAA;EACjE,OAAO,CAAC;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,cAAc;EAAA,CAAA;CAAA;CAEtG,YAAY;EACX,OAAO;GACN;IAAE,WAAW;IAAG,UAAU;IAAM,WAAW;IAAM,QAAQ;GAAA;GACzD;IAAE,WAAW;IAAM,UAAU;IAAM,WAAW;IAAM,QAAQ;GAAA;GAC5D;IAAE,WAAW;IAAM,UAAU;IAAM,WAAW;IAAM,QAAQ;GAAA;EAAA;EAE7D,OAAO,CAAC;GAAE,WAAW;GAAM,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAM,MAAM;EAAA,CAAA;CAAA;CAI/E,SAAS;EACR,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAK,WAAW;GAAM,QAAQ;EAAA,CAAA;EAChE,OAAO,CAAC;GAAE,WAAW;GAAM,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAExG,WAAW;EACV,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAK,WAAW;GAAM,QAAQ;EAAA,CAAA;EAChE,OAAO,CAAC;GAAE,WAAW;GAAM,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAExG,YAAY;EACX,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAK,QAAQ;EAAA,CAAA;EAChE,OAAO,CACN;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAK,MAAM;EAAA,GACtE;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAM,MAAM;EAAA,CAAA;CAAA;CAGzE,OAAO;EACN,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAK,QAAQ;EAAA,CAAA;EAChE,OAAO,CACN;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAK,MAAM;EAAA,GACtE;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAM,MAAM;EAAA,CAAA;CAAA;CAGzE,SAAS;EACR,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAK,QAAQ;EAAA,CAAA;EAChE,OAAO,CACN;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAK,MAAM;EAAA,GACtE;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAM,MAAM;EAAA,CAAA;CAAA;CAGzE,QAAQ;EACP,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAK,QAAQ;EAAA,CAAA;EAChE,OAAO,CACN;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAK,MAAM;EAAA,GACtE;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAM,MAAM;EAAA,CAAA;CAAA;CAGzE,WAAW;EACV,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAK,WAAW;GAAM,QAAQ;EAAA,CAAA;EAChE,OAAO,CAAC;GAAE,WAAW;GAAM,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAExG,SAAS;EACR,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAK,WAAW;GAAM,QAAQ;EAAA,CAAA;EAChE,OAAO,CAAC;GAAE,WAAW;GAAM,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAExG,SAAS;EACR,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAK,WAAW;GAAM,QAAQ;EAAA,CAAA;EAChE,OAAO,CAAC;GAAE,WAAW;GAAM,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAExG,WAAW;EACV,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAK,QAAQ;EAAA,CAAA;EAChE,OAAO,CACN;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAK,MAAM;EAAA,GACtE;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAM,MAAM;EAAA,CAAA;CAAA;CAGzE,WAAW;EACV,OAAO;GACN;IAAE,WAAW;IAAG,UAAU;IAAM,WAAW;IAAM,QAAQ;GAAA;GACzD;IAAE,WAAW;IAAM,UAAU;IAAM,WAAW;IAAM,QAAQ;GAAA;GAC5D;IAAE,WAAW;IAAM,UAAU;IAAM,WAAW;IAAM,QAAQ;GAAA;EAAA;EAE7D,OAAO,CAAC;GAAE,WAAW;GAAM,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAM,MAAM;EAAA,CAAA;CAAA;CAE/E,SAAS;EACR,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAK,QAAQ;EAAA,CAAA;EAChE,OAAO,CACN;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAK,MAAM;EAAA,GACtE;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAM,MAAM;EAAA,CAAA;CAAA;CAGzE,cAAc;EACb,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAK,WAAW;GAAM,QAAQ;EAAA,CAAA;EAChE,OAAO,CAAC;GAAE,WAAW;GAAM,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAIxG,OAAO;EACN,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAK,QAAQ;EAAA,CAAA;EAChE,OAAO,CAAC;GAAE,WAAW;GAAK,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAEvG,WAAW;EACV,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAK,QAAQ;EAAA,CAAA;EAChE,OAAO,CAAC;GAAE,WAAW;GAAM,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAK,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAEvG,SAAS;EACR,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAK,QAAQ;EAAA,CAAA;EAChE,OAAO,CAAC;GAAE,WAAW;GAAM,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAK,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAEvG,WAAW;EACV,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAK,QAAQ;EAAA,CAAA;EAChE,OAAO,CAAC;GAAE,WAAW;GAAM,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAK,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAEvG,MAAM;EACL,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAK,QAAQ;EAAA,CAAA;EAChE,OAAO,CAAC;GAAE,WAAW;GAAM,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAK,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAEvG,OAAO;EACN,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAK,QAAQ;EAAA,CAAA;EAChE,OAAO,CAAC;GAAE,WAAW;GAAK,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAK,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAEtG,aAAa;EACZ,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAK,QAAQ;EAAA,CAAA;EAChE,OAAO,CAAC;GAAE,WAAW;GAAK,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAK,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAEtG,WAAW;EACV,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAK,QAAQ;EAAA,CAAA;EAChE,OAAO,CAAC;GAAE,WAAW;GAAK,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAK,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAEtG,UAAU;EACT,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAK,QAAQ;EAAA,CAAA;EAChE,OAAO,CAAC;GAAE,WAAW;GAAK,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAIvG,MAAM;EACL,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAK,WAAW;GAAK,QAAQ;EAAA,CAAA;EAC/D,OAAO,CAAC;GAAE,WAAW;GAAK,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAK,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAEtG,SAAS;EACR,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAK,QAAQ;EAAA,CAAA;EAChE,OAAO,CACN;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAK,MAAM;GAAQ,iBAAiB;EAAA,GAC/F;GAAE,WAAW;GAAM,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAGjG,QAAQ;EACP,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAK,QAAQ;EAAA,CAAA;EAChE,OAAO,CACN;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAK,MAAM;GAAQ,iBAAiB;EAAA,GAC/F;GAAE,WAAW;GAAM,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAGjG,UAAU;EACT,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAK,WAAW;GAAK,QAAQ;EAAA,CAAA;EAC/D,OAAO,CAAC;GAAE,WAAW;GAAK,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAK,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAEtG,QAAQ;EACP,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAK,QAAQ;EAAA,CAAA;EAChE,OAAO,CAAC;GAAE,WAAW;GAAK,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAEvG,QAAQ;EACP,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAK,WAAW;GAAK,QAAQ;EAAA,CAAA;EAC/D,OAAO,CACN;GAAE,WAAW;GAAK,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,GAC9F;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAK,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAGjG,MAAM;EACL,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAK,WAAW;GAAK,QAAQ;EAAA,CAAA;EAC/D,OAAO,CACN;GAAE,WAAW;GAAK,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,GAC9F;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAK,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAGjG,UAAU;EACT,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAK,QAAQ;EAAA,CAAA;EAChE,OAAO,CAAC;GAAE,WAAW;GAAK,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAEvG,UAAU;EACT,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAK,QAAQ;EAAA,CAAA;EAChE,OAAO,CAAC;GAAE,WAAW;GAAK,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAEvG,WAAW;EACV,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAK,WAAW;GAAK,QAAQ;EAAA,CAAA;EAC/D,OAAO,CAAC;GAAE,WAAW;GAAK,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAK,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAItG,WAAW;EACV,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAK,WAAW;GAAM,QAAQ;EAAA,CAAA;EAChE,OAAO,CACN;GAAE,WAAW;GAAM,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,GAC/F;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAGlG,UAAU;EACT,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAM,QAAQ;EAAA,CAAA;EACjE,OAAO,CACN;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,GAChG;GAAE,WAAW;GAAM,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAGjG,UAAU;EACT,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAK,WAAW;GAAM,QAAQ;EAAA,CAAA;EAChE,OAAO,CACN;GAAE,WAAW;GAAM,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,GAC/F;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAGlG,WAAW;EACV,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAK,WAAW;GAAM,QAAQ;EAAA,CAAA;EAChE,OAAO,CACN;GAAE,WAAW;GAAM,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,GAC/F;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAGlG,aAAa;EACZ,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAM,QAAQ;EAAA,CAAA;EACjE,OAAO,CACN;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,GAChG;GAAE,WAAW;GAAM,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAGjG,QAAQ;EACP,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAM,QAAQ;EAAA,CAAA;EACjE,OAAO,CACN;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,GAChG;GAAE,WAAW;GAAM,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAGjG,WAAW;EACV,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAM,QAAQ;EAAA,CAAA;EACjE,OAAO,CACN;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,GAChG;GAAE,WAAW;GAAM,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAGjG,WAAW;EACV,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAK,QAAQ;EAAA,CAAA;EAChE,OAAO,CACN;GAAE,WAAW;GAAK,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,GAC/F;GAAE,WAAW;GAAM,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAK,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAGhG,YAAY;EACX,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAK,QAAQ;EAAA,CAAA;EAChE,OAAO,CACN;GAAE,WAAW;GAAK,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,GAC/F;GAAE,WAAW;GAAM,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAK,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAGhG,eAAe;EACd,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAK,WAAW;GAAM,QAAQ;EAAA,CAAA;EAChE,OAAO,CACN;GAAE,WAAW;GAAM,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,GAC/F;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAGlG,YAAY;EACX,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAK,WAAW;GAAM,QAAQ;EAAA,CAAA;EAChE,OAAO,CACN;GAAE,WAAW;GAAM,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,GAC/F;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAKlG,YAAY;EACX,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAM,QAAQ;EAAA,CAAA;EACjE,OAAO,CACN;GAAE,WAAW;GAAM,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,cAAc;EAAA,GAC5F;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAK,MAAM;EAAA,CAAA;CAAA;CAGxE,UAAU;EACT,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAM,QAAQ;EAAA,CAAA;EACjE,OAAO,CACN;GAAE,WAAW;GAAM,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,cAAc;EAAA,GAC5F;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAK,MAAM;EAAA,CAAA;CAAA;CAGxE,YAAY;EACX,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAM,QAAQ;EAAA,CAAA;EACjE,OAAO,CACN;GAAE,WAAW;GAAM,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,cAAc;EAAA,GAC5F;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAK,MAAM;EAAA,CAAA;CAAA;CAGxE,WAAW;EACV,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAK,QAAQ;EAAA,CAAA;EAChE,OAAO,CACN;GAAE,WAAW;GAAK,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,iBAAiB;EAAA,GAC9F;GAAE,WAAW;GAAK,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAK,MAAM;GAAQ,iBAAiB;EAAA,CAAA;CAAA;CAGhG,QAAQ;EACP,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAK,QAAQ;EAAA,CAAA;EAChE,OAAO,CAAC;GAAE,WAAW;GAAM,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,cAAc;EAAA,CAAA;CAAA;CAErG,aAAa;EACZ,OAAO;GACN;IAAE,WAAW;IAAG,UAAU;IAAM,WAAW;IAAM,QAAQ;GAAA;GACzD;IAAE,WAAW;IAAM,UAAU;IAAM,WAAW;IAAM,QAAQ;GAAA;GAC5D;IAAE,WAAW;IAAM,UAAU;IAAM,WAAW;IAAM,QAAQ;GAAA;EAAA;EAE7D,OAAO,CAAC;GAAE,WAAW;GAAM,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAM,MAAM;EAAA,CAAA;CAAA;CAE/E,WAAW;EACV,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAM,QAAQ;EAAA,CAAA;EACjE,OAAO,CAAC;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAK,MAAM;GAAQ,cAAc;EAAA,CAAA;CAAA;CAErG,SAAS;EACR,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAM,QAAQ;EAAA,CAAA;EACjE,OAAO,CACN;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAM,QAAQ;GAAM,MAAM;EAAA,GACrE;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAM,MAAM;EAAA,CAAA;CAAA;CAGzE,WAAW;EACV,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAK,WAAW;GAAM,QAAQ;EAAA,CAAA;EAChE,OAAO;GACN;IAAE,WAAW;IAAM,UAAU;IAAK,WAAW;IAAK,QAAQ;IAAM,MAAM;GAAA;GACtE;IAAE,WAAW;IAAK,UAAU;IAAM,WAAW;IAAK,QAAQ;IAAM,MAAM;GAAA;GACtE;IAAE,WAAW;IAAM,UAAU;IAAM,WAAW;IAAK,QAAQ;IAAM,MAAM;GAAA;EAAA;CAAA;CAGzE,WAAW;EACV,OAAO,CAAC;GAAE,WAAW;GAAG,UAAU;GAAM,WAAW;GAAM,QAAQ;EAAA,CAAA;EACjE,OAAO,CACN;GAAE,WAAW;GAAM,UAAU;GAAK,WAAW;GAAK,QAAQ;GAAM,MAAM;GAAQ,cAAc;EAAA,GAC5F;GAAE,WAAW;GAAM,UAAU;GAAM,WAAW;GAAK,QAAQ;GAAK,MAAM;EAAA,CAAA;CAAA;AAAA,GA0X5D,IAxWb,MAAM,EAAA;CA8BL,IAAA,QAAI;EACH,OAAO,EAAa,MAAM;CAC3B;CAEA,IAAA,SAAI;EACH,OAAO,EAAa,MAAM;CAC3B;CAEA,IAAA,QAAI;EACH,OAAO,EAAa,MAAM;CAC3B;CAEA,IAAA,YAAI;EACH,OAAO,KAAK,OAAO,QAAQ;CAC5B;CAEA,cAAA;EAAA,KAAA,eA1C4C,MAAA,KAAA,SAInB,EAAa,EAAE,KACvC,GAAI,MAAY,EAAS,KAAA,GACzB,EAAY,CAAA,CAAA,GAAA,KAAA,UAGa,EAAa,EAAE,KACxC,GAAI,MAAY,EAAS,MAAA,GACzB,EAAA,GACA,EAAY,CAAA,CAAA,GAAA,KAAA,SAGY,EAAa,EAAE,KACvC,GAAI,MAAY,EAAS,KAAA,GACzB,EAAA,GACA,EAAY,CAAA,CAAA,GAAA,KAAA,cAIkB,IAAI,EAAwB,SAAA,GAAA,KAAA,aAC9B,KAAK,YAAY,aAAA,GAqB7C,KAAK,OAAO,WAAU,MAAA;GACrB,KAAK,YAAY,KAAK,GAAO,QAAQ,SAAA;EAAA,CAAA;CAEvC;CAMA,aAAA;EACC,IAAA,CAAK,KAAK,cAAc;GACvB,IAAM,IACL,OAAO,gBAAiB,OAAkE;GAC3F,KAAK,eAAe,IAAI;EACzB;EAIA,OAHI,KAAK,aAAa,UAAU,eAC/B,KAAK,aAAa,OAAA,GAEZ,KAAK;CACb;CAOA,SAAiB,GAAmB,GAAoB,GAAA;EACvD,IAAM,IAAM,KAAK,WAAA,GACX,IAAa,KAAK,MAAM,EAAI,aAAa,EAAO,QAAA,GAChD,IAAS,EAAI,aAAa,GAAG,GAAY,EAAI,UAAA,GAC7C,IAAO,EAAO,eAAe,CAAA;EAEnC,KAAK,IAAI,IAAI,GAAG,IAAI,GAAY,KAC/B,EAAK,KAAqB,IAAhB,KAAK,OAAA,IAAe;EAG/B,IAAM,IAAQ,EAAI,mBAAA;EAClB,EAAM,SAAS;EAEf,IAAM,IAAS,EAAI,mBAAA;EACnB,EAAO,OAAO,YACd,EAAO,UAAU,QAAQ,EAAO,WAChC,EAAO,EAAE,QAAQ;EAEjB,IAAM,IAAO,EAAI,WAAA;EACjB,EAAK,KAAK,eAAe,GAAG,CAAA,GAC5B,EAAK,KAAK,wBAAwB,EAAO,SAAS,GAAc,IAAY,IAAA,GAC5E,EAAK,KAAK,6BAA6B,MAAO,IAAY,EAAO,QAAA,GAEjE,EAAM,QAAQ,CAAA,EAAQ,QAAQ,CAAA,EAAM,QAAQ,EAAI,WAAA,GAChD,EAAM,MAAM,CAAA,GACZ,EAAM,KAAK,IAAY,EAAO,QAAA;CAC/B;CAGA,SAAiB,GAAmB,GAAoB,GAAA;EACvD,IAAM,IAAM,KAAK,WAAA,GACX,IAAM,EAAI,iBAAA,GACV,IAAO,EAAI,WAAA;EAEjB,EAAI,OAAO,EAAO,MAClB,EAAI,UAAU,eAAe,EAAO,WAAW,CAAA,GAE3C,EAAO,gBACV,EAAI,UAAU,6BAA6B,EAAO,cAAc,IAA8B,KAAlB,EAAO,QAAA;EAIpF,IAAI,IAAsB;EAC1B,IAAI,EAAO,iBAAiB;GAC3B,IAAM,IAAS,EAAI,mBAAA;GACnB,EAAO,OAAO,WACd,EAAO,UAAU,QAAQ,EAAO,iBAChC,EAAI,QAAQ,CAAA,GACZ,IAAW;EACZ;EAEA,EAAK,KAAK,eAAe,GAAG,CAAA,GAC5B,EAAK,KAAK,wBAAwB,EAAO,SAAS,GAAc,IAAY,GAAA,GAC5E,EAAK,KAAK,6BAA6B,MAAO,IAAY,EAAO,QAAA,GAEjE,EAAS,QAAQ,CAAA,EAAM,QAAQ,EAAI,WAAA,GACnC,EAAI,MAAM,CAAA,GACV,EAAI,KAAK,IAAY,EAAO,QAAA;CAC7B;CAUA,SAAgB,GAAA;EACf,EAAa,IAAI,EAAE,OAAA,EAAA,CAAA;CACpB;CAKA,aAAA;EACC,EAAa,IAAI,EAAE,OAAO,KAAA,CAAA;CAC3B;CAMA,UAAiB,GAAA;EAChB,EAAa,IAAI,EAAE,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,CAAA,CAAA,EAAA,CAAA;CACpD;CAKA,OAAA;EACC,EAAa,IAAI,EAAE,OAAA,CAAO,EAAA,CAAA;CAC3B;CAKA,SAAA;EACC,EAAa,IAAI,EAAE,OAAA,CAAO,EAAA,CAAA;CAC3B;CAKA,aAAA;EACC,EAAa,IAAI,EAAE,OAAA,CAAQ,KAAK,MAAA,CAAA;CACjC;CAUA,mBAA0B,GAAA;EACzB,IAAM,IAAc,KAAK;EAGzB,IAAI,GAAa,WAAW,IAC3B,OAAO,EAAY,SAAS;EAI7B,IAAI,GAAa,kBAAkB;GAClC,IAAM,IAAW,KAAK,sBAAsB,CAAA;GAC5C,IAAI,EAAY,iBAAiB,IAChC,OAAO,EAAY,iBAAiB;EAEtC;EAGA,OAAO,EAAe;CACvB;CAKA,sBAA8B,GAAA;EAqF7B,OApFiC;GAChC;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EAAA,EAmEiB,SAAS,CAAA,IAAiB,UAjEb;GAC9B;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EAAA,EAmDe,SAAS,CAAA,IAAiB,QAjDP;GAClC;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EAAA,EAmCmB,SAAS,CAAA,IAAiB,YAjCb;GAChC;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EAAA,EAqBiB,SAAS,CAAA,IAAiB,UAnBX;GAAC;GAAS;GAAa;GAAW;GAAa;GAAQ;GAAS;GAAe;GAAa;EAAA,EAoB3G,SAAS,CAAA,IAAiB,UAnBZ;GAAC;GAAQ;GAAW;GAAU;GAAY;GAAU;GAAU;GAAQ;GAAY;GAAY;EAAA,EAoB7G,SAAS,CAAA,IAAiB,SAnBN;GACpC;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EAAA,EASqB,SAAS,CAAA,IAAiB,cACzC;CACR;CAMA,KAAY,GAAA;EACX,IAAI,KAAK,OAAO;EAEhB,IAAM,IAAQ,KAAK,mBAAmB,CAAA,GAEhC,IADM,KAAK,WAAA,EACD,aAGV,IAAoB,KAAK,OAAO,gBAAgB,GAChD,IAAe,KAAK,SAAS;EAGnC,EAAM,MAAM,SAAQ,MAAA;GACnB,KAAK,SAAS,IAAM,EAAK,WAAW,GAAM,CAAA;EAAA,CAAA,GAI3C,EAAM,MAAM,SAAQ,MAAA;GACnB,KAAK,SAAS,IAAM,EAAK,WAAW,GAAM,CAAA;EAAA,CAAA;CAE5C;CAKA,UAAA;EACK,AAEH,KAAK,kBADL,KAAK,aAAa,MAAA,GACE;CAEtB;CAKA,OAAA,cAAO;EAIN,OAHK,AACJ,EAAa,aAAW,IAAI,KAEtB,EAAa;CACrB;AAAA,EAQiC,YAAA,GACrB,IAAgB;AAAA,SAAA,KAAA,GAAA,KAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sound.service-G_8GV_6L.cjs","names":[],"sources":["../src/audio/sound.service.ts"],"sourcesContent":["/**\n * Schmancy Sound Service\n *\n * Centralized sound management following the theme service pattern.\n * Provides reactive observables for sound state and methods to control sounds.\n *\n * @example\n * ```typescript\n * import { sound } from '@schmancy/audio'\n *\n * // Play a feeling sound\n * sound.play('joyful')\n *\n * // Set volume\n * sound.setVolume(0.2)\n *\n * // Apply AI-generated sound theme\n * sound.setTheme(aiGeneratedTheme)\n *\n * // Reset to defaults\n * sound.resetTheme()\n *\n * // Subscribe to theme changes\n * sound.theme$.subscribe(theme => {\n * console.log('Current theme:', theme?.name ?? 'default')\n * })\n * ```\n */\n\nimport { BehaviorSubject, distinctUntilChanged, map, shareReplay } from 'rxjs'\nimport { state } from '../state'\nimport type {\n\tFeeling,\n\tFeelingCategory,\n\tFeelingSound,\n\tPuffParams,\n\tSoundTheme,\n\tSoundThemeSettings,\n\tToneParams,\n} from '../types/mood-audio.types'\n\n// ============================================================================\n// CONTEXT\n// ============================================================================\n\n/** Sound settings — persists to localStorage under namespace `schmancy/sound`. */\nconst SoundContext = state<SoundThemeSettings>('schmancy/sound').local({\n\ttheme: null,\n\tvolume: 0.15,\n\tmuted: false,\n})\n\n// ============================================================================\n// DEFAULT SOUND THEME\n// ============================================================================\n\n/**\n * Default sound definitions for all feelings\n * These are used when no custom theme is applied\n */\nconst DEFAULT_SOUNDS: Record<Feeling, FeelingSound> = {\n\t// ========== HAPPY / PLEASANT ==========\n\tjoyful: {\n\t\tpuffs: [\n\t\t\t{ startTime: 0, duration: 0.08, frequency: 3000, volume: 0.3 },\n\t\t\t{ startTime: 0.06, duration: 0.1, frequency: 3500, volume: 0.35 },\n\t\t],\n\t\ttones: [\n\t\t\t{ startTime: 0.02, duration: 0.15, frequency: 784, volume: 0.25, type: 'sine' },\n\t\t\t{ startTime: 0.1, duration: 0.2, frequency: 988, volume: 0.3, type: 'sine' },\n\t\t\t{ startTime: 0.18, duration: 0.25, frequency: 1175, volume: 0.25, type: 'sine' },\n\t\t],\n\t},\n\tcontent: {\n\t\tpuffs: [{ startTime: 0, duration: 0.2, frequency: 1500, volume: 0.25 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.05, duration: 0.3, frequency: 523, volume: 0.2, type: 'sine', filterFrequency: 800 },\n\t\t\t{ startTime: 0.15, duration: 0.35, frequency: 659, volume: 0.15, type: 'sine', filterFrequency: 800 },\n\t\t],\n\t},\n\texcited: {\n\t\tpuffs: [\n\t\t\t{ startTime: 0, duration: 0.06, frequency: 2500, volume: 0.25 },\n\t\t\t{ startTime: 0.05, duration: 0.06, frequency: 3000, volume: 0.3 },\n\t\t\t{ startTime: 0.1, duration: 0.08, frequency: 3500, volume: 0.35 },\n\t\t],\n\t\ttones: [\n\t\t\t{ startTime: 0.02, duration: 0.12, frequency: 880, volume: 0.2, type: 'sine' },\n\t\t\t{ startTime: 0.08, duration: 0.12, frequency: 1047, volume: 0.25, type: 'sine' },\n\t\t\t{ startTime: 0.14, duration: 0.15, frequency: 1319, volume: 0.3, type: 'sine' },\n\t\t],\n\t},\n\tproud: {\n\t\tpuffs: [{ startTime: 0, duration: 0.15, frequency: 1800, volume: 0.3 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.05, duration: 0.25, frequency: 523, volume: 0.25, type: 'sine' },\n\t\t\t{ startTime: 0.08, duration: 0.25, frequency: 659, volume: 0.2, type: 'sine' },\n\t\t\t{ startTime: 0.11, duration: 0.3, frequency: 784, volume: 0.25, type: 'sine' },\n\t\t],\n\t},\n\thopeful: {\n\t\tpuffs: [{ startTime: 0, duration: 0.12, frequency: 2200, volume: 0.2 }],\n\t\ttones: [{ startTime: 0.03, duration: 0.3, frequency: 659, volume: 0.2, type: 'sine', frequencyEnd: 880 }],\n\t},\n\trelieved: {\n\t\tpuffs: [{ startTime: 0, duration: 0.25, frequency: 1200, volume: 0.35 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.1, duration: 0.35, frequency: 659, volume: 0.2, type: 'sine', filterFrequency: 800 },\n\t\t\t{ startTime: 0.25, duration: 0.4, frequency: 523, volume: 0.15, type: 'sine', filterFrequency: 800 },\n\t\t],\n\t},\n\tgrateful: {\n\t\tpuffs: [{ startTime: 0, duration: 0.15, frequency: 1500, volume: 0.25 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.05, duration: 0.3, frequency: 440, volume: 0.2, type: 'sine', filterFrequency: 800 },\n\t\t\t{ startTime: 0.15, duration: 0.35, frequency: 523, volume: 0.2, type: 'sine', filterFrequency: 800 },\n\t\t\t{ startTime: 0.25, duration: 0.4, frequency: 659, volume: 0.15, type: 'sine', filterFrequency: 800 },\n\t\t],\n\t},\n\tpeaceful: {\n\t\tpuffs: [{ startTime: 0, duration: 0.3, frequency: 800, volume: 0.15 }],\n\t\ttones: [{ startTime: 0.1, duration: 0.5, frequency: 392, volume: 0.12, type: 'sine', filterFrequency: 500 }],\n\t},\n\tplayful: {\n\t\tpuffs: [\n\t\t\t{ startTime: 0, duration: 0.05, frequency: 2800, volume: 0.2 },\n\t\t\t{ startTime: 0.08, duration: 0.05, frequency: 3200, volume: 0.25 },\n\t\t\t{ startTime: 0.14, duration: 0.06, frequency: 2800, volume: 0.2 },\n\t\t],\n\t\ttones: [\n\t\t\t{ startTime: 0.03, duration: 0.1, frequency: 784, volume: 0.2, type: 'sine' },\n\t\t\t{ startTime: 0.1, duration: 0.08, frequency: 988, volume: 0.25, type: 'sine' },\n\t\t\t{ startTime: 0.16, duration: 0.12, frequency: 784, volume: 0.2, type: 'sine' },\n\t\t],\n\t},\n\tamused: {\n\t\tpuffs: [\n\t\t\t{ startTime: 0, duration: 0.04, frequency: 2500, volume: 0.2 },\n\t\t\t{ startTime: 0.06, duration: 0.04, frequency: 2800, volume: 0.22 },\n\t\t\t{ startTime: 0.11, duration: 0.05, frequency: 2600, volume: 0.18 },\n\t\t],\n\t\ttones: [{ startTime: 0.05, duration: 0.15, frequency: 880, volume: 0.15, type: 'sine' }],\n\t},\n\tcurious: {\n\t\tpuffs: [{ startTime: 0, duration: 0.1, frequency: 2000, volume: 0.2 }],\n\t\ttones: [{ startTime: 0.03, duration: 0.2, frequency: 659, volume: 0.2, type: 'sine', frequencyEnd: 880 }],\n\t},\n\tinspired: {\n\t\tpuffs: [{ startTime: 0, duration: 0.1, frequency: 2500, volume: 0.25 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.05, duration: 0.3, frequency: 523, volume: 0.2, type: 'sine' },\n\t\t\t{ startTime: 0.07, duration: 0.28, frequency: 784.5, volume: 0.16, type: 'sine' },\n\t\t\t{ startTime: 0.09, duration: 0.26, frequency: 1046, volume: 0.12, type: 'sine' },\n\t\t],\n\t},\n\tconfident: {\n\t\tpuffs: [{ startTime: 0, duration: 0.12, frequency: 1500, volume: 0.3 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.04, duration: 0.2, frequency: 523, volume: 0.25, type: 'sine' },\n\t\t\t{ startTime: 0.06, duration: 0.22, frequency: 659, volume: 0.2, type: 'sine' },\n\t\t],\n\t},\n\tloved: {\n\t\tpuffs: [{ startTime: 0, duration: 0.2, frequency: 1000, volume: 0.2 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.08, duration: 0.4, frequency: 392, volume: 0.18, type: 'sine', filterFrequency: 600 },\n\t\t\t{ startTime: 0.2, duration: 0.45, frequency: 494, volume: 0.15, type: 'sine', filterFrequency: 600 },\n\t\t],\n\t},\n\tcomforted: {\n\t\tpuffs: [{ startTime: 0, duration: 0.25, frequency: 900, volume: 0.18 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.1, duration: 0.35, frequency: 523, volume: 0.15, type: 'sine', filterFrequency: 800 },\n\t\t\t{ startTime: 0.25, duration: 0.4, frequency: 440, volume: 0.12, type: 'sine', filterFrequency: 800 },\n\t\t],\n\t},\n\tenergized: {\n\t\tpuffs: [\n\t\t\t{ startTime: 0, duration: 0.05, frequency: 3000, volume: 0.25 },\n\t\t\t{ startTime: 0.04, duration: 0.05, frequency: 3500, volume: 0.28 },\n\t\t],\n\t\ttones: [\n\t\t\t{ startTime: 0.02, duration: 0.1, frequency: 784, volume: 0.2, type: 'sine' },\n\t\t\t{ startTime: 0.08, duration: 0.12, frequency: 988, volume: 0.25, type: 'sine' },\n\t\t\t{ startTime: 0.14, duration: 0.15, frequency: 1175, volume: 0.22, type: 'sine' },\n\t\t],\n\t},\n\tcelebrated: {\n\t\tpuffs: [{ startTime: 0, duration: 0.08, frequency: 2500, volume: 0.2 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.02, duration: 0.18, frequency: 523, volume: 0.22, type: 'sine' },\n\t\t\t{ startTime: 0.08, duration: 0.18, frequency: 659, volume: 0.24, type: 'sine' },\n\t\t\t{ startTime: 0.14, duration: 0.2, frequency: 784, volume: 0.26, type: 'sine' },\n\t\t\t{ startTime: 0.22, duration: 0.3, frequency: 1047, volume: 0.22, type: 'sine' },\n\t\t],\n\t},\n\n\t// ========== SAD / LOW ==========\n\tsad: {\n\t\tpuffs: [{ startTime: 0, duration: 0.3, frequency: 600, volume: 0.25 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.1, duration: 0.4, frequency: 392, volume: 0.2, type: 'sine', filterFrequency: 400 },\n\t\t\t{ startTime: 0.3, duration: 0.45, frequency: 294, volume: 0.15, type: 'sine', filterFrequency: 350 },\n\t\t],\n\t},\n\tlonely: {\n\t\tpuffs: [{ startTime: 0, duration: 0.2, frequency: 700, volume: 0.2 }],\n\t\ttones: [{ startTime: 0.15, duration: 0.5, frequency: 330, volume: 0.12, type: 'sine', filterFrequency: 450 }],\n\t},\n\tdisappointed: {\n\t\tpuffs: [{ startTime: 0, duration: 0.25, frequency: 800, volume: 0.25 }],\n\t\ttones: [{ startTime: 0.08, duration: 0.3, frequency: 523, volume: 0.18, type: 'sine', frequencyEnd: 349 }],\n\t},\n\theartbroken: {\n\t\tpuffs: [{ startTime: 0, duration: 0.3, frequency: 600, volume: 0.25 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.1, duration: 0.4, frequency: 392, volume: 0.2, type: 'sine', filterFrequency: 400 },\n\t\t\t{ startTime: 0.3, duration: 0.45, frequency: 294, volume: 0.15, type: 'sine', filterFrequency: 350 },\n\t\t],\n\t},\n\tgrieving: {\n\t\tpuffs: [{ startTime: 0, duration: 0.3, frequency: 600, volume: 0.25 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.1, duration: 0.4, frequency: 392, volume: 0.2, type: 'sine', filterFrequency: 400 },\n\t\t\t{ startTime: 0.3, duration: 0.45, frequency: 294, volume: 0.15, type: 'sine', filterFrequency: 350 },\n\t\t],\n\t},\n\thopeless: {\n\t\tpuffs: [{ startTime: 0, duration: 0.2, frequency: 700, volume: 0.2 }],\n\t\ttones: [{ startTime: 0.15, duration: 0.5, frequency: 330, volume: 0.12, type: 'sine', filterFrequency: 450 }],\n\t},\n\tempty: {\n\t\tpuffs: [{ startTime: 0, duration: 0.2, frequency: 700, volume: 0.2 }],\n\t\ttones: [{ startTime: 0.15, duration: 0.5, frequency: 330, volume: 0.12, type: 'sine', filterFrequency: 450 }],\n\t},\n\tdiscouraged: {\n\t\tpuffs: [{ startTime: 0, duration: 0.25, frequency: 800, volume: 0.25 }],\n\t\ttones: [{ startTime: 0.08, duration: 0.3, frequency: 523, volume: 0.18, type: 'sine', frequencyEnd: 349 }],\n\t},\n\tmelancholic: {\n\t\tpuffs: [{ startTime: 0, duration: 0.3, frequency: 700, volume: 0.18 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.1, duration: 0.45, frequency: 440, volume: 0.15, type: 'sine', filterFrequency: 500 },\n\t\t\t{ startTime: 0.3, duration: 0.5, frequency: 392, volume: 0.12, type: 'sine', filterFrequency: 450 },\n\t\t],\n\t},\n\thomesick: {\n\t\tpuffs: [{ startTime: 0, duration: 0.25, frequency: 800, volume: 0.15 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.1, duration: 0.4, frequency: 440, volume: 0.12, type: 'sine', filterFrequency: 500 },\n\t\t\t{ startTime: 0.3, duration: 0.45, frequency: 392, volume: 0.1, type: 'sine', filterFrequency: 450 },\n\t\t],\n\t},\n\thurt: {\n\t\tpuffs: [{ startTime: 0, duration: 0.3, frequency: 600, volume: 0.25 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.1, duration: 0.4, frequency: 392, volume: 0.2, type: 'sine', filterFrequency: 400 },\n\t\t\t{ startTime: 0.3, duration: 0.45, frequency: 294, volume: 0.15, type: 'sine', filterFrequency: 350 },\n\t\t],\n\t},\n\tmiserable: {\n\t\tpuffs: [{ startTime: 0, duration: 0.3, frequency: 600, volume: 0.25 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.1, duration: 0.4, frequency: 392, volume: 0.2, type: 'sine', filterFrequency: 400 },\n\t\t\t{ startTime: 0.3, duration: 0.45, frequency: 294, volume: 0.15, type: 'sine', filterFrequency: 350 },\n\t\t],\n\t},\n\tregretful: {\n\t\tpuffs: [{ startTime: 0, duration: 0.3, frequency: 700, volume: 0.18 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.1, duration: 0.45, frequency: 440, volume: 0.15, type: 'sine', filterFrequency: 500 },\n\t\t\t{ startTime: 0.3, duration: 0.5, frequency: 392, volume: 0.12, type: 'sine', filterFrequency: 450 },\n\t\t],\n\t},\n\tashamed: {\n\t\tpuffs: [{ startTime: 0, duration: 0.25, frequency: 800, volume: 0.25 }],\n\t\ttones: [{ startTime: 0.08, duration: 0.3, frequency: 523, volume: 0.18, type: 'sine', frequencyEnd: 349 }],\n\t},\n\tinferior: {\n\t\tpuffs: [{ startTime: 0, duration: 0.25, frequency: 800, volume: 0.25 }],\n\t\ttones: [{ startTime: 0.08, duration: 0.3, frequency: 523, volume: 0.18, type: 'sine', frequencyEnd: 349 }],\n\t},\n\n\t// ========== ANXIOUS / FEARFUL ==========\n\tanxious: {\n\t\tpuffs: [\n\t\t\t{ startTime: 0, duration: 0.08, frequency: 1800, volume: 0.2 },\n\t\t\t{ startTime: 0.12, duration: 0.08, frequency: 1900, volume: 0.22 },\n\t\t],\n\t\ttones: [{ startTime: 0.03, duration: 0.25, frequency: 440, volume: 0.15, type: 'sine' }],\n\t\tdescription: 'Tight, quick puffs with uncertain wobble',\n\t},\n\tworried: {\n\t\tpuffs: [{ startTime: 0, duration: 0.15, frequency: 1200, volume: 0.2 }],\n\t\ttones: [{ startTime: 0.05, duration: 0.25, frequency: 349, volume: 0.15, type: 'sine', frequencyEnd: 392 }],\n\t},\n\tafraid: {\n\t\tpuffs: [\n\t\t\t{ startTime: 0, duration: 0.08, frequency: 1800, volume: 0.2 },\n\t\t\t{ startTime: 0.12, duration: 0.08, frequency: 1900, volume: 0.22 },\n\t\t],\n\t\ttones: [{ startTime: 0.03, duration: 0.25, frequency: 440, volume: 0.15, type: 'sine' }],\n\t},\n\tterrified: {\n\t\tpuffs: [{ startTime: 0, duration: 0.04, frequency: 3500, volume: 0.3 }],\n\t\ttones: [\n\t\t\t{ startTime: 0, duration: 0.08, frequency: 1047, volume: 0.25, type: 'sine' },\n\t\t\t{ startTime: 0.05, duration: 0.15, frequency: 880, volume: 0.15, type: 'sine' },\n\t\t],\n\t},\n\tpanicked: {\n\t\tpuffs: [{ startTime: 0, duration: 0.04, frequency: 3500, volume: 0.3 }],\n\t\ttones: [\n\t\t\t{ startTime: 0, duration: 0.08, frequency: 1047, volume: 0.25, type: 'sine' },\n\t\t\t{ startTime: 0.05, duration: 0.15, frequency: 880, volume: 0.15, type: 'sine' },\n\t\t],\n\t},\n\tnervous: {\n\t\tpuffs: [\n\t\t\t{ startTime: 0, duration: 0.05, frequency: 2000, volume: 0.18 },\n\t\t\t{ startTime: 0.08, duration: 0.05, frequency: 2100, volume: 0.18 },\n\t\t\t{ startTime: 0.15, duration: 0.06, frequency: 2000, volume: 0.16 },\n\t\t],\n\t\ttones: [{ startTime: 0.04, duration: 0.2, frequency: 494, volume: 0.12, type: 'sine' }],\n\t},\n\tuneasy: {\n\t\tpuffs: [{ startTime: 0, duration: 0.15, frequency: 1200, volume: 0.2 }],\n\t\ttones: [{ startTime: 0.05, duration: 0.25, frequency: 349, volume: 0.15, type: 'sine', frequencyEnd: 392 }],\n\t},\n\tinsecure: {\n\t\tpuffs: [\n\t\t\t{ startTime: 0, duration: 0.05, frequency: 2000, volume: 0.18 },\n\t\t\t{ startTime: 0.08, duration: 0.05, frequency: 2100, volume: 0.18 },\n\t\t\t{ startTime: 0.15, duration: 0.06, frequency: 2000, volume: 0.16 },\n\t\t],\n\t\ttones: [{ startTime: 0.04, duration: 0.2, frequency: 494, volume: 0.12, type: 'sine' }],\n\t},\n\toverwhelmed: {\n\t\tpuffs: [\n\t\t\t{ startTime: 0, duration: 0.08, frequency: 1800, volume: 0.2 },\n\t\t\t{ startTime: 0.12, duration: 0.08, frequency: 1900, volume: 0.22 },\n\t\t],\n\t\ttones: [{ startTime: 0.03, duration: 0.25, frequency: 440, volume: 0.15, type: 'sine' }],\n\t},\n\tstressed: {\n\t\tpuffs: [\n\t\t\t{ startTime: 0, duration: 0.08, frequency: 1800, volume: 0.2 },\n\t\t\t{ startTime: 0.12, duration: 0.08, frequency: 1900, volume: 0.22 },\n\t\t],\n\t\ttones: [{ startTime: 0.03, duration: 0.25, frequency: 440, volume: 0.15, type: 'sine' }],\n\t},\n\ttense: {\n\t\tpuffs: [\n\t\t\t{ startTime: 0, duration: 0.08, frequency: 1800, volume: 0.2 },\n\t\t\t{ startTime: 0.12, duration: 0.08, frequency: 1900, volume: 0.22 },\n\t\t],\n\t\ttones: [{ startTime: 0.03, duration: 0.25, frequency: 440, volume: 0.15, type: 'sine' }],\n\t},\n\tapprehensive: {\n\t\tpuffs: [{ startTime: 0, duration: 0.15, frequency: 1200, volume: 0.2 }],\n\t\ttones: [{ startTime: 0.05, duration: 0.25, frequency: 349, volume: 0.15, type: 'sine', frequencyEnd: 392 }],\n\t},\n\tstartled: {\n\t\tpuffs: [{ startTime: 0, duration: 0.04, frequency: 3500, volume: 0.3 }],\n\t\ttones: [\n\t\t\t{ startTime: 0, duration: 0.08, frequency: 1047, volume: 0.25, type: 'sine' },\n\t\t\t{ startTime: 0.05, duration: 0.15, frequency: 880, volume: 0.15, type: 'sine' },\n\t\t],\n\t},\n\tsuspicious: {\n\t\tpuffs: [{ startTime: 0, duration: 0.15, frequency: 1200, volume: 0.2 }],\n\t\ttones: [{ startTime: 0.05, duration: 0.25, frequency: 349, volume: 0.15, type: 'sine', frequencyEnd: 392 }],\n\t},\n\tvulnerable: {\n\t\tpuffs: [\n\t\t\t{ startTime: 0, duration: 0.05, frequency: 2000, volume: 0.18 },\n\t\t\t{ startTime: 0.08, duration: 0.05, frequency: 2100, volume: 0.18 },\n\t\t\t{ startTime: 0.15, duration: 0.06, frequency: 2000, volume: 0.16 },\n\t\t],\n\t\ttones: [{ startTime: 0.04, duration: 0.2, frequency: 494, volume: 0.12, type: 'sine' }],\n\t},\n\n\t// ========== ANGRY / FRUSTRATED ==========\n\tannoyed: {\n\t\tpuffs: [{ startTime: 0, duration: 0.1, frequency: 1000, volume: 0.25 }],\n\t\ttones: [{ startTime: 0.03, duration: 0.2, frequency: 294, volume: 0.18, type: 'sine', filterFrequency: 400 }],\n\t},\n\tirritated: {\n\t\tpuffs: [{ startTime: 0, duration: 0.1, frequency: 1000, volume: 0.25 }],\n\t\ttones: [{ startTime: 0.03, duration: 0.2, frequency: 294, volume: 0.18, type: 'sine', filterFrequency: 400 }],\n\t},\n\tfrustrated: {\n\t\tpuffs: [{ startTime: 0, duration: 0.12, frequency: 900, volume: 0.28 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.04, duration: 0.15, frequency: 349, volume: 0.2, type: 'sine' },\n\t\t\t{ startTime: 0.12, duration: 0.12, frequency: 330, volume: 0.18, type: 'sine' },\n\t\t],\n\t},\n\tangry: {\n\t\tpuffs: [{ startTime: 0, duration: 0.12, frequency: 900, volume: 0.28 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.04, duration: 0.15, frequency: 349, volume: 0.2, type: 'sine' },\n\t\t\t{ startTime: 0.12, duration: 0.12, frequency: 330, volume: 0.18, type: 'sine' },\n\t\t],\n\t},\n\tenraged: {\n\t\tpuffs: [{ startTime: 0, duration: 0.12, frequency: 900, volume: 0.28 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.04, duration: 0.15, frequency: 349, volume: 0.2, type: 'sine' },\n\t\t\t{ startTime: 0.12, duration: 0.12, frequency: 330, volume: 0.18, type: 'sine' },\n\t\t],\n\t},\n\tbitter: {\n\t\tpuffs: [{ startTime: 0, duration: 0.12, frequency: 900, volume: 0.28 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.04, duration: 0.15, frequency: 349, volume: 0.2, type: 'sine' },\n\t\t\t{ startTime: 0.12, duration: 0.12, frequency: 330, volume: 0.18, type: 'sine' },\n\t\t],\n\t},\n\tresentful: {\n\t\tpuffs: [{ startTime: 0, duration: 0.1, frequency: 1000, volume: 0.25 }],\n\t\ttones: [{ startTime: 0.03, duration: 0.2, frequency: 294, volume: 0.18, type: 'sine', filterFrequency: 400 }],\n\t},\n\tjealous: {\n\t\tpuffs: [{ startTime: 0, duration: 0.1, frequency: 1000, volume: 0.25 }],\n\t\ttones: [{ startTime: 0.03, duration: 0.2, frequency: 294, volume: 0.18, type: 'sine', filterFrequency: 400 }],\n\t},\n\tenvious: {\n\t\tpuffs: [{ startTime: 0, duration: 0.1, frequency: 1000, volume: 0.25 }],\n\t\ttones: [{ startTime: 0.03, duration: 0.2, frequency: 294, volume: 0.18, type: 'sine', filterFrequency: 400 }],\n\t},\n\tindignant: {\n\t\tpuffs: [{ startTime: 0, duration: 0.12, frequency: 900, volume: 0.28 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.04, duration: 0.15, frequency: 349, volume: 0.2, type: 'sine' },\n\t\t\t{ startTime: 0.12, duration: 0.12, frequency: 330, volume: 0.18, type: 'sine' },\n\t\t],\n\t},\n\timpatient: {\n\t\tpuffs: [\n\t\t\t{ startTime: 0, duration: 0.04, frequency: 1500, volume: 0.2 },\n\t\t\t{ startTime: 0.08, duration: 0.04, frequency: 1500, volume: 0.2 },\n\t\t\t{ startTime: 0.16, duration: 0.04, frequency: 1500, volume: 0.22 },\n\t\t],\n\t\ttones: [{ startTime: 0.06, duration: 0.1, frequency: 523, volume: 0.15, type: 'sine' }],\n\t},\n\thostile: {\n\t\tpuffs: [{ startTime: 0, duration: 0.12, frequency: 900, volume: 0.28 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.04, duration: 0.15, frequency: 349, volume: 0.2, type: 'sine' },\n\t\t\t{ startTime: 0.12, duration: 0.12, frequency: 330, volume: 0.18, type: 'sine' },\n\t\t],\n\t},\n\tcontemptuous: {\n\t\tpuffs: [{ startTime: 0, duration: 0.1, frequency: 1000, volume: 0.25 }],\n\t\ttones: [{ startTime: 0.03, duration: 0.2, frequency: 294, volume: 0.18, type: 'sine', filterFrequency: 400 }],\n\t},\n\n\t// ========== TIRED / DRAINED ==========\n\ttired: {\n\t\tpuffs: [{ startTime: 0, duration: 0.35, frequency: 500, volume: 0.2 }],\n\t\ttones: [{ startTime: 0.1, duration: 0.4, frequency: 330, volume: 0.12, type: 'sine', filterFrequency: 350 }],\n\t},\n\texhausted: {\n\t\tpuffs: [{ startTime: 0, duration: 0.45, frequency: 400, volume: 0.18 }],\n\t\ttones: [{ startTime: 0.15, duration: 0.5, frequency: 294, volume: 0.1, type: 'sine', filterFrequency: 300 }],\n\t},\n\tdrained: {\n\t\tpuffs: [{ startTime: 0, duration: 0.45, frequency: 400, volume: 0.18 }],\n\t\ttones: [{ startTime: 0.15, duration: 0.5, frequency: 294, volume: 0.1, type: 'sine', filterFrequency: 300 }],\n\t},\n\tburnedOut: {\n\t\tpuffs: [{ startTime: 0, duration: 0.45, frequency: 400, volume: 0.18 }],\n\t\ttones: [{ startTime: 0.15, duration: 0.5, frequency: 294, volume: 0.1, type: 'sine', filterFrequency: 300 }],\n\t},\n\tnumb: {\n\t\tpuffs: [{ startTime: 0, duration: 0.45, frequency: 400, volume: 0.18 }],\n\t\ttones: [{ startTime: 0.15, duration: 0.5, frequency: 294, volume: 0.1, type: 'sine', filterFrequency: 300 }],\n\t},\n\tbored: {\n\t\tpuffs: [{ startTime: 0, duration: 0.25, frequency: 600, volume: 0.15 }],\n\t\ttones: [{ startTime: 0.1, duration: 0.3, frequency: 349, volume: 0.1, type: 'sine', filterFrequency: 400 }],\n\t},\n\tunmotivated: {\n\t\tpuffs: [{ startTime: 0, duration: 0.25, frequency: 600, volume: 0.15 }],\n\t\ttones: [{ startTime: 0.1, duration: 0.3, frequency: 349, volume: 0.1, type: 'sine', filterFrequency: 400 }],\n\t},\n\tapathetic: {\n\t\tpuffs: [{ startTime: 0, duration: 0.25, frequency: 600, volume: 0.15 }],\n\t\ttones: [{ startTime: 0.1, duration: 0.3, frequency: 349, volume: 0.1, type: 'sine', filterFrequency: 400 }],\n\t},\n\trestless: {\n\t\tpuffs: [{ startTime: 0, duration: 0.35, frequency: 500, volume: 0.2 }],\n\t\ttones: [{ startTime: 0.1, duration: 0.4, frequency: 330, volume: 0.12, type: 'sine', filterFrequency: 350 }],\n\t},\n\n\t// ========== CALM / GROUNDED ==========\n\tcalm: {\n\t\tpuffs: [{ startTime: 0, duration: 0.3, frequency: 600, volume: 0.12 }],\n\t\ttones: [{ startTime: 0.1, duration: 0.5, frequency: 392, volume: 0.1, type: 'sine', filterFrequency: 500 }],\n\t},\n\trelaxed: {\n\t\tpuffs: [{ startTime: 0, duration: 0.35, frequency: 700, volume: 0.15 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.15, duration: 0.45, frequency: 440, volume: 0.1, type: 'sine', filterFrequency: 800 },\n\t\t\t{ startTime: 0.35, duration: 0.5, frequency: 392, volume: 0.08, type: 'sine', filterFrequency: 800 },\n\t\t],\n\t},\n\tatEase: {\n\t\tpuffs: [{ startTime: 0, duration: 0.35, frequency: 700, volume: 0.15 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.15, duration: 0.45, frequency: 440, volume: 0.1, type: 'sine', filterFrequency: 800 },\n\t\t\t{ startTime: 0.35, duration: 0.5, frequency: 392, volume: 0.08, type: 'sine', filterFrequency: 800 },\n\t\t],\n\t},\n\tbalanced: {\n\t\tpuffs: [{ startTime: 0, duration: 0.3, frequency: 600, volume: 0.12 }],\n\t\ttones: [{ startTime: 0.1, duration: 0.5, frequency: 392, volume: 0.1, type: 'sine', filterFrequency: 500 }],\n\t},\n\tstable: {\n\t\tpuffs: [{ startTime: 0, duration: 0.25, frequency: 500, volume: 0.2 }],\n\t\ttones: [{ startTime: 0.1, duration: 0.4, frequency: 262, volume: 0.15, type: 'sine', filterFrequency: 350 }],\n\t},\n\tsecure: {\n\t\tpuffs: [{ startTime: 0, duration: 0.3, frequency: 700, volume: 0.15 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.1, duration: 0.4, frequency: 349, volume: 0.12, type: 'sine', filterFrequency: 800 },\n\t\t\t{ startTime: 0.25, duration: 0.45, frequency: 440, volume: 0.1, type: 'sine', filterFrequency: 800 },\n\t\t],\n\t},\n\tsafe: {\n\t\tpuffs: [{ startTime: 0, duration: 0.3, frequency: 700, volume: 0.15 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.1, duration: 0.4, frequency: 349, volume: 0.12, type: 'sine', filterFrequency: 800 },\n\t\t\t{ startTime: 0.25, duration: 0.45, frequency: 440, volume: 0.1, type: 'sine', filterFrequency: 800 },\n\t\t],\n\t},\n\tcentered: {\n\t\tpuffs: [{ startTime: 0, duration: 0.25, frequency: 500, volume: 0.2 }],\n\t\ttones: [{ startTime: 0.1, duration: 0.4, frequency: 262, volume: 0.15, type: 'sine', filterFrequency: 350 }],\n\t},\n\tgrounded: {\n\t\tpuffs: [{ startTime: 0, duration: 0.25, frequency: 500, volume: 0.2 }],\n\t\ttones: [{ startTime: 0.1, duration: 0.4, frequency: 262, volume: 0.15, type: 'sine', filterFrequency: 350 }],\n\t},\n\taccepting: {\n\t\tpuffs: [{ startTime: 0, duration: 0.3, frequency: 600, volume: 0.12 }],\n\t\ttones: [{ startTime: 0.1, duration: 0.5, frequency: 392, volume: 0.1, type: 'sine', filterFrequency: 500 }],\n\t},\n\n\t// ========== CONNECTED / SOCIAL ==========\n\tconnected: {\n\t\tpuffs: [{ startTime: 0, duration: 0.2, frequency: 1200, volume: 0.18 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.08, duration: 0.3, frequency: 440, volume: 0.15, type: 'sine', filterFrequency: 800 },\n\t\t\t{ startTime: 0.12, duration: 0.32, frequency: 523, volume: 0.12, type: 'sine', filterFrequency: 800 },\n\t\t],\n\t},\n\taccepted: {\n\t\tpuffs: [{ startTime: 0, duration: 0.15, frequency: 1500, volume: 0.2 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.05, duration: 0.25, frequency: 440, volume: 0.15, type: 'sine', filterFrequency: 800 },\n\t\t\t{ startTime: 0.15, duration: 0.3, frequency: 523, volume: 0.18, type: 'sine', filterFrequency: 800 },\n\t\t],\n\t},\n\tincluded: {\n\t\tpuffs: [{ startTime: 0, duration: 0.2, frequency: 1200, volume: 0.18 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.08, duration: 0.3, frequency: 440, volume: 0.15, type: 'sine', filterFrequency: 800 },\n\t\t\t{ startTime: 0.12, duration: 0.32, frequency: 523, volume: 0.12, type: 'sine', filterFrequency: 800 },\n\t\t],\n\t},\n\tbelonging: {\n\t\tpuffs: [{ startTime: 0, duration: 0.2, frequency: 1200, volume: 0.18 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.08, duration: 0.3, frequency: 440, volume: 0.15, type: 'sine', filterFrequency: 800 },\n\t\t\t{ startTime: 0.12, duration: 0.32, frequency: 523, volume: 0.12, type: 'sine', filterFrequency: 800 },\n\t\t],\n\t},\n\tappreciated: {\n\t\tpuffs: [{ startTime: 0, duration: 0.15, frequency: 1500, volume: 0.2 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.05, duration: 0.25, frequency: 440, volume: 0.15, type: 'sine', filterFrequency: 800 },\n\t\t\t{ startTime: 0.15, duration: 0.3, frequency: 523, volume: 0.18, type: 'sine', filterFrequency: 800 },\n\t\t],\n\t},\n\tvalued: {\n\t\tpuffs: [{ startTime: 0, duration: 0.15, frequency: 1500, volume: 0.2 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.05, duration: 0.25, frequency: 440, volume: 0.15, type: 'sine', filterFrequency: 800 },\n\t\t\t{ startTime: 0.15, duration: 0.3, frequency: 523, volume: 0.18, type: 'sine', filterFrequency: 800 },\n\t\t],\n\t},\n\trespected: {\n\t\tpuffs: [{ startTime: 0, duration: 0.15, frequency: 1500, volume: 0.2 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.05, duration: 0.25, frequency: 440, volume: 0.15, type: 'sine', filterFrequency: 800 },\n\t\t\t{ startTime: 0.15, duration: 0.3, frequency: 523, volume: 0.18, type: 'sine', filterFrequency: 800 },\n\t\t],\n\t},\n\tsupported: {\n\t\tpuffs: [{ startTime: 0, duration: 0.25, frequency: 900, volume: 0.18 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.1, duration: 0.35, frequency: 349, volume: 0.12, type: 'sine', filterFrequency: 800 },\n\t\t\t{ startTime: 0.15, duration: 0.4, frequency: 440, volume: 0.1, type: 'sine', filterFrequency: 800 },\n\t\t],\n\t},\n\tprotective: {\n\t\tpuffs: [{ startTime: 0, duration: 0.25, frequency: 900, volume: 0.18 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.1, duration: 0.35, frequency: 349, volume: 0.12, type: 'sine', filterFrequency: 800 },\n\t\t\t{ startTime: 0.15, duration: 0.4, frequency: 440, volume: 0.1, type: 'sine', filterFrequency: 800 },\n\t\t],\n\t},\n\tcompassionate: {\n\t\tpuffs: [{ startTime: 0, duration: 0.2, frequency: 1200, volume: 0.18 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.08, duration: 0.3, frequency: 440, volume: 0.15, type: 'sine', filterFrequency: 800 },\n\t\t\t{ startTime: 0.12, duration: 0.32, frequency: 523, volume: 0.12, type: 'sine', filterFrequency: 800 },\n\t\t],\n\t},\n\tempathetic: {\n\t\tpuffs: [{ startTime: 0, duration: 0.2, frequency: 1200, volume: 0.18 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.08, duration: 0.3, frequency: 440, volume: 0.15, type: 'sine', filterFrequency: 800 },\n\t\t\t{ startTime: 0.12, duration: 0.32, frequency: 523, volume: 0.12, type: 'sine', filterFrequency: 800 },\n\t\t],\n\t},\n\n\t// ========== MIXED / COMPLICATED ==========\n\tconflicted: {\n\t\tpuffs: [{ startTime: 0, duration: 0.12, frequency: 1200, volume: 0.18 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.04, duration: 0.2, frequency: 440, volume: 0.12, type: 'sine', frequencyEnd: 494 },\n\t\t\t{ startTime: 0.15, duration: 0.15, frequency: 466, volume: 0.1, type: 'sine' },\n\t\t],\n\t},\n\tconfused: {\n\t\tpuffs: [{ startTime: 0, duration: 0.12, frequency: 1200, volume: 0.18 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.04, duration: 0.2, frequency: 440, volume: 0.12, type: 'sine', frequencyEnd: 494 },\n\t\t\t{ startTime: 0.15, duration: 0.15, frequency: 466, volume: 0.1, type: 'sine' },\n\t\t],\n\t},\n\tambivalent: {\n\t\tpuffs: [{ startTime: 0, duration: 0.12, frequency: 1200, volume: 0.18 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.04, duration: 0.2, frequency: 440, volume: 0.12, type: 'sine', frequencyEnd: 494 },\n\t\t\t{ startTime: 0.15, duration: 0.15, frequency: 466, volume: 0.1, type: 'sine' },\n\t\t],\n\t},\n\tnostalgic: {\n\t\tpuffs: [{ startTime: 0, duration: 0.25, frequency: 800, volume: 0.15 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.1, duration: 0.4, frequency: 440, volume: 0.12, type: 'sine', filterFrequency: 500 },\n\t\t\t{ startTime: 0.3, duration: 0.45, frequency: 392, volume: 0.1, type: 'sine', filterFrequency: 450 },\n\t\t],\n\t},\n\tguilty: {\n\t\tpuffs: [{ startTime: 0, duration: 0.25, frequency: 800, volume: 0.25 }],\n\t\ttones: [{ startTime: 0.08, duration: 0.3, frequency: 523, volume: 0.18, type: 'sine', frequencyEnd: 349 }],\n\t},\n\tembarrassed: {\n\t\tpuffs: [\n\t\t\t{ startTime: 0, duration: 0.05, frequency: 2000, volume: 0.18 },\n\t\t\t{ startTime: 0.08, duration: 0.05, frequency: 2100, volume: 0.18 },\n\t\t\t{ startTime: 0.15, duration: 0.06, frequency: 2000, volume: 0.16 },\n\t\t],\n\t\ttones: [{ startTime: 0.04, duration: 0.2, frequency: 494, volume: 0.12, type: 'sine' }],\n\t},\n\tsurprised: {\n\t\tpuffs: [{ startTime: 0, duration: 0.06, frequency: 2800, volume: 0.25 }],\n\t\ttones: [{ startTime: 0.02, duration: 0.15, frequency: 659, volume: 0.2, type: 'sine', frequencyEnd: 988 }],\n\t},\n\tshocked: {\n\t\tpuffs: [{ startTime: 0, duration: 0.04, frequency: 3500, volume: 0.3 }],\n\t\ttones: [\n\t\t\t{ startTime: 0, duration: 0.08, frequency: 1047, volume: 0.25, type: 'sine' },\n\t\t\t{ startTime: 0.05, duration: 0.15, frequency: 880, volume: 0.15, type: 'sine' },\n\t\t],\n\t},\n\tawestruck: {\n\t\tpuffs: [{ startTime: 0, duration: 0.2, frequency: 1500, volume: 0.2 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.08, duration: 0.4, frequency: 440, volume: 0.15, type: 'sine' },\n\t\t\t{ startTime: 0.1, duration: 0.38, frequency: 660, volume: 0.12, type: 'sine' },\n\t\t\t{ startTime: 0.12, duration: 0.36, frequency: 880, volume: 0.09, type: 'sine' },\n\t\t],\n\t},\n\tskeptical: {\n\t\tpuffs: [{ startTime: 0, duration: 0.12, frequency: 1200, volume: 0.18 }],\n\t\ttones: [\n\t\t\t{ startTime: 0.04, duration: 0.2, frequency: 440, volume: 0.12, type: 'sine', frequencyEnd: 494 },\n\t\t\t{ startTime: 0.15, duration: 0.15, frequency: 466, volume: 0.1, type: 'sine' },\n\t\t],\n\t},\n}\n\n// ============================================================================\n// SOUND SERVICE\n// ============================================================================\n\n/**\n * Sound Service - Provides centralized sound management for Schmancy components\n *\n * Following the theme service pattern:\n * - Has default sounds as fallback\n * - Can receive custom sound theme from AI\n * - Reactive observables for state changes\n * - Persists settings to session storage\n */\nclass SoundService {\n\tprivate static instance: SoundService\n\n\t/** Audio context for Web Audio API */\n\tprivate audioContext: AudioContext | null = null\n\n\t// Public observables derived from context\n\t// Don't use distinctUntilChanged for theme - we need all emissions including storage loads\n\tpublic readonly theme$ = SoundContext.$.pipe(\n\t\tmap(settings => settings.theme),\n\t\tshareReplay(1)\n\t)\n\n\tpublic readonly volume$ = SoundContext.$.pipe(\n\t\tmap(settings => settings.volume),\n\t\tdistinctUntilChanged(),\n\t\tshareReplay(1)\n\t)\n\n\tpublic readonly muted$ = SoundContext.$.pipe(\n\t\tmap(settings => settings.muted),\n\t\tdistinctUntilChanged(),\n\t\tshareReplay(1)\n\t)\n\n\t/** BehaviorSubject for current theme name (for debugging/display) */\n\tprivate readonly _themeName$ = new BehaviorSubject<string>('default')\n\tpublic readonly themeName$ = this._themeName$.asObservable()\n\n\t// Getters for synchronous access\n\tget theme(): SoundTheme | null {\n\t\treturn SoundContext.value.theme\n\t}\n\n\tget volume(): number {\n\t\treturn SoundContext.value.volume\n\t}\n\n\tget muted(): boolean {\n\t\treturn SoundContext.value.muted\n\t}\n\n\tget themeName(): string {\n\t\treturn this.theme?.name ?? 'default'\n\t}\n\n\tprivate constructor() {\n\t\t// Subscribe to theme changes to update theme name\n\t\tthis.theme$.subscribe(theme => {\n\t\t\tthis._themeName$.next(theme?.name ?? 'default')\n\t\t})\n\t}\n\n\t// ==========================================================================\n\t// AUDIO CONTEXT MANAGEMENT\n\t// ==========================================================================\n\n\tprivate getContext(): AudioContext {\n\t\tif (!this.audioContext) {\n\t\t\tconst AudioContextClass =\n\t\t\t\twindow.AudioContext || (window as unknown as { webkitAudioContext: typeof AudioContext }).webkitAudioContext\n\t\t\tthis.audioContext = new AudioContextClass()\n\t\t}\n\t\tif (this.audioContext.state === 'suspended') {\n\t\t\tthis.audioContext.resume()\n\t\t}\n\t\treturn this.audioContext\n\t}\n\n\t// ==========================================================================\n\t// SOUND PRIMITIVES\n\t// ==========================================================================\n\n\t/** Play a puff (breath/air) sound */\n\tprivate playPuff(startTime: number, params: PuffParams, masterVolume: number): void {\n\t\tconst ctx = this.getContext()\n\t\tconst bufferSize = Math.floor(ctx.sampleRate * params.duration)\n\t\tconst buffer = ctx.createBuffer(1, bufferSize, ctx.sampleRate)\n\t\tconst data = buffer.getChannelData(0)\n\n\t\tfor (let i = 0; i < bufferSize; i++) {\n\t\t\tdata[i] = Math.random() * 2 - 1\n\t\t}\n\n\t\tconst noise = ctx.createBufferSource()\n\t\tnoise.buffer = buffer\n\n\t\tconst filter = ctx.createBiquadFilter()\n\t\tfilter.type = 'bandpass'\n\t\tfilter.frequency.value = params.frequency\n\t\tfilter.Q.value = 0.7\n\n\t\tconst gain = ctx.createGain()\n\t\tgain.gain.setValueAtTime(0, startTime)\n\t\tgain.gain.linearRampToValueAtTime(params.volume * masterVolume, startTime + 0.015)\n\t\tgain.gain.exponentialRampToValueAtTime(0.001, startTime + params.duration)\n\n\t\tnoise.connect(filter).connect(gain).connect(ctx.destination)\n\t\tnoise.start(startTime)\n\t\tnoise.stop(startTime + params.duration)\n\t}\n\n\t/** Play a tone (musical) sound */\n\tprivate playTone(startTime: number, params: ToneParams, masterVolume: number): void {\n\t\tconst ctx = this.getContext()\n\t\tconst osc = ctx.createOscillator()\n\t\tconst gain = ctx.createGain()\n\n\t\tosc.type = params.type\n\t\tosc.frequency.setValueAtTime(params.frequency, startTime)\n\n\t\tif (params.frequencyEnd) {\n\t\t\tosc.frequency.exponentialRampToValueAtTime(params.frequencyEnd, startTime + params.duration * 0.8)\n\t\t}\n\n\t\t// Apply filter if specified\n\t\tlet lastNode: AudioNode = osc\n\t\tif (params.filterFrequency) {\n\t\t\tconst filter = ctx.createBiquadFilter()\n\t\t\tfilter.type = 'lowpass'\n\t\t\tfilter.frequency.value = params.filterFrequency\n\t\t\tosc.connect(filter)\n\t\t\tlastNode = filter\n\t\t}\n\n\t\tgain.gain.setValueAtTime(0, startTime)\n\t\tgain.gain.linearRampToValueAtTime(params.volume * masterVolume, startTime + 0.02)\n\t\tgain.gain.exponentialRampToValueAtTime(0.001, startTime + params.duration)\n\n\t\tlastNode.connect(gain).connect(ctx.destination)\n\t\tosc.start(startTime)\n\t\tosc.stop(startTime + params.duration)\n\t}\n\n\t// ==========================================================================\n\t// PUBLIC API - THEME MANAGEMENT\n\t// ==========================================================================\n\n\t/**\n\t * Set a custom sound theme (e.g., from AI generation)\n\t * @param theme The sound theme to apply\n\t */\n\tpublic setTheme(theme: SoundTheme): void {\n\t\tSoundContext.set({ theme })\n\t}\n\n\t/**\n\t * Reset to default sounds (removes custom theme)\n\t */\n\tpublic resetTheme(): void {\n\t\tSoundContext.set({ theme: null })\n\t}\n\n\t/**\n\t * Set volume level (0.0 - 1.0)\n\t * @param volume Volume level\n\t */\n\tpublic setVolume(volume: number): void {\n\t\tSoundContext.set({ volume: Math.max(0, Math.min(1, volume)) })\n\t}\n\n\t/**\n\t * Mute all sounds\n\t */\n\tpublic mute(): void {\n\t\tSoundContext.set({ muted: true })\n\t}\n\n\t/**\n\t * Unmute sounds\n\t */\n\tpublic unmute(): void {\n\t\tSoundContext.set({ muted: false })\n\t}\n\n\t/**\n\t * Toggle mute state\n\t */\n\tpublic toggleMute(): void {\n\t\tSoundContext.set({ muted: !this.muted })\n\t}\n\n\t// ==========================================================================\n\t// PUBLIC API - SOUND PLAYBACK\n\t// ==========================================================================\n\n\t/**\n\t * Get the sound definition for a feeling\n\t * Uses custom theme if available, falls back to defaults\n\t */\n\tpublic getSoundForFeeling(feeling: Feeling): FeelingSound {\n\t\tconst customTheme = this.theme\n\n\t\t// Try custom theme first\n\t\tif (customTheme?.feelings?.[feeling]) {\n\t\t\treturn customTheme.feelings[feeling]!\n\t\t}\n\n\t\t// Try category default from custom theme\n\t\tif (customTheme?.categoryDefaults) {\n\t\t\tconst category = this.getCategoryForFeeling(feeling)\n\t\t\tif (customTheme.categoryDefaults[category]) {\n\t\t\t\treturn customTheme.categoryDefaults[category]!\n\t\t\t}\n\t\t}\n\n\t\t// Fall back to defaults\n\t\treturn DEFAULT_SOUNDS[feeling]\n\t}\n\n\t/**\n\t * Get the category for a feeling\n\t */\n\tprivate getCategoryForFeeling(feeling: Feeling): FeelingCategory {\n\t\tconst happyFeelings: Feeling[] = [\n\t\t\t'joyful',\n\t\t\t'content',\n\t\t\t'excited',\n\t\t\t'proud',\n\t\t\t'hopeful',\n\t\t\t'relieved',\n\t\t\t'grateful',\n\t\t\t'peaceful',\n\t\t\t'playful',\n\t\t\t'amused',\n\t\t\t'curious',\n\t\t\t'inspired',\n\t\t\t'confident',\n\t\t\t'loved',\n\t\t\t'comforted',\n\t\t\t'energized',\n\t\t\t'celebrated',\n\t\t]\n\t\tconst sadFeelings: Feeling[] = [\n\t\t\t'sad',\n\t\t\t'lonely',\n\t\t\t'disappointed',\n\t\t\t'heartbroken',\n\t\t\t'grieving',\n\t\t\t'hopeless',\n\t\t\t'empty',\n\t\t\t'discouraged',\n\t\t\t'melancholic',\n\t\t\t'homesick',\n\t\t\t'hurt',\n\t\t\t'miserable',\n\t\t\t'regretful',\n\t\t\t'ashamed',\n\t\t\t'inferior',\n\t\t]\n\t\tconst anxiousFeelings: Feeling[] = [\n\t\t\t'anxious',\n\t\t\t'worried',\n\t\t\t'afraid',\n\t\t\t'terrified',\n\t\t\t'panicked',\n\t\t\t'nervous',\n\t\t\t'uneasy',\n\t\t\t'insecure',\n\t\t\t'overwhelmed',\n\t\t\t'stressed',\n\t\t\t'tense',\n\t\t\t'apprehensive',\n\t\t\t'startled',\n\t\t\t'suspicious',\n\t\t\t'vulnerable',\n\t\t]\n\t\tconst angryFeelings: Feeling[] = [\n\t\t\t'annoyed',\n\t\t\t'irritated',\n\t\t\t'frustrated',\n\t\t\t'angry',\n\t\t\t'enraged',\n\t\t\t'bitter',\n\t\t\t'resentful',\n\t\t\t'jealous',\n\t\t\t'envious',\n\t\t\t'indignant',\n\t\t\t'impatient',\n\t\t\t'hostile',\n\t\t\t'contemptuous',\n\t\t]\n\t\tconst tiredFeelings: Feeling[] = ['tired', 'exhausted', 'drained', 'burnedOut', 'numb', 'bored', 'unmotivated', 'apathetic', 'restless']\n\t\tconst calmFeelings: Feeling[] = ['calm', 'relaxed', 'atEase', 'balanced', 'stable', 'secure', 'safe', 'centered', 'grounded', 'accepting']\n\t\tconst connectedFeelings: Feeling[] = [\n\t\t\t'connected',\n\t\t\t'accepted',\n\t\t\t'included',\n\t\t\t'belonging',\n\t\t\t'appreciated',\n\t\t\t'valued',\n\t\t\t'respected',\n\t\t\t'supported',\n\t\t\t'protective',\n\t\t\t'compassionate',\n\t\t\t'empathetic',\n\t\t]\n\n\t\tif (happyFeelings.includes(feeling)) return 'happy'\n\t\tif (sadFeelings.includes(feeling)) return 'sad'\n\t\tif (anxiousFeelings.includes(feeling)) return 'anxious'\n\t\tif (angryFeelings.includes(feeling)) return 'angry'\n\t\tif (tiredFeelings.includes(feeling)) return 'tired'\n\t\tif (calmFeelings.includes(feeling)) return 'calm'\n\t\tif (connectedFeelings.includes(feeling)) return 'connected'\n\t\treturn 'mixed'\n\t}\n\n\t/**\n\t * Play a feeling sound\n\t * @param feeling The feeling to play\n\t */\n\tpublic play(feeling: Feeling): void {\n\t\tif (this.muted) return\n\n\t\tconst sound = this.getSoundForFeeling(feeling)\n\t\tconst ctx = this.getContext()\n\t\tconst now = ctx.currentTime\n\n\t\t// Calculate master volume (theme + user setting)\n\t\tconst themeMasterVolume = this.theme?.masterVolume ?? 1\n\t\tconst masterVolume = this.volume * themeMasterVolume\n\n\t\t// Play puffs\n\t\tsound.puffs.forEach(puff => {\n\t\t\tthis.playPuff(now + puff.startTime, puff, masterVolume)\n\t\t})\n\n\t\t// Play tones\n\t\tsound.tones.forEach(tone => {\n\t\t\tthis.playTone(now + tone.startTime, tone, masterVolume)\n\t\t})\n\t}\n\n\t/**\n\t * Dispose audio context\n\t */\n\tpublic dispose(): void {\n\t\tif (this.audioContext) {\n\t\t\tthis.audioContext.close()\n\t\t\tthis.audioContext = null\n\t\t}\n\t}\n\n\t/**\n\t * Get singleton instance\n\t */\n\tstatic getInstance(): SoundService {\n\t\tif (!SoundService.instance) {\n\t\t\tSoundService.instance = new SoundService()\n\t\t}\n\t\treturn SoundService.instance\n\t}\n}\n\n// ============================================================================\n// EXPORTS\n// ============================================================================\n\n/** Global sound service singleton */\nexport const sound = SoundService.getInstance()\nexport const schmancySound = sound // Alias for consistency with theme\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"splash-screen-B1mM4_xz.js","names":[],"sources":["../src/splash-screen/splash-screen.ts"],"sourcesContent":["import { SchmancyElement } from '@mixins/index'\nimport { css, html } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { styleMap } from 'lit/directives/style-map.js'\nimport { fromEvent, of, timer, zip } from 'rxjs'\nimport { take, takeUntil, tap } from 'rxjs/operators'\n\nexport type SchmancySplashScreenDoneEvent = CustomEvent<void>\n\n/**\n * Full-viewport splash overlay that dismisses once a minimum duration has\n * elapsed and (optionally) an external `ready` signal has fired. The splash\n * fades out while the underlying app content fades in.\n *\n * Bring-your-own visuals: the `splash` slot is empty by default so the\n * component pulls in no dependencies. Provide a logo, spinner, or\n * animation from the consumer side.\n *\n * @element schmancy-splash-screen\n * @slot splash - Content rendered on the splash layer (logo, spinner, etc.).\n * @slot - Default slot for the actual app content, revealed once dismissed.\n * @fires schmancy-splash-done - `CustomEvent<void>` when the splash dismisses.\n *\n * @example\n * ```html\n * <schmancy-splash-screen min-duration=\"1200\">\n * <my-logo slot=\"splash\"></my-logo>\n * <my-app></my-app>\n * </schmancy-splash-screen>\n * ```\n */\n@customElement('schmancy-splash-screen')\nexport default class SchmancySplashScreen extends SchmancyElement {\n\tstatic styles = [css`\n\t:host {\n\t\tdisplay: block;\n\t\tposition: relative;\n\t}\n\n\t.splash-layer {\n\t\tposition: fixed;\n\t\tinset: 0;\n\t\tz-index: 50;\n\t\toverflow: hidden;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tbackground: var(\n\t\t\t--schmancy-splash-background,\n\t\t\tvar(--schmancy-sys-color-surface-containerLowest, #000)\n\t\t);\n\t\ttransition: opacity var(--schmancy-splash-transition, 500ms) ease-out;\n\t}\n\n\t.content-layer {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t\ttransition: opacity var(--schmancy-splash-transition, 500ms) ease-in-out;\n\t}\n`]\n\n\t/**\n\t * Minimum duration (ms) the splash layer stays visible. Prevents a flash\n\t * when the app loads faster than expected.\n\t */\n\t@property({ type: Number, attribute: 'min-duration' }) minDuration = 1500\n\n\t/**\n\t * When true, the splash dismisses on the `minDuration` timer alone.\n\t * When false (default), it additionally waits for an external ready signal\n\t * (a `ready` event on this element, or a call to `this.ready()`).\n\t */\n\t@property({ type: Boolean }) auto = false\n\n\t/**\n\t * When true, the splash starts hidden. Use this for imperative control.\n\t */\n\t@property({ type: Boolean, attribute: 'initially-hidden' }) initiallyHidden = false\n\n\t@state() private _visible = true\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback()\n\n\t\tif (this.initiallyHidden) {\n\t\t\tthis._visible = false\n\t\t\treturn\n\t\t}\n\n\t\tconst readySignal$ = this.auto ? of(null) : fromEvent<Event>(this, 'ready').pipe(take(1))\n\t\tconst minTimer$ = timer(this.minDuration)\n\n\t\tzip(readySignal$, minTimer$)\n\t\t\t.pipe(\n\t\t\t\ttake(1),\n\t\t\t\ttap(() => this._dismiss()),\n\t\t\t\ttakeUntil(this.disconnecting),\n\t\t\t)\n\t\t\t.subscribe()\n\t}\n\n\t/**\n\t * Imperative API: signal that the app is ready and dismiss the splash\n\t * after the minimum duration has elapsed.\n\t */\n\tpublic ready(): void {\n\t\tthis.dispatchEvent(new Event('ready'))\n\t}\n\n\t/**\n\t * Force the splash to show again (e.g. between route transitions).\n\t */\n\tpublic show(): void {\n\t\tthis._visible = true\n\t}\n\n\tprivate _dismiss(): void {\n\t\tthis._visible = false\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent<void>('schmancy-splash-done', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t}),\n\t\t)\n\t}\n\n\trender() {\n\t\treturn html`\n\t\t\t<div\n\t\t\t\tclass=\"splash-layer\"\n\t\t\t\taria-hidden=${!this._visible}\n\t\t\t\tstyle=${styleMap({\n\t\t\t\t\topacity: this._visible ? '1' : '0',\n\t\t\t\t\tpointerEvents: this._visible ? 'auto' : 'none',\n\t\t\t\t})}\n\t\t\t>\n\t\t\t\t<slot name=\"splash\"></slot>\n\t\t\t</div>\n\t\t\t<div\n\t\t\t\tclass=\"content-layer\"\n\t\t\t\tstyle=${styleMap({\n\t\t\t\t\topacity: this._visible ? '0' : '1',\n\t\t\t\t\tpointerEvents: this._visible ? 'none' : 'auto',\n\t\t\t\t})}\n\t\t\t>\n\t\t\t\t<slot></slot>\n\t\t\t</div>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-splash-screen': SchmancySplashScreen\n\t}\n}\n"],"mappings":";;;;;;;AAgCe,IAAA,IAAA,cAAmC,EAAA;CAAA,YAAA,GAAA,GAAA;EAAA,MAAA,GAAA,CAAA,GAAA,KAAA,cAiCoB,MAAA,KAAA,OAAA,CAOjC,GAAA,KAAA,kBAAA,CAK0C,GAAA,KAAA,WAAA,CAElD;CAAA;CAAA;EAAA,KAAA,SA9CZ,CAAC,CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgDpB,oBAAA;EACC,MAAM,kBAAA,GAEF,KAAK,kBACR,KAAK,WAAA,CAAW,IAOjB,EAHqB,KAAK,OAAO,EAAG,IAAA,IAAQ,EAAiB,MAAM,OAAA,EAAS,KAAK,EAAK,CAAA,CAAA,GACpE,EAAM,KAAK,WAAA,CAAA,EAG3B,KACA,EAAK,CAAA,GACL,QAAU,KAAK,SAAA,CAAA,GACf,EAAU,KAAK,aAAA,CAAA,EAEf,UAAA;CACH;CAMA,QAAA;EACC,KAAK,cAAc,IAAI,MAAM,OAAA,CAAA;CAC9B;CAKA,OAAA;EACC,KAAK,WAAA,CAAW;CACjB;CAEA,WAAA;EACC,KAAK,WAAA,CAAW,GAChB,KAAK,cACJ,IAAI,YAAkB,wBAAwB;GAC7C,SAAA,CAAS;GACT,UAAA,CAAU;EAAA,CAAA,CAAA;CAGb;CAEA,SAAA;EACC,OAAO,CAAI;;;mBAGM,KAAK,SAAA;YACZ,EAAS;GAChB,SAAS,KAAK,WAAW,MAAM;GAC/B,eAAe,KAAK,WAAW,SAAS;EAAA,CAAA,EAAA;;;;;;YAOjC,EAAS;GAChB,SAAS,KAAK,WAAW,MAAM;GAC/B,eAAe,KAAK,WAAW,SAAS;EAAA,CAAA,EAAA;;;;;CAM5C;AAAA;AAAA,EAAA,CAnFC,EAAS;CAAE,MAAM;CAAQ,WAAW;AAAA,CAAA,CAAA,GAAgB,EAAA,WAAA,eAAA,KAAA,CAAA,GAAA,EAAA,CAOpD,EAAS,EAAE,MAAM,QAAA,CAAA,CAAA,GAAS,EAAA,WAAA,QAAA,KAAA,CAAA,GAAA,EAAA,CAK1B,EAAS;CAAE,MAAM;CAAS,WAAW;AAAA,CAAA,CAAA,GAAoB,EAAA,WAAA,mBAAA,KAAA,CAAA,GAAA,EAAA,CAEzD,EAAA,CAAA,GAAM,EAAA,WAAA,YAAA,KAAA,CAAA,GAAA,IAAA,EAAA,CAhDP,EAAc,wBAAA,CAAA,GAAwB,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"splash-screen-cbz4bxjB.cjs","names":[],"sources":["../src/splash-screen/splash-screen.ts"],"sourcesContent":["import { SchmancyElement } from '@mixins/index'\nimport { css, html } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { styleMap } from 'lit/directives/style-map.js'\nimport { fromEvent, of, timer, zip } from 'rxjs'\nimport { take, takeUntil, tap } from 'rxjs/operators'\n\nexport type SchmancySplashScreenDoneEvent = CustomEvent<void>\n\n/**\n * Full-viewport splash overlay that dismisses once a minimum duration has\n * elapsed and (optionally) an external `ready` signal has fired. The splash\n * fades out while the underlying app content fades in.\n *\n * Bring-your-own visuals: the `splash` slot is empty by default so the\n * component pulls in no dependencies. Provide a logo, spinner, or\n * animation from the consumer side.\n *\n * @element schmancy-splash-screen\n * @slot splash - Content rendered on the splash layer (logo, spinner, etc.).\n * @slot - Default slot for the actual app content, revealed once dismissed.\n * @fires schmancy-splash-done - `CustomEvent<void>` when the splash dismisses.\n *\n * @example\n * ```html\n * <schmancy-splash-screen min-duration=\"1200\">\n * <my-logo slot=\"splash\"></my-logo>\n * <my-app></my-app>\n * </schmancy-splash-screen>\n * ```\n */\n@customElement('schmancy-splash-screen')\nexport default class SchmancySplashScreen extends SchmancyElement {\n\tstatic styles = [css`\n\t:host {\n\t\tdisplay: block;\n\t\tposition: relative;\n\t}\n\n\t.splash-layer {\n\t\tposition: fixed;\n\t\tinset: 0;\n\t\tz-index: 50;\n\t\toverflow: hidden;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tbackground: var(\n\t\t\t--schmancy-splash-background,\n\t\t\tvar(--schmancy-sys-color-surface-containerLowest, #000)\n\t\t);\n\t\ttransition: opacity var(--schmancy-splash-transition, 500ms) ease-out;\n\t}\n\n\t.content-layer {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t\ttransition: opacity var(--schmancy-splash-transition, 500ms) ease-in-out;\n\t}\n`]\n\n\t/**\n\t * Minimum duration (ms) the splash layer stays visible. Prevents a flash\n\t * when the app loads faster than expected.\n\t */\n\t@property({ type: Number, attribute: 'min-duration' }) minDuration = 1500\n\n\t/**\n\t * When true, the splash dismisses on the `minDuration` timer alone.\n\t * When false (default), it additionally waits for an external ready signal\n\t * (a `ready` event on this element, or a call to `this.ready()`).\n\t */\n\t@property({ type: Boolean }) auto = false\n\n\t/**\n\t * When true, the splash starts hidden. Use this for imperative control.\n\t */\n\t@property({ type: Boolean, attribute: 'initially-hidden' }) initiallyHidden = false\n\n\t@state() private _visible = true\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback()\n\n\t\tif (this.initiallyHidden) {\n\t\t\tthis._visible = false\n\t\t\treturn\n\t\t}\n\n\t\tconst readySignal$ = this.auto ? of(null) : fromEvent<Event>(this, 'ready').pipe(take(1))\n\t\tconst minTimer$ = timer(this.minDuration)\n\n\t\tzip(readySignal$, minTimer$)\n\t\t\t.pipe(\n\t\t\t\ttake(1),\n\t\t\t\ttap(() => this._dismiss()),\n\t\t\t\ttakeUntil(this.disconnecting),\n\t\t\t)\n\t\t\t.subscribe()\n\t}\n\n\t/**\n\t * Imperative API: signal that the app is ready and dismiss the splash\n\t * after the minimum duration has elapsed.\n\t */\n\tpublic ready(): void {\n\t\tthis.dispatchEvent(new Event('ready'))\n\t}\n\n\t/**\n\t * Force the splash to show again (e.g. between route transitions).\n\t */\n\tpublic show(): void {\n\t\tthis._visible = true\n\t}\n\n\tprivate _dismiss(): void {\n\t\tthis._visible = false\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent<void>('schmancy-splash-done', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t}),\n\t\t)\n\t}\n\n\trender() {\n\t\treturn html`\n\t\t\t<div\n\t\t\t\tclass=\"splash-layer\"\n\t\t\t\taria-hidden=${!this._visible}\n\t\t\t\tstyle=${styleMap({\n\t\t\t\t\topacity: this._visible ? '1' : '0',\n\t\t\t\t\tpointerEvents: this._visible ? 'auto' : 'none',\n\t\t\t\t})}\n\t\t\t>\n\t\t\t\t<slot name=\"splash\"></slot>\n\t\t\t</div>\n\t\t\t<div\n\t\t\t\tclass=\"content-layer\"\n\t\t\t\tstyle=${styleMap({\n\t\t\t\t\topacity: this._visible ? '0' : '1',\n\t\t\t\t\tpointerEvents: this._visible ? 'none' : 'auto',\n\t\t\t\t})}\n\t\t\t>\n\t\t\t\t<slot></slot>\n\t\t\t</div>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-splash-screen': SchmancySplashScreen\n\t}\n}\n"],"mappings":"8PAgCe,IAAA,EAAA,cAAmC,EAAA,CAAA,CAAA,YAAA,GAAA,EAAA,CAAA,MAAA,GAAA,CAAA,EAAA,KAAA,YAiCoB,KAAA,KAAA,KAAA,CAOjC,EAAA,KAAA,gBAAA,CAK0C,EAAA,KAAA,SAAA,CAElD,CAAA,CAAA,OAAA,KAAA,OA9CZ,CAAC,EAAA,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDpB,mBAAA,CACC,MAAM,kBAAA,EAEF,KAAK,gBACR,KAAK,SAAA,CAAW,GAOjB,EAAA,EAAA,KAHqB,KAAK,MAAA,EAAA,EAAA,IAAU,IAAA,GAAI,EAAA,EAAA,WAAqB,KAAM,OAAA,EAAS,MAAA,EAAA,EAAA,MAAU,CAAA,CAAA,GAAE,EAAA,EAAA,OAChE,KAAK,WAAA,CAAA,EAG3B,MAAA,EAAA,EAAA,MACK,CAAA,GAAC,EAAA,EAAA,SACI,KAAK,SAAA,CAAA,GAAU,EAAA,EAAA,WACf,KAAK,aAAA,CAAA,EAEf,UAAA,CACH,CAMA,OAAA,CACC,KAAK,cAAc,IAAI,MAAM,OAAA,CAAA,CAC9B,CAKA,MAAA,CACC,KAAK,SAAA,CAAW,CACjB,CAEA,UAAA,CACC,KAAK,SAAA,CAAW,EAChB,KAAK,cACJ,IAAI,YAAkB,uBAAwB,CAC7C,QAAA,CAAS,EACT,SAAA,CAAU,CAAA,CAAA,CAAA,CAGb,CAEA,QAAA,CACC,MAAO,GAAA,IAAI;;;mBAGM,KAAK,SAAA;2BACH,CAChB,QAAS,KAAK,SAAW,IAAM,IAC/B,cAAe,KAAK,SAAW,OAAS,MAAA,CAAA,EAAA;;;;;;2BAOxB,CAChB,QAAS,KAAK,SAAW,IAAM,IAC/B,cAAe,KAAK,SAAW,OAAS,MAAA,CAAA,EAAA;;;;GAM5C,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAnFU,CAAE,KAAM,OAAQ,UAAW,cAAA,CAAA,CAAA,EAAgB,EAAA,UAAA,cAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAO3C,CAAE,KAAM,OAAA,CAAA,CAAA,EAAS,EAAA,UAAA,OAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAKjB,CAAE,KAAM,QAAS,UAAW,kBAAA,CAAA,CAAA,EAAoB,EAAA,UAAA,kBAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,CAAA,EAEnD,EAAA,UAAA,WAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,eAhDO,wBAAA,CAAA,EAAwB,CAAA"}
|