@mhmo91/schmancy 0.9.3 → 0.9.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ai/INDEX.md +53 -302
- package/ai/area.md +91 -165
- package/ai/mailbox.md +1 -1
- package/ai/mixins.md +37 -139
- package/ai/store.md +70 -136
- package/dist/ai/INDEX.md +53 -302
- package/dist/ai/area.md +91 -165
- package/dist/ai/mailbox.md +1 -1
- package/dist/ai/mixins.md +37 -139
- package/dist/ai/store.md +70 -136
- package/dist/{area-CC8fUnra.js → area-CRoGqD_u.js} +2 -2
- package/dist/area-CRoGqD_u.js.map +1 -0
- package/dist/{area-wnWUAHEn.cjs → area-JPykB7A9.cjs} +1 -1
- package/dist/area-JPykB7A9.cjs.map +1 -0
- package/dist/area.cjs +1 -1
- package/dist/area.js +1 -1
- package/dist/{autocomplete-B2Z3WK_7.cjs → autocomplete-5rVhbieU.cjs} +1 -1
- package/dist/{autocomplete-B2Z3WK_7.cjs.map → autocomplete-5rVhbieU.cjs.map} +1 -1
- package/dist/{autocomplete-CJ7YgtKN.js → autocomplete-BllPQwr8.js} +3 -3
- package/dist/{autocomplete-CJ7YgtKN.js.map → autocomplete-BllPQwr8.js.map} +1 -1
- package/dist/autocomplete.cjs +1 -1
- package/dist/autocomplete.js +1 -1
- package/dist/badge.cjs +1 -1
- package/dist/badge.js +1 -1
- package/dist/{boat-C9eU6NO-.js → boat-BDTQ-du9.js} +2 -2
- package/dist/{boat-C9eU6NO-.js.map → boat-BDTQ-du9.js.map} +1 -1
- package/dist/{boat-B57_4TzJ.cjs → boat-DYEAZ8Qj.cjs} +1 -1
- package/dist/{boat-B57_4TzJ.cjs.map → boat-DYEAZ8Qj.cjs.map} +1 -1
- package/dist/boat.cjs +1 -1
- package/dist/boat.js +1 -1
- package/dist/{busy-CGZXy0h-.js → busy-ChDAeaKF.js} +1 -1
- package/dist/{busy-CGZXy0h-.js.map → busy-ChDAeaKF.js.map} +1 -1
- package/dist/{busy--6oimtop.cjs → busy-Dj7Xn0Z0.cjs} +1 -1
- package/dist/{busy--6oimtop.cjs.map → busy-Dj7Xn0Z0.cjs.map} +1 -1
- package/dist/busy.cjs +1 -1
- package/dist/busy.js +1 -1
- package/dist/button.cjs +1 -1
- package/dist/button.js +2 -2
- package/dist/{card-BGJ0Hb1O.cjs → card-BvPWVEJX.cjs} +1 -1
- package/dist/{card-BGJ0Hb1O.cjs.map → card-BvPWVEJX.cjs.map} +1 -1
- package/dist/{card-C-ee-l5O.js → card-DZFPRPqs.js} +1 -1
- package/dist/{card-C-ee-l5O.js.map → card-DZFPRPqs.js.map} +1 -1
- package/dist/card.cjs +1 -1
- package/dist/card.js +1 -1
- package/dist/charts.cjs +1 -1
- package/dist/charts.js +2 -2
- package/dist/{checkbox-DuYaKoDZ.cjs → checkbox-BC_37rsG.cjs} +1 -1
- package/dist/{checkbox-DuYaKoDZ.cjs.map → checkbox-BC_37rsG.cjs.map} +1 -1
- package/dist/{checkbox-FRcorDrD.js → checkbox-GSSjqo6w.js} +1 -1
- package/dist/{checkbox-FRcorDrD.js.map → checkbox-GSSjqo6w.js.map} +1 -1
- package/dist/checkbox.cjs +1 -1
- package/dist/checkbox.js +1 -1
- package/dist/{chips-BpA0A-qr.cjs → chips-B19XS8Xc.cjs} +1 -1
- package/dist/{chips-BpA0A-qr.cjs.map → chips-B19XS8Xc.cjs.map} +1 -1
- package/dist/{chips-CyzNbKJD.js → chips-B9oAEfE_.js} +3 -3
- package/dist/{chips-CyzNbKJD.js.map → chips-B9oAEfE_.js.map} +1 -1
- package/dist/chips.cjs +1 -1
- package/dist/chips.js +2 -2
- package/dist/{code-highlight-C7O9ltXm.js → code-highlight-DCk5lJY-.js} +1 -1
- package/dist/{code-highlight-C7O9ltXm.js.map → code-highlight-DCk5lJY-.js.map} +1 -1
- package/dist/{code-highlight-DsBdSQBG.cjs → code-highlight-fSLrlgOb.cjs} +1 -1
- package/dist/{code-highlight-DsBdSQBG.cjs.map → code-highlight-fSLrlgOb.cjs.map} +1 -1
- package/dist/code-highlight.cjs +1 -1
- package/dist/code-highlight.js +1 -1
- package/dist/{components-CkMvOiTR.js → components-COsM6sJZ.js} +2 -2
- package/dist/{components-CkMvOiTR.js.map → components-COsM6sJZ.js.map} +1 -1
- package/dist/{components-dDI3xeIf.cjs → components-CyD6a7gQ.cjs} +1 -1
- package/dist/{components-dDI3xeIf.cjs.map → components-CyD6a7gQ.cjs.map} +1 -1
- package/dist/components.cjs +1 -1
- package/dist/components.js +1 -1
- package/dist/connectivity.cjs +1 -1
- package/dist/connectivity.js +1 -1
- package/dist/content-drawer.cjs +1 -1
- package/dist/content-drawer.js +1 -1
- package/dist/{date-range-BrN_Bs6_.js → date-range-Sfyco9-n.js} +3 -3
- package/dist/{date-range-BrN_Bs6_.js.map → date-range-Sfyco9-n.js.map} +1 -1
- package/dist/{date-range-70zhLUKE.cjs → date-range-ZAaQB22I.cjs} +1 -1
- package/dist/{date-range-70zhLUKE.cjs.map → date-range-ZAaQB22I.cjs.map} +1 -1
- package/dist/{date-range-inline-Cp294DxR.js → date-range-inline-Bl8qbiQF.js} +1 -1
- package/dist/{date-range-inline-Cp294DxR.js.map → date-range-inline-Bl8qbiQF.js.map} +1 -1
- package/dist/{date-range-inline-CPzD-tIv.cjs → date-range-inline-m7nLjOMI.cjs} +1 -1
- package/dist/{date-range-inline-CPzD-tIv.cjs.map → date-range-inline-m7nLjOMI.cjs.map} +1 -1
- package/dist/date-range-inline.cjs +1 -1
- package/dist/date-range-inline.js +1 -1
- package/dist/date-range.cjs +1 -1
- package/dist/date-range.js +1 -1
- package/dist/{delay-COcAkBqB.cjs → delay-7boauN6N.cjs} +1 -1
- package/dist/{delay-COcAkBqB.cjs.map → delay-7boauN6N.cjs.map} +1 -1
- package/dist/{delay-IV0Swce2.js → delay-CgX6m0HN.js} +3 -3
- package/dist/{delay-IV0Swce2.js.map → delay-CgX6m0HN.js.map} +1 -1
- package/dist/delay.cjs +1 -1
- package/dist/delay.js +1 -1
- package/dist/{details-DgWkPqmt.cjs → details-BHnk8l4q.cjs} +1 -1
- package/dist/{details-DgWkPqmt.cjs.map → details-BHnk8l4q.cjs.map} +1 -1
- package/dist/{details-CuKmr3Qw.js → details-BPkUg8Cq.js} +2 -2
- package/dist/{details-CuKmr3Qw.js.map → details-BPkUg8Cq.js.map} +1 -1
- package/dist/details.cjs +1 -1
- package/dist/details.js +1 -1
- package/dist/dialog.cjs +1 -1
- package/dist/dialog.js +2 -2
- package/dist/directives.cjs.map +1 -1
- package/dist/directives.js.map +1 -1
- package/dist/discovery.cjs.map +1 -1
- package/dist/discovery.js.map +1 -1
- package/dist/{divider-BWoUbfgZ.js → divider-CW9a7MMj.js} +2 -2
- package/dist/{divider-BWoUbfgZ.js.map → divider-CW9a7MMj.js.map} +1 -1
- package/dist/{divider-BghtrMbn.cjs → divider-_khrhrZo.cjs} +1 -1
- package/dist/{divider-BghtrMbn.cjs.map → divider-_khrhrZo.cjs.map} +1 -1
- package/dist/divider.cjs +1 -1
- package/dist/divider.js +1 -1
- package/dist/dropdown.cjs +1 -1
- package/dist/dropdown.js +2 -2
- package/dist/{expand-XyDE5SsO.cjs → expand-Cp7-PH8b.cjs} +1 -1
- package/dist/{expand-XyDE5SsO.cjs.map → expand-Cp7-PH8b.cjs.map} +1 -1
- package/dist/{expand-CJU9m4ga.js → expand-iQ7EOMP7.js} +3 -3
- package/dist/{expand-CJU9m4ga.js.map → expand-iQ7EOMP7.js.map} +1 -1
- package/dist/expand.cjs +1 -1
- package/dist/expand.js +1 -1
- package/dist/{extra-CsrRKKqE.cjs → extra-IKAiJJhv.cjs} +1 -1
- package/dist/{extra-CsrRKKqE.cjs.map → extra-IKAiJJhv.cjs.map} +1 -1
- package/dist/{extra-BxXFmW1w.js → extra-wEpvEFbK.js} +2 -2
- package/dist/{extra-BxXFmW1w.js.map → extra-wEpvEFbK.js.map} +1 -1
- package/dist/extra.cjs +1 -1
- package/dist/extra.js +1 -1
- package/dist/{float-BD86t_NU.js → float-BQ_urmMs.js} +2 -2
- package/dist/{float-BD86t_NU.js.map → float-BQ_urmMs.js.map} +1 -1
- package/dist/{float-DBv1FINW.cjs → float-D5rNC82i.cjs} +1 -1
- package/dist/{float-DBv1FINW.cjs.map → float-D5rNC82i.cjs.map} +1 -1
- package/dist/float.cjs +1 -1
- package/dist/float.js +1 -1
- package/dist/{form-D0bIeDWT.cjs → form-BqN1AGFj.cjs} +1 -1
- package/dist/{form-D0bIeDWT.cjs.map → form-BqN1AGFj.cjs.map} +1 -1
- package/dist/{form-Cp5-I_ZV.js → form-CajC5HnO.js} +1 -1
- package/dist/{form-Cp5-I_ZV.js.map → form-CajC5HnO.js.map} +1 -1
- package/dist/form.cjs +1 -1
- package/dist/form.js +1 -1
- package/dist/{icons-D8w_20mO.cjs → icons-B57_93VV.cjs} +1 -1
- package/dist/{icons-D8w_20mO.cjs.map → icons-B57_93VV.cjs.map} +1 -1
- package/dist/{icons-BpU0_l92.js → icons-BDqiGXrO.js} +1 -1
- package/dist/{icons-BpU0_l92.js.map → icons-BDqiGXrO.js.map} +1 -1
- package/dist/icons.cjs +1 -1
- package/dist/icons.js +1 -1
- package/dist/{iframe-BjwxA2Pg.cjs → iframe-DNHL3GIk.cjs} +1 -1
- package/dist/{iframe-BjwxA2Pg.cjs.map → iframe-DNHL3GIk.cjs.map} +1 -1
- package/dist/{iframe-tY1GY5g1.js → iframe-WnWPIrBG.js} +1 -1
- package/dist/{iframe-tY1GY5g1.js.map → iframe-WnWPIrBG.js.map} +1 -1
- package/dist/iframe.cjs +1 -1
- package/dist/iframe.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +33 -33
- package/dist/{input-BwxwognS.cjs → input-BiSrTcrR.cjs} +1 -1
- package/dist/{input-BwxwognS.cjs.map → input-BiSrTcrR.cjs.map} +1 -1
- package/dist/{input-BnfTpRN9.js → input-VaXHFrRn.js} +1 -1
- package/dist/{input-BnfTpRN9.js.map → input-VaXHFrRn.js.map} +1 -1
- package/dist/{input-chip-MjOwX5EY.cjs → input-chip-Dy-AiP55.cjs} +1 -1
- package/dist/{input-chip-MjOwX5EY.cjs.map → input-chip-Dy-AiP55.cjs.map} +1 -1
- package/dist/{input-chip-CkM2aYmO.js → input-chip-QejNcRnS.js} +1 -1
- package/dist/{input-chip-CkM2aYmO.js.map → input-chip-QejNcRnS.js.map} +1 -1
- package/dist/input.cjs +1 -1
- package/dist/input.js +1 -1
- package/dist/json.cjs +1 -1
- package/dist/json.js +2 -2
- package/dist/{layout-CJSlZlFL.js → layout-CnsXeCAy.js} +2 -2
- package/dist/{layout-CJSlZlFL.js.map → layout-CnsXeCAy.js.map} +1 -1
- package/dist/{layout-BV0EeyUS.cjs → layout-DNYG3phx.cjs} +1 -1
- package/dist/{layout-BV0EeyUS.cjs.map → layout-DNYG3phx.cjs.map} +1 -1
- package/dist/layout.cjs +1 -1
- package/dist/layout.js +2 -2
- package/dist/{lightbox-groqGmJH.js → lightbox-BrI1Z31s.js} +2 -2
- package/dist/{lightbox-groqGmJH.js.map → lightbox-BrI1Z31s.js.map} +1 -1
- package/dist/{lightbox-CpNMZHZW.cjs → lightbox-CmACf0t5.cjs} +1 -1
- package/dist/{lightbox-CpNMZHZW.cjs.map → lightbox-CmACf0t5.cjs.map} +1 -1
- package/dist/lightbox.cjs +1 -1
- package/dist/lightbox.js +1 -1
- package/dist/{list-DzkqT_r-.js → list-Cm-jjXxM.js} +2 -2
- package/dist/{list-DzkqT_r-.js.map → list-Cm-jjXxM.js.map} +1 -1
- package/dist/{list-CyHd0Zc2.cjs → list-swIL9VDv.cjs} +1 -1
- package/dist/{list-CyHd0Zc2.cjs.map → list-swIL9VDv.cjs.map} +1 -1
- package/dist/list.cjs +1 -1
- package/dist/list.js +1 -1
- package/dist/{litElement.mixin-BG6_-nYX.cjs → litElement.mixin-3llHwB-8.cjs} +1 -1
- package/dist/{litElement.mixin-BG6_-nYX.cjs.map → litElement.mixin-3llHwB-8.cjs.map} +1 -1
- package/dist/{litElement.mixin-Dm-4L8zL.js → litElement.mixin-6jJYHCrZ.js} +1 -1
- package/dist/{litElement.mixin-Dm-4L8zL.js.map → litElement.mixin-6jJYHCrZ.js.map} +1 -1
- package/dist/{mailbox-BcqnXYVP.js → mailbox-BuvsVaAQ.js} +4 -4
- package/dist/{mailbox-BcqnXYVP.js.map → mailbox-BuvsVaAQ.js.map} +1 -1
- package/dist/{mailbox-C5eYTd7p.cjs → mailbox-D6LkQcN5.cjs} +1 -1
- package/dist/{mailbox-C5eYTd7p.cjs.map → mailbox-D6LkQcN5.cjs.map} +1 -1
- package/dist/mailbox.cjs +1 -1
- package/dist/mailbox.js +1 -1
- package/dist/{map-C0o1PgLE.js → map-CQiKAxC3.js} +1 -1
- package/dist/{map-C0o1PgLE.js.map → map-CQiKAxC3.js.map} +1 -1
- package/dist/{map-BncheFt5.cjs → map-D5NN4VET.cjs} +1 -1
- package/dist/{map-BncheFt5.cjs.map → map-D5NN4VET.cjs.map} +1 -1
- package/dist/map.cjs +1 -1
- package/dist/map.js +1 -1
- package/dist/{menu-uwqlQbLd.js → menu-C1x04YZw.js} +2 -2
- package/dist/{menu-uwqlQbLd.js.map → menu-C1x04YZw.js.map} +1 -1
- package/dist/{menu-yXzwJZFf.cjs → menu-CkgMO9K5.cjs} +1 -1
- package/dist/{menu-yXzwJZFf.cjs.map → menu-CkgMO9K5.cjs.map} +1 -1
- package/dist/menu.cjs +1 -1
- package/dist/menu.js +1 -1
- package/dist/mixins.cjs +1 -1
- package/dist/mixins.js +3 -3
- package/dist/nav-drawer.cjs +1 -1
- package/dist/nav-drawer.js +1 -1
- package/dist/navigation-bar.cjs +1 -1
- package/dist/navigation-bar.js +1 -1
- package/dist/navigation-rail.cjs +1 -1
- package/dist/navigation-rail.js +2 -2
- package/dist/{notification-DzYT4deA.js → notification-BnBgxjF-.js} +3 -3
- package/dist/{notification-DzYT4deA.js.map → notification-BnBgxjF-.js.map} +1 -1
- package/dist/{notification-BjwTfLAl.cjs → notification-CZFEhWxc.cjs} +1 -1
- package/dist/{notification-BjwTfLAl.cjs.map → notification-CZFEhWxc.cjs.map} +1 -1
- package/dist/notification.cjs +1 -1
- package/dist/notification.js +1 -1
- package/dist/{option-BJsD3u2D.cjs → option-BrxCVwSx.cjs} +1 -1
- package/dist/{option-BJsD3u2D.cjs.map → option-BrxCVwSx.cjs.map} +1 -1
- package/dist/{option-JFHxgiYl.js → option-DBO8xZwd.js} +1 -1
- package/dist/{option-JFHxgiYl.js.map → option-DBO8xZwd.js.map} +1 -1
- package/dist/option.cjs +1 -1
- package/dist/option.js +1 -1
- package/dist/page.cjs +1 -1
- package/dist/page.js +3 -3
- package/dist/{progress-BoRmyGAa.cjs → progress-Db2e4_Zd.cjs} +1 -1
- package/dist/{progress-BoRmyGAa.cjs.map → progress-Db2e4_Zd.cjs.map} +1 -1
- package/dist/{progress-BUh5WBqx.js → progress-DeiHxXo7.js} +2 -2
- package/dist/{progress-BUh5WBqx.js.map → progress-DeiHxXo7.js.map} +1 -1
- package/dist/progress.cjs +1 -1
- package/dist/progress.js +1 -1
- package/dist/{provide-8MrDz_qX.js → provide-C1aQhxYo.js} +1 -1
- package/dist/{provide-8MrDz_qX.js.map → provide-C1aQhxYo.js.map} +1 -1
- package/dist/{provide-CDkxgjHb.cjs → provide-DHnhQtCH.cjs} +1 -1
- package/dist/{provide-CDkxgjHb.cjs.map → provide-DHnhQtCH.cjs.map} +1 -1
- package/dist/qr-scanner.cjs +1 -1
- package/dist/qr-scanner.js +2 -2
- package/dist/{radio-group-rhrvhB5X.cjs → radio-group-Cspwd-Vw.cjs} +1 -1
- package/dist/{radio-group-rhrvhB5X.cjs.map → radio-group-Cspwd-Vw.cjs.map} +1 -1
- package/dist/{radio-group-DbOWUPhi.js → radio-group-zSO0AkJf.js} +1 -1
- package/dist/{radio-group-DbOWUPhi.js.map → radio-group-zSO0AkJf.js.map} +1 -1
- package/dist/radio-group.cjs +1 -1
- package/dist/radio-group.js +1 -1
- package/dist/range.cjs +1 -1
- package/dist/range.js +1 -1
- package/dist/{scroll-BE9W9PF2.cjs → scroll-QMCmbbDv.cjs} +1 -1
- package/dist/{scroll-BE9W9PF2.cjs.map → scroll-QMCmbbDv.cjs.map} +1 -1
- package/dist/{scroll-qGks1R0k.js → scroll-cBDzye64.js} +1 -1
- package/dist/{scroll-qGks1R0k.js.map → scroll-cBDzye64.js.map} +1 -1
- package/dist/{select-DXU2kzg4.cjs → select-Ct37l3lg.cjs} +1 -1
- package/dist/{select-DXU2kzg4.cjs.map → select-Ct37l3lg.cjs.map} +1 -1
- package/dist/{select-D9sgBRjU.js → select-c6HbWvKP.js} +2 -2
- package/dist/{select-D9sgBRjU.js.map → select-c6HbWvKP.js.map} +1 -1
- package/dist/select.cjs +1 -1
- package/dist/select.js +1 -1
- package/dist/{sheet-CIxCCJ3H.js → sheet-BMXcUiIm.js} +4 -4
- package/dist/{sheet-CIxCCJ3H.js.map → sheet-BMXcUiIm.js.map} +1 -1
- package/dist/{sheet-CeX6BbNp.cjs → sheet-CQec-bCV.cjs} +1 -1
- package/dist/{sheet-CeX6BbNp.cjs.map → sheet-CQec-bCV.cjs.map} +1 -1
- package/dist/sheet.cjs +1 -1
- package/dist/sheet.js +2 -2
- package/dist/{sheet.service-CAB7weBc.js → sheet.service-BcPV3Du4.js} +1 -1
- package/dist/{sheet.service-CAB7weBc.js.map → sheet.service-BcPV3Du4.js.map} +1 -1
- package/dist/{sheet.service-DPAp7E3x.cjs → sheet.service-Dumvr1HT.cjs} +1 -1
- package/dist/{sheet.service-DPAp7E3x.cjs.map → sheet.service-Dumvr1HT.cjs.map} +1 -1
- package/dist/slider.cjs +1 -1
- package/dist/slider.js +2 -2
- package/dist/{src-CbO5kJ2O.js → src-BLngW2bl.js} +42 -42
- package/dist/{src-CbO5kJ2O.js.map → src-BLngW2bl.js.map} +1 -1
- package/dist/{src-SraDxEeg.cjs → src-BtQVyqMy.cjs} +1 -1
- package/dist/{src-SraDxEeg.cjs.map → src-BtQVyqMy.cjs.map} +1 -1
- package/dist/steps.cjs +1 -1
- package/dist/steps.js +3 -3
- package/dist/{surface-DuH0pm2v.cjs → surface-BjKZoJxK.cjs} +1 -1
- package/dist/{surface-DuH0pm2v.cjs.map → surface-BjKZoJxK.cjs.map} +1 -1
- package/dist/{surface-eN_Jy2MJ.js → surface-pK8hME5c.js} +3 -3
- package/dist/{surface-eN_Jy2MJ.js.map → surface-pK8hME5c.js.map} +1 -1
- package/dist/surface.cjs +1 -1
- package/dist/surface.js +1 -1
- package/dist/{surface.mixin-CIXgN6iw.cjs → surface.mixin-C5sDI1-_.cjs} +1 -1
- package/dist/{surface.mixin-CIXgN6iw.cjs.map → surface.mixin-C5sDI1-_.cjs.map} +1 -1
- package/dist/{surface.mixin-D9jv1sKG.js → surface.mixin-CBNRpJum.js} +1 -1
- package/dist/{surface.mixin-D9jv1sKG.js.map → surface.mixin-CBNRpJum.js.map} +1 -1
- package/dist/{table-Dg_tUGB_.js → table-BXIHX9h4.js} +2 -2
- package/dist/{table-Dg_tUGB_.js.map → table-BXIHX9h4.js.map} +1 -1
- package/dist/{table-C9rRQJEB.cjs → table-CiqgZzSd.cjs} +1 -1
- package/dist/{table-C9rRQJEB.cjs.map → table-CiqgZzSd.cjs.map} +1 -1
- package/dist/table.cjs +1 -1
- package/dist/table.js +1 -1
- package/dist/{tabs-soTL-x4G.cjs → tabs-CKa-W4qA.cjs} +1 -1
- package/dist/{tabs-soTL-x4G.cjs.map → tabs-CKa-W4qA.cjs.map} +1 -1
- package/dist/{tabs-BbFC9omR.js → tabs-nbV5eblZ.js} +2 -2
- package/dist/{tabs-BbFC9omR.js.map → tabs-nbV5eblZ.js.map} +1 -1
- package/dist/tabs.cjs +1 -1
- package/dist/tabs.js +1 -1
- package/dist/tailwind.mixin-BCJOOX1_.js +225 -0
- package/dist/tailwind.mixin-BCJOOX1_.js.map +1 -0
- package/dist/tailwind.mixin-BF1Huas7.cjs +2 -0
- package/dist/tailwind.mixin-BF1Huas7.cjs.map +1 -0
- package/dist/teleport.cjs +1 -1
- package/dist/teleport.js +1 -1
- package/dist/{textarea-DaRUJ0ri.cjs → textarea-Cp1ZE60O.cjs} +1 -1
- package/dist/{textarea-DaRUJ0ri.cjs.map → textarea-Cp1ZE60O.cjs.map} +1 -1
- package/dist/{textarea-hChvHbNM.js → textarea-D7q8exMg.js} +1 -1
- package/dist/{textarea-hChvHbNM.js.map → textarea-D7q8exMg.js.map} +1 -1
- package/dist/textarea.cjs +1 -1
- package/dist/textarea.js +1 -1
- package/dist/{theme-ZYH2MqX9.cjs → theme-Da4SPq9X.cjs} +1 -1
- package/dist/{theme-ZYH2MqX9.cjs.map → theme-Da4SPq9X.cjs.map} +1 -1
- package/dist/{theme-B0M8Hlyo.js → theme-_VPV6Bxh.js} +3 -3
- package/dist/{theme-B0M8Hlyo.js.map → theme-_VPV6Bxh.js.map} +1 -1
- package/dist/{theme-button-BtlX_Zgd.js → theme-button--sX8A-m1.js} +1 -1
- package/dist/{theme-button-BtlX_Zgd.js.map → theme-button--sX8A-m1.js.map} +1 -1
- package/dist/{theme-button-Dvqg-rE_.cjs → theme-button-Ci8VQ7KW.cjs} +1 -1
- package/dist/{theme-button-Dvqg-rE_.cjs.map → theme-button-Ci8VQ7KW.cjs.map} +1 -1
- package/dist/theme-button.cjs +1 -1
- package/dist/theme-button.js +1 -1
- package/dist/theme.cjs +1 -1
- package/dist/theme.js +2 -2
- package/dist/tooltip.cjs +1 -1
- package/dist/tooltip.js +1 -1
- package/dist/tree.cjs +1 -1
- package/dist/tree.js +1 -1
- package/dist/{typewriter-Cf9f2bdx.cjs → typewriter-B2TnHPjw.cjs} +1 -1
- package/dist/{typewriter-Cf9f2bdx.cjs.map → typewriter-B2TnHPjw.cjs.map} +1 -1
- package/dist/{typewriter-CCel8Nta.js → typewriter-BrZNa8T-.js} +3 -3
- package/dist/{typewriter-CCel8Nta.js.map → typewriter-BrZNa8T-.js.map} +1 -1
- package/dist/typewriter.cjs +1 -1
- package/dist/typewriter.js +1 -1
- package/dist/typography.cjs +1 -1
- package/dist/typography.js +1 -1
- package/dist/{window-CbgdwOZD.js → window-CM1ycigo.js} +2 -2
- package/dist/{window-CbgdwOZD.js.map → window-CM1ycigo.js.map} +1 -1
- package/dist/{window-B9_14c12.cjs → window-Uii13x_r.cjs} +1 -1
- package/dist/{window-B9_14c12.cjs.map → window-Uii13x_r.cjs.map} +1 -1
- package/dist/window.cjs +1 -1
- package/dist/window.js +1 -1
- package/mixins/baseElement.ts +1 -1
- package/mixins/discovery.service.ts +1 -1
- package/package.json +1 -2
- package/src/area/area.service.ts +1 -1
- package/src/area/router.types.ts +1 -1
- package/src/directives/animate-text.ts +1 -1
- package/src/discovery/discovery.service.ts +1 -1
- package/src/input/input.ts +1 -1
- package/src/mailbox/README.md +7 -10
- package/src/mailbox/types.ts +0 -1
- package/types/mixins/discovery.service.d.ts +1 -1
- package/types/src/discovery/discovery.service.d.ts +1 -1
- package/types/src/mailbox/types.d.ts +0 -1
- package/dist/area-CC8fUnra.js.map +0 -1
- package/dist/area-wnWUAHEn.cjs.map +0 -1
- package/dist/tailwind.mixin-BIVhjNvD.js +0 -225
- package/dist/tailwind.mixin-BIVhjNvD.js.map +0 -1
- package/dist/tailwind.mixin-DSuEu-y3.cjs +0 -2
- package/dist/tailwind.mixin-DSuEu-y3.cjs.map +0 -1
- package/src/area/readme.md +0 -338
- package/src/area/router-guide.md +0 -360
- package/src/autocomplete/README.md +0 -485
- package/src/content-drawer/readme.md +0 -709
- package/src/icons/readme.md +0 -37
- package/src/list/readme.md +0 -62
- package/src/radio-group/readme.md +0 -315
- package/src/select/README.md +0 -405
- package/src/tabs/Readme.md +0 -397
- package/src/teleport/readme.md +0 -91
- package/src/tree/README.md +0 -59
- package/src/typewriter/IMPROVEMENTS.md +0 -174
- package/src/typewriter/QUICK_REFERENCE.md +0 -166
- package/src/typewriter/test-typewriter.html +0 -97
package/ai/store.md
CHANGED
|
@@ -1,192 +1,126 @@
|
|
|
1
|
-
# Store —
|
|
1
|
+
# Store — Context System
|
|
2
2
|
|
|
3
|
-
|
|
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`.
|
|
3
|
+
Reactive state management: `createContext`, `@select`, `@selectItem`.
|
|
22
4
|
|
|
23
5
|
## Creating a context
|
|
24
6
|
|
|
25
7
|
```typescript
|
|
26
8
|
import { createContext } from '@mhmo91/schmancy'
|
|
27
9
|
|
|
28
|
-
// Object
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
// Collection store — Map keyed by id
|
|
32
|
-
export const contactsContext = createContext<Map<string, Contact>>(new Map(), 'memory', 'contacts')
|
|
10
|
+
// Object
|
|
11
|
+
const userContext = createContext<User>(new User(), 'local', 'user')
|
|
33
12
|
|
|
34
|
-
//
|
|
35
|
-
|
|
13
|
+
// Map (collection)
|
|
14
|
+
const itemsContext = createContext<Map<string, Item>>(new Map(), 'indexeddb', 'items')
|
|
36
15
|
|
|
37
|
-
//
|
|
38
|
-
|
|
16
|
+
// Array
|
|
17
|
+
const tagsContext = createContext<string[]>([], 'memory', 'tags')
|
|
39
18
|
```
|
|
40
19
|
|
|
41
|
-
|
|
20
|
+
Signature: `createContext(initial, storage, key)`.
|
|
42
21
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
|
22
|
+
## Storage backends
|
|
23
|
+
|
|
24
|
+
| Mode | Backing | Survives refresh | Survives tab close | Capacity |
|
|
25
|
+
|------|---------|------------------|--------------------|----------|
|
|
26
|
+
| `'memory'` | JS heap | ❌ | ❌ | RAM |
|
|
46
27
|
| `'session'` | `sessionStorage` | ✅ | ❌ (per-tab) | ~5 MB |
|
|
47
28
|
| `'local'` | `localStorage` | ✅ | ✅ | ~5 MB |
|
|
48
29
|
| `'indexeddb'` | IndexedDB | ✅ | ✅ | GB |
|
|
49
30
|
|
|
50
|
-
|
|
51
|
-
-
|
|
52
|
-
-
|
|
53
|
-
-
|
|
54
|
-
-
|
|
31
|
+
Pick by data size and lifetime:
|
|
32
|
+
- User prefs, long-lived drafts → `'local'`
|
|
33
|
+
- Per-tab ephemeral (cart, wizard) → `'session'`
|
|
34
|
+
- Fetched from API, regenerable → `'memory'`
|
|
35
|
+
- Collections with >100 entries you want cached → `'indexeddb'`
|
|
55
36
|
|
|
56
37
|
## Reading with `@select`
|
|
57
38
|
|
|
58
39
|
```typescript
|
|
59
40
|
import { select } from '@mhmo91/schmancy'
|
|
60
41
|
|
|
61
|
-
@customElement('
|
|
62
|
-
class
|
|
63
|
-
// Auto-subscribes, re-renders on change
|
|
42
|
+
@customElement('my-component')
|
|
43
|
+
class MyComponent extends $LitElement() {
|
|
64
44
|
@select(userContext) user!: User
|
|
65
45
|
|
|
66
|
-
// Selector
|
|
67
|
-
@select(
|
|
46
|
+
// Selector narrows the dependency
|
|
47
|
+
@select(itemsContext, m => m.size) count!: number
|
|
68
48
|
|
|
69
|
-
|
|
70
|
-
@select(contactsContext) contacts!: Map<string, Contact>
|
|
49
|
+
@select(itemsContext) items!: Map<string, Item>
|
|
71
50
|
}
|
|
72
51
|
```
|
|
73
52
|
|
|
74
53
|
`@select` options:
|
|
75
|
-
- `required` (default `true`) — wait for
|
|
76
|
-
- `updateOnly` —
|
|
77
|
-
- `deepClone` — `structuredClone` the value
|
|
54
|
+
- `required` (default `true`) — wait for `.ready` before `connectedCallback` completes.
|
|
55
|
+
- `updateOnly` — call `requestUpdate` without assigning.
|
|
56
|
+
- `deepClone` — `structuredClone` the value.
|
|
78
57
|
- `debug` — log every emission.
|
|
79
58
|
|
|
80
|
-
|
|
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.
|
|
59
|
+
## `@selectItem`
|
|
87
60
|
|
|
88
|
-
|
|
61
|
+
Pick one entry from a collection context, keyed off a component property:
|
|
89
62
|
|
|
90
|
-
### Object store
|
|
91
63
|
```typescript
|
|
92
|
-
|
|
93
|
-
|
|
64
|
+
@selectItem(itemsContext, component => component.itemId)
|
|
65
|
+
item!: Item | undefined
|
|
94
66
|
```
|
|
95
67
|
|
|
96
|
-
|
|
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
|
-
```
|
|
68
|
+
## Writing
|
|
102
69
|
|
|
103
|
-
### Array store
|
|
104
70
|
```typescript
|
|
105
|
-
|
|
106
|
-
|
|
71
|
+
// Object
|
|
72
|
+
userContext.set({ name: 'Alice' })
|
|
73
|
+
userContext.set({ ...userContext.value, name: 'Bob' })
|
|
74
|
+
|
|
75
|
+
// Map
|
|
76
|
+
itemsContext.set('id-1', item)
|
|
77
|
+
itemsContext.delete('id-1')
|
|
78
|
+
itemsContext.replace(newMap)
|
|
79
|
+
|
|
80
|
+
// Array
|
|
81
|
+
tagsContext.push('new')
|
|
82
|
+
tagsContext.replace(['a', 'b'])
|
|
107
83
|
```
|
|
108
84
|
|
|
109
85
|
## Observable API
|
|
110
86
|
|
|
111
87
|
```typescript
|
|
112
|
-
|
|
113
|
-
|
|
88
|
+
userContext.$.pipe(
|
|
89
|
+
filter(() => userContext.ready),
|
|
90
|
+
takeUntil(this.disconnecting),
|
|
91
|
+
).subscribe(user => { /* ... */ })
|
|
114
92
|
|
|
115
|
-
|
|
116
|
-
|
|
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
|
-
}
|
|
93
|
+
userContext.value // synchronous snapshot
|
|
94
|
+
userContext.ready // true once the backing store has loaded
|
|
122
95
|
```
|
|
123
96
|
|
|
124
|
-
|
|
125
|
-
- **`ctx.value`** — synchronous snapshot.
|
|
126
|
-
- **`ctx.ready`** — boolean; becomes `true` after the backing store has loaded.
|
|
97
|
+
Gate subscriptions on `.ready` — `'local'` / `'session'` / `'indexeddb'` contexts emit their default value before the real stored value hydrates.
|
|
127
98
|
|
|
128
|
-
|
|
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.
|
|
99
|
+
## Dynamic contexts
|
|
130
100
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
For per-component ephemeral state that still benefits from persistence, instantiate the context **inside** `connectedCallback` with an instance-specific key:
|
|
101
|
+
For per-instance state with persistence, create the context inside `connectedCallback` with an instance-scoped key:
|
|
134
102
|
|
|
135
103
|
```typescript
|
|
136
|
-
|
|
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
|
-
}
|
|
104
|
+
private draftCtx: IStore<{ text: string }> | null = null
|
|
162
105
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
106
|
+
connectedCallback() {
|
|
107
|
+
super.connectedCallback()
|
|
108
|
+
if (this.draftKey) {
|
|
109
|
+
this.draftCtx = createContext<{ text: string }>(
|
|
110
|
+
{ text: '' },
|
|
111
|
+
'session',
|
|
112
|
+
this.draftKey,
|
|
113
|
+
)
|
|
166
114
|
}
|
|
167
115
|
}
|
|
168
116
|
```
|
|
169
117
|
|
|
170
|
-
|
|
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.
|
|
118
|
+
## Rules
|
|
189
119
|
|
|
190
|
-
|
|
191
|
-
-
|
|
192
|
-
-
|
|
120
|
+
- Declare contexts at module scope (except dynamic per-instance ones).
|
|
121
|
+
- Name the storage key even for `'memory'` contexts — it helps debugging.
|
|
122
|
+
- Keep each context single-purpose. One write shouldn't invalidate unrelated readers.
|
|
123
|
+
- Only the owning component writes. Others read via `@select`.
|
|
124
|
+
- Every subscription uses `takeUntil(this.disconnecting)`.
|
|
125
|
+
- Gate on `.ready` before async cascading work.
|
|
126
|
+
- Don't store Promises, Observables, functions, or class instances in persistent contexts.
|
package/dist/ai/INDEX.md
CHANGED
|
@@ -1,321 +1,72 @@
|
|
|
1
|
-
# Schmancy
|
|
1
|
+
# Schmancy — Documentation Index
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
A Web Component UI library on Lit + RxJS + Tailwind CSS.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## Foundations
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
┌─ FOUNDATIONS ──────────────────────────────────────┐
|
|
9
|
-
│ Routing · State · Base class · Theme · Directives │
|
|
10
|
-
│ (Not components. The framework your app runs on.) │
|
|
11
|
-
├─ ATOMS ────────────────────────────────────────────┤
|
|
12
|
-
│ Typography · Icons · Surfaces · Buttons · Scroll │
|
|
13
|
-
│ (The vocabulary every screen repeats.) │
|
|
14
|
-
├─ COMPOSITES ───────────────────────────────────────┤
|
|
15
|
-
│ Forms · Navigation · Overlays · Feedback · Data │
|
|
16
|
-
│ (Job-specific components.) │
|
|
17
|
-
└─ UTILITIES ────────────────────────────────────────┘
|
|
18
|
-
Discovery · RxJS helpers · Search · Numbers · etc.
|
|
19
|
-
```
|
|
7
|
+
The framework pieces — touch before components.
|
|
20
8
|
|
|
21
|
-
|
|
9
|
+
- [Area](./area.md) — `<schmancy-area>`, `<schmancy-route>`, `area.push()`, `lazy()` for routing.
|
|
10
|
+
- [Store](./store.md) — `createContext`, `@select`, `@selectItem`, storage backends.
|
|
11
|
+
- [Mixins](./mixins.md) — `$LitElement` base class.
|
|
12
|
+
- [Theme](./theme.md) — `<schmancy-theme>`, color scheme, CSS variables.
|
|
13
|
+
- [Directives](./directives.md) — Lit directives for physics, effects, text, visibility, interaction.
|
|
14
|
+
- [Animation](./animation.md) — Spring presets (`SPRING_SMOOTH`, etc.), `createAnimation`.
|
|
22
15
|
|
|
23
|
-
|
|
16
|
+
## Components by job
|
|
24
17
|
|
|
25
|
-
|
|
18
|
+
### Display
|
|
19
|
+
[Typography](./typography.md) · [Icons](./icons.md) · [Avatar](./avatar.md) · [Divider](./divider.md) · [Badge](./badge.md) · [Code Highlight](./code-highlight.md) · [Typewriter](./typewriter.md) · [JSON](./json.md) · [Iframe](./iframe.md) · [Map](./map.md) · [Charts](./charts.md)
|
|
26
20
|
|
|
27
|
-
|
|
21
|
+
### Surfaces & layout
|
|
22
|
+
[Surface](./surface.md) · [Card](./card.md) · [Scroll / Grid / Flex](./layout.md) · [Page](./page.md) · [Content Drawer](./content-drawer.md) · [Window](./window.md) · [Boat](./boat.md) · [Float](./float.md)
|
|
28
23
|
|
|
29
|
-
|
|
30
|
-
|
|
24
|
+
### Forms
|
|
25
|
+
[Form](./form.md) · [Input](./input.md) · [Textarea](./textarea.md) · [Select](./select.md) · [Autocomplete](./autocomplete.md) · [Option](./option.md) · [Checkbox](./checkbox.md) · [Radio Group](./radio-group.md) · [Chips](./chips.md) · [Date Range](./date-range.md) · [Date Range Inline](./date-range-inline.md) · [Range](./range.md) · [Extra (Country/Timezone)](./extra.md)
|
|
31
26
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
```
|
|
27
|
+
### Navigation
|
|
28
|
+
[Nav Drawer](./nav-drawer.md) · [Tabs](./tabs.md) · [Navigation Bar](./navigation-bar.md) · [Navigation Rail](./navigation-rail.md) · [Steps](./steps.md) · [Teleport](./teleport.md) · [Theme Button](./theme-button.md)
|
|
35
29
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
<schmancy-route when="home-page" .component=${lazy(() => import('./home.page'))} />
|
|
39
|
-
<schmancy-route when="dashboard"
|
|
40
|
-
.component=${lazy(() => import('./dashboard.page'))}
|
|
41
|
-
.guard=${firebaseAuth$.pipe(map(u => !!u), takeUntil(this.disconnecting))}
|
|
42
|
-
@redirect=${() => area.push({ area: 'root', component: 'home-page', historyStrategy: 'replace' })}
|
|
43
|
-
/>
|
|
44
|
-
</schmancy-area>
|
|
45
|
-
```
|
|
30
|
+
### Overlays
|
|
31
|
+
[Dialog](./dialog.md) · [Sheet](./sheet.md) · [Notification](./notification.md) · [Menu](./menu.md) · [Dropdown](./dropdown.md) · [Tooltip](./tooltip.md) · [Lightbox](./lightbox.md) · [Expand](./expand.md)
|
|
46
32
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
- **Lazy is mandatory** for route components — `lazy(() => import('...'))` returns a preloadable reference.
|
|
50
|
-
- **`when="tag-name"` must exactly match** `@customElement('tag-name')`.
|
|
51
|
-
- **Programmatic navigation**: `area.push({ area, component, params?, historyStrategy? })`.
|
|
52
|
-
- **Subscribe to route state**: `area.on('root').pipe(takeUntil(this.disconnecting)).subscribe(...)`.
|
|
33
|
+
### Interactive
|
|
34
|
+
[Button](./button.md) · [List](./list.md) · [Details](./details.md) · [Table](./table.md) · [Tree](./tree.md) · [Slider](./slider.md) · [QR Scanner](./qr-scanner.md)
|
|
53
35
|
|
|
54
|
-
|
|
36
|
+
### Feedback
|
|
37
|
+
[Progress](./progress.md) · [Busy](./busy.md) · [Connectivity](./connectivity.md) · [Delay](./delay.md)
|
|
55
38
|
|
|
56
|
-
|
|
57
|
-
|
|
39
|
+
### Domain
|
|
40
|
+
[Mailbox](./mailbox.md)
|
|
58
41
|
|
|
59
|
-
|
|
60
|
-
import { createContext, select } from '@mhmo91/schmancy'
|
|
42
|
+
## Services (imperative APIs)
|
|
61
43
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
44
|
+
| Service | Purpose |
|
|
45
|
+
|---------|---------|
|
|
46
|
+
| `area` | Route navigation (see [area](./area.md)) |
|
|
47
|
+
| `$dialog` | Open dialogs (see [dialog](./dialog.md)) |
|
|
48
|
+
| `$notify` | Toast notifications (see [notification](./notification.md)) |
|
|
49
|
+
| `schmancyContentDrawer` | Side panel (see [content-drawer](./content-drawer.md)) |
|
|
50
|
+
| `theme` | Theme state, `fullscreen$` (see [theme](./theme.md)) |
|
|
51
|
+
| `sound` | Audio feedback (see [audio](./audio.md)) |
|
|
52
|
+
| `overlayStack` | Z-index coordinator (see [utils](./utils.md)) |
|
|
53
|
+
| `windowManager` | Window registry (see [window](./window.md)) |
|
|
66
54
|
|
|
67
|
-
|
|
68
|
-
@customElement('my-component')
|
|
69
|
-
class MyComponent extends $LitElement() {
|
|
70
|
-
@select(userContext) user!: User
|
|
55
|
+
## Utilities
|
|
71
56
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
distinctUntilChanged((a, b) => a.id === b.id),
|
|
77
|
-
switchMap(u => this.loadForUser(u)),
|
|
78
|
-
takeUntil(this.disconnecting),
|
|
79
|
-
).subscribe()
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
```
|
|
57
|
+
[Discovery](./discovery.md) — cross-shadow component lookup.
|
|
58
|
+
[RxJS Utils](./rxjs-utils.md) — `waitForElement`, `waitUntil`, `mutationObserver`.
|
|
59
|
+
[Utils](./utils.md) — `similarity`, `numbers`, `overlayStack`, `intersection$`, `hashContent`.
|
|
60
|
+
[Audio](./audio.md) — synthesized feedback sounds.
|
|
83
61
|
|
|
84
|
-
|
|
85
|
-
- **Collection-aware**: `Map` and `Array` contexts get `.set(k,v)`, `.delete(k)`, `.push(v)`, `.replace(...)` helpers.
|
|
86
|
-
- **`.ready`** is a boolean — gate async work behind `filter(() => ctx.ready)`.
|
|
87
|
-
- **`.$`** is a BehaviorSubject — compose with RxJS.
|
|
88
|
-
- **`.value`** is the synchronous snapshot.
|
|
89
|
-
- **`@selectItem`** for picking one entry from a collection context.
|
|
62
|
+
## Conventions
|
|
90
63
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
@customElement('my-component')
|
|
102
|
-
class MyComponent extends $LitElement(css`:host { display: block }`) {
|
|
103
|
-
connectedCallback() {
|
|
104
|
-
super.connectedCallback()
|
|
105
|
-
// The `disconnecting` Subject emits once on disconnect
|
|
106
|
-
myObservable$.pipe(takeUntil(this.disconnecting)).subscribe()
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
Provides: `disconnecting` (RxJS Subject) · `classMap()` (space-splitting) · `styleMap()` · `discover<T>(tag)` · Tailwind support · auto-response to discovery events.
|
|
112
|
-
|
|
113
|
-
**Rule of thumb:** if you're writing a Lit component inside a Schmancy app, extend `$LitElement`. No exceptions.
|
|
114
|
-
|
|
115
|
-
→ Full doc: [mixins.md](./mixins.md)
|
|
116
|
-
|
|
117
|
-
## 1.4 Theme — `schmancy-theme` + `theme` service
|
|
118
|
-
**Job:** Provide color scheme (dark/light), brand color, and CSS custom properties to everything below it.
|
|
119
|
-
|
|
120
|
-
```html
|
|
121
|
-
<schmancy-theme root scheme="dark" color="#6366F1">
|
|
122
|
-
<!-- entire app -->
|
|
123
|
-
</schmancy-theme>
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
- One `root` theme per app, typically wrapping `schmancy-surface type="solid" fill="all"`.
|
|
127
|
-
- Nested `<schmancy-theme>` can re-scope color/scheme for a subtree.
|
|
128
|
-
- CSS vars auto-generated: `--schmancy-sys-color-{role}-{variant}`.
|
|
129
|
-
- `theme.fullscreen$` — observable of viewport fullscreen state.
|
|
130
|
-
|
|
131
|
-
→ Full doc: [theme.md](./theme.md)
|
|
132
|
-
|
|
133
|
-
## 1.5 Directives — behavior without components
|
|
134
|
-
**Job:** Attach physics, effects, visibility, and interactions to *any* element via Lit directive syntax. 19 directives, modular imports.
|
|
135
|
-
|
|
136
|
-
```typescript
|
|
137
|
-
import { magnetic, cursorGlow, gravity, reveal, animateText, tooltip, drag, drop } from '@mhmo91/schmancy/directives'
|
|
138
|
-
```
|
|
139
|
-
|
|
140
|
-
```html
|
|
141
|
-
<schmancy-card ${cursorGlow()} ${gravity({ stagger: 100 })}>...</schmancy-card>
|
|
142
|
-
<div ${reveal(this.expanded, { preset: 'smooth' })}>expandable content</div>
|
|
143
|
-
<span ${animateText({ animation: 'blur-reveal' })}>Hello</span>
|
|
144
|
-
<button ${tooltip('Save your changes')}>Save</button>
|
|
145
|
-
```
|
|
146
|
-
|
|
147
|
-
Categories:
|
|
148
|
-
- **Physics**: `magnetic`, `cursorGlow`, `livingBorder`, `gravity`, `depthOfField`, `longPress`
|
|
149
|
-
- **Effects**: `nebula`, `liquid`, `ripple`
|
|
150
|
-
- **Text**: `animateText`, `cycleText`, `typewriter`
|
|
151
|
-
- **Visibility**: `reveal`, `intersect`
|
|
152
|
-
- **Interaction**: `drag`, `drop`, `color`, `tooltip`
|
|
153
|
-
|
|
154
|
-
→ Full doc: [directives.md](./directives.md)
|
|
155
|
-
|
|
156
|
-
---
|
|
157
|
-
|
|
158
|
-
# Layer 2 — Atoms
|
|
159
|
-
|
|
160
|
-
The display vocabulary. You'll use these on nearly every screen.
|
|
161
|
-
|
|
162
|
-
| Job | Tag | Doc |
|
|
163
|
-
|-----|-----|-----|
|
|
164
|
-
| **Text** | `schmancy-typography` | [typography](./typography.md) |
|
|
165
|
-
| **Iconography** | `schmancy-icon`, `schmancy-icon-button` | [icons](./icons.md), [button](./button.md) |
|
|
166
|
-
| **Primary actions** | `schmancy-button` | [button](./button.md) |
|
|
167
|
-
| **Glass depth container** | `schmancy-surface` | [surface](./surface.md) |
|
|
168
|
-
| **Scroll region** | `schmancy-scroll` | [layout](./layout.md) |
|
|
169
|
-
| **Visual separation** | `schmancy-divider` | [divider](./divider.md) |
|
|
170
|
-
| **Profile image** | `schmancy-avatar` | [avatar](./avatar.md) |
|
|
171
|
-
|
|
172
|
-
---
|
|
173
|
-
|
|
174
|
-
# Layer 3 — Composites (sorted by job)
|
|
175
|
-
|
|
176
|
-
## Forms — collect input
|
|
177
|
-
| Job | Tag | Doc |
|
|
178
|
-
|-----|-----|-----|
|
|
179
|
-
| Validation container | `schmancy-form` | [form](./form.md) |
|
|
180
|
-
| Single-line text | `schmancy-input` | [input](./input.md) |
|
|
181
|
-
| Multi-line text | `schmancy-textarea` | [textarea](./textarea.md) |
|
|
182
|
-
| Single-choice dropdown | `schmancy-select` + `schmancy-option` | [select](./select.md), [option](./option.md) |
|
|
183
|
-
| Searchable dropdown | `schmancy-autocomplete` | [autocomplete](./autocomplete.md) |
|
|
184
|
-
| Boolean | `schmancy-checkbox` | [checkbox](./checkbox.md) |
|
|
185
|
-
| One-of-many | `schmancy-radio-group` | [radio-group](./radio-group.md) |
|
|
186
|
-
| Multi-select tags / filters | `schmancy-chips` | [chips](./chips.md) |
|
|
187
|
-
| Date / date range | `schmancy-date-range`, `schmancy-date-range-inline` | [date-range](./date-range.md), [date-range-inline](./date-range-inline.md) |
|
|
188
|
-
| Numeric slider | `schmancy-range` | [range](./range.md) |
|
|
189
|
-
| Country / timezone | `schmancy-select-countries`, `schmancy-select-timezones` | [extra](./extra.md) |
|
|
190
|
-
|
|
191
|
-
## Navigation — structural layout
|
|
192
|
-
| Job | Tag | Doc |
|
|
193
|
-
|-----|-----|-----|
|
|
194
|
-
| App shell with side drawer | `schmancy-nav-drawer` (+ navbar, content) | [nav-drawer](./nav-drawer.md) |
|
|
195
|
-
| Tabbed sub-views | `schmancy-tabs` | [tabs](./tabs.md) |
|
|
196
|
-
| Mobile bottom nav | `schmancy-navigation-bar` | [navigation-bar](./navigation-bar.md) |
|
|
197
|
-
| Desktop side rail | `schmancy-navigation-rail` | [navigation-rail](./navigation-rail.md) |
|
|
198
|
-
| Multi-step flow | `schmancy-steps` | [steps](./steps.md) |
|
|
199
|
-
| Master-detail split | `schmancy-content-drawer` | [content-drawer](./content-drawer.md) |
|
|
200
|
-
| Viewport-aware page root | `schmancy-page` | [page](./page.md) |
|
|
201
|
-
| Floating draggable panel | `schmancy-window`, `schmancy-boat`, `schmancy-float` | [window](./window.md), [boat](./boat.md), [float](./float.md) |
|
|
202
|
-
| FLIP transition between views | `schmancy-teleport` | [teleport](./teleport.md) |
|
|
203
|
-
|
|
204
|
-
## Overlays — temporarily above everything (services preferred)
|
|
205
|
-
| Job | API | Fallback tag | Doc |
|
|
206
|
-
|-----|-----|--------------|-----|
|
|
207
|
-
| Modal / confirm | **`$dialog()` service** | `schmancy-dialog` | [dialog](./dialog.md) |
|
|
208
|
-
| Toast / banner | **`$notify()` service** | `schmancy-notification` | [notification](./notification.md) |
|
|
209
|
-
| Side/bottom panel | **`schmancyContentDrawer.open()`** | `schmancy-sheet` | [sheet](./sheet.md) |
|
|
210
|
-
| Context menu | `schmancy-menu` | — | [menu](./menu.md) |
|
|
211
|
-
| Floating panel | `schmancy-dropdown` | — | [dropdown](./dropdown.md) |
|
|
212
|
-
| Hover hint | `tooltip` directive | `schmancy-tooltip` | [tooltip](./tooltip.md), [directives](./directives.md) |
|
|
213
|
-
| Image gallery | `schmancy-lightbox` | — | [lightbox](./lightbox.md) |
|
|
214
|
-
| Accordion | `schmancy-expand` | `schmancy-details` | [expand](./expand.md), [details](./details.md) |
|
|
215
|
-
|
|
216
|
-
**Service > component for overlays.** Real apps call `$dialog()` / `$notify()` / `schmancyContentDrawer.open()` hundreds of times — managing overlay lifecycle imperatively keeps templates clean.
|
|
217
|
-
|
|
218
|
-
## Interaction — actionable content
|
|
219
|
-
| Job | Tag | Doc |
|
|
220
|
-
|-----|-----|-----|
|
|
221
|
-
| Clickable container | `schmancy-card` | [card](./card.md) |
|
|
222
|
-
| Selectable list | `schmancy-list` + `schmancy-list-item` | [list](./list.md) |
|
|
223
|
-
| Expandable row | `schmancy-details` | [details](./details.md) |
|
|
224
|
-
| Tabular data | `schmancy-table` | [table](./table.md) |
|
|
225
|
-
| Hierarchical data | `schmancy-tree` | [tree](./tree.md) |
|
|
226
|
-
| Carousel | `schmancy-slider` + `schmancy-slide` | [slider](./slider.md) |
|
|
227
|
-
| Camera QR scan | `schmancy-qr-scanner` | [qr-scanner](./qr-scanner.md) |
|
|
228
|
-
|
|
229
|
-
## Feedback — status / progress
|
|
230
|
-
| Job | Tag | Doc |
|
|
231
|
-
|-----|-----|-----|
|
|
232
|
-
| Linear progress | `schmancy-progress` | [progress](./progress.md) |
|
|
233
|
-
| Spinner / skeleton overlay | `schmancy-busy` | [busy](./busy.md) |
|
|
234
|
-
| Status indicator | `schmancy-badge` | [badge](./badge.md) |
|
|
235
|
-
| Online/offline banner | `schmancy-connectivity-status` | [connectivity](./connectivity.md) |
|
|
236
|
-
| Deferred render with stagger | `schmancy-delay` | [delay](./delay.md) |
|
|
237
|
-
|
|
238
|
-
## Rich display — specialized rendering
|
|
239
|
-
| Job | Tag | Doc |
|
|
240
|
-
|-----|-----|-----|
|
|
241
|
-
| Syntax-highlighted code | `schmancy-code-highlight` | [code-highlight](./code-highlight.md) |
|
|
242
|
-
| Typewriter reveal | `schmancy-typewriter` | [typewriter](./typewriter.md) |
|
|
243
|
-
| JSON viewer (debug) | `schmancy-json` | [json](./json.md) |
|
|
244
|
-
| Sandboxed iframe | `schmancy-iframe` | [iframe](./iframe.md) |
|
|
245
|
-
| Google Maps | `schmancy-map` | [map](./map.md) |
|
|
246
|
-
| Area chart | `schmancy-area-chart` | [charts](./charts.md) |
|
|
247
|
-
| Horizontal pills chart | `schmancy-pills` | [charts](./charts.md) |
|
|
248
|
-
| Theme toggle button | `schmancy-theme-button` | [theme-button](./theme-button.md) |
|
|
249
|
-
|
|
250
|
-
## Domain — specific to a workflow
|
|
251
|
-
| Job | Tag | Doc |
|
|
252
|
-
|-----|-----|-----|
|
|
253
|
-
| Email composition | `schmancy-mailbox` (+ 5 sub-tags) | [mailbox](./mailbox.md) |
|
|
254
|
-
|
|
255
|
-
## Layout primitives (prefer Tailwind for new code)
|
|
256
|
-
| Job | Tag | Doc |
|
|
257
|
-
|-----|-----|-----|
|
|
258
|
-
| Grid / flex / scroll | `schmancy-grid`, `schmancy-flex`, `schmancy-scroll`, `sch-grid`, `sch-flex` | [layout](./layout.md) |
|
|
259
|
-
|
|
260
|
-
---
|
|
261
|
-
|
|
262
|
-
# Layer 4 — Utilities (non-component)
|
|
263
|
-
|
|
264
|
-
| Module | Purpose | Doc |
|
|
265
|
-
|--------|---------|-----|
|
|
266
|
-
| Audio | Synthesized emotional sounds (`sound.play('joyful')`) | [audio](./audio.md) |
|
|
267
|
-
| Discovery | Cross-shadow-DOM component lookup | [discovery](./discovery.md) |
|
|
268
|
-
| RxJS utils | `waitForElement`, `waitUntil`, `mutationObserver` | [rxjs-utils](./rxjs-utils.md) |
|
|
269
|
-
| Utils | `similarity`, `numbers`, `overlayStack`, `intersection$`, `hashContent` | [utils](./utils.md) |
|
|
270
|
-
| Animation | Spring presets, `createAnimation`, Tailwind integration | [animation](./animation.md) |
|
|
271
|
-
|
|
272
|
-
---
|
|
273
|
-
|
|
274
|
-
# The 80/20 cheat sheet
|
|
275
|
-
|
|
276
|
-
If you're new to Schmancy and shipping a screen today, reach for these in this order:
|
|
277
|
-
|
|
278
|
-
1. **Wrap the app** in `<schmancy-theme root>` + `<schmancy-surface type="solid" fill="all">` + `<schmancy-scroll>`.
|
|
279
|
-
2. **Route** with `<schmancy-area name="root">` + `<schmancy-route>` + `lazy()`.
|
|
280
|
-
3. **Store** state in `createContext(..., 'local')` + `@select` in components.
|
|
281
|
-
4. **Extend** `$LitElement` in every component. Use `takeUntil(this.disconnecting)` for every subscription.
|
|
282
|
-
5. **Compose screens** from atoms: `schmancy-typography`, `schmancy-icon`, `schmancy-button`, `schmancy-surface`, `schmancy-divider`.
|
|
283
|
-
6. **Forms**: `schmancy-input` + `schmancy-chips` + `schmancy-checkbox` + `schmancy-form`. Reach for `schmancy-select` / `schmancy-autocomplete` only when needed.
|
|
284
|
-
7. **Overlays**: `$dialog()` + `$notify()` + `schmancyContentDrawer.open()` — service APIs, not template tags.
|
|
285
|
-
8. **Effects**: reach for `cursorGlow`, `magnetic`, `reveal`, `animateText` directives before writing CSS animations.
|
|
286
|
-
|
|
287
|
-
Everything else is demand-driven.
|
|
288
|
-
|
|
289
|
-
---
|
|
290
|
-
|
|
291
|
-
# Conventions (enforce these)
|
|
292
|
-
|
|
293
|
-
- **Lists use `repeat(items, item => item.id, tpl)`** — never `.map()` in templates.
|
|
294
|
-
- **View switching uses `cache(...)`** — preserves DOM and state.
|
|
295
|
-
- **Expensive work uses `guard([deps], fn)`** — memoizes against identity changes.
|
|
296
|
-
- **DOM access uses `ref(createRef())`** — never `querySelector` for own shadow tree if a ref will do.
|
|
297
|
-
- **Conditionals use `when(...)` / `choose(...)` / `ifDefined(...)`** — cleaner than ternaries.
|
|
298
|
-
- **All subscriptions use `.pipe(takeUntil(this.disconnecting))`** — no manual unsubscribe.
|
|
299
|
-
- **No `setTimeout` / `setInterval` / `addEventListener`** — use RxJS (`timer`, `interval`, `fromEvent`).
|
|
300
|
-
- **No hardcoded colors** — use `--schmancy-sys-color-*` CSS vars or Tailwind theme classes.
|
|
301
|
-
- **No mixing `classMap` with string interpolation** — it must be the sole expression in `class=`.
|
|
302
|
-
- **ARIA wiring on combobox forms**: `role="combobox"` + `aria-haspopup="listbox"` + `aria-expanded` + `aria-controls` + a `#live-status` live region.
|
|
303
|
-
- **Overlay z-index**: always go through `overlayStack` (dialogs/sheets/windows already do).
|
|
304
|
-
|
|
305
|
-
---
|
|
306
|
-
|
|
307
|
-
# Services reference (import these by name)
|
|
308
|
-
|
|
309
|
-
| Service | From | Purpose |
|
|
310
|
-
|---------|------|---------|
|
|
311
|
-
| `area` | `@mhmo91/schmancy` | Router imperative API |
|
|
312
|
-
| `$dialog` | `@mhmo91/schmancy` | Modal/confirm dialogs |
|
|
313
|
-
| `$notify` | `@mhmo91/schmancy` | Toast notifications |
|
|
314
|
-
| `schmancyContentDrawer` | `@mhmo91/schmancy` | Side panel |
|
|
315
|
-
| `theme` | `@mhmo91/schmancy` | Theme state + fullscreen$ |
|
|
316
|
-
| `sound` | `@mhmo91/schmancy` | Emotional sounds |
|
|
317
|
-
| `overlayStack` | `@mhmo91/schmancy` | Z-index coordinator |
|
|
318
|
-
| `windowManager` | `@mhmo91/schmancy/window` | Window registry |
|
|
319
|
-
| `teleportationService` | `@mhmo91/schmancy/teleport` | Teleport coordination |
|
|
320
|
-
| `reducedMotion$` | `@mhmo91/schmancy/directives` | Reactive reduced-motion preference |
|
|
321
|
-
| `fromResizeObserver` | `@mhmo91/schmancy/directives` | RxJS ResizeObserver |
|
|
64
|
+
- Lists use `repeat(items, item => item.id, tpl)`.
|
|
65
|
+
- View switching uses `cache(...)`.
|
|
66
|
+
- Expensive work uses `guard([deps], fn)`.
|
|
67
|
+
- DOM access uses `ref(createRef())`.
|
|
68
|
+
- Conditionals use `when(...)`, `choose(...)`, `ifDefined(...)`.
|
|
69
|
+
- All RxJS subscriptions end with `.pipe(takeUntil(this.disconnecting))`.
|
|
70
|
+
- Don't use `setTimeout` / `setInterval` / `addEventListener` — use RxJS (`timer`, `interval`, `fromEvent`).
|
|
71
|
+
- Colors come from `--schmancy-sys-color-*` CSS vars or Tailwind theme classes.
|
|
72
|
+
- `classMap(...)` must be the sole expression in `class=`; never mix with string interpolation.
|