@mhmo91/schmancy 0.9.3 → 0.9.5
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/.claude-plugin/plugin.json +13 -0
- package/README.md +14 -4
- package/dist/.claude-plugin/plugin.json +13 -0
- 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/skills/INDEX.md +72 -0
- package/dist/skills/SKILL.md +120 -0
- package/dist/skills/area.md +141 -0
- package/{ai → dist/skills}/mailbox.md +1 -1
- package/dist/skills/mixins.md +99 -0
- package/dist/skills/schmancy/INDEX.md +72 -0
- package/dist/skills/schmancy/SKILL.md +120 -0
- package/dist/skills/schmancy/area.md +141 -0
- package/dist/{ai → skills/schmancy}/mailbox.md +1 -1
- package/dist/skills/schmancy/mixins.md +99 -0
- package/dist/skills/schmancy/store.md +126 -0
- package/dist/skills/store.md +126 -0
- 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 +3 -4
- package/skills/schmancy/INDEX.md +72 -0
- package/skills/schmancy/SKILL.md +120 -0
- package/skills/schmancy/animation.md +64 -0
- package/skills/schmancy/area.md +141 -0
- package/skills/schmancy/audio.md +69 -0
- package/skills/schmancy/autocomplete.md +53 -0
- package/skills/schmancy/avatar.md +47 -0
- package/skills/schmancy/badge.md +41 -0
- package/skills/schmancy/boat.md +47 -0
- package/skills/schmancy/busy.md +36 -0
- package/skills/schmancy/button.md +59 -0
- package/skills/schmancy/card.md +53 -0
- package/skills/schmancy/charts.md +93 -0
- package/skills/schmancy/checkbox.md +36 -0
- package/skills/schmancy/chips.md +87 -0
- package/skills/schmancy/code-highlight.md +47 -0
- package/skills/schmancy/connectivity.md +36 -0
- package/skills/schmancy/content-drawer.md +65 -0
- package/skills/schmancy/date-range-inline.md +44 -0
- package/skills/schmancy/date-range.md +50 -0
- package/skills/schmancy/delay.md +50 -0
- package/skills/schmancy/details.md +66 -0
- package/skills/schmancy/dialog.md +69 -0
- package/skills/schmancy/directives.md +298 -0
- package/skills/schmancy/discovery.md +67 -0
- package/skills/schmancy/divider.md +31 -0
- package/skills/schmancy/dropdown.md +47 -0
- package/skills/schmancy/expand.md +63 -0
- package/skills/schmancy/extra.md +59 -0
- package/skills/schmancy/float.md +14 -0
- package/skills/schmancy/form.md +49 -0
- package/skills/schmancy/icons.md +44 -0
- package/skills/schmancy/iframe.md +44 -0
- package/skills/schmancy/input.md +56 -0
- package/skills/schmancy/json.md +33 -0
- package/skills/schmancy/layout.md +63 -0
- package/skills/schmancy/lightbox.md +36 -0
- package/skills/schmancy/list.md +67 -0
- package/skills/schmancy/mailbox.md +102 -0
- package/skills/schmancy/map.md +55 -0
- package/skills/schmancy/menu.md +39 -0
- package/skills/schmancy/mixins.md +99 -0
- package/skills/schmancy/nav-drawer.md +52 -0
- package/skills/schmancy/navigation-bar.md +48 -0
- package/skills/schmancy/navigation-rail.md +62 -0
- package/skills/schmancy/notification.md +60 -0
- package/skills/schmancy/option.md +43 -0
- package/skills/schmancy/page.md +42 -0
- package/skills/schmancy/progress.md +30 -0
- package/skills/schmancy/qr-scanner.md +51 -0
- package/skills/schmancy/radio-group.md +50 -0
- package/skills/schmancy/range.md +47 -0
- package/skills/schmancy/rxjs-utils.md +60 -0
- package/skills/schmancy/select.md +49 -0
- package/skills/schmancy/sheet.md +76 -0
- package/skills/schmancy/slider.md +43 -0
- package/skills/schmancy/steps.md +53 -0
- package/skills/schmancy/store.md +126 -0
- package/skills/schmancy/surface.md +86 -0
- package/skills/schmancy/table.md +60 -0
- package/skills/schmancy/tabs.md +49 -0
- package/skills/schmancy/teleport.md +55 -0
- package/skills/schmancy/textarea.md +48 -0
- package/skills/schmancy/theme-button.md +26 -0
- package/skills/schmancy/theme.md +58 -0
- package/skills/schmancy/tooltip.md +38 -0
- package/skills/schmancy/tree.md +53 -0
- package/skills/schmancy/typewriter.md +46 -0
- package/skills/schmancy/typography.md +53 -0
- package/skills/schmancy/utils.md +95 -0
- package/skills/schmancy/window.md +67 -0
- 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/ai/INDEX.md +0 -321
- package/ai/area.md +0 -215
- package/ai/mixins.md +0 -201
- package/ai/store.md +0 -192
- package/dist/ai/INDEX.md +0 -321
- package/dist/ai/area.md +0 -215
- package/dist/ai/mixins.md +0 -201
- package/dist/ai/store.md +0 -192
- 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 → dist/skills}/animation.md +0 -0
- /package/{ai → dist/skills}/audio.md +0 -0
- /package/{ai → dist/skills}/autocomplete.md +0 -0
- /package/{ai → dist/skills}/avatar.md +0 -0
- /package/{ai → dist/skills}/badge.md +0 -0
- /package/{ai → dist/skills}/boat.md +0 -0
- /package/{ai → dist/skills}/busy.md +0 -0
- /package/{ai → dist/skills}/button.md +0 -0
- /package/{ai → dist/skills}/card.md +0 -0
- /package/{ai → dist/skills}/charts.md +0 -0
- /package/{ai → dist/skills}/checkbox.md +0 -0
- /package/{ai → dist/skills}/chips.md +0 -0
- /package/{ai → dist/skills}/code-highlight.md +0 -0
- /package/{ai → dist/skills}/connectivity.md +0 -0
- /package/{ai → dist/skills}/content-drawer.md +0 -0
- /package/{ai → dist/skills}/date-range-inline.md +0 -0
- /package/{ai → dist/skills}/date-range.md +0 -0
- /package/{ai → dist/skills}/delay.md +0 -0
- /package/{ai → dist/skills}/details.md +0 -0
- /package/{ai → dist/skills}/dialog.md +0 -0
- /package/{ai → dist/skills}/directives.md +0 -0
- /package/{ai → dist/skills}/discovery.md +0 -0
- /package/{ai → dist/skills}/divider.md +0 -0
- /package/{ai → dist/skills}/dropdown.md +0 -0
- /package/{ai → dist/skills}/expand.md +0 -0
- /package/{ai → dist/skills}/extra.md +0 -0
- /package/{ai → dist/skills}/float.md +0 -0
- /package/{ai → dist/skills}/form.md +0 -0
- /package/{ai → dist/skills}/icons.md +0 -0
- /package/{ai → dist/skills}/iframe.md +0 -0
- /package/{ai → dist/skills}/input.md +0 -0
- /package/{ai → dist/skills}/json.md +0 -0
- /package/{ai → dist/skills}/layout.md +0 -0
- /package/{ai → dist/skills}/lightbox.md +0 -0
- /package/{ai → dist/skills}/list.md +0 -0
- /package/{ai → dist/skills}/map.md +0 -0
- /package/{ai → dist/skills}/menu.md +0 -0
- /package/{ai → dist/skills}/nav-drawer.md +0 -0
- /package/{ai → dist/skills}/navigation-bar.md +0 -0
- /package/{ai → dist/skills}/navigation-rail.md +0 -0
- /package/{ai → dist/skills}/notification.md +0 -0
- /package/{ai → dist/skills}/option.md +0 -0
- /package/{ai → dist/skills}/page.md +0 -0
- /package/{ai → dist/skills}/progress.md +0 -0
- /package/{ai → dist/skills}/qr-scanner.md +0 -0
- /package/{ai → dist/skills}/radio-group.md +0 -0
- /package/{ai → dist/skills}/range.md +0 -0
- /package/{ai → dist/skills}/rxjs-utils.md +0 -0
- /package/dist/{ai → skills/schmancy}/animation.md +0 -0
- /package/dist/{ai → skills/schmancy}/audio.md +0 -0
- /package/dist/{ai → skills/schmancy}/autocomplete.md +0 -0
- /package/dist/{ai → skills/schmancy}/avatar.md +0 -0
- /package/dist/{ai → skills/schmancy}/badge.md +0 -0
- /package/dist/{ai → skills/schmancy}/boat.md +0 -0
- /package/dist/{ai → skills/schmancy}/busy.md +0 -0
- /package/dist/{ai → skills/schmancy}/button.md +0 -0
- /package/dist/{ai → skills/schmancy}/card.md +0 -0
- /package/dist/{ai → skills/schmancy}/charts.md +0 -0
- /package/dist/{ai → skills/schmancy}/checkbox.md +0 -0
- /package/dist/{ai → skills/schmancy}/chips.md +0 -0
- /package/dist/{ai → skills/schmancy}/code-highlight.md +0 -0
- /package/dist/{ai → skills/schmancy}/connectivity.md +0 -0
- /package/dist/{ai → skills/schmancy}/content-drawer.md +0 -0
- /package/dist/{ai → skills/schmancy}/date-range-inline.md +0 -0
- /package/dist/{ai → skills/schmancy}/date-range.md +0 -0
- /package/dist/{ai → skills/schmancy}/delay.md +0 -0
- /package/dist/{ai → skills/schmancy}/details.md +0 -0
- /package/dist/{ai → skills/schmancy}/dialog.md +0 -0
- /package/dist/{ai → skills/schmancy}/directives.md +0 -0
- /package/dist/{ai → skills/schmancy}/discovery.md +0 -0
- /package/dist/{ai → skills/schmancy}/divider.md +0 -0
- /package/dist/{ai → skills/schmancy}/dropdown.md +0 -0
- /package/dist/{ai → skills/schmancy}/expand.md +0 -0
- /package/dist/{ai → skills/schmancy}/extra.md +0 -0
- /package/dist/{ai → skills/schmancy}/float.md +0 -0
- /package/dist/{ai → skills/schmancy}/form.md +0 -0
- /package/dist/{ai → skills/schmancy}/icons.md +0 -0
- /package/dist/{ai → skills/schmancy}/iframe.md +0 -0
- /package/dist/{ai → skills/schmancy}/input.md +0 -0
- /package/dist/{ai → skills/schmancy}/json.md +0 -0
- /package/dist/{ai → skills/schmancy}/layout.md +0 -0
- /package/dist/{ai → skills/schmancy}/lightbox.md +0 -0
- /package/dist/{ai → skills/schmancy}/list.md +0 -0
- /package/dist/{ai → skills/schmancy}/map.md +0 -0
- /package/dist/{ai → skills/schmancy}/menu.md +0 -0
- /package/dist/{ai → skills/schmancy}/nav-drawer.md +0 -0
- /package/dist/{ai → skills/schmancy}/navigation-bar.md +0 -0
- /package/dist/{ai → skills/schmancy}/navigation-rail.md +0 -0
- /package/dist/{ai → skills/schmancy}/notification.md +0 -0
- /package/dist/{ai → skills/schmancy}/option.md +0 -0
- /package/dist/{ai → skills/schmancy}/page.md +0 -0
- /package/dist/{ai → skills/schmancy}/progress.md +0 -0
- /package/dist/{ai → skills/schmancy}/qr-scanner.md +0 -0
- /package/dist/{ai → skills/schmancy}/radio-group.md +0 -0
- /package/dist/{ai → skills/schmancy}/range.md +0 -0
- /package/dist/{ai → skills/schmancy}/rxjs-utils.md +0 -0
- /package/{ai → dist/skills/schmancy}/select.md +0 -0
- /package/{ai → dist/skills/schmancy}/sheet.md +0 -0
- /package/{ai → dist/skills/schmancy}/slider.md +0 -0
- /package/{ai → dist/skills/schmancy}/steps.md +0 -0
- /package/{ai → dist/skills/schmancy}/surface.md +0 -0
- /package/{ai → dist/skills/schmancy}/table.md +0 -0
- /package/{ai → dist/skills/schmancy}/tabs.md +0 -0
- /package/{ai → dist/skills/schmancy}/teleport.md +0 -0
- /package/{ai → dist/skills/schmancy}/textarea.md +0 -0
- /package/{ai → dist/skills/schmancy}/theme-button.md +0 -0
- /package/{ai → dist/skills/schmancy}/theme.md +0 -0
- /package/{ai → dist/skills/schmancy}/tooltip.md +0 -0
- /package/{ai → dist/skills/schmancy}/tree.md +0 -0
- /package/{ai → dist/skills/schmancy}/typewriter.md +0 -0
- /package/{ai → dist/skills/schmancy}/typography.md +0 -0
- /package/{ai → dist/skills/schmancy}/utils.md +0 -0
- /package/{ai → dist/skills/schmancy}/window.md +0 -0
- /package/dist/{ai → skills}/select.md +0 -0
- /package/dist/{ai → skills}/sheet.md +0 -0
- /package/dist/{ai → skills}/slider.md +0 -0
- /package/dist/{ai → skills}/steps.md +0 -0
- /package/dist/{ai → skills}/surface.md +0 -0
- /package/dist/{ai → skills}/table.md +0 -0
- /package/dist/{ai → skills}/tabs.md +0 -0
- /package/dist/{ai → skills}/teleport.md +0 -0
- /package/dist/{ai → skills}/textarea.md +0 -0
- /package/dist/{ai → skills}/theme-button.md +0 -0
- /package/dist/{ai → skills}/theme.md +0 -0
- /package/dist/{ai → skills}/tooltip.md +0 -0
- /package/dist/{ai → skills}/tree.md +0 -0
- /package/dist/{ai → skills}/typewriter.md +0 -0
- /package/dist/{ai → skills}/typography.md +0 -0
- /package/dist/{ai → skills}/utils.md +0 -0
- /package/dist/{ai → skills}/window.md +0 -0
package/ai/mixins.md
DELETED
|
@@ -1,201 +0,0 @@
|
|
|
1
|
-
# $LitElement — Base Class Foundation
|
|
2
|
-
|
|
3
|
-
> **Every Schmancy component extends `$LitElement`. No exceptions.**
|
|
4
|
-
> It wires RxJS cleanup, Tailwind, cross-shadow discovery, and a few quality-of-life helpers into every element — so you never write that plumbing yourself.
|
|
5
|
-
|
|
6
|
-
## The minimal component
|
|
7
|
-
|
|
8
|
-
```typescript
|
|
9
|
-
import { $LitElement } from '@mhmo91/schmancy/mixins'
|
|
10
|
-
import { customElement } from 'lit/decorators.js'
|
|
11
|
-
import { css, html } from 'lit'
|
|
12
|
-
|
|
13
|
-
@customElement('my-card')
|
|
14
|
-
class MyCard extends $LitElement(css`
|
|
15
|
-
:host { display: block; }
|
|
16
|
-
`) {
|
|
17
|
-
render() {
|
|
18
|
-
return html`<slot></slot>`
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
That's it. You now get the five things below for free.
|
|
24
|
-
|
|
25
|
-
## What `$LitElement` gives you
|
|
26
|
-
|
|
27
|
-
### 1. `disconnecting` — automatic RxJS cleanup
|
|
28
|
-
```typescript
|
|
29
|
-
connectedCallback() {
|
|
30
|
-
super.connectedCallback()
|
|
31
|
-
|
|
32
|
-
userContext.$.pipe(
|
|
33
|
-
takeUntil(this.disconnecting),
|
|
34
|
-
).subscribe(user => this.user = user)
|
|
35
|
-
}
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
`disconnecting` is a `Subject<void>` that emits once when the element is detached from the DOM. Paired with `takeUntil`, it makes the entire Schmancy codebase manual-unsubscribe-free.
|
|
39
|
-
|
|
40
|
-
**This is the single most-used line in a Schmancy app.** If you see an RxJS pipe without `takeUntil(this.disconnecting)` — it's a leak.
|
|
41
|
-
|
|
42
|
-
### 2. `classMap(obj)` — space-splitting enhanced
|
|
43
|
-
```typescript
|
|
44
|
-
render() {
|
|
45
|
-
return html`
|
|
46
|
-
<div class=${this.classMap({
|
|
47
|
-
'flex items-center gap-2': true,
|
|
48
|
-
'bg-primary-default': this.active,
|
|
49
|
-
'opacity-50 pointer-events-none': this.disabled,
|
|
50
|
-
})}>
|
|
51
|
-
…
|
|
52
|
-
</div>
|
|
53
|
-
`
|
|
54
|
-
}
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
Unlike standard Lit `classMap`, keys can be **space-separated** ("flex items-center gap-2"). Combined with Tailwind, you write natural class strings instead of one-class-per-key.
|
|
58
|
-
|
|
59
|
-
**Hard rule:** `class=${this.classMap(...)}` must be the *sole* expression in `class=`. You cannot mix it with string interpolation (` class="foo ${this.classMap(...)}"`) — Lit will fail silently.
|
|
60
|
-
|
|
61
|
-
### 3. `styleMap(obj)` — inline styles (passthrough)
|
|
62
|
-
```typescript
|
|
63
|
-
render() {
|
|
64
|
-
return html`
|
|
65
|
-
<div style=${this.styleMap({
|
|
66
|
-
width: `${this.size}px`,
|
|
67
|
-
opacity: this.visible ? 1 : 0,
|
|
68
|
-
})}></div>
|
|
69
|
-
`
|
|
70
|
-
}
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
Direct passthrough to Lit's `styleMap` directive, exposed as a method so you don't have to import it in every component.
|
|
74
|
-
|
|
75
|
-
### 4. `discover<T>(tag)` — cross-shadow component lookup
|
|
76
|
-
```typescript
|
|
77
|
-
connectedCallback() {
|
|
78
|
-
super.connectedCallback()
|
|
79
|
-
|
|
80
|
-
this.discover<SchmancyDialog>('schmancy-dialog').pipe(
|
|
81
|
-
takeUntil(this.disconnecting),
|
|
82
|
-
).subscribe(dialog => dialog?.setDefaultAction('confirm'))
|
|
83
|
-
}
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
Broadcasts a `{tag}-where-are-you` event. Any mounted `$LitElement` with that tag responds with itself. Works **across shadow DOM boundaries** — zero traversal.
|
|
87
|
-
|
|
88
|
-
### 5. Auto-response to discovery events
|
|
89
|
-
Every `$LitElement` automatically answers `{its-tag}-where-are-you` by dispatching `{its-tag}-here-i-am` with `{ detail: { component: this } }`. You opt in by extending — opt out by not.
|
|
90
|
-
|
|
91
|
-
## Tailwind support
|
|
92
|
-
|
|
93
|
-
Styles you import are pre-processed through the Schmancy Tailwind pipeline. Tailwind utility classes work in both the host and slotted content. All theme CSS variables (`--schmancy-sys-color-primary-default`, etc.) resolve inside the component's shadow root.
|
|
94
|
-
|
|
95
|
-
```typescript
|
|
96
|
-
// Works out of the box
|
|
97
|
-
render() {
|
|
98
|
-
return html`<div class="flex items-center gap-2 text-primary-default">…</div>`
|
|
99
|
-
}
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
## Extending with SCSS
|
|
103
|
-
|
|
104
|
-
For complex styling, import a `.scss?inline` file and pass it to `$LitElement`:
|
|
105
|
-
|
|
106
|
-
```typescript
|
|
107
|
-
import style from './my-card.scss?inline'
|
|
108
|
-
|
|
109
|
-
@customElement('my-card')
|
|
110
|
-
class MyCard extends $LitElement(style) {
|
|
111
|
-
// SCSS features: nesting, mixins, @layer
|
|
112
|
-
}
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
Simple components use template-literal CSS; complex ones use SCSS.
|
|
116
|
-
|
|
117
|
-
## Standard component shape
|
|
118
|
-
|
|
119
|
-
This is the skeleton 90% of Schmancy components follow:
|
|
120
|
-
|
|
121
|
-
```typescript
|
|
122
|
-
import { $LitElement } from '@mhmo91/schmancy/mixins'
|
|
123
|
-
import { css, html } from 'lit'
|
|
124
|
-
import { customElement, property, state } from 'lit/decorators.js'
|
|
125
|
-
import { Subject, takeUntil } from 'rxjs'
|
|
126
|
-
|
|
127
|
-
@customElement('my-component')
|
|
128
|
-
export class MyComponent extends $LitElement(css`
|
|
129
|
-
:host { display: block; }
|
|
130
|
-
`) {
|
|
131
|
-
// 1. Public API — reflected / typed
|
|
132
|
-
@property({ type: String, reflect: true }) variant: 'a' | 'b' = 'a'
|
|
133
|
-
@property({ type: Boolean, reflect: true }) disabled = false
|
|
134
|
-
|
|
135
|
-
// 2. Internal state
|
|
136
|
-
@state() private _open = false
|
|
137
|
-
|
|
138
|
-
// 3. Private RxJS subjects (if needed)
|
|
139
|
-
private _value$ = new Subject<string>()
|
|
140
|
-
|
|
141
|
-
// 4. Lifecycle
|
|
142
|
-
connectedCallback() {
|
|
143
|
-
super.connectedCallback()
|
|
144
|
-
this._value$.pipe(
|
|
145
|
-
debounceTime(150),
|
|
146
|
-
takeUntil(this.disconnecting),
|
|
147
|
-
).subscribe(v => this.handleValue(v))
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
// 5. Rendering
|
|
151
|
-
render() {
|
|
152
|
-
return html`
|
|
153
|
-
<div class=${this.classMap({
|
|
154
|
-
'flex items-center': true,
|
|
155
|
-
'opacity-50': this.disabled,
|
|
156
|
-
})}>
|
|
157
|
-
<slot></slot>
|
|
158
|
-
</div>
|
|
159
|
-
`
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
// 6. Public imperative API (if any)
|
|
163
|
-
public open() { this._open = true }
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
declare global {
|
|
167
|
-
interface HTMLElementTagNameMap {
|
|
168
|
-
'my-component': MyComponent
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
```
|
|
172
|
-
|
|
173
|
-
Guarantees from this shape:
|
|
174
|
-
- Every subscription dies with the element.
|
|
175
|
-
- Tailwind + theme tokens work.
|
|
176
|
-
- Component is discoverable from anywhere via `discover('my-component')`.
|
|
177
|
-
- Declared in the global tag map for TypeScript.
|
|
178
|
-
|
|
179
|
-
## Why not `LitElement` directly?
|
|
180
|
-
|
|
181
|
-
You can, but you'll re-implement:
|
|
182
|
-
- Manual unsubscribe handling in `disconnectedCallback` for every `Observable`.
|
|
183
|
-
- `classMap` space-splitting.
|
|
184
|
-
- Tailwind variable wiring.
|
|
185
|
-
- Cross-shadow discovery.
|
|
186
|
-
|
|
187
|
-
`$LitElement` is 200 lines of common-denominator plumbing that keeps apps consistent. Using it is the convention; not using it is the outlier.
|
|
188
|
-
|
|
189
|
-
## Rules
|
|
190
|
-
|
|
191
|
-
1. **Every custom element extends `$LitElement(style?)`.**
|
|
192
|
-
2. **Every RxJS subscription ends with `.pipe(takeUntil(this.disconnecting))`** — or you have a leak.
|
|
193
|
-
3. **Call `super.connectedCallback()` and `super.disconnectedCallback()`** when you override them.
|
|
194
|
-
4. **Don't mix `classMap` with string interpolation** in the same attribute.
|
|
195
|
-
5. **Prefer `ref(createRef())` over `querySelector`** for your own shadow tree.
|
|
196
|
-
6. **Register in `HTMLElementTagNameMap`** for TypeScript autocompletion.
|
|
197
|
-
|
|
198
|
-
## See also
|
|
199
|
-
- [store](./store.md) — contexts pair with `takeUntil(this.disconnecting)` for auto-cleaning subscriptions.
|
|
200
|
-
- [area](./area.md) — route components all extend `$LitElement`.
|
|
201
|
-
- [discovery](./discovery.md) — the discovery events `$LitElement` handles automatically.
|
package/ai/store.md
DELETED
|
@@ -1,192 +0,0 @@
|
|
|
1
|
-
# Store — State Foundation
|
|
2
|
-
|
|
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
|
|
24
|
-
|
|
25
|
-
```typescript
|
|
26
|
-
import { createContext } from '@mhmo91/schmancy'
|
|
27
|
-
|
|
28
|
-
// Object store — persisted to localStorage
|
|
29
|
-
export const userContext = createContext<User>(new User(), 'local', 'user')
|
|
30
|
-
|
|
31
|
-
// Collection store — Map keyed by id
|
|
32
|
-
export const contactsContext = createContext<Map<string, Contact>>(new Map(), 'memory', 'contacts')
|
|
33
|
-
|
|
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')
|
|
39
|
-
```
|
|
40
|
-
|
|
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`
|
|
57
|
-
|
|
58
|
-
```typescript
|
|
59
|
-
import { select } from '@mhmo91/schmancy'
|
|
60
|
-
|
|
61
|
-
@customElement('user-card')
|
|
62
|
-
class UserCard extends $LitElement() {
|
|
63
|
-
// Auto-subscribes, re-renders on change
|
|
64
|
-
@select(userContext) user!: User
|
|
65
|
-
|
|
66
|
-
// Selector function narrows the dependency
|
|
67
|
-
@select(contactsContext, m => m.size) contactCount!: number
|
|
68
|
-
|
|
69
|
-
// Collection → stays as Map
|
|
70
|
-
@select(contactsContext) contacts!: Map<string, Contact>
|
|
71
|
-
}
|
|
72
|
-
```
|
|
73
|
-
|
|
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
|
|
91
|
-
```typescript
|
|
92
|
-
userContext.set({ name: 'Alice', email: 'alice@test.com' })
|
|
93
|
-
userContext.set({ ...userContext.value, name: 'Bob' }) // partial update pattern
|
|
94
|
-
```
|
|
95
|
-
|
|
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
|
-
```
|
|
102
|
-
|
|
103
|
-
### Array store
|
|
104
|
-
```typescript
|
|
105
|
-
tagsContext.push('new-tag')
|
|
106
|
-
tagsContext.replace(['a', 'b', 'c'])
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
## Observable API
|
|
110
|
-
|
|
111
|
-
```typescript
|
|
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
|
-
```
|
|
123
|
-
|
|
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.
|
|
127
|
-
|
|
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.
|
|
130
|
-
|
|
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:
|
|
134
|
-
|
|
135
|
-
```typescript
|
|
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
|
-
}
|
|
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).
|