@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
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: schmancy
|
|
3
|
+
description: UI patterns, component APIs, and conventions for the @mhmo91/schmancy web-component library (Lit + RxJS + Tailwind). Activate whenever the user works on any <schmancy-*> tag, routing with schmancy-area, state with createContext/@select, the $LitElement base class, theme, directives, or overlay services ($dialog, $notify, schmancyContentDrawer, sheet).
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Schmancy
|
|
7
|
+
|
|
8
|
+
Web-component UI library on Lit + RxJS + Tailwind CSS. This skill bundles the full library reference as supporting files alongside this SKILL.md.
|
|
9
|
+
|
|
10
|
+
## How to use this skill
|
|
11
|
+
|
|
12
|
+
All reference files live in this directory. Read by filename.
|
|
13
|
+
|
|
14
|
+
1. **Start with `INDEX.md`** for the full catalog organized by job (foundations / atoms / forms / navigation / overlays / interaction / feedback / display).
|
|
15
|
+
2. **Before writing any `<schmancy-X>` tag**, read `X.md`. Example: `<schmancy-button>` → `button.md`.
|
|
16
|
+
3. **Before editing foundations** (routing, state, base class, theme), read the matching foundation file below.
|
|
17
|
+
4. **Apply the conventions** at the end of this file.
|
|
18
|
+
|
|
19
|
+
## Foundations (the framework pieces — touch first)
|
|
20
|
+
|
|
21
|
+
| Piece | Read |
|
|
22
|
+
|-------|------|
|
|
23
|
+
| Routing (`<schmancy-area>`, `<schmancy-route>`, `area.push()`, `lazy()`) | `area.md` |
|
|
24
|
+
| State (`createContext`, `@select`, `@selectItem`) | `store.md` |
|
|
25
|
+
| Base class (`$LitElement`) | `mixins.md` |
|
|
26
|
+
| Theme (`<schmancy-theme>`, `theme` service) | `theme.md` |
|
|
27
|
+
| Directives (`magnetic`, `cursorGlow`, `gravity`, `reveal`, `animateText`, …) | `directives.md` |
|
|
28
|
+
| Spring physics presets | `animation.md` |
|
|
29
|
+
|
|
30
|
+
## Overlay services (prefer over tags)
|
|
31
|
+
|
|
32
|
+
For modals, toasts, sheets, side drawers — reach for the **imperative service API** first:
|
|
33
|
+
|
|
34
|
+
```typescript
|
|
35
|
+
import { $dialog, $notify, schmancyContentDrawer, sheet, SchmancySheetPosition } from '@mhmo91/schmancy'
|
|
36
|
+
|
|
37
|
+
$dialog.component(new EditForm()) // modal
|
|
38
|
+
$dialog.component(new QuickPicker(), { position: e }) // anchored modal
|
|
39
|
+
$notify.success('Saved'); $notify.error('Failed') // toast
|
|
40
|
+
schmancyContentDrawer.open({ component: new Detail() }) // side panel
|
|
41
|
+
sheet.open({ component: new Picker(), position: SchmancySheetPosition.BOTTOM }) // bottom sheet
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
References: `dialog.md`, `notification.md`, `content-drawer.md`, `sheet.md`.
|
|
45
|
+
|
|
46
|
+
Use component tags (`<schmancy-menu>`, `<schmancy-dropdown>`, `<schmancy-tooltip>`, `<schmancy-lightbox>`, `<schmancy-expand>`) only when the tag is the natural fit (anchored panels, tooltips, galleries).
|
|
47
|
+
|
|
48
|
+
## Non-negotiable conventions
|
|
49
|
+
|
|
50
|
+
**Component authoring**
|
|
51
|
+
- Every component extends `$LitElement(style?)`. Never raw `LitElement`.
|
|
52
|
+
- Every RxJS subscription ends with `.pipe(takeUntil(this.disconnecting))`.
|
|
53
|
+
- Register the tag in `HTMLElementTagNameMap` for TypeScript.
|
|
54
|
+
|
|
55
|
+
**State**
|
|
56
|
+
- Contexts live at module scope. Many small contexts beat one monolith.
|
|
57
|
+
- Gate subscriptions with `filter(() => ctx.ready)` when reading persisted contexts.
|
|
58
|
+
- Storage tiers: `'memory'` (regenerable) · `'session'` (per-tab) · `'local'` (user prefs) · `'indexeddb'` (>100-entry collections).
|
|
59
|
+
|
|
60
|
+
**Routing**
|
|
61
|
+
- Route guards are `Observable<boolean>`, never cached booleans.
|
|
62
|
+
- `when="tag-name"` must exactly match `@customElement('tag-name')`.
|
|
63
|
+
- Lazy-load route components: `lazy(() => import('./page'))`.
|
|
64
|
+
- After auth/permission guards, use `historyStrategy: 'replace'` or `'pop'` — never `'push'`.
|
|
65
|
+
|
|
66
|
+
**Templates**
|
|
67
|
+
- Lists: `repeat(items, i => i.id, tpl)`. Never `.map()`.
|
|
68
|
+
- View switching: `cache(...)`.
|
|
69
|
+
- Expensive work: `guard([deps], () => expensive())`.
|
|
70
|
+
- Conditionals: `when(...)` / `choose(...)` / `ifDefined(...)`.
|
|
71
|
+
- DOM access: `ref(createRef())`.
|
|
72
|
+
- `classMap(this.classMap({...}))` must be the sole expression in `class=` — never mix with string interpolation.
|
|
73
|
+
|
|
74
|
+
**Styling**
|
|
75
|
+
- Colors: `--schmancy-sys-color-*` CSS vars or Tailwind theme classes. Never hardcoded hex.
|
|
76
|
+
- No `setTimeout` / `setInterval` / `addEventListener` — use RxJS (`timer`, `interval`, `fromEvent`).
|
|
77
|
+
|
|
78
|
+
**Accessibility (combobox forms)**
|
|
79
|
+
```typescript
|
|
80
|
+
role="combobox"
|
|
81
|
+
aria-haspopup="listbox"
|
|
82
|
+
aria-expanded=${this._open}
|
|
83
|
+
aria-controls="listbox-id"
|
|
84
|
+
```
|
|
85
|
+
Plus a live region: `<div id="live-status" role="status" aria-live="polite" class="sr-only"></div>`.
|
|
86
|
+
|
|
87
|
+
## Minimal app skeleton
|
|
88
|
+
|
|
89
|
+
```typescript
|
|
90
|
+
<schmancy-theme root scheme="dark">
|
|
91
|
+
<schmancy-surface type="solid" fill="all">
|
|
92
|
+
<schmancy-scroll>
|
|
93
|
+
<schmancy-area
|
|
94
|
+
name="root"
|
|
95
|
+
.default=${lazy(() => import('./home.page'))}
|
|
96
|
+
>
|
|
97
|
+
<schmancy-route when="home-page"
|
|
98
|
+
.component=${lazy(() => import('./home.page'))}></schmancy-route>
|
|
99
|
+
|
|
100
|
+
<schmancy-route when="app-index"
|
|
101
|
+
.component=${lazy(() => import('./app.page'))}
|
|
102
|
+
.guard=${authState$.pipe(
|
|
103
|
+
map(u => !!u),
|
|
104
|
+
takeUntil(this.disconnecting),
|
|
105
|
+
)}
|
|
106
|
+
@redirect=${() => area.push({
|
|
107
|
+
component: 'home-page', area: 'root', historyStrategy: 'replace',
|
|
108
|
+
})}></schmancy-route>
|
|
109
|
+
</schmancy-area>
|
|
110
|
+
</schmancy-scroll>
|
|
111
|
+
</schmancy-surface>
|
|
112
|
+
</schmancy-theme>
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## Workflow
|
|
116
|
+
|
|
117
|
+
1. User describes a UI task.
|
|
118
|
+
2. Read `INDEX.md` to find the relevant components or foundations.
|
|
119
|
+
3. Read the specific `.md` files for the APIs involved.
|
|
120
|
+
4. Write code that follows the conventions above.
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# Area — Routing
|
|
2
|
+
|
|
3
|
+
Schmancy's client-side router. Three pieces:
|
|
4
|
+
|
|
5
|
+
| Piece | Role |
|
|
6
|
+
|-------|------|
|
|
7
|
+
| `<schmancy-area name="...">` | Named region that renders one route at a time |
|
|
8
|
+
| `<schmancy-route when="tag">` | Declares which component can render in an area |
|
|
9
|
+
| `area.push(...)` | Imperative navigation |
|
|
10
|
+
|
|
11
|
+
Areas can be nested to compose shell-plus-sub-view layouts.
|
|
12
|
+
|
|
13
|
+
## Example
|
|
14
|
+
|
|
15
|
+
```html
|
|
16
|
+
<schmancy-area name="root" .default=${lazy(() => import('./pages/home.page'))}>
|
|
17
|
+
<schmancy-route when="home-page"
|
|
18
|
+
.component=${lazy(() => import('./pages/home.page'))}></schmancy-route>
|
|
19
|
+
|
|
20
|
+
<schmancy-route when="app-index"
|
|
21
|
+
.component=${lazy(() => import('./app/app.page'))}
|
|
22
|
+
.guard=${authState$.pipe(
|
|
23
|
+
map(u => !!u && !u.isAnonymous),
|
|
24
|
+
takeUntil(this.disconnecting),
|
|
25
|
+
)}
|
|
26
|
+
@redirect=${() => area.push({
|
|
27
|
+
component: 'home-page',
|
|
28
|
+
area: 'root',
|
|
29
|
+
historyStrategy: 'replace',
|
|
30
|
+
})}></schmancy-route>
|
|
31
|
+
</schmancy-area>
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## `schmancy-area` properties
|
|
35
|
+
|
|
36
|
+
| Property | Type | Description |
|
|
37
|
+
|----------|------|-------------|
|
|
38
|
+
| `name` | string (required) | Area identifier used in `area.push({ area })` |
|
|
39
|
+
| `default` | `RouteComponent \| string` | Fallback when no route matches |
|
|
40
|
+
|
|
41
|
+
## `schmancy-route` properties
|
|
42
|
+
|
|
43
|
+
| Property | Type | Description |
|
|
44
|
+
|----------|------|-------------|
|
|
45
|
+
| `when` | string (required) | Must match a `@customElement('tag')` tag name |
|
|
46
|
+
| `component` | `RouteComponent` (required) | Class, tag name, or `lazy()` wrapper |
|
|
47
|
+
| `guard` | `Observable<boolean>` | When emits `false`, blocks and dispatches `redirect` event |
|
|
48
|
+
| `exact` | boolean | Strict-equality matching |
|
|
49
|
+
|
|
50
|
+
## `area` service
|
|
51
|
+
|
|
52
|
+
```typescript
|
|
53
|
+
import { area } from '@mhmo91/schmancy'
|
|
54
|
+
|
|
55
|
+
area.push({
|
|
56
|
+
area: 'root',
|
|
57
|
+
component: 'app-index',
|
|
58
|
+
params?: { id: '123' },
|
|
59
|
+
historyStrategy?: 'push' | 'replace' | 'silent',
|
|
60
|
+
})
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
`historyStrategy`:
|
|
64
|
+
- `'push'` (default) — adds a browser-history entry
|
|
65
|
+
- `'replace'` — overwrites the current entry (use after guards or redirects)
|
|
66
|
+
- `'silent'` — changes the area without touching history
|
|
67
|
+
|
|
68
|
+
### Subscribe to route state
|
|
69
|
+
|
|
70
|
+
```typescript
|
|
71
|
+
area.on('root').pipe(
|
|
72
|
+
takeUntil(this.disconnecting),
|
|
73
|
+
).subscribe(route => { /* route.component, route.params */ })
|
|
74
|
+
|
|
75
|
+
area.params<{ id: string }>('detail').pipe(
|
|
76
|
+
takeUntil(this.disconnecting),
|
|
77
|
+
).subscribe(params => this.loadItem(params.id))
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Lazy loading
|
|
81
|
+
|
|
82
|
+
```typescript
|
|
83
|
+
import { lazy } from '@mhmo91/schmancy'
|
|
84
|
+
const HomePage = lazy(() => import('./home.page'))
|
|
85
|
+
|
|
86
|
+
// Optional preload
|
|
87
|
+
html`<button @mouseenter=${() => HomePage.preload()}>Home</button>`
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Guards
|
|
91
|
+
|
|
92
|
+
`guard` is an Observable<boolean>.
|
|
93
|
+
|
|
94
|
+
- Emits `true` → route renders.
|
|
95
|
+
- Emits `false` → route dispatches a `redirect` event. Handle it with `area.push(...)`.
|
|
96
|
+
|
|
97
|
+
Auth guard:
|
|
98
|
+
|
|
99
|
+
```typescript
|
|
100
|
+
<schmancy-route when="app-index"
|
|
101
|
+
.component=${lazy(() => import('./app'))}
|
|
102
|
+
.guard=${authState$.pipe(
|
|
103
|
+
map(u => !!u),
|
|
104
|
+
takeUntil(this.disconnecting),
|
|
105
|
+
)}
|
|
106
|
+
@redirect=${() => area.push({
|
|
107
|
+
component: 'home-page', area: 'root', historyStrategy: 'replace',
|
|
108
|
+
})}></schmancy-route>
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Compound guard (multiple streams):
|
|
112
|
+
|
|
113
|
+
```typescript
|
|
114
|
+
.guard=${combineLatest([permissions$, orgContext.$]).pipe(
|
|
115
|
+
takeUntil(this.disconnecting),
|
|
116
|
+
map(([perms, org]) => perms.includes('billing.view') && org?.billing?.configured),
|
|
117
|
+
)}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
## Nested areas
|
|
121
|
+
|
|
122
|
+
Areas nest by rendering an inner `<schmancy-area>` inside a route component. A common shape is an outer area for "signed-in vs. not" and an inner area for sub-views of the signed-in shell.
|
|
123
|
+
|
|
124
|
+
```html
|
|
125
|
+
<!-- outer -->
|
|
126
|
+
<schmancy-area name="root">
|
|
127
|
+
<schmancy-route when="app-index" .component=${AppShell}></schmancy-route>
|
|
128
|
+
</schmancy-area>
|
|
129
|
+
|
|
130
|
+
<!-- inner (inside AppShell.render()) -->
|
|
131
|
+
<schmancy-area name="app" default="home-page">
|
|
132
|
+
<schmancy-route when="home-page" .component=${...}></schmancy-route>
|
|
133
|
+
<schmancy-route when="settings-page" .component=${...}></schmancy-route>
|
|
134
|
+
</schmancy-area>
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## Rules
|
|
138
|
+
|
|
139
|
+
- `when="tag-name"` must match `@customElement('tag-name')` exactly.
|
|
140
|
+
- Guards emit `false` → always use `historyStrategy: 'replace'` in the `@redirect` handler.
|
|
141
|
+
- Every subscription in guards / route state uses `takeUntil(this.disconnecting)`.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Schmancy Mailbox
|
|
2
2
|
|
|
3
|
-
> Full email composition + campaign management system. Orchestrates recipients, templates, editor, attachments, and preview.
|
|
3
|
+
> Full email composition + campaign management system. Orchestrates recipients, templates, editor, attachments, and preview.
|
|
4
4
|
|
|
5
5
|
## Components
|
|
6
6
|
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# `$LitElement`
|
|
2
|
+
|
|
3
|
+
Base class for Schmancy components. Extends `LitElement` with RxJS cleanup, Tailwind support, and cross-shadow discovery.
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
import { $LitElement } from '@mhmo91/schmancy/mixins'
|
|
9
|
+
import { customElement } from 'lit/decorators.js'
|
|
10
|
+
import { css, html } from 'lit'
|
|
11
|
+
|
|
12
|
+
@customElement('my-component')
|
|
13
|
+
class MyComponent extends $LitElement(css`
|
|
14
|
+
:host { display: block; }
|
|
15
|
+
`) {
|
|
16
|
+
render() {
|
|
17
|
+
return html`<slot></slot>`
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
`$LitElement(style?)` accepts either a Lit `css` tagged literal or a string (e.g. SCSS imported with `?inline`).
|
|
23
|
+
|
|
24
|
+
## Provided members
|
|
25
|
+
|
|
26
|
+
### `disconnecting: Subject<void>`
|
|
27
|
+
Emits once when the element disconnects. Pair with `takeUntil` for cleanup:
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
connectedCallback() {
|
|
31
|
+
super.connectedCallback()
|
|
32
|
+
someObservable$.pipe(
|
|
33
|
+
takeUntil(this.disconnecting),
|
|
34
|
+
).subscribe()
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### `classMap(obj)`
|
|
39
|
+
Wraps Lit's `classMap` so keys can be space-separated:
|
|
40
|
+
|
|
41
|
+
```typescript
|
|
42
|
+
html`<div class=${this.classMap({
|
|
43
|
+
'flex items-center gap-2': true,
|
|
44
|
+
'opacity-50': this.disabled,
|
|
45
|
+
})}></div>`
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Must be the only expression in `class=` — don't mix with string interpolation.
|
|
49
|
+
|
|
50
|
+
### `styleMap(obj)`
|
|
51
|
+
Passthrough to Lit's `styleMap`.
|
|
52
|
+
|
|
53
|
+
```typescript
|
|
54
|
+
html`<div style=${this.styleMap({ width: `${w}px` })}></div>`
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### `discover<T>(tag): Observable<T | null>`
|
|
58
|
+
Find another Schmancy component by tag via event-based handshake. Works across shadow DOM.
|
|
59
|
+
|
|
60
|
+
```typescript
|
|
61
|
+
this.discover<SchmancyDialog>('schmancy-dialog').pipe(
|
|
62
|
+
takeUntil(this.disconnecting),
|
|
63
|
+
).subscribe(dialog => dialog?.setDefaultAction('confirm'))
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### Auto-response to discovery
|
|
67
|
+
Every `$LitElement` responds to `{its-tag}-where-are-you` events with `{its-tag}-here-i-am` carrying `{ detail: { component: this } }`.
|
|
68
|
+
|
|
69
|
+
## Component skeleton
|
|
70
|
+
|
|
71
|
+
```typescript
|
|
72
|
+
@customElement('my-component')
|
|
73
|
+
export class MyComponent extends $LitElement(css`:host { display: block }`) {
|
|
74
|
+
@property({ type: String, reflect: true }) variant: 'a' | 'b' = 'a'
|
|
75
|
+
@state() private _open = false
|
|
76
|
+
|
|
77
|
+
connectedCallback() {
|
|
78
|
+
super.connectedCallback()
|
|
79
|
+
// subscriptions here, with takeUntil(this.disconnecting)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
render() {
|
|
83
|
+
return html`<slot></slot>`
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
declare global {
|
|
88
|
+
interface HTMLElementTagNameMap {
|
|
89
|
+
'my-component': MyComponent
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## Rules
|
|
95
|
+
|
|
96
|
+
- Call `super.connectedCallback()` / `super.disconnectedCallback()` when overriding.
|
|
97
|
+
- All RxJS subscriptions end with `.pipe(takeUntil(this.disconnecting))`.
|
|
98
|
+
- Register the tag in `HTMLElementTagNameMap` for TypeScript.
|
|
99
|
+
- Don't mix `classMap` with string interpolation in the same attribute.
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# Store — Context System
|
|
2
|
+
|
|
3
|
+
Reactive state management: `createContext`, `@select`, `@selectItem`.
|
|
4
|
+
|
|
5
|
+
## Creating a context
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
import { createContext } from '@mhmo91/schmancy'
|
|
9
|
+
|
|
10
|
+
// Object
|
|
11
|
+
const userContext = createContext<User>(new User(), 'local', 'user')
|
|
12
|
+
|
|
13
|
+
// Map (collection)
|
|
14
|
+
const itemsContext = createContext<Map<string, Item>>(new Map(), 'indexeddb', 'items')
|
|
15
|
+
|
|
16
|
+
// Array
|
|
17
|
+
const tagsContext = createContext<string[]>([], 'memory', 'tags')
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Signature: `createContext(initial, storage, key)`.
|
|
21
|
+
|
|
22
|
+
## Storage backends
|
|
23
|
+
|
|
24
|
+
| Mode | Backing | Survives refresh | Survives tab close | Capacity |
|
|
25
|
+
|------|---------|------------------|--------------------|----------|
|
|
26
|
+
| `'memory'` | JS heap | ❌ | ❌ | RAM |
|
|
27
|
+
| `'session'` | `sessionStorage` | ✅ | ❌ (per-tab) | ~5 MB |
|
|
28
|
+
| `'local'` | `localStorage` | ✅ | ✅ | ~5 MB |
|
|
29
|
+
| `'indexeddb'` | IndexedDB | ✅ | ✅ | GB |
|
|
30
|
+
|
|
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'`
|
|
36
|
+
|
|
37
|
+
## Reading with `@select`
|
|
38
|
+
|
|
39
|
+
```typescript
|
|
40
|
+
import { select } from '@mhmo91/schmancy'
|
|
41
|
+
|
|
42
|
+
@customElement('my-component')
|
|
43
|
+
class MyComponent extends $LitElement() {
|
|
44
|
+
@select(userContext) user!: User
|
|
45
|
+
|
|
46
|
+
// Selector narrows the dependency
|
|
47
|
+
@select(itemsContext, m => m.size) count!: number
|
|
48
|
+
|
|
49
|
+
@select(itemsContext) items!: Map<string, Item>
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
`@select` options:
|
|
54
|
+
- `required` (default `true`) — wait for `.ready` before `connectedCallback` completes.
|
|
55
|
+
- `updateOnly` — call `requestUpdate` without assigning.
|
|
56
|
+
- `deepClone` — `structuredClone` the value.
|
|
57
|
+
- `debug` — log every emission.
|
|
58
|
+
|
|
59
|
+
## `@selectItem`
|
|
60
|
+
|
|
61
|
+
Pick one entry from a collection context, keyed off a component property:
|
|
62
|
+
|
|
63
|
+
```typescript
|
|
64
|
+
@selectItem(itemsContext, component => component.itemId)
|
|
65
|
+
item!: Item | undefined
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Writing
|
|
69
|
+
|
|
70
|
+
```typescript
|
|
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'])
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Observable API
|
|
86
|
+
|
|
87
|
+
```typescript
|
|
88
|
+
userContext.$.pipe(
|
|
89
|
+
filter(() => userContext.ready),
|
|
90
|
+
takeUntil(this.disconnecting),
|
|
91
|
+
).subscribe(user => { /* ... */ })
|
|
92
|
+
|
|
93
|
+
userContext.value // synchronous snapshot
|
|
94
|
+
userContext.ready // true once the backing store has loaded
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Gate subscriptions on `.ready` — `'local'` / `'session'` / `'indexeddb'` contexts emit their default value before the real stored value hydrates.
|
|
98
|
+
|
|
99
|
+
## Dynamic contexts
|
|
100
|
+
|
|
101
|
+
For per-instance state with persistence, create the context inside `connectedCallback` with an instance-scoped key:
|
|
102
|
+
|
|
103
|
+
```typescript
|
|
104
|
+
private draftCtx: IStore<{ text: string }> | null = null
|
|
105
|
+
|
|
106
|
+
connectedCallback() {
|
|
107
|
+
super.connectedCallback()
|
|
108
|
+
if (this.draftKey) {
|
|
109
|
+
this.draftCtx = createContext<{ text: string }>(
|
|
110
|
+
{ text: '' },
|
|
111
|
+
'session',
|
|
112
|
+
this.draftKey,
|
|
113
|
+
)
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## Rules
|
|
119
|
+
|
|
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.
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# Store — Context System
|
|
2
|
+
|
|
3
|
+
Reactive state management: `createContext`, `@select`, `@selectItem`.
|
|
4
|
+
|
|
5
|
+
## Creating a context
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
import { createContext } from '@mhmo91/schmancy'
|
|
9
|
+
|
|
10
|
+
// Object
|
|
11
|
+
const userContext = createContext<User>(new User(), 'local', 'user')
|
|
12
|
+
|
|
13
|
+
// Map (collection)
|
|
14
|
+
const itemsContext = createContext<Map<string, Item>>(new Map(), 'indexeddb', 'items')
|
|
15
|
+
|
|
16
|
+
// Array
|
|
17
|
+
const tagsContext = createContext<string[]>([], 'memory', 'tags')
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Signature: `createContext(initial, storage, key)`.
|
|
21
|
+
|
|
22
|
+
## Storage backends
|
|
23
|
+
|
|
24
|
+
| Mode | Backing | Survives refresh | Survives tab close | Capacity |
|
|
25
|
+
|------|---------|------------------|--------------------|----------|
|
|
26
|
+
| `'memory'` | JS heap | ❌ | ❌ | RAM |
|
|
27
|
+
| `'session'` | `sessionStorage` | ✅ | ❌ (per-tab) | ~5 MB |
|
|
28
|
+
| `'local'` | `localStorage` | ✅ | ✅ | ~5 MB |
|
|
29
|
+
| `'indexeddb'` | IndexedDB | ✅ | ✅ | GB |
|
|
30
|
+
|
|
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'`
|
|
36
|
+
|
|
37
|
+
## Reading with `@select`
|
|
38
|
+
|
|
39
|
+
```typescript
|
|
40
|
+
import { select } from '@mhmo91/schmancy'
|
|
41
|
+
|
|
42
|
+
@customElement('my-component')
|
|
43
|
+
class MyComponent extends $LitElement() {
|
|
44
|
+
@select(userContext) user!: User
|
|
45
|
+
|
|
46
|
+
// Selector narrows the dependency
|
|
47
|
+
@select(itemsContext, m => m.size) count!: number
|
|
48
|
+
|
|
49
|
+
@select(itemsContext) items!: Map<string, Item>
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
`@select` options:
|
|
54
|
+
- `required` (default `true`) — wait for `.ready` before `connectedCallback` completes.
|
|
55
|
+
- `updateOnly` — call `requestUpdate` without assigning.
|
|
56
|
+
- `deepClone` — `structuredClone` the value.
|
|
57
|
+
- `debug` — log every emission.
|
|
58
|
+
|
|
59
|
+
## `@selectItem`
|
|
60
|
+
|
|
61
|
+
Pick one entry from a collection context, keyed off a component property:
|
|
62
|
+
|
|
63
|
+
```typescript
|
|
64
|
+
@selectItem(itemsContext, component => component.itemId)
|
|
65
|
+
item!: Item | undefined
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Writing
|
|
69
|
+
|
|
70
|
+
```typescript
|
|
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'])
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Observable API
|
|
86
|
+
|
|
87
|
+
```typescript
|
|
88
|
+
userContext.$.pipe(
|
|
89
|
+
filter(() => userContext.ready),
|
|
90
|
+
takeUntil(this.disconnecting),
|
|
91
|
+
).subscribe(user => { /* ... */ })
|
|
92
|
+
|
|
93
|
+
userContext.value // synchronous snapshot
|
|
94
|
+
userContext.ready // true once the backing store has loaded
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Gate subscriptions on `.ready` — `'local'` / `'session'` / `'indexeddb'` contexts emit their default value before the real stored value hydrates.
|
|
98
|
+
|
|
99
|
+
## Dynamic contexts
|
|
100
|
+
|
|
101
|
+
For per-instance state with persistence, create the context inside `connectedCallback` with an instance-scoped key:
|
|
102
|
+
|
|
103
|
+
```typescript
|
|
104
|
+
private draftCtx: IStore<{ text: string }> | null = null
|
|
105
|
+
|
|
106
|
+
connectedCallback() {
|
|
107
|
+
super.connectedCallback()
|
|
108
|
+
if (this.draftKey) {
|
|
109
|
+
this.draftCtx = createContext<{ text: string }>(
|
|
110
|
+
{ text: '' },
|
|
111
|
+
'session',
|
|
112
|
+
this.draftKey,
|
|
113
|
+
)
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## Rules
|
|
119
|
+
|
|
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/slider.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`./chunk-BCfY8kxB.cjs`);const e=require(`./tailwind.mixin-
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`./chunk-BCfY8kxB.cjs`);const e=require(`./tailwind.mixin-BF1Huas7.cjs`),t=require(`./litElement.mixin-3llHwB-8.cjs`);require(`./mixins.cjs`);let n=require(`rxjs`),r=require(`rxjs/operators`),i=require(`lit/decorators.js`),a=require(`lit`),o=require(`lit/directives/cache.js`);var s=class extends t.t(a.css`
|
|
2
2
|
:host {
|
|
3
3
|
display: block;
|
|
4
4
|
scroll-snap-align: center; /* If your slider uses scroll-snap */
|
package/dist/slider.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { i as e } from "./tailwind.mixin-
|
|
2
|
-
import { t } from "./litElement.mixin-
|
|
1
|
+
import { i as e } from "./tailwind.mixin-BCJOOX1_.js";
|
|
2
|
+
import { t } from "./litElement.mixin-6jJYHCrZ.js";
|
|
3
3
|
import "./mixins.js";
|
|
4
4
|
import { fromEvent as n } from "rxjs";
|
|
5
5
|
import { throttleTime as r } from "rxjs/operators";
|