@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,43 @@
|
|
|
1
|
+
# schmancy-option
|
|
2
|
+
|
|
3
|
+
> Selectable item for `schmancy-select`, `schmancy-autocomplete`, and `schmancy-menu`. Lightweight and a11y-ready.
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
```html
|
|
7
|
+
<schmancy-select label="Country">
|
|
8
|
+
<schmancy-option value="us">United States</schmancy-option>
|
|
9
|
+
<schmancy-option value="de">Germany</schmancy-option>
|
|
10
|
+
<schmancy-option value="jp" disabled>Japan</schmancy-option>
|
|
11
|
+
</schmancy-select>
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## Properties
|
|
15
|
+
| Property | Type | Default | Description |
|
|
16
|
+
|----------|------|---------|-------------|
|
|
17
|
+
| `value` | string | `''` | Value reported when this option is selected |
|
|
18
|
+
| `label` | string | auto | Display label (falls back to text content) |
|
|
19
|
+
| `selected` | boolean | `false` | Reflects selected state |
|
|
20
|
+
| `disabled` | boolean | `false` | Disables interaction |
|
|
21
|
+
| `group` | string | `''` | Grouping identifier for grouped lists |
|
|
22
|
+
| `icon` | string | `''` | Material icon name before the label |
|
|
23
|
+
|
|
24
|
+
## Events
|
|
25
|
+
| Event | Payload | When |
|
|
26
|
+
|-------|---------|------|
|
|
27
|
+
| `click` | — | Standard click event |
|
|
28
|
+
| `option-select` | `CustomEvent<{ value, label }>` | Dispatched on activation |
|
|
29
|
+
|
|
30
|
+
## Behavior
|
|
31
|
+
- Auto-generates `id` for ARIA wiring if not set.
|
|
32
|
+
- Infers `label` from text content when omitted.
|
|
33
|
+
- Keyboard focusable with a visible focus ring via `:focus-visible`.
|
|
34
|
+
- Parent select/autocomplete coordinates selection state via slot query.
|
|
35
|
+
|
|
36
|
+
## Example — grouped options
|
|
37
|
+
```html
|
|
38
|
+
<schmancy-select label="Framework">
|
|
39
|
+
<schmancy-option value="lit" group="web" icon="bolt">Lit</schmancy-option>
|
|
40
|
+
<schmancy-option value="react" group="web">React</schmancy-option>
|
|
41
|
+
<schmancy-option value="swift" group="mobile">Swift</schmancy-option>
|
|
42
|
+
</schmancy-select>
|
|
43
|
+
```
|
package/dist/ai/page.md
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# schmancy-page
|
|
2
|
+
|
|
3
|
+
> Native mobile-like page container. Fills remaining viewport height, prevents rubber-banding, pull-to-refresh, and double-tap zoom.
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
```html
|
|
7
|
+
<schmancy-page rows="auto_1fr_auto">
|
|
8
|
+
<header>App bar</header>
|
|
9
|
+
<main>Scrollable content</main>
|
|
10
|
+
<footer>Bottom nav</footer>
|
|
11
|
+
</schmancy-page>
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## Properties
|
|
15
|
+
| Property | Type | Default | Description |
|
|
16
|
+
|----------|------|---------|-------------|
|
|
17
|
+
| `rows` | string | `'auto_1fr_auto'` | Grid template rows — underscores become spaces (e.g. `'1fr_2fr_auto'`) |
|
|
18
|
+
| `show-scrollbar` | boolean | `false` | Display scrollbar on scrollable area |
|
|
19
|
+
| `no-select` | boolean | `false` | Disable text selection |
|
|
20
|
+
|
|
21
|
+
## Behavior
|
|
22
|
+
- Listens to `visualViewport` resize/scroll + `orientationchange` + keyboard focus events to recompute height.
|
|
23
|
+
- Accounts for theme bottom offset (iOS safe area, home indicator).
|
|
24
|
+
- Auto-assigns semantic elements (`header`, `main`, `footer`) to slots.
|
|
25
|
+
- Inner scroll area uses `schmancy-scroll` for momentum-preserving scroll.
|
|
26
|
+
|
|
27
|
+
## When to Use
|
|
28
|
+
- Root of a mobile view or panel that should feel like a native page.
|
|
29
|
+
- Any container where viewport-aware height + scroll containment matters.
|
|
30
|
+
|
|
31
|
+
## Example — 3-row app shell
|
|
32
|
+
```html
|
|
33
|
+
<schmancy-page rows="auto_1fr_auto">
|
|
34
|
+
<schmancy-surface type="solid" rounded="none">
|
|
35
|
+
<schmancy-typography type="title">My App</schmancy-typography>
|
|
36
|
+
</schmancy-surface>
|
|
37
|
+
|
|
38
|
+
<div class="p-4">…scrollable content…</div>
|
|
39
|
+
|
|
40
|
+
<schmancy-navigation-bar></schmancy-navigation-bar>
|
|
41
|
+
</schmancy-page>
|
|
42
|
+
```
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# schmancy-qr-scanner
|
|
2
|
+
|
|
3
|
+
> Camera-based QR code scanner using `jsQR`. Requests rear-camera access, decodes frames in real time, deduplicates reads.
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
```html
|
|
7
|
+
<schmancy-qr-scanner
|
|
8
|
+
continuous
|
|
9
|
+
@scan-result=${e => this.handleScan(e.detail.data)}
|
|
10
|
+
></schmancy-qr-scanner>
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
handleScan(data: string) {
|
|
15
|
+
console.log('QR decoded:', data)
|
|
16
|
+
}
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Properties
|
|
20
|
+
| Property | Type | Default | Description |
|
|
21
|
+
|----------|------|---------|-------------|
|
|
22
|
+
| `continuous` | boolean | `true` | Keep scanning after a successful read (dedupe repeated reads) |
|
|
23
|
+
|
|
24
|
+
## Events
|
|
25
|
+
| Event | Detail | When |
|
|
26
|
+
|-------|--------|------|
|
|
27
|
+
| `scan-result` | `{ data: string, timestamp: number }` | QR code successfully decoded |
|
|
28
|
+
|
|
29
|
+
## Behavior
|
|
30
|
+
- Requests `getUserMedia` with `facingMode: 'environment'` (rear camera) at 1280×720.
|
|
31
|
+
- Decodes via `jsQR` on `animationFrames` stream with `throttleTime` to avoid CPU thrashing.
|
|
32
|
+
- `distinctUntilChanged` prevents duplicate emissions for the same code.
|
|
33
|
+
- Brief success flash on each valid read.
|
|
34
|
+
- Stops camera + tears down subscriptions on disconnect.
|
|
35
|
+
- Displays an error state if camera permission is denied.
|
|
36
|
+
|
|
37
|
+
## Requires
|
|
38
|
+
- HTTPS (or `localhost`) for camera access.
|
|
39
|
+
- User permission to the camera.
|
|
40
|
+
|
|
41
|
+
## Example
|
|
42
|
+
```html
|
|
43
|
+
<schmancy-surface type="glass" rounded="all">
|
|
44
|
+
<schmancy-qr-scanner
|
|
45
|
+
@scan-result=${(e: CustomEvent<{ data: string }>) => {
|
|
46
|
+
$notify.success(`Scanned: ${e.detail.data}`)
|
|
47
|
+
this.scannedCode = e.detail.data
|
|
48
|
+
}}
|
|
49
|
+
></schmancy-qr-scanner>
|
|
50
|
+
</schmancy-surface>
|
|
51
|
+
```
|
package/dist/ai/range.md
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# schmancy-range
|
|
2
|
+
|
|
3
|
+
> Numeric slider input with theme-driven track gradient and focus halo.
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
```html
|
|
7
|
+
<schmancy-range
|
|
8
|
+
label="Volume"
|
|
9
|
+
min="0"
|
|
10
|
+
max="100"
|
|
11
|
+
step="1"
|
|
12
|
+
.value=${50}
|
|
13
|
+
@change=${e => this.volume = e.detail.value}
|
|
14
|
+
></schmancy-range>
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Properties
|
|
18
|
+
| Property | Type | Default | Description |
|
|
19
|
+
|----------|------|---------|-------------|
|
|
20
|
+
| `min` | number | `0` | Minimum value |
|
|
21
|
+
| `max` | number | `1` | Maximum value |
|
|
22
|
+
| `step` | number | `0.01` | Increment per tick |
|
|
23
|
+
| `value` | number | `0` | Current value |
|
|
24
|
+
| `label` | string | — | Optional label (current value displays on the right) |
|
|
25
|
+
| `disabled` | boolean | `false` | Disabled state (38% opacity) |
|
|
26
|
+
|
|
27
|
+
## Events
|
|
28
|
+
| Event | Payload | When |
|
|
29
|
+
|-------|---------|------|
|
|
30
|
+
| `change` | `{ value: number }` | On input change |
|
|
31
|
+
|
|
32
|
+
## Visual
|
|
33
|
+
- Primary-colored track gradient (filled portion = primary, empty = 30% primary).
|
|
34
|
+
- Circular thumb with hover halo (8px primary glow at 12% opacity).
|
|
35
|
+
- Disabled state: 38% opacity, not-allowed cursor.
|
|
36
|
+
|
|
37
|
+
## Example — precise float control
|
|
38
|
+
```html
|
|
39
|
+
<schmancy-range
|
|
40
|
+
label="Mass"
|
|
41
|
+
min="0.5"
|
|
42
|
+
max="2.0"
|
|
43
|
+
step="0.05"
|
|
44
|
+
.value=${this.mass}
|
|
45
|
+
@change=${(e: CustomEvent<{ value: number }>) => this.mass = e.detail.value}
|
|
46
|
+
></schmancy-range>
|
|
47
|
+
```
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Schmancy RxJS Utils
|
|
2
|
+
|
|
3
|
+
> RxJS-wrapped DOM observation helpers. Use when you need to react to elements appearing, disappearing, or changing across the document.
|
|
4
|
+
|
|
5
|
+
## Imports
|
|
6
|
+
```typescript
|
|
7
|
+
import {
|
|
8
|
+
mutationObserver,
|
|
9
|
+
waitForElement,
|
|
10
|
+
waitForElementAll,
|
|
11
|
+
waitForElements,
|
|
12
|
+
waitForElementsAll,
|
|
13
|
+
waitUntil,
|
|
14
|
+
} from '@mhmo91/schmancy'
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## `mutationObserver(target, options?)`
|
|
18
|
+
RxJS wrapper around `MutationObserver`.
|
|
19
|
+
```typescript
|
|
20
|
+
mutationObserver(document.body, { childList: true, subtree: true })
|
|
21
|
+
.pipe(takeUntil(this.disconnecting))
|
|
22
|
+
.subscribe(mutations => { /* react */ })
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## `waitForElement(selector, timeout = 5000)`
|
|
26
|
+
Emits the first matching element once it exists in the DOM. Throws on timeout. Pass `undefined` to wait forever.
|
|
27
|
+
```typescript
|
|
28
|
+
waitForElement('#auth-banner').subscribe(el => el.focus())
|
|
29
|
+
waitForElement('.lazy-panel', 10000).subscribe(el => el.click())
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## `waitForElementAll(selector, timeout?)`
|
|
33
|
+
Emits whenever the matching set changes (all current matches).
|
|
34
|
+
```typescript
|
|
35
|
+
waitForElementAll('.live-tile').subscribe(tiles => {
|
|
36
|
+
tiles.forEach(t => observe(t))
|
|
37
|
+
})
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## `waitForElements([sel1, sel2, ...], timeout?)` / `waitForElementsAll`
|
|
41
|
+
Multi-selector variants — resolve once *any*/`every` selector is present.
|
|
42
|
+
|
|
43
|
+
## `waitUntil([selectors], timeout = 5000)`
|
|
44
|
+
Emits once when **all** selectors have matches. Throws on timeout.
|
|
45
|
+
```typescript
|
|
46
|
+
waitUntil(['header', 'main', 'footer'])
|
|
47
|
+
.subscribe(() => console.log('Page shell ready'))
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## How It Works
|
|
51
|
+
All helpers share `mutationObserver(document.body)` with `childList: true, subtree: true` and `.startWith(document.body)` so they check once immediately and re-check on every DOM mutation.
|
|
52
|
+
|
|
53
|
+
## When to Use
|
|
54
|
+
- Integrating third-party scripts that inject DOM late.
|
|
55
|
+
- Coordinating with slot-projected children that may mount asynchronously.
|
|
56
|
+
- Awaiting app-shell elements before attaching shortcuts.
|
|
57
|
+
|
|
58
|
+
## When NOT to Use
|
|
59
|
+
- Inside your own component — use `firstUpdated()` or `queryAssignedElements`.
|
|
60
|
+
- For cross-shadow discovery — use [discovery](./discovery.md) instead.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# schmancy-slider / schmancy-slide
|
|
2
|
+
|
|
3
|
+
> Horizontal snap-scrolling carousel with optional arrow controls.
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
```html
|
|
7
|
+
<schmancy-slider show-arrows>
|
|
8
|
+
<schmancy-slide>
|
|
9
|
+
<img src="a.jpg" />
|
|
10
|
+
</schmancy-slide>
|
|
11
|
+
<schmancy-slide>
|
|
12
|
+
<div class="p-8">Second slide</div>
|
|
13
|
+
</schmancy-slide>
|
|
14
|
+
<schmancy-slide>
|
|
15
|
+
<div class="p-8">Third slide</div>
|
|
16
|
+
</schmancy-slide>
|
|
17
|
+
</schmancy-slider>
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## schmancy-slider Properties
|
|
21
|
+
| Property | Type | Default | Description |
|
|
22
|
+
|----------|------|---------|-------------|
|
|
23
|
+
| `showArrows` | boolean | `true` | Render prev/next navigation buttons |
|
|
24
|
+
|
|
25
|
+
## Events
|
|
26
|
+
| Event | Payload | When |
|
|
27
|
+
|-------|---------|------|
|
|
28
|
+
| `slide-changed` | `{ index: number }` | Centered slide changes after scroll settles |
|
|
29
|
+
|
|
30
|
+
## Behavior
|
|
31
|
+
- Each `schmancy-slide` is sized to `flex: 0 0 100%` of the slider.
|
|
32
|
+
- `scroll-snap-type: x mandatory` — scroll always lands on a slide.
|
|
33
|
+
- Scrollbars hidden across browsers.
|
|
34
|
+
- Scroll events throttled to 100ms for stable index tracking.
|
|
35
|
+
- Arrow buttons scroll to previous/next slide when `show-arrows` is true.
|
|
36
|
+
|
|
37
|
+
## Example — programmatic control
|
|
38
|
+
```typescript
|
|
39
|
+
const slider = this.renderRoot.querySelector('schmancy-slider')
|
|
40
|
+
slider?.addEventListener('slide-changed', (e: CustomEvent<{ index: number }>) => {
|
|
41
|
+
this.activeIndex = e.detail.index
|
|
42
|
+
})
|
|
43
|
+
```
|
package/dist/ai/store.md
CHANGED
|
@@ -1,83 +1,192 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Store — State Foundation
|
|
2
2
|
|
|
3
|
-
>
|
|
3
|
+
> **Not a utility. The state backbone of a Schmancy app.**
|
|
4
|
+
> `createContext` + `@select` replaces Redux, Zustand, and a route-scoped cache without ceremony.
|
|
5
|
+
|
|
6
|
+
A real app runs *many* small contexts — not one monolith. Typical production apps sit around 8–10:
|
|
7
|
+
|
|
8
|
+
```
|
|
9
|
+
userContext ('local') — signed-in user (persists across sessions)
|
|
10
|
+
organizationContext ('local') — current org
|
|
11
|
+
appStateContext ('local') — core app state (lists, selections, flags)
|
|
12
|
+
agentsContext ('memory') — fetched data (re-fetched on reload)
|
|
13
|
+
contactsContext ('memory') — Map<id, Contact> — mass data
|
|
14
|
+
templatesContext ('memory') — list fetched from server
|
|
15
|
+
currentTemplateIdCtx ('local') — small pointer ref that persists
|
|
16
|
+
composeContext ('local') — draft form state
|
|
17
|
+
draftCtx ('session') — per-thread chat input (tab-scoped)
|
|
18
|
+
strictCtx ('session') — per-thread toggles (tab-scoped)
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
**Split by persistence tier + lifetime**, not by feature area. Per-component ephemeral state → `session`. Cached fetches → `memory`. User-saved preferences → `local`. Large cached data → `indexeddb`.
|
|
22
|
+
|
|
23
|
+
## Creating a context
|
|
4
24
|
|
|
5
|
-
## Creating a Context
|
|
6
25
|
```typescript
|
|
7
26
|
import { createContext } from '@mhmo91/schmancy'
|
|
8
27
|
|
|
9
|
-
// Object store
|
|
10
|
-
const userContext = createContext(
|
|
28
|
+
// Object store — persisted to localStorage
|
|
29
|
+
export const userContext = createContext<User>(new User(), 'local', 'user')
|
|
11
30
|
|
|
12
|
-
// Collection store
|
|
13
|
-
const
|
|
31
|
+
// Collection store — Map keyed by id
|
|
32
|
+
export const contactsContext = createContext<Map<string, Contact>>(new Map(), 'memory', 'contacts')
|
|
14
33
|
|
|
15
|
-
// Array store
|
|
16
|
-
const tagsContext = createContext<string>([], 'memory', 'tags')
|
|
34
|
+
// Array store — ordered list
|
|
35
|
+
export const tagsContext = createContext<string[]>([], 'memory', 'tags')
|
|
36
|
+
|
|
37
|
+
// Session-scoped (per browser tab)
|
|
38
|
+
export const draftContext = createContext<{ text: string }>({ text: '' }, 'session', 'compose-draft')
|
|
17
39
|
```
|
|
18
40
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
| `'
|
|
24
|
-
| `'session'` | sessionStorage (per
|
|
25
|
-
| `'
|
|
41
|
+
### Storage tiers
|
|
42
|
+
|
|
43
|
+
| Mode | Backing | Survives refresh? | Survives tab close? | Size |
|
|
44
|
+
|------|---------|-------------------|---------------------|------|
|
|
45
|
+
| `'memory'` | JS heap | ❌ | ❌ | small |
|
|
46
|
+
| `'session'` | `sessionStorage` | ✅ | ❌ (per-tab) | ~5 MB |
|
|
47
|
+
| `'local'` | `localStorage` | ✅ | ✅ | ~5 MB |
|
|
48
|
+
| `'indexeddb'` | IndexedDB | ✅ | ✅ | GB |
|
|
49
|
+
|
|
50
|
+
Rule of thumb:
|
|
51
|
+
- **User session data, prefs, drafts meant to persist** → `'local'`
|
|
52
|
+
- **Per-tab ephemeral data** (wizard progress, per-thread drafts) → `'session'`
|
|
53
|
+
- **Fetched from API, regenerable** → `'memory'`
|
|
54
|
+
- **Large arrays, file-like data, offline-first** → `'indexeddb'`
|
|
55
|
+
|
|
56
|
+
## Reading with `@select`
|
|
26
57
|
|
|
27
|
-
## Reading State with @select
|
|
28
58
|
```typescript
|
|
29
59
|
import { select } from '@mhmo91/schmancy'
|
|
30
60
|
|
|
31
|
-
@customElement('
|
|
32
|
-
class
|
|
33
|
-
// Auto-subscribes
|
|
34
|
-
@select(userContext)
|
|
35
|
-
user!: { name: string; email: string }
|
|
61
|
+
@customElement('user-card')
|
|
62
|
+
class UserCard extends $LitElement() {
|
|
63
|
+
// Auto-subscribes, re-renders on change
|
|
64
|
+
@select(userContext) user!: User
|
|
36
65
|
|
|
37
|
-
//
|
|
38
|
-
@select(
|
|
39
|
-
itemCount!: number
|
|
66
|
+
// Selector function narrows the dependency
|
|
67
|
+
@select(contactsContext, m => m.size) contactCount!: number
|
|
40
68
|
|
|
41
|
-
// Collection as Map
|
|
42
|
-
@select(
|
|
43
|
-
items!: Map<string, Item>
|
|
69
|
+
// Collection → stays as Map
|
|
70
|
+
@select(contactsContext) contacts!: Map<string, Contact>
|
|
44
71
|
}
|
|
45
72
|
```
|
|
46
73
|
|
|
47
|
-
|
|
74
|
+
`@select` options:
|
|
75
|
+
- `required` (default `true`) — wait for context `.ready` before `connectedCallback` completes.
|
|
76
|
+
- `updateOnly` — only call `requestUpdate`, don't assign. Use when you read the value imperatively.
|
|
77
|
+
- `deepClone` — `structuredClone` the value to prevent accidental mutation.
|
|
78
|
+
- `debug` — log every emission.
|
|
79
|
+
|
|
80
|
+
### Pick one item from a collection
|
|
81
|
+
```typescript
|
|
82
|
+
@selectItem(contactsContext, component => component.contactId)
|
|
83
|
+
contact!: Contact | undefined
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Use this on components that carry the key as a property (e.g. `this.contactId`) — avoids reading the whole map.
|
|
87
|
+
|
|
88
|
+
## Writing state
|
|
89
|
+
|
|
90
|
+
### Object store
|
|
48
91
|
```typescript
|
|
49
|
-
// Object store
|
|
50
92
|
userContext.set({ name: 'Alice', email: 'alice@test.com' })
|
|
93
|
+
userContext.set({ ...userContext.value, name: 'Bob' }) // partial update pattern
|
|
94
|
+
```
|
|
51
95
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
96
|
+
### Collection (Map) store
|
|
97
|
+
```typescript
|
|
98
|
+
contactsContext.set('id-1', { id: 'id-1', name: 'Alice' })
|
|
99
|
+
contactsContext.delete('id-1')
|
|
100
|
+
contactsContext.replace(new Map([/* fresh batch */]))
|
|
101
|
+
```
|
|
56
102
|
|
|
57
|
-
|
|
103
|
+
### Array store
|
|
104
|
+
```typescript
|
|
58
105
|
tagsContext.push('new-tag')
|
|
59
106
|
tagsContext.replace(['a', 'b', 'c'])
|
|
60
107
|
```
|
|
61
108
|
|
|
62
109
|
## Observable API
|
|
110
|
+
|
|
63
111
|
```typescript
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
112
|
+
connectedCallback() {
|
|
113
|
+
super.connectedCallback()
|
|
114
|
+
|
|
115
|
+
userContext.$.pipe(
|
|
116
|
+
filter(() => userContext.ready), // gate on initialization
|
|
117
|
+
distinctUntilChanged((a, b) => a.id === b.id), // ignore unrelated writes
|
|
118
|
+
switchMap(user => this.loadForUser(user)), // cascade load
|
|
119
|
+
takeUntil(this.disconnecting), // cleanup
|
|
120
|
+
).subscribe(data => this.data = data)
|
|
121
|
+
}
|
|
122
|
+
```
|
|
68
123
|
|
|
69
|
-
|
|
70
|
-
|
|
124
|
+
- **`ctx.$`** — a `BehaviorSubject`. Use for chained transforms.
|
|
125
|
+
- **`ctx.value`** — synchronous snapshot.
|
|
126
|
+
- **`ctx.ready`** — boolean; becomes `true` after the backing store has loaded.
|
|
71
127
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
```
|
|
128
|
+
### The gating pattern
|
|
129
|
+
Every non-trivial subscription starts with `filter(() => ctx.ready)`. When your context is backed by `indexeddb` or re-hydrated from `localStorage`, the initial default value is emitted before the real stored value lands. Gate on `.ready` to skip the default.
|
|
75
130
|
|
|
76
|
-
##
|
|
77
|
-
|
|
131
|
+
## Dynamic contexts (per-instance)
|
|
132
|
+
|
|
133
|
+
For per-component ephemeral state that still benefits from persistence, instantiate the context **inside** `connectedCallback` with an instance-specific key:
|
|
78
134
|
|
|
79
|
-
## selectItem (Collection Helper)
|
|
80
135
|
```typescript
|
|
81
|
-
|
|
82
|
-
|
|
136
|
+
import { createContext, IStore } from '@mhmo91/schmancy'
|
|
137
|
+
|
|
138
|
+
@customElement('chat-input')
|
|
139
|
+
class ChatInput extends $LitElement() {
|
|
140
|
+
@property() draftKey?: string
|
|
141
|
+
|
|
142
|
+
private draftCtx: IStore<{ text: string }> | null = null
|
|
143
|
+
|
|
144
|
+
connectedCallback() {
|
|
145
|
+
super.connectedCallback()
|
|
146
|
+
|
|
147
|
+
if (this.draftKey) {
|
|
148
|
+
this.draftCtx = createContext<{ text: string }>(
|
|
149
|
+
{ text: '' },
|
|
150
|
+
'session',
|
|
151
|
+
this.draftKey, // e.g. `chat-draft-${threadId}`
|
|
152
|
+
)
|
|
153
|
+
|
|
154
|
+
// Hydrate once
|
|
155
|
+
this.draftCtx.$.pipe(
|
|
156
|
+
filter(() => this.draftCtx!.ready),
|
|
157
|
+
take(1),
|
|
158
|
+
tap(v => { this.text = v.text }),
|
|
159
|
+
).subscribe()
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
private onInput(v: string) {
|
|
164
|
+
this.text = v
|
|
165
|
+
this.draftCtx?.set({ text: v })
|
|
166
|
+
}
|
|
167
|
+
}
|
|
83
168
|
```
|
|
169
|
+
|
|
170
|
+
This is the pattern for *every* "draft that persists until sent" input.
|
|
171
|
+
|
|
172
|
+
## Architectural rules
|
|
173
|
+
|
|
174
|
+
1. **Declare contexts at module scope**, not inside classes — except dynamic per-instance ones.
|
|
175
|
+
2. **Name the storage key** even for `'memory'` contexts — it helps debugging.
|
|
176
|
+
3. **Keep each context small and single-purpose**. 9 small contexts beat 1 god context.
|
|
177
|
+
4. **Subscribe with `takeUntil(this.disconnecting)`** — every time, no exceptions.
|
|
178
|
+
5. **Gate on `.ready`** before any async cascading work.
|
|
179
|
+
6. **Only the owning component writes**. Everyone else reads via `@select`.
|
|
180
|
+
7. **Don't put functions, observables, or class instances into context** — only plain serializable data (for `'local'` / `'session'` / `'indexeddb'`).
|
|
181
|
+
|
|
182
|
+
## Anti-patterns
|
|
183
|
+
|
|
184
|
+
- ❌ Storing Promises in context. Use `memory` contexts for cached fetch *results*, not the in-flight Promise.
|
|
185
|
+
- ❌ Cross-writing: component A writes to context X which is "owned" by component B. Centralize writes.
|
|
186
|
+
- ❌ One monolithic `appContext` holding everything. You lose `distinctUntilChanged` granularity.
|
|
187
|
+
- ❌ Forgetting `.ready` — causes double-fires on load with stale default values.
|
|
188
|
+
- ❌ Using `'local'` for large blobs — hits quota, blocks the main thread on stringify/parse.
|
|
189
|
+
|
|
190
|
+
## See also
|
|
191
|
+
- [mixins](./mixins.md) — `$LitElement` provides `disconnecting` for every subscription.
|
|
192
|
+
- [area](./area.md) — routing + contexts compose naturally (guards read context state).
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# schmancy-teleport
|
|
2
|
+
|
|
3
|
+
> Move DOM between locations with a FLIP-animated transition. Two instances sharing an `id` handshake via broadcast events — when one mounts, it finds the other and flies the content between them.
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
```html
|
|
7
|
+
<!-- Start position -->
|
|
8
|
+
<schmancy-teleport id="hero-image">
|
|
9
|
+
<img src="portrait.jpg" alt="" />
|
|
10
|
+
</schmancy-teleport>
|
|
11
|
+
|
|
12
|
+
<!-- Later, in a different view -->
|
|
13
|
+
<schmancy-teleport id="hero-image"></schmancy-teleport>
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
When the second instance mounts, the image smoothly animates from its old bounding rect to the new one.
|
|
17
|
+
|
|
18
|
+
## Properties
|
|
19
|
+
| Property | Type | Default | Description |
|
|
20
|
+
|----------|------|---------|-------------|
|
|
21
|
+
| `id` | string | **required** | Shared identifier between source and target |
|
|
22
|
+
| `uuid` | number | auto | Instance UUID for disambiguation (read-only) |
|
|
23
|
+
| `delay` | number | `0` | Delay before teleporting (ms) |
|
|
24
|
+
|
|
25
|
+
## Discovery Events
|
|
26
|
+
The service broadcasts on `window`:
|
|
27
|
+
- `FINDING_MORTIES` — "is anyone mounted with id X?"
|
|
28
|
+
- `HERE_RICKY` — instances reply with self reference
|
|
29
|
+
- `WhereAreYouRicky` / `HereMorty` — instance-to-instance handshake
|
|
30
|
+
|
|
31
|
+
Uses RxJS with a race/throwIfEmpty pattern to handle missing counterparts gracefully.
|
|
32
|
+
|
|
33
|
+
## Typical Pattern — route transitions
|
|
34
|
+
```html
|
|
35
|
+
<!-- List view -->
|
|
36
|
+
${repeat(items, item => item.id, item => html`
|
|
37
|
+
<schmancy-teleport id=${`card-${item.id}`}>
|
|
38
|
+
<schmancy-card @click=${() => router.push(`/item/${item.id}`)}>
|
|
39
|
+
<img src=${item.thumbnail} />
|
|
40
|
+
</schmancy-card>
|
|
41
|
+
</schmancy-teleport>
|
|
42
|
+
`)}
|
|
43
|
+
|
|
44
|
+
<!-- Detail view -->
|
|
45
|
+
<schmancy-teleport id=${`card-${this.params.id}`}></schmancy-teleport>
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Notes
|
|
49
|
+
- Uses `watchElementRect` (ResizeObserver + scroll tracking) to keep source/target in sync.
|
|
50
|
+
- Animation uses the FLIP technique: capture first rect, invert on mount, play to final.
|
|
51
|
+
- All subscriptions clean up via `takeUntil(this.disconnecting)`.
|
|
52
|
+
- Each teleport pair must share a unique `id` string.
|
|
53
|
+
|
|
54
|
+
## See Also
|
|
55
|
+
- For programmatic teleportation from JS: import `teleportationService` from `@mhmo91/schmancy/teleport`.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# schmancy-theme-button
|
|
2
|
+
|
|
3
|
+
> Minimal palette-icon button that spins 360° on click. Hook its `click` to toggle/regenerate your theme.
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
```html
|
|
7
|
+
<schmancy-theme-button @click=${() => this.toggleTheme()}></schmancy-theme-button>
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
## Behavior
|
|
11
|
+
- Renders a `schmancy-button` (variant `text`) wrapping a palette `schmancy-icon`.
|
|
12
|
+
- On click: Web Animations API rotates the icon 360° over 300ms.
|
|
13
|
+
- No properties — it's a UI affordance; wire the theme logic via `@click`.
|
|
14
|
+
|
|
15
|
+
## Typical Wiring
|
|
16
|
+
```typescript
|
|
17
|
+
import { theme } from '@mhmo91/schmancy'
|
|
18
|
+
|
|
19
|
+
// Toggle dark/light
|
|
20
|
+
<schmancy-theme-button @click=${() => theme.toggleScheme()}></schmancy-theme-button>
|
|
21
|
+
|
|
22
|
+
// Randomize primary color
|
|
23
|
+
<schmancy-theme-button @click=${() => theme.randomize()}></schmancy-theme-button>
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
See [theme.md](./theme.md) for the full theme service API.
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# schmancy-typewriter
|
|
2
|
+
|
|
3
|
+
> Text-reveal component powered by [TypeIt](https://typeitjs.com). Characters pop in with entrance + wobble physics; custom cursor pulses with drop-shadow glow.
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
```html
|
|
7
|
+
<schmancy-typewriter>
|
|
8
|
+
Hello, world.
|
|
9
|
+
</schmancy-typewriter>
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## Properties
|
|
13
|
+
| Property | Type | Default | Description |
|
|
14
|
+
|----------|------|---------|-------------|
|
|
15
|
+
| `speed` | number | `35` | Ms per character typed |
|
|
16
|
+
| `deleteSpeed` | number | `20` | Ms per character deleted |
|
|
17
|
+
| `delay` | number | `0` | Initial delay before typing (inherited via `delayContext`) |
|
|
18
|
+
| `autoStart` | boolean | `true` | Start typing on connect |
|
|
19
|
+
| `cursorChar` | string | `''` | Character for the cursor (empty = default block cursor) |
|
|
20
|
+
| `once` | boolean | `true` | Only animate once per session (`sessionStorage` hash) |
|
|
21
|
+
| `loop` | boolean | `false` | Loop infinitely (overrides `once`) |
|
|
22
|
+
| `cyclePause` | number | `1500` | Default pause for cycling (ms) |
|
|
23
|
+
|
|
24
|
+
## Behavior
|
|
25
|
+
- **Lazy start** via IntersectionObserver — won't type until visible.
|
|
26
|
+
- **Session caching** — when `once=true`, content hash is stored; subsequent visits skip the animation.
|
|
27
|
+
- **Delay coordination** — consumes `delayContext`, staggering with parent `schmancy-delay`.
|
|
28
|
+
- Character entrance animation: scale 0.3 → 1.1 → 1 with blur-to-focus.
|
|
29
|
+
- Alternating characters get a subtle `wobble` rotation.
|
|
30
|
+
- Cursor pulses with `drop-shadow(0 0 8px currentColor)` glow.
|
|
31
|
+
|
|
32
|
+
## Slot Content
|
|
33
|
+
Text (or nested HTML) goes in the default slot. TypeIt handles strings, tags, line breaks.
|
|
34
|
+
|
|
35
|
+
```html
|
|
36
|
+
<schmancy-typewriter speed="50">
|
|
37
|
+
First line.<br>
|
|
38
|
+
<strong>Bold second.</strong>
|
|
39
|
+
</schmancy-typewriter>
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Vs. `typewriter` directive
|
|
43
|
+
- **Component (`schmancy-typewriter`)**: slot-based, lazy-starts on visibility, one-shot content reveal with cached skipping.
|
|
44
|
+
- **Directive (`typewriter([...phrases])`)**: cycles through a phrase array with typing + deleting + optional Web Audio sound. See [directives.md](./directives.md).
|
|
45
|
+
|
|
46
|
+
Use the directive for looping taglines. Use the component for one-time paragraph reveals.
|