@mhmo91/schmancy 0.9.2 → 0.9.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -75
- package/ai/INDEX.md +72 -0
- package/ai/area.md +119 -39
- package/ai/audio.md +69 -0
- package/ai/boat.md +47 -0
- package/ai/charts.md +93 -0
- package/ai/connectivity.md +36 -0
- package/ai/date-range-inline.md +44 -0
- package/ai/delay.md +50 -0
- package/ai/discovery.md +67 -0
- package/ai/expand.md +63 -0
- package/ai/extra.md +59 -0
- package/ai/float.md +14 -0
- package/ai/iframe.md +44 -0
- package/ai/json.md +33 -0
- package/ai/layout.md +63 -0
- package/ai/mailbox.md +102 -0
- package/ai/map.md +55 -0
- package/ai/mixins.md +64 -35
- package/ai/option.md +43 -0
- package/ai/page.md +42 -0
- package/ai/qr-scanner.md +51 -0
- package/ai/range.md +47 -0
- package/ai/rxjs-utils.md +60 -0
- package/ai/slider.md +43 -0
- package/ai/store.md +92 -49
- package/ai/teleport.md +55 -0
- package/ai/theme-button.md +26 -0
- package/ai/typewriter.md +46 -0
- package/ai/utils.md +95 -0
- package/ai/window.md +67 -0
- package/dist/ai/INDEX.md +72 -0
- package/dist/ai/area.md +119 -39
- package/dist/ai/audio.md +69 -0
- package/dist/ai/boat.md +47 -0
- package/dist/ai/charts.md +93 -0
- package/dist/ai/connectivity.md +36 -0
- package/dist/ai/date-range-inline.md +44 -0
- package/dist/ai/delay.md +50 -0
- package/dist/ai/discovery.md +67 -0
- package/dist/ai/expand.md +63 -0
- package/dist/ai/extra.md +59 -0
- package/dist/ai/float.md +14 -0
- package/dist/ai/iframe.md +44 -0
- package/dist/ai/json.md +33 -0
- package/dist/ai/layout.md +63 -0
- package/dist/ai/mailbox.md +102 -0
- package/dist/ai/map.md +55 -0
- package/dist/ai/mixins.md +64 -35
- package/dist/ai/option.md +43 -0
- package/dist/ai/page.md +42 -0
- package/dist/ai/qr-scanner.md +51 -0
- package/dist/ai/range.md +47 -0
- package/dist/ai/rxjs-utils.md +60 -0
- package/dist/ai/slider.md +43 -0
- package/dist/ai/store.md +92 -49
- package/dist/ai/teleport.md +55 -0
- package/dist/ai/theme-button.md +26 -0
- package/dist/ai/typewriter.md +46 -0
- package/dist/ai/utils.md +95 -0
- package/dist/ai/window.md +67 -0
- package/dist/{area-DbBcfm5p.js → area-CRoGqD_u.js} +2 -2
- package/dist/area-CRoGqD_u.js.map +1 -0
- package/dist/{area-1h9xEpTc.cjs → area-JPykB7A9.cjs} +1 -1
- package/dist/area-JPykB7A9.cjs.map +1 -0
- package/dist/area.cjs +1 -1
- package/dist/area.js +1 -1
- package/dist/{autocomplete-OE70CcYP.cjs → autocomplete-5rVhbieU.cjs} +1 -1
- package/dist/{autocomplete-OE70CcYP.cjs.map → autocomplete-5rVhbieU.cjs.map} +1 -1
- package/dist/{autocomplete-DDVsegep.js → autocomplete-BllPQwr8.js} +3 -3
- package/dist/{autocomplete-DDVsegep.js.map → autocomplete-BllPQwr8.js.map} +1 -1
- package/dist/autocomplete.cjs +1 -1
- package/dist/autocomplete.js +1 -1
- package/dist/badge.cjs +1 -1
- package/dist/badge.js +1 -1
- package/dist/{boat-T8Ov4-yA.js → boat-BDTQ-du9.js} +2 -2
- package/dist/{boat-T8Ov4-yA.js.map → boat-BDTQ-du9.js.map} +1 -1
- package/dist/{boat-Cf1oJ0ka.cjs → boat-DYEAZ8Qj.cjs} +1 -1
- package/dist/{boat-Cf1oJ0ka.cjs.map → boat-DYEAZ8Qj.cjs.map} +1 -1
- package/dist/boat.cjs +1 -1
- package/dist/boat.js +1 -1
- package/dist/{busy-BD6D5P-l.js → busy-ChDAeaKF.js} +1 -1
- package/dist/{busy-BD6D5P-l.js.map → busy-ChDAeaKF.js.map} +1 -1
- package/dist/{busy-DF9wztWL.cjs → busy-Dj7Xn0Z0.cjs} +1 -1
- package/dist/{busy-DF9wztWL.cjs.map → busy-Dj7Xn0Z0.cjs.map} +1 -1
- package/dist/busy.cjs +1 -1
- package/dist/busy.js +1 -1
- package/dist/button.cjs +1 -1
- package/dist/button.js +2 -2
- package/dist/{card-Csvu8UJ9.cjs → card-BvPWVEJX.cjs} +1 -1
- package/dist/{card-Csvu8UJ9.cjs.map → card-BvPWVEJX.cjs.map} +1 -1
- package/dist/{card-DM_miKMd.js → card-DZFPRPqs.js} +1 -1
- package/dist/{card-DM_miKMd.js.map → card-DZFPRPqs.js.map} +1 -1
- package/dist/card.cjs +1 -1
- package/dist/card.js +1 -1
- package/dist/charts.cjs +1 -1
- package/dist/charts.js +2 -2
- package/dist/{checkbox-sJujc_ga.cjs → checkbox-BC_37rsG.cjs} +1 -1
- package/dist/{checkbox-sJujc_ga.cjs.map → checkbox-BC_37rsG.cjs.map} +1 -1
- package/dist/{checkbox-BgGtMaMR.js → checkbox-GSSjqo6w.js} +1 -1
- package/dist/{checkbox-BgGtMaMR.js.map → checkbox-GSSjqo6w.js.map} +1 -1
- package/dist/checkbox.cjs +1 -1
- package/dist/checkbox.js +1 -1
- package/dist/{chips-D_e6wijp.cjs → chips-B19XS8Xc.cjs} +1 -1
- package/dist/{chips-D_e6wijp.cjs.map → chips-B19XS8Xc.cjs.map} +1 -1
- package/dist/{chips-BZaH4wez.js → chips-B9oAEfE_.js} +3 -3
- package/dist/{chips-BZaH4wez.js.map → chips-B9oAEfE_.js.map} +1 -1
- package/dist/chips.cjs +1 -1
- package/dist/chips.js +2 -2
- package/dist/{code-highlight-Q3cc6ukq.js → code-highlight-DCk5lJY-.js} +1 -1
- package/dist/{code-highlight-Q3cc6ukq.js.map → code-highlight-DCk5lJY-.js.map} +1 -1
- package/dist/{code-highlight-DlhERv_O.cjs → code-highlight-fSLrlgOb.cjs} +1 -1
- package/dist/{code-highlight-DlhERv_O.cjs.map → code-highlight-fSLrlgOb.cjs.map} +1 -1
- package/dist/code-highlight.cjs +1 -1
- package/dist/code-highlight.js +1 -1
- package/dist/{components-CRhkB3V2.js → components-COsM6sJZ.js} +2 -2
- package/dist/{components-CRhkB3V2.js.map → components-COsM6sJZ.js.map} +1 -1
- package/dist/{components-DnlEYYDs.cjs → components-CyD6a7gQ.cjs} +1 -1
- package/dist/{components-DnlEYYDs.cjs.map → components-CyD6a7gQ.cjs.map} +1 -1
- package/dist/components.cjs +1 -1
- package/dist/components.js +1 -1
- package/dist/connectivity.cjs +1 -1
- package/dist/connectivity.js +1 -1
- package/dist/content-drawer.cjs +1 -1
- package/dist/content-drawer.js +1 -1
- package/dist/{date-range-C0IYnvHF.js → date-range-Sfyco9-n.js} +3 -3
- package/dist/{date-range-C0IYnvHF.js.map → date-range-Sfyco9-n.js.map} +1 -1
- package/dist/{date-range-cymbTDnl.cjs → date-range-ZAaQB22I.cjs} +1 -1
- package/dist/{date-range-cymbTDnl.cjs.map → date-range-ZAaQB22I.cjs.map} +1 -1
- package/dist/{date-range-inline-0ENN4Plz.js → date-range-inline-Bl8qbiQF.js} +1 -1
- package/dist/{date-range-inline-0ENN4Plz.js.map → date-range-inline-Bl8qbiQF.js.map} +1 -1
- package/dist/{date-range-inline-Cfwt-ReH.cjs → date-range-inline-m7nLjOMI.cjs} +1 -1
- package/dist/{date-range-inline-Cfwt-ReH.cjs.map → date-range-inline-m7nLjOMI.cjs.map} +1 -1
- package/dist/date-range-inline.cjs +1 -1
- package/dist/date-range-inline.js +1 -1
- package/dist/date-range.cjs +1 -1
- package/dist/date-range.js +1 -1
- package/dist/{delay-D6mQLUp-.cjs → delay-7boauN6N.cjs} +1 -1
- package/dist/{delay-D6mQLUp-.cjs.map → delay-7boauN6N.cjs.map} +1 -1
- package/dist/{delay-D1dVP93u.js → delay-CgX6m0HN.js} +3 -3
- package/dist/{delay-D1dVP93u.js.map → delay-CgX6m0HN.js.map} +1 -1
- package/dist/delay.cjs +1 -1
- package/dist/delay.js +1 -1
- package/dist/{details-CPT_Mi4e.cjs → details-BHnk8l4q.cjs} +1 -1
- package/dist/{details-CPT_Mi4e.cjs.map → details-BHnk8l4q.cjs.map} +1 -1
- package/dist/{details-Cv4OOrVW.js → details-BPkUg8Cq.js} +2 -2
- package/dist/{details-Cv4OOrVW.js.map → details-BPkUg8Cq.js.map} +1 -1
- package/dist/details.cjs +1 -1
- package/dist/details.js +1 -1
- package/dist/dialog.cjs +1 -1
- package/dist/dialog.js +2 -2
- package/dist/directives.cjs.map +1 -1
- package/dist/directives.js.map +1 -1
- package/dist/discovery.cjs.map +1 -1
- package/dist/discovery.js.map +1 -1
- package/dist/{divider-DDC-kND3.js → divider-CW9a7MMj.js} +2 -2
- package/dist/{divider-DDC-kND3.js.map → divider-CW9a7MMj.js.map} +1 -1
- package/dist/{divider-nZ_2to2N.cjs → divider-_khrhrZo.cjs} +1 -1
- package/dist/{divider-nZ_2to2N.cjs.map → divider-_khrhrZo.cjs.map} +1 -1
- package/dist/divider.cjs +1 -1
- package/dist/divider.js +1 -1
- package/dist/dropdown.cjs +1 -1
- package/dist/dropdown.js +2 -2
- package/dist/{expand-Crdts9q_.cjs → expand-Cp7-PH8b.cjs} +1 -1
- package/dist/{expand-Crdts9q_.cjs.map → expand-Cp7-PH8b.cjs.map} +1 -1
- package/dist/{expand-Bp3N8CcL.js → expand-iQ7EOMP7.js} +3 -3
- package/dist/{expand-Bp3N8CcL.js.map → expand-iQ7EOMP7.js.map} +1 -1
- package/dist/expand.cjs +1 -1
- package/dist/expand.js +1 -1
- package/dist/{extra-B0IZCg0t.cjs → extra-IKAiJJhv.cjs} +1 -1
- package/dist/{extra-B0IZCg0t.cjs.map → extra-IKAiJJhv.cjs.map} +1 -1
- package/dist/{extra-DupwhQhC.js → extra-wEpvEFbK.js} +2 -2
- package/dist/{extra-DupwhQhC.js.map → extra-wEpvEFbK.js.map} +1 -1
- package/dist/extra.cjs +1 -1
- package/dist/extra.js +1 -1
- package/dist/{float-Dqdc1_S5.js → float-BQ_urmMs.js} +2 -2
- package/dist/{float-Dqdc1_S5.js.map → float-BQ_urmMs.js.map} +1 -1
- package/dist/{float-CQoJ_oSB.cjs → float-D5rNC82i.cjs} +1 -1
- package/dist/{float-CQoJ_oSB.cjs.map → float-D5rNC82i.cjs.map} +1 -1
- package/dist/float.cjs +1 -1
- package/dist/float.js +1 -1
- package/dist/{form-CvoLqMY7.cjs → form-BqN1AGFj.cjs} +1 -1
- package/dist/{form-CvoLqMY7.cjs.map → form-BqN1AGFj.cjs.map} +1 -1
- package/dist/{form-CW5XNuTg.js → form-CajC5HnO.js} +1 -1
- package/dist/{form-CW5XNuTg.js.map → form-CajC5HnO.js.map} +1 -1
- package/dist/form.cjs +1 -1
- package/dist/form.js +1 -1
- package/dist/{icons-BLQHEbIk.cjs → icons-B57_93VV.cjs} +1 -1
- package/dist/{icons-BLQHEbIk.cjs.map → icons-B57_93VV.cjs.map} +1 -1
- package/dist/{icons-Cpfdb7sA.js → icons-BDqiGXrO.js} +1 -1
- package/dist/{icons-Cpfdb7sA.js.map → icons-BDqiGXrO.js.map} +1 -1
- package/dist/icons.cjs +1 -1
- package/dist/icons.js +1 -1
- package/dist/{iframe-sJGXBbxT.cjs → iframe-DNHL3GIk.cjs} +1 -1
- package/dist/{iframe-sJGXBbxT.cjs.map → iframe-DNHL3GIk.cjs.map} +1 -1
- package/dist/{iframe-DG6HVYdy.js → iframe-WnWPIrBG.js} +1 -1
- package/dist/{iframe-DG6HVYdy.js.map → iframe-WnWPIrBG.js.map} +1 -1
- package/dist/iframe.cjs +1 -1
- package/dist/iframe.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +33 -33
- package/dist/{input-DGTdmp1Q.cjs → input-BiSrTcrR.cjs} +1 -1
- package/dist/{input-DGTdmp1Q.cjs.map → input-BiSrTcrR.cjs.map} +1 -1
- package/dist/{input-BevxycIt.js → input-VaXHFrRn.js} +1 -1
- package/dist/{input-BevxycIt.js.map → input-VaXHFrRn.js.map} +1 -1
- package/dist/{input-chip-CKVtjInb.cjs → input-chip-Dy-AiP55.cjs} +1 -1
- package/dist/{input-chip-CKVtjInb.cjs.map → input-chip-Dy-AiP55.cjs.map} +1 -1
- package/dist/{input-chip-BWS-SFU4.js → input-chip-QejNcRnS.js} +1 -1
- package/dist/{input-chip-BWS-SFU4.js.map → input-chip-QejNcRnS.js.map} +1 -1
- package/dist/input.cjs +1 -1
- package/dist/input.js +1 -1
- package/dist/json.cjs +1 -1
- package/dist/json.js +2 -2
- package/dist/{layout-DxLjlDfr.js → layout-CnsXeCAy.js} +2 -2
- package/dist/{layout-DxLjlDfr.js.map → layout-CnsXeCAy.js.map} +1 -1
- package/dist/{layout-CQdd8UCr.cjs → layout-DNYG3phx.cjs} +1 -1
- package/dist/{layout-CQdd8UCr.cjs.map → layout-DNYG3phx.cjs.map} +1 -1
- package/dist/layout.cjs +1 -1
- package/dist/layout.js +2 -2
- package/dist/{lightbox-Bjc55lHH.js → lightbox-BrI1Z31s.js} +2 -2
- package/dist/{lightbox-Bjc55lHH.js.map → lightbox-BrI1Z31s.js.map} +1 -1
- package/dist/{lightbox-C_863_XU.cjs → lightbox-CmACf0t5.cjs} +1 -1
- package/dist/{lightbox-C_863_XU.cjs.map → lightbox-CmACf0t5.cjs.map} +1 -1
- package/dist/lightbox.cjs +1 -1
- package/dist/lightbox.js +1 -1
- package/dist/{list-BAqhlzZd.js → list-Cm-jjXxM.js} +2 -2
- package/dist/{list-BAqhlzZd.js.map → list-Cm-jjXxM.js.map} +1 -1
- package/dist/{list-CaXzdN9_.cjs → list-swIL9VDv.cjs} +1 -1
- package/dist/{list-CaXzdN9_.cjs.map → list-swIL9VDv.cjs.map} +1 -1
- package/dist/list.cjs +1 -1
- package/dist/list.js +1 -1
- package/dist/{litElement.mixin-DN6X9_wD.cjs → litElement.mixin-3llHwB-8.cjs} +1 -1
- package/dist/{litElement.mixin-DN6X9_wD.cjs.map → litElement.mixin-3llHwB-8.cjs.map} +1 -1
- package/dist/{litElement.mixin-Dktub0ri.js → litElement.mixin-6jJYHCrZ.js} +1 -1
- package/dist/{litElement.mixin-Dktub0ri.js.map → litElement.mixin-6jJYHCrZ.js.map} +1 -1
- package/dist/{mailbox-DuMUH4f3.js → mailbox-BuvsVaAQ.js} +4 -4
- package/dist/{mailbox-DuMUH4f3.js.map → mailbox-BuvsVaAQ.js.map} +1 -1
- package/dist/{mailbox-BvsLXpvy.cjs → mailbox-D6LkQcN5.cjs} +1 -1
- package/dist/{mailbox-BvsLXpvy.cjs.map → mailbox-D6LkQcN5.cjs.map} +1 -1
- package/dist/mailbox.cjs +1 -1
- package/dist/mailbox.js +1 -1
- package/dist/{map-DkIy1ph7.js → map-CQiKAxC3.js} +1 -1
- package/dist/{map-DkIy1ph7.js.map → map-CQiKAxC3.js.map} +1 -1
- package/dist/{map-C2Msv9TQ.cjs → map-D5NN4VET.cjs} +1 -1
- package/dist/{map-C2Msv9TQ.cjs.map → map-D5NN4VET.cjs.map} +1 -1
- package/dist/map.cjs +1 -1
- package/dist/map.js +1 -1
- package/dist/{menu-DEeDKW5U.js → menu-C1x04YZw.js} +2 -2
- package/dist/{menu-DEeDKW5U.js.map → menu-C1x04YZw.js.map} +1 -1
- package/dist/{menu-Mm71lv9k.cjs → menu-CkgMO9K5.cjs} +1 -1
- package/dist/{menu-Mm71lv9k.cjs.map → menu-CkgMO9K5.cjs.map} +1 -1
- package/dist/menu.cjs +1 -1
- package/dist/menu.js +1 -1
- package/dist/mixins.cjs +1 -1
- package/dist/mixins.js +3 -3
- package/dist/nav-drawer.cjs +1 -1
- package/dist/nav-drawer.js +1 -1
- package/dist/navigation-bar.cjs +1 -1
- package/dist/navigation-bar.js +1 -1
- package/dist/navigation-rail.cjs +1 -1
- package/dist/navigation-rail.js +2 -2
- package/dist/{notification-K-ug8cKk.js → notification-BnBgxjF-.js} +3 -3
- package/dist/{notification-K-ug8cKk.js.map → notification-BnBgxjF-.js.map} +1 -1
- package/dist/{notification-cTgXEDZ0.cjs → notification-CZFEhWxc.cjs} +1 -1
- package/dist/{notification-cTgXEDZ0.cjs.map → notification-CZFEhWxc.cjs.map} +1 -1
- package/dist/notification.cjs +1 -1
- package/dist/notification.js +1 -1
- package/dist/{option-5rEOmtAm.cjs → option-BrxCVwSx.cjs} +1 -1
- package/dist/{option-5rEOmtAm.cjs.map → option-BrxCVwSx.cjs.map} +1 -1
- package/dist/{option-TFSKvSjT.js → option-DBO8xZwd.js} +1 -1
- package/dist/{option-TFSKvSjT.js.map → option-DBO8xZwd.js.map} +1 -1
- package/dist/option.cjs +1 -1
- package/dist/option.js +1 -1
- package/dist/page.cjs +1 -1
- package/dist/page.js +3 -3
- package/dist/{progress-iu0AMbSg.cjs → progress-Db2e4_Zd.cjs} +1 -1
- package/dist/{progress-iu0AMbSg.cjs.map → progress-Db2e4_Zd.cjs.map} +1 -1
- package/dist/{progress-Cta3nM-f.js → progress-DeiHxXo7.js} +2 -2
- package/dist/{progress-Cta3nM-f.js.map → progress-DeiHxXo7.js.map} +1 -1
- package/dist/progress.cjs +1 -1
- package/dist/progress.js +1 -1
- package/dist/{provide-D69zybs5.js → provide-C1aQhxYo.js} +1 -1
- package/dist/{provide-D69zybs5.js.map → provide-C1aQhxYo.js.map} +1 -1
- package/dist/{provide-BEyyKlDM.cjs → provide-DHnhQtCH.cjs} +1 -1
- package/dist/{provide-BEyyKlDM.cjs.map → provide-DHnhQtCH.cjs.map} +1 -1
- package/dist/qr-scanner.cjs +1 -1
- package/dist/qr-scanner.js +2 -2
- package/dist/{radio-group-DKPN0T50.cjs → radio-group-Cspwd-Vw.cjs} +1 -1
- package/dist/{radio-group-DKPN0T50.cjs.map → radio-group-Cspwd-Vw.cjs.map} +1 -1
- package/dist/{radio-group-BjSWmYJC.js → radio-group-zSO0AkJf.js} +1 -1
- package/dist/{radio-group-BjSWmYJC.js.map → radio-group-zSO0AkJf.js.map} +1 -1
- package/dist/radio-group.cjs +1 -1
- package/dist/radio-group.js +1 -1
- package/dist/range.cjs +1 -1
- package/dist/range.js +1 -1
- package/dist/{scroll-mayaGGpE.cjs → scroll-QMCmbbDv.cjs} +1 -1
- package/dist/{scroll-mayaGGpE.cjs.map → scroll-QMCmbbDv.cjs.map} +1 -1
- package/dist/{scroll-tG1vaRFO.js → scroll-cBDzye64.js} +1 -1
- package/dist/{scroll-tG1vaRFO.js.map → scroll-cBDzye64.js.map} +1 -1
- package/dist/{select-C4YK5Arj.cjs → select-Ct37l3lg.cjs} +1 -1
- package/dist/{select-C4YK5Arj.cjs.map → select-Ct37l3lg.cjs.map} +1 -1
- package/dist/{select-CepryGGP.js → select-c6HbWvKP.js} +2 -2
- package/dist/{select-CepryGGP.js.map → select-c6HbWvKP.js.map} +1 -1
- package/dist/select.cjs +1 -1
- package/dist/select.js +1 -1
- package/dist/{sheet-D2uT95S1.js → sheet-BMXcUiIm.js} +4 -4
- package/dist/{sheet-D2uT95S1.js.map → sheet-BMXcUiIm.js.map} +1 -1
- package/dist/{sheet-Cy4C2-kG.cjs → sheet-CQec-bCV.cjs} +1 -1
- package/dist/{sheet-Cy4C2-kG.cjs.map → sheet-CQec-bCV.cjs.map} +1 -1
- package/dist/sheet.cjs +1 -1
- package/dist/sheet.js +2 -2
- package/dist/{sheet.service-Os8KJGSE.js → sheet.service-BcPV3Du4.js} +1 -1
- package/dist/{sheet.service-Os8KJGSE.js.map → sheet.service-BcPV3Du4.js.map} +1 -1
- package/dist/{sheet.service-Dv5Hwj3k.cjs → sheet.service-Dumvr1HT.cjs} +1 -1
- package/dist/{sheet.service-Dv5Hwj3k.cjs.map → sheet.service-Dumvr1HT.cjs.map} +1 -1
- package/dist/slider.cjs +1 -1
- package/dist/slider.js +2 -2
- package/dist/{src-BLcmKlCH.js → src-BLngW2bl.js} +42 -42
- package/dist/{src-BLcmKlCH.js.map → src-BLngW2bl.js.map} +1 -1
- package/dist/{src-tfU0akqI.cjs → src-BtQVyqMy.cjs} +1 -1
- package/dist/{src-tfU0akqI.cjs.map → src-BtQVyqMy.cjs.map} +1 -1
- package/dist/steps.cjs +1 -1
- package/dist/steps.js +3 -3
- package/dist/{surface-CiiIYeJN.cjs → surface-BjKZoJxK.cjs} +1 -1
- package/dist/{surface-CiiIYeJN.cjs.map → surface-BjKZoJxK.cjs.map} +1 -1
- package/dist/{surface-fXvRpS6s.js → surface-pK8hME5c.js} +3 -3
- package/dist/{surface-fXvRpS6s.js.map → surface-pK8hME5c.js.map} +1 -1
- package/dist/surface.cjs +1 -1
- package/dist/surface.js +1 -1
- package/dist/{surface.mixin-C4hbgyaP.cjs → surface.mixin-C5sDI1-_.cjs} +1 -1
- package/dist/{surface.mixin-C4hbgyaP.cjs.map → surface.mixin-C5sDI1-_.cjs.map} +1 -1
- package/dist/{surface.mixin-DBuxL5aL.js → surface.mixin-CBNRpJum.js} +1 -1
- package/dist/{surface.mixin-DBuxL5aL.js.map → surface.mixin-CBNRpJum.js.map} +1 -1
- package/dist/{table-BeXnwSsq.js → table-BXIHX9h4.js} +2 -2
- package/dist/{table-BeXnwSsq.js.map → table-BXIHX9h4.js.map} +1 -1
- package/dist/{table-BRVKlNjl.cjs → table-CiqgZzSd.cjs} +1 -1
- package/dist/{table-BRVKlNjl.cjs.map → table-CiqgZzSd.cjs.map} +1 -1
- package/dist/table.cjs +1 -1
- package/dist/table.js +1 -1
- package/dist/{tabs-CBU9Ctqm.cjs → tabs-CKa-W4qA.cjs} +1 -1
- package/dist/{tabs-CBU9Ctqm.cjs.map → tabs-CKa-W4qA.cjs.map} +1 -1
- package/dist/{tabs-y708NWQ2.js → tabs-nbV5eblZ.js} +2 -2
- package/dist/{tabs-y708NWQ2.js.map → tabs-nbV5eblZ.js.map} +1 -1
- package/dist/tabs.cjs +1 -1
- package/dist/tabs.js +1 -1
- package/dist/tailwind.mixin-BCJOOX1_.js +225 -0
- package/dist/tailwind.mixin-BCJOOX1_.js.map +1 -0
- package/dist/tailwind.mixin-BF1Huas7.cjs +2 -0
- package/dist/tailwind.mixin-BF1Huas7.cjs.map +1 -0
- package/dist/teleport.cjs +1 -1
- package/dist/teleport.js +1 -1
- package/dist/{textarea-BhAoJg8c.cjs → textarea-Cp1ZE60O.cjs} +1 -1
- package/dist/{textarea-BhAoJg8c.cjs.map → textarea-Cp1ZE60O.cjs.map} +1 -1
- package/dist/{textarea-Bl8-gQEJ.js → textarea-D7q8exMg.js} +1 -1
- package/dist/{textarea-Bl8-gQEJ.js.map → textarea-D7q8exMg.js.map} +1 -1
- package/dist/textarea.cjs +1 -1
- package/dist/textarea.js +1 -1
- package/dist/{theme-C-vdR-Ic.cjs → theme-Da4SPq9X.cjs} +1 -1
- package/dist/{theme-C-vdR-Ic.cjs.map → theme-Da4SPq9X.cjs.map} +1 -1
- package/dist/{theme-DZUpYJn-.js → theme-_VPV6Bxh.js} +3 -3
- package/dist/{theme-DZUpYJn-.js.map → theme-_VPV6Bxh.js.map} +1 -1
- package/dist/{theme-button-CwrvpOMK.js → theme-button--sX8A-m1.js} +1 -1
- package/dist/{theme-button-CwrvpOMK.js.map → theme-button--sX8A-m1.js.map} +1 -1
- package/dist/{theme-button-Cx1iKh7G.cjs → theme-button-Ci8VQ7KW.cjs} +1 -1
- package/dist/{theme-button-Cx1iKh7G.cjs.map → theme-button-Ci8VQ7KW.cjs.map} +1 -1
- package/dist/theme-button.cjs +1 -1
- package/dist/theme-button.js +1 -1
- package/dist/theme.cjs +1 -1
- package/dist/theme.js +2 -2
- package/dist/tooltip.cjs +1 -1
- package/dist/tooltip.js +1 -1
- package/dist/tree.cjs +1 -1
- package/dist/tree.js +1 -1
- package/dist/{typewriter-CXQIzqPV.cjs → typewriter-B2TnHPjw.cjs} +1 -1
- package/dist/{typewriter-CXQIzqPV.cjs.map → typewriter-B2TnHPjw.cjs.map} +1 -1
- package/dist/{typewriter-mxVw5dFn.js → typewriter-BrZNa8T-.js} +3 -3
- package/dist/{typewriter-mxVw5dFn.js.map → typewriter-BrZNa8T-.js.map} +1 -1
- package/dist/typewriter.cjs +1 -1
- package/dist/typewriter.js +1 -1
- package/dist/typography.cjs +1 -1
- package/dist/typography.js +1 -1
- package/dist/{window-EWYJJC_H.js → window-CM1ycigo.js} +2 -2
- package/dist/{window-EWYJJC_H.js.map → window-CM1ycigo.js.map} +1 -1
- package/dist/{window-DFMlB1Tq.cjs → window-Uii13x_r.cjs} +1 -1
- package/dist/{window-DFMlB1Tq.cjs.map → window-Uii13x_r.cjs.map} +1 -1
- package/dist/window.cjs +1 -1
- package/dist/window.js +1 -1
- package/mixins/baseElement.ts +1 -1
- package/mixins/discovery.service.ts +1 -1
- package/package.json +1 -2
- package/src/area/area.service.ts +1 -1
- package/src/area/router.types.ts +1 -1
- package/src/directives/animate-text.ts +1 -1
- package/src/discovery/discovery.service.ts +1 -1
- package/src/input/input.ts +1 -1
- package/src/mailbox/README.md +7 -10
- package/src/mailbox/types.ts +0 -1
- package/types/mixins/discovery.service.d.ts +1 -1
- package/types/src/discovery/discovery.service.d.ts +1 -1
- package/types/src/mailbox/types.d.ts +0 -1
- package/dist/area-1h9xEpTc.cjs.map +0 -1
- package/dist/area-DbBcfm5p.js.map +0 -1
- package/dist/tailwind.mixin-C4cx3IOr.js +0 -225
- package/dist/tailwind.mixin-C4cx3IOr.js.map +0 -1
- package/dist/tailwind.mixin-DGiyLbEi.cjs +0 -2
- package/dist/tailwind.mixin-DGiyLbEi.cjs.map +0 -1
- package/src/area/readme.md +0 -338
- package/src/area/router-guide.md +0 -360
- package/src/autocomplete/README.md +0 -485
- package/src/content-drawer/readme.md +0 -709
- package/src/icons/readme.md +0 -37
- package/src/list/readme.md +0 -62
- package/src/radio-group/readme.md +0 -315
- package/src/select/README.md +0 -405
- package/src/tabs/Readme.md +0 -397
- package/src/teleport/readme.md +0 -91
- package/src/tree/README.md +0 -59
- package/src/typewriter/IMPROVEMENTS.md +0 -174
- package/src/typewriter/QUICK_REFERENCE.md +0 -166
- package/src/typewriter/test-typewriter.html +0 -97
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# Schmancy Charts
|
|
2
|
+
|
|
3
|
+
> Canvas-rendered area chart and horizontal pill chart. Theme-aware, lazy-animated, with auto peak highlighting.
|
|
4
|
+
|
|
5
|
+
## schmancy-area-chart
|
|
6
|
+
|
|
7
|
+
> Smooth Catmull-Rom spline area chart with peak markers and hover tooltips.
|
|
8
|
+
|
|
9
|
+
```html
|
|
10
|
+
<schmancy-area-chart
|
|
11
|
+
.data=${[
|
|
12
|
+
{ label: '9 AM', value: 12.4 },
|
|
13
|
+
{ label: '10 AM', value: 18.9 },
|
|
14
|
+
{ label: '11 AM', value: 42.1, metadata: { users: 320 } },
|
|
15
|
+
{ label: '12 PM', value: 56.7 },
|
|
16
|
+
]}
|
|
17
|
+
value-prefix="EUR "
|
|
18
|
+
value-decimals="2"
|
|
19
|
+
peak-count="2"
|
|
20
|
+
height="240"
|
|
21
|
+
></schmancy-area-chart>
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### Properties
|
|
25
|
+
| Property | Type | Default | Description |
|
|
26
|
+
|----------|------|---------|-------------|
|
|
27
|
+
| `data` | `ChartDataPoint[]` | `[]` | `{ label, value, metadata? }[]` |
|
|
28
|
+
| `height` | number | `200` | Chart height in px |
|
|
29
|
+
| `showGrid` | boolean | `true` | Background grid lines |
|
|
30
|
+
| `showLabels` | boolean | `true` | X-axis labels |
|
|
31
|
+
| `showTooltip` | boolean | `true` | Hover tooltip |
|
|
32
|
+
| `peakCount` | number | `3` | Top-N points highlighted larger |
|
|
33
|
+
| `animationDuration` | number | `800` | Entrance animation ms |
|
|
34
|
+
| `animated` | boolean | `true` | Animate on first visible |
|
|
35
|
+
| `valuePrefix` | string | `''` | Display prefix (e.g. `"EUR "`) |
|
|
36
|
+
| `valueSuffix` | string | `''` | Display suffix (e.g. `"%"`) |
|
|
37
|
+
| `valueDecimals` | number | `2` | Decimal places |
|
|
38
|
+
| `theme` | `Partial<ChartTheme>` | `{}` | Override colors, stroke, radii |
|
|
39
|
+
|
|
40
|
+
### ChartTheme
|
|
41
|
+
| Key | Default | Description |
|
|
42
|
+
|-----|---------|-------------|
|
|
43
|
+
| `primaryColor` | `--schmancy-sys-color-primary` | Line + fill gradient color |
|
|
44
|
+
| `gradientOpacity` | `[0.4, 0.05]` | Top/bottom fill opacity |
|
|
45
|
+
| `strokeWidth` | `2` | Line thickness |
|
|
46
|
+
| `pointRadius` | `4` | Normal point radius |
|
|
47
|
+
| `peakRadius` | `6` | Peak point radius |
|
|
48
|
+
|
|
49
|
+
## schmancy-pills
|
|
50
|
+
|
|
51
|
+
> Horizontal bar chart with optional stacked segments, medal ranks, and peak/low styling.
|
|
52
|
+
|
|
53
|
+
```html
|
|
54
|
+
<schmancy-pills
|
|
55
|
+
.data=${[
|
|
56
|
+
{ label: 'Mon', value: 1240, rank: 1 },
|
|
57
|
+
{ label: 'Tue', value: 980 },
|
|
58
|
+
{ label: 'Wed', value: 1830, rank: 2, segments: [
|
|
59
|
+
{ label: 'Pizza', value: 1200 },
|
|
60
|
+
{ label: 'Drinks', value: 630 }
|
|
61
|
+
]},
|
|
62
|
+
]}
|
|
63
|
+
></schmancy-pills>
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### Properties
|
|
67
|
+
| Property | Type | Default | Description |
|
|
68
|
+
|----------|------|---------|-------------|
|
|
69
|
+
| `data` | `PillDataPoint[]` | `[]` | Rows with optional stacked `segments` |
|
|
70
|
+
| `valuePrefix` / `valueSuffix` / `valueDecimals` | — | — | Value formatting (same as area chart) |
|
|
71
|
+
| `showMedals` | boolean | `true` | Show 🥇🥈🥉 for rank 1/2/3 |
|
|
72
|
+
|
|
73
|
+
### PillDataPoint
|
|
74
|
+
```typescript
|
|
75
|
+
{
|
|
76
|
+
label: string
|
|
77
|
+
value: number
|
|
78
|
+
segments?: { label, value, color }[] // stacked
|
|
79
|
+
isPeak?: boolean // highlighted
|
|
80
|
+
isLow?: boolean // muted
|
|
81
|
+
rank?: 1 | 2 | 3 // medal
|
|
82
|
+
metadata?: Record<string, unknown>
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Behavior
|
|
87
|
+
- Both charts use an IntersectionObserver to defer animation until visible.
|
|
88
|
+
- Responsive — resize triggers a re-render.
|
|
89
|
+
- Dark/light aware via theme CSS variables.
|
|
90
|
+
|
|
91
|
+
## When to Use
|
|
92
|
+
- Area chart: time-series or comparative trends.
|
|
93
|
+
- Pills: ranked categorical data (leaderboards, top days, distribution).
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# schmancy-connectivity-status
|
|
2
|
+
|
|
3
|
+
> App-wide online/offline banner. Mount once near the root and forget it.
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
```html
|
|
7
|
+
<!-- In your app shell -->
|
|
8
|
+
<schmancy-connectivity-status></schmancy-connectivity-status>
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Properties
|
|
12
|
+
None — it's entirely self-driven from `window` online/offline events.
|
|
13
|
+
|
|
14
|
+
## Behavior
|
|
15
|
+
- Listens to `window` `online` / `offline` events via RxJS `merge`.
|
|
16
|
+
- `distinctUntilChanged` prevents duplicate banners.
|
|
17
|
+
- Animated slide-down banner with spring-style easing when state changes.
|
|
18
|
+
- Offline: error-colored banner with pulsing icon.
|
|
19
|
+
- Online (after offline): success-colored banner with bouncing icon, auto-dismisses after a short timer.
|
|
20
|
+
- Plays matching sounds from the `$sounds` audio service (skipped on initial load).
|
|
21
|
+
- Respects `prefers-reduced-motion` implicitly via CSS.
|
|
22
|
+
|
|
23
|
+
## Setup
|
|
24
|
+
Place it once at the root — typically just inside your main `schmancy-theme` or app shell:
|
|
25
|
+
|
|
26
|
+
```html
|
|
27
|
+
<schmancy-theme>
|
|
28
|
+
<schmancy-connectivity-status></schmancy-connectivity-status>
|
|
29
|
+
<schmancy-page>
|
|
30
|
+
<!-- rest of app -->
|
|
31
|
+
</schmancy-page>
|
|
32
|
+
</schmancy-theme>
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## See Also
|
|
36
|
+
- [audio.md](./audio.md) — the `$sounds` service used for feedback tones.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# schmancy-date-range-inline
|
|
2
|
+
|
|
3
|
+
> Smart inline from/to date picker with validation, auto-correction, and gap constraints. Simpler surface than the full `schmancy-date-range` popover.
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
```html
|
|
7
|
+
<schmancy-date-range-inline
|
|
8
|
+
.dateFrom=${{ label: 'Check-in', value: '2026-05-01' }}
|
|
9
|
+
.dateTo=${{ label: 'Check-out', value: '2026-05-05' }}
|
|
10
|
+
min-date="2026-01-01"
|
|
11
|
+
max-date="2026-12-31"
|
|
12
|
+
.minGap=${1}
|
|
13
|
+
.maxGap=${30}
|
|
14
|
+
@change=${e => this.handleRange(e.detail)}
|
|
15
|
+
></schmancy-date-range-inline>
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Properties
|
|
19
|
+
| Property | Type | Default | Description |
|
|
20
|
+
|----------|------|---------|-------------|
|
|
21
|
+
| `type` | `'date' \| 'datetime-local'` | `'date'` | Underlying input type |
|
|
22
|
+
| `dateFrom` | `{ label, value }` | `{ label: 'From', value: '' }` | From-date configuration |
|
|
23
|
+
| `dateTo` | `{ label, value }` | `{ label: 'To', value: '' }` | To-date configuration |
|
|
24
|
+
| `minDate` | string | — | Minimum selectable date (ISO string) |
|
|
25
|
+
| `maxDate` | string | — | Maximum selectable date (ISO string) |
|
|
26
|
+
| `compact` | boolean | `false` | Tighter UI spacing |
|
|
27
|
+
| `autoCorrect` | boolean | `true` | Auto-fix invalid ranges (e.g. swap if from > to) |
|
|
28
|
+
| `minGap` | number | `0` | Minimum days between from and to |
|
|
29
|
+
| `maxGap` | number | — | Maximum days between from and to |
|
|
30
|
+
| `defaultGap` | number | `1` | Default gap when seeding the second date |
|
|
31
|
+
| `allowSameDate` | boolean | `false` | Permit from === to |
|
|
32
|
+
|
|
33
|
+
## Events
|
|
34
|
+
| Event | Detail | When |
|
|
35
|
+
|-------|--------|------|
|
|
36
|
+
| `change` | `{ dateFrom, dateTo, isValid }` | Either input changes |
|
|
37
|
+
|
|
38
|
+
## Behavior
|
|
39
|
+
- Extends `SchmancyFormField()` — integrates with `schmancy-form` validation.
|
|
40
|
+
- Auto-correction: invalid ranges flip, or the second date shifts to respect `minGap`/`maxGap`.
|
|
41
|
+
- Inline (not a popover) — always visible, good for filters and trip-planning UIs.
|
|
42
|
+
|
|
43
|
+
## Prefer full picker
|
|
44
|
+
For a popup calendar with presets and visual selection, use [`schmancy-date-range`](./date-range.md).
|
package/dist/ai/delay.md
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# schmancy-delay
|
|
2
|
+
|
|
3
|
+
> Defers rendering of children by a duration, with an entrance motion. Siblings auto-stagger without manual delay math.
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
```html
|
|
7
|
+
<schmancy-delay delay="200">
|
|
8
|
+
<h1>Appears after 200ms</h1>
|
|
9
|
+
</schmancy-delay>
|
|
10
|
+
|
|
11
|
+
<!-- Auto-staggered list: each child inherits + stacks its own delay -->
|
|
12
|
+
<schmancy-delay delay="100">
|
|
13
|
+
<schmancy-delay delay="100"><div>Step 1</div></schmancy-delay>
|
|
14
|
+
<schmancy-delay delay="100"><div>Step 2</div></schmancy-delay>
|
|
15
|
+
<schmancy-delay delay="100"><div>Step 3</div></schmancy-delay>
|
|
16
|
+
</schmancy-delay>
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Properties
|
|
20
|
+
| Property | Type | Default | Description |
|
|
21
|
+
|----------|------|---------|-------------|
|
|
22
|
+
| `delay` | number | `0` | Ms to wait before rendering this node |
|
|
23
|
+
| `motion` | `'flyBelow' \| 'flyAbove' \| 'fadeIn'` | `'flyBelow'` | `@lit-labs/motion` entrance animation |
|
|
24
|
+
| `once` | boolean | `true` | Skip delay on subsequent renders within the same session (keyed on content hash) |
|
|
25
|
+
|
|
26
|
+
## Context
|
|
27
|
+
- Consumes parent `delayContext` and adds its own delay.
|
|
28
|
+
- Walks previous siblings that are also `schmancy-delay` and accumulates their delays.
|
|
29
|
+
- Provides the resulting `effectiveDelay` down to descendants via context.
|
|
30
|
+
|
|
31
|
+
Result: nested `schmancy-delay` nodes produce natural staggered entrances without manual math.
|
|
32
|
+
|
|
33
|
+
## Session Caching
|
|
34
|
+
- When `once=true`, the content is hashed on first render and cached in `sessionStorage`.
|
|
35
|
+
- On subsequent component mounts (route revisits), the delay is skipped — content appears instantly.
|
|
36
|
+
- Set `once=false` to always replay the delay.
|
|
37
|
+
|
|
38
|
+
## Example — hero reveal
|
|
39
|
+
```html
|
|
40
|
+
<schmancy-delay delay="0" motion="fadeIn">
|
|
41
|
+
<schmancy-delay delay="300"><h1>Welcome</h1></schmancy-delay>
|
|
42
|
+
<schmancy-delay delay="200"><p>Subtitle…</p></schmancy-delay>
|
|
43
|
+
<schmancy-delay delay="200">
|
|
44
|
+
<schmancy-button variant="filled">Get started</schmancy-button>
|
|
45
|
+
</schmancy-delay>
|
|
46
|
+
</schmancy-delay>
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## See Also
|
|
50
|
+
- Use [`gravity`](./directives.md#gravity--elements-fall-into-place-with-mass-based-bounce) directive for mass-based staggered reveal on lists — often simpler than nested `schmancy-delay`.
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Schmancy Discovery
|
|
2
|
+
|
|
3
|
+
> Event-based component and element discovery across shadow DOM boundaries. No DOM traversal — just broadcast and race.
|
|
4
|
+
|
|
5
|
+
## Why
|
|
6
|
+
Web components hide inside shadow DOM. Traversing with `querySelector` + `shadowRoot` everywhere is fragile. Discovery broadcasts a "where are you?" event; components respond with themselves.
|
|
7
|
+
|
|
8
|
+
## API
|
|
9
|
+
```typescript
|
|
10
|
+
import {
|
|
11
|
+
discover,
|
|
12
|
+
discoverComponent,
|
|
13
|
+
discoverAnyComponent,
|
|
14
|
+
discoverElement,
|
|
15
|
+
discoverAllElements,
|
|
16
|
+
} from '@mhmo91/schmancy'
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### `discover(query, timeout?)`
|
|
20
|
+
Smart auto-detect. Routes to `discoverElement` for CSS selectors (`#`, `.`, `[`) and `discoverComponent` for tag names.
|
|
21
|
+
```typescript
|
|
22
|
+
discover<SchmancyNavigationRail>('schmancy-navigation-rail').subscribe(el => el?.select('home'))
|
|
23
|
+
discover('#hero-card').subscribe(el => el?.focus())
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### `discoverComponent(tag, timeout = 100)`
|
|
27
|
+
Broadcasts `{tag}-where-are-you`; first responder wins.
|
|
28
|
+
```typescript
|
|
29
|
+
discoverComponent<SchmancyDialog>('schmancy-dialog')
|
|
30
|
+
.subscribe(dialog => dialog?.open())
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### `discoverAnyComponent(...tags)`
|
|
34
|
+
Race between multiple tags — first to respond wins.
|
|
35
|
+
```typescript
|
|
36
|
+
discoverAnyComponent('schmancy-navigation-rail', 'schmancy-navigation-bar')
|
|
37
|
+
.subscribe(nav => nav?.select(route))
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### `discoverElement(selector, timeout = 150)`
|
|
41
|
+
Finds any element by CSS selector across shadow DOM. Uses a request ID + universal `schmancy-discover` event. Every `$LitElement` responds if it finds a match in its shadow root.
|
|
42
|
+
```typescript
|
|
43
|
+
discoverElement('[data-section="pricing"]').subscribe(section => section?.scrollIntoView())
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### `discoverAllElements(selector, timeout = 150)`
|
|
47
|
+
Collects **all** matching responses within the timeout window.
|
|
48
|
+
```typescript
|
|
49
|
+
discoverAllElements('.flagged').subscribe(all => console.log(all.length))
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## How the Handshake Works
|
|
53
|
+
1. Caller creates a unique `requestId` and broadcasts `schmancy-discover` on `window` with `{ selector, requestId }`.
|
|
54
|
+
2. Every `$LitElement` listens for this event (wired up in the base class).
|
|
55
|
+
3. Any matching element dispatches `schmancy-discover-response` with `{ requestId, element }`.
|
|
56
|
+
4. Caller collects responses for the timeout window and emits via RxJS.
|
|
57
|
+
|
|
58
|
+
## Pattern in Base Class
|
|
59
|
+
Every `$LitElement` inherits auto-response: `discover<T>(tag)` (method on the component) and `{tagName}-where-are-you`/`{tagName}-here-i-am` events. See [mixins.md](./mixins.md).
|
|
60
|
+
|
|
61
|
+
## When to Use
|
|
62
|
+
- Cross-shadow coordination between unrelated components.
|
|
63
|
+
- Imperatively focusing or driving a far-away UI piece from a handler.
|
|
64
|
+
|
|
65
|
+
## When NOT to Use
|
|
66
|
+
- Same-tree data flow — use `@provide`/`@consume` (Lit context) or Schmancy [`store`](./store.md).
|
|
67
|
+
- Parent-to-child directly — just use `this.renderRoot.querySelector()`.
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# schmancy-expand
|
|
2
|
+
|
|
3
|
+
> Expandable/accordion component. Inline mode uses grid-template-rows transitions; portal mode teleports content to a body-level `schmancy-expand-root` with backdrop.
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
```html
|
|
7
|
+
<schmancy-expand summary="Details">
|
|
8
|
+
<p>Content appears when expanded.</p>
|
|
9
|
+
</schmancy-expand>
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## Properties
|
|
13
|
+
| Property | Type | Default | Description |
|
|
14
|
+
|----------|------|---------|-------------|
|
|
15
|
+
| `summary` | string | `''` | Summary text shown when collapsed |
|
|
16
|
+
| `open` | boolean | `false` | Expansion state (reflected) |
|
|
17
|
+
| `summary-padding` | string | — | CSS padding for the summary row |
|
|
18
|
+
| `content-padding` | string | — | CSS padding for the body |
|
|
19
|
+
| `hide-indicator` | boolean | `false` | Hide the chevron indicator |
|
|
20
|
+
| `indicator-rotate` | number | `90` | Rotation angle (deg) when open |
|
|
21
|
+
| `backdrop` | boolean | `true` | Show semi-transparent backdrop in portal mode |
|
|
22
|
+
| `inline` | boolean | `false` | Inline expansion instead of portal (no backdrop) |
|
|
23
|
+
|
|
24
|
+
## Slots
|
|
25
|
+
| Slot | Purpose |
|
|
26
|
+
|------|---------|
|
|
27
|
+
| (default) | Expanded content |
|
|
28
|
+
| `summary` | Custom summary markup (overrides `summary` property) |
|
|
29
|
+
|
|
30
|
+
## Behavior
|
|
31
|
+
- **Portal mode (default)**: on open, content is teleported into a body-anchored `schmancy-expand-root` with a backdrop. Click outside or press `Escape` to close.
|
|
32
|
+
- **Inline mode** (`inline`): uses `grid-template-rows: 0fr → 1fr` transition inside the host — no portal, no backdrop.
|
|
33
|
+
- `SPRING_SNAPPY` physics for indicator rotation.
|
|
34
|
+
- Respects `prefers-reduced-motion`.
|
|
35
|
+
- Broadcast event `SCHMANCY_EXPAND_REQUEST_CLOSE` on `window` closes whichever instance is currently open.
|
|
36
|
+
|
|
37
|
+
## Example — inline accordion
|
|
38
|
+
```html
|
|
39
|
+
${repeat(this.faqs, faq => faq.id, faq => html`
|
|
40
|
+
<schmancy-expand inline .summary=${faq.question}>
|
|
41
|
+
<p>${faq.answer}</p>
|
|
42
|
+
</schmancy-expand>
|
|
43
|
+
`)}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Example — portal with custom summary slot
|
|
47
|
+
```html
|
|
48
|
+
<schmancy-expand>
|
|
49
|
+
<div slot="summary" class="flex items-center gap-2">
|
|
50
|
+
<schmancy-icon>info</schmancy-icon>
|
|
51
|
+
<schmancy-typography type="title">Advanced options</schmancy-typography>
|
|
52
|
+
</div>
|
|
53
|
+
<div class="p-4">
|
|
54
|
+
<!-- settings form -->
|
|
55
|
+
</div>
|
|
56
|
+
</schmancy-expand>
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Programmatic Close
|
|
60
|
+
```typescript
|
|
61
|
+
import { SCHMANCY_EXPAND_REQUEST_CLOSE } from '@mhmo91/schmancy'
|
|
62
|
+
window.dispatchEvent(new Event(SCHMANCY_EXPAND_REQUEST_CLOSE))
|
|
63
|
+
```
|
package/dist/ai/extra.md
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Schmancy Extra
|
|
2
|
+
|
|
3
|
+
> Data-driven dropdowns for common localization fields. Country and timezone pickers, form-associated and autocomplete-backed.
|
|
4
|
+
|
|
5
|
+
## schmancy-select-countries
|
|
6
|
+
Fully autocomplete-searchable country dropdown. Form-associated (participates in `<form>` submission and validation via `ElementInternals`).
|
|
7
|
+
|
|
8
|
+
```html
|
|
9
|
+
<schmancy-select-countries
|
|
10
|
+
name="country"
|
|
11
|
+
label="Country"
|
|
12
|
+
placeholder="Select a country"
|
|
13
|
+
required
|
|
14
|
+
value="DE"
|
|
15
|
+
@change=${e => this.country = e.target.value}
|
|
16
|
+
></schmancy-select-countries>
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
| Property | Type | Default | Description |
|
|
20
|
+
|----------|------|---------|-------------|
|
|
21
|
+
| `value` | string | — | ISO country code (reflected) |
|
|
22
|
+
| `name` | string | `''` | Form field name |
|
|
23
|
+
| `label` | string | `'Country'` | Visible label |
|
|
24
|
+
| `hint` | string | `'Please select a country'` | Helper text |
|
|
25
|
+
| `placeholder` | string | `'Select a country'` | Placeholder in the input |
|
|
26
|
+
| `required` | boolean | `false` | Validation constraint |
|
|
27
|
+
|
|
28
|
+
## schmancy-select-timezones
|
|
29
|
+
Same pattern as countries, backed by timezone data.
|
|
30
|
+
|
|
31
|
+
```html
|
|
32
|
+
<schmancy-select-timezones
|
|
33
|
+
name="timezone"
|
|
34
|
+
label="Timezone"
|
|
35
|
+
value="Europe/Berlin"
|
|
36
|
+
></schmancy-select-timezones>
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Accepts the same set of properties (`value`, `name`, `label`, `hint`, `placeholder`, `required`).
|
|
40
|
+
|
|
41
|
+
## Raw Data Exports
|
|
42
|
+
If you want the underlying data without the component:
|
|
43
|
+
```typescript
|
|
44
|
+
import countries from '@mhmo91/schmancy' // default export from countries.data
|
|
45
|
+
import timezones from '@mhmo91/schmancy' // default export from timezones.data
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Each countries row: `{ code, name, dialCode?, flag?, ... }`. Timezones: `{ name, offset, label, ... }`.
|
|
49
|
+
|
|
50
|
+
## Form Integration
|
|
51
|
+
Both use `formAssociated = true` and register with the parent `<form>`. Works with native `form.checkValidity()` and with [`schmancy-form`](./form.md).
|
|
52
|
+
|
|
53
|
+
```html
|
|
54
|
+
<schmancy-form @submit=${this.onSubmit}>
|
|
55
|
+
<schmancy-select-countries name="country" required></schmancy-select-countries>
|
|
56
|
+
<schmancy-select-timezones name="timezone" required></schmancy-select-timezones>
|
|
57
|
+
<schmancy-button type="submit" variant="filled">Save</schmancy-button>
|
|
58
|
+
</schmancy-form>
|
|
59
|
+
```
|
package/dist/ai/float.md
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# schmancy-float (deprecated alias)
|
|
2
|
+
|
|
3
|
+
> Backward-compatibility alias for [`schmancy-window`](./window.md). Existing code keeps working — new code should use `schmancy-window` directly.
|
|
4
|
+
|
|
5
|
+
## Migration
|
|
6
|
+
```html
|
|
7
|
+
<!-- Before -->
|
|
8
|
+
<schmancy-float id="panel">…</schmancy-float>
|
|
9
|
+
|
|
10
|
+
<!-- After -->
|
|
11
|
+
<schmancy-window id="panel">…</schmancy-window>
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
All properties are identical. See [window.md](./window.md) for full API.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# schmancy-iframe
|
|
2
|
+
|
|
3
|
+
> Sandboxed iframe that auto-sizes to its content. Ships with sensible document resets (font, spacing, tables, pre, blockquote).
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
```html
|
|
7
|
+
<schmancy-iframe .html=${emailBodyHtml}></schmancy-iframe>
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
## Properties
|
|
11
|
+
| Property | Type | Default | Description |
|
|
12
|
+
|----------|------|---------|-------------|
|
|
13
|
+
| `html` | string | `''` | Body HTML fragment to render |
|
|
14
|
+
| `css` | string | `''` | Extra CSS injected after `baseCss` |
|
|
15
|
+
| `baseCss` | string | default reset | Document CSS — override for fully custom styling |
|
|
16
|
+
| `sandbox` | string | `'allow-same-origin allow-popups'` | Iframe sandbox attribute |
|
|
17
|
+
| `minHeight` | number | `60` | Minimum iframe height in px |
|
|
18
|
+
|
|
19
|
+
## Events
|
|
20
|
+
| Event | When |
|
|
21
|
+
|-------|------|
|
|
22
|
+
| `load` | Native iframe load; height auto-syncs after |
|
|
23
|
+
|
|
24
|
+
## Default Resets
|
|
25
|
+
The built-in `baseCss` applies: system font, 14px/1.6 line-height, reset margins for headings/lists/paragraphs, bordered tables, blockquote styling, code/pre backgrounds, responsive images.
|
|
26
|
+
|
|
27
|
+
## Examples
|
|
28
|
+
```html
|
|
29
|
+
<!-- Email preview with extra styles -->
|
|
30
|
+
<schmancy-iframe
|
|
31
|
+
.html=${this.email.bodyHtml}
|
|
32
|
+
.css=${`h1 { color: #6200ee; }`}
|
|
33
|
+
></schmancy-iframe>
|
|
34
|
+
|
|
35
|
+
<!-- Fully custom base styling -->
|
|
36
|
+
<schmancy-iframe
|
|
37
|
+
.html=${fragment}
|
|
38
|
+
.baseCss=${'html,body{margin:0;background:#000;color:#fff}'}
|
|
39
|
+
></schmancy-iframe>
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## When to Use
|
|
43
|
+
- Rendering untrusted / styled third-party HTML (emails, rich snippets, MD-rendered content) in isolation.
|
|
44
|
+
- Preview panes for user-generated HTML.
|
package/dist/ai/json.md
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# schmancy-json
|
|
2
|
+
|
|
3
|
+
> Pretty-printed JSON viewer with key highlighting and click-to-copy.
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
```html
|
|
7
|
+
<schmancy-json .data=${{ user: 'alice', score: 42 }}></schmancy-json>
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
## Properties
|
|
11
|
+
| Property | Type | Default | Description |
|
|
12
|
+
|----------|------|---------|-------------|
|
|
13
|
+
| `data` | object | `{}` | JSON-serialisable data to display |
|
|
14
|
+
| `highlightKeys` | string[] | `[]` | Keys whose values are highlighted (warning color, bold) |
|
|
15
|
+
| `compact` | boolean | `false` | Disable pretty-printing (single line) |
|
|
16
|
+
|
|
17
|
+
## Behavior
|
|
18
|
+
- Click anywhere on the viewer to copy the full JSON to clipboard (fires `$notify.success`).
|
|
19
|
+
- Container uses `surface-container` glass background with hover state.
|
|
20
|
+
- Monospace font, 10px size — optimized for dense debug output.
|
|
21
|
+
- Values for `highlightKeys` render inside `<span class="text-warning-default font-bold">`.
|
|
22
|
+
|
|
23
|
+
## Examples
|
|
24
|
+
```html
|
|
25
|
+
<!-- Debug view with key highlights -->
|
|
26
|
+
<schmancy-json
|
|
27
|
+
.data=${this.state}
|
|
28
|
+
.highlightKeys=${['error', 'pending']}
|
|
29
|
+
></schmancy-json>
|
|
30
|
+
|
|
31
|
+
<!-- Compact inline -->
|
|
32
|
+
<schmancy-json compact .data=${{ id: 42, status: 'ok' }}></schmancy-json>
|
|
33
|
+
```
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# Schmancy Layout
|
|
2
|
+
|
|
3
|
+
> Layout primitives: `schmancy-grid`, `schmancy-flex`, `schmancy-scroll`, plus `sch-grid` / `sch-flex` v2 variants.
|
|
4
|
+
|
|
5
|
+
> **Prefer Tailwind classes directly** for layout in new code. These components exist for quick composition and design-token consistency (`gap="sm|md|lg"` maps to theme spacing).
|
|
6
|
+
|
|
7
|
+
## schmancy-grid
|
|
8
|
+
```html
|
|
9
|
+
<schmancy-grid cols="1fr 2fr 1fr" gap="md" align="center">
|
|
10
|
+
<div>Left</div><div>Center</div><div>Right</div>
|
|
11
|
+
</schmancy-grid>
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
| Property | Type | Default | Description |
|
|
15
|
+
|----------|------|---------|-------------|
|
|
16
|
+
| `flow` | `'row' \| 'col' \| 'dense' \| 'row-dense' \| 'col-dense'` | `'row'` | Grid auto-flow |
|
|
17
|
+
| `align` | `'start' \| 'center' \| 'end' \| 'stretch' \| 'baseline'` | `'stretch'` | Item alignment |
|
|
18
|
+
| `justify` | `'start' \| 'center' \| 'end' \| 'stretch'` | `'stretch'` | Item justification |
|
|
19
|
+
| `content` | `'start' \| 'center' \| 'end' \| 'stretch' \| 'around' \| 'evenly' \| 'between'` | — | Align-content |
|
|
20
|
+
| `gap` | `'none' \| 'xs' \| 'sm' \| 'md' \| 'lg'` | `'none'` | Grid gap |
|
|
21
|
+
| `cols` | string | — | grid-template-columns (e.g. `"1fr 2fr"`) |
|
|
22
|
+
| `rows` | string | — | grid-template-rows |
|
|
23
|
+
| `rcols` | object | — | Responsive cols: `{ sm: '1fr', md: '1fr 1fr', lg: '1fr 2fr 1fr' }` |
|
|
24
|
+
| `wrap` | boolean | `false` | Grid auto-wrap |
|
|
25
|
+
|
|
26
|
+
## schmancy-flex
|
|
27
|
+
```html
|
|
28
|
+
<schmancy-flex flow="row" justify="between" align="center" gap="md">
|
|
29
|
+
<div>Logo</div><div>Nav</div>
|
|
30
|
+
</schmancy-flex>
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
| Property | Type | Default |
|
|
34
|
+
|----------|------|---------|
|
|
35
|
+
| `flow` | `'row' \| 'row-reverse' \| 'col' \| 'col-reverse'` | `'col'` |
|
|
36
|
+
| `wrap` | `'wrap' \| 'nowrap' \| 'wrap-reverse'` | `'wrap'` |
|
|
37
|
+
| `align` | `'start' \| 'center' \| 'end' \| 'stretch' \| 'baseline'` | `'start'` |
|
|
38
|
+
| `justify` | `'start' \| 'center' \| 'end' \| 'stretch' \| 'between'` | `'start'` |
|
|
39
|
+
| `gap` | `'none' \| 'sm' \| 'md' \| 'lg'` | `'none'` |
|
|
40
|
+
|
|
41
|
+
## schmancy-scroll
|
|
42
|
+
```html
|
|
43
|
+
<schmancy-scroll hide direction="vertical" name="main">
|
|
44
|
+
<!-- long content -->
|
|
45
|
+
</schmancy-scroll>
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
| Property | Type | Default | Description |
|
|
49
|
+
|----------|------|---------|-------------|
|
|
50
|
+
| `hide` | boolean | `false` | Hide scrollbar in supported browsers |
|
|
51
|
+
| `direction` | `'vertical' \| 'horizontal' \| 'both'` | `'both'` | Scroll axes |
|
|
52
|
+
| `name` | string | — | Identifier for global scroll events |
|
|
53
|
+
| `debounce` | number | — | Debounce time in ms for scroll events |
|
|
54
|
+
|
|
55
|
+
Smooth scroll-behavior, overscroll containment, and support for flex-shrink sizing.
|
|
56
|
+
|
|
57
|
+
## sch-grid / sch-flex (v2)
|
|
58
|
+
|
|
59
|
+
Reflected-attribute variants optimized for styling via CSS selectors. Same prop model as the classic components with a `sch-` prefix. Use when you need to target the layout from parent CSS without Tailwind.
|
|
60
|
+
|
|
61
|
+
## Notes
|
|
62
|
+
- All layout components extend the base `Layout` class which exposes pass-through CSS properties (padding, margin, width, position, border, etc.).
|
|
63
|
+
- Prefer Tailwind (`class="flex items-center gap-2"`) for new code — these components remain for consistent theme-driven gaps and rapid prototyping.
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# Schmancy Mailbox
|
|
2
|
+
|
|
3
|
+
> Full email composition + campaign management system. Orchestrates recipients, templates, editor, attachments, and preview.
|
|
4
|
+
|
|
5
|
+
## Components
|
|
6
|
+
|
|
7
|
+
| Tag | Purpose |
|
|
8
|
+
|-----|---------|
|
|
9
|
+
| `schmancy-mailbox` | Top-level orchestrator |
|
|
10
|
+
| `schmancy-email-editor` | Subject + body composition |
|
|
11
|
+
| `schmancy-email-viewer` | HTML/plaintext preview |
|
|
12
|
+
| `schmancy-email-recipients` | Recipient list with import/CSV |
|
|
13
|
+
| `schmancy-email-layout-selector` | Layout template picker |
|
|
14
|
+
| `schmancy-email-template-picker` | Email template browser |
|
|
15
|
+
|
|
16
|
+
## Usage
|
|
17
|
+
```html
|
|
18
|
+
<schmancy-mailbox
|
|
19
|
+
.config=${{
|
|
20
|
+
sendEndpoint: '/api/emails/send',
|
|
21
|
+
uploadEndpoint: '/api/uploads',
|
|
22
|
+
authenticateRequest: (req) => ({ ...req, headers: { Authorization: `Bearer ${token}` } })
|
|
23
|
+
}}
|
|
24
|
+
.templates=${myTemplates}
|
|
25
|
+
.importSources=${[
|
|
26
|
+
{ id: 'ticketholders', label: 'Ticket holders', icon: 'confirmation_number', handler: loadTicketHolders },
|
|
27
|
+
{ id: 'waitlist', label: 'Waitlist', icon: 'hourglass_empty', handler: loadWaitlist },
|
|
28
|
+
]}
|
|
29
|
+
></schmancy-mailbox>
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## schmancy-mailbox Properties
|
|
33
|
+
| Property | Type | Default | Description |
|
|
34
|
+
|----------|------|---------|-------------|
|
|
35
|
+
| `config` | `EmailComposeConfig` | `{}` | Endpoints, auth, upload handlers |
|
|
36
|
+
| `templates` | `EmailTemplate[]` | `[]` | Available email templates |
|
|
37
|
+
| `importSources` | `ImportSource[]` | `[]` | Import buttons shown in recipients panel |
|
|
38
|
+
| `disabled` | boolean | `false` | Disable all interactions |
|
|
39
|
+
| `recipientsTitle` | string | `'Recipients'` | Recipients panel heading |
|
|
40
|
+
| `recipientsEmptyTitle` | string | `'No recipients yet'` | Empty state title |
|
|
41
|
+
| `recipientsEmptyMessage` | string | `'Import from sources or upload a CSV'` | Empty state body |
|
|
42
|
+
| `enableCsvImport` | boolean | `true` | Allow CSV file import |
|
|
43
|
+
| `enableDragDrop` | boolean | `true` | Accept dropped CSV files |
|
|
44
|
+
|
|
45
|
+
## Key Types
|
|
46
|
+
```typescript
|
|
47
|
+
interface EmailTemplate { id, name, subject, body, category?, thumbnail? }
|
|
48
|
+
|
|
49
|
+
interface EmailComposeConfig {
|
|
50
|
+
sendEndpoint?: string
|
|
51
|
+
templatesEndpoint?: string
|
|
52
|
+
uploadEndpoint?: string
|
|
53
|
+
authenticateRequest?: (req: RequestInit) => RequestInit
|
|
54
|
+
uploadHandler?: (file: File) => Promise<string>
|
|
55
|
+
imageUploadHandler?: (file: File) => Promise<string>
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
interface SendEmailRequest {
|
|
59
|
+
recipients: string[]
|
|
60
|
+
subject: string
|
|
61
|
+
body: string
|
|
62
|
+
attachments: EmailAttachment[]
|
|
63
|
+
templateId?: string | null
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
interface ImportSource {
|
|
67
|
+
id: string
|
|
68
|
+
label: string
|
|
69
|
+
icon: string // Material icon name
|
|
70
|
+
handler: () => void // Populates recipients via events
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Events
|
|
75
|
+
| Event | Detail | Where |
|
|
76
|
+
|-------|--------|-------|
|
|
77
|
+
| `emails-imported` | `{ emails, source }` | Recipients |
|
|
78
|
+
| `recipient-removed` | `{ email }` | Recipients |
|
|
79
|
+
| `recipients-cleared` | `{}` | Recipients |
|
|
80
|
+
| `selection-changed` | `{ selectedEmails }` | Recipients |
|
|
81
|
+
| `compose-changed` | `{ subject, body, templateId, attachments }` | Editor |
|
|
82
|
+
| `send-email` | `{ request: SendEmailRequest }` | Mailbox — consumer POSTs to backend |
|
|
83
|
+
| `send-error` | `{ error }` | Mailbox |
|
|
84
|
+
|
|
85
|
+
## Recipients Flow
|
|
86
|
+
1. User clicks an `ImportSource` button (or drops a CSV).
|
|
87
|
+
2. CSV is parsed → `validEmails`, `invalidEmails`, `duplicates` reported.
|
|
88
|
+
3. `emails-imported` event fires; mailbox merges into selected recipients.
|
|
89
|
+
4. User edits subject/body via email-editor; changes bubble as `compose-changed`.
|
|
90
|
+
5. On send, `send-email` fires with the full `SendEmailRequest` — parent handles network.
|
|
91
|
+
|
|
92
|
+
## Minimal Integration
|
|
93
|
+
```typescript
|
|
94
|
+
<schmancy-mailbox
|
|
95
|
+
.config=${config}
|
|
96
|
+
.templates=${templates}
|
|
97
|
+
@send-email=${async (e: CustomEvent<{ request: SendEmailRequest }>) => {
|
|
98
|
+
const result = await api.sendCampaign(e.detail.request)
|
|
99
|
+
if (!result.success) this.dispatchError(result.message)
|
|
100
|
+
}}
|
|
101
|
+
></schmancy-mailbox>
|
|
102
|
+
```
|