@mhmo91/schmancy 0.5.35 → 0.5.37

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.
Files changed (385) hide show
  1. package/ai/content-drawer.md +114 -140
  2. package/ai/navigation-bar.md +30 -4
  3. package/ai/navigation-rail.md +72 -0
  4. package/ai/theme.md +779 -716
  5. package/dist/ai/content-drawer.md +114 -140
  6. package/dist/ai/navigation-bar.md +30 -4
  7. package/dist/ai/navigation-rail.md +72 -0
  8. package/dist/ai/theme.md +779 -716
  9. package/dist/{animated-text-COvhr8E3.js → animated-text-Cfs1zx2e.js} +4 -3
  10. package/dist/{animated-text-COvhr8E3.js.map → animated-text-Cfs1zx2e.js.map} +1 -1
  11. package/dist/{animated-text-BZUrBdvN.cjs → animated-text-DoLx8YhT.cjs} +2 -2
  12. package/dist/{animated-text-BZUrBdvN.cjs.map → animated-text-DoLx8YhT.cjs.map} +1 -1
  13. package/dist/animated-text.cjs +1 -1
  14. package/dist/animated-text.js +1 -1
  15. package/dist/area.cjs +1 -1
  16. package/dist/{area.component-BHtBHWVt.js → area.component-A6Xw-dfF.js} +4 -3
  17. package/dist/{area.component-BHtBHWVt.js.map → area.component-A6Xw-dfF.js.map} +1 -1
  18. package/dist/area.component-DMRF1lD-.cjs +12 -0
  19. package/dist/{area.component-Ch2Eaa4i.cjs.map → area.component-DMRF1lD-.cjs.map} +1 -1
  20. package/dist/area.js +1 -1
  21. package/dist/{autocomplete-9RkU9LmA.js → autocomplete-C5DIxpTG.js} +18 -18
  22. package/dist/{autocomplete-9RkU9LmA.js.map → autocomplete-C5DIxpTG.js.map} +1 -1
  23. package/dist/{autocomplete-CenwFcT1.cjs → autocomplete-DkJqOYTg.cjs} +2 -2
  24. package/dist/{autocomplete-CenwFcT1.cjs.map → autocomplete-DkJqOYTg.cjs.map} +1 -1
  25. package/dist/autocomplete.cjs +1 -1
  26. package/dist/autocomplete.js +1 -1
  27. package/dist/{avatar-CjjwZDsw.js → avatar-BDy0wAek.js} +144 -134
  28. package/dist/avatar-BDy0wAek.js.map +1 -0
  29. package/dist/avatar-BmcocEQ4.cjs +306 -0
  30. package/dist/avatar-BmcocEQ4.cjs.map +1 -0
  31. package/dist/badge.cjs +1 -1
  32. package/dist/badge.js +1 -1
  33. package/dist/boat-CfIXRMn-.cjs +78 -0
  34. package/dist/boat-CfIXRMn-.cjs.map +1 -0
  35. package/dist/boat-DumUFcmT.js +276 -0
  36. package/dist/boat-DumUFcmT.js.map +1 -0
  37. package/dist/boat.cjs +1 -1
  38. package/dist/boat.js +1 -1
  39. package/dist/busy.cjs +1 -1
  40. package/dist/busy.js +1 -1
  41. package/dist/button.cjs +1 -1
  42. package/dist/button.js +1 -1
  43. package/dist/card.cjs +1 -1
  44. package/dist/card.js +1 -1
  45. package/dist/{checkbox-D6-WQeEk.js → checkbox-CHG-gT2P.js} +3 -2
  46. package/dist/{checkbox-D6-WQeEk.js.map → checkbox-CHG-gT2P.js.map} +1 -1
  47. package/dist/{checkbox-8djp_8NK.cjs → checkbox-CsMLbxBY.cjs} +2 -2
  48. package/dist/{checkbox-8djp_8NK.cjs.map → checkbox-CsMLbxBY.cjs.map} +1 -1
  49. package/dist/checkbox.cjs +1 -1
  50. package/dist/checkbox.js +1 -1
  51. package/dist/chips.cjs +1 -1
  52. package/dist/chips.js +2 -2
  53. package/dist/code-highlight.cjs +1 -1
  54. package/dist/code-highlight.js +1 -1
  55. package/dist/{code-preview-BFoEmN8y.cjs → code-preview-BgUU7bPR.cjs} +5 -5
  56. package/dist/{code-preview-BFoEmN8y.cjs.map → code-preview-BgUU7bPR.cjs.map} +1 -1
  57. package/dist/{code-preview-Z02-2suM.js → code-preview-Bp4OemTD.js} +8 -8
  58. package/dist/{code-preview-Z02-2suM.js.map → code-preview-Bp4OemTD.js.map} +1 -1
  59. package/dist/components.cjs +1 -1
  60. package/dist/components.js +1 -1
  61. package/dist/content-drawer.cjs +1 -1
  62. package/dist/content-drawer.js +1 -1
  63. package/dist/context-create-CA907mdD.cjs +2 -0
  64. package/dist/context-create-CA907mdD.cjs.map +1 -0
  65. package/dist/{context-object-BE1o2XB3.js → context-create-DCiujzV2.js} +262 -212
  66. package/dist/context-create-DCiujzV2.js.map +1 -0
  67. package/dist/{date-range-kFnTrnHN.js → date-range-BcJ0YN2n.js} +141 -140
  68. package/dist/{date-range-kFnTrnHN.js.map → date-range-BcJ0YN2n.js.map} +1 -1
  69. package/dist/{date-range-DoCtnpW6.cjs → date-range-D_DBil9n.cjs} +2 -2
  70. package/dist/{date-range-DoCtnpW6.cjs.map → date-range-D_DBil9n.cjs.map} +1 -1
  71. package/dist/date-range-inline-DQjOVUxD.cjs +44 -0
  72. package/dist/{date-range-inline-DNr7C5X-.cjs.map → date-range-inline-DQjOVUxD.cjs.map} +1 -1
  73. package/dist/{date-range-inline-BXeX6T7R.js → date-range-inline-Dqxqgu2s.js} +8 -7
  74. package/dist/{date-range-inline-BXeX6T7R.js.map → date-range-inline-Dqxqgu2s.js.map} +1 -1
  75. package/dist/date-range-inline.cjs +1 -1
  76. package/dist/date-range-inline.js +1 -1
  77. package/dist/date-range.cjs +1 -1
  78. package/dist/date-range.js +1 -1
  79. package/dist/{delay-CrdOikhP.cjs → delay-BbtlKEc4.cjs} +2 -2
  80. package/dist/{delay-CrdOikhP.cjs.map → delay-BbtlKEc4.cjs.map} +1 -1
  81. package/dist/{delay-Cz-9rZxi.js → delay-CC_14mn4.js} +2 -2
  82. package/dist/{delay-Cz-9rZxi.js.map → delay-CC_14mn4.js.map} +1 -1
  83. package/dist/delay.cjs +1 -1
  84. package/dist/delay.js +1 -1
  85. package/dist/{details-CsqhGMjL.cjs → details-CTdm7rbG.cjs} +2 -2
  86. package/dist/{details-CsqhGMjL.cjs.map → details-CTdm7rbG.cjs.map} +1 -1
  87. package/dist/{details-DeBtsJlp.js → details-dk2hnRIp.js} +3 -2
  88. package/dist/{details-DeBtsJlp.js.map → details-dk2hnRIp.js.map} +1 -1
  89. package/dist/details.cjs +1 -1
  90. package/dist/details.js +1 -1
  91. package/dist/{dialog-content-DTKdAF_l.js → dialog-content-BM-lfqHq.js} +4 -4
  92. package/dist/{dialog-content-DTKdAF_l.js.map → dialog-content-BM-lfqHq.js.map} +1 -1
  93. package/dist/{dialog-content-BzSQoM2J.cjs → dialog-content-BSZ5dwnP.cjs} +2 -2
  94. package/dist/{dialog-content-BzSQoM2J.cjs.map → dialog-content-BSZ5dwnP.cjs.map} +1 -1
  95. package/dist/dialog.cjs +1 -1
  96. package/dist/dialog.js +1 -1
  97. package/dist/discovery.cjs +2 -0
  98. package/dist/discovery.cjs.map +1 -0
  99. package/dist/discovery.js +6 -0
  100. package/dist/discovery.js.map +1 -0
  101. package/dist/discovery.service-BbYjU5x8.js +21 -0
  102. package/dist/discovery.service-BbYjU5x8.js.map +1 -0
  103. package/dist/discovery.service-BpGCuXPd.cjs +2 -0
  104. package/dist/discovery.service-BpGCuXPd.cjs.map +1 -0
  105. package/dist/{divider-7iyyEd8k.js → divider-BWVdeJm1.js} +4 -3
  106. package/dist/{divider-7iyyEd8k.js.map → divider-BWVdeJm1.js.map} +1 -1
  107. package/dist/divider-DgJXEKxB.cjs +2 -0
  108. package/dist/{divider-CNxOc8ep.cjs.map → divider-DgJXEKxB.cjs.map} +1 -1
  109. package/dist/divider.cjs +1 -1
  110. package/dist/divider.js +1 -1
  111. package/dist/{dropdown-content-_GMpqsNq.js → dropdown-content-BgLy9dwU.js} +4 -3
  112. package/dist/{dropdown-content-_GMpqsNq.js.map → dropdown-content-BgLy9dwU.js.map} +1 -1
  113. package/dist/{dropdown-content-De0OkNoq.cjs → dropdown-content-ZAB82v-h.cjs} +2 -2
  114. package/dist/{dropdown-content-De0OkNoq.cjs.map → dropdown-content-ZAB82v-h.cjs.map} +1 -1
  115. package/dist/dropdown.cjs +1 -1
  116. package/dist/dropdown.js +1 -1
  117. package/dist/{email-recipients-CPZlUiRR.js → email-recipients-IXQLqBaI.js} +6 -5
  118. package/dist/{email-recipients-CPZlUiRR.js.map → email-recipients-IXQLqBaI.js.map} +1 -1
  119. package/dist/{email-recipients-DS01C3V3.cjs → email-recipients-R7jCXy_I.cjs} +2 -2
  120. package/dist/{email-recipients-DS01C3V3.cjs.map → email-recipients-R7jCXy_I.cjs.map} +1 -1
  121. package/dist/extra.cjs +1 -1
  122. package/dist/extra.js +1 -1
  123. package/dist/{flex-BeSoRNTu.js → flex-Cp1nomar.js} +3 -2
  124. package/dist/{flex-BeSoRNTu.js.map → flex-Cp1nomar.js.map} +1 -1
  125. package/dist/{flex-CHf9Gc5V.cjs → flex-sAQsXdsk.cjs} +2 -2
  126. package/dist/{flex-CHf9Gc5V.cjs.map → flex-sAQsXdsk.cjs.map} +1 -1
  127. package/dist/form-DHTbrnEl.cjs +2 -0
  128. package/dist/{form-DzDksPgv.cjs.map → form-DHTbrnEl.cjs.map} +1 -1
  129. package/dist/{form-DNeKagke.js → form-Dtc128QU.js} +3 -2
  130. package/dist/{form-DNeKagke.js.map → form-Dtc128QU.js.map} +1 -1
  131. package/dist/form.cjs +1 -1
  132. package/dist/form.js +1 -1
  133. package/dist/{formField.mixin-BNj75WQ4.js → formField.mixin-CCB_CKYb.js} +2 -2
  134. package/dist/{formField.mixin-BNj75WQ4.js.map → formField.mixin-CCB_CKYb.js.map} +1 -1
  135. package/dist/{formField.mixin-D5YAYIS1.cjs → formField.mixin-CZQ7alVs.cjs} +2 -2
  136. package/dist/{formField.mixin-D5YAYIS1.cjs.map → formField.mixin-CZQ7alVs.cjs.map} +1 -1
  137. package/dist/{icon-CCMpTJTp.js → icon-BHhOyVjB.js} +9 -9
  138. package/dist/{icon-CCMpTJTp.js.map → icon-BHhOyVjB.js.map} +1 -1
  139. package/dist/{icon-DebIySqv.cjs → icon-CocdSdlX.cjs} +3 -3
  140. package/dist/{icon-DebIySqv.cjs.map → icon-CocdSdlX.cjs.map} +1 -1
  141. package/dist/{icon-button-D6DH52j4.js → icon-button-CjSaBrg0.js} +4 -3
  142. package/dist/{icon-button-D6DH52j4.js.map → icon-button-CjSaBrg0.js.map} +1 -1
  143. package/dist/{icon-button-DwnnW2oj.cjs → icon-button-m8kXxOvS.cjs} +2 -2
  144. package/dist/{icon-button-DwnnW2oj.cjs.map → icon-button-m8kXxOvS.cjs.map} +1 -1
  145. package/dist/icons.cjs +1 -1
  146. package/dist/icons.js +1 -1
  147. package/dist/index.cjs +1 -1
  148. package/dist/index.js +187 -182
  149. package/dist/index.js.map +1 -1
  150. package/dist/input-BuDPnk5e.cjs +51 -0
  151. package/dist/{input-C2Vz-51i.cjs.map → input-BuDPnk5e.cjs.map} +1 -1
  152. package/dist/{input-DtHPCCyd.js → input-D_gdNxxR.js} +4 -3
  153. package/dist/{input-DtHPCCyd.js.map → input-D_gdNxxR.js.map} +1 -1
  154. package/dist/{input-chip-B7ANrtLF.cjs → input-chip-CDLblIp9.cjs} +2 -2
  155. package/dist/{input-chip-B7ANrtLF.cjs.map → input-chip-CDLblIp9.cjs.map} +1 -1
  156. package/dist/{input-chip-DbIvSyvP.js → input-chip-CLnR4vSR.js} +2 -2
  157. package/dist/{input-chip-DbIvSyvP.js.map → input-chip-CLnR4vSR.js.map} +1 -1
  158. package/dist/input.cjs +1 -1
  159. package/dist/input.js +1 -1
  160. package/dist/layout.cjs +1 -1
  161. package/dist/layout.js +1 -1
  162. package/dist/{list-BBo0--_Q.js → list-C069T9ey.js} +3 -2
  163. package/dist/{list-BBo0--_Q.js.map → list-C069T9ey.js.map} +1 -1
  164. package/dist/{list-BH8OJ3Rv.cjs → list-KCakyWxw.cjs} +2 -2
  165. package/dist/{list-BH8OJ3Rv.cjs.map → list-KCakyWxw.cjs.map} +1 -1
  166. package/dist/list.cjs +1 -1
  167. package/dist/list.js +1 -1
  168. package/dist/{litElement.mixin-LplXbzd8.cjs → litElement.mixin-DoBMt4ia.cjs} +2 -2
  169. package/dist/{litElement.mixin-LplXbzd8.cjs.map → litElement.mixin-DoBMt4ia.cjs.map} +1 -1
  170. package/dist/{litElement.mixin-CzF0mNQd.js → litElement.mixin-Dp4mBSNw.js} +2 -2
  171. package/dist/{litElement.mixin-CzF0mNQd.js.map → litElement.mixin-Dp4mBSNw.js.map} +1 -1
  172. package/dist/mailbox.cjs +1 -1
  173. package/dist/mailbox.js +1 -1
  174. package/dist/{map-DeiCBxMP.js → map-pn_6ziZf.js} +19 -19
  175. package/dist/{map-DeiCBxMP.js.map → map-pn_6ziZf.js.map} +1 -1
  176. package/dist/{map-C7lxYU4A.cjs → map-vNMrrat-.cjs} +2 -2
  177. package/dist/{map-C7lxYU4A.cjs.map → map-vNMrrat-.cjs.map} +1 -1
  178. package/dist/map.cjs +1 -1
  179. package/dist/map.js +1 -1
  180. package/dist/{media-CsYVcfaX.cjs → media-CAtXPif3.cjs} +6 -6
  181. package/dist/{media-CsYVcfaX.cjs.map → media-CAtXPif3.cjs.map} +1 -1
  182. package/dist/{media-CEnaqjig.js → media-DC3r4y8-.js} +9 -8
  183. package/dist/{media-CEnaqjig.js.map → media-DC3r4y8-.js.map} +1 -1
  184. package/dist/{menu-wtkHGlyc.js → menu-BAs2snSu.js} +4 -3
  185. package/dist/{menu-wtkHGlyc.js.map → menu-BAs2snSu.js.map} +1 -1
  186. package/dist/{menu-Boqsyfmh.cjs → menu-C2ZKJe1g.cjs} +2 -2
  187. package/dist/{menu-Boqsyfmh.cjs.map → menu-C2ZKJe1g.cjs.map} +1 -1
  188. package/dist/menu.cjs +1 -1
  189. package/dist/menu.js +1 -1
  190. package/dist/mixins/baseElement.ts +33 -1
  191. package/dist/mixins/discovery.service.ts +60 -0
  192. package/dist/nav-drawer.cjs +1 -1
  193. package/dist/nav-drawer.js +1 -1
  194. package/dist/navigation-bar.cjs +1 -1
  195. package/dist/navigation-bar.js +1 -1
  196. package/dist/{navigation-rail-6ONc-XE-.cjs → navigation-rail-B0zofile.cjs} +14 -11
  197. package/dist/navigation-rail-B0zofile.cjs.map +1 -0
  198. package/dist/{navigation-rail-D-lK9oVd.js → navigation-rail-KdVjbO1I.js} +43 -31
  199. package/dist/navigation-rail-KdVjbO1I.js.map +1 -0
  200. package/dist/navigation-rail.cjs +1 -1
  201. package/dist/navigation-rail.js +1 -1
  202. package/dist/{notification-service-ZiGUSd63.js → notification-service-BOCdK7B0.js} +7 -6
  203. package/dist/{notification-service-ZiGUSd63.js.map → notification-service-BOCdK7B0.js.map} +1 -1
  204. package/dist/{notification-service-9HXSKWcw.cjs → notification-service-DXsySIdG.cjs} +2 -2
  205. package/dist/{notification-service-9HXSKWcw.cjs.map → notification-service-DXsySIdG.cjs.map} +1 -1
  206. package/dist/notification.cjs +1 -1
  207. package/dist/notification.js +2 -2
  208. package/dist/{notify-DbfX6Z2P.js → notify-Cglpgay3.js} +2 -2
  209. package/dist/{notify-DbfX6Z2P.js.map → notify-Cglpgay3.js.map} +1 -1
  210. package/dist/{notify-W-NrP0cC.cjs → notify-CvDL-o79.cjs} +2 -2
  211. package/dist/{notify-W-NrP0cC.cjs.map → notify-CvDL-o79.cjs.map} +1 -1
  212. package/dist/{option-D2bxihLu.cjs → option-ezGy71aI.cjs} +2 -2
  213. package/dist/{option-D2bxihLu.cjs.map → option-ezGy71aI.cjs.map} +1 -1
  214. package/dist/{option-BFlWiCu0.js → option-tDU1Z_vP.js} +11 -10
  215. package/dist/{option-BFlWiCu0.js.map → option-tDU1Z_vP.js.map} +1 -1
  216. package/dist/option.cjs +1 -1
  217. package/dist/option.js +1 -1
  218. package/dist/payment-card-form-B5b-LA2Y.cjs +74 -0
  219. package/dist/{payment-card-form--v94EhJF.cjs.map → payment-card-form-B5b-LA2Y.cjs.map} +1 -1
  220. package/dist/{payment-card-form-DLRNX9NX.js → payment-card-form-CZpc-zfO.js} +4 -3
  221. package/dist/{payment-card-form-DLRNX9NX.js.map → payment-card-form-CZpc-zfO.js.map} +1 -1
  222. package/dist/{progress-BYohUvYO.js → progress-Bqih11TQ.js} +10 -9
  223. package/dist/{progress-BYohUvYO.js.map → progress-Bqih11TQ.js.map} +1 -1
  224. package/dist/{progress-CjkD8QBy.cjs → progress-OMGbiNv5.cjs} +2 -2
  225. package/dist/{progress-CjkD8QBy.cjs.map → progress-OMGbiNv5.cjs.map} +1 -1
  226. package/dist/progress.cjs +1 -1
  227. package/dist/progress.js +1 -1
  228. package/dist/{radio-button-CGmGOAil.cjs → radio-button-BuSpPTO4.cjs} +2 -2
  229. package/dist/{radio-button-CGmGOAil.cjs.map → radio-button-BuSpPTO4.cjs.map} +1 -1
  230. package/dist/{radio-button-BlxeCjdq.js → radio-button-mHT1573u.js} +4 -3
  231. package/dist/{radio-button-BlxeCjdq.js.map → radio-button-mHT1573u.js.map} +1 -1
  232. package/dist/radio-group.cjs +1 -1
  233. package/dist/radio-group.js +1 -1
  234. package/dist/{schmancy-steps-container-CydL78yk.cjs → schmancy-steps-container-Bht_BlLU.cjs} +2 -2
  235. package/dist/{schmancy-steps-container-CydL78yk.cjs.map → schmancy-steps-container-Bht_BlLU.cjs.map} +1 -1
  236. package/dist/{schmancy-steps-container-BtAHCm73.js → schmancy-steps-container-DDMiJJyw.js} +2 -2
  237. package/dist/{schmancy-steps-container-BtAHCm73.js.map → schmancy-steps-container-DDMiJJyw.js.map} +1 -1
  238. package/dist/{select-BiN334GN.js → select-CKtpFPTr.js} +13 -13
  239. package/dist/{select-BiN334GN.js.map → select-CKtpFPTr.js.map} +1 -1
  240. package/dist/{select-CrB02cIO.cjs → select-HPtumqyg.cjs} +2 -2
  241. package/dist/{select-CrB02cIO.cjs.map → select-HPtumqyg.cjs.map} +1 -1
  242. package/dist/select.cjs +1 -1
  243. package/dist/select.js +1 -1
  244. package/dist/selector-hook-BWMY8npH.cjs +2 -0
  245. package/dist/selector-hook-BWMY8npH.cjs.map +1 -0
  246. package/dist/selector-hook-CKeyK4K-.js +313 -0
  247. package/dist/selector-hook-CKeyK4K-.js.map +1 -0
  248. package/dist/{sheet-DpJv4DRi.js → sheet-B-vTiTi8.js} +4 -3
  249. package/dist/{sheet-DpJv4DRi.js.map → sheet-B-vTiTi8.js.map} +1 -1
  250. package/dist/{sheet-sgVoRMi1.cjs → sheet-DP7nFOEo.cjs} +2 -2
  251. package/dist/{sheet-sgVoRMi1.cjs.map → sheet-DP7nFOEo.cjs.map} +1 -1
  252. package/dist/sheet.cjs +1 -1
  253. package/dist/sheet.js +1 -1
  254. package/dist/{slider-D7qdxfvX.js → slider-Bu7kQ0_w.js} +9 -9
  255. package/dist/{slider-D7qdxfvX.js.map → slider-Bu7kQ0_w.js.map} +1 -1
  256. package/dist/{slider-Dd1L6oYm.cjs → slider-Diqgkt3E.cjs} +4 -4
  257. package/dist/{slider-Dd1L6oYm.cjs.map → slider-Diqgkt3E.cjs.map} +1 -1
  258. package/dist/slider.cjs +1 -1
  259. package/dist/slider.js +1 -1
  260. package/dist/{spinner-CaXU45TV.cjs → spinner-b6hiAljR.cjs} +2 -2
  261. package/dist/{spinner-CaXU45TV.cjs.map → spinner-b6hiAljR.cjs.map} +1 -1
  262. package/dist/{spinner-XN4W5ihQ.js → spinner-paAzgY93.js} +3 -2
  263. package/dist/{spinner-XN4W5ihQ.js.map → spinner-paAzgY93.js.map} +1 -1
  264. package/dist/steps.cjs +1 -1
  265. package/dist/steps.js +1 -1
  266. package/dist/store.cjs +1 -1
  267. package/dist/store.js +26 -26
  268. package/dist/{suggestion-chip-PI24Hc3s.cjs → suggestion-chip--FVeCUSI.cjs} +2 -2
  269. package/dist/{suggestion-chip-PI24Hc3s.cjs.map → suggestion-chip--FVeCUSI.cjs.map} +1 -1
  270. package/dist/{suggestion-chip-CdhoATv9.js → suggestion-chip-DnnfUAqx.js} +3 -3
  271. package/dist/{suggestion-chip-CdhoATv9.js.map → suggestion-chip-DnnfUAqx.js.map} +1 -1
  272. package/dist/{surface-CKrYJ58l.js → surface-BBhAIoZq.js} +2 -2
  273. package/dist/{surface-CKrYJ58l.js.map → surface-BBhAIoZq.js.map} +1 -1
  274. package/dist/{surface-Ax6I7ldp.cjs → surface-SICYUsoB.cjs} +2 -2
  275. package/dist/{surface-Ax6I7ldp.cjs.map → surface-SICYUsoB.cjs.map} +1 -1
  276. package/dist/surface.cjs +1 -1
  277. package/dist/surface.js +1 -1
  278. package/dist/{table-CP6_NkPm.js → table-CepjNGT6.js} +2 -2
  279. package/dist/{table-CP6_NkPm.js.map → table-CepjNGT6.js.map} +1 -1
  280. package/dist/{table-BlwUyf_4.cjs → table-yYKET4qQ.cjs} +2 -2
  281. package/dist/{table-BlwUyf_4.cjs.map → table-yYKET4qQ.cjs.map} +1 -1
  282. package/dist/table.cjs +1 -1
  283. package/dist/table.js +1 -1
  284. package/dist/{tabs-compatibility-CX0cIu_Y.cjs → tabs-compatibility-BWaRkr9s.cjs} +4 -4
  285. package/dist/{tabs-compatibility-CX0cIu_Y.cjs.map → tabs-compatibility-BWaRkr9s.cjs.map} +1 -1
  286. package/dist/{tabs-compatibility-7QKuXX4i.js → tabs-compatibility-BXdyrybs.js} +7 -6
  287. package/dist/{tabs-compatibility-7QKuXX4i.js.map → tabs-compatibility-BXdyrybs.js.map} +1 -1
  288. package/dist/tabs.cjs +1 -1
  289. package/dist/tabs.js +1 -1
  290. package/dist/tailwind.mixin-CYhJgwwb.cjs +2 -0
  291. package/dist/tailwind.mixin-CYhJgwwb.cjs.map +1 -0
  292. package/dist/tailwind.mixin-Cn7vup-6.js +64 -0
  293. package/dist/tailwind.mixin-Cn7vup-6.js.map +1 -0
  294. package/dist/teleport.cjs +1 -1
  295. package/dist/teleport.js +1 -1
  296. package/dist/{textarea-DHrDn-O6.js → textarea-BpNEwBP9.js} +3 -2
  297. package/dist/{textarea-DHrDn-O6.js.map → textarea-BpNEwBP9.js.map} +1 -1
  298. package/dist/textarea-Xgbs3rjA.cjs +44 -0
  299. package/dist/{textarea-qLA0vP78.cjs.map → textarea-Xgbs3rjA.cjs.map} +1 -1
  300. package/dist/textarea.cjs +1 -1
  301. package/dist/textarea.js +1 -1
  302. package/dist/{theme-button-BEUsbH5m.js → theme-button-77xbTIaH.js} +6 -5
  303. package/dist/{theme-button-BEUsbH5m.js.map → theme-button-77xbTIaH.js.map} +1 -1
  304. package/dist/theme-button-BsjsULjH.cjs +9 -0
  305. package/dist/{theme-button-D7fBEUGf.cjs.map → theme-button-BsjsULjH.cjs.map} +1 -1
  306. package/dist/theme-button.cjs +1 -1
  307. package/dist/theme-button.js +1 -1
  308. package/dist/theme.cjs +1 -1
  309. package/dist/theme.controls-BeNS8iSM.cjs +67 -0
  310. package/dist/theme.controls-BeNS8iSM.cjs.map +1 -0
  311. package/dist/{theme.component-ByGua01V.js → theme.controls-DtcpHuz9.js} +367 -238
  312. package/dist/theme.controls-DtcpHuz9.js.map +1 -0
  313. package/dist/theme.js +13 -11
  314. package/dist/{timezone-BpDMR26D.js → timezone-CtH2a7Hw.js} +10 -9
  315. package/dist/{timezone-BpDMR26D.js.map → timezone-CtH2a7Hw.js.map} +1 -1
  316. package/dist/{timezone-Bw4EXBt7.cjs → timezone-D3kdUX6c.cjs} +2 -2
  317. package/dist/{timezone-Bw4EXBt7.cjs.map → timezone-D3kdUX6c.cjs.map} +1 -1
  318. package/dist/{tooltip-Dhs4HL3A.cjs → tooltip-BwZ_zIEI.cjs} +2 -2
  319. package/dist/{tooltip-Dhs4HL3A.cjs.map → tooltip-BwZ_zIEI.cjs.map} +1 -1
  320. package/dist/{tooltip-B1jynZOH.js → tooltip-DgGZouB5.js} +2 -2
  321. package/dist/{tooltip-B1jynZOH.js.map → tooltip-DgGZouB5.js.map} +1 -1
  322. package/dist/tooltip.cjs +1 -1
  323. package/dist/tooltip.js +1 -1
  324. package/dist/{tree-D-ezei_U.cjs → tree-B9fWtaGW.cjs} +4 -4
  325. package/dist/{tree-D-ezei_U.cjs.map → tree-B9fWtaGW.cjs.map} +1 -1
  326. package/dist/{tree-BH1qCJ_U.js → tree-BSENnhB2.js} +3 -2
  327. package/dist/{tree-BH1qCJ_U.js.map → tree-BSENnhB2.js.map} +1 -1
  328. package/dist/tree.cjs +1 -1
  329. package/dist/tree.js +1 -1
  330. package/dist/{typewriter-DQbpNPtY.js → typewriter-BCXtlffJ.js} +5 -4
  331. package/dist/{typewriter-DQbpNPtY.js.map → typewriter-BCXtlffJ.js.map} +1 -1
  332. package/dist/typewriter-DeNR2E_p.cjs +9 -0
  333. package/dist/{typewriter-CtPh4Pyj.cjs.map → typewriter-DeNR2E_p.cjs.map} +1 -1
  334. package/dist/typewriter.cjs +1 -1
  335. package/dist/typewriter.js +1 -1
  336. package/dist/{typography-BrIaOYmC.cjs → typography-Cm7pGqRe.cjs} +2 -2
  337. package/dist/{typography-BrIaOYmC.cjs.map → typography-Cm7pGqRe.cjs.map} +1 -1
  338. package/dist/{typography-D71cmr0R.js → typography-sxQLtA6a.js} +2 -2
  339. package/dist/{typography-D71cmr0R.js.map → typography-sxQLtA6a.js.map} +1 -1
  340. package/dist/typography.cjs +1 -1
  341. package/dist/typography.js +1 -1
  342. package/package.json +1 -1
  343. package/types/mixins/baseElement.d.ts +2 -1
  344. package/types/mixins/discovery.service.d.ts +17 -0
  345. package/types/src/boat/boat.d.ts +10 -5
  346. package/types/src/discovery/discovery.service.d.ts +17 -0
  347. package/types/src/discovery/index.d.ts +1 -0
  348. package/types/src/index.d.ts +1 -0
  349. package/types/src/navigation-bar/navigation-bar.d.ts +15 -1
  350. package/types/src/navigation-rail/navigation-rail.d.ts +13 -0
  351. package/types/src/theme/index.d.ts +1 -0
  352. package/types/src/theme/theme.controls.d.ts +27 -0
  353. package/types/src/theme/theme.service.d.ts +58 -2
  354. package/dist/area.component-Ch2Eaa4i.cjs +0 -12
  355. package/dist/avatar-CjjwZDsw.js.map +0 -1
  356. package/dist/avatar-DlhBTIc8.cjs +0 -303
  357. package/dist/avatar-DlhBTIc8.cjs.map +0 -1
  358. package/dist/boat-CUsJXaLf.js +0 -240
  359. package/dist/boat-CUsJXaLf.js.map +0 -1
  360. package/dist/boat-Dfx9-P8c.cjs +0 -83
  361. package/dist/boat-Dfx9-P8c.cjs.map +0 -1
  362. package/dist/context-object-BE1o2XB3.js.map +0 -1
  363. package/dist/context-object-DA9DM9QJ.cjs +0 -2
  364. package/dist/context-object-DA9DM9QJ.cjs.map +0 -1
  365. package/dist/date-range-inline-DNr7C5X-.cjs +0 -44
  366. package/dist/divider-CNxOc8ep.cjs +0 -2
  367. package/dist/form-DzDksPgv.cjs +0 -2
  368. package/dist/input-C2Vz-51i.cjs +0 -51
  369. package/dist/navigation-rail-6ONc-XE-.cjs.map +0 -1
  370. package/dist/navigation-rail-D-lK9oVd.js.map +0 -1
  371. package/dist/payment-card-form--v94EhJF.cjs +0 -74
  372. package/dist/selector-hook-DOsvFxG2.js +0 -364
  373. package/dist/selector-hook-DOsvFxG2.js.map +0 -1
  374. package/dist/selector-hook-DQ9zoDM4.cjs +0 -2
  375. package/dist/selector-hook-DQ9zoDM4.cjs.map +0 -1
  376. package/dist/tailwind.mixin-BjDGMGbj.js +0 -43
  377. package/dist/tailwind.mixin-BjDGMGbj.js.map +0 -1
  378. package/dist/tailwind.mixin-ClfV2_Nh.cjs +0 -2
  379. package/dist/tailwind.mixin-ClfV2_Nh.cjs.map +0 -1
  380. package/dist/textarea-qLA0vP78.cjs +0 -44
  381. package/dist/theme-button-D7fBEUGf.cjs +0 -9
  382. package/dist/theme.component-ByGua01V.js.map +0 -1
  383. package/dist/theme.component-CQ1trrZB.cjs +0 -3
  384. package/dist/theme.component-CQ1trrZB.cjs.map +0 -1
  385. package/dist/typewriter-CtPh4Pyj.cjs +0 -9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigation-rail-KdVjbO1I.js","sources":["../src/navigation-rail/navigation-rail-item.ts","../src/navigation-rail/navigation-rail.ts"],"sourcesContent":["import { $LitElement } from '@mixins/index'\r\nimport { html, PropertyValues } from 'lit'\r\nimport { customElement, property, state } from 'lit/decorators.js'\r\nimport { when } from 'lit/directives/when.js'\r\nimport { BehaviorSubject, fromEvent, merge, takeUntil } from 'rxjs'\r\nimport { delay, distinctUntilChanged, tap } from 'rxjs/operators'\r\n\r\nexport type NavigationRailItemClickEvent = CustomEvent<{\r\n\ticon: string\r\n\tlabel: string\r\n\tvalue: string\r\n\tactive: boolean\r\n}>\r\n\r\n/**\r\n * Material Design 3 Navigation Rail Item Component\r\n * @see https://m3.material.io/components/navigation-rail/overview\r\n *\r\n * `<schmancy-navigation-rail-item>` component\r\n *\r\n * Individual navigation item for use within a navigation rail.\r\n * Represents a single destination or action with an icon and optional label.\r\n *\r\n * @element schmancy-navigation-rail-item\r\n * @slot icon - Slot for the navigation item icon (e.g., schmancy-icon)\r\n * @slot - Default slot for custom content\r\n * @slot badge - Custom badge content\r\n *\r\n * @fires navigate - When the item is clicked\r\n *\r\n * @csspart container - The main item container\r\n * @csspart indicator - The active indicator\r\n * @csspart icon - The icon container\r\n * @csspart label - The label text\r\n * @csspart badge - The badge element\r\n *\r\n * @example\r\n * <schmancy-navigation-rail-item\r\n * icon=\"home\"\r\n * label=\"Home\"\r\n * value=\"/home\"\r\n * badge=\"3\"\r\n * active>\r\n * </schmancy-navigation-rail-item>\r\n *\r\n * @example\r\n * <!-- Using 'selected' alias -->\r\n * <schmancy-navigation-rail-item\r\n * icon=\"settings\"\r\n * label=\"Settings\"\r\n * value=\"/settings\"\r\n * selected>\r\n * </schmancy-navigation-rail-item>\r\n *\r\n * @example\r\n * <!-- With custom icon -->\r\n * <schmancy-navigation-rail-item label=\"Dashboard\">\r\n * <schmancy-icon slot=\"icon\">dashboard</schmancy-icon>\r\n * </schmancy-navigation-rail-item>\r\n */\r\n@customElement('schmancy-navigation-rail-item')\r\nexport class SchmancyNavigationRailItem extends $LitElement() {\r\n\t// Observable state\r\n\tprivate hovering$ = new BehaviorSubject<boolean>(false)\r\n\tprivate pressing$ = new BehaviorSubject<boolean>(false)\r\n\tprivate active$ = new BehaviorSubject<boolean>(false)\r\n\r\n\t// Properties\r\n\t/**\r\n\t * Icon name (Material Symbols icon)\r\n\t */\r\n\t@property({ type: String })\r\n\ticon = ''\r\n\r\n\t/**\r\n\t * Label text for the navigation item\r\n\t */\r\n\t@property({ type: String })\r\n\tlabel = ''\r\n\r\n\t/**\r\n\t * Value associated with this item (useful for routing)\r\n\t */\r\n\t@property({ type: String })\r\n\tvalue = ''\r\n\r\n\t/**\r\n\t * Whether this item is currently active/selected\r\n\t * @default false\r\n\t */\r\n\t@property({ type: Boolean, reflect: true })\r\n\tget active() { return this.active$.value }\r\n\tset active(value: boolean) {\r\n\t\tthis.active$.next(value)\r\n\t}\r\n\r\n\t/**\r\n\t * Whether this item is currently selected (alias for active)\r\n\t * @default false\r\n\t */\r\n\t@property({ type: Boolean, reflect: true })\r\n\tget selected() { return this.active }\r\n\tset selected(value: boolean) { this.active = value }\r\n\r\n\t/**\r\n\t * Badge text or number to display\r\n\t */\r\n\t@property({ type: String })\r\n\tbadge = ''\r\n\r\n\t/**\r\n\t * Badge variant\r\n\t */\r\n\t@property({ type: String })\r\n\tbadgeVariant: 'error' | 'primary' | 'secondary' = 'error'\r\n\r\n\t/**\r\n\t * Whether to show the label (controlled by parent rail)\r\n\t * @default false\r\n\t */\r\n\t@property({ type: Boolean, attribute: 'show-label' })\r\n\tshowLabel = false\r\n\r\n\t/**\r\n\t * Whether this item is disabled\r\n\t * @default false\r\n\t */\r\n\t@property({ type: Boolean, reflect: true })\r\n\tdisabled = false\r\n\r\n\t/**\r\n\t * Whether this is a nested item (sub-navigation)\r\n\t * @default false\r\n\t */\r\n\t@property({ type: Boolean, reflect: true })\r\n\tnested = false\r\n\r\n\t/**\r\n\t * Whether this item represents a group separator\r\n\t * @default false\r\n\t */\r\n\t@property({ type: Boolean, reflect: true })\r\n\tgroup = false\r\n\r\n\t// State\r\n\t@state()\r\n\tprivate showRipple = false\r\n\r\n\r\n\tconnectedCallback() {\r\n\t\tsuper.connectedCallback()\r\n\r\n\t\t// Set up hover tracking\r\n\t\tmerge(\r\n\t\t\tfromEvent(this, 'mouseenter').pipe(tap(() => this.hovering$.next(true))),\r\n\t\t\tfromEvent(this, 'mouseleave').pipe(tap(() => this.hovering$.next(false)))\r\n\t\t).pipe(takeUntil(this.disconnecting)).subscribe()\r\n\r\n\t\t// Set up press tracking\r\n\t\tmerge(\r\n\t\t\tfromEvent(this, 'mousedown').pipe(tap(() => this.pressing$.next(true))),\r\n\t\t\tfromEvent(this, 'mouseup').pipe(tap(() => this.pressing$.next(false))),\r\n\t\t\tfromEvent(this, 'mouseleave').pipe(tap(() => this.pressing$.next(false)))\r\n\t\t).pipe(takeUntil(this.disconnecting)).subscribe()\r\n\r\n\r\n\t\t// Ripple effect with M3 timing\r\n\t\tthis.pressing$.pipe(\r\n\t\t\ttap(pressing => {\r\n\t\t\t\tif (pressing && !this.disabled) {\r\n\t\t\t\t\tthis.showRipple = true\r\n\t\t\t\t}\r\n\t\t\t}),\r\n\t\t\t// M3 standard ripple duration\r\n\t\t\tdelay(600),\r\n\t\t\ttap(() => this.showRipple = false),\r\n\t\t\ttakeUntil(this.disconnecting)\r\n\t\t).subscribe()\r\n\r\n\t\t// Subscribe to active state changes for reactive updates\r\n\t\tthis.active$.pipe(\r\n\t\t\tdistinctUntilChanged(),\r\n\t\t\ttap((isActive) => {\r\n\t\t\t\tthis.requestUpdate()\r\n\t\t\t\t// Update ARIA attributes reactively\r\n\t\t\t\tthis.setAttribute('aria-selected', String(isActive))\r\n\t\t\t\tthis.setAttribute('tabindex', isActive ? '0' : '-1')\r\n\t\t\t}),\r\n\t\t\ttakeUntil(this.disconnecting)\r\n\t\t).subscribe()\r\n\r\n\t\t// Set ARIA attributes\r\n\t\tthis.setAttribute('role', 'listitem')\r\n\t\tif (!this.hasAttribute('tabindex')) {\r\n\t\t\tthis.setAttribute('tabindex', this.active ? '0' : '-1')\r\n\t\t}\r\n\t}\r\n\r\n\tupdated(changedProperties: PropertyValues) {\r\n\t\tsuper.updated(changedProperties)\r\n\r\n\t\t// Active state is now handled by the BehaviorSubject subscription\r\n\t\t// So we don't need to duplicate it here\r\n\r\n\t\tif (changedProperties.has('disabled')) {\r\n\t\t\tthis.setAttribute('aria-disabled', String(this.disabled))\r\n\t\t}\r\n\r\n\t\tif (changedProperties.has('label')) {\r\n\t\t\tthis.setAttribute('aria-label', this.label)\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Handle click events\r\n\t */\r\n\tprivate handleClick(event: Event) {\r\n\t\tif (this.disabled) {\r\n\t\t\tevent.preventDefault()\r\n\t\t\tevent.stopPropagation()\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\t// Emit navigate event with the value\r\n\t\tthis.dispatchEvent(new CustomEvent('navigate', {\r\n\t\t\tdetail: this.value || this.label,\r\n\t\t\tbubbles: true,\r\n\t\t\tcomposed: true\r\n\t\t}))\r\n\r\n\t\t// Visual feedback is handled by the ripple effect in connectedCallback\r\n\t\t// The parent rail will confirm and update via activeIndex\r\n\t}\r\n\r\n\t/**\r\n\t * Handle keyboard events\r\n\t */\r\n\tprivate handleKeyDown(event: KeyboardEvent) {\r\n\t\tif (this.disabled) return\r\n\r\n\t\tif (event.key === 'Enter' || event.key === ' ') {\r\n\t\t\tevent.preventDefault()\r\n\t\t\tthis.click()\r\n\t\t}\r\n\t}\r\n\r\n\tprotected render() {\r\n\t\tconst hasCustomIcon = this.querySelector('[slot=\"icon\"]')\r\n\t\tconst hasCustomContent = this.querySelector(':not([slot])')\r\n\t\tconst hasCustomBadge = this.querySelector('[slot=\"badge\"]')\r\n\r\n\t\t// M3 Navigation Rail Item classes with theme integration\r\n\t\tconst containerClasses = this.classMap({\r\n\t\t\t// Layout & Spacing (M3 56px height, 12px vertical padding)\r\n\t\t\t'flex flex-col items-center justify-center': true,\r\n\t\t\t'min-h-14 w-full': true, // min-h-14 = 56px\r\n\t\t\t'py-3': true, // py-3 = 12px top/bottom\r\n\t\t\t'gap-1': true, // gap-1 = 4px\r\n\r\n\t\t\t// M3 Shape & Interaction\r\n\t\t\t'rounded-lg': true, // M3 large corner radius\r\n\t\t\t'cursor-pointer': true,\r\n\t\t\t'relative': true,\r\n\t\t\t'select-none': true,\r\n\t\t\t'box-border': true,\r\n\r\n\t\t\t// Colors & States\r\n\t\t\t'text-surface-onVariant': !this.active,\r\n\t\t\t'text-secondary-onContainer': this.active,\r\n\t\t\t'hover:bg-surface-containerHighest': true,\r\n\r\n\t\t\t// Transitions (M3 emphasized motion)\r\n\t\t\t'transition-all duration-150 ease-out': true,\r\n\r\n\t\t\t// Disabled state\r\n\t\t\t'pointer-events-none opacity-38': this.disabled,\r\n\r\n\t\t\t// Active ripple effect\r\n\t\t\t'[&>.ripple]:scale-100': this.showRipple,\r\n\r\n\t\t\t// Nested item adjustments\r\n\t\t\t'min-h-12 pl-8': this.nested, // 48px height, 32px left padding for nested\r\n\r\n\t\t\t// Group separator\r\n\t\t\t'mb-2 after:absolute after:bottom-[-4px] after:left-3 after:right-3 after:h-px after:bg-outline-variant after:opacity-12': this.group,\r\n\t\t})\r\n\r\n\t\t// Icon container with active indicator\r\n\t\tconst iconContainerClasses = this.classMap({\r\n\t\t\t'flex items-center justify-center': true,\r\n\t\t\t'w-auto min-w-14 h-8': true, // 56px min-width, 32px height\r\n\t\t\t'flex-shrink-0 relative z-10': true,\r\n\t\t})\r\n\r\n\t\t// Active indicator behind icon\r\n\t\tconst indicatorClasses = this.classMap({\r\n\t\t\t'absolute top-1/2 left-1/2 opacity-50': true,\r\n\t\t\t'w-14 h-8': true, // 56px x 32px\r\n\t\t\t'rounded-lg': true, // M3 large corner radius\r\n\t\t\t'bg-secondary-container': true,\r\n\t\t\t'transition-transform duration-150 ease-out': true,\r\n\t\t\t'z-0': true,\r\n\t\t\t// Transform based on active state\r\n\t\t\t'scale-0 -translate-x-1/2 -translate-y-1/2': !this.active,\r\n\t\t\t'scale-100 -translate-x-1/2 -translate-y-1/2': this.active,\r\n\t\t})\r\n\r\n\t\t// Icon styling\r\n\t\tconst iconClasses = this.classMap({\r\n\t\t\t'text-2xl leading-none': !this.nested, // 24px icon for normal\r\n\t\t\t'text-xl leading-none': this.nested, // 20px icon for nested\r\n\t\t\t'relative z-10': true,\r\n\t\t\t// Material Symbols font variations handled via CSS custom properties\r\n\t\t})\r\n\r\n\t\t// Label styling\r\n\t\tconst labelClasses = this.classMap({\r\n\t\t\t'text-xs font-medium leading-4': true, // 12px, medium weight, 16px line height\r\n\t\t\t'text-center': true,\r\n\t\t\t'overflow-hidden text-ellipsis whitespace-nowrap': true,\r\n\t\t\t'z-10 max-w-14 px-1': true, // max 56px width, 4px horizontal padding\r\n\t\t\t'hidden': !this.showLabel && !this.label, // Hide if not shown or no label\r\n\t\t})\r\n\r\n\t\t// Badge styling with dynamic colors\r\n\t\tconst badgeClasses = this.classMap({\r\n\t\t\t'absolute top-2 right-3': true, // 8px from top, 12px from right\r\n\t\t\t'min-w-4 h-4': true, // 16px min-width and height\r\n\t\t\t'rounded-sm': true, // M3 small corner radius\r\n\t\t\t'text-xs font-semibold': true, // 11px, 600 weight\r\n\t\t\t'flex items-center justify-center': true,\r\n\t\t\t'px-1 box-border z-20': true, // 4px padding\r\n\t\t\t'animate-pulse': true, // Pulse animation\r\n\t\t\t// Dynamic background based on variant\r\n\t\t\t'bg-error-default text-error-on': this.badgeVariant === 'error',\r\n\t\t\t'bg-primary-default text-primary-on': this.badgeVariant === 'primary',\r\n\t\t\t'bg-secondary-default text-secondary-on': this.badgeVariant === 'secondary',\r\n\t\t})\r\n\r\n\t\t// Ripple effect classes\r\n\t\tconst rippleClasses = this.classMap({\r\n\t\t\t'absolute inset-0 rounded-lg overflow-hidden z-0': true,\r\n\t\t\t'before:content-[\"\"] before:absolute before:top-1/2 before:left-1/2': true,\r\n\t\t\t'before:w-0 before:h-0 before:rounded-full': true,\r\n\t\t\t'before:bg-current before:opacity-0': true,\r\n\t\t\t'before:-translate-x-1/2 before:-translate-y-1/2': true,\r\n\t\t\t'before:transition-all before:duration-300': true,\r\n\t\t\t// Active state\r\n\t\t\t'before:w-[200%] before:h-[200%] before:opacity-12': this.showRipple,\r\n\t\t})\r\n\r\n\t\treturn html`\r\n\t\t\t<div\r\n\t\t\t\tclass=${containerClasses}\r\n\t\t\t\tpart=\"container\"\r\n\t\t\t\t@click=${this.handleClick}\r\n\t\t\t\t@keydown=${this.handleKeyDown}\r\n\t\t\t\tstyle=\"outline: ${this.matches(':focus-visible') ? '2px solid var(--schmancy-sys-color-primary-default)' : 'none'}; outline-offset: 2px;\"\r\n\t\t\t>\r\n\t\t\t\t<span class=${rippleClasses} aria-hidden=\"true\"></span>\r\n\r\n\t\t\t\t${when(hasCustomContent,\r\n\t\t\t\t\t() => html`<slot></slot>`,\r\n\t\t\t\t\t() => html`\r\n\t\t\t\t\t\t<div class=${iconContainerClasses} part=\"icon\">\r\n\t\t\t\t\t\t\t<span class=${indicatorClasses} part=\"indicator\" aria-hidden=\"true\"></span>\r\n\t\t\t\t\t\t\t${when(hasCustomIcon,\r\n\t\t\t\t\t\t\t\t() => html`<slot name=\"icon\"></slot>`,\r\n\t\t\t\t\t\t\t\t() => when(this.icon,\r\n\t\t\t\t\t\t\t\t\t() => html`\r\n\t\t\t\t\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\t\t\t\t\tclass=${iconClasses}\r\n\t\t\t\t\t\t\t\t\t\t\tpart=\"icon-text\"\r\n\t\t\t\t\t\t\t\t\t\t\tstyle=\"font-family: 'Material Symbols Outlined'; font-variation-settings: 'FILL' ${this.active ? '1' : '0'}, 'wght' 400, 'GRAD' 0, 'opsz' ${this.nested ? '20' : '24'};\"\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t${this.icon}\r\n\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t`\r\n\t\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t\t${when(this.label,\r\n\t\t\t\t\t\t\t() => html`<span class=${labelClasses} part=\"label\">${this.label}</span>`\r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t`\r\n\t\t\t\t)}\r\n\r\n\t\t\t\t${when(this.badge,\r\n\t\t\t\t\t() => html`\r\n\t\t\t\t\t\t${when(hasCustomBadge,\r\n\t\t\t\t\t\t\t() => html`<slot name=\"badge\"></slot>`,\r\n\t\t\t\t\t\t\t() => html`\r\n\t\t\t\t\t\t\t\t<span\r\n\t\t\t\t\t\t\t\t\tclass=${badgeClasses}\r\n\t\t\t\t\t\t\t\t\tpart=\"badge\"\r\n\t\t\t\t\t\t\t\t\taria-label=\"${this.badge} notifications\"\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t${this.badge}\r\n\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t`\r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t`\r\n\t\t\t\t)}\r\n\r\n\t\t\t\t<!-- Tooltip shown via title attribute -->\r\n\t\t\t\t${when(this.hasAttribute('title'),\r\n\t\t\t\t\t() => html`\r\n\t\t\t\t\t\t<div class=\"\r\n\t\t\t\t\t\t\tabsolute left-[calc(100%+8px)] top-1/2 -translate-y-1/2\r\n\t\t\t\t\t\t\tbg-surface-inverse text-surface-inverseOn\r\n\t\t\t\t\t\t\tpx-2 py-1 rounded-sm text-xs whitespace-nowrap\r\n\t\t\t\t\t\t\tz-[1000] pointer-events-none opacity-0\r\n\t\t\t\t\t\t\thover:opacity-100 hover:translate-x-0\r\n\t\t\t\t\t\t\ttransition-all duration-150 ease-out\r\n\t\t\t\t\t\t\t-translate-x-1\r\n\t\t\t\t\t\t\" aria-hidden=\"true\">\r\n\t\t\t\t\t\t\t${this.getAttribute('title')}\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t`\r\n\t\t\t\t)}\r\n\t\t\t</div>\r\n\t\t`\r\n\t}\r\n}\r\n\r\ndeclare global {\r\n\tinterface HTMLElementTagNameMap {\r\n\t\t'schmancy-navigation-rail-item': SchmancyNavigationRailItem\r\n\t}\r\n}","import { $LitElement } from '@mixins/index'\r\nimport { html, PropertyValues } from 'lit'\r\nimport { customElement, property, queryAssignedElements, state } from 'lit/decorators.js'\r\nimport { BehaviorSubject, fromEvent, takeUntil } from 'rxjs'\r\nimport { distinctUntilChanged, tap } from 'rxjs/operators'\r\nimport { SchmancyNavigationRailItem } from './navigation-rail-item'\r\n\r\nexport type NavigateEvent = CustomEvent<string>\r\n\r\nexport type NavigationRailMenuClickEvent = CustomEvent<void>\r\n\r\nexport type NavigationRailFabClickEvent = CustomEvent<void>\r\n\r\n\r\nexport type LabelVisibility = 'all' | 'selected' | 'none'\r\n\r\n/**\r\n * Material Design 3 Navigation Rail Component\r\n * @see https://m3.material.io/components/navigation-rail/overview\r\n *\r\n * `<schmancy-navigation-rail>` component\r\n *\r\n * A Material Design 3 vertical navigation component positioned on the left side of an application.\r\n * Navigation rails provide access to between 3-7 primary destinations with a compact footprint.\r\n * Automatically hides in fullscreen mode when triggered via schmancyTheme.next({ fullscreen: true }).\r\n *\r\n * @element schmancy-navigation-rail\r\n * @slot fab - Slot for a floating action button at the top\r\n * @slot menu - Slot for a menu icon or button below the FAB\r\n * @slot header - Custom header content slot\r\n * @slot footer - Custom footer content slot\r\n * @slot - Default slot for navigation rail items\r\n *\r\n * @fires navigate - When a navigation item is selected\r\n * @fires menu-click - When the menu button is clicked\r\n * @fires fab-click - When the FAB is clicked\r\n *\r\n * @csspart rail - The main rail container\r\n * @csspart header - The header section\r\n * @csspart nav - The navigation items container\r\n * @csspart footer - The footer section\r\n *\r\n * @example\r\n * <schmancy-navigation-rail activeIndex=\"0\">\r\n * <schmancy-button slot=\"fab\" variant=\"filled\" aria-label=\"Compose\">\r\n * <schmancy-icon>add</schmancy-icon>\r\n * </schmancy-button>\r\n * <schmancy-button slot=\"menu\" variant=\"text\" aria-label=\"Menu\">\r\n * <schmancy-icon>menu</schmancy-icon>\r\n * </schmancy-button>\r\n * <schmancy-navigation-rail-item icon=\"home\" label=\"Home\"></schmancy-navigation-rail-item>\r\n * <schmancy-navigation-rail-item icon=\"search\" label=\"Search\"></schmancy-navigation-rail-item>\r\n * <schmancy-navigation-rail-item icon=\"favorite\" label=\"Favorites\" badge=\"3\"></schmancy-navigation-rail-item>\r\n * <schmancy-navigation-rail-item icon=\"settings\" label=\"Settings\"></schmancy-navigation-rail-item>\r\n * </schmancy-navigation-rail>\r\n */\r\n@customElement('schmancy-navigation-rail')\r\nexport class SchmancyNavigationRail extends $LitElement() {\r\n\t// Observable state\r\n\tprivate activeIndex$ = new BehaviorSubject<number>(-1)\r\n\r\n\t// Properties\r\n\t/**\r\n\t * The currently active item index\r\n\t * @default -1\r\n\t */\r\n\t@property({ type: Number })\r\n\tget activeIndex() {\r\n\t\treturn this.activeIndex$.value\r\n\t}\r\n\tset activeIndex(value: number) {\r\n\t\tthis.activeIndex$.next(value)\r\n\t}\r\n\r\n\t/**\r\n\t * The currently active item value (for programmatic selection)\r\n\t */\r\n\t@property({ type: String })\r\n\tget activeValue() {\r\n\t\treturn this._activeValue\r\n\t}\r\n\tset activeValue(value: string) {\r\n\t\tthis._activeValue = value\r\n\t\tthis.updateActiveByValue(value)\r\n\t}\r\n\tprivate _activeValue = ''\r\n\r\n\t/**\r\n\t * When to show labels for navigation items\r\n\t * 'all' - Always show labels for all items\r\n\t * 'selected' - Only show label for selected item\r\n\t * 'none' - Never show labels\r\n\t * @default 'all'\r\n\t */\r\n\t@property({ type: String, attribute: 'label-visibility', reflect: true })\r\n\tlabelVisibility: LabelVisibility = 'all'\r\n\r\n\t/**\r\n\t * Alignment of navigation items\r\n\t * @default 'top'\r\n\t */\r\n\t@property({ type: String, reflect: true })\r\n\talignment: 'top' | 'center' | 'bottom' = 'top'\r\n\r\n\t/**\r\n\t * Show tooltips when labels are hidden\r\n\t * @default true\r\n\t */\r\n\t@property({ type: Boolean })\r\n\tshowTooltips = true\r\n\r\n\t/**\r\n\t * Enable keyboard navigation\r\n\t * @default true\r\n\t */\r\n\t@property({ type: Boolean })\r\n\tkeyboardNavigation = true\r\n\r\n\t/**\r\n\t * Whether the navigation rail is expanded\r\n\t * @default false\r\n\t */\r\n\t@property({ type: Boolean, reflect: true })\r\n\texpanded = false\r\n\r\n\r\n\t// State\r\n\t@state()\r\n\tprivate focusedIndex = -1\r\n\r\n\t@state()\r\n\tprivate isFullscreen = false\r\n\r\n\t// Queries\r\n\r\n\t@queryAssignedElements({ flatten: true })\r\n\tprivate allElements!: Element[]\r\n\r\n\tprivate get navigationItems(): SchmancyNavigationRailItem[] {\r\n\t\treturn this.allElements.filter(el => el.tagName === 'SCHMANCY-NAVIGATION-RAIL-ITEM') as SchmancyNavigationRailItem[]\r\n\t}\r\n\r\n\tconnectedCallback() {\r\n\t\tsuper.connectedCallback()\r\n\r\n\t\t// Set up keyboard navigation if enabled\r\n\t\tif (this.keyboardNavigation) {\r\n\t\t\tthis.addEventListener('keydown', this.handleKeyDown)\r\n\t\t}\r\n\r\n\t\t// Subscribe to active index changes with distinct values only\r\n\t\tthis.activeIndex$\r\n\t\t\t.pipe(\r\n\t\t\t\tdistinctUntilChanged(),\r\n\t\t\t\ttap(index => this.updateActiveStates(index)),\r\n\t\t\t\ttakeUntil(this.disconnecting),\r\n\t\t\t)\r\n\t\t\t.subscribe()\r\n\r\n\t\t// Listen to fullscreen events\r\n\t\tfromEvent(window, 'fullscreen').pipe(\r\n\t\t\ttap((event: Event) => {\r\n\t\t\t\tconst customEvent = event as CustomEvent\r\n\t\t\t\tthis.isFullscreen = customEvent.detail\r\n\t\t\t}),\r\n\t\t\ttakeUntil(this.disconnecting)\r\n\t\t).subscribe()\r\n\r\n\t\t// Listen for navigate events from child items\r\n\t\tthis.setupNavigateListener()\r\n\r\n\t\t// Set up label visibility\r\n\t\tthis.updateLabelVisibility()\r\n\r\n\t\t// Update ARIA attributes\r\n\t\tthis.setAttribute('role', 'navigation')\r\n\t\tthis.setAttribute('aria-label', 'Main navigation')\r\n\t}\r\n\r\n\tupdated(changedProperties: PropertyValues) {\r\n\t\tsuper.updated(changedProperties)\r\n\r\n\t\tif (changedProperties.has('labelVisibility')) {\r\n\t\t\tthis.updateLabelVisibility()\r\n\t\t}\r\n\r\n\t\tif (changedProperties.has('activeValue')) {\r\n\t\t\tthis.updateActiveByValue(this.activeValue)\r\n\t\t}\r\n\r\n\t\tif (changedProperties.has('expanded')) {\r\n\t\t\tthis.updateLabelVisibility()\r\n\t\t}\r\n\t}\r\n\r\n\tprivate updateActiveStates(index: number) {\r\n\t\tthis.navigationItems.forEach((item, i) => {\r\n\t\t\tconst isActive = i === index\r\n\t\t\titem.active = isActive\r\n\t\t\titem.setAttribute('aria-selected', String(isActive))\r\n\t\t\titem.setAttribute('tabindex', isActive ? '0' : '-1')\r\n\r\n\t\t\t// Update activeValue when index changes\r\n\t\t\tif (isActive) {\r\n\t\t\t\tthis._activeValue = item.value || item.label || ''\r\n\t\t\t}\r\n\t\t})\r\n\t}\r\n\r\n\tprivate updateActiveByValue(value: string) {\r\n\t\tconst index = this.navigationItems.findIndex(item => item.getAttribute('value') === value || item.label === value)\r\n\t\tif (index >= 0) {\r\n\t\t\tthis.activeIndex = index\r\n\t\t}\r\n\t}\r\n\r\n\tprivate updateLabelVisibility() {\r\n\t\tthis.navigationItems.forEach((item, i) => {\r\n\t\t\tlet shouldShowLabel = false\r\n\r\n\t\t\t// M3 Spec: In expanded state, always show all labels\r\n\t\t\tif (this.expanded) {\r\n\t\t\t\tshouldShowLabel = true\r\n\t\t\t} else {\r\n\t\t\t\t// In collapsed state, respect labelVisibility setting\r\n\t\t\t\tshouldShowLabel =\r\n\t\t\t\t\tthis.labelVisibility === 'all' || (this.labelVisibility === 'selected' && i === this.activeIndex)\r\n\t\t\t}\r\n\r\n\t\t\titem.showLabel = shouldShowLabel\r\n\r\n\t\t\t// Add tooltips when labels are hidden (only in collapsed state)\r\n\t\t\tif (this.showTooltips && !shouldShowLabel && !this.expanded && item.label) {\r\n\t\t\t\titem.setAttribute('title', item.label)\r\n\t\t\t} else {\r\n\t\t\t\titem.removeAttribute('title')\r\n\t\t\t}\r\n\t\t})\r\n\t}\r\n\r\n\t// Note: Hover-based label showing removed for M3 compliance\r\n\t// Labels are now controlled via labelVisibility property and expanded state\r\n\r\n\t/**\r\n\t * Programmatically expand the navigation rail\r\n\t */\r\n\texpand() {\r\n\t\tthis.expanded = true\r\n\t}\r\n\r\n\t/**\r\n\t * Programmatically collapse the navigation rail\r\n\t */\r\n\tcollapse() {\r\n\t\tthis.expanded = false\r\n\t}\r\n\r\n\t/**\r\n\t * Add a boat item to the navigation rail\r\n\t * @param config Configuration for the boat item\r\n\t * @returns The created navigation rail item element\r\n\t */\r\n\tpublic addBoatItem(config: { id: string; title: string; icon?: string }) {\r\n\t\tconst item = document.createElement('schmancy-navigation-rail-item')\r\n\t\titem.setAttribute('value', config.id)\r\n\t\titem.innerHTML = `\r\n\t\t\t<schmancy-icon slot=\"icon\">${config.icon || 'widgets'}</schmancy-icon>\r\n\t\t\t${config.title}\r\n\t\t`\r\n\t\t// Add to the rail before any footer content\r\n\t\tconst footer = this.querySelector('[slot=\"footer\"]')\r\n\t\tif (footer) {\r\n\t\t\tthis.insertBefore(item, footer)\r\n\t\t} else {\r\n\t\t\tthis.appendChild(item)\r\n\t\t}\r\n\t\treturn item\r\n\t}\r\n\r\n\t/**\r\n\t * Toggle the navigation rail between expanded and collapsed states\r\n\t */\r\n\ttoggle() {\r\n\t\tthis.expanded = !this.expanded\r\n\t}\r\n\r\n\r\n\tprivate handleKeyDown(event: KeyboardEvent) {\r\n\t\tconst items = this.navigationItems\r\n\t\tif (items.length === 0) return\r\n\r\n\t\tlet newIndex = this.focusedIndex >= 0 ? this.focusedIndex : this.activeIndex\r\n\r\n\t\tswitch (event.key) {\r\n\t\t\tcase 'ArrowDown':\r\n\t\t\t\tevent.preventDefault()\r\n\t\t\t\tnewIndex = (newIndex + 1) % items.length\r\n\t\t\t\tbreak\r\n\t\t\tcase 'ArrowUp':\r\n\t\t\t\tevent.preventDefault()\r\n\t\t\t\tnewIndex = newIndex <= 0 ? items.length - 1 : newIndex - 1\r\n\t\t\t\tbreak\r\n\t\t\tcase 'Home':\r\n\t\t\t\tevent.preventDefault()\r\n\t\t\t\tnewIndex = 0\r\n\t\t\t\tbreak\r\n\t\t\tcase 'End':\r\n\t\t\t\tevent.preventDefault()\r\n\t\t\t\tnewIndex = items.length - 1\r\n\t\t\t\tbreak\r\n\t\t\tcase 'Enter':\r\n\t\t\tcase ' ':\r\n\t\t\t\tevent.preventDefault()\r\n\t\t\t\tif (newIndex >= 0) {\r\n\t\t\t\t\titems[newIndex].click()\r\n\t\t\t\t}\r\n\t\t\t\treturn\r\n\t\t\tdefault:\r\n\t\t\t\treturn\r\n\t\t}\r\n\r\n\t\tthis.focusedIndex = newIndex\r\n\t\titems[newIndex].focus()\r\n\t}\r\n\r\n\tprivate handleFabClick(event: Event) {\r\n\t\tevent.stopPropagation()\r\n\t\tthis.dispatchEvent(\r\n\t\t\tnew CustomEvent('fab-click', {\r\n\t\t\t\tbubbles: true,\r\n\t\t\t\tcomposed: true,\r\n\t\t\t}),\r\n\t\t)\r\n\t}\r\n\r\n\tprivate handleMenuClick(event: Event) {\r\n\t\tevent.stopPropagation()\r\n\t\tthis.dispatchEvent(\r\n\t\t\tnew CustomEvent('menu-click', {\r\n\t\t\t\tbubbles: true,\r\n\t\t\t\tcomposed: true,\r\n\t\t\t}),\r\n\t\t)\r\n\t}\r\n\r\n\tprotected render() {\r\n\t\t// Host-level classes for the navigation rail\r\n\t\tconst hostClasses = this.classMap({\r\n\t\t\t// Layout & Structure - Fixed width to prevent layout shift\r\n\t\t\t'flex flex-col': true,\r\n\t\t\t'w-20 h-full': true, // w-20 = 80px fixed width\r\n\t\t\t'box-border relative overflow-visible': true,\r\n\t\t\t'z-10 hover:z-[100]': true, // Base z-index, elevated on hover for overlay\r\n\r\n\t\t\t// Mobile responsive - smaller fixed width\r\n\t\t\t'md:w-20 w-14': true, // w-14 = 56px on mobile\r\n\r\n\t\t\t// Visibility and transition\r\n\t\t\t'transition-all duration-300 ease-emphasized': true,\r\n\t\t\t'opacity-100 translate-x-0': !this.isFullscreen,\r\n\t\t\t'opacity-0 -translate-x-full pointer-events-none': this.isFullscreen,\r\n\t\t})\r\n\r\n\t\t// Rail container - programmatically controlled width\r\n\t\tconst railClasses = this.classMap({\r\n\t\t\t// Layout & Structure\r\n\t\t\t'flex flex-col h-full': true,\r\n\t\t\t'box-border relative': true,\r\n\r\n\t\t\t// M3 Colors & Theme\r\n\t\t\t'bg-surface-default text-surface-on': true,\r\n\r\n\t\t\t// M3 Motion - smooth transitions for width and shadow\r\n\t\t\t'transition-all duration-300 ease-emphasized': true,\r\n\r\n\t\t\t// Collapsed state (default) - M3 standard 80px width\r\n\t\t\t'w-20 px-3 py-2 gap-1': !this.expanded, // w-20 = 80px base width\r\n\t\t\t'md:w-20 w-14': !this.expanded, // w-14 = 56px on mobile\r\n\t\t\t'md:px-3 px-2': !this.expanded, // Smaller padding on mobile\r\n\r\n\t\t\t// Expanded state - M3 expanded width with shadow\r\n\t\t\t'w-60 px-4 py-2 gap-1': this.expanded, // w-60 = 240px expanded width\r\n\t\t\t'md:w-60 w-50': this.expanded, // w-50 = 200px expansion on mobile\r\n\t\t\t'md:px-4 px-3': this.expanded, // Larger padding when expanded\r\n\t\t\t'shadow-lg': this.expanded, // M3 elevation 3 shadow when expanded\r\n\t\t})\r\n\r\n\t\t// Header section classes\r\n\t\tconst headerClasses = this.classMap({\r\n\t\t\t'flex flex-col items-center gap-1 mb-2': true,\r\n\t\t\t// FAB and menu button spacing\r\n\t\t\t'[&_[slot=\"fab\"]]:mb-2': true,\r\n\t\t\t'[&_[slot=\"menu\"]]:mb-3': true,\r\n\t\t})\r\n\r\n\t\t// Navigation container classes with alignment\r\n\t\tconst navClasses = this.classMap({\r\n\t\t\t'flex-1 flex flex-col gap-1': true,\r\n\t\t\t'min-h-0': true, // Allow flex shrinking and proper scroll container height calculation\r\n\t\t\t// Alignment variants\r\n\t\t\t'justify-start': this.alignment === 'top',\r\n\t\t\t'justify-center': this.alignment === 'center',\r\n\t\t\t'justify-end': this.alignment === 'bottom',\r\n\t\t})\r\n\r\n\t\t// Footer section classes\r\n\t\tconst footerClasses = this.classMap({\r\n\t\t\t'flex flex-col items-center gap-1 mt-auto pt-2': true,\r\n\t\t})\r\n\r\n\t\treturn html`\r\n\t\t\t<div\r\n\t\t\t\tclass=${hostClasses}\r\n\t\t\t>\r\n\t\t\t\t<div class=${railClasses} part=\"rail\">\r\n\t\t\t\t\t<div class=${headerClasses} part=\"header\">\r\n\t\t\t\t\t\t<slot name=\"fab\" @click=${this.handleFabClick}></slot>\r\n\t\t\t\t\t\t<slot name=\"menu\" @click=${this.handleMenuClick}></slot>\r\n\t\t\t\t\t\t<slot name=\"header\"></slot>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t<nav class=${navClasses} part=\"nav\" role=\"list\">\r\n\t\t\t\t\t\t<schmancy-scroll hide direction=\"vertical\">\r\n\t\t\t\t\t\t\t<slot @slotchange=${this.handleSlotChange}></slot>\r\n\t\t\t\t\t\t</schmancy-scroll>\r\n\t\t\t\t\t</nav>\r\n\r\n\t\t\t\t\t<div class=${footerClasses} part=\"footer\">\r\n\t\t\t\t\t\t<slot name=\"footer\"></slot>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t`\r\n\t}\r\n\r\n\tprivate setupNavigateListener() {\r\n\t\t// Listen for navigate events from child items\r\n\t\tthis.addEventListener('navigate', (e: Event) => {\r\n\t\t\tif (e instanceof CustomEvent) {\r\n\t\t\t\tconst value = e.detail\r\n\t\t\t\t// Find the item that dispatched the event and update active state\r\n\t\t\t\tconst itemIndex = this.navigationItems.findIndex(item => item.value === value || item.label === value)\r\n\t\t\t\tif (itemIndex >= 0) {\r\n\t\t\t\t\tthis.activeIndex = itemIndex\r\n\t\t\t\t\tthis._activeValue = value\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t})\r\n\t}\r\n\r\n\tprivate handleSlotChange() {\r\n\t\t// Update items when slot content changes\r\n\t\tthis.updateLabelVisibility()\r\n\t\tthis.updateActiveStates(this.activeIndex)\r\n\r\n\t\t// Set ARIA attributes on items\r\n\t\tthis.navigationItems.forEach((item, index) => {\r\n\t\t\titem.setAttribute('role', 'listitem')\r\n\t\t\tif (!item.hasAttribute('tabindex')) {\r\n\t\t\t\titem.setAttribute('tabindex', index === this.activeIndex ? '0' : '-1')\r\n\t\t\t}\r\n\t\t})\r\n\t}\r\n}\r\n\r\ndeclare global {\r\n\tinterface HTMLElementTagNameMap {\r\n\t\t'schmancy-navigation-rail': SchmancyNavigationRail\r\n\t}\r\n}\r\n"],"names":["SchmancyNavigationRailItem","$LitElement","constructor","super","arguments","this","hovering$","BehaviorSubject","pressing$","active$","icon","label","value","badge","badgeVariant","showLabel","disabled","nested","group","showRipple","active","next","selected","connectedCallback","merge","fromEvent","pipe","tap","takeUntil","disconnecting","subscribe","pressing","delay","distinctUntilChanged","isActive","requestUpdate","setAttribute","String","hasAttribute","changedProperties","updated","has","event","preventDefault","stopPropagation","dispatchEvent","CustomEvent","detail","bubbles","composed","key","click","render","hasCustomIcon","querySelector","hasCustomContent","hasCustomBadge","containerClasses","classMap","relative","iconContainerClasses","indicatorClasses","iconClasses","labelClasses","hidden","badgeClasses","rippleClasses","html","handleClick","handleKeyDown","matches","when","getAttribute","__decorateClass","property","type","prototype","Boolean","reflect","attribute","state","customElement","SchmancyNavigationRail","activeIndex$","_activeValue","labelVisibility","alignment","showTooltips","keyboardNavigation","expanded","focusedIndex","isFullscreen","activeValue","updateActiveByValue","allElements","filter","el","tagName","addEventListener","index","updateActiveStates","window","customEvent","setupNavigateListener","updateLabelVisibility","navigationItems","forEach","item","i","findIndex","activeIndex","shouldShowLabel","removeAttribute","expand","collapse","config","document","createElement","id","innerHTML","title","footer","insertBefore","appendChild","items","length","newIndex","focus","hostClasses","railClasses","headerClasses","navClasses","footerClasses","handleFabClick","handleMenuClick","handleSlotChange","e","itemIndex","Number","queryAssignedElements","flatten"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./navigation-rail-6ONc-XE-.cjs");Object.defineProperty(exports,"SchmancyNavigationRail",{enumerable:!0,get:()=>e.SchmancyNavigationRail}),Object.defineProperty(exports,"SchmancyNavigationRailItem",{enumerable:!0,get:()=>e.SchmancyNavigationRailItem});
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./navigation-rail-B0zofile.cjs");Object.defineProperty(exports,"SchmancyNavigationRail",{enumerable:!0,get:()=>e.SchmancyNavigationRail}),Object.defineProperty(exports,"SchmancyNavigationRailItem",{enumerable:!0,get:()=>e.SchmancyNavigationRailItem});
2
2
  //# sourceMappingURL=navigation-rail.cjs.map
@@ -1,4 +1,4 @@
1
- import { a as c, S as m } from "./navigation-rail-D-lK9oVd.js";
1
+ import { a as c, S as m } from "./navigation-rail-KdVjbO1I.js";
2
2
  export {
3
3
  c as SchmancyNavigationRail,
4
4
  m as SchmancyNavigationRailItem
@@ -1,14 +1,15 @@
1
1
  import { fromEvent as x, takeUntil as T } from "rxjs";
2
+ import "rxjs/operators";
2
3
  import { classMap as S } from "lit/directives/class-map.js";
3
4
  import { styleMap as A } from "lit/directives/style-map.js";
4
5
  import { property as h, state as g, customElement as _ } from "lit/decorators.js";
5
- import "./tailwind.mixin-BjDGMGbj.js";
6
- import { $ as C } from "./litElement.mixin-CzF0mNQd.js";
6
+ import "./tailwind.mixin-Cn7vup-6.js";
7
+ import { $ as C } from "./litElement.mixin-Dp4mBSNw.js";
7
8
  import { c as V } from "./ripple-Cy-nvO8W.js";
8
9
  import "lit/directives/guard.js";
9
10
  import { S as l } from "./theme.interface-BLfE5J_1.js";
10
11
  import { html as p } from "lit";
11
- import "./progress-BYohUvYO.js";
12
+ import "./progress-Bqih11TQ.js";
12
13
  import { repeat as k } from "lit/directives/repeat.js";
13
14
  var $ = Object.defineProperty, R = Object.getOwnPropertyDescriptor, d = (o, t, e, i) => {
14
15
  for (var s, n = i > 1 ? void 0 : i ? R(t, e) : t, a = o.length - 1; a >= 0; a--) (s = o[a]) && (n = (i ? s(t, e, n) : s(n)) || n);
@@ -521,11 +522,11 @@ const f = class f {
521
522
  };
522
523
  f.DEFAULT_OPTIONS = { duration: 1e3, closable: !0, playSound: !0 };
523
524
  let m = f;
524
- const Q = { show: (o) => m.getInstance().notify(o), info: (o, t = {}) => m.getInstance().info(o, t), success: (o, t = {}) => m.getInstance().success(o, t), warning: (o, t = {}) => m.getInstance().warning(o, t), error: (o, t = {}) => m.getInstance().error(o, t), customDuration: (o, t, e = {}) => m.getInstance().customDuration(o, t, e), persistent: (o, t = {}) => m.getInstance().persistent(o, t), dismiss: (o) => m.getInstance().dismiss(o), update: (o, t) => m.getInstance().update(o, t) };
525
+ const X = { show: (o) => m.getInstance().notify(o), info: (o, t = {}) => m.getInstance().info(o, t), success: (o, t = {}) => m.getInstance().success(o, t), warning: (o, t = {}) => m.getInstance().warning(o, t), error: (o, t = {}) => m.getInstance().error(o, t), customDuration: (o, t, e = {}) => m.getInstance().customDuration(o, t, e), persistent: (o, t = {}) => m.getInstance().persistent(o, t), dismiss: (o) => m.getInstance().dismiss(o), update: (o, t) => m.getInstance().update(o, t) };
525
526
  export {
526
- Q as $,
527
+ X as $,
527
528
  E as N,
528
529
  u as S,
529
530
  y as a
530
531
  };
531
- //# sourceMappingURL=notification-service-ZiGUSd63.js.map
532
+ //# sourceMappingURL=notification-service-BOCdK7B0.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"notification-service-ZiGUSd63.js","sources":["../src/notification/notification.ts","../src/notification/notification-audio-generator.ts","../src/notification/notification-audio.ts","../src/notification/notification-container.ts","../src/notification/notification-service.ts"],"sourcesContent":["import { $LitElement } from '@mixins/index'\nimport { color } from '@schmancy/directives'\nimport { SchmancyTheme } from '@schmancy/theme/theme.interface'\nimport { html, PropertyValues } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { classMap } from 'lit/directives/class-map.js'\nimport { styleMap } from 'lit/directives/style-map.js'\nimport '@schmancy/progress'\nimport style from './notification.scss?inline'\n\nexport type NotificationType = 'info' | 'success' | 'warning' | 'error'\n\n/**\n * @fires close - When notification is closed\n */\n@customElement('sch-notification')\nexport default class SchmancyNotification extends $LitElement(style) {\n\t@property({ type: String }) title = ''\n\t@property({ type: String }) message = ''\n\t@property({ type: String }) type: NotificationType = 'info'\n\t@property({ type: Boolean }) closable = true\n\t@property({ type: Number }) duration = 5000 // 0 means no auto-close\n\t@property({ type: String }) id = `notification-${Date.now()}-${Math.floor(Math.random() * 10000)}`\n\t@property({ type: Boolean }) playSound = true\n\t@property({ type: Boolean }) showProgress = false // Show indeterminate progress bar\n\n\t@state() private _visible = true\n\t@state() private _progress = 100\n\t@state() private _hovered = false\n\t@state() private _closing = false\n\t@state() private _autoCloseTimer?: number\n\t@state() private _progressTimer?: number\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback()\n\n\t\tif (this.duration > 0) {\n\t\t\tthis._startAutoCloseTimer()\n\t\t}\n\n\t\tif (this.playSound) {\n\t\t\tthis._playSound()\n\t\t}\n\t}\n\n\tdisconnectedCallback() {\n\t\tthis._clearTimers()\n\t\tsuper.disconnectedCallback()\n\t}\n\n\tupdated(changedProps: PropertyValues) {\n\t\tsuper.updated(changedProps)\n\n\t\tif (changedProps.has('duration') && this.duration > 0) {\n\t\t\tthis._clearTimers()\n\t\t\tthis._startAutoCloseTimer()\n\t\t}\n\t}\n\n\tprivate _startAutoCloseTimer() {\n\t\tif (this.duration <= 0) return\n\n\t\tconst startTime = Date.now()\n\t\tconst endTime = startTime + this.duration\n\n\t\t// Setup the auto-close timer\n\t\tthis._autoCloseTimer = window.setTimeout(() => {\n\t\t\tthis.close()\n\t\t}, this.duration)\n\n\t\t// Setup the progress timer to update every 16ms (60fps)\n\t\tthis._progressTimer = window.setInterval(() => {\n\t\t\tif (this._hovered) return\n\n\t\t\tconst now = Date.now()\n\t\t\tconst remaining = Math.max(0, endTime - now)\n\t\t\tthis._progress = (remaining / this.duration) * 100\n\n\t\t\tif (remaining <= 0) {\n\t\t\t\tthis._clearTimers()\n\t\t\t}\n\t\t}, 16)\n\t}\n\n\tprivate _clearTimers() {\n\t\tif (this._autoCloseTimer) {\n\t\t\tclearTimeout(this._autoCloseTimer)\n\t\t\tthis._autoCloseTimer = undefined\n\t\t}\n\n\t\tif (this._progressTimer) {\n\t\t\tclearInterval(this._progressTimer)\n\t\t\tthis._progressTimer = undefined\n\t\t}\n\t}\n\n\tprivate _pauseTimers() {\n\t\tthis._clearTimers()\n\t}\n\n\tprivate _resumeTimers() {\n\t\tif (this.duration > 0) {\n\t\t\t// Calculate remaining time based on progress\n\t\t\tconst remainingTime = (this._progress / 100) * this.duration\n\n\t\t\tif (remainingTime > 0) {\n\t\t\t\tthis._autoCloseTimer = window.setTimeout(() => {\n\t\t\t\t\tthis.close()\n\t\t\t\t}, remainingTime)\n\n\t\t\t\tconst startTime = Date.now()\n\t\t\t\tconst endTime = startTime + remainingTime\n\n\t\t\t\tthis._progressTimer = window.setInterval(() => {\n\t\t\t\t\tif (this._hovered) return\n\n\t\t\t\t\tconst now = Date.now()\n\t\t\t\t\tconst remaining = Math.max(0, endTime - now)\n\t\t\t\t\tthis._progress = (remaining / remainingTime) * 100\n\n\t\t\t\t\tif (remaining <= 0) {\n\t\t\t\t\t\tthis._clearTimers()\n\t\t\t\t\t}\n\t\t\t\t}, 16)\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _playSound() {\n\t\t// Dispatch event to play sound through audio service\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent('playsound', {\n\t\t\t\tdetail: { type: this.type },\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t}),\n\t\t)\n\t}\n\n\tprivate _handleMouseEnter() {\n\t\tthis._hovered = true\n\t\tthis._pauseTimers()\n\t}\n\n\tprivate _handleMouseLeave() {\n\t\tthis._hovered = false\n\t\tthis._resumeTimers()\n\t}\n\n\tpublic close() {\n\t\tif (this._closing) return\n\n\t\tthis._closing = true\n\t\tthis._clearTimers()\n\n\t\t// Add closing animation\n\t\tthis._visible = false\n\n\t\t// Dispatch close event\n\t\tsetTimeout(() => {\n\t\t\tthis.dispatchEvent(\n\t\t\t\tnew CustomEvent('close', {\n\t\t\t\t\tdetail: { id: this.id },\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true,\n\t\t\t\t}),\n\t\t\t)\n\t\t}, 300) // Match animation duration\n\t}\n\n\trender() {\n\t\tif (!this._visible && this._closing) return html``\n\n\t\tconst typeStyles = this._getTypeStyles()\n\n\t\t// Calculate elevation based on hover state\n\t\tconst elevationLevel = this._hovered ? '3' : '2'\n\n\t\treturn html`\n\t\t\t<div\n\t\t\t\tclass=${classMap({\n\t\t\t\t\tnotification: true,\n\t\t\t\t\tclosing: this._closing,\n\t\t\t\t\t[this.type]: true,\n\t\t\t\t})}\n\t\t\t\trole=\"alert\"\n\t\t\t\tstyle=${styleMap({\n\t\t\t\t\ttransform: this._closing ? 'translateX(120%)' : 'translateX(0)',\n\t\t\t\t\topacity: this._closing ? '0' : '1',\n\t\t\t\t\tboxShadow: `var(--schmancy-sys-elevation-${elevationLevel})`,\n\t\t\t\t\ttransition:\n\t\t\t\t\t\t'transform 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.3s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.2s ease',\n\t\t\t\t})}\n\t\t\t\t@mouseenter=${this._handleMouseEnter}\n\t\t\t\t@mouseleave=${this._handleMouseLeave}\n\t\t\t>\n\t\t\t\t<div class=\"notification-content\">\n\t\t\t\t\t<div\n\t\t\t\t\t\tclass=\"icon-container\"\n\t\t\t\t\t\t${color({\n\t\t\t\t\t\t\tcolor: typeStyles.iconColor,\n\t\t\t\t\t\t\tbgColor: `color-mix(in srgb, ${typeStyles.iconColor} 10%, transparent)`,\n\t\t\t\t\t\t})}\n\t\t\t\t\t>\n\t\t\t\t\t\t${typeStyles.icon}\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"content\">\n\t\t\t\t\t\t${this.title\n\t\t\t\t\t\t\t? html`\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tclass=\"title\"\n\t\t\t\t\t\t\t\t\t\tstyle=${styleMap({\n\t\t\t\t\t\t\t\t\t\t\tcolor:\n\t\t\t\t\t\t\t\t\t\t\t\tthis.type === 'info'\n\t\t\t\t\t\t\t\t\t\t\t\t\t? `color-mix(in srgb, ${SchmancyTheme.sys.color.primary.default} 90%, ${SchmancyTheme.sys.color.surface.on} 10%)`\n\t\t\t\t\t\t\t\t\t\t\t\t\t: this.type === 'success'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? `color-mix(in srgb, ${SchmancyTheme.sys.color.success.default} 90%, ${SchmancyTheme.sys.color.surface.on} 10%)`\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: this.type === 'warning'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? `color-mix(in srgb, ${SchmancyTheme.sys.color.tertiary.default} 90%, ${SchmancyTheme.sys.color.surface.on} 10%)`\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: `color-mix(in srgb, ${SchmancyTheme.sys.color.error.default} 90%, ${SchmancyTheme.sys.color.surface.on} 10%)`,\n\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t${this.title}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t`\n\t\t\t\t\t\t\t: ''}\n\n\t\t\t\t\t\t<div class=\"message\">${this.message}</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t${this.closable\n\t\t\t\t\t\t? html`\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tclass=\"close-button\"\n\t\t\t\t\t\t\t\t\taria-label=\"Close notification\"\n\t\t\t\t\t\t\t\t\t@click=${this.close}\n\t\t\t\t\t\t\t\t\tstyle=${styleMap({\n\t\t\t\t\t\t\t\t\t\tcolor:\n\t\t\t\t\t\t\t\t\t\t\tthis.type === 'info'\n\t\t\t\t\t\t\t\t\t\t\t\t? SchmancyTheme.sys.color.surface.onVariant\n\t\t\t\t\t\t\t\t\t\t\t\t: `color-mix(in srgb, ${typeStyles.iconColor} 80%, ${SchmancyTheme.sys.color.surface.onVariant} 20%)`,\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\t\twidth=\"18\"\n\t\t\t\t\t\t\t\t\t\theight=\"18\"\n\t\t\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n\t\t\t\t\t\t\t\t\t\t<line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t`\n\t\t\t\t\t\t: ''}\n\t\t\t\t</div>\n\n\t\t\t\t${this.showProgress || this.duration > 0\n\t\t\t\t\t? html`\n\t\t\t\t\t\t\t<schmancy-progress\n\t\t\t\t\t\t\t\tstyle=\"position: absolute; bottom: 0; left: 0; right: 0; width: 100%;\"\n\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t.color=${this.type === 'error' ? 'error' : this.type === 'success' ? 'success' : 'primary'}\n\t\t\t\t\t\t\t\t?indeterminate=${this.showProgress}\n\t\t\t\t\t\t\t\t.value=${this.showProgress ? 0 : this._progress}\n\t\t\t\t\t\t\t\t.max=${100}\n\t\t\t\t\t\t\t></schmancy-progress>\n\t\t\t\t\t\t`\n\t\t\t\t\t: ''}\n\t\t\t</div>\n\t\t`\n\t}\n\n\tprivate _getTypeStyles() {\n\t\tswitch (this.type) {\n\t\t\tcase 'success':\n\t\t\t\treturn {\n\t\t\t\t\ticon: html`\n\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\twidth=\"20\"\n\t\t\t\t\t\t\theight=\"20\"\n\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\"></path>\n\t\t\t\t\t\t\t<polyline points=\"22 4 12 14.01 9 11.01\"></polyline>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t`,\n\t\t\t\t\ticonColor: SchmancyTheme.sys.color.success.default,\n\t\t\t\t\tprogressColor: `color-mix(in srgb, ${SchmancyTheme.sys.color.success.default} 95%, ${SchmancyTheme.sys.color.success.container} 5%)`,\n\t\t\t\t}\n\t\t\tcase 'warning':\n\t\t\t\treturn {\n\t\t\t\t\ticon: html`\n\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\twidth=\"20\"\n\t\t\t\t\t\t\theight=\"20\"\n\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"></path>\n\t\t\t\t\t\t\t<line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"></line>\n\t\t\t\t\t\t\t<line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"></line>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t`,\n\t\t\t\t\ticonColor: SchmancyTheme.sys.color.tertiary.default,\n\t\t\t\t\tprogressColor: `color-mix(in srgb, ${SchmancyTheme.sys.color.tertiary.default} 90%, ${SchmancyTheme.sys.color.tertiary.container} 10%)`,\n\t\t\t\t}\n\t\t\tcase 'error':\n\t\t\t\treturn {\n\t\t\t\t\ticon: html`\n\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\twidth=\"20\"\n\t\t\t\t\t\t\theight=\"20\"\n\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<circle cx=\"12\" cy=\"12\" r=\"10\"></circle>\n\t\t\t\t\t\t\t<line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\"></line>\n\t\t\t\t\t\t\t<line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\"></line>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t`,\n\t\t\t\t\ticonColor: SchmancyTheme.sys.color.error.default,\n\t\t\t\t\tprogressColor: `color-mix(in srgb, ${SchmancyTheme.sys.color.error.default} 92%, ${SchmancyTheme.sys.color.error.container} 8%)`,\n\t\t\t\t}\n\t\t\tcase 'info':\n\t\t\tdefault:\n\t\t\t\treturn {\n\t\t\t\t\ticon: html`\n\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\twidth=\"20\"\n\t\t\t\t\t\t\theight=\"20\"\n\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<circle cx=\"12\" cy=\"12\" r=\"10\"></circle>\n\t\t\t\t\t\t\t<line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line>\n\t\t\t\t\t\t\t<line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t`,\n\t\t\t\t\ticonColor: SchmancyTheme.sys.color.primary.default,\n\t\t\t\t\tprogressColor: `color-mix(in srgb, ${SchmancyTheme.sys.color.primary.default} 94%, ${SchmancyTheme.sys.color.primary.container} 6%)`,\n\t\t\t\t}\n\t\t}\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'sch-notification': SchmancyNotification\n\t}\n}\n","/**\n * Programmatic sound generator for Schmancy notifications\n * Uses Web Audio API to generate gentle, subtle and soft sounds for each notification type\n */\nexport class NotificationSoundGenerator {\n\tprivate audioContext: AudioContext | null = null\n\n\t/**\n\t * Get or create AudioContext\n\t */\n\tprivate getAudioContext(): AudioContext {\n\t\tif (!this.audioContext) {\n\t\t\tconst AudioContextClass = window.AudioContext || (window as any).webkitAudioContext\n\t\t\tthis.audioContext = new AudioContextClass()\n\t\t}\n\t\treturn this.audioContext\n\t}\n\n\tpublic playInfoSound(volume = 0.2): void {\n\t\tconst ctx = this.getAudioContext()\n\t\tconst now = ctx.currentTime\n\n\t\tconst oscillator = ctx.createOscillator()\n\t\tconst gainNode = ctx.createGain()\n\t\tconst filter = ctx.createBiquadFilter()\n\n\t\toscillator.type = 'sine'\n\t\toscillator.frequency.setValueAtTime(392, now) // G4\n\t\toscillator.frequency.exponentialRampToValueAtTime(523.25, now + 0.25) // C5\n\n\t\tfilter.type = 'lowpass'\n\t\tfilter.frequency.value = 1500\n\n\t\tgainNode.gain.setValueAtTime(0.0001, now)\n\t\tgainNode.gain.exponentialRampToValueAtTime(volume, now + 0.15)\n\t\tgainNode.gain.exponentialRampToValueAtTime(0.0001, now + 0.4)\n\n\t\toscillator.connect(filter).connect(gainNode).connect(ctx.destination)\n\t\toscillator.start(now)\n\t\toscillator.stop(now + 0.45)\n\t}\n\n\tpublic playSuccessSound(volume = 0.2): void {\n\t\tconst ctx = this.getAudioContext()\n\t\tconst now = ctx.currentTime\n\n\t\tconst createBell = (freq: number, start: number, duration: number) => {\n\t\t\tconst osc = ctx.createOscillator()\n\t\t\tconst gain = ctx.createGain()\n\t\t\tconst filter = ctx.createBiquadFilter()\n\n\t\t\tosc.type = 'sine'\n\t\t\tosc.frequency.setValueAtTime(freq, now)\n\t\t\tfilter.type = 'lowpass'\n\t\t\tfilter.frequency.value = freq * 4\n\n\t\t\tgain.gain.setValueAtTime(0.0001, now)\n\t\t\tgain.gain.exponentialRampToValueAtTime(volume, now + 0.1)\n\t\t\tgain.gain.exponentialRampToValueAtTime(0.0001, now + duration)\n\n\t\t\tosc.connect(filter).connect(gain).connect(ctx.destination)\n\t\t\tosc.start(now + start)\n\t\t\tosc.stop(now + duration)\n\t\t}\n\n\t\tcreateBell(659.25, 0, 0.6) // E5\n\t\tcreateBell(523.25, 0.05, 0.55) // C5\n\t}\n\n\tpublic playWarningSound(volume = 0.25): void {\n\t\tconst ctx = this.getAudioContext()\n\t\tconst now = ctx.currentTime\n\n\t\tconst osc1 = ctx.createOscillator()\n\t\tconst osc2 = ctx.createOscillator()\n\t\tconst gain = ctx.createGain()\n\t\tconst filter = ctx.createBiquadFilter()\n\n\t\tosc1.type = 'sine'\n\t\tosc2.type = 'sine'\n\t\tosc1.frequency.setValueAtTime(349.23, now) // F4\n\t\tosc2.frequency.setValueAtTime(440, now) // A4\n\n\t\tfilter.type = 'lowpass'\n\t\tfilter.frequency.value = 1000\n\n\t\tgain.gain.setValueAtTime(0.0001, now)\n\t\tgain.gain.exponentialRampToValueAtTime(volume, now + 0.08)\n\t\tgain.gain.exponentialRampToValueAtTime(0.0001, now + 0.5)\n\n\t\tosc1.connect(filter)\n\t\tosc2.connect(filter)\n\t\tfilter.connect(gain).connect(ctx.destination)\n\n\t\tosc1.start(now)\n\t\tosc2.start(now)\n\t\tosc1.stop(now + 0.55)\n\t\tosc2.stop(now + 0.55)\n\t}\n\n\tpublic playErrorSound(volume = 0.25): void {\n\t\tconst ctx = this.getAudioContext()\n\t\tconst now = ctx.currentTime\n\n\t\tconst osc = ctx.createOscillator()\n\t\tconst gain = ctx.createGain()\n\t\tconst filter = ctx.createBiquadFilter()\n\n\t\tosc.type = 'triangle'\n\t\tosc.frequency.setValueAtTime(220, now) // A3\n\t\tosc.frequency.exponentialRampToValueAtTime(1760, now + 0.3) // A6\n\n\t\tfilter.type = 'lowpass'\n\t\tfilter.frequency.value = 800\n\t\tfilter.Q.value = 0.5\n\n\t\tgain.gain.setValueAtTime(0.0001, now)\n\t\tgain.gain.exponentialRampToValueAtTime(volume * 0.8, now + 0.1)\n\t\tgain.gain.exponentialRampToValueAtTime(0.0001, now + 0.7)\n\n\t\tosc.connect(filter).connect(gain).connect(ctx.destination)\n\t\tosc.start(now)\n\t\tosc.stop(now + 0.75)\n\t}\n\n\t/**\n\t * Generate audio blob files for all notification sounds\n\t * Returns a Promise that resolves with URLs to the generated audio files\n\t */\n\tpublic async generateAudioFiles(volume = 0.25): Promise<Record<string, string>> {\n\t\t// Create offline audio context for rendering\n\t\tconst sampleRate = 44100\n\t\tconst duration = 1 // 1 second duration to capture the full sound\n\n\t\tconst audioUrls: Record<string, string> = {}\n\n\t\t// Generate info sound\n\t\taudioUrls.info = await this.generateAudioFile(\n\t\t\tasync ctx => {\n\t\t\t\t// Create oscillator for main tone\n\t\t\t\tconst oscillator = ctx.createOscillator()\n\t\t\t\toscillator.type = 'sine'\n\t\t\t\toscillator.frequency.setValueAtTime(320, 0)\n\t\t\t\toscillator.frequency.exponentialRampToValueAtTime(520, 0.3)\n\n\t\t\t\t// Create gain node for volume control with softer attack/release\n\t\t\t\tconst gainNode = ctx.createGain()\n\t\t\t\tgainNode.gain.setValueAtTime(0, 0)\n\t\t\t\tgainNode.gain.linearRampToValueAtTime(volume, 0.1)\n\t\t\t\tgainNode.gain.linearRampToValueAtTime(0, 0.5)\n\n\t\t\t\t// Connect and play\n\t\t\t\toscillator.connect(gainNode)\n\t\t\t\tgainNode.connect(ctx.destination)\n\t\t\t\toscillator.start()\n\t\t\t\toscillator.stop(0.5)\n\t\t\t},\n\t\t\tsampleRate,\n\t\t\tduration,\n\t\t)\n\n\t\t// Generate success sound\n\t\taudioUrls.success = await this.generateAudioFile(\n\t\t\tasync ctx => {\n\t\t\t\t// Create main oscillator (higher note)\n\t\t\t\tconst osc1 = ctx.createOscillator()\n\t\t\t\tosc1.type = 'sine'\n\t\t\t\tosc1.frequency.setValueAtTime(660, 0)\n\n\t\t\t\t// Create secondary oscillator (lower note)\n\t\t\t\tconst osc2 = ctx.createOscillator()\n\t\t\t\tosc2.type = 'sine'\n\t\t\t\tosc2.frequency.setValueAtTime(440, 0)\n\n\t\t\t\t// Create gain nodes with softer envelope\n\t\t\t\tconst gain1 = ctx.createGain()\n\t\t\t\tgain1.gain.setValueAtTime(0, 0)\n\t\t\t\tgain1.gain.linearRampToValueAtTime(volume, 0.1)\n\t\t\t\tgain1.gain.linearRampToValueAtTime(0, 0.5)\n\n\t\t\t\tconst gain2 = ctx.createGain()\n\t\t\t\tgain2.gain.setValueAtTime(0, 0)\n\t\t\t\tgain2.gain.linearRampToValueAtTime(volume * 0.6, 0.15)\n\t\t\t\tgain2.gain.linearRampToValueAtTime(0, 0.7)\n\n\t\t\t\t// Connect and play\n\t\t\t\tosc1.connect(gain1)\n\t\t\t\tgain1.connect(ctx.destination)\n\n\t\t\t\tosc2.connect(gain2)\n\t\t\t\tgain2.connect(ctx.destination)\n\n\t\t\t\tosc1.start()\n\t\t\t\tosc2.start(0.15)\n\n\t\t\t\tosc1.stop(0.5)\n\t\t\t\tosc2.stop(0.7)\n\t\t\t},\n\t\t\tsampleRate,\n\t\t\tduration,\n\t\t)\n\n\t\t// Generate warning sound\n\t\taudioUrls.warning = await this.generateAudioFile(\n\t\t\tasync ctx => {\n\t\t\t\t// Create oscillators for a two-tone warning\n\t\t\t\tconst osc1 = ctx.createOscillator()\n\t\t\t\tosc1.type = 'sine'\n\t\t\t\tosc1.frequency.setValueAtTime(293.66, 0)\n\n\t\t\t\tconst osc2 = ctx.createOscillator()\n\t\t\t\tosc2.type = 'sine'\n\t\t\t\tosc2.frequency.setValueAtTime(349.23, 0)\n\n\t\t\t\t// Create gain node with softer envelope\n\t\t\t\tconst gain = ctx.createGain()\n\t\t\t\tgain.gain.setValueAtTime(0, 0)\n\t\t\t\tgain.gain.linearRampToValueAtTime(volume, 0.1)\n\t\t\t\tgain.gain.linearRampToValueAtTime(volume * 0.6, 0.2)\n\t\t\t\tgain.gain.linearRampToValueAtTime(volume * 0.8, 0.3)\n\t\t\t\tgain.gain.linearRampToValueAtTime(0, 0.6)\n\n\t\t\t\t// Connect and play\n\t\t\t\tosc1.connect(gain)\n\t\t\t\tosc2.connect(gain)\n\t\t\t\tgain.connect(ctx.destination)\n\n\t\t\t\tosc1.start()\n\t\t\t\tosc2.start()\n\n\t\t\t\tosc1.stop(0.6)\n\t\t\t\tosc2.stop(0.6)\n\t\t\t},\n\t\t\tsampleRate,\n\t\t\tduration,\n\t\t)\n\n\t\t// Generate error sound\n\t\taudioUrls.error = await this.generateAudioFile(\n\t\t\tasync ctx => {\n\t\t\t\t// Create main oscillator\n\t\t\t\tconst osc = ctx.createOscillator()\n\t\t\t\tosc.type = 'sine'\n\t\t\t\tosc.frequency.setValueAtTime(196, 0)\n\n\t\t\t\t// Create gain node with softer envelope\n\t\t\t\tconst gain = ctx.createGain()\n\t\t\t\tgain.gain.setValueAtTime(0, 0)\n\t\t\t\tgain.gain.linearRampToValueAtTime(volume, 0.1)\n\t\t\t\tgain.gain.linearRampToValueAtTime(volume * 0.4, 0.2)\n\t\t\t\tgain.gain.linearRampToValueAtTime(volume * 0.6, 0.3)\n\t\t\t\tgain.gain.linearRampToValueAtTime(0, 0.7)\n\n\t\t\t\t// Additional filter to make it even softer\n\t\t\t\tconst filter = ctx.createBiquadFilter()\n\t\t\t\tfilter.type = 'lowpass'\n\t\t\t\tfilter.frequency.value = 600\n\t\t\t\tfilter.Q.value = 0.7\n\n\t\t\t\t// Connect and play\n\t\t\t\tosc.connect(filter)\n\t\t\t\tfilter.connect(gain)\n\t\t\t\tgain.connect(ctx.destination)\n\n\t\t\t\tosc.start()\n\t\t\t\tosc.stop(0.7)\n\t\t\t},\n\t\t\tsampleRate,\n\t\t\tduration,\n\t\t)\n\n\t\treturn audioUrls\n\t}\n\n\t/**\n\t * Generate an audio file from a sound generation function\n\t * @param renderFunction Function that creates the sound in the provided context\n\t * @param sampleRate Sample rate for the audio\n\t * @param duration Duration in seconds\n\t * @returns Promise that resolves with the URL to the generated audio file\n\t */\n\tprivate async generateAudioFile(\n\t\trenderFunction: (ctx: OfflineAudioContext) => Promise<void>,\n\t\tsampleRate = 44100,\n\t\tduration = 1,\n\t): Promise<string> {\n\t\t// Create offline context\n\t\tconst offlineCtx = new OfflineAudioContext(2, sampleRate * duration, sampleRate)\n\n\t\t// Render the sound\n\t\tawait renderFunction(offlineCtx)\n\n\t\t// Render the audio\n\t\tconst audioBuffer = await offlineCtx.startRendering()\n\n\t\t// Convert to WAV format\n\t\tconst wavBlob = this.audioBufferToWav(audioBuffer)\n\n\t\t// Create URL\n\t\treturn URL.createObjectURL(wavBlob)\n\t}\n\n\t/**\n\t * Convert AudioBuffer to WAV format\n\t * Based on https://github.com/Jam3/audiobuffer-to-wav\n\t */\n\tprivate audioBufferToWav(buffer: AudioBuffer): Blob {\n\t\tconst numChannels = buffer.numberOfChannels\n\t\tconst sampleRate = buffer.sampleRate\n\t\tconst format = 1 // PCM\n\t\tconst bitDepth = 16\n\n\t\tconst bytesPerSample = bitDepth / 8\n\t\tconst blockAlign = numChannels * bytesPerSample\n\n\t\tconst samples = this.getAudioSamples(buffer, bitDepth)\n\t\tconst dataLength = samples.length * bytesPerSample\n\n\t\t// Create WAV header\n\t\tconst headerLength = 44\n\t\tconst wavBuffer = new ArrayBuffer(headerLength + dataLength)\n\t\tconst view = new DataView(wavBuffer)\n\n\t\t// RIFF identifier\n\t\tthis.writeString(view, 0, 'RIFF')\n\t\t// File length minus RIFF identifier and file size\n\t\tview.setUint32(4, 36 + dataLength, true)\n\t\t// RIFF type\n\t\tthis.writeString(view, 8, 'WAVE')\n\t\t// Format chunk identifier\n\t\tthis.writeString(view, 12, 'fmt ')\n\t\t// Format chunk length\n\t\tview.setUint32(16, 16, true)\n\t\t// Sample format (PCM)\n\t\tview.setUint16(20, format, true)\n\t\t// Channel count\n\t\tview.setUint16(22, numChannels, true)\n\t\t// Sample rate\n\t\tview.setUint32(24, sampleRate, true)\n\t\t// Byte rate (sample rate * block align)\n\t\tview.setUint32(28, sampleRate * blockAlign, true)\n\t\t// Block align (channel count * bytes per sample)\n\t\tview.setUint16(32, blockAlign, true)\n\t\t// Bits per sample\n\t\tview.setUint16(34, bitDepth, true)\n\t\t// Data chunk identifier\n\t\tthis.writeString(view, 36, 'data')\n\t\t// Data chunk length\n\t\tview.setUint32(40, dataLength, true)\n\n\t\t// Write the audio data\n\t\tif (bitDepth === 16) {\n\t\t\tthis.writeInt16Samples(view, headerLength, samples)\n\t\t} else {\n\t\t\tthrow new Error('Only 16-bit audio is supported')\n\t\t}\n\n\t\treturn new Blob([wavBuffer], { type: 'audio/wav' })\n\t}\n\n\t/**\n\t * Get audio samples from an AudioBuffer\n\t */\n\tprivate getAudioSamples(buffer: AudioBuffer, bitDepth: number): number[] {\n\t\tconst numChannels = buffer.numberOfChannels\n\t\tconst length = buffer.length\n\t\tconst samples: number[] = []\n\t\tconst scale = bitDepth === 16 ? 32768 : 128\n\n\t\t// Get samples from all channels\n\t\tfor (let i = 0; i < length; i++) {\n\t\t\tfor (let channel = 0; channel < numChannels; channel++) {\n\t\t\t\tconst sample = buffer.getChannelData(channel)[i]\n\t\t\t\t// Convert float32 to int16 or int8\n\t\t\t\tconst intSample = Math.max(-1, Math.min(1, sample))\n\t\t\t\tsamples.push(intSample * scale)\n\t\t\t}\n\t\t}\n\n\t\treturn samples\n\t}\n\n\t/**\n\t * Write 16-bit samples to a DataView\n\t */\n\tprivate writeInt16Samples(view: DataView, offset: number, samples: number[]): void {\n\t\tfor (let i = 0; i < samples.length; i++) {\n\t\t\tview.setInt16(offset + i * 2, samples[i], true)\n\t\t}\n\t}\n\n\t/**\n\t * Write a string to a DataView\n\t */\n\tprivate writeString(view: DataView, offset: number, string: string): void {\n\t\tfor (let i = 0; i < string.length; i++) {\n\t\t\tview.setUint8(offset + i, string.charCodeAt(i))\n\t\t}\n\t}\n}\n","import { fromEvent, takeUntil } from 'rxjs'\nimport { NotificationType } from './notification'\nimport { NotificationSoundGenerator } from './notification-audio-generator'\n\n/**\n * Audio service for playing notification sounds.\n * Uses Web Audio API with fallback to HTML5 Audio.\n */\nexport class NotificationAudioService {\n\tprivate audioContext: AudioContext | null = null\n\tprivate soundBuffers: Map<NotificationType, AudioBuffer> = new Map()\n\tprivate volume: number = 0.5\n\tprivate muted: boolean = false\n\tprivate soundGenerator = new NotificationSoundGenerator()\n\tprivate disconnecting = new EventTarget()\n\n\t// Default sound URLs (will be generated programmatically as fallback)\n\tprivate soundUrls: Record<NotificationType, string> = {\n\t\tinfo: '/assets/sounds/notification-info.mp3',\n\t\tsuccess: '/assets/sounds/notification-success.mp3',\n\t\twarning: '/assets/sounds/notification-warning.mp3',\n\t\terror: '/assets/sounds/notification-error.mp3',\n\t}\n\n\tconstructor() {\n\t\t// Initialize audio context when first needed\n\t\tthis.initializeAudioFiles()\n\t}\n\n\t/**\n\t * Initialize audio files - generate programmatically if needed\n\t */\n\tprivate async initializeAudioFiles(): Promise<void> {\n\t\ttry {\n\t\t\t// Try to load from default URLs\n\t\t\tawait this.preloadSounds()\n\t\t} catch (err) {\n\n\t\t\t// If loading fails, generate programmatically\n\t\t\ttry {\n\t\t\t\tconst generatedUrls = await this.soundGenerator.generateAudioFiles(this.volume)\n\t\t\t\tthis.soundUrls = generatedUrls\n\t\t\t} catch (genErr) {\n\t\t\t\tconsole.warn('Failed to generate notification sounds:', genErr)\n\t\t\t\t// Will fall back to direct playback when needed\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Lazy-initialize the audio context\n\t */\n\tprivate getAudioContext(): AudioContext {\n\t\tif (!this.audioContext) {\n\t\t\t// Use AudioContext with webkit prefix fallback for Safari\n\t\t\tconst AudioContextClass = window.AudioContext || (window as any).webkitAudioContext\n\t\t\tthis.audioContext = new AudioContextClass()\n\t\t}\n\n\t\treturn this.audioContext\n\t}\n\n\t/**\n\t * Preload all notification sounds\n\t */\n\tprivate async preloadSounds(): Promise<void> {\n\t\tconst types: NotificationType[] = ['info', 'success', 'warning', 'error']\n\n\t\tfor (const type of types) {\n\t\t\ttry {\n\t\t\t\tconst buffer = await this.loadSound(type)\n\t\t\t\tthis.soundBuffers.set(type, buffer)\n\t\t\t} catch (err) {\n\t\t\t\tconsole.warn(`Failed to preload ${type} sound:`, err)\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Load a sound file and decode it\n\t */\n\tprivate async loadSound(type: NotificationType): Promise<AudioBuffer> {\n\t\tconst url = this.soundUrls[type]\n\t\tconst response = await fetch(url)\n\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`Failed to load sound from ${url}: ${response.statusText}`)\n\t\t}\n\n\t\tconst arrayBuffer = await response.arrayBuffer()\n\t\treturn await this.getAudioContext().decodeAudioData(arrayBuffer)\n\t}\n\n\t/**\n\t * Play a notification sound\n\t */\n\tpublic async playSound(type: NotificationType): Promise<void> {\n\t\tif (this.muted) return\n\n\t\ttry {\n\t\t\t// Try to use Web Audio API first\n\t\t\tconst context = this.getAudioContext()\n\n\t\t\t// Ensure audio context is resumed (needed due to autoplay policy)\n\t\t\tif (context.state === 'suspended') {\n\t\t\t\tawait context.resume()\n\t\t\t}\n\n\t\t\t// Try to use programmatically generated sound first\n\t\t\tif (this.soundUrls[type].startsWith('blob:')) {\n\t\t\t\tthis.playFallbackSound(type)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Load sound if not already cached\n\t\t\tif (!this.soundBuffers.has(type)) {\n\t\t\t\ttry {\n\t\t\t\t\tconst buffer = await this.loadSound(type)\n\t\t\t\t\tthis.soundBuffers.set(type, buffer)\n\t\t\t\t} catch (err) {\n\t\t\t\t\t// Fall back to direct generator\n\t\t\t\t\tthis.playDirectGeneratedSound(type)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst buffer = this.soundBuffers.get(type)\n\t\t\tif (!buffer) {\n\t\t\t\tthrow new Error(`Sound buffer for ${type} not available`)\n\t\t\t}\n\n\t\t\t// Create source and gain nodes\n\t\t\tconst source = context.createBufferSource()\n\t\t\tsource.buffer = buffer\n\n\t\t\tconst gainNode = context.createGain()\n\t\t\tgainNode.gain.value = this.volume\n\n\t\t\t// Connect and play\n\t\t\tsource.connect(gainNode)\n\t\t\tgainNode.connect(context.destination)\n\t\t\tsource.start(0)\n\t\t} catch (err) {\n\t\t\tconsole.warn(`Web Audio API buffer playback failed, trying direct generation:`, err)\n\t\t\tthis.playDirectGeneratedSound(type)\n\t\t}\n\t}\n\n\t/**\n\t * Play a directly generated sound when other methods fail\n\t */\n\tprivate playDirectGeneratedSound(type: NotificationType): void {\n\t\tif (this.muted) return\n\n\t\ttry {\n\t\t\tswitch (type) {\n\t\t\t\tcase 'info':\n\t\t\t\t\tthis.soundGenerator.playInfoSound(this.volume)\n\t\t\t\t\tbreak\n\t\t\t\tcase 'success':\n\t\t\t\t\tthis.soundGenerator.playSuccessSound(this.volume)\n\t\t\t\t\tbreak\n\t\t\t\tcase 'warning':\n\t\t\t\t\tthis.soundGenerator.playWarningSound(this.volume)\n\t\t\t\t\tbreak\n\t\t\t\tcase 'error':\n\t\t\t\t\tthis.soundGenerator.playErrorSound(this.volume)\n\t\t\t\t\tbreak\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconsole.error(`Failed to play generated sound for ${type}:`, err)\n\t\t}\n\t}\n\n\t/**\n\t * Handle audio ended event for cleanup\n\t */\n\tprivate handleAudioEnded = (audio: HTMLAudioElement) => () => {\n\t\taudio.remove()\n\t}\n\n\t/**\n\t * Play sound using HTML5 Audio as a fallback\n\t */\n\tprivate playFallbackSound(type: NotificationType): void {\n\t\tif (this.muted) return\n\n\t\ttry {\n\t\t\tconst audio = new Audio(this.soundUrls[type])\n\t\t\taudio.volume = this.volume\n\n\t\t\t// Add event listener to clean up after playback using RxJS\n\t\t\tfromEvent(audio, 'ended').pipe(\n\t\t\t\ttakeUntil(fromEvent(this.disconnecting, 'disconnect'))\n\t\t\t).subscribe(this.handleAudioEnded(audio))\n\n\t\t\taudio.play().catch(err => {\n\t\t\t\tconsole.error(`Failed to play fallback sound for ${type}:`, err)\n\t\t\t\tthis.playDirectGeneratedSound(type)\n\t\t\t})\n\t\t} catch (err) {\n\t\t\tconsole.error('HTML5 Audio fallback failed:', err)\n\t\t\tthis.playDirectGeneratedSound(type)\n\t\t}\n\t}\n\n\t/**\n\t * Set volume for notification sounds (0.0 to 1.0)\n\t */\n\tpublic setVolume(volume: number): void {\n\t\tthis.volume = Math.max(0, Math.min(1, volume))\n\t}\n\n\t/**\n\t * Get current volume level\n\t */\n\tpublic getVolume(): number {\n\t\treturn this.volume\n\t}\n\n\t/**\n\t * Mute notification sounds\n\t */\n\tpublic mute(): void {\n\t\tthis.muted = true\n\t}\n\n\t/**\n\t * Unmute notification sounds\n\t */\n\tpublic unmute(): void {\n\t\tthis.muted = false\n\t}\n\n\t/**\n\t * Check if notification sounds are muted\n\t */\n\tpublic isMuted(): boolean {\n\t\treturn this.muted\n\t}\n\n\t/**\n\t * Set custom sound URL for a notification type\n\t */\n\tpublic setSoundUrl(type: NotificationType, url: string): void {\n\t\tthis.soundUrls[type] = url\n\n\t\t// Clear cached buffer to force reload\n\t\tthis.soundBuffers.delete(type)\n\t}\n\n\t/**\n\t * Get the current sound URL for a notification type\n\t */\n\tpublic getSoundUrl(type: NotificationType): string {\n\t\treturn this.soundUrls[type]\n\t}\n\n\t/**\n\t * Cleanup all subscriptions and resources\n\t */\n\tpublic dispose(): void {\n\t\tthis.disconnecting.dispatchEvent(new Event('disconnect'))\n\n\t\t// Close audio context if exists\n\t\tif (this.audioContext && this.audioContext.state !== 'closed') {\n\t\t\tthis.audioContext.close().catch(err => {\n\t\t\t\tconsole.warn('Failed to close audio context:', err)\n\t\t\t})\n\t\t}\n\t}\n}\n","import { $LitElement } from '@mixins/index'\nimport { html } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { classMap } from 'lit/directives/class-map.js'\nimport { repeat } from 'lit/directives/repeat.js'\nimport { fromEvent, takeUntil } from 'rxjs'\nimport { NotificationType } from './notification'\nimport { NotificationAudioService } from './notification-audio'\nimport style from './notification-container.scss?inline'\n\nexport interface NotificationItem {\n\tid: string\n\ttitle: string\n\tmessage: string\n\ttype: NotificationType\n\tduration: number\n\tclosable: boolean\n\tplaySound: boolean\n\tshowProgress?: boolean\n}\n\nexport interface NotificationOptions {\n\tid?: string\n\ttitle?: string\n\tmessage: string\n\ttype?: NotificationType\n\tduration?: number\n\tclosable?: boolean\n\tplaySound?: boolean\n\tshowProgress?: boolean\n}\n\n/**\n * Container component for displaying stacked notifications.\n *\n * @element sch-notification-container\n */\n@customElement('sch-notification-container')\nexport default class SchmancyNotificationContainer extends $LitElement(style) {\n\t@property({ type: String }) position:\n\t\t| 'top-right'\n\t\t| 'top-left'\n\t\t| 'bottom-right'\n\t\t| 'bottom-left'\n\t\t| 'top-center'\n\t\t| 'bottom-center' = 'top-right'\n\t@property({ type: Number }) maxVisibleNotifications = 2\n\t@property({ type: Boolean }) playSound = false\n\t@property({ type: Number }) audioVolume = 0.1\n\n\t@state() private _notifications: NotificationItem[] = []\n\n\t// Audio service\n\tprivate _audioService = new NotificationAudioService()\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback()\n\n\t\t// Set audio volume\n\t\tthis._audioService.setVolume(this.audioVolume)\n\n\t\t// Listen for notification events\n\t\tfromEvent<CustomEvent<NotificationOptions>>(window, 'schmancy-notification')\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe(event => {\n\t\t\t\tthis.addNotification(event.detail)\n\t\t\t})\n\n\t\t// Listen for dismiss events\n\t\tfromEvent<CustomEvent<{ id: string }>>(window, 'schmancy-notification-dismiss')\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe(event => {\n\t\t\t\tthis.removeNotification(event.detail.id)\n\t\t\t})\n\n\t\t// Listen for update events\n\t\tfromEvent<CustomEvent<{ id: string } & Partial<NotificationOptions>>>(window, 'schmancy-notification-update')\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe(event => {\n\t\t\t\tthis.updateNotification(event.detail.id, event.detail)\n\t\t\t})\n\n\t\t// Listen for play sound events from child notifications\n\t\tfromEvent<CustomEvent>(this, 'playsound')\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe(this.handlePlaySound)\n\t}\n\n\t// Public API to add notifications\n\tpublic addNotification(options: NotificationOptions): string {\n\t\tconst id = options.id || `notification-${Date.now()}-${Math.floor(Math.random() * 10000)}`\n\n\t\tconst notification: NotificationItem = {\n\t\t\tid,\n\t\t\ttitle: options.title || '',\n\t\t\tmessage: options.message,\n\t\t\ttype: options.type || 'info',\n\t\t\tduration: options.duration !== undefined ? options.duration : 750,\n\t\t\tclosable: options.closable !== undefined ? options.closable : true,\n\t\t\tplaySound: options.playSound !== undefined ? options.playSound : this.playSound,\n\t\t\tshowProgress: options.showProgress !== undefined ? options.showProgress : false,\n\t\t}\n\n\t\t// Add new notification (top for top-* positions, bottom for bottom-* positions)\n\t\tif (this.position.startsWith('top')) {\n\t\t\tthis._notifications = [...this._notifications, notification]\n\t\t} else {\n\t\t\tthis._notifications = [notification, ...this._notifications]\n\t\t}\n\n\t\t// Enforce max visible notifications\n\t\tif (this._notifications.length > this.maxVisibleNotifications) {\n\t\t\tthis._notifications = this._notifications.slice(-this.maxVisibleNotifications)\n\t\t}\n\n\t\t// Play sound if enabled\n\t\tif (notification.playSound) {\n\t\t\tthis._audioService.playSound(notification.type)\n\t\t}\n\n\t\treturn id\n\t}\n\n\tpublic removeNotification(id: string) {\n\t\tthis._notifications = this._notifications.filter(n => n.id !== id)\n\t}\n\n\tpublic updateNotification(id: string, options: Partial<NotificationOptions>) {\n\t\tconst index = this._notifications.findIndex(n => n.id === id)\n\t\tif (index !== -1) {\n\t\t\tthis._notifications[index] = {\n\t\t\t\t...this._notifications[index],\n\t\t\t\t...options,\n\t\t\t}\n\t\t\tthis.requestUpdate()\n\t\t}\n\t}\n\n\tprivate handlePlaySound = (event: CustomEvent) => {\n\t\tif (this.playSound) {\n\t\t\tthis._audioService.playSound(event.detail.type)\n\t\t}\n\t}\n\n\tprivate _handleClose(e: CustomEvent) {\n\t\tconst id = e.detail.id\n\t\tthis.removeNotification(id)\n\t}\n\n\trender() {\n\t\treturn html`\n\t\t\t<div\n\t\t\t\tclass=${classMap({\n\t\t\t\t\t'notification-container': true,\n\t\t\t\t\t[this.position]: true,\n\t\t\t\t})}\n\t\t\t>\n\t\t\t\t${repeat(\n\t\t\t\t\tthis._notifications,\n\t\t\t\t\tnotification => notification.id,\n\t\t\t\t\tnotification => html`\n <sch-notification\n .id=${notification.id}\n .title=${notification.title}\n .message=${notification.message}\n .type=${notification.type}\n .duration=${notification.duration}\n ?closable=${notification.closable}\n ?playSound=${false}\n ?showProgress=${notification.showProgress}\n @close=${this._handleClose}\n ></sch-notification>\n `,\n\t\t\t\t)}\n\t\t\t</div>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'sch-notification-container': SchmancyNotificationContainer\n\t}\n}\n","import { NotificationOptions } from './notification-container'\n\n/**\n * Notification service for centralized notification management.\n * Provides a simple API for showing notifications.\n */\nexport class NotificationService {\n\tprivate static instance: NotificationService\n\tprivate notificationStack: string[] = []\n\n\t// Default notification options\n\tprivate static DEFAULT_OPTIONS: Partial<NotificationOptions> = {\n\t\tduration: 1000, // 1 seconds - long enough to be readable\n\t\tclosable: true,\n\t\tplaySound: true,\n\t}\n\n\t// Private constructor for singleton pattern\n\tprivate constructor() {}\n\n\t/**\n\t * Get the singleton instance\n\t */\n\tpublic static getInstance(): NotificationService {\n\t\tif (!NotificationService.instance) {\n\t\t\tNotificationService.instance = new NotificationService()\n\t\t}\n\t\treturn NotificationService.instance\n\t}\n\n\t/**\n\t * Show a notification\n\t * @returns The ID of the created notification\n\t */\n\tpublic notify(options: NotificationOptions): string {\n\t\t// Apply default options\n\t\tconst completeOptions = {\n\t\t\t...NotificationService.DEFAULT_OPTIONS,\n\t\t\t...options,\n\t\t\t// Override with duraton from options if provided, otherwise use default\n\t\t\tduration: options.duration ?? NotificationService.DEFAULT_OPTIONS.duration,\n\t\t}\n\n\t\tconst id = completeOptions.id || `notification-${Date.now()}-${Math.floor(Math.random() * 10000)}`\n\n\t\t// Add to stack for tracking\n\t\tthis.notificationStack.push(id)\n\n\t\t// Create and dispatch event\n\t\tconst event = new CustomEvent('schmancy-notification', {\n\t\t\tbubbles: true,\n\t\t\tcomposed: true,\n\t\t\tdetail: {\n\t\t\t\t...completeOptions,\n\t\t\t\tid,\n\t\t\t},\n\t\t})\n\n\t\twindow.dispatchEvent(event)\n\t\treturn id\n\t}\n\n\t/**\n\t * Dismiss a notification\n\t * @param id Optional notification ID. If not provided, dismisses the most recent notification\n\t */\n\tpublic dismiss(id?: string): void {\n\t\tlet targetId: string | undefined\n\n\t\tif (id) {\n\t\t\t// Remove specific notification from stack\n\t\t\tconst index = this.notificationStack.indexOf(id)\n\t\t\tif (index > -1) {\n\t\t\t\tthis.notificationStack.splice(index, 1)\n\t\t\t\ttargetId = id\n\t\t\t}\n\t\t} else {\n\t\t\t// Remove most recent notification (last in stack)\n\t\t\ttargetId = this.notificationStack.pop()\n\t\t}\n\n\t\tif (targetId) {\n\t\t\t// Dispatch dismiss event\n\t\t\tconst event = new CustomEvent('schmancy-notification-dismiss', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t\tdetail: { id: targetId },\n\t\t\t})\n\t\t\twindow.dispatchEvent(event)\n\t\t}\n\t}\n\n\t/**\n\t * Update a notification's content\n\t */\n\tpublic update(id: string, options: Partial<NotificationOptions>): void {\n\t\tconst event = new CustomEvent('schmancy-notification-update', {\n\t\t\tbubbles: true,\n\t\t\tcomposed: true,\n\t\t\tdetail: { id, ...options },\n\t\t})\n\t\twindow.dispatchEvent(event)\n\t}\n\n\t/**\n\t * Show an info notification\n\t */\n\tpublic info(message?: string, options: Partial<Omit<NotificationOptions, 'message' | 'type'>> = {}): string {\n\t\treturn this.notify({\n\t\t\tmessage: message ?? '',\n\t\t\ttype: 'info',\n\t\t\tduration: message ? options.duration : 1,\n\t\t\t...options,\n\t\t})\n\t}\n\n\t/**\n\t * Show a success notification\n\t */\n\tpublic success(message?: string, options: Partial<Omit<NotificationOptions, 'message' | 'type'>> = {}): string {\n\t\treturn this.notify({\n\t\t\tmessage: message ?? '',\n\t\t\ttype: 'success',\n\t\t\tduration: message ? options.duration : 1,\n\t\t\t...options,\n\t\t})\n\t}\n\n\t/**\n\t * Show a warning notification\n\t */\n\tpublic warning(message?: string, options: Partial<Omit<NotificationOptions, 'message' | 'type'>> = {}): string {\n\t\treturn this.notify({\n\t\t\tmessage: message ?? '',\n\t\t\ttype: 'warning',\n\t\t\tduration: message ? options.duration : 1,\n\t\t\t...options,\n\t\t})\n\t}\n\n\t/**\n\t * Show an error notification\n\t */\n\tpublic error(message?: string, options: Partial<Omit<NotificationOptions, 'message' | 'type'>> = {}): string {\n\t\treturn this.notify({\n\t\t\tmessage: message ?? '',\n\t\t\ttype: 'error',\n\t\t\tduration: message ? options.duration : 1,\n\t\t\t...options,\n\t\t})\n\t}\n\n\t/**\n\t * Show a notification with a custom duration\n\t */\n\tpublic customDuration(\n\t\tmessage: string,\n\t\tduration: number,\n\t\toptions: Partial<Omit<NotificationOptions, 'message' | 'duration'>> = {},\n\t): string {\n\t\treturn this.notify({\n\t\t\tmessage,\n\t\t\tduration,\n\t\t\t...options,\n\t\t})\n\t}\n\n\t/**\n\t * Show a persistent notification (won't auto-dismiss)\n\t */\n\tpublic persistent(message: string, options: Partial<Omit<NotificationOptions, 'message' | 'duration'>> = {}): string {\n\t\treturn this.notify({\n\t\t\tmessage,\n\t\t\tduration: 0, // Zero duration means no auto-close\n\t\t\t...options,\n\t\t})\n\t}\n\n}\n\n/**\n * Global notification utility - provides a quick way to show notifications\n */\nexport const $notify = {\n\t/**\n\t * Show a notification\n\t */\n\tshow: (options: NotificationOptions): string => {\n\t\treturn NotificationService.getInstance().notify(options)\n\t},\n\n\t/**\n\t * Show an info notification\n\t */\n\tinfo: (message?: string, options: Partial<Omit<NotificationOptions, 'message' | 'type'>> = {}): string => {\n\t\treturn NotificationService.getInstance().info(message, options)\n\t},\n\n\t/**\n\t * Show a success notification\n\t */\n\tsuccess: (message?: string, options: Partial<Omit<NotificationOptions, 'message' | 'type'>> = {}): string => {\n\t\treturn NotificationService.getInstance().success(message, options)\n\t},\n\n\t/**\n\t * Show a warning notification\n\t */\n\twarning: (message?: string, options: Partial<Omit<NotificationOptions, 'message' | 'type'>> = {}): string => {\n\t\treturn NotificationService.getInstance().warning(message, options)\n\t},\n\n\t/**\n\t * Show an error notification\n\t */\n\terror: (message?: string, options: Partial<Omit<NotificationOptions, 'message' | 'type'>> = {}): string => {\n\t\treturn NotificationService.getInstance().error(message, options)\n\t},\n\n\t/**\n\t * Show a notification with a custom duration\n\t * @param message The notification message\n\t * @param duration Duration in milliseconds before auto-dismissing (0 for no auto-dismiss)\n\t * @param options Additional notification options\n\t */\n\tcustomDuration: (\n\t\tmessage: string,\n\t\tduration: number,\n\t\toptions: Partial<Omit<NotificationOptions, 'message' | 'duration'>> = {},\n\t): string => {\n\t\treturn NotificationService.getInstance().customDuration(message, duration, options)\n\t},\n\n\t/**\n\t * Show a persistent notification that won't auto-dismiss\n\t */\n\tpersistent: (message: string, options: Partial<Omit<NotificationOptions, 'message' | 'duration'>> = {}): string => {\n\t\treturn NotificationService.getInstance().persistent(message, options)\n\t},\n\n\t/**\n\t * Dismiss a notification\n\t * @param id Optional notification ID. If not provided, dismisses the most recent notification (queue-like behavior)\n\t */\n\tdismiss: (id?: string): void => {\n\t\treturn NotificationService.getInstance().dismiss(id)\n\t},\n\n\t/**\n\t * Update a notification's content\n\t */\n\tupdate: (id: string, options: Partial<NotificationOptions>): void => {\n\t\treturn NotificationService.getInstance().update(id, options)\n\t},\n}\n\nexport default NotificationService\n"],"names":["SchmancyNotification","$LitElement","constructor","super","arguments","this","title","message","type","closable","duration","id","Date","now","Math","floor","random","playSound","showProgress","_visible","_progress","_hovered","_closing","connectedCallback","_startAutoCloseTimer","_playSound","disconnectedCallback","_clearTimers","changedProps","updated","has","endTime","_autoCloseTimer","window","setTimeout","close","_progressTimer","setInterval","remaining","max","clearTimeout","clearInterval","_pauseTimers","remainingTime","dispatchEvent","CustomEvent","detail","bubbles","composed","_handleMouseEnter","_resumeTimers","render","html","typeStyles","_getTypeStyles","elevationLevel","classMap","notification","closing","styleMap","transform","opacity","boxShadow","transition","_handleMouseLeave","color","iconColor","bgColor","icon","SchmancyTheme","sys","primary","default","surface","on","success","tertiary","error","onVariant","progressColor","container","__decorateClass","property","String","prototype","Boolean","Number","state","customElement","NotificationSoundGenerator","audioContext","getAudioContext","AudioContextClass","AudioContext","webkitAudioContext","volume","ctx","currentTime","oscillator","createOscillator","gainNode","createGain","filter","createBiquadFilter","frequency","setValueAtTime","exponentialRampToValueAtTime","value","gain","connect","destination","start","stop","createBell","freq","osc","osc1","osc2","Q","audioUrls","info","generateAudioFile","async","linearRampToValueAtTime","sampleRate","gain1","gain2","warning","renderFunction","offlineCtx","OfflineAudioContext","audioBuffer","startRendering","wavBlob","audioBufferToWav","URL","createObjectURL","buffer","numChannels","numberOfChannels","blockAlign","bitDepth","samples","getAudioSamples","dataLength","length","wavBuffer","ArrayBuffer","view","DataView","writeString","setUint32","setUint16","writeInt16Samples","Blob","scale","i","channel","sample","getChannelData","intSample","min","push","offset","setInt16","string","setUint8","charCodeAt","NotificationAudioService","soundBuffers","Map","muted","soundGenerator","disconnecting","EventTarget","soundUrls","handleAudioEnded","audio","remove","initializeAudioFiles","preloadSounds","err","generatedUrls","generateAudioFiles","genErr","types","loadSound","set","url","response","fetch","ok","Error","statusText","arrayBuffer","decodeAudioData","context","resume","startsWith","playFallbackSound","playDirectGeneratedSound","get","source","createBufferSource","playInfoSound","playSuccessSound","playWarningSound","playErrorSound","Audio","fromEvent","pipe","takeUntil","subscribe","play","catch","getVolume","mute","unmute","delete","dispose","Event","SchmancyNotificationContainer","position","maxVisibleNotifications","audioVolume","_notifications","_audioService","handlePlaySound","event","setVolume","addNotification","removeNotification","updateNotification","options","slice","n","index","findIndex","requestUpdate","e","repeat","_handleClose","NotificationService","notificationStack","getInstance","instance","completeOptions","DEFAULT_OPTIONS","targetId","indexOf","splice","pop","notify","_$","$notify","show","customDuration","persistent","dismiss","update"],"mappings":";;;;;;;;;;;;;;;;AAgBA,IAAqBA,IAArB,cAAkDC;EAAlD,cAAAC;AAAAC,UAAAA,GAAAC,YAC6BC,KAAAC,QAAQ,IACRD,KAAAE,UAAU,IACVF,KAAAG,OAAyB,QACxBH,KAAAI,WAAAA,IACDJ,KAAAK,WAAW,KACXL,KAAAM,KAAK,gBAAgBC,KAAKC,IAAAA,CAAAA,IAASC,KAAKC,MAAsB,MAAhBD,KAAKE,aAClDX,KAAAY,YAAAA,IACAZ,KAAAa,eAAAA,IAEpBb,KAAQc,WAAAA,IACRd,KAAQe,YAAY,KACpBf,KAAQgB,WAAAA,IACRhB,KAAQiB,WAAAA;AAAAA,EAAW;AAAA,EAI5B;AACCnB,UAAMoB,kBAAAA,GAEFlB,KAAKK,WAAW,KACnBL,KAAKmB,qBAAAA,GAGFnB,KAAKY,aACRZ,KAAKoB,WAAAA;AAAAA,EAEP;AAAA,EAEA,uBAAAC;AACCrB,SAAKsB,gBACLxB,MAAMuB,qBAAAA;AAAAA,EACP;AAAA,EAEA,QAAQE;AACPzB,UAAM0B,QAAQD,IAEVA,EAAaE,IAAI,eAAezB,KAAKK,WAAW,MACnDL,KAAKsB,aAAAA,GACLtB,KAAKmB,qBAAAA;AAAAA,EAEP;AAAA,EAEQ,uBAAAA;AACP,QAAInB,KAAKK,YAAY,EAAG;AAExB,UACMqB,IADYnB,KAAKC,QACKR,KAAKK;AAGjCL,SAAK2B,kBAAkBC,OAAOC,WAAW,MAAA;AACxC7B,WAAK8B;OACH9B,KAAKK,QAAAA,GAGRL,KAAK+B,iBAAiBH,OAAOI,YAAY,MAAA;AACxC,UAAIhC,KAAKgB,SAAU;AAEnB,YAAMR,IAAMD,KAAKC,IAAAA,GACXyB,IAAYxB,KAAKyB,IAAI,GAAGR,IAAUlB,CAAAA;AACxCR,WAAKe,YAAakB,IAAYjC,KAAKK,WAAY,KAE3C4B,KAAa,KAChBjC,KAAKsB;OAEJ,EAAA;AAAA,EACJ;AAAA,EAEQ,eAAAA;AACHtB,SAAK2B,oBACRQ,aAAanC,KAAK2B,kBAClB3B,KAAK2B,kBAAAA,SAGF3B,KAAK+B,mBACRK,cAAcpC,KAAK+B,cAAAA,GACnB/B,KAAK+B,iBAAAA;AAAAA,EAEP;AAAA,EAEQ,eAAAM;AACPrC,SAAKsB,aAAAA;AAAAA,EACN;AAAA,EAEQ;AACP,QAAItB,KAAKK,WAAW,GAAG;AAEtB,YAAMiC,IAAiBtC,KAAKe,YAAY,MAAOf,KAAKK;AAEpD,UAAIiC,IAAgB,GAAG;AACtBtC,aAAK2B,kBAAkBC,OAAOC,WAAW,MAAA;AACxC7B,eAAK8B,MAAAA;AAAAA,QAAAA,GACHQ,CAAAA;AAEH,cACMZ,IADYnB,KAAKC,QACK8B;AAE5BtC,aAAK+B,iBAAiBH,OAAOI,YAAY;AACxC,cAAIhC,KAAKgB,SAAU;AAEnB,gBAAMR,IAAMD,KAAKC,IAAAA,GACXyB,IAAYxB,KAAKyB,IAAI,GAAGR,IAAUlB,CAAAA;AACxCR,eAAKe,YAAakB,IAAYK,IAAiB,KAE3CL,KAAa,KAChBjC,KAAKsB,aAAAA;AAAAA,QAAAA,GAEJ,EAAA;AAAA,MACJ;AAAA,IACD;AAAA,EACD;AAAA,EAEQ,aAAAF;AAEPpB,SAAKuC,cACJ,IAAIC,YAAY,aAAa,EAC5BC,QAAQ,EAAEtC,MAAMH,KAAKG,QACrBuC,SAAAA,IACAC,aAAU,CAAA,CAAA;AAAA,EAGb;AAAA,EAEQ,oBAAAC;AACP5C,SAAKgB,eACLhB,KAAKqC;EACN;AAAA,EAEQ;AACPrC,SAAKgB,WAAAA,IACLhB,KAAK6C,cAAAA;AAAAA,EACN;AAAA,EAEO,QAAAf;AACF9B,SAAKiB,aAETjB,KAAKiB,WAAAA,IACLjB,KAAKsB,aAAAA,GAGLtB,KAAKc,WAAAA,IAGLe,WAAW,MAAA;AACV7B,WAAKuC,cACJ,IAAIC,YAAY,SAAS,EACxBC,QAAQ,EAAEnC,IAAIN,KAAKM,GAAAA,GACnBoC,SAAAA,IACAC,UAAAA;OAGA,GAAA;AAAA,EACJ;AAAA,EAEA,SAAAG;AACC,QAAA,CAAK9C,KAAKc,YAAYd,KAAKiB,SAAU,QAAO8B;AAE5C,UAAMC,IAAahD,KAAKiD,eAAAA,GAGlBC,IAAiBlD,KAAKgB,WAAW,MAAM;AAE7C,WAAO+B;AAAAA;AAAAA,YAEGI,EAAS,EAChBC,kBACAC,SAASrD,KAAKiB,UACd,CAACjB,KAAKG,IAAAA,GAAAA,GAAO,CAAA,CAAA;AAAA;AAAA,YAGNmD,EAAS,EAChBC,WAAWvD,KAAKiB,WAAW,qBAAqB,iBAChDuC,SAASxD,KAAKiB,WAAW,MAAM,KAC/BwC,WAAW,gCAAgCP,MAC3CQ,YACC,+GAAA,CAAA,CAAA;AAAA,kBAEY1D,KAAK4C,iBAAAA;AAAAA,kBACL5C,KAAK2D,iBAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,QAKfC,EAAM,EACPA,OAAOZ,EAAWa,WAClBC,SAAS,sBAAsBd,EAAWa,SAAAA,qBAAAA,CAAAA,CAAAA;AAAAA;AAAAA,QAGzCb,EAAWe,IAAAA;AAAAA;AAAAA;AAAAA;AAAAA,QAIX/D,KAAKC,QACJ8C;AAAAA;AAAAA;AAAAA,kBAGSO,EAAS,EAChBM,OACC5D,KAAKG,SAAS,SACX,sBAAsB6D,EAAcC,IAAIL,MAAMM,QAAQC,OAAAA,SAAgBH,EAAcC,IAAIL,MAAMQ,QAAQC,EAAAA,UACtGrE,KAAKG,SAAS,YACb,sBAAsB6D,EAAcC,IAAIL,MAAMU,QAAQH,OAAAA,SAAgBH,EAAcC,IAAIL,MAAMQ,QAAQC,EAAAA,UACtGrE,KAAKG,SAAS,YACb,sBAAsB6D,EAAcC,IAAIL,MAAMW,SAASJ,OAAAA,SAAgBH,EAAcC,IAAIL,MAAMQ,QAAQC,EAAAA,UACvG,sBAAsBL,EAAcC,IAAIL,MAAMY,MAAML,OAAAA,SAAgBH,EAAcC,IAAIL,MAAMQ,QAAQC,EAAAA,QAAAA,CAAAA,CAAAA;AAAAA;AAAAA,YAGzGrE,KAAKC,KAAAA;AAAAA;AAAAA,YAGR,EAAA;AAAA;AAAA,6BAEoBD,KAAKE,OAAAA;AAAAA;AAAAA;AAAAA,OAG3BF,KAAKI,WACJ2C;AAAAA;AAAAA;AAAAA;AAAAA,kBAIU/C,KAAK8B,KAAAA;AAAAA,iBACNwB,EAAS,EAChBM,OACC5D,KAAKG,SAAS,SACX6D,EAAcC,IAAIL,MAAMQ,QAAQK,YAChC,sBAAsBzB,EAAWa,SAAAA,SAAkBG,EAAcC,IAAIL,MAAMQ,QAAQK,SAAAA,QAAAA,CAAAA,CAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,WAkBzF,EAAA;AAAA;AAAA;AAAA,MAGFzE,KAAKa,gBAAgBb,KAAKK,WAAW,IACpC0C;AAAAA;AAAAA;AAAAA;AAAAA,iBAIU/C,KAAKG,SAAS,UAAU,UAAUH,KAAKG,SAAS,YAAY,YAAY,SAAA;AAAA,yBAChEH,KAAKa,YAAAA;AAAAA,iBACbb,KAAKa,eAAe,IAAIb,KAAKe,SAAAA;AAAAA,eAC/B,GAAA;AAAA;AAAA,UAGR,EAAA;AAAA;AAAA;AAAA,EAGN;AAAA,EAEQ,iBAAAkC;AACP,YAAQjD,KAAKG,MAAAA;AAAAA,MACZ,KAAK;AACJ,eAAO,EACN4D,MAAMhB;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,QAeNc,WAAWG,EAAcC,IAAIL,MAAMU,QAAQH,SAC3CO,eAAe,sBAAsBV,EAAcC,IAAIL,MAAMU,QAAQH,gBAAgBH,EAAcC,IAAIL,MAAMU,QAAQK,SAAAA,OAAAA;AAAAA,MAEvH,KAAK;AACJ,eAAO,EACNZ,MAAMhB;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,QAgBNc,WAAWG,EAAcC,IAAIL,MAAMW,SAASJ,SAC5CO,eAAe,sBAAsBV,EAAcC,IAAIL,MAAMW,SAASJ,gBAAgBH,EAAcC,IAAIL,MAAMW,SAASI,SAAAA,QAAAA;AAAAA,MAEzH,KAAK;AACJ,eAAO,EACNZ,MAAMhB;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,QAgBNc,WAAWG,EAAcC,IAAIL,MAAMY,MAAML,SACzCO,eAAe,sBAAsBV,EAAcC,IAAIL,MAAMY,MAAML,OAAAA,SAAgBH,EAAcC,IAAIL,MAAMY,MAAMG;MAGnH;AACC,eAAO,EACNZ,MAAMhB;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,QAgBNc,WAAWG,EAAcC,IAAIL,MAAMM,QAAQC,SAC3CO,eAAe,sBAAsBV,EAAcC,IAAIL,MAAMM,QAAQC,OAAAA,SAAgBH,EAAcC,IAAIL,MAAMM,QAAQS,SAAAA,OAAAA;AAAAA,IAAAA;AAAAA,EAGzH;AAAA;AA5V4BC,EAAA,CAA3BC,EAAS,EAAE1E,MAAM2E,OAAAA,CAAAA,CAAAA,GADEnF,EACQoF,WAAA,SAAA,CAAA,GACAH,EAAA,CAA3BC,EAAS,EAAE1E,MAAM2E,YAFEnF,EAEQoF,WAAA,WAAA,CAAA,GACAH,EAAA,CAA3BC,EAAS,EAAE1E,MAAM2E,OAAAA,CAAAA,CAAAA,GAHEnF,EAGQoF,WAAA,QAAA,IACCH,EAAA,CAA5BC,EAAS,EAAE1E,MAAM6E,QAAAA,CAAAA,CAAAA,GAJErF,EAISoF,WAAA,YAAA,CAAA,GACDH,EAAA,CAA3BC,EAAS,EAAE1E,MAAM8E,OAAAA,CAAAA,CAAAA,GALEtF,EAKQoF,WAAA,YAAA,CAAA,GACAH,EAAA,CAA3BC,EAAS,EAAE1E,MAAM2E,OAAAA,CAAAA,CAAAA,GANEnF,EAMQoF,WAAA,MAAA,CAAA,GACCH,EAAA,CAA5BC,EAAS,EAAE1E,MAAM6E,QAAAA,CAAAA,CAAAA,GAPErF,EAOSoF,WAAA,aAAA,CAAA,GACAH,EAAA,CAA5BC,EAAS,EAAE1E,MAAM6E,QAAAA,CAAAA,CAAAA,GARErF,EAQSoF,WAAA,gBAAA,CAAA,GAEZH,EAAA,CAAhBM,EAAAA,CAAAA,GAVmBvF,EAUHoF,WAAA,YAAA,CAAA,GACAH,EAAA,CAAhBM,EAAAA,CAAAA,GAXmBvF,EAWHoF,WAAA,aAAA,CAAA,GACAH,EAAA,CAAhBM,EAAAA,CAAAA,GAZmBvF,EAYHoF,WAAA,YAAA,CAAA,GACAH,EAAA,CAAhBM,EAAAA,CAAAA,GAbmBvF,EAaHoF,WAAA,YAAA,CAAA,GACAH,EAAA,CAAhBM,EAAAA,CAAAA,GAdmBvF,EAcHoF,WAAA,mBAAA,CAAA,GACAH,EAAA,CAAhBM,EAAAA,CAAAA,GAfmBvF,EAeHoF,WAAA,kBAAA,CAAA,GAfGpF,IAArBiF,EAAA,CADCO,EAAc,kBAAA,CAAA,GACMxF;ACZd,MAAMyF,EAAAA;AAAAA,EAAN,cAAAvF;AACNG,SAAQqF,eAAoC;AAAA,EAAA;AAAA,EAKpC,kBAAAC;AACP,QAAA,CAAKtF,KAAKqF,cAAc;AACvB,YAAME,IAAoB3D,OAAO4D,gBAAiB5D,OAAe6D;AACjEzF,WAAKqF,eAAe,IAAIE;AAAAA,IACzB;AACA,WAAOvF,KAAKqF;AAAAA,EACb;AAAA,EAEO,cAAcK,IAAS,KAAA;AAC7B,UAAMC,IAAM3F,KAAKsF,gBAAAA,GACX9E,IAAMmF,EAAIC,aAEVC,IAAaF,EAAIG,iBAAAA,GACjBC,IAAWJ,EAAIK,WAAAA,GACfC,IAASN,EAAIO;AAEnBL,IAAAA,EAAW1F,OAAO,QAClB0F,EAAWM,UAAUC,eAAe,KAAK5F,CAAAA,GACzCqF,EAAWM,UAAUE,6BAA6B,QAAQ7F,IAAM,OAEhEyF,EAAO9F,OAAO,WACd8F,EAAOE,UAAUG,QAAQ,MAEzBP,EAASQ,KAAKH,eAAe,MAAQ5F,CAAAA,GACrCuF,EAASQ,KAAKF,6BAA6BX,GAAQlF,IAAM,IAAA,GACzDuF,EAASQ,KAAKF,6BAA6B,MAAQ7F,IAAM,GAAA,GAEzDqF,EAAWW,QAAQP,CAAAA,EAAQO,QAAQT,CAAAA,EAAUS,QAAQb,EAAIc,WAAAA,GACzDZ,EAAWa,MAAMlG,IACjBqF,EAAWc,KAAKnG,IAAM,IAAA;AAAA,EACvB;AAAA,EAEO,iBAAiBkF,IAAS,KAAA;AAChC,UAAMC,IAAM3F,KAAKsF,gBAAAA,GACX9E,IAAMmF,EAAIC,aAEVgB,IAAa,CAACC,GAAcH,GAAerG;AAChD,YAAMyG,IAAMnB,EAAIG,iBAAAA,GACVS,IAAOZ,EAAIK,cACXC,IAASN,EAAIO,mBAAAA;AAEnBY,MAAAA,EAAI3G,OAAO,QACX2G,EAAIX,UAAUC,eAAeS,GAAMrG,CAAAA,GACnCyF,EAAO9F,OAAO,WACd8F,EAAOE,UAAUG,QAAe,IAAPO,GAEzBN,EAAKA,KAAKH,eAAe,MAAQ5F,CAAAA,GACjC+F,EAAKA,KAAKF,6BAA6BX,GAAQlF,IAAM,GAAA,GACrD+F,EAAKA,KAAKF,6BAA6B,MAAQ7F,IAAMH,CAAAA,GAErDyG,EAAIN,QAAQP,CAAAA,EAAQO,QAAQD,CAAAA,EAAMC,QAAQb,EAAIc,WAAAA,GAC9CK,EAAIJ,MAAMlG,IAAMkG,CAAAA,GAChBI,EAAIH,KAAKnG,IAAMH,CAAAA;AAAAA,IAAAA;AAGhBuG,IAAAA,EAAW,QAAQ,GAAG,MACtBA,EAAW,QAAQ,MAAM,IAAA;AAAA,EAC1B;AAAA,EAEO,iBAAiBlB,IAAS,MAAA;AAChC,UAAMC,IAAM3F,KAAKsF,gBAAAA,GACX9E,IAAMmF,EAAIC,aAEVmB,IAAOpB,EAAIG,iBAAAA,GACXkB,IAAOrB,EAAIG,iBAAAA,GACXS,IAAOZ,EAAIK,WAAAA,GACXC,IAASN,EAAIO;AAEnBa,IAAAA,EAAK5G,OAAO,QACZ6G,EAAK7G,OAAO,QACZ4G,EAAKZ,UAAUC,eAAe,QAAQ5F,CAAAA,GACtCwG,EAAKb,UAAUC,eAAe,KAAK5F,CAAAA,GAEnCyF,EAAO9F,OAAO,WACd8F,EAAOE,UAAUG,QAAQ,KAEzBC,EAAKA,KAAKH,eAAe,MAAQ5F,IACjC+F,EAAKA,KAAKF,6BAA6BX,GAAQlF,IAAM,IAAA,GACrD+F,EAAKA,KAAKF,6BAA6B,MAAQ7F,IAAM,GAAA,GAErDuG,EAAKP,QAAQP,CAAAA,GACbe,EAAKR,QAAQP,CAAAA,GACbA,EAAOO,QAAQD,GAAMC,QAAQb,EAAIc,WAAAA,GAEjCM,EAAKL,MAAMlG,CAAAA,GACXwG,EAAKN,MAAMlG,CAAAA,GACXuG,EAAKJ,KAAKnG,IAAM,IAAA,GAChBwG,EAAKL,KAAKnG,IAAM,IAAA;AAAA,EACjB;AAAA,EAEO,eAAekF,IAAS,MAAA;AAC9B,UAAMC,IAAM3F,KAAKsF,gBAAAA,GACX9E,IAAMmF,EAAIC,aAEVkB,IAAMnB,EAAIG,iBAAAA,GACVS,IAAOZ,EAAIK,cACXC,IAASN,EAAIO,mBAAAA;AAEnBY,IAAAA,EAAI3G,OAAO,YACX2G,EAAIX,UAAUC,eAAe,KAAK5F,CAAAA,GAClCsG,EAAIX,UAAUE,6BAA6B,MAAM7F,IAAM,GAAA,GAEvDyF,EAAO9F,OAAO,WACd8F,EAAOE,UAAUG,QAAQ,KACzBL,EAAOgB,EAAEX,QAAQ,KAEjBC,EAAKA,KAAKH,eAAe,MAAQ5F,CAAAA,GACjC+F,EAAKA,KAAKF,6BAAsC,MAATX,GAAclF,IAAM,GAAA,GAC3D+F,EAAKA,KAAKF,6BAA6B,MAAQ7F,IAAM,GAAA,GAErDsG,EAAIN,QAAQP,GAAQO,QAAQD,CAAAA,EAAMC,QAAQb,EAAIc,WAAAA,GAC9CK,EAAIJ,MAAMlG,CAAAA,GACVsG,EAAIH,KAAKnG,IAAM,IAAA;AAAA,EAChB;AAAA,EAMA,yBAAgCkF,IAAS,MAAA;AAExC,UAGMwB,IAAoC,CAAA;AAyI1C,WAtIAA,EAAUC,OAAAA,MAAanH,KAAKoH,kBAC3BC,OAAM1B,MAAAA;AAEL,YAAME,IAAaF,EAAIG,iBAAAA;AACvBD,MAAAA,EAAW1F,OAAO,QAClB0F,EAAWM,UAAUC,eAAe,KAAK,IACzCP,EAAWM,UAAUE,6BAA6B,KAAK,GAAA;AAGvD,YAAMN,IAAWJ,EAAIK,WAAAA;AACrBD,MAAAA,EAASQ,KAAKH,eAAe,GAAG,IAChCL,EAASQ,KAAKe,wBAAwB5B,GAAQ,GAAA,GAC9CK,EAASQ,KAAKe,wBAAwB,GAAG,GAAA,GAGzCzB,EAAWW,QAAQT,CAAAA,GACnBA,EAASS,QAAQb,EAAIc,WAAAA,GACrBZ,EAAWa,MAAAA,GACXb,EAAWc,KAAK,GAAA;AAAA,IAAA,GAEjBY,OAzBgB,CAAA,GA8BjBL,EAAU5C,UAAAA,MAAgBtE,KAAKoH,kBAC9BC,OAAM1B,MAAAA;AAEL,YAAMoB,IAAOpB,EAAIG,iBAAAA;AACjBiB,MAAAA,EAAK5G,OAAO,QACZ4G,EAAKZ,UAAUC,eAAe,KAAK;AAGnC,YAAMY,IAAOrB,EAAIG,iBAAAA;AACjBkB,MAAAA,EAAK7G,OAAO,QACZ6G,EAAKb,UAAUC,eAAe,KAAK,CAAA;AAGnC,YAAMoB,IAAQ7B,EAAIK,WAAAA;AAClBwB,MAAAA,EAAMjB,KAAKH,eAAe,GAAG,IAC7BoB,EAAMjB,KAAKe,wBAAwB5B,GAAQ,GAAA,GAC3C8B,EAAMjB,KAAKe,wBAAwB,GAAG,GAAA;AAEtC,YAAMG,IAAQ9B,EAAIK;AAClByB,MAAAA,EAAMlB,KAAKH,eAAe,GAAG,CAAA,GAC7BqB,EAAMlB,KAAKe,wBAAiC,MAAT5B,GAAc,IAAA,GACjD+B,EAAMlB,KAAKe,wBAAwB,GAAG,GAAA,GAGtCP,EAAKP,QAAQgB,CAAAA,GACbA,EAAMhB,QAAQb,EAAIc,WAAAA,GAElBO,EAAKR,QAAQiB,CAAAA,GACbA,EAAMjB,QAAQb,EAAIc,WAAAA,GAElBM,EAAKL,MAAAA,GACLM,EAAKN,MAAM,OAEXK,EAAKJ,KAAK,GAAA,GACVK,EAAKL,KAAK,GAAA;AAAA,IAAA,GAEXY,OAlEgB,CAAA,GAuEjBL,EAAUQ,UAAAA,MAAgB1H,KAAKoH,kBAC9BC,OAAM1B;AAEL,YAAMoB,IAAOpB,EAAIG,iBAAAA;AACjBiB,MAAAA,EAAK5G,OAAO,QACZ4G,EAAKZ,UAAUC,eAAe,QAAQ,CAAA;AAEtC,YAAMY,IAAOrB,EAAIG,iBAAAA;AACjBkB,MAAAA,EAAK7G,OAAO,QACZ6G,EAAKb,UAAUC,eAAe,QAAQ,CAAA;AAGtC,YAAMG,IAAOZ,EAAIK;AACjBO,MAAAA,EAAKA,KAAKH,eAAe,GAAG,CAAA,GAC5BG,EAAKA,KAAKe,wBAAwB5B,GAAQ,GAAA,GAC1Ca,EAAKA,KAAKe,wBAAiC,MAAT5B,GAAc,GAAA,GAChDa,EAAKA,KAAKe,wBAAiC,MAAT5B,GAAc,GAAA,GAChDa,EAAKA,KAAKe,wBAAwB,GAAG,GAAA,GAGrCP,EAAKP,QAAQD,CAAAA,GACbS,EAAKR,QAAQD,CAAAA,GACbA,EAAKC,QAAQb,EAAIc,WAAAA,GAEjBM,EAAKL,MAAAA,GACLM,EAAKN,MAAAA,GAELK,EAAKJ,KAAK,GAAA,GACVK,EAAKL,KAAK,GAAA;AAAA,IAAA,GAEXY,OArGgB,IA0GjBL,EAAU1C,QAAAA,MAAcxE,KAAKoH,kBAC5BC,OAAM1B,MAAAA;AAEL,YAAMmB,IAAMnB,EAAIG,iBAAAA;AAChBgB,MAAAA,EAAI3G,OAAO,QACX2G,EAAIX,UAAUC,eAAe,KAAK,CAAA;AAGlC,YAAMG,IAAOZ,EAAIK,WAAAA;AACjBO,MAAAA,EAAKA,KAAKH,eAAe,GAAG,CAAA,GAC5BG,EAAKA,KAAKe,wBAAwB5B,GAAQ,GAAA,GAC1Ca,EAAKA,KAAKe,wBAAiC,MAAT5B,GAAc,GAAA,GAChDa,EAAKA,KAAKe,wBAAiC,MAAT5B,GAAc,GAAA,GAChDa,EAAKA,KAAKe,wBAAwB,GAAG;AAGrC,YAAMrB,IAASN,EAAIO,mBAAAA;AACnBD,MAAAA,EAAO9F,OAAO,WACd8F,EAAOE,UAAUG,QAAQ,KACzBL,EAAOgB,EAAEX,QAAQ,KAGjBQ,EAAIN,QAAQP,CAAAA,GACZA,EAAOO,QAAQD,IACfA,EAAKC,QAAQb,EAAIc,WAAAA,GAEjBK,EAAIJ,MAAAA,GACJI,EAAIH,KAAK,GAAA;AAAA,IAAA,GAEVY,OAvIgB,CAAA,GA2IVL;AAAAA,EACR;AAAA,EASA,wBACCS,GACAJ,IAAa,OACblH,IAAW,GAAA;AAGX,UAAMuH,IAAa,IAAIC,oBAAoB,GAAGN,IAAalH,GAAUkH;UAG/DI,EAAeC,CAAAA;AAGrB,UAAME,IAAAA,MAAoBF,EAAWG,eAAAA,GAG/BC,IAAUhI,KAAKiI,iBAAiBH,CAAAA;AAGtC,WAAOI,IAAIC,gBAAgBH;EAC5B;AAAA,EAMQ,iBAAiBI,GAAAA;AACxB,UAAMC,IAAcD,EAAOE,kBACrBf,IAAaa,EAAOb,YAKpBgB,IADiBC,IACJH,GAEbI,IAAUzI,KAAK0I,gBAAgBN,GALpB,EAAA,GAMXO,IAJiBH,IAIJC,EAAQG,QAIrBC,IAAY,IAAIC,YADD,KAC4BH,CAAAA,GAC3CI,IAAO,IAAIC,SAASH,CAAAA;AAoC1B,WAjCA7I,KAAKiJ,YAAYF,GAAM,GAAG,MAAA,GAE1BA,EAAKG,UAAU,GAAG,KAAKP,KAAY,GAEnC3I,KAAKiJ,YAAYF,GAAM,GAAG,MAAA,GAE1B/I,KAAKiJ,YAAYF,GAAM,IAAI,MAAA,GAE3BA,EAAKG,UAAU,IAAI,IAAA,EAAI,GAEvBH,EAAKI,UAAU,IAzBA,GAAA,KA2BfJ,EAAKI,UAAU,IAAId,GAAAA,EAAa,GAEhCU,EAAKG,UAAU,IAAI3B,GAAAA,EAAY,GAE/BwB,EAAKG,UAAU,IAAI3B,IAAagB,GAAAA,EAAY,GAE5CQ,EAAKI,UAAU,IAAIZ,GAAAA,KAEnBQ,EAAKI,UAAU,IAlCE,IAAA,EAkCY,GAE7BnJ,KAAKiJ,YAAYF,GAAM,IAAI,MAAA,GAE3BA,EAAKG,UAAU,IAAIP,KAAY,GAI9B3I,KAAKoJ,kBAAkBL,GAjCH,IAiCuBN,CAAAA,GAKrC,IAAIY,KAAK,CAACR,CAAAA,GAAY,EAAE1I,MAAM,YAAA,CAAA;AAAA,EACtC;AAAA,EAKQ,gBAAgBiI,GAAqBI,GAAAA;AAC5C,UAAMH,IAAcD,EAAOE,kBACrBM,IAASR,EAAOQ,QAChBH,IAAoB,CAAA,GACpBa,IAAQd,MAAa,KAAK,QAAQ;AAGxC,aAASe,IAAI,GAAGA,IAAIX,GAAQW,IAC3B,UAASC,IAAU,GAAGA,IAAUnB,GAAamB,KAAW;AACvD,YAAMC,IAASrB,EAAOsB,eAAeF,CAAAA,EAASD,CAAAA,GAExCI,IAAYlJ,KAAKyB,QAAQzB,KAAKmJ,IAAI,GAAGH,CAAAA,CAAAA;AAC3ChB,QAAQoB,KAAKF,IAAYL,CAAAA;AAAAA,IAC1B;AAGD,WAAOb;AAAAA,EACR;AAAA,EAKQ,kBAAkBM,GAAgBe,GAAgBrB,GAAAA;AACzD,aAASc,IAAI,GAAGA,IAAId,EAAQG,QAAQW,IACnCR,GAAKgB,SAASD,IAAa,IAAJP,GAAOd,EAAQc,CAAAA,GAAAA,EAAI;AAAA,EAE5C;AAAA,EAKQ,YAAYR,GAAgBe,GAAgBE,GAAAA;AACnD,aAAST,IAAI,GAAGA,IAAIS,EAAOpB,QAAQW,IAClCR,GAAKkB,SAASH,IAASP,GAAGS,EAAOE,WAAWX,CAAAA,CAAAA;AAAAA,EAE9C;;ACtYM,MAAMY,EAAAA;AAAAA,EAgBZ,cAAAtK;AAfAG,SAAQqF,eAAoC,MAC5CrF,KAAQoK,mCAAuDC,OAC/DrK,KAAQ0F,SAAiB,KACzB1F,KAAQsK,QAAAA,IACRtK,KAAQuK,iBAAiB,IAAInF,KAC7BpF,KAAQwK,gBAAgB,IAAIC,eAG5BzK,KAAQ0K,YAA8C,EACrDvD,MAAM,wCACN7C,SAAS,2CACToD,SAAS,2CACTlD,OAAO,wCAAA,GA4JRxE,KAAQ2K,mBAAoBC,OAA4B,MAAA;AACvDA,QAAMC;OAxJN7K,KAAK8K,qBAAAA;AAAAA,EACN;AAAA,EAKA,MAAA,uBAAcA;AACb,QAAA;AAAA,YAEO9K,KAAK+K,cAAAA;AAAAA,IACZ,QAASC;AAGR,UAAA;AACC,cAAMC,UAAsBjL,KAAKuK,eAAeW,mBAAmBlL,KAAK0F,MAAAA;AACxE1F,aAAK0K,YAAYO;AAAAA,MAClB,QAASE;AAAAA,MAGT;AAAA,IACD;AAAA,EACD;AAAA,EAKQ,kBAAA7F;AACP,QAAA,CAAKtF,KAAKqF,cAAc;AAEvB,YAAME,IAAoB3D,OAAO4D,gBAAiB5D,OAAe6D;AACjEzF,WAAKqF,eAAe,IAAIE;AAAAA,IACzB;AAEA,WAAOvF,KAAKqF;AAAAA,EACb;AAAA,EAKA,MAAA,gBAAc0F;AACb,UAAMK,IAA4B,CAAC,QAAQ,WAAW,WAAW,OAAA;AAEjE,eAAWjL,KAAQiL,EAClB;AACC,YAAMhD,IAAAA,MAAepI,KAAKqL,UAAUlL,CAAAA;AACpCH,WAAKoK,aAAakB,IAAInL,GAAMiI,CAAAA;AAAAA,IAC7B,QAAS4C;AAAAA,IAET;AAAA,EAEF;AAAA,EAKA,MAAA,UAAwB7K,GAAAA;AACvB,UAAMoL,IAAMvL,KAAK0K,UAAUvK,CAAAA,GACrBqL,IAAAA,MAAiBC,MAAMF,CAAAA;AAE7B,QAAA,CAAKC,EAASE,GACb,OAAM,IAAIC,MAAM,6BAA6BJ,CAAAA,KAAQC,EAASI,UAAAA,EAAAA;AAG/D,UAAMC,IAAAA,MAAoBL,EAASK,YAAAA;AACnC,WAAA,MAAa7L,KAAKsF,gBAAAA,EAAkBwG,gBAAgBD,CAAAA;AAAAA,EACrD;AAAA,EAKA,MAAA,UAAuB1L;AACtB,QAAA,CAAIH,KAAKsK,MAET,KAAA;AAEC,YAAMyB,IAAU/L,KAAKsF,gBAAAA;AAQrB,UALIyG,EAAQ7G,UAAU,eAAVA,MACL6G,EAAQC,UAIXhM,KAAK0K,UAAUvK,CAAAA,EAAM8L,WAAW,OAAA,EAEnC,QAAA,KADAjM,KAAKkM,kBAAkB/L,CAAAA;AAKxB,UAAA,CAAKH,KAAKoK,aAAa3I,IAAItB,GAC1B,KAAA;AACC,cAAMiI,IAAAA,MAAepI,KAAKqL,UAAUlL,CAAAA;AACpCH,aAAKoK,aAAakB,IAAInL,GAAMiI,CAAAA;AAAAA,MAC7B;AAGC,eAAA,KADApI,KAAKmM,yBAAyBhM,CAAAA;AAAAA,MAE/B;AAGD,YAAMiI,IAASpI,KAAKoK,aAAagC,IAAIjM,CAAAA;AACrC,UAAA,CAAKiI,EACJ,OAAM,IAAIuD,MAAM,oBAAoBxL,CAAAA,gBAAAA;AAIrC,YAAMkM,IAASN,EAAQO,mBAAAA;AACvBD,MAAAA,EAAOjE,SAASA;AAEhB,YAAMrC,IAAWgG,EAAQ/F,WAAAA;AACzBD,QAASQ,KAAKD,QAAQtG,KAAK0F,QAG3B2G,EAAO7F,QAAQT,CAAAA,GACfA,EAASS,QAAQuF,EAAQtF,WAAAA,GACzB4F,EAAO3F,MAAM,CAAA;AAAA,IACd,QAASsE;AAERhL,WAAKmM,yBAAyBhM,CAAAA;AAAAA,IAC/B;AAAA,EACD;AAAA,EAKQ,yBAAyBA,GAAAA;AAChC,SAAIH,KAAKsK,MAET,KAAA;AACC,cAAQnK,GAAAA;AAAAA,QACP,KAAK;AACJH,eAAKuK,eAAegC,cAAcvM,KAAK0F,MAAAA;AACvC;AAAA,QACD,KAAK;AACJ1F,eAAKuK,eAAeiC,iBAAiBxM,KAAK0F,MAAAA;AAC1C;AAAA,QACD,KAAK;AACJ1F,eAAKuK,eAAekC,iBAAiBzM,KAAK0F,MAAAA;AAC1C;AAAA,QACD,KAAK;AACJ1F,eAAKuK,eAAemC,eAAe1M,KAAK0F;;IAG3C,QAASsF;AAAAA,IAET;AAAA,EACD;AAAA,EAYQ,kBAAkB7K,GAAAA;AACzB,QAAA,CAAIH,KAAKsK,MAET,KAAA;AACC,YAAMM,IAAQ,IAAI+B,MAAM3M,KAAK0K,UAAUvK,CAAAA,CAAAA;AACvCyK,MAAAA,EAAMlF,SAAS1F,KAAK0F,QAGpBkH,EAAUhC,GAAO,OAAA,EAASiC,KACzBC,EAAUF,EAAU5M,KAAKwK,eAAe,YAAA,CAAA,CAAA,EACvCuC,UAAU/M,KAAK2K,iBAAiBC,CAAAA,CAAAA,GAElCA,EAAMoC,KAAAA,EAAOC,MAAMjC,CAAAA,MAAAA;AAElBhL,aAAKmM,yBAAyBhM,CAAAA;AAAAA,MAAAA,CAAAA;AAAAA,IAEhC,QAAS6K;AAERhL,WAAKmM,yBAAyBhM;IAC/B;AAAA,EACD;AAAA,EAKO,UAAUuF,GAAAA;AAChB1F,SAAK0F,SAASjF,KAAKyB,IAAI,GAAGzB,KAAKmJ,IAAI,GAAGlE;EACvC;AAAA,EAKO,YAAAwH;AACN,WAAOlN,KAAK0F;AAAAA,EACb;AAAA,EAKO,OAAAyH;AACNnN,SAAKsK,QAAAA;AAAAA,EACN;AAAA,EAKO,SAAA8C;AACNpN,SAAKsK,QAAAA;AAAAA,EACN;AAAA,EAKO;AACN,WAAOtK,KAAKsK;AAAAA,EACb;AAAA,EAKO,YAAYnK,GAAwBoL,GAAAA;AAC1CvL,SAAK0K,UAAUvK,CAAAA,IAAQoL,GAGvBvL,KAAKoK,aAAaiD,OAAOlN,CAAAA;AAAAA,EAC1B;AAAA,EAKO,YAAYA,GAAAA;AAClB,WAAOH,KAAK0K,UAAUvK,CAAAA;AAAAA,EACvB;AAAA,EAKO,UAAAmN;AACNtN,SAAKwK,cAAcjI,cAAc,IAAIgL,MAAM,YAAA,CAAA,GAGvCvN,KAAKqF,gBAAgBrF,KAAKqF,aAAaH,UAAU,YACpDlF,KAAKqF,aAAavD,QAAQmL,MAAMjC,OAAAA;AAAAA,IAAAA,CAAAA;AAAAA,EAIlC;AAAA;;;;;ACxOD,IAAqBwC,IAArB,cAA2D5N;EAA3D,cAAAC;AAAAC,aAAAC,SAAAA,GAC6BC,KAAAyN,WAMP,aACOzN,KAAA0N,0BAA0B,GACzB1N,KAAAY,YAAAA,IACDZ,KAAA2N,cAAc,KAEjC3N,KAAQ4N,iBAAqC,CAAA,GAGtD5N,KAAQ6N,gBAAgB,IAAI1D,KAqF5BnK,KAAQ8N,kBAAmBC,CAAAA,MAAAA;AACtB/N,WAAKY,aACRZ,KAAK6N,cAAcjN,UAAUmN,EAAMtL,OAAOtC,IAAAA;AAAAA,IAAAA;AAAAA,EAE5C;AAAA,EAvFA,oBAAAe;AACCpB,UAAMoB,kBAAAA,GAGNlB,KAAK6N,cAAcG,UAAUhO,KAAK2N,WAAAA,GAGlCf,EAA4ChL,QAAQ,uBAAA,EAClDiL,KAAKC,EAAU9M,KAAKwK,aAAAA,CAAAA,EACpBuC,UAAUgB,CAAAA,MAAAA;AACV/N,WAAKiO,gBAAgBF,EAAMtL,MAAAA;AAAAA,IAAAA,CAAAA,GAI7BmK,EAAuChL,QAAQ,+BAAA,EAC7CiL,KAAKC,EAAU9M,KAAKwK,aAAAA,CAAAA,EACpBuC,UAAUgB,CAAAA;AACV/N,WAAKkO,mBAAmBH,EAAMtL,OAAOnC,EAAAA;AAAAA,IAAAA,CAAAA,GAIvCsM,EAAsEhL,QAAQ,8BAAA,EAC5EiL,KAAKC,EAAU9M,KAAKwK,aAAAA,CAAAA,EACpBuC,UAAUgB,CAAAA;AACV/N,WAAKmO,mBAAmBJ,EAAMtL,OAAOnC,IAAIyN,EAAMtL;QAIjDmK,EAAuB5M,MAAM,WAAA,EAC3B6M,KAAKC,EAAU9M,KAAKwK,gBACpBuC,UAAU/M,KAAK8N,eAAAA;AAAAA,EAClB;AAAA,EAGO,gBAAgBM;AACtB,UAAM9N,IAAK8N,EAAQ9N,MAAM,gBAAgBC,KAAKC,SAASC,KAAKC,MAAsB,MAAhBD,KAAKE,OAAAA,CAAAA,CAAAA,IAEjEyC,IAAiC,EACtC9C,IAAAA,GACAL,OAAOmO,EAAQnO,SAAS,IACxBC,SAASkO,EAAQlO,SACjBC,MAAMiO,EAAQjO,QAAQ,QACtBE,UAAU+N,EAAQ/N,aAAlBA,SAA2C+N,EAAQ/N,WAAW,KAC9DD,UAAUgO,EAAQhO,aAAlBA,UAA2CgO,EAAQhO,UACnDQ,WAAWwN,EAAQxN,cAAnBA,SAA6CwN,EAAQxN,YAAYZ,KAAKY,WACtEC,cAAcuN,EAAQvN,iBAAtBA,UAAmDuN,EAAQvN,aAAAA;AAoB5D,WAhBIb,KAAKyN,SAASxB,WAAW,KAAA,IAC5BjM,KAAK4N,iBAAiB,CAAA,GAAI5N,KAAK4N,gBAAgBxK,CAAAA,IAE/CpD,KAAK4N,iBAAiB,CAACxK,GAAAA,GAAiBpD,KAAK4N,iBAI1C5N,KAAK4N,eAAehF,SAAS5I,KAAK0N,4BACrC1N,KAAK4N,iBAAiB5N,KAAK4N,eAAeS,MAAAA,CAAOrO,KAAK0N,uBAAAA,IAInDtK,EAAaxC,aAChBZ,KAAK6N,cAAcjN,UAAUwC,EAAajD,IAAAA,GAGpCG;AAAAA,EACR;AAAA,EAEO,mBAAmBA,GAAAA;AACzBN,SAAK4N,iBAAiB5N,KAAK4N,eAAe3H,OAAOqI,CAAAA,MAAKA,EAAEhO,OAAOA,CAAAA;AAAAA,EAChE;AAAA,EAEO,mBAAmBA,GAAY8N,GAAAA;AACrC,UAAMG,IAAQvO,KAAK4N,eAAeY,UAAUF,OAAKA,EAAEhO,OAAOA,CAAAA;AAAAA,IACtDiO,MADsDjO,OAEzDN,KAAK4N,eAAeW,CAAAA,IAAS,EAAA,GACzBvO,KAAK4N,eAAeW,OACpBH,EAAAA,GAEJpO,KAAKyO,cAAAA;AAAAA,EAEP;AAAA,EAQQ,aAAaC;AACpB,UAAMpO,IAAKoO,EAAEjM,OAAOnC;AACpBN,SAAKkO,mBAAmB5N,CAAAA;AAAAA,EACzB;AAAA,EAEA,SAAAwC;AACC,WAAOC;AAAAA;AAAAA,YAEGI,EAAS,EAChB,0BAAA,IACA,CAACnD,KAAKyN,QAAAA,GAAAA,GAAW,CAAA,CAAA;AAAA;AAAA,MAGhBkB,EACD3O,KAAK4N,uBACWxK,EAAa9C,IAC7B8C,CAAAA,MAAgBL;AAAAA;AAAAA,oBAEDK,EAAa9C,EAAAA;AAAAA,uBACV8C,EAAanD,KAAAA;AAAAA,yBACXmD,EAAalD,OAAAA;AAAAA,sBAChBkD,EAAajD,IAAAA;AAAAA,0BACTiD,EAAa/C,QAAAA;AAAAA,0BACb+C,EAAahD,QAAAA;AAAAA,2BACZ,EAAA;AAAA,8BACGgD,EAAavC,YAAAA;AAAAA,uBACpBb,KAAK4O,YAAAA;AAAAA;AAAAA;;;EAM3B;AAAA;AAzI4BhK,EAAA,CAA3BC,EAAS,EAAE1E,MAAM2E,OAAAA,CAAAA,CAAAA,GADE0I,EACQzI,WAAA,YAAA,CAAA,GAOAH,EAAA,CAA3BC,EAAS,EAAE1E,MAAM8E,OAAAA,CAAAA,CAAAA,GAREuI,EAQQzI,WAAA,2BAAA,CAAA,GACCH,EAAA,CAA5BC,EAAS,EAAE1E,MAAM6E,QAAAA,CAAAA,CAAAA,GATEwI,EASSzI,WAAA,aAAA,CAAA,GACDH,EAAA,CAA3BC,EAAS,EAAE1E,MAAM8E,OAAAA,CAAAA,CAAAA,GAVEuI,EAUQzI,WAAA,eAAA,CAAA,GAEXH,EAAA,CAAhBM,EAAAA,CAAAA,GAZmBsI,EAYHzI,WAAA,kBAAA,CAAA,GAZGyI,IAArB5I,EAAA,CADCO,EAAc,4BAAA,CAAA,GACMqI,CAAAA;AChCd,MAAMqB,IAAN,MAAMA,EAAAA;AAAAA,EAYJ;AAVR7O,SAAQ8O,oBAA8B,CAAA;AAAA,EAUf;AAAA,EAKvB,OAAA,cAAcC;AAIb,WAHKF,EAAoBG,aACxBH,EAAoBG,WAAW,IAAIH,MAE7BA,EAAoBG;AAAAA,EAC5B;AAAA,EAMO,OAAOZ,GAAAA;AAEb,UAAMa,IAAkB,EAAA,GACpBJ,EAAoBK,iBAAAA,GACpBd,GAEH/N,UAAU+N,EAAQ/N,YAAYwO,EAAoBK,gBAAgB7O,SAAAA,GAG7DC,IAAK2O,EAAgB3O,MAAM,gBAAgBC,KAAKC,SAASC,KAAKC,MAAsB,MAAhBD,KAAKE,OAAAA,CAAAA,CAAAA;AAG/EX,SAAK8O,kBAAkBjF,KAAKvJ,CAAAA;AAG5B,UAAMyN,IAAQ,IAAIvL,YAAY,yBAAyB,EACtDE,aACAC,UAAAA,IACAF,QAAQ,EAAA,GACJwM,GACH3O,IAAAA,EAAAA,EAAAA,CAAAA;AAKF,WADAsB,OAAOW,cAAcwL,CAAAA,GACdzN;AAAAA,EACR;AAAA,EAMO,QAAQA;AACd,QAAI6O;AAEJ,QAAI7O,GAAI;AAEP,YAAMiO,IAAQvO,KAAK8O,kBAAkBM,QAAQ9O,CAAAA;AACzCiO,MAAAA,IAAAA,OACHvO,KAAK8O,kBAAkBO,OAAOd,GAAO,CAAA,GACrCY,IAAW7O;AAAAA,IAEb,MAEC6O,CAAAA,IAAWnP,KAAK8O,kBAAkBQ,IAAAA;AAGnC,QAAIH,GAAU;AAEb,YAAMpB,IAAQ,IAAIvL,YAAY,iCAAiC,EAC9DE,SAAAA,IACAC,UAAAA,IACAF,QAAQ,EAAEnC,IAAI6O,EAAAA,EAAAA,CAAAA;AAEfvN,aAAOW,cAAcwL,CAAAA;AAAAA,IACtB;AAAA,EACD;AAAA,EAKO,OAAOzN,GAAY8N,GAAAA;AACzB,UAAML,IAAQ,IAAIvL,YAAY,gCAAgC,EAC7DE,SAAAA,IACAC,UAAAA,IACAF,QAAQ,EAAEnC,IAAAA,GAAAA,GAAO8N,EAAAA,EAAAA,CAAAA;AAElBxM,WAAOW,cAAcwL,CAAAA;AAAAA,EACtB;AAAA,EAKO,KAAK7N,GAAkBkO,IAAkE;AAC/F,WAAOpO,KAAKuP,OAAO,EAClBrP,SAASA,KAAW,IACpBC,MAAM,QACNE,UAAUH,IAAUkO,EAAQ/N,WAAW,MACpC+N,EAAAA,CAAAA;AAAAA,EAEL;AAAA,EAKO,QAAQlO,GAAkBkO,IAAkE;AAClG,WAAOpO,KAAKuP,OAAO,EAClBrP,SAASA,KAAW,IACpBC,MAAM,WACNE,UAAUH,IAAUkO,EAAQ/N,WAAW,GAAA,GACpC+N;EAEL;AAAA,EAKO,QAAQlO,GAAkBkO,IAAkE;AAClG,WAAOpO,KAAKuP,OAAO,EAClBrP,SAASA,KAAW,IACpBC,MAAM,WACNE,UAAUH,IAAUkO,EAAQ/N,WAAW,GAAA,GACpC+N,EAAAA,CAAAA;AAAAA,EAEL;AAAA,EAKO,MAAMlO,GAAkBkO,IAAkE;AAChG,WAAOpO,KAAKuP,OAAO,EAClBrP,SAASA,KAAW,IACpBC,MAAM,SACNE,UAAUH,IAAUkO,EAAQ/N,WAAW,GAAA,GACpC+N,EAAAA,CAAAA;AAAAA,EAEL;AAAA,EAKO,eACNlO,GACAG,GACA+N,IAAsE,CAAA;AAEtE,WAAOpO,KAAKuP,OAAO,EAClBrP,SAAAA,GACAG,UAAAA,GAAAA,GACG+N;EAEL;AAAA,EAKO,WAAWlO,GAAiBkO,IAAsE;AACxG,WAAOpO,KAAKuP,OAAO,EAClBrP,SAAAA,GACAG,UAAU,GAAA,GACP+N,EAAAA,CAAAA;AAAAA,EAEL;AAAA;AArKApO,EAAekP,kBAAgD,EAC9D7O,UAAU,KACVD,cACAQ,WAAAA;AARK,IAAMiO,IAANW;AAiLA,MAAMC,IAAU,EAItBC,MAAOtB,CAAAA,MACCS,EAAoBE,cAAcQ,OAAOnB,CAAAA,GAMjDjH,MAAM,CAACjH,GAAkBkO,IAAkE,OACnFS,EAAoBE,cAAc5H,KAAKjH,GAASkO,IAMxD9J,SAAS,CAACpE,GAAkBkO,IAAkE,OACtFS,EAAoBE,YAAAA,EAAczK,QAAQpE,GAASkO,CAAAA,GAM3D1G,SAAS,CAACxH,GAAkBkO,IAAkE,OACtFS,EAAoBE,YAAAA,EAAcrH,QAAQxH,GAASkO,CAAAA,GAM3D5J,OAAO,CAACtE,GAAkBkO,IAAkE,OACpFS,EAAoBE,cAAcvK,MAAMtE,GAASkO,CAAAA,GASzDuB,gBAAgB,CACfzP,GACAG,GACA+N,IAAsE,CAAA,MAE/DS,EAAoBE,YAAAA,EAAcY,eAAezP,GAASG,GAAU+N,CAAAA,GAM5EwB,YAAY,CAAC1P,GAAiBkO,IAAsE,OAC5FS,EAAoBE,YAAAA,EAAca,WAAW1P,GAASkO,CAAAA,GAO9DyB,SAAUvP,CAAAA,MACFuO,EAAoBE,YAAAA,EAAcc,QAAQvP,IAMlDwP,QAAQ,CAACxP,GAAY8N,MACbS,EAAoBE,YAAAA,EAAce,OAAOxP,GAAI8N,CAAAA,EAAAA;"}
1
+ {"version":3,"file":"notification-service-BOCdK7B0.js","sources":["../src/notification/notification.ts","../src/notification/notification-audio-generator.ts","../src/notification/notification-audio.ts","../src/notification/notification-container.ts","../src/notification/notification-service.ts"],"sourcesContent":["import { $LitElement } from '@mixins/index'\nimport { color } from '@schmancy/directives'\nimport { SchmancyTheme } from '@schmancy/theme/theme.interface'\nimport { html, PropertyValues } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { classMap } from 'lit/directives/class-map.js'\nimport { styleMap } from 'lit/directives/style-map.js'\nimport '@schmancy/progress'\nimport style from './notification.scss?inline'\n\nexport type NotificationType = 'info' | 'success' | 'warning' | 'error'\n\n/**\n * @fires close - When notification is closed\n */\n@customElement('sch-notification')\nexport default class SchmancyNotification extends $LitElement(style) {\n\t@property({ type: String }) title = ''\n\t@property({ type: String }) message = ''\n\t@property({ type: String }) type: NotificationType = 'info'\n\t@property({ type: Boolean }) closable = true\n\t@property({ type: Number }) duration = 5000 // 0 means no auto-close\n\t@property({ type: String }) id = `notification-${Date.now()}-${Math.floor(Math.random() * 10000)}`\n\t@property({ type: Boolean }) playSound = true\n\t@property({ type: Boolean }) showProgress = false // Show indeterminate progress bar\n\n\t@state() private _visible = true\n\t@state() private _progress = 100\n\t@state() private _hovered = false\n\t@state() private _closing = false\n\t@state() private _autoCloseTimer?: number\n\t@state() private _progressTimer?: number\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback()\n\n\t\tif (this.duration > 0) {\n\t\t\tthis._startAutoCloseTimer()\n\t\t}\n\n\t\tif (this.playSound) {\n\t\t\tthis._playSound()\n\t\t}\n\t}\n\n\tdisconnectedCallback() {\n\t\tthis._clearTimers()\n\t\tsuper.disconnectedCallback()\n\t}\n\n\tupdated(changedProps: PropertyValues) {\n\t\tsuper.updated(changedProps)\n\n\t\tif (changedProps.has('duration') && this.duration > 0) {\n\t\t\tthis._clearTimers()\n\t\t\tthis._startAutoCloseTimer()\n\t\t}\n\t}\n\n\tprivate _startAutoCloseTimer() {\n\t\tif (this.duration <= 0) return\n\n\t\tconst startTime = Date.now()\n\t\tconst endTime = startTime + this.duration\n\n\t\t// Setup the auto-close timer\n\t\tthis._autoCloseTimer = window.setTimeout(() => {\n\t\t\tthis.close()\n\t\t}, this.duration)\n\n\t\t// Setup the progress timer to update every 16ms (60fps)\n\t\tthis._progressTimer = window.setInterval(() => {\n\t\t\tif (this._hovered) return\n\n\t\t\tconst now = Date.now()\n\t\t\tconst remaining = Math.max(0, endTime - now)\n\t\t\tthis._progress = (remaining / this.duration) * 100\n\n\t\t\tif (remaining <= 0) {\n\t\t\t\tthis._clearTimers()\n\t\t\t}\n\t\t}, 16)\n\t}\n\n\tprivate _clearTimers() {\n\t\tif (this._autoCloseTimer) {\n\t\t\tclearTimeout(this._autoCloseTimer)\n\t\t\tthis._autoCloseTimer = undefined\n\t\t}\n\n\t\tif (this._progressTimer) {\n\t\t\tclearInterval(this._progressTimer)\n\t\t\tthis._progressTimer = undefined\n\t\t}\n\t}\n\n\tprivate _pauseTimers() {\n\t\tthis._clearTimers()\n\t}\n\n\tprivate _resumeTimers() {\n\t\tif (this.duration > 0) {\n\t\t\t// Calculate remaining time based on progress\n\t\t\tconst remainingTime = (this._progress / 100) * this.duration\n\n\t\t\tif (remainingTime > 0) {\n\t\t\t\tthis._autoCloseTimer = window.setTimeout(() => {\n\t\t\t\t\tthis.close()\n\t\t\t\t}, remainingTime)\n\n\t\t\t\tconst startTime = Date.now()\n\t\t\t\tconst endTime = startTime + remainingTime\n\n\t\t\t\tthis._progressTimer = window.setInterval(() => {\n\t\t\t\t\tif (this._hovered) return\n\n\t\t\t\t\tconst now = Date.now()\n\t\t\t\t\tconst remaining = Math.max(0, endTime - now)\n\t\t\t\t\tthis._progress = (remaining / remainingTime) * 100\n\n\t\t\t\t\tif (remaining <= 0) {\n\t\t\t\t\t\tthis._clearTimers()\n\t\t\t\t\t}\n\t\t\t\t}, 16)\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _playSound() {\n\t\t// Dispatch event to play sound through audio service\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent('playsound', {\n\t\t\t\tdetail: { type: this.type },\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t}),\n\t\t)\n\t}\n\n\tprivate _handleMouseEnter() {\n\t\tthis._hovered = true\n\t\tthis._pauseTimers()\n\t}\n\n\tprivate _handleMouseLeave() {\n\t\tthis._hovered = false\n\t\tthis._resumeTimers()\n\t}\n\n\tpublic close() {\n\t\tif (this._closing) return\n\n\t\tthis._closing = true\n\t\tthis._clearTimers()\n\n\t\t// Add closing animation\n\t\tthis._visible = false\n\n\t\t// Dispatch close event\n\t\tsetTimeout(() => {\n\t\t\tthis.dispatchEvent(\n\t\t\t\tnew CustomEvent('close', {\n\t\t\t\t\tdetail: { id: this.id },\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true,\n\t\t\t\t}),\n\t\t\t)\n\t\t}, 300) // Match animation duration\n\t}\n\n\trender() {\n\t\tif (!this._visible && this._closing) return html``\n\n\t\tconst typeStyles = this._getTypeStyles()\n\n\t\t// Calculate elevation based on hover state\n\t\tconst elevationLevel = this._hovered ? '3' : '2'\n\n\t\treturn html`\n\t\t\t<div\n\t\t\t\tclass=${classMap({\n\t\t\t\t\tnotification: true,\n\t\t\t\t\tclosing: this._closing,\n\t\t\t\t\t[this.type]: true,\n\t\t\t\t})}\n\t\t\t\trole=\"alert\"\n\t\t\t\tstyle=${styleMap({\n\t\t\t\t\ttransform: this._closing ? 'translateX(120%)' : 'translateX(0)',\n\t\t\t\t\topacity: this._closing ? '0' : '1',\n\t\t\t\t\tboxShadow: `var(--schmancy-sys-elevation-${elevationLevel})`,\n\t\t\t\t\ttransition:\n\t\t\t\t\t\t'transform 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.3s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.2s ease',\n\t\t\t\t})}\n\t\t\t\t@mouseenter=${this._handleMouseEnter}\n\t\t\t\t@mouseleave=${this._handleMouseLeave}\n\t\t\t>\n\t\t\t\t<div class=\"notification-content\">\n\t\t\t\t\t<div\n\t\t\t\t\t\tclass=\"icon-container\"\n\t\t\t\t\t\t${color({\n\t\t\t\t\t\t\tcolor: typeStyles.iconColor,\n\t\t\t\t\t\t\tbgColor: `color-mix(in srgb, ${typeStyles.iconColor} 10%, transparent)`,\n\t\t\t\t\t\t})}\n\t\t\t\t\t>\n\t\t\t\t\t\t${typeStyles.icon}\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"content\">\n\t\t\t\t\t\t${this.title\n\t\t\t\t\t\t\t? html`\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tclass=\"title\"\n\t\t\t\t\t\t\t\t\t\tstyle=${styleMap({\n\t\t\t\t\t\t\t\t\t\t\tcolor:\n\t\t\t\t\t\t\t\t\t\t\t\tthis.type === 'info'\n\t\t\t\t\t\t\t\t\t\t\t\t\t? `color-mix(in srgb, ${SchmancyTheme.sys.color.primary.default} 90%, ${SchmancyTheme.sys.color.surface.on} 10%)`\n\t\t\t\t\t\t\t\t\t\t\t\t\t: this.type === 'success'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? `color-mix(in srgb, ${SchmancyTheme.sys.color.success.default} 90%, ${SchmancyTheme.sys.color.surface.on} 10%)`\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: this.type === 'warning'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? `color-mix(in srgb, ${SchmancyTheme.sys.color.tertiary.default} 90%, ${SchmancyTheme.sys.color.surface.on} 10%)`\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: `color-mix(in srgb, ${SchmancyTheme.sys.color.error.default} 90%, ${SchmancyTheme.sys.color.surface.on} 10%)`,\n\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t${this.title}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t`\n\t\t\t\t\t\t\t: ''}\n\n\t\t\t\t\t\t<div class=\"message\">${this.message}</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t${this.closable\n\t\t\t\t\t\t? html`\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tclass=\"close-button\"\n\t\t\t\t\t\t\t\t\taria-label=\"Close notification\"\n\t\t\t\t\t\t\t\t\t@click=${this.close}\n\t\t\t\t\t\t\t\t\tstyle=${styleMap({\n\t\t\t\t\t\t\t\t\t\tcolor:\n\t\t\t\t\t\t\t\t\t\t\tthis.type === 'info'\n\t\t\t\t\t\t\t\t\t\t\t\t? SchmancyTheme.sys.color.surface.onVariant\n\t\t\t\t\t\t\t\t\t\t\t\t: `color-mix(in srgb, ${typeStyles.iconColor} 80%, ${SchmancyTheme.sys.color.surface.onVariant} 20%)`,\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\t\twidth=\"18\"\n\t\t\t\t\t\t\t\t\t\theight=\"18\"\n\t\t\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n\t\t\t\t\t\t\t\t\t\t<line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t`\n\t\t\t\t\t\t: ''}\n\t\t\t\t</div>\n\n\t\t\t\t${this.showProgress || this.duration > 0\n\t\t\t\t\t? html`\n\t\t\t\t\t\t\t<schmancy-progress\n\t\t\t\t\t\t\t\tstyle=\"position: absolute; bottom: 0; left: 0; right: 0; width: 100%;\"\n\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t.color=${this.type === 'error' ? 'error' : this.type === 'success' ? 'success' : 'primary'}\n\t\t\t\t\t\t\t\t?indeterminate=${this.showProgress}\n\t\t\t\t\t\t\t\t.value=${this.showProgress ? 0 : this._progress}\n\t\t\t\t\t\t\t\t.max=${100}\n\t\t\t\t\t\t\t></schmancy-progress>\n\t\t\t\t\t\t`\n\t\t\t\t\t: ''}\n\t\t\t</div>\n\t\t`\n\t}\n\n\tprivate _getTypeStyles() {\n\t\tswitch (this.type) {\n\t\t\tcase 'success':\n\t\t\t\treturn {\n\t\t\t\t\ticon: html`\n\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\twidth=\"20\"\n\t\t\t\t\t\t\theight=\"20\"\n\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\"></path>\n\t\t\t\t\t\t\t<polyline points=\"22 4 12 14.01 9 11.01\"></polyline>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t`,\n\t\t\t\t\ticonColor: SchmancyTheme.sys.color.success.default,\n\t\t\t\t\tprogressColor: `color-mix(in srgb, ${SchmancyTheme.sys.color.success.default} 95%, ${SchmancyTheme.sys.color.success.container} 5%)`,\n\t\t\t\t}\n\t\t\tcase 'warning':\n\t\t\t\treturn {\n\t\t\t\t\ticon: html`\n\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\twidth=\"20\"\n\t\t\t\t\t\t\theight=\"20\"\n\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"></path>\n\t\t\t\t\t\t\t<line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"></line>\n\t\t\t\t\t\t\t<line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"></line>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t`,\n\t\t\t\t\ticonColor: SchmancyTheme.sys.color.tertiary.default,\n\t\t\t\t\tprogressColor: `color-mix(in srgb, ${SchmancyTheme.sys.color.tertiary.default} 90%, ${SchmancyTheme.sys.color.tertiary.container} 10%)`,\n\t\t\t\t}\n\t\t\tcase 'error':\n\t\t\t\treturn {\n\t\t\t\t\ticon: html`\n\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\twidth=\"20\"\n\t\t\t\t\t\t\theight=\"20\"\n\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<circle cx=\"12\" cy=\"12\" r=\"10\"></circle>\n\t\t\t\t\t\t\t<line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\"></line>\n\t\t\t\t\t\t\t<line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\"></line>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t`,\n\t\t\t\t\ticonColor: SchmancyTheme.sys.color.error.default,\n\t\t\t\t\tprogressColor: `color-mix(in srgb, ${SchmancyTheme.sys.color.error.default} 92%, ${SchmancyTheme.sys.color.error.container} 8%)`,\n\t\t\t\t}\n\t\t\tcase 'info':\n\t\t\tdefault:\n\t\t\t\treturn {\n\t\t\t\t\ticon: html`\n\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\twidth=\"20\"\n\t\t\t\t\t\t\theight=\"20\"\n\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<circle cx=\"12\" cy=\"12\" r=\"10\"></circle>\n\t\t\t\t\t\t\t<line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line>\n\t\t\t\t\t\t\t<line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t`,\n\t\t\t\t\ticonColor: SchmancyTheme.sys.color.primary.default,\n\t\t\t\t\tprogressColor: `color-mix(in srgb, ${SchmancyTheme.sys.color.primary.default} 94%, ${SchmancyTheme.sys.color.primary.container} 6%)`,\n\t\t\t\t}\n\t\t}\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'sch-notification': SchmancyNotification\n\t}\n}\n","/**\n * Programmatic sound generator for Schmancy notifications\n * Uses Web Audio API to generate gentle, subtle and soft sounds for each notification type\n */\nexport class NotificationSoundGenerator {\n\tprivate audioContext: AudioContext | null = null\n\n\t/**\n\t * Get or create AudioContext\n\t */\n\tprivate getAudioContext(): AudioContext {\n\t\tif (!this.audioContext) {\n\t\t\tconst AudioContextClass = window.AudioContext || (window as any).webkitAudioContext\n\t\t\tthis.audioContext = new AudioContextClass()\n\t\t}\n\t\treturn this.audioContext\n\t}\n\n\tpublic playInfoSound(volume = 0.2): void {\n\t\tconst ctx = this.getAudioContext()\n\t\tconst now = ctx.currentTime\n\n\t\tconst oscillator = ctx.createOscillator()\n\t\tconst gainNode = ctx.createGain()\n\t\tconst filter = ctx.createBiquadFilter()\n\n\t\toscillator.type = 'sine'\n\t\toscillator.frequency.setValueAtTime(392, now) // G4\n\t\toscillator.frequency.exponentialRampToValueAtTime(523.25, now + 0.25) // C5\n\n\t\tfilter.type = 'lowpass'\n\t\tfilter.frequency.value = 1500\n\n\t\tgainNode.gain.setValueAtTime(0.0001, now)\n\t\tgainNode.gain.exponentialRampToValueAtTime(volume, now + 0.15)\n\t\tgainNode.gain.exponentialRampToValueAtTime(0.0001, now + 0.4)\n\n\t\toscillator.connect(filter).connect(gainNode).connect(ctx.destination)\n\t\toscillator.start(now)\n\t\toscillator.stop(now + 0.45)\n\t}\n\n\tpublic playSuccessSound(volume = 0.2): void {\n\t\tconst ctx = this.getAudioContext()\n\t\tconst now = ctx.currentTime\n\n\t\tconst createBell = (freq: number, start: number, duration: number) => {\n\t\t\tconst osc = ctx.createOscillator()\n\t\t\tconst gain = ctx.createGain()\n\t\t\tconst filter = ctx.createBiquadFilter()\n\n\t\t\tosc.type = 'sine'\n\t\t\tosc.frequency.setValueAtTime(freq, now)\n\t\t\tfilter.type = 'lowpass'\n\t\t\tfilter.frequency.value = freq * 4\n\n\t\t\tgain.gain.setValueAtTime(0.0001, now)\n\t\t\tgain.gain.exponentialRampToValueAtTime(volume, now + 0.1)\n\t\t\tgain.gain.exponentialRampToValueAtTime(0.0001, now + duration)\n\n\t\t\tosc.connect(filter).connect(gain).connect(ctx.destination)\n\t\t\tosc.start(now + start)\n\t\t\tosc.stop(now + duration)\n\t\t}\n\n\t\tcreateBell(659.25, 0, 0.6) // E5\n\t\tcreateBell(523.25, 0.05, 0.55) // C5\n\t}\n\n\tpublic playWarningSound(volume = 0.25): void {\n\t\tconst ctx = this.getAudioContext()\n\t\tconst now = ctx.currentTime\n\n\t\tconst osc1 = ctx.createOscillator()\n\t\tconst osc2 = ctx.createOscillator()\n\t\tconst gain = ctx.createGain()\n\t\tconst filter = ctx.createBiquadFilter()\n\n\t\tosc1.type = 'sine'\n\t\tosc2.type = 'sine'\n\t\tosc1.frequency.setValueAtTime(349.23, now) // F4\n\t\tosc2.frequency.setValueAtTime(440, now) // A4\n\n\t\tfilter.type = 'lowpass'\n\t\tfilter.frequency.value = 1000\n\n\t\tgain.gain.setValueAtTime(0.0001, now)\n\t\tgain.gain.exponentialRampToValueAtTime(volume, now + 0.08)\n\t\tgain.gain.exponentialRampToValueAtTime(0.0001, now + 0.5)\n\n\t\tosc1.connect(filter)\n\t\tosc2.connect(filter)\n\t\tfilter.connect(gain).connect(ctx.destination)\n\n\t\tosc1.start(now)\n\t\tosc2.start(now)\n\t\tosc1.stop(now + 0.55)\n\t\tosc2.stop(now + 0.55)\n\t}\n\n\tpublic playErrorSound(volume = 0.25): void {\n\t\tconst ctx = this.getAudioContext()\n\t\tconst now = ctx.currentTime\n\n\t\tconst osc = ctx.createOscillator()\n\t\tconst gain = ctx.createGain()\n\t\tconst filter = ctx.createBiquadFilter()\n\n\t\tosc.type = 'triangle'\n\t\tosc.frequency.setValueAtTime(220, now) // A3\n\t\tosc.frequency.exponentialRampToValueAtTime(1760, now + 0.3) // A6\n\n\t\tfilter.type = 'lowpass'\n\t\tfilter.frequency.value = 800\n\t\tfilter.Q.value = 0.5\n\n\t\tgain.gain.setValueAtTime(0.0001, now)\n\t\tgain.gain.exponentialRampToValueAtTime(volume * 0.8, now + 0.1)\n\t\tgain.gain.exponentialRampToValueAtTime(0.0001, now + 0.7)\n\n\t\tosc.connect(filter).connect(gain).connect(ctx.destination)\n\t\tosc.start(now)\n\t\tosc.stop(now + 0.75)\n\t}\n\n\t/**\n\t * Generate audio blob files for all notification sounds\n\t * Returns a Promise that resolves with URLs to the generated audio files\n\t */\n\tpublic async generateAudioFiles(volume = 0.25): Promise<Record<string, string>> {\n\t\t// Create offline audio context for rendering\n\t\tconst sampleRate = 44100\n\t\tconst duration = 1 // 1 second duration to capture the full sound\n\n\t\tconst audioUrls: Record<string, string> = {}\n\n\t\t// Generate info sound\n\t\taudioUrls.info = await this.generateAudioFile(\n\t\t\tasync ctx => {\n\t\t\t\t// Create oscillator for main tone\n\t\t\t\tconst oscillator = ctx.createOscillator()\n\t\t\t\toscillator.type = 'sine'\n\t\t\t\toscillator.frequency.setValueAtTime(320, 0)\n\t\t\t\toscillator.frequency.exponentialRampToValueAtTime(520, 0.3)\n\n\t\t\t\t// Create gain node for volume control with softer attack/release\n\t\t\t\tconst gainNode = ctx.createGain()\n\t\t\t\tgainNode.gain.setValueAtTime(0, 0)\n\t\t\t\tgainNode.gain.linearRampToValueAtTime(volume, 0.1)\n\t\t\t\tgainNode.gain.linearRampToValueAtTime(0, 0.5)\n\n\t\t\t\t// Connect and play\n\t\t\t\toscillator.connect(gainNode)\n\t\t\t\tgainNode.connect(ctx.destination)\n\t\t\t\toscillator.start()\n\t\t\t\toscillator.stop(0.5)\n\t\t\t},\n\t\t\tsampleRate,\n\t\t\tduration,\n\t\t)\n\n\t\t// Generate success sound\n\t\taudioUrls.success = await this.generateAudioFile(\n\t\t\tasync ctx => {\n\t\t\t\t// Create main oscillator (higher note)\n\t\t\t\tconst osc1 = ctx.createOscillator()\n\t\t\t\tosc1.type = 'sine'\n\t\t\t\tosc1.frequency.setValueAtTime(660, 0)\n\n\t\t\t\t// Create secondary oscillator (lower note)\n\t\t\t\tconst osc2 = ctx.createOscillator()\n\t\t\t\tosc2.type = 'sine'\n\t\t\t\tosc2.frequency.setValueAtTime(440, 0)\n\n\t\t\t\t// Create gain nodes with softer envelope\n\t\t\t\tconst gain1 = ctx.createGain()\n\t\t\t\tgain1.gain.setValueAtTime(0, 0)\n\t\t\t\tgain1.gain.linearRampToValueAtTime(volume, 0.1)\n\t\t\t\tgain1.gain.linearRampToValueAtTime(0, 0.5)\n\n\t\t\t\tconst gain2 = ctx.createGain()\n\t\t\t\tgain2.gain.setValueAtTime(0, 0)\n\t\t\t\tgain2.gain.linearRampToValueAtTime(volume * 0.6, 0.15)\n\t\t\t\tgain2.gain.linearRampToValueAtTime(0, 0.7)\n\n\t\t\t\t// Connect and play\n\t\t\t\tosc1.connect(gain1)\n\t\t\t\tgain1.connect(ctx.destination)\n\n\t\t\t\tosc2.connect(gain2)\n\t\t\t\tgain2.connect(ctx.destination)\n\n\t\t\t\tosc1.start()\n\t\t\t\tosc2.start(0.15)\n\n\t\t\t\tosc1.stop(0.5)\n\t\t\t\tosc2.stop(0.7)\n\t\t\t},\n\t\t\tsampleRate,\n\t\t\tduration,\n\t\t)\n\n\t\t// Generate warning sound\n\t\taudioUrls.warning = await this.generateAudioFile(\n\t\t\tasync ctx => {\n\t\t\t\t// Create oscillators for a two-tone warning\n\t\t\t\tconst osc1 = ctx.createOscillator()\n\t\t\t\tosc1.type = 'sine'\n\t\t\t\tosc1.frequency.setValueAtTime(293.66, 0)\n\n\t\t\t\tconst osc2 = ctx.createOscillator()\n\t\t\t\tosc2.type = 'sine'\n\t\t\t\tosc2.frequency.setValueAtTime(349.23, 0)\n\n\t\t\t\t// Create gain node with softer envelope\n\t\t\t\tconst gain = ctx.createGain()\n\t\t\t\tgain.gain.setValueAtTime(0, 0)\n\t\t\t\tgain.gain.linearRampToValueAtTime(volume, 0.1)\n\t\t\t\tgain.gain.linearRampToValueAtTime(volume * 0.6, 0.2)\n\t\t\t\tgain.gain.linearRampToValueAtTime(volume * 0.8, 0.3)\n\t\t\t\tgain.gain.linearRampToValueAtTime(0, 0.6)\n\n\t\t\t\t// Connect and play\n\t\t\t\tosc1.connect(gain)\n\t\t\t\tosc2.connect(gain)\n\t\t\t\tgain.connect(ctx.destination)\n\n\t\t\t\tosc1.start()\n\t\t\t\tosc2.start()\n\n\t\t\t\tosc1.stop(0.6)\n\t\t\t\tosc2.stop(0.6)\n\t\t\t},\n\t\t\tsampleRate,\n\t\t\tduration,\n\t\t)\n\n\t\t// Generate error sound\n\t\taudioUrls.error = await this.generateAudioFile(\n\t\t\tasync ctx => {\n\t\t\t\t// Create main oscillator\n\t\t\t\tconst osc = ctx.createOscillator()\n\t\t\t\tosc.type = 'sine'\n\t\t\t\tosc.frequency.setValueAtTime(196, 0)\n\n\t\t\t\t// Create gain node with softer envelope\n\t\t\t\tconst gain = ctx.createGain()\n\t\t\t\tgain.gain.setValueAtTime(0, 0)\n\t\t\t\tgain.gain.linearRampToValueAtTime(volume, 0.1)\n\t\t\t\tgain.gain.linearRampToValueAtTime(volume * 0.4, 0.2)\n\t\t\t\tgain.gain.linearRampToValueAtTime(volume * 0.6, 0.3)\n\t\t\t\tgain.gain.linearRampToValueAtTime(0, 0.7)\n\n\t\t\t\t// Additional filter to make it even softer\n\t\t\t\tconst filter = ctx.createBiquadFilter()\n\t\t\t\tfilter.type = 'lowpass'\n\t\t\t\tfilter.frequency.value = 600\n\t\t\t\tfilter.Q.value = 0.7\n\n\t\t\t\t// Connect and play\n\t\t\t\tosc.connect(filter)\n\t\t\t\tfilter.connect(gain)\n\t\t\t\tgain.connect(ctx.destination)\n\n\t\t\t\tosc.start()\n\t\t\t\tosc.stop(0.7)\n\t\t\t},\n\t\t\tsampleRate,\n\t\t\tduration,\n\t\t)\n\n\t\treturn audioUrls\n\t}\n\n\t/**\n\t * Generate an audio file from a sound generation function\n\t * @param renderFunction Function that creates the sound in the provided context\n\t * @param sampleRate Sample rate for the audio\n\t * @param duration Duration in seconds\n\t * @returns Promise that resolves with the URL to the generated audio file\n\t */\n\tprivate async generateAudioFile(\n\t\trenderFunction: (ctx: OfflineAudioContext) => Promise<void>,\n\t\tsampleRate = 44100,\n\t\tduration = 1,\n\t): Promise<string> {\n\t\t// Create offline context\n\t\tconst offlineCtx = new OfflineAudioContext(2, sampleRate * duration, sampleRate)\n\n\t\t// Render the sound\n\t\tawait renderFunction(offlineCtx)\n\n\t\t// Render the audio\n\t\tconst audioBuffer = await offlineCtx.startRendering()\n\n\t\t// Convert to WAV format\n\t\tconst wavBlob = this.audioBufferToWav(audioBuffer)\n\n\t\t// Create URL\n\t\treturn URL.createObjectURL(wavBlob)\n\t}\n\n\t/**\n\t * Convert AudioBuffer to WAV format\n\t * Based on https://github.com/Jam3/audiobuffer-to-wav\n\t */\n\tprivate audioBufferToWav(buffer: AudioBuffer): Blob {\n\t\tconst numChannels = buffer.numberOfChannels\n\t\tconst sampleRate = buffer.sampleRate\n\t\tconst format = 1 // PCM\n\t\tconst bitDepth = 16\n\n\t\tconst bytesPerSample = bitDepth / 8\n\t\tconst blockAlign = numChannels * bytesPerSample\n\n\t\tconst samples = this.getAudioSamples(buffer, bitDepth)\n\t\tconst dataLength = samples.length * bytesPerSample\n\n\t\t// Create WAV header\n\t\tconst headerLength = 44\n\t\tconst wavBuffer = new ArrayBuffer(headerLength + dataLength)\n\t\tconst view = new DataView(wavBuffer)\n\n\t\t// RIFF identifier\n\t\tthis.writeString(view, 0, 'RIFF')\n\t\t// File length minus RIFF identifier and file size\n\t\tview.setUint32(4, 36 + dataLength, true)\n\t\t// RIFF type\n\t\tthis.writeString(view, 8, 'WAVE')\n\t\t// Format chunk identifier\n\t\tthis.writeString(view, 12, 'fmt ')\n\t\t// Format chunk length\n\t\tview.setUint32(16, 16, true)\n\t\t// Sample format (PCM)\n\t\tview.setUint16(20, format, true)\n\t\t// Channel count\n\t\tview.setUint16(22, numChannels, true)\n\t\t// Sample rate\n\t\tview.setUint32(24, sampleRate, true)\n\t\t// Byte rate (sample rate * block align)\n\t\tview.setUint32(28, sampleRate * blockAlign, true)\n\t\t// Block align (channel count * bytes per sample)\n\t\tview.setUint16(32, blockAlign, true)\n\t\t// Bits per sample\n\t\tview.setUint16(34, bitDepth, true)\n\t\t// Data chunk identifier\n\t\tthis.writeString(view, 36, 'data')\n\t\t// Data chunk length\n\t\tview.setUint32(40, dataLength, true)\n\n\t\t// Write the audio data\n\t\tif (bitDepth === 16) {\n\t\t\tthis.writeInt16Samples(view, headerLength, samples)\n\t\t} else {\n\t\t\tthrow new Error('Only 16-bit audio is supported')\n\t\t}\n\n\t\treturn new Blob([wavBuffer], { type: 'audio/wav' })\n\t}\n\n\t/**\n\t * Get audio samples from an AudioBuffer\n\t */\n\tprivate getAudioSamples(buffer: AudioBuffer, bitDepth: number): number[] {\n\t\tconst numChannels = buffer.numberOfChannels\n\t\tconst length = buffer.length\n\t\tconst samples: number[] = []\n\t\tconst scale = bitDepth === 16 ? 32768 : 128\n\n\t\t// Get samples from all channels\n\t\tfor (let i = 0; i < length; i++) {\n\t\t\tfor (let channel = 0; channel < numChannels; channel++) {\n\t\t\t\tconst sample = buffer.getChannelData(channel)[i]\n\t\t\t\t// Convert float32 to int16 or int8\n\t\t\t\tconst intSample = Math.max(-1, Math.min(1, sample))\n\t\t\t\tsamples.push(intSample * scale)\n\t\t\t}\n\t\t}\n\n\t\treturn samples\n\t}\n\n\t/**\n\t * Write 16-bit samples to a DataView\n\t */\n\tprivate writeInt16Samples(view: DataView, offset: number, samples: number[]): void {\n\t\tfor (let i = 0; i < samples.length; i++) {\n\t\t\tview.setInt16(offset + i * 2, samples[i], true)\n\t\t}\n\t}\n\n\t/**\n\t * Write a string to a DataView\n\t */\n\tprivate writeString(view: DataView, offset: number, string: string): void {\n\t\tfor (let i = 0; i < string.length; i++) {\n\t\t\tview.setUint8(offset + i, string.charCodeAt(i))\n\t\t}\n\t}\n}\n","import { fromEvent, takeUntil } from 'rxjs'\nimport { NotificationType } from './notification'\nimport { NotificationSoundGenerator } from './notification-audio-generator'\n\n/**\n * Audio service for playing notification sounds.\n * Uses Web Audio API with fallback to HTML5 Audio.\n */\nexport class NotificationAudioService {\n\tprivate audioContext: AudioContext | null = null\n\tprivate soundBuffers: Map<NotificationType, AudioBuffer> = new Map()\n\tprivate volume: number = 0.5\n\tprivate muted: boolean = false\n\tprivate soundGenerator = new NotificationSoundGenerator()\n\tprivate disconnecting = new EventTarget()\n\n\t// Default sound URLs (will be generated programmatically as fallback)\n\tprivate soundUrls: Record<NotificationType, string> = {\n\t\tinfo: '/assets/sounds/notification-info.mp3',\n\t\tsuccess: '/assets/sounds/notification-success.mp3',\n\t\twarning: '/assets/sounds/notification-warning.mp3',\n\t\terror: '/assets/sounds/notification-error.mp3',\n\t}\n\n\tconstructor() {\n\t\t// Initialize audio context when first needed\n\t\tthis.initializeAudioFiles()\n\t}\n\n\t/**\n\t * Initialize audio files - generate programmatically if needed\n\t */\n\tprivate async initializeAudioFiles(): Promise<void> {\n\t\ttry {\n\t\t\t// Try to load from default URLs\n\t\t\tawait this.preloadSounds()\n\t\t} catch (err) {\n\n\t\t\t// If loading fails, generate programmatically\n\t\t\ttry {\n\t\t\t\tconst generatedUrls = await this.soundGenerator.generateAudioFiles(this.volume)\n\t\t\t\tthis.soundUrls = generatedUrls\n\t\t\t} catch (genErr) {\n\t\t\t\tconsole.warn('Failed to generate notification sounds:', genErr)\n\t\t\t\t// Will fall back to direct playback when needed\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Lazy-initialize the audio context\n\t */\n\tprivate getAudioContext(): AudioContext {\n\t\tif (!this.audioContext) {\n\t\t\t// Use AudioContext with webkit prefix fallback for Safari\n\t\t\tconst AudioContextClass = window.AudioContext || (window as any).webkitAudioContext\n\t\t\tthis.audioContext = new AudioContextClass()\n\t\t}\n\n\t\treturn this.audioContext\n\t}\n\n\t/**\n\t * Preload all notification sounds\n\t */\n\tprivate async preloadSounds(): Promise<void> {\n\t\tconst types: NotificationType[] = ['info', 'success', 'warning', 'error']\n\n\t\tfor (const type of types) {\n\t\t\ttry {\n\t\t\t\tconst buffer = await this.loadSound(type)\n\t\t\t\tthis.soundBuffers.set(type, buffer)\n\t\t\t} catch (err) {\n\t\t\t\tconsole.warn(`Failed to preload ${type} sound:`, err)\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Load a sound file and decode it\n\t */\n\tprivate async loadSound(type: NotificationType): Promise<AudioBuffer> {\n\t\tconst url = this.soundUrls[type]\n\t\tconst response = await fetch(url)\n\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`Failed to load sound from ${url}: ${response.statusText}`)\n\t\t}\n\n\t\tconst arrayBuffer = await response.arrayBuffer()\n\t\treturn await this.getAudioContext().decodeAudioData(arrayBuffer)\n\t}\n\n\t/**\n\t * Play a notification sound\n\t */\n\tpublic async playSound(type: NotificationType): Promise<void> {\n\t\tif (this.muted) return\n\n\t\ttry {\n\t\t\t// Try to use Web Audio API first\n\t\t\tconst context = this.getAudioContext()\n\n\t\t\t// Ensure audio context is resumed (needed due to autoplay policy)\n\t\t\tif (context.state === 'suspended') {\n\t\t\t\tawait context.resume()\n\t\t\t}\n\n\t\t\t// Try to use programmatically generated sound first\n\t\t\tif (this.soundUrls[type].startsWith('blob:')) {\n\t\t\t\tthis.playFallbackSound(type)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Load sound if not already cached\n\t\t\tif (!this.soundBuffers.has(type)) {\n\t\t\t\ttry {\n\t\t\t\t\tconst buffer = await this.loadSound(type)\n\t\t\t\t\tthis.soundBuffers.set(type, buffer)\n\t\t\t\t} catch (err) {\n\t\t\t\t\t// Fall back to direct generator\n\t\t\t\t\tthis.playDirectGeneratedSound(type)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst buffer = this.soundBuffers.get(type)\n\t\t\tif (!buffer) {\n\t\t\t\tthrow new Error(`Sound buffer for ${type} not available`)\n\t\t\t}\n\n\t\t\t// Create source and gain nodes\n\t\t\tconst source = context.createBufferSource()\n\t\t\tsource.buffer = buffer\n\n\t\t\tconst gainNode = context.createGain()\n\t\t\tgainNode.gain.value = this.volume\n\n\t\t\t// Connect and play\n\t\t\tsource.connect(gainNode)\n\t\t\tgainNode.connect(context.destination)\n\t\t\tsource.start(0)\n\t\t} catch (err) {\n\t\t\tconsole.warn(`Web Audio API buffer playback failed, trying direct generation:`, err)\n\t\t\tthis.playDirectGeneratedSound(type)\n\t\t}\n\t}\n\n\t/**\n\t * Play a directly generated sound when other methods fail\n\t */\n\tprivate playDirectGeneratedSound(type: NotificationType): void {\n\t\tif (this.muted) return\n\n\t\ttry {\n\t\t\tswitch (type) {\n\t\t\t\tcase 'info':\n\t\t\t\t\tthis.soundGenerator.playInfoSound(this.volume)\n\t\t\t\t\tbreak\n\t\t\t\tcase 'success':\n\t\t\t\t\tthis.soundGenerator.playSuccessSound(this.volume)\n\t\t\t\t\tbreak\n\t\t\t\tcase 'warning':\n\t\t\t\t\tthis.soundGenerator.playWarningSound(this.volume)\n\t\t\t\t\tbreak\n\t\t\t\tcase 'error':\n\t\t\t\t\tthis.soundGenerator.playErrorSound(this.volume)\n\t\t\t\t\tbreak\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconsole.error(`Failed to play generated sound for ${type}:`, err)\n\t\t}\n\t}\n\n\t/**\n\t * Handle audio ended event for cleanup\n\t */\n\tprivate handleAudioEnded = (audio: HTMLAudioElement) => () => {\n\t\taudio.remove()\n\t}\n\n\t/**\n\t * Play sound using HTML5 Audio as a fallback\n\t */\n\tprivate playFallbackSound(type: NotificationType): void {\n\t\tif (this.muted) return\n\n\t\ttry {\n\t\t\tconst audio = new Audio(this.soundUrls[type])\n\t\t\taudio.volume = this.volume\n\n\t\t\t// Add event listener to clean up after playback using RxJS\n\t\t\tfromEvent(audio, 'ended').pipe(\n\t\t\t\ttakeUntil(fromEvent(this.disconnecting, 'disconnect'))\n\t\t\t).subscribe(this.handleAudioEnded(audio))\n\n\t\t\taudio.play().catch(err => {\n\t\t\t\tconsole.error(`Failed to play fallback sound for ${type}:`, err)\n\t\t\t\tthis.playDirectGeneratedSound(type)\n\t\t\t})\n\t\t} catch (err) {\n\t\t\tconsole.error('HTML5 Audio fallback failed:', err)\n\t\t\tthis.playDirectGeneratedSound(type)\n\t\t}\n\t}\n\n\t/**\n\t * Set volume for notification sounds (0.0 to 1.0)\n\t */\n\tpublic setVolume(volume: number): void {\n\t\tthis.volume = Math.max(0, Math.min(1, volume))\n\t}\n\n\t/**\n\t * Get current volume level\n\t */\n\tpublic getVolume(): number {\n\t\treturn this.volume\n\t}\n\n\t/**\n\t * Mute notification sounds\n\t */\n\tpublic mute(): void {\n\t\tthis.muted = true\n\t}\n\n\t/**\n\t * Unmute notification sounds\n\t */\n\tpublic unmute(): void {\n\t\tthis.muted = false\n\t}\n\n\t/**\n\t * Check if notification sounds are muted\n\t */\n\tpublic isMuted(): boolean {\n\t\treturn this.muted\n\t}\n\n\t/**\n\t * Set custom sound URL for a notification type\n\t */\n\tpublic setSoundUrl(type: NotificationType, url: string): void {\n\t\tthis.soundUrls[type] = url\n\n\t\t// Clear cached buffer to force reload\n\t\tthis.soundBuffers.delete(type)\n\t}\n\n\t/**\n\t * Get the current sound URL for a notification type\n\t */\n\tpublic getSoundUrl(type: NotificationType): string {\n\t\treturn this.soundUrls[type]\n\t}\n\n\t/**\n\t * Cleanup all subscriptions and resources\n\t */\n\tpublic dispose(): void {\n\t\tthis.disconnecting.dispatchEvent(new Event('disconnect'))\n\n\t\t// Close audio context if exists\n\t\tif (this.audioContext && this.audioContext.state !== 'closed') {\n\t\t\tthis.audioContext.close().catch(err => {\n\t\t\t\tconsole.warn('Failed to close audio context:', err)\n\t\t\t})\n\t\t}\n\t}\n}\n","import { $LitElement } from '@mixins/index'\nimport { html } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { classMap } from 'lit/directives/class-map.js'\nimport { repeat } from 'lit/directives/repeat.js'\nimport { fromEvent, takeUntil } from 'rxjs'\nimport { NotificationType } from './notification'\nimport { NotificationAudioService } from './notification-audio'\nimport style from './notification-container.scss?inline'\n\nexport interface NotificationItem {\n\tid: string\n\ttitle: string\n\tmessage: string\n\ttype: NotificationType\n\tduration: number\n\tclosable: boolean\n\tplaySound: boolean\n\tshowProgress?: boolean\n}\n\nexport interface NotificationOptions {\n\tid?: string\n\ttitle?: string\n\tmessage: string\n\ttype?: NotificationType\n\tduration?: number\n\tclosable?: boolean\n\tplaySound?: boolean\n\tshowProgress?: boolean\n}\n\n/**\n * Container component for displaying stacked notifications.\n *\n * @element sch-notification-container\n */\n@customElement('sch-notification-container')\nexport default class SchmancyNotificationContainer extends $LitElement(style) {\n\t@property({ type: String }) position:\n\t\t| 'top-right'\n\t\t| 'top-left'\n\t\t| 'bottom-right'\n\t\t| 'bottom-left'\n\t\t| 'top-center'\n\t\t| 'bottom-center' = 'top-right'\n\t@property({ type: Number }) maxVisibleNotifications = 2\n\t@property({ type: Boolean }) playSound = false\n\t@property({ type: Number }) audioVolume = 0.1\n\n\t@state() private _notifications: NotificationItem[] = []\n\n\t// Audio service\n\tprivate _audioService = new NotificationAudioService()\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback()\n\n\t\t// Set audio volume\n\t\tthis._audioService.setVolume(this.audioVolume)\n\n\t\t// Listen for notification events\n\t\tfromEvent<CustomEvent<NotificationOptions>>(window, 'schmancy-notification')\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe(event => {\n\t\t\t\tthis.addNotification(event.detail)\n\t\t\t})\n\n\t\t// Listen for dismiss events\n\t\tfromEvent<CustomEvent<{ id: string }>>(window, 'schmancy-notification-dismiss')\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe(event => {\n\t\t\t\tthis.removeNotification(event.detail.id)\n\t\t\t})\n\n\t\t// Listen for update events\n\t\tfromEvent<CustomEvent<{ id: string } & Partial<NotificationOptions>>>(window, 'schmancy-notification-update')\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe(event => {\n\t\t\t\tthis.updateNotification(event.detail.id, event.detail)\n\t\t\t})\n\n\t\t// Listen for play sound events from child notifications\n\t\tfromEvent<CustomEvent>(this, 'playsound')\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe(this.handlePlaySound)\n\t}\n\n\t// Public API to add notifications\n\tpublic addNotification(options: NotificationOptions): string {\n\t\tconst id = options.id || `notification-${Date.now()}-${Math.floor(Math.random() * 10000)}`\n\n\t\tconst notification: NotificationItem = {\n\t\t\tid,\n\t\t\ttitle: options.title || '',\n\t\t\tmessage: options.message,\n\t\t\ttype: options.type || 'info',\n\t\t\tduration: options.duration !== undefined ? options.duration : 750,\n\t\t\tclosable: options.closable !== undefined ? options.closable : true,\n\t\t\tplaySound: options.playSound !== undefined ? options.playSound : this.playSound,\n\t\t\tshowProgress: options.showProgress !== undefined ? options.showProgress : false,\n\t\t}\n\n\t\t// Add new notification (top for top-* positions, bottom for bottom-* positions)\n\t\tif (this.position.startsWith('top')) {\n\t\t\tthis._notifications = [...this._notifications, notification]\n\t\t} else {\n\t\t\tthis._notifications = [notification, ...this._notifications]\n\t\t}\n\n\t\t// Enforce max visible notifications\n\t\tif (this._notifications.length > this.maxVisibleNotifications) {\n\t\t\tthis._notifications = this._notifications.slice(-this.maxVisibleNotifications)\n\t\t}\n\n\t\t// Play sound if enabled\n\t\tif (notification.playSound) {\n\t\t\tthis._audioService.playSound(notification.type)\n\t\t}\n\n\t\treturn id\n\t}\n\n\tpublic removeNotification(id: string) {\n\t\tthis._notifications = this._notifications.filter(n => n.id !== id)\n\t}\n\n\tpublic updateNotification(id: string, options: Partial<NotificationOptions>) {\n\t\tconst index = this._notifications.findIndex(n => n.id === id)\n\t\tif (index !== -1) {\n\t\t\tthis._notifications[index] = {\n\t\t\t\t...this._notifications[index],\n\t\t\t\t...options,\n\t\t\t}\n\t\t\tthis.requestUpdate()\n\t\t}\n\t}\n\n\tprivate handlePlaySound = (event: CustomEvent) => {\n\t\tif (this.playSound) {\n\t\t\tthis._audioService.playSound(event.detail.type)\n\t\t}\n\t}\n\n\tprivate _handleClose(e: CustomEvent) {\n\t\tconst id = e.detail.id\n\t\tthis.removeNotification(id)\n\t}\n\n\trender() {\n\t\treturn html`\n\t\t\t<div\n\t\t\t\tclass=${classMap({\n\t\t\t\t\t'notification-container': true,\n\t\t\t\t\t[this.position]: true,\n\t\t\t\t})}\n\t\t\t>\n\t\t\t\t${repeat(\n\t\t\t\t\tthis._notifications,\n\t\t\t\t\tnotification => notification.id,\n\t\t\t\t\tnotification => html`\n <sch-notification\n .id=${notification.id}\n .title=${notification.title}\n .message=${notification.message}\n .type=${notification.type}\n .duration=${notification.duration}\n ?closable=${notification.closable}\n ?playSound=${false}\n ?showProgress=${notification.showProgress}\n @close=${this._handleClose}\n ></sch-notification>\n `,\n\t\t\t\t)}\n\t\t\t</div>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'sch-notification-container': SchmancyNotificationContainer\n\t}\n}\n","import { NotificationOptions } from './notification-container'\n\n/**\n * Notification service for centralized notification management.\n * Provides a simple API for showing notifications.\n */\nexport class NotificationService {\n\tprivate static instance: NotificationService\n\tprivate notificationStack: string[] = []\n\n\t// Default notification options\n\tprivate static DEFAULT_OPTIONS: Partial<NotificationOptions> = {\n\t\tduration: 1000, // 1 seconds - long enough to be readable\n\t\tclosable: true,\n\t\tplaySound: true,\n\t}\n\n\t// Private constructor for singleton pattern\n\tprivate constructor() {}\n\n\t/**\n\t * Get the singleton instance\n\t */\n\tpublic static getInstance(): NotificationService {\n\t\tif (!NotificationService.instance) {\n\t\t\tNotificationService.instance = new NotificationService()\n\t\t}\n\t\treturn NotificationService.instance\n\t}\n\n\t/**\n\t * Show a notification\n\t * @returns The ID of the created notification\n\t */\n\tpublic notify(options: NotificationOptions): string {\n\t\t// Apply default options\n\t\tconst completeOptions = {\n\t\t\t...NotificationService.DEFAULT_OPTIONS,\n\t\t\t...options,\n\t\t\t// Override with duraton from options if provided, otherwise use default\n\t\t\tduration: options.duration ?? NotificationService.DEFAULT_OPTIONS.duration,\n\t\t}\n\n\t\tconst id = completeOptions.id || `notification-${Date.now()}-${Math.floor(Math.random() * 10000)}`\n\n\t\t// Add to stack for tracking\n\t\tthis.notificationStack.push(id)\n\n\t\t// Create and dispatch event\n\t\tconst event = new CustomEvent('schmancy-notification', {\n\t\t\tbubbles: true,\n\t\t\tcomposed: true,\n\t\t\tdetail: {\n\t\t\t\t...completeOptions,\n\t\t\t\tid,\n\t\t\t},\n\t\t})\n\n\t\twindow.dispatchEvent(event)\n\t\treturn id\n\t}\n\n\t/**\n\t * Dismiss a notification\n\t * @param id Optional notification ID. If not provided, dismisses the most recent notification\n\t */\n\tpublic dismiss(id?: string): void {\n\t\tlet targetId: string | undefined\n\n\t\tif (id) {\n\t\t\t// Remove specific notification from stack\n\t\t\tconst index = this.notificationStack.indexOf(id)\n\t\t\tif (index > -1) {\n\t\t\t\tthis.notificationStack.splice(index, 1)\n\t\t\t\ttargetId = id\n\t\t\t}\n\t\t} else {\n\t\t\t// Remove most recent notification (last in stack)\n\t\t\ttargetId = this.notificationStack.pop()\n\t\t}\n\n\t\tif (targetId) {\n\t\t\t// Dispatch dismiss event\n\t\t\tconst event = new CustomEvent('schmancy-notification-dismiss', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t\tdetail: { id: targetId },\n\t\t\t})\n\t\t\twindow.dispatchEvent(event)\n\t\t}\n\t}\n\n\t/**\n\t * Update a notification's content\n\t */\n\tpublic update(id: string, options: Partial<NotificationOptions>): void {\n\t\tconst event = new CustomEvent('schmancy-notification-update', {\n\t\t\tbubbles: true,\n\t\t\tcomposed: true,\n\t\t\tdetail: { id, ...options },\n\t\t})\n\t\twindow.dispatchEvent(event)\n\t}\n\n\t/**\n\t * Show an info notification\n\t */\n\tpublic info(message?: string, options: Partial<Omit<NotificationOptions, 'message' | 'type'>> = {}): string {\n\t\treturn this.notify({\n\t\t\tmessage: message ?? '',\n\t\t\ttype: 'info',\n\t\t\tduration: message ? options.duration : 1,\n\t\t\t...options,\n\t\t})\n\t}\n\n\t/**\n\t * Show a success notification\n\t */\n\tpublic success(message?: string, options: Partial<Omit<NotificationOptions, 'message' | 'type'>> = {}): string {\n\t\treturn this.notify({\n\t\t\tmessage: message ?? '',\n\t\t\ttype: 'success',\n\t\t\tduration: message ? options.duration : 1,\n\t\t\t...options,\n\t\t})\n\t}\n\n\t/**\n\t * Show a warning notification\n\t */\n\tpublic warning(message?: string, options: Partial<Omit<NotificationOptions, 'message' | 'type'>> = {}): string {\n\t\treturn this.notify({\n\t\t\tmessage: message ?? '',\n\t\t\ttype: 'warning',\n\t\t\tduration: message ? options.duration : 1,\n\t\t\t...options,\n\t\t})\n\t}\n\n\t/**\n\t * Show an error notification\n\t */\n\tpublic error(message?: string, options: Partial<Omit<NotificationOptions, 'message' | 'type'>> = {}): string {\n\t\treturn this.notify({\n\t\t\tmessage: message ?? '',\n\t\t\ttype: 'error',\n\t\t\tduration: message ? options.duration : 1,\n\t\t\t...options,\n\t\t})\n\t}\n\n\t/**\n\t * Show a notification with a custom duration\n\t */\n\tpublic customDuration(\n\t\tmessage: string,\n\t\tduration: number,\n\t\toptions: Partial<Omit<NotificationOptions, 'message' | 'duration'>> = {},\n\t): string {\n\t\treturn this.notify({\n\t\t\tmessage,\n\t\t\tduration,\n\t\t\t...options,\n\t\t})\n\t}\n\n\t/**\n\t * Show a persistent notification (won't auto-dismiss)\n\t */\n\tpublic persistent(message: string, options: Partial<Omit<NotificationOptions, 'message' | 'duration'>> = {}): string {\n\t\treturn this.notify({\n\t\t\tmessage,\n\t\t\tduration: 0, // Zero duration means no auto-close\n\t\t\t...options,\n\t\t})\n\t}\n\n}\n\n/**\n * Global notification utility - provides a quick way to show notifications\n */\nexport const $notify = {\n\t/**\n\t * Show a notification\n\t */\n\tshow: (options: NotificationOptions): string => {\n\t\treturn NotificationService.getInstance().notify(options)\n\t},\n\n\t/**\n\t * Show an info notification\n\t */\n\tinfo: (message?: string, options: Partial<Omit<NotificationOptions, 'message' | 'type'>> = {}): string => {\n\t\treturn NotificationService.getInstance().info(message, options)\n\t},\n\n\t/**\n\t * Show a success notification\n\t */\n\tsuccess: (message?: string, options: Partial<Omit<NotificationOptions, 'message' | 'type'>> = {}): string => {\n\t\treturn NotificationService.getInstance().success(message, options)\n\t},\n\n\t/**\n\t * Show a warning notification\n\t */\n\twarning: (message?: string, options: Partial<Omit<NotificationOptions, 'message' | 'type'>> = {}): string => {\n\t\treturn NotificationService.getInstance().warning(message, options)\n\t},\n\n\t/**\n\t * Show an error notification\n\t */\n\terror: (message?: string, options: Partial<Omit<NotificationOptions, 'message' | 'type'>> = {}): string => {\n\t\treturn NotificationService.getInstance().error(message, options)\n\t},\n\n\t/**\n\t * Show a notification with a custom duration\n\t * @param message The notification message\n\t * @param duration Duration in milliseconds before auto-dismissing (0 for no auto-dismiss)\n\t * @param options Additional notification options\n\t */\n\tcustomDuration: (\n\t\tmessage: string,\n\t\tduration: number,\n\t\toptions: Partial<Omit<NotificationOptions, 'message' | 'duration'>> = {},\n\t): string => {\n\t\treturn NotificationService.getInstance().customDuration(message, duration, options)\n\t},\n\n\t/**\n\t * Show a persistent notification that won't auto-dismiss\n\t */\n\tpersistent: (message: string, options: Partial<Omit<NotificationOptions, 'message' | 'duration'>> = {}): string => {\n\t\treturn NotificationService.getInstance().persistent(message, options)\n\t},\n\n\t/**\n\t * Dismiss a notification\n\t * @param id Optional notification ID. If not provided, dismisses the most recent notification (queue-like behavior)\n\t */\n\tdismiss: (id?: string): void => {\n\t\treturn NotificationService.getInstance().dismiss(id)\n\t},\n\n\t/**\n\t * Update a notification's content\n\t */\n\tupdate: (id: string, options: Partial<NotificationOptions>): void => {\n\t\treturn NotificationService.getInstance().update(id, options)\n\t},\n}\n\nexport default NotificationService\n"],"names":["SchmancyNotification","$LitElement","constructor","super","arguments","this","title","message","type","closable","duration","id","Date","now","Math","floor","random","playSound","showProgress","_visible","_progress","_hovered","_closing","connectedCallback","_startAutoCloseTimer","_playSound","disconnectedCallback","_clearTimers","changedProps","updated","has","endTime","_autoCloseTimer","window","setTimeout","close","_progressTimer","setInterval","remaining","max","clearTimeout","clearInterval","_pauseTimers","remainingTime","dispatchEvent","CustomEvent","detail","bubbles","composed","_handleMouseEnter","_resumeTimers","render","html","typeStyles","_getTypeStyles","elevationLevel","classMap","notification","closing","styleMap","transform","opacity","boxShadow","transition","_handleMouseLeave","color","iconColor","bgColor","icon","SchmancyTheme","sys","primary","default","surface","on","success","tertiary","error","onVariant","progressColor","container","__decorateClass","property","String","prototype","Boolean","Number","state","customElement","NotificationSoundGenerator","audioContext","getAudioContext","AudioContextClass","AudioContext","webkitAudioContext","volume","ctx","currentTime","oscillator","createOscillator","gainNode","createGain","filter","createBiquadFilter","frequency","setValueAtTime","exponentialRampToValueAtTime","value","gain","connect","destination","start","stop","createBell","freq","osc","osc1","osc2","Q","audioUrls","info","generateAudioFile","async","linearRampToValueAtTime","sampleRate","gain1","gain2","warning","renderFunction","offlineCtx","OfflineAudioContext","audioBuffer","startRendering","wavBlob","audioBufferToWav","URL","createObjectURL","buffer","numChannels","numberOfChannels","blockAlign","bitDepth","samples","getAudioSamples","dataLength","length","wavBuffer","ArrayBuffer","view","DataView","writeString","setUint32","setUint16","writeInt16Samples","Blob","scale","i","channel","sample","getChannelData","intSample","min","push","offset","setInt16","string","setUint8","charCodeAt","NotificationAudioService","soundBuffers","Map","muted","soundGenerator","disconnecting","EventTarget","soundUrls","handleAudioEnded","audio","remove","initializeAudioFiles","preloadSounds","err","generatedUrls","generateAudioFiles","genErr","types","loadSound","set","url","response","fetch","ok","Error","statusText","arrayBuffer","decodeAudioData","context","resume","startsWith","playFallbackSound","playDirectGeneratedSound","get","source","createBufferSource","playInfoSound","playSuccessSound","playWarningSound","playErrorSound","Audio","fromEvent","pipe","takeUntil","subscribe","play","catch","getVolume","mute","unmute","delete","dispose","Event","SchmancyNotificationContainer","position","maxVisibleNotifications","audioVolume","_notifications","_audioService","handlePlaySound","event","setVolume","addNotification","removeNotification","updateNotification","options","slice","n","index","findIndex","requestUpdate","e","repeat","_handleClose","NotificationService","notificationStack","getInstance","instance","completeOptions","DEFAULT_OPTIONS","targetId","indexOf","splice","pop","notify","_$","$notify","show","customDuration","persistent","dismiss","update"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- "use strict";const p=require("rxjs"),b=require("lit/directives/class-map.js"),w=require("lit/directives/style-map.js"),u=require("lit/decorators.js");require("./tailwind.mixin-ClfV2_Nh.cjs");const x=require("./litElement.mixin-LplXbzd8.cjs"),S=require("./ripple-DqQrvaTe.cjs");require("lit/directives/guard.js");const l=require("./theme.interface-BMeNadVb.cjs"),d=require("lit");require("./progress-CjkD8QBy.cjs");const A=require("lit/directives/repeat.js");var C=Object.defineProperty,_=Object.getOwnPropertyDescriptor,h=(o,t,e,i)=>{for(var n,s=i>1?void 0:i?_(t,e):t,a=o.length-1;a>=0;a--)(n=o[a])&&(s=(i?n(t,e,s):n(s))||s);return i&&s&&C(t,e,s),s};exports.SchmancyNotification=class extends x.$LitElement(':host{display:block;margin-bottom:10px}:host:last-child{margin-bottom:0}.notification{width:100%;max-width:400px;box-shadow:var(--schmancy-sys-elevation-2);overflow:hidden;transform:translate(0);opacity:1;transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);background-color:var(--schmancy-sys-color-surface-container);color:var(--schmancy-sys-color-surface-on);border-radius:16px;position:relative}.notification:before{content:"";position:absolute;inset:0;border-radius:inherit;pointer-events:none;background:linear-gradient(180deg,#ffffff14,#fff0);z-index:1}.notification.info{border-left:4px solid var(--schmancy-sys-color-primary-default);background-color:color-mix(in srgb,var(--schmancy-sys-color-surface-container) 90%,var(--schmancy-sys-color-primary-container) 10%)}.notification.success{border-left:4px solid var(--schmancy-sys-color-success-default);background-color:color-mix(in srgb,var(--schmancy-sys-color-surface-container) 90%,var(--schmancy-sys-color-success-container) 10%)}.notification.warning{border-left:4px solid var(--schmancy-sys-color-tertiary-default);background-color:color-mix(in srgb,var(--schmancy-sys-color-surface-container) 90%,var(--schmancy-sys-color-tertiary-container) 10%)}.notification.error{border-left:4px solid var(--schmancy-sys-color-error-default);background-color:color-mix(in srgb,var(--schmancy-sys-color-surface-container) 90%,var(--schmancy-sys-color-error-container) 10%)}.notification.closing{transform:translate(120%);opacity:0}.notification .notification-content{display:flex;padding:18px 20px;align-items:flex-start;position:relative;z-index:2}.notification .icon-container{flex-shrink:0;margin-right:14px;display:flex;align-items:center;justify-content:center;border-radius:50%;width:28px;height:28px;position:relative}.notification .content{flex:1;min-width:0;display:flex;flex-direction:column}.notification .title{font-weight:500;font-size:16px;line-height:1.5;margin-bottom:2px;word-break:break-word;letter-spacing:.15px}.notification .message{font-size:14px;line-height:1.5;word-break:break-word;letter-spacing:.25px;opacity:.92}.notification .close-button{background:transparent;border:none;cursor:pointer;color:var(--schmancy-sys-color-surface-onVariant);padding:8px;margin-left:8px;margin-right:-4px;margin-top:-4px;border-radius:50%;display:flex;align-items:center;justify-content:center;transition:background-color .2s ease,transform .2s ease}.notification .close-button:hover{background-color:color-mix(in srgb,var(--schmancy-sys-color-surface-onVariant) 8%,transparent);transform:scale(1.05)}.notification .close-button:active{transform:scale(.95)}.notification .close-button:focus-visible{outline:none;box-shadow:0 0 0 2px var(--schmancy-sys-color-primary-default)}'){constructor(){super(...arguments),this.title="",this.message="",this.type="info",this.closable=!0,this.duration=5e3,this.id=`notification-${Date.now()}-${Math.floor(1e4*Math.random())}`,this.playSound=!0,this.showProgress=!1,this._visible=!0,this._progress=100,this._hovered=!1,this._closing=!1}connectedCallback(){super.connectedCallback(),this.duration>0&&this._startAutoCloseTimer(),this.playSound&&this._playSound()}disconnectedCallback(){this._clearTimers(),super.disconnectedCallback()}updated(o){super.updated(o),o.has("duration")&&this.duration>0&&(this._clearTimers(),this._startAutoCloseTimer())}_startAutoCloseTimer(){if(this.duration<=0)return;const o=Date.now()+this.duration;this._autoCloseTimer=window.setTimeout(()=>{this.close()},this.duration),this._progressTimer=window.setInterval(()=>{if(this._hovered)return;const t=Date.now(),e=Math.max(0,o-t);this._progress=e/this.duration*100,e<=0&&this._clearTimers()},16)}_clearTimers(){this._autoCloseTimer&&(clearTimeout(this._autoCloseTimer),this._autoCloseTimer=void 0),this._progressTimer&&(clearInterval(this._progressTimer),this._progressTimer=void 0)}_pauseTimers(){this._clearTimers()}_resumeTimers(){if(this.duration>0){const o=this._progress/100*this.duration;if(o>0){this._autoCloseTimer=window.setTimeout(()=>{this.close()},o);const t=Date.now()+o;this._progressTimer=window.setInterval(()=>{if(this._hovered)return;const e=Date.now(),i=Math.max(0,t-e);this._progress=i/o*100,i<=0&&this._clearTimers()},16)}}}_playSound(){this.dispatchEvent(new CustomEvent("playsound",{detail:{type:this.type},bubbles:!0,composed:!0}))}_handleMouseEnter(){this._hovered=!0,this._pauseTimers()}_handleMouseLeave(){this._hovered=!1,this._resumeTimers()}close(){this._closing||(this._closing=!0,this._clearTimers(),this._visible=!1,setTimeout(()=>{this.dispatchEvent(new CustomEvent("close",{detail:{id:this.id},bubbles:!0,composed:!0}))},300))}render(){if(!this._visible&&this._closing)return d.html``;const o=this._getTypeStyles(),t=this._hovered?"3":"2";return d.html`
1
+ "use strict";const p=require("rxjs");require("rxjs/operators");const b=require("lit/directives/class-map.js"),w=require("lit/directives/style-map.js"),u=require("lit/decorators.js");require("./tailwind.mixin-CYhJgwwb.cjs");const x=require("./litElement.mixin-DoBMt4ia.cjs"),S=require("./ripple-DqQrvaTe.cjs");require("lit/directives/guard.js");const l=require("./theme.interface-BMeNadVb.cjs"),d=require("lit");require("./progress-OMGbiNv5.cjs");const A=require("lit/directives/repeat.js");var C=Object.defineProperty,_=Object.getOwnPropertyDescriptor,h=(o,t,e,i)=>{for(var n,s=i>1?void 0:i?_(t,e):t,a=o.length-1;a>=0;a--)(n=o[a])&&(s=(i?n(t,e,s):n(s))||s);return i&&s&&C(t,e,s),s};exports.SchmancyNotification=class extends x.$LitElement(':host{display:block;margin-bottom:10px}:host:last-child{margin-bottom:0}.notification{width:100%;max-width:400px;box-shadow:var(--schmancy-sys-elevation-2);overflow:hidden;transform:translate(0);opacity:1;transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);background-color:var(--schmancy-sys-color-surface-container);color:var(--schmancy-sys-color-surface-on);border-radius:16px;position:relative}.notification:before{content:"";position:absolute;inset:0;border-radius:inherit;pointer-events:none;background:linear-gradient(180deg,#ffffff14,#fff0);z-index:1}.notification.info{border-left:4px solid var(--schmancy-sys-color-primary-default);background-color:color-mix(in srgb,var(--schmancy-sys-color-surface-container) 90%,var(--schmancy-sys-color-primary-container) 10%)}.notification.success{border-left:4px solid var(--schmancy-sys-color-success-default);background-color:color-mix(in srgb,var(--schmancy-sys-color-surface-container) 90%,var(--schmancy-sys-color-success-container) 10%)}.notification.warning{border-left:4px solid var(--schmancy-sys-color-tertiary-default);background-color:color-mix(in srgb,var(--schmancy-sys-color-surface-container) 90%,var(--schmancy-sys-color-tertiary-container) 10%)}.notification.error{border-left:4px solid var(--schmancy-sys-color-error-default);background-color:color-mix(in srgb,var(--schmancy-sys-color-surface-container) 90%,var(--schmancy-sys-color-error-container) 10%)}.notification.closing{transform:translate(120%);opacity:0}.notification .notification-content{display:flex;padding:18px 20px;align-items:flex-start;position:relative;z-index:2}.notification .icon-container{flex-shrink:0;margin-right:14px;display:flex;align-items:center;justify-content:center;border-radius:50%;width:28px;height:28px;position:relative}.notification .content{flex:1;min-width:0;display:flex;flex-direction:column}.notification .title{font-weight:500;font-size:16px;line-height:1.5;margin-bottom:2px;word-break:break-word;letter-spacing:.15px}.notification .message{font-size:14px;line-height:1.5;word-break:break-word;letter-spacing:.25px;opacity:.92}.notification .close-button{background:transparent;border:none;cursor:pointer;color:var(--schmancy-sys-color-surface-onVariant);padding:8px;margin-left:8px;margin-right:-4px;margin-top:-4px;border-radius:50%;display:flex;align-items:center;justify-content:center;transition:background-color .2s ease,transform .2s ease}.notification .close-button:hover{background-color:color-mix(in srgb,var(--schmancy-sys-color-surface-onVariant) 8%,transparent);transform:scale(1.05)}.notification .close-button:active{transform:scale(.95)}.notification .close-button:focus-visible{outline:none;box-shadow:0 0 0 2px var(--schmancy-sys-color-primary-default)}'){constructor(){super(...arguments),this.title="",this.message="",this.type="info",this.closable=!0,this.duration=5e3,this.id=`notification-${Date.now()}-${Math.floor(1e4*Math.random())}`,this.playSound=!0,this.showProgress=!1,this._visible=!0,this._progress=100,this._hovered=!1,this._closing=!1}connectedCallback(){super.connectedCallback(),this.duration>0&&this._startAutoCloseTimer(),this.playSound&&this._playSound()}disconnectedCallback(){this._clearTimers(),super.disconnectedCallback()}updated(o){super.updated(o),o.has("duration")&&this.duration>0&&(this._clearTimers(),this._startAutoCloseTimer())}_startAutoCloseTimer(){if(this.duration<=0)return;const o=Date.now()+this.duration;this._autoCloseTimer=window.setTimeout(()=>{this.close()},this.duration),this._progressTimer=window.setInterval(()=>{if(this._hovered)return;const t=Date.now(),e=Math.max(0,o-t);this._progress=e/this.duration*100,e<=0&&this._clearTimers()},16)}_clearTimers(){this._autoCloseTimer&&(clearTimeout(this._autoCloseTimer),this._autoCloseTimer=void 0),this._progressTimer&&(clearInterval(this._progressTimer),this._progressTimer=void 0)}_pauseTimers(){this._clearTimers()}_resumeTimers(){if(this.duration>0){const o=this._progress/100*this.duration;if(o>0){this._autoCloseTimer=window.setTimeout(()=>{this.close()},o);const t=Date.now()+o;this._progressTimer=window.setInterval(()=>{if(this._hovered)return;const e=Date.now(),i=Math.max(0,t-e);this._progress=i/o*100,i<=0&&this._clearTimers()},16)}}}_playSound(){this.dispatchEvent(new CustomEvent("playsound",{detail:{type:this.type},bubbles:!0,composed:!0}))}_handleMouseEnter(){this._hovered=!0,this._pauseTimers()}_handleMouseLeave(){this._hovered=!1,this._resumeTimers()}close(){this._closing||(this._closing=!0,this._clearTimers(),this._visible=!1,setTimeout(()=>{this.dispatchEvent(new CustomEvent("close",{detail:{id:this.id},bubbles:!0,composed:!0}))},300))}render(){if(!this._visible&&this._closing)return d.html``;const o=this._getTypeStyles(),t=this._hovered?"3":"2";return d.html`
2
2
  <div
3
3
  class=${b.classMap({notification:!0,closing:this._closing,[this.type]:!0})}
4
4
  role="alert"
@@ -140,4 +140,4 @@
140
140
  `)}
141
141
  </div>
142
142
  `}},g([u.property({type:String})],exports.SchmancyNotificationContainer.prototype,"position",2),g([u.property({type:Number})],exports.SchmancyNotificationContainer.prototype,"maxVisibleNotifications",2),g([u.property({type:Boolean})],exports.SchmancyNotificationContainer.prototype,"playSound",2),g([u.property({type:Number})],exports.SchmancyNotificationContainer.prototype,"audioVolume",2),g([u.state()],exports.SchmancyNotificationContainer.prototype,"_notifications",2),exports.SchmancyNotificationContainer=g([u.customElement("sch-notification-container")],exports.SchmancyNotificationContainer);const y=class y{constructor(){this.notificationStack=[]}static getInstance(){return y.instance||(y.instance=new y),y.instance}notify(t){const e={...y.DEFAULT_OPTIONS,...t,duration:t.duration??y.DEFAULT_OPTIONS.duration},i=e.id||`notification-${Date.now()}-${Math.floor(1e4*Math.random())}`;this.notificationStack.push(i);const n=new CustomEvent("schmancy-notification",{bubbles:!0,composed:!0,detail:{...e,id:i}});return window.dispatchEvent(n),i}dismiss(t){let e;if(t){const i=this.notificationStack.indexOf(t);i>-1&&(this.notificationStack.splice(i,1),e=t)}else e=this.notificationStack.pop();if(e){const i=new CustomEvent("schmancy-notification-dismiss",{bubbles:!0,composed:!0,detail:{id:e}});window.dispatchEvent(i)}}update(t,e){const i=new CustomEvent("schmancy-notification-update",{bubbles:!0,composed:!0,detail:{id:t,...e}});window.dispatchEvent(i)}info(t,e={}){return this.notify({message:t??"",type:"info",duration:t?e.duration:1,...e})}success(t,e={}){return this.notify({message:t??"",type:"success",duration:t?e.duration:1,...e})}warning(t,e={}){return this.notify({message:t??"",type:"warning",duration:t?e.duration:1,...e})}error(t,e={}){return this.notify({message:t??"",type:"error",duration:t?e.duration:1,...e})}customDuration(t,e,i={}){return this.notify({message:t,duration:e,...i})}persistent(t,e={}){return this.notify({message:t,duration:0,...e})}};y.DEFAULT_OPTIONS={duration:1e3,closable:!0,playSound:!0};let m=y;const N={show:o=>m.getInstance().notify(o),info:(o,t={})=>m.getInstance().info(o,t),success:(o,t={})=>m.getInstance().success(o,t),warning:(o,t={})=>m.getInstance().warning(o,t),error:(o,t={})=>m.getInstance().error(o,t),customDuration:(o,t,e={})=>m.getInstance().customDuration(o,t,e),persistent:(o,t={})=>m.getInstance().persistent(o,t),dismiss:o=>m.getInstance().dismiss(o),update:(o,t)=>m.getInstance().update(o,t)};exports.$notify=N,exports.NotificationAudioService=T;
143
- //# sourceMappingURL=notification-service-9HXSKWcw.cjs.map
143
+ //# sourceMappingURL=notification-service-DXsySIdG.cjs.map