@mhmo91/schmancy 0.9.2 → 0.9.3
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 +321 -0
- package/ai/area.md +194 -40
- 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 +169 -38
- 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 +158 -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 +321 -0
- package/dist/ai/area.md +194 -40
- 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 +169 -38
- 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 +158 -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-CC8fUnra.js} +2 -2
- package/dist/{area-DbBcfm5p.js.map → area-CC8fUnra.js.map} +1 -1
- package/dist/{area-1h9xEpTc.cjs → area-wnWUAHEn.cjs} +1 -1
- package/dist/{area-1h9xEpTc.cjs.map → area-wnWUAHEn.cjs.map} +1 -1
- package/dist/area.cjs +1 -1
- package/dist/area.js +1 -1
- package/dist/{autocomplete-OE70CcYP.cjs → autocomplete-B2Z3WK_7.cjs} +1 -1
- package/dist/{autocomplete-OE70CcYP.cjs.map → autocomplete-B2Z3WK_7.cjs.map} +1 -1
- package/dist/{autocomplete-DDVsegep.js → autocomplete-CJ7YgtKN.js} +3 -3
- package/dist/{autocomplete-DDVsegep.js.map → autocomplete-CJ7YgtKN.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-Cf1oJ0ka.cjs → boat-B57_4TzJ.cjs} +1 -1
- package/dist/{boat-Cf1oJ0ka.cjs.map → boat-B57_4TzJ.cjs.map} +1 -1
- package/dist/{boat-T8Ov4-yA.js → boat-C9eU6NO-.js} +2 -2
- package/dist/{boat-T8Ov4-yA.js.map → boat-C9eU6NO-.js.map} +1 -1
- package/dist/boat.cjs +1 -1
- package/dist/boat.js +1 -1
- package/dist/{busy-DF9wztWL.cjs → busy--6oimtop.cjs} +1 -1
- package/dist/{busy-DF9wztWL.cjs.map → busy--6oimtop.cjs.map} +1 -1
- package/dist/{busy-BD6D5P-l.js → busy-CGZXy0h-.js} +1 -1
- package/dist/{busy-BD6D5P-l.js.map → busy-CGZXy0h-.js.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-BGJ0Hb1O.cjs} +1 -1
- package/dist/{card-Csvu8UJ9.cjs.map → card-BGJ0Hb1O.cjs.map} +1 -1
- package/dist/{card-DM_miKMd.js → card-C-ee-l5O.js} +1 -1
- package/dist/{card-DM_miKMd.js.map → card-C-ee-l5O.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-DuYaKoDZ.cjs} +1 -1
- package/dist/{checkbox-sJujc_ga.cjs.map → checkbox-DuYaKoDZ.cjs.map} +1 -1
- package/dist/{checkbox-BgGtMaMR.js → checkbox-FRcorDrD.js} +1 -1
- package/dist/{checkbox-BgGtMaMR.js.map → checkbox-FRcorDrD.js.map} +1 -1
- package/dist/checkbox.cjs +1 -1
- package/dist/checkbox.js +1 -1
- package/dist/{chips-D_e6wijp.cjs → chips-BpA0A-qr.cjs} +1 -1
- package/dist/{chips-D_e6wijp.cjs.map → chips-BpA0A-qr.cjs.map} +1 -1
- package/dist/{chips-BZaH4wez.js → chips-CyzNbKJD.js} +3 -3
- package/dist/{chips-BZaH4wez.js.map → chips-CyzNbKJD.js.map} +1 -1
- package/dist/chips.cjs +1 -1
- package/dist/chips.js +2 -2
- package/dist/{code-highlight-Q3cc6ukq.js → code-highlight-C7O9ltXm.js} +1 -1
- package/dist/{code-highlight-Q3cc6ukq.js.map → code-highlight-C7O9ltXm.js.map} +1 -1
- package/dist/{code-highlight-DlhERv_O.cjs → code-highlight-DsBdSQBG.cjs} +1 -1
- package/dist/{code-highlight-DlhERv_O.cjs.map → code-highlight-DsBdSQBG.cjs.map} +1 -1
- package/dist/code-highlight.cjs +1 -1
- package/dist/code-highlight.js +1 -1
- package/dist/{components-CRhkB3V2.js → components-CkMvOiTR.js} +2 -2
- package/dist/{components-CRhkB3V2.js.map → components-CkMvOiTR.js.map} +1 -1
- package/dist/{components-DnlEYYDs.cjs → components-dDI3xeIf.cjs} +1 -1
- package/dist/{components-DnlEYYDs.cjs.map → components-dDI3xeIf.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-cymbTDnl.cjs → date-range-70zhLUKE.cjs} +1 -1
- package/dist/{date-range-cymbTDnl.cjs.map → date-range-70zhLUKE.cjs.map} +1 -1
- package/dist/{date-range-C0IYnvHF.js → date-range-BrN_Bs6_.js} +3 -3
- package/dist/{date-range-C0IYnvHF.js.map → date-range-BrN_Bs6_.js.map} +1 -1
- package/dist/{date-range-inline-Cfwt-ReH.cjs → date-range-inline-CPzD-tIv.cjs} +1 -1
- package/dist/{date-range-inline-Cfwt-ReH.cjs.map → date-range-inline-CPzD-tIv.cjs.map} +1 -1
- package/dist/{date-range-inline-0ENN4Plz.js → date-range-inline-Cp294DxR.js} +1 -1
- package/dist/{date-range-inline-0ENN4Plz.js.map → date-range-inline-Cp294DxR.js.map} +1 -1
- package/dist/date-range-inline.cjs +1 -1
- package/dist/date-range-inline.js +1 -1
- package/dist/date-range.cjs +1 -1
- package/dist/date-range.js +1 -1
- package/dist/{delay-D6mQLUp-.cjs → delay-COcAkBqB.cjs} +1 -1
- package/dist/{delay-D6mQLUp-.cjs.map → delay-COcAkBqB.cjs.map} +1 -1
- package/dist/{delay-D1dVP93u.js → delay-IV0Swce2.js} +3 -3
- package/dist/{delay-D1dVP93u.js.map → delay-IV0Swce2.js.map} +1 -1
- package/dist/delay.cjs +1 -1
- package/dist/delay.js +1 -1
- package/dist/{details-Cv4OOrVW.js → details-CuKmr3Qw.js} +2 -2
- package/dist/{details-Cv4OOrVW.js.map → details-CuKmr3Qw.js.map} +1 -1
- package/dist/{details-CPT_Mi4e.cjs → details-DgWkPqmt.cjs} +1 -1
- package/dist/{details-CPT_Mi4e.cjs.map → details-DgWkPqmt.cjs.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/{divider-DDC-kND3.js → divider-BWoUbfgZ.js} +2 -2
- package/dist/{divider-DDC-kND3.js.map → divider-BWoUbfgZ.js.map} +1 -1
- package/dist/{divider-nZ_2to2N.cjs → divider-BghtrMbn.cjs} +1 -1
- package/dist/{divider-nZ_2to2N.cjs.map → divider-BghtrMbn.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-Bp3N8CcL.js → expand-CJU9m4ga.js} +3 -3
- package/dist/{expand-Bp3N8CcL.js.map → expand-CJU9m4ga.js.map} +1 -1
- package/dist/{expand-Crdts9q_.cjs → expand-XyDE5SsO.cjs} +1 -1
- package/dist/{expand-Crdts9q_.cjs.map → expand-XyDE5SsO.cjs.map} +1 -1
- package/dist/expand.cjs +1 -1
- package/dist/expand.js +1 -1
- package/dist/{extra-DupwhQhC.js → extra-BxXFmW1w.js} +2 -2
- package/dist/{extra-DupwhQhC.js.map → extra-BxXFmW1w.js.map} +1 -1
- package/dist/{extra-B0IZCg0t.cjs → extra-CsrRKKqE.cjs} +1 -1
- package/dist/{extra-B0IZCg0t.cjs.map → extra-CsrRKKqE.cjs.map} +1 -1
- package/dist/extra.cjs +1 -1
- package/dist/extra.js +1 -1
- package/dist/{float-Dqdc1_S5.js → float-BD86t_NU.js} +2 -2
- package/dist/{float-Dqdc1_S5.js.map → float-BD86t_NU.js.map} +1 -1
- package/dist/{float-CQoJ_oSB.cjs → float-DBv1FINW.cjs} +1 -1
- package/dist/{float-CQoJ_oSB.cjs.map → float-DBv1FINW.cjs.map} +1 -1
- package/dist/float.cjs +1 -1
- package/dist/float.js +1 -1
- package/dist/{form-CW5XNuTg.js → form-Cp5-I_ZV.js} +1 -1
- package/dist/{form-CW5XNuTg.js.map → form-Cp5-I_ZV.js.map} +1 -1
- package/dist/{form-CvoLqMY7.cjs → form-D0bIeDWT.cjs} +1 -1
- package/dist/{form-CvoLqMY7.cjs.map → form-D0bIeDWT.cjs.map} +1 -1
- package/dist/form.cjs +1 -1
- package/dist/form.js +1 -1
- package/dist/{icons-Cpfdb7sA.js → icons-BpU0_l92.js} +1 -1
- package/dist/{icons-Cpfdb7sA.js.map → icons-BpU0_l92.js.map} +1 -1
- package/dist/{icons-BLQHEbIk.cjs → icons-D8w_20mO.cjs} +1 -1
- package/dist/{icons-BLQHEbIk.cjs.map → icons-D8w_20mO.cjs.map} +1 -1
- package/dist/icons.cjs +1 -1
- package/dist/icons.js +1 -1
- package/dist/{iframe-sJGXBbxT.cjs → iframe-BjwxA2Pg.cjs} +1 -1
- package/dist/{iframe-sJGXBbxT.cjs.map → iframe-BjwxA2Pg.cjs.map} +1 -1
- package/dist/{iframe-DG6HVYdy.js → iframe-tY1GY5g1.js} +1 -1
- package/dist/{iframe-DG6HVYdy.js.map → iframe-tY1GY5g1.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-BevxycIt.js → input-BnfTpRN9.js} +1 -1
- package/dist/{input-BevxycIt.js.map → input-BnfTpRN9.js.map} +1 -1
- package/dist/{input-DGTdmp1Q.cjs → input-BwxwognS.cjs} +1 -1
- package/dist/{input-DGTdmp1Q.cjs.map → input-BwxwognS.cjs.map} +1 -1
- package/dist/{input-chip-BWS-SFU4.js → input-chip-CkM2aYmO.js} +1 -1
- package/dist/{input-chip-BWS-SFU4.js.map → input-chip-CkM2aYmO.js.map} +1 -1
- package/dist/{input-chip-CKVtjInb.cjs → input-chip-MjOwX5EY.cjs} +1 -1
- package/dist/{input-chip-CKVtjInb.cjs.map → input-chip-MjOwX5EY.cjs.map} +1 -1
- package/dist/input.cjs +1 -1
- package/dist/input.js +1 -1
- package/dist/json.cjs +1 -1
- package/dist/json.js +2 -2
- package/dist/{layout-CQdd8UCr.cjs → layout-BV0EeyUS.cjs} +1 -1
- package/dist/{layout-CQdd8UCr.cjs.map → layout-BV0EeyUS.cjs.map} +1 -1
- package/dist/{layout-DxLjlDfr.js → layout-CJSlZlFL.js} +2 -2
- package/dist/{layout-DxLjlDfr.js.map → layout-CJSlZlFL.js.map} +1 -1
- package/dist/layout.cjs +1 -1
- package/dist/layout.js +2 -2
- package/dist/{lightbox-C_863_XU.cjs → lightbox-CpNMZHZW.cjs} +1 -1
- package/dist/{lightbox-C_863_XU.cjs.map → lightbox-CpNMZHZW.cjs.map} +1 -1
- package/dist/{lightbox-Bjc55lHH.js → lightbox-groqGmJH.js} +2 -2
- package/dist/{lightbox-Bjc55lHH.js.map → lightbox-groqGmJH.js.map} +1 -1
- package/dist/lightbox.cjs +1 -1
- package/dist/lightbox.js +1 -1
- package/dist/{list-CaXzdN9_.cjs → list-CyHd0Zc2.cjs} +1 -1
- package/dist/{list-CaXzdN9_.cjs.map → list-CyHd0Zc2.cjs.map} +1 -1
- package/dist/{list-BAqhlzZd.js → list-DzkqT_r-.js} +2 -2
- package/dist/{list-BAqhlzZd.js.map → list-DzkqT_r-.js.map} +1 -1
- package/dist/list.cjs +1 -1
- package/dist/list.js +1 -1
- package/dist/{litElement.mixin-DN6X9_wD.cjs → litElement.mixin-BG6_-nYX.cjs} +1 -1
- package/dist/{litElement.mixin-DN6X9_wD.cjs.map → litElement.mixin-BG6_-nYX.cjs.map} +1 -1
- package/dist/{litElement.mixin-Dktub0ri.js → litElement.mixin-Dm-4L8zL.js} +1 -1
- package/dist/{litElement.mixin-Dktub0ri.js.map → litElement.mixin-Dm-4L8zL.js.map} +1 -1
- package/dist/{mailbox-DuMUH4f3.js → mailbox-BcqnXYVP.js} +4 -4
- package/dist/{mailbox-DuMUH4f3.js.map → mailbox-BcqnXYVP.js.map} +1 -1
- package/dist/{mailbox-BvsLXpvy.cjs → mailbox-C5eYTd7p.cjs} +1 -1
- package/dist/{mailbox-BvsLXpvy.cjs.map → mailbox-C5eYTd7p.cjs.map} +1 -1
- package/dist/mailbox.cjs +1 -1
- package/dist/mailbox.js +1 -1
- package/dist/{map-C2Msv9TQ.cjs → map-BncheFt5.cjs} +1 -1
- package/dist/{map-C2Msv9TQ.cjs.map → map-BncheFt5.cjs.map} +1 -1
- package/dist/{map-DkIy1ph7.js → map-C0o1PgLE.js} +1 -1
- package/dist/{map-DkIy1ph7.js.map → map-C0o1PgLE.js.map} +1 -1
- package/dist/map.cjs +1 -1
- package/dist/map.js +1 -1
- package/dist/{menu-DEeDKW5U.js → menu-uwqlQbLd.js} +2 -2
- package/dist/{menu-DEeDKW5U.js.map → menu-uwqlQbLd.js.map} +1 -1
- package/dist/{menu-Mm71lv9k.cjs → menu-yXzwJZFf.cjs} +1 -1
- package/dist/{menu-Mm71lv9k.cjs.map → menu-yXzwJZFf.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-cTgXEDZ0.cjs → notification-BjwTfLAl.cjs} +1 -1
- package/dist/{notification-cTgXEDZ0.cjs.map → notification-BjwTfLAl.cjs.map} +1 -1
- package/dist/{notification-K-ug8cKk.js → notification-DzYT4deA.js} +3 -3
- package/dist/{notification-K-ug8cKk.js.map → notification-DzYT4deA.js.map} +1 -1
- package/dist/notification.cjs +1 -1
- package/dist/notification.js +1 -1
- package/dist/{option-5rEOmtAm.cjs → option-BJsD3u2D.cjs} +1 -1
- package/dist/{option-5rEOmtAm.cjs.map → option-BJsD3u2D.cjs.map} +1 -1
- package/dist/{option-TFSKvSjT.js → option-JFHxgiYl.js} +1 -1
- package/dist/{option-TFSKvSjT.js.map → option-JFHxgiYl.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-Cta3nM-f.js → progress-BUh5WBqx.js} +2 -2
- package/dist/{progress-Cta3nM-f.js.map → progress-BUh5WBqx.js.map} +1 -1
- package/dist/{progress-iu0AMbSg.cjs → progress-BoRmyGAa.cjs} +1 -1
- package/dist/{progress-iu0AMbSg.cjs.map → progress-BoRmyGAa.cjs.map} +1 -1
- package/dist/progress.cjs +1 -1
- package/dist/progress.js +1 -1
- package/dist/{provide-D69zybs5.js → provide-8MrDz_qX.js} +1 -1
- package/dist/{provide-D69zybs5.js.map → provide-8MrDz_qX.js.map} +1 -1
- package/dist/{provide-BEyyKlDM.cjs → provide-CDkxgjHb.cjs} +1 -1
- package/dist/{provide-BEyyKlDM.cjs.map → provide-CDkxgjHb.cjs.map} +1 -1
- package/dist/qr-scanner.cjs +1 -1
- package/dist/qr-scanner.js +2 -2
- package/dist/{radio-group-BjSWmYJC.js → radio-group-DbOWUPhi.js} +1 -1
- package/dist/{radio-group-BjSWmYJC.js.map → radio-group-DbOWUPhi.js.map} +1 -1
- package/dist/{radio-group-DKPN0T50.cjs → radio-group-rhrvhB5X.cjs} +1 -1
- package/dist/{radio-group-DKPN0T50.cjs.map → radio-group-rhrvhB5X.cjs.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-BE9W9PF2.cjs} +1 -1
- package/dist/{scroll-mayaGGpE.cjs.map → scroll-BE9W9PF2.cjs.map} +1 -1
- package/dist/{scroll-tG1vaRFO.js → scroll-qGks1R0k.js} +1 -1
- package/dist/{scroll-tG1vaRFO.js.map → scroll-qGks1R0k.js.map} +1 -1
- package/dist/{select-CepryGGP.js → select-D9sgBRjU.js} +2 -2
- package/dist/{select-CepryGGP.js.map → select-D9sgBRjU.js.map} +1 -1
- package/dist/{select-C4YK5Arj.cjs → select-DXU2kzg4.cjs} +1 -1
- package/dist/{select-C4YK5Arj.cjs.map → select-DXU2kzg4.cjs.map} +1 -1
- package/dist/select.cjs +1 -1
- package/dist/select.js +1 -1
- package/dist/{sheet-D2uT95S1.js → sheet-CIxCCJ3H.js} +4 -4
- package/dist/{sheet-D2uT95S1.js.map → sheet-CIxCCJ3H.js.map} +1 -1
- package/dist/{sheet-Cy4C2-kG.cjs → sheet-CeX6BbNp.cjs} +1 -1
- package/dist/{sheet-Cy4C2-kG.cjs.map → sheet-CeX6BbNp.cjs.map} +1 -1
- package/dist/sheet.cjs +1 -1
- package/dist/sheet.js +2 -2
- package/dist/{sheet.service-Os8KJGSE.js → sheet.service-CAB7weBc.js} +1 -1
- package/dist/{sheet.service-Os8KJGSE.js.map → sheet.service-CAB7weBc.js.map} +1 -1
- package/dist/{sheet.service-Dv5Hwj3k.cjs → sheet.service-DPAp7E3x.cjs} +1 -1
- package/dist/{sheet.service-Dv5Hwj3k.cjs.map → sheet.service-DPAp7E3x.cjs.map} +1 -1
- package/dist/slider.cjs +1 -1
- package/dist/slider.js +2 -2
- package/dist/{src-BLcmKlCH.js → src-CbO5kJ2O.js} +42 -42
- package/dist/{src-BLcmKlCH.js.map → src-CbO5kJ2O.js.map} +1 -1
- package/dist/{src-tfU0akqI.cjs → src-SraDxEeg.cjs} +1 -1
- package/dist/{src-tfU0akqI.cjs.map → src-SraDxEeg.cjs.map} +1 -1
- package/dist/steps.cjs +1 -1
- package/dist/steps.js +3 -3
- package/dist/{surface-CiiIYeJN.cjs → surface-DuH0pm2v.cjs} +1 -1
- package/dist/{surface-CiiIYeJN.cjs.map → surface-DuH0pm2v.cjs.map} +1 -1
- package/dist/{surface-fXvRpS6s.js → surface-eN_Jy2MJ.js} +3 -3
- package/dist/{surface-fXvRpS6s.js.map → surface-eN_Jy2MJ.js.map} +1 -1
- package/dist/surface.cjs +1 -1
- package/dist/surface.js +1 -1
- package/dist/{surface.mixin-C4hbgyaP.cjs → surface.mixin-CIXgN6iw.cjs} +1 -1
- package/dist/{surface.mixin-C4hbgyaP.cjs.map → surface.mixin-CIXgN6iw.cjs.map} +1 -1
- package/dist/{surface.mixin-DBuxL5aL.js → surface.mixin-D9jv1sKG.js} +1 -1
- package/dist/{surface.mixin-DBuxL5aL.js.map → surface.mixin-D9jv1sKG.js.map} +1 -1
- package/dist/{table-BRVKlNjl.cjs → table-C9rRQJEB.cjs} +1 -1
- package/dist/{table-BRVKlNjl.cjs.map → table-C9rRQJEB.cjs.map} +1 -1
- package/dist/{table-BeXnwSsq.js → table-Dg_tUGB_.js} +2 -2
- package/dist/{table-BeXnwSsq.js.map → table-Dg_tUGB_.js.map} +1 -1
- package/dist/table.cjs +1 -1
- package/dist/table.js +1 -1
- package/dist/{tabs-y708NWQ2.js → tabs-BbFC9omR.js} +2 -2
- package/dist/{tabs-y708NWQ2.js.map → tabs-BbFC9omR.js.map} +1 -1
- package/dist/{tabs-CBU9Ctqm.cjs → tabs-soTL-x4G.cjs} +1 -1
- package/dist/{tabs-CBU9Ctqm.cjs.map → tabs-soTL-x4G.cjs.map} +1 -1
- package/dist/tabs.cjs +1 -1
- package/dist/tabs.js +1 -1
- package/dist/tailwind.mixin-BIVhjNvD.js +225 -0
- package/dist/{tailwind.mixin-C4cx3IOr.js.map → tailwind.mixin-BIVhjNvD.js.map} +1 -1
- package/dist/tailwind.mixin-DSuEu-y3.cjs +2 -0
- package/dist/{tailwind.mixin-DGiyLbEi.cjs.map → tailwind.mixin-DSuEu-y3.cjs.map} +1 -1
- package/dist/teleport.cjs +1 -1
- package/dist/teleport.js +1 -1
- package/dist/{textarea-BhAoJg8c.cjs → textarea-DaRUJ0ri.cjs} +1 -1
- package/dist/{textarea-BhAoJg8c.cjs.map → textarea-DaRUJ0ri.cjs.map} +1 -1
- package/dist/{textarea-Bl8-gQEJ.js → textarea-hChvHbNM.js} +1 -1
- package/dist/{textarea-Bl8-gQEJ.js.map → textarea-hChvHbNM.js.map} +1 -1
- package/dist/textarea.cjs +1 -1
- package/dist/textarea.js +1 -1
- package/dist/{theme-DZUpYJn-.js → theme-B0M8Hlyo.js} +3 -3
- package/dist/{theme-DZUpYJn-.js.map → theme-B0M8Hlyo.js.map} +1 -1
- package/dist/{theme-C-vdR-Ic.cjs → theme-ZYH2MqX9.cjs} +1 -1
- package/dist/{theme-C-vdR-Ic.cjs.map → theme-ZYH2MqX9.cjs.map} +1 -1
- package/dist/{theme-button-CwrvpOMK.js → theme-button-BtlX_Zgd.js} +1 -1
- package/dist/{theme-button-CwrvpOMK.js.map → theme-button-BtlX_Zgd.js.map} +1 -1
- package/dist/{theme-button-Cx1iKh7G.cjs → theme-button-Dvqg-rE_.cjs} +1 -1
- package/dist/{theme-button-Cx1iKh7G.cjs.map → theme-button-Dvqg-rE_.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-mxVw5dFn.js → typewriter-CCel8Nta.js} +3 -3
- package/dist/{typewriter-mxVw5dFn.js.map → typewriter-CCel8Nta.js.map} +1 -1
- package/dist/{typewriter-CXQIzqPV.cjs → typewriter-Cf9f2bdx.cjs} +1 -1
- package/dist/{typewriter-CXQIzqPV.cjs.map → typewriter-Cf9f2bdx.cjs.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-DFMlB1Tq.cjs → window-B9_14c12.cjs} +1 -1
- package/dist/{window-DFMlB1Tq.cjs.map → window-B9_14c12.cjs.map} +1 -1
- package/dist/{window-EWYJJC_H.js → window-CbgdwOZD.js} +2 -2
- package/dist/{window-EWYJJC_H.js.map → window-CbgdwOZD.js.map} +1 -1
- package/dist/window.cjs +1 -1
- package/dist/window.js +1 -1
- package/package.json +1 -1
- package/dist/tailwind.mixin-C4cx3IOr.js +0 -225
- package/dist/tailwind.mixin-DGiyLbEi.cjs +0 -2
|
@@ -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. Extracted from funkhaus-events and generalized.
|
|
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
|
+
```
|
package/dist/ai/map.md
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# schmancy-map
|
|
2
|
+
|
|
3
|
+
> Google Maps component. Accepts address string (auto-geocoded) or exact lat/lng. Singleton-loaded Maps SDK.
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
```html
|
|
7
|
+
<!-- By address -->
|
|
8
|
+
<schmancy-map
|
|
9
|
+
address="Times Square, New York"
|
|
10
|
+
api-key="YOUR_GOOGLE_MAPS_KEY"
|
|
11
|
+
></schmancy-map>
|
|
12
|
+
|
|
13
|
+
<!-- By coordinates -->
|
|
14
|
+
<schmancy-map
|
|
15
|
+
.latitude=${40.758}
|
|
16
|
+
.longitude=${-73.985}
|
|
17
|
+
.zoom=${15}
|
|
18
|
+
type="satellite"
|
|
19
|
+
api-key="YOUR_GOOGLE_MAPS_KEY"
|
|
20
|
+
></schmancy-map>
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Properties
|
|
24
|
+
| Property | Type | Default | Description |
|
|
25
|
+
|----------|------|---------|-------------|
|
|
26
|
+
| `address` | string | — | Location for geocoding (e.g. `"Eiffel Tower, Paris"`) |
|
|
27
|
+
| `latitude` | number | — | Precise latitude (takes precedence over address) |
|
|
28
|
+
| `longitude` | number | — | Precise longitude |
|
|
29
|
+
| `zoom` | number | default Maps default | Map zoom level |
|
|
30
|
+
| `type` | `'roadmap' \| 'satellite' \| 'hybrid' \| 'terrain'` | `'roadmap'` | Map style |
|
|
31
|
+
| `height` | string | — | Custom height (e.g. `'400px'`, `'60vh'`) |
|
|
32
|
+
| `apiKey` | string | **required** | Google Maps API key |
|
|
33
|
+
|
|
34
|
+
## Behavior
|
|
35
|
+
- The first `schmancy-map` instance triggers a singleton script load of `maps.googleapis.com/maps/api/js` with the `places` library.
|
|
36
|
+
- Subsequent instances reuse the same loader — no duplicate network requests.
|
|
37
|
+
- If `address` is provided without coordinates, the built-in `Geocoder` resolves it before rendering.
|
|
38
|
+
- Errors (invalid key, unauthorized domain, geocode failure) render a fallback message inside the host.
|
|
39
|
+
|
|
40
|
+
## Setup
|
|
41
|
+
1. Acquire a Google Maps JavaScript API key from Google Cloud Console.
|
|
42
|
+
2. Enable the **Maps JavaScript API** and **Geocoding API**.
|
|
43
|
+
3. Add your domain to the authorized list.
|
|
44
|
+
|
|
45
|
+
## Example
|
|
46
|
+
```html
|
|
47
|
+
<schmancy-surface type="subtle" rounded="all">
|
|
48
|
+
<schmancy-map
|
|
49
|
+
address="1600 Amphitheatre Parkway, Mountain View, CA"
|
|
50
|
+
height="320px"
|
|
51
|
+
type="hybrid"
|
|
52
|
+
.apiKey=${import.meta.env.VITE_GOOGLE_MAPS_KEY}
|
|
53
|
+
></schmancy-map>
|
|
54
|
+
</schmancy-surface>
|
|
55
|
+
```
|
package/dist/ai/mixins.md
CHANGED
|
@@ -1,70 +1,201 @@
|
|
|
1
|
-
#
|
|
1
|
+
# $LitElement — Base Class Foundation
|
|
2
2
|
|
|
3
|
-
>
|
|
3
|
+
> **Every Schmancy component extends `$LitElement`. No exceptions.**
|
|
4
|
+
> It wires RxJS cleanup, Tailwind, cross-shadow discovery, and a few quality-of-life helpers into every element — so you never write that plumbing yourself.
|
|
4
5
|
|
|
5
|
-
##
|
|
6
|
+
## The minimal component
|
|
6
7
|
|
|
7
|
-
|
|
8
|
+
```typescript
|
|
9
|
+
import { $LitElement } from '@mhmo91/schmancy/mixins'
|
|
10
|
+
import { customElement } from 'lit/decorators.js'
|
|
11
|
+
import { css, html } from 'lit'
|
|
12
|
+
|
|
13
|
+
@customElement('my-card')
|
|
14
|
+
class MyCard extends $LitElement(css`
|
|
15
|
+
:host { display: block; }
|
|
16
|
+
`) {
|
|
17
|
+
render() {
|
|
18
|
+
return html`<slot></slot>`
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
That's it. You now get the five things below for free.
|
|
24
|
+
|
|
25
|
+
## What `$LitElement` gives you
|
|
8
26
|
|
|
27
|
+
### 1. `disconnecting` — automatic RxJS cleanup
|
|
9
28
|
```typescript
|
|
10
|
-
|
|
11
|
-
|
|
29
|
+
connectedCallback() {
|
|
30
|
+
super.connectedCallback()
|
|
12
31
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
32
|
+
userContext.$.pipe(
|
|
33
|
+
takeUntil(this.disconnecting),
|
|
34
|
+
).subscribe(user => this.user = user)
|
|
16
35
|
}
|
|
17
36
|
```
|
|
18
37
|
|
|
19
|
-
|
|
38
|
+
`disconnecting` is a `Subject<void>` that emits once when the element is detached from the DOM. Paired with `takeUntil`, it makes the entire Schmancy codebase manual-unsubscribe-free.
|
|
39
|
+
|
|
40
|
+
**This is the single most-used line in a Schmancy app.** If you see an RxJS pipe without `takeUntil(this.disconnecting)` — it's a leak.
|
|
41
|
+
|
|
42
|
+
### 2. `classMap(obj)` — space-splitting enhanced
|
|
43
|
+
```typescript
|
|
44
|
+
render() {
|
|
45
|
+
return html`
|
|
46
|
+
<div class=${this.classMap({
|
|
47
|
+
'flex items-center gap-2': true,
|
|
48
|
+
'bg-primary-default': this.active,
|
|
49
|
+
'opacity-50 pointer-events-none': this.disabled,
|
|
50
|
+
})}>
|
|
51
|
+
…
|
|
52
|
+
</div>
|
|
53
|
+
`
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Unlike standard Lit `classMap`, keys can be **space-separated** ("flex items-center gap-2"). Combined with Tailwind, you write natural class strings instead of one-class-per-key.
|
|
58
|
+
|
|
59
|
+
**Hard rule:** `class=${this.classMap(...)}` must be the *sole* expression in `class=`. You cannot mix it with string interpolation (` class="foo ${this.classMap(...)}"`) — Lit will fail silently.
|
|
60
|
+
|
|
61
|
+
### 3. `styleMap(obj)` — inline styles (passthrough)
|
|
62
|
+
```typescript
|
|
63
|
+
render() {
|
|
64
|
+
return html`
|
|
65
|
+
<div style=${this.styleMap({
|
|
66
|
+
width: `${this.size}px`,
|
|
67
|
+
opacity: this.visible ? 1 : 0,
|
|
68
|
+
})}></div>
|
|
69
|
+
`
|
|
70
|
+
}
|
|
71
|
+
```
|
|
20
72
|
|
|
21
|
-
|
|
22
|
-
RxJS Subject that emits when the component is disconnected. Use with `takeUntil` for automatic cleanup.
|
|
73
|
+
Direct passthrough to Lit's `styleMap` directive, exposed as a method so you don't have to import it in every component.
|
|
23
74
|
|
|
75
|
+
### 4. `discover<T>(tag)` — cross-shadow component lookup
|
|
24
76
|
```typescript
|
|
25
77
|
connectedCallback() {
|
|
26
78
|
super.connectedCallback()
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
79
|
+
|
|
80
|
+
this.discover<SchmancyDialog>('schmancy-dialog').pipe(
|
|
81
|
+
takeUntil(this.disconnecting),
|
|
82
|
+
).subscribe(dialog => dialog?.setDefaultAction('confirm'))
|
|
30
83
|
}
|
|
31
84
|
```
|
|
32
85
|
|
|
33
|
-
|
|
34
|
-
|
|
86
|
+
Broadcasts a `{tag}-where-are-you` event. Any mounted `$LitElement` with that tag responds with itself. Works **across shadow DOM boundaries** — zero traversal.
|
|
87
|
+
|
|
88
|
+
### 5. Auto-response to discovery events
|
|
89
|
+
Every `$LitElement` automatically answers `{its-tag}-where-are-you` by dispatching `{its-tag}-here-i-am` with `{ detail: { component: this } }`. You opt in by extending — opt out by not.
|
|
90
|
+
|
|
91
|
+
## Tailwind support
|
|
92
|
+
|
|
93
|
+
Styles you import are pre-processed through the Schmancy Tailwind pipeline. Tailwind utility classes work in both the host and slotted content. All theme CSS variables (`--schmancy-sys-color-primary-default`, etc.) resolve inside the component's shadow root.
|
|
35
94
|
|
|
36
95
|
```typescript
|
|
37
|
-
//
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
})}
|
|
96
|
+
// Works out of the box
|
|
97
|
+
render() {
|
|
98
|
+
return html`<div class="flex items-center gap-2 text-primary-default">…</div>`
|
|
99
|
+
}
|
|
42
100
|
```
|
|
43
101
|
|
|
44
|
-
|
|
102
|
+
## Extending with SCSS
|
|
45
103
|
|
|
46
|
-
|
|
47
|
-
Direct passthrough to Lit's `styleMap` directive.
|
|
104
|
+
For complex styling, import a `.scss?inline` file and pass it to `$LitElement`:
|
|
48
105
|
|
|
49
106
|
```typescript
|
|
50
|
-
style
|
|
107
|
+
import style from './my-card.scss?inline'
|
|
108
|
+
|
|
109
|
+
@customElement('my-card')
|
|
110
|
+
class MyCard extends $LitElement(style) {
|
|
111
|
+
// SCSS features: nesting, mixins, @layer
|
|
112
|
+
}
|
|
51
113
|
```
|
|
52
114
|
|
|
53
|
-
|
|
54
|
-
|
|
115
|
+
Simple components use template-literal CSS; complex ones use SCSS.
|
|
116
|
+
|
|
117
|
+
## Standard component shape
|
|
118
|
+
|
|
119
|
+
This is the skeleton 90% of Schmancy components follow:
|
|
55
120
|
|
|
56
121
|
```typescript
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
122
|
+
import { $LitElement } from '@mhmo91/schmancy/mixins'
|
|
123
|
+
import { css, html } from 'lit'
|
|
124
|
+
import { customElement, property, state } from 'lit/decorators.js'
|
|
125
|
+
import { Subject, takeUntil } from 'rxjs'
|
|
126
|
+
|
|
127
|
+
@customElement('my-component')
|
|
128
|
+
export class MyComponent extends $LitElement(css`
|
|
129
|
+
:host { display: block; }
|
|
130
|
+
`) {
|
|
131
|
+
// 1. Public API — reflected / typed
|
|
132
|
+
@property({ type: String, reflect: true }) variant: 'a' | 'b' = 'a'
|
|
133
|
+
@property({ type: Boolean, reflect: true }) disabled = false
|
|
134
|
+
|
|
135
|
+
// 2. Internal state
|
|
136
|
+
@state() private _open = false
|
|
137
|
+
|
|
138
|
+
// 3. Private RxJS subjects (if needed)
|
|
139
|
+
private _value$ = new Subject<string>()
|
|
140
|
+
|
|
141
|
+
// 4. Lifecycle
|
|
142
|
+
connectedCallback() {
|
|
143
|
+
super.connectedCallback()
|
|
144
|
+
this._value$.pipe(
|
|
145
|
+
debounceTime(150),
|
|
146
|
+
takeUntil(this.disconnecting),
|
|
147
|
+
).subscribe(v => this.handleValue(v))
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// 5. Rendering
|
|
151
|
+
render() {
|
|
152
|
+
return html`
|
|
153
|
+
<div class=${this.classMap({
|
|
154
|
+
'flex items-center': true,
|
|
155
|
+
'opacity-50': this.disabled,
|
|
156
|
+
})}>
|
|
157
|
+
<slot></slot>
|
|
158
|
+
</div>
|
|
159
|
+
`
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// 6. Public imperative API (if any)
|
|
163
|
+
public open() { this._open = true }
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
declare global {
|
|
167
|
+
interface HTMLElementTagNameMap {
|
|
168
|
+
'my-component': MyComponent
|
|
169
|
+
}
|
|
170
|
+
}
|
|
60
171
|
```
|
|
61
172
|
|
|
62
|
-
|
|
63
|
-
-
|
|
64
|
-
-
|
|
173
|
+
Guarantees from this shape:
|
|
174
|
+
- Every subscription dies with the element.
|
|
175
|
+
- Tailwind + theme tokens work.
|
|
176
|
+
- Component is discoverable from anywhere via `discover('my-component')`.
|
|
177
|
+
- Declared in the global tag map for TypeScript.
|
|
178
|
+
|
|
179
|
+
## Why not `LitElement` directly?
|
|
180
|
+
|
|
181
|
+
You can, but you'll re-implement:
|
|
182
|
+
- Manual unsubscribe handling in `disconnectedCallback` for every `Observable`.
|
|
183
|
+
- `classMap` space-splitting.
|
|
184
|
+
- Tailwind variable wiring.
|
|
185
|
+
- Cross-shadow discovery.
|
|
186
|
+
|
|
187
|
+
`$LitElement` is 200 lines of common-denominator plumbing that keeps apps consistent. Using it is the convention; not using it is the outlier.
|
|
188
|
+
|
|
189
|
+
## Rules
|
|
65
190
|
|
|
66
|
-
|
|
67
|
-
|
|
191
|
+
1. **Every custom element extends `$LitElement(style?)`.**
|
|
192
|
+
2. **Every RxJS subscription ends with `.pipe(takeUntil(this.disconnecting))`** — or you have a leak.
|
|
193
|
+
3. **Call `super.connectedCallback()` and `super.disconnectedCallback()`** when you override them.
|
|
194
|
+
4. **Don't mix `classMap` with string interpolation** in the same attribute.
|
|
195
|
+
5. **Prefer `ref(createRef())` over `querySelector`** for your own shadow tree.
|
|
196
|
+
6. **Register in `HTMLElementTagNameMap`** for TypeScript autocompletion.
|
|
68
197
|
|
|
69
|
-
|
|
70
|
-
|
|
198
|
+
## See also
|
|
199
|
+
- [store](./store.md) — contexts pair with `takeUntil(this.disconnecting)` for auto-cleaning subscriptions.
|
|
200
|
+
- [area](./area.md) — route components all extend `$LitElement`.
|
|
201
|
+
- [discovery](./discovery.md) — the discovery events `$LitElement` handles automatically.
|