@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,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)`.
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# Schmancy Audio
|
|
2
|
+
|
|
3
|
+
> Emotional sound service — synthesizes short, empathetic sounds via Web Audio API keyed on feelings (joyful, tense, calm, etc.). No assets. No external players. Just tones + puffs generated on demand.
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
```typescript
|
|
7
|
+
import { sound } from '@mhmo91/schmancy'
|
|
8
|
+
|
|
9
|
+
sound.play('joyful') // trigger a feeling sound
|
|
10
|
+
sound.setVolume(0.2) // 0..1
|
|
11
|
+
sound.setMuted(true)
|
|
12
|
+
sound.resetTheme() // back to defaults
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Feelings
|
|
16
|
+
Organized by emotional category:
|
|
17
|
+
|
|
18
|
+
| Category | Feelings |
|
|
19
|
+
|----------|----------|
|
|
20
|
+
| Happy | `joyful`, `content`, `excited`, `grateful`, `proud`, `loved` |
|
|
21
|
+
| Sad | `sad`, `disappointed`, `hurt`, `lonely`, `melancholy` |
|
|
22
|
+
| Anxious | `worried`, `nervous`, `overwhelmed`, `tense` |
|
|
23
|
+
| Angry | `frustrated`, `angry`, `annoyed` |
|
|
24
|
+
| Tired | `tired`, `drained`, `bored` |
|
|
25
|
+
| Calm | `calm`, `peaceful`, `relaxed`, `focused` |
|
|
26
|
+
| Connected | `connected`, `supported`, `welcomed` |
|
|
27
|
+
| Mixed | `confused`, `nostalgic`, `bittersweet` |
|
|
28
|
+
|
|
29
|
+
(See `mood-audio.types.ts` for the authoritative list.)
|
|
30
|
+
|
|
31
|
+
## Observable API
|
|
32
|
+
```typescript
|
|
33
|
+
sound.theme$.subscribe(theme => console.log(theme?.name ?? 'default'))
|
|
34
|
+
sound.volume$.subscribe(v => {})
|
|
35
|
+
sound.muted$.subscribe(m => {})
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Settings Persistence
|
|
39
|
+
Volume, mute, and custom theme persist to `localStorage` under key `schmancy-sound-settings` (via `createContext`).
|
|
40
|
+
|
|
41
|
+
## AI-Generated Themes
|
|
42
|
+
```typescript
|
|
43
|
+
import type { SoundTheme } from '@mhmo91/schmancy'
|
|
44
|
+
|
|
45
|
+
const customTheme: SoundTheme = {
|
|
46
|
+
name: 'ocean',
|
|
47
|
+
sounds: {
|
|
48
|
+
joyful: { puffs: [...], tones: [...] },
|
|
49
|
+
// partial override — falls through to defaults for anything omitted
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
sound.setTheme(customTheme)
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Each `FeelingSound` consists of:
|
|
57
|
+
- **puffs** — short bursts (air/noise, e.g. `{ startTime, duration, frequency, volume }`)
|
|
58
|
+
- **tones** — oscillators (`sine`/`triangle`/`square`/`sawtooth` with envelope)
|
|
59
|
+
|
|
60
|
+
## Built-in Feedback Hooks
|
|
61
|
+
Other Schmancy components play these automatically:
|
|
62
|
+
- [`schmancy-connectivity-status`](./connectivity.md) on offline/online.
|
|
63
|
+
- Some success/error paths in notifications and dialogs via the `$sounds` legacy helper.
|
|
64
|
+
|
|
65
|
+
## Legacy API
|
|
66
|
+
- `$sounds` — older generator exported for compatibility.
|
|
67
|
+
- `EmotionalSoundGenerator` — underlying class.
|
|
68
|
+
|
|
69
|
+
Prefer `sound` for new code.
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# schmancy-autocomplete
|
|
2
|
+
|
|
3
|
+
> Searchable input with fuzzy filtering, single/multi-select, and inline chip display.
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
```html
|
|
7
|
+
<schmancy-autocomplete label="Assignee" placeholder="Search...">
|
|
8
|
+
<schmancy-option value="alice" label="Alice"></schmancy-option>
|
|
9
|
+
<schmancy-option value="bob" label="Bob"></schmancy-option>
|
|
10
|
+
</schmancy-autocomplete>
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Properties
|
|
14
|
+
| Property | Type | Default | Description |
|
|
15
|
+
|----------|------|---------|-------------|
|
|
16
|
+
| value | string | `''` | Selected value (single) or comma-separated (multi) |
|
|
17
|
+
| values | string[] | `[]` | Selected values (multi-select) |
|
|
18
|
+
| label | string | `''` | Label text |
|
|
19
|
+
| placeholder | string | `''` | Placeholder text |
|
|
20
|
+
| name | string | `''` | Form submission name |
|
|
21
|
+
| required | boolean | `false` | Whether selection is required |
|
|
22
|
+
| multi | boolean | `false` | Enable multi-select with inline chips |
|
|
23
|
+
| size | `'xs'\|'sm'\|'md'\|'lg'` | `'md'` | Input height |
|
|
24
|
+
| maxHeight | string | `'300px'` | Max dropdown height |
|
|
25
|
+
| debounceMs | number | `200` | Search debounce in ms |
|
|
26
|
+
| similarityThreshold | number | `0.3` | Minimum fuzzy match score (0-1) |
|
|
27
|
+
| error | boolean | `false` | Error state |
|
|
28
|
+
| validationMessage | string | `''` | Validation message |
|
|
29
|
+
| description | string | `''` | Screen reader description |
|
|
30
|
+
|
|
31
|
+
## Events
|
|
32
|
+
| Event | Detail | Description |
|
|
33
|
+
|-------|--------|-------------|
|
|
34
|
+
| change | `{ value: string \| string[], values?: string[] }` | When selection changes |
|
|
35
|
+
|
|
36
|
+
## Examples
|
|
37
|
+
```html
|
|
38
|
+
<!-- Multi-select with chips -->
|
|
39
|
+
<schmancy-autocomplete label="Skills" multi placeholder="Type to search...">
|
|
40
|
+
<schmancy-option value="ts" label="TypeScript"></schmancy-option>
|
|
41
|
+
<schmancy-option value="lit" label="Lit"></schmancy-option>
|
|
42
|
+
<schmancy-option value="rxjs" label="RxJS"></schmancy-option>
|
|
43
|
+
</schmancy-autocomplete>
|
|
44
|
+
|
|
45
|
+
<!-- Single select, auto-selects best match on blur -->
|
|
46
|
+
<schmancy-autocomplete label="City" placeholder="Search city..."
|
|
47
|
+
@change=${(e) => console.log(e.detail.value)}>
|
|
48
|
+
<schmancy-option value="berlin" label="Berlin"></schmancy-option>
|
|
49
|
+
<schmancy-option value="munich" label="Munich"></schmancy-option>
|
|
50
|
+
</schmancy-autocomplete>
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Children must be `<schmancy-option>` elements. In multi mode, selected items appear as removable chips.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# schmancy-avatar
|
|
2
|
+
|
|
3
|
+
> Avatar component displaying initials, image, or icon with color themes, shapes, and status indicators.
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
```html
|
|
7
|
+
<schmancy-avatar initials="JD" color="primary"></schmancy-avatar>
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
## Properties
|
|
11
|
+
| Property | Type | Default | Description |
|
|
12
|
+
|----------|------|---------|-------------|
|
|
13
|
+
| initials | string | `''` | Text initials (max 2 characters) |
|
|
14
|
+
| src | string | `''` | Image URL |
|
|
15
|
+
| icon | string | `''` | Material icon name |
|
|
16
|
+
| size | `'xxs'\|'xs'\|'sm'\|'md'\|'lg'\|'xl'` | `'md'` | Avatar size (20-64px) |
|
|
17
|
+
| color | `'primary'\|'secondary'\|'tertiary'\|'success'\|'error'\|'neutral'` | `'primary'` | Color theme |
|
|
18
|
+
| shape | `'circle'\|'square'` | `'circle'` | Avatar shape |
|
|
19
|
+
| bordered | boolean | `false` | Show border ring |
|
|
20
|
+
| status | `'online'\|'offline'\|'busy'\|'away'\|'none'` | `'none'` | Status indicator dot |
|
|
21
|
+
|
|
22
|
+
## Size Reference
|
|
23
|
+
| Token | Size | Description |
|
|
24
|
+
|-------|------|-------------|
|
|
25
|
+
| xxs | 20px | Ultra-compact |
|
|
26
|
+
| xs | 24px | Compact |
|
|
27
|
+
| sm | 32px | Small |
|
|
28
|
+
| md | 40px | Default |
|
|
29
|
+
| lg | 48px | Large |
|
|
30
|
+
| xl | 64px | Extra large |
|
|
31
|
+
|
|
32
|
+
## Examples
|
|
33
|
+
```html
|
|
34
|
+
<!-- Image avatar with status -->
|
|
35
|
+
<schmancy-avatar src="/photos/alice.jpg" size="lg" status="online"></schmancy-avatar>
|
|
36
|
+
|
|
37
|
+
<!-- Icon avatar -->
|
|
38
|
+
<schmancy-avatar icon="group" color="secondary" shape="square"></schmancy-avatar>
|
|
39
|
+
|
|
40
|
+
<!-- Bordered initials -->
|
|
41
|
+
<schmancy-avatar initials="AB" color="tertiary" bordered></schmancy-avatar>
|
|
42
|
+
|
|
43
|
+
<!-- Default (person icon) -->
|
|
44
|
+
<schmancy-avatar size="sm" color="neutral"></schmancy-avatar>
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Priority: `src` (image) > `initials` > `icon` > default person icon.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# schmancy-badge
|
|
2
|
+
|
|
3
|
+
> Versatile badge for status indicators, labels, and counts with color variants and shapes.
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
```html
|
|
7
|
+
<schmancy-badge color="success">Active</schmancy-badge>
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
## Properties
|
|
11
|
+
| Property | Type | Default | Description |
|
|
12
|
+
|----------|------|---------|-------------|
|
|
13
|
+
| color | `'primary'\|'secondary'\|'tertiary'\|'success'\|'warning'\|'error'\|'neutral'\|'surface'` | `'primary'` | Color variant |
|
|
14
|
+
| size | `'xs'\|'sm'\|'md'\|'lg'` | `'md'` | Badge size |
|
|
15
|
+
| shape | `'rounded'\|'pill'\|'square'` | `'pill'` | Badge shape |
|
|
16
|
+
| outlined | boolean | `false` | Outlined style (transparent background) |
|
|
17
|
+
| icon | string | `''` | Material icon name |
|
|
18
|
+
| pulse | boolean | `false` | Pulse animation for attention |
|
|
19
|
+
|
|
20
|
+
## Slots
|
|
21
|
+
| Slot | Description |
|
|
22
|
+
|------|-------------|
|
|
23
|
+
| default | Badge text content |
|
|
24
|
+
| icon | Custom icon content |
|
|
25
|
+
|
|
26
|
+
## Examples
|
|
27
|
+
```html
|
|
28
|
+
<!-- Outlined badge -->
|
|
29
|
+
<schmancy-badge color="error" outlined>Overdue</schmancy-badge>
|
|
30
|
+
|
|
31
|
+
<!-- With icon -->
|
|
32
|
+
<schmancy-badge color="success" icon="check_circle">Verified</schmancy-badge>
|
|
33
|
+
|
|
34
|
+
<!-- Pulsing notification badge -->
|
|
35
|
+
<schmancy-badge color="error" size="sm" pulse>3</schmancy-badge>
|
|
36
|
+
|
|
37
|
+
<!-- Square shape -->
|
|
38
|
+
<schmancy-badge color="neutral" shape="square">Draft</schmancy-badge>
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
**Tag aliases:** `<sch-badge>` (backward compatible)
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# schmancy-boat
|
|
2
|
+
|
|
3
|
+
> Draggable floating FAB that expands into a panel. Great for persistent assistant/chat panels.
|
|
4
|
+
|
|
5
|
+
> **Note:** `schmancy-window` is the evolved successor with more capabilities (resize, maximize, multi-window registry). Prefer `schmancy-window` for new code unless you want the simpler FAB-to-panel model.
|
|
6
|
+
|
|
7
|
+
## Usage
|
|
8
|
+
```html
|
|
9
|
+
<schmancy-boat id="assistant" icon="smart_toy" label="Assistant">
|
|
10
|
+
<div slot="header">Assistant</div>
|
|
11
|
+
<div class="p-4">Panel body content</div>
|
|
12
|
+
</schmancy-boat>
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Properties
|
|
16
|
+
| Property | Type | Default | Description |
|
|
17
|
+
|----------|------|---------|-------------|
|
|
18
|
+
| `id` | string | `'default'` | Unique identifier (persists drag position in localStorage) |
|
|
19
|
+
| `icon` | string | — | Material icon for the FAB state |
|
|
20
|
+
| `label` | string | — | Label text in FAB state |
|
|
21
|
+
| `open` | boolean | `false` | Panel open/closed (reflected) |
|
|
22
|
+
| `corner` | `'bottom-right' \| 'bottom-left' \| 'top-right' \| 'top-left'` | `'bottom-right'` | Anchor corner |
|
|
23
|
+
| `expandedWidth` | string | responsive | e.g. `'320px'` |
|
|
24
|
+
| `lowered` | boolean | `false` | Lower shadow in FAB state |
|
|
25
|
+
|
|
26
|
+
## Getter / Setter
|
|
27
|
+
```typescript
|
|
28
|
+
boat.state = 'expanded' | 'collapsed' // equivalent to open = true/false
|
|
29
|
+
boat.state // current state
|
|
30
|
+
boat.expand() / boat.close()
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Behavior
|
|
34
|
+
- Drag to reposition. Releases snap to the nearest corner.
|
|
35
|
+
- Open/close uses clip-path + `SPRING_SMOOTH` for elegant reveal.
|
|
36
|
+
- Position persists in `localStorage` under `schmancy-boat-{id}`.
|
|
37
|
+
- Respects `prefers-reduced-motion`.
|
|
38
|
+
|
|
39
|
+
## Example
|
|
40
|
+
```html
|
|
41
|
+
<schmancy-boat id="chat" icon="chat" label="Chat" corner="bottom-right">
|
|
42
|
+
<span slot="header">Messages</span>
|
|
43
|
+
<schmancy-list class="p-2">
|
|
44
|
+
<!-- messages -->
|
|
45
|
+
</schmancy-list>
|
|
46
|
+
</schmancy-boat>
|
|
47
|
+
```
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# schmancy-busy
|
|
2
|
+
|
|
3
|
+
> Full-overlay busy indicator with backdrop blur. Place inside a `position: relative` container.
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
```html
|
|
7
|
+
<div class="relative">
|
|
8
|
+
<p>Content underneath</p>
|
|
9
|
+
${when(loading, () => html`<schmancy-busy></schmancy-busy>`)}
|
|
10
|
+
</div>
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Properties
|
|
14
|
+
No configurable properties. Renders a centered spinner overlay.
|
|
15
|
+
|
|
16
|
+
## Slots
|
|
17
|
+
| Slot | Description |
|
|
18
|
+
|------|-------------|
|
|
19
|
+
| default | Custom loading content (defaults to `<schmancy-spinner>`) |
|
|
20
|
+
|
|
21
|
+
## Examples
|
|
22
|
+
```html
|
|
23
|
+
<!-- Default spinner -->
|
|
24
|
+
<div class="relative h-64">
|
|
25
|
+
<schmancy-busy></schmancy-busy>
|
|
26
|
+
</div>
|
|
27
|
+
|
|
28
|
+
<!-- Custom loading content -->
|
|
29
|
+
<div class="relative">
|
|
30
|
+
<schmancy-busy>
|
|
31
|
+
<schmancy-typography type="body" token="lg">Loading data...</schmancy-typography>
|
|
32
|
+
</schmancy-busy>
|
|
33
|
+
</div>
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
The component uses `position: absolute; inset: 0` with `z-index: 50` and a subtle backdrop blur.
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# schmancy-button / schmancy-icon-button
|
|
2
|
+
|
|
3
|
+
> Buttons with embedded `magnetic` directive, glow hover shadow, and spring press animation.
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
```html
|
|
7
|
+
<schmancy-button variant="filled" color="primary">Save</schmancy-button>
|
|
8
|
+
<schmancy-icon-button icon="add"></schmancy-icon-button>
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Properties (schmancy-button)
|
|
12
|
+
| Property | Type | Default | Description |
|
|
13
|
+
|----------|------|---------|-------------|
|
|
14
|
+
| `variant` | `'elevated' \| 'filled' \| 'filled tonal' \| 'tonal' \| 'outlined' \| 'text'` | `'text'` | Visual style |
|
|
15
|
+
| `color` | `'primary' \| 'secondary' \| 'success' \| 'error' \| 'warning' \| 'info' \| 'neutral'` | Auto | Color. Defaults to `primary` (or `secondary` for tonal) |
|
|
16
|
+
| `size` | `'xxs' \| 'xs' \| 'sm' \| 'md' \| 'lg'` | `'md'` | Height: 24/32/40/48/56px |
|
|
17
|
+
| `width` | `'full' \| 'auto'` | `'auto'` | Full-width or auto |
|
|
18
|
+
| `type` | `'button' \| 'reset' \| 'submit'` | `'button'` | HTML button type |
|
|
19
|
+
| `href` | `string` | `undefined` | Renders as `<a>` when set |
|
|
20
|
+
| `disabled` | `boolean` | `false` | Disabled state (38% opacity) |
|
|
21
|
+
|
|
22
|
+
## Properties (schmancy-icon-button)
|
|
23
|
+
| Property | Type | Default | Description |
|
|
24
|
+
|----------|------|---------|-------------|
|
|
25
|
+
| `icon` | `string` | `undefined` | Material icon name (preferred over slot content) |
|
|
26
|
+
| `size` | `'xxs' \| 'xs' \| 'sm' \| 'md' \| 'lg' \| 'xl'` | `'md'` | Icon size: 12/16/20/24/24/40px |
|
|
27
|
+
| `variant` | Same as button | `'text'` | Visual style |
|
|
28
|
+
| `text` | `boolean` | `false` | Render slot as text label instead of icon |
|
|
29
|
+
| `disabled` | `boolean` | `false` | Disabled state |
|
|
30
|
+
|
|
31
|
+
## Slots
|
|
32
|
+
| Slot | Description |
|
|
33
|
+
|------|-------------|
|
|
34
|
+
| (default) | Button label text |
|
|
35
|
+
| `prefix` | Leading content (images auto-sized) |
|
|
36
|
+
| `suffix` | Trailing content (images auto-sized) |
|
|
37
|
+
|
|
38
|
+
## Physics
|
|
39
|
+
- **magnetic** directive embedded (strength: 3, radius: 60px for button, 50px for icon-button)
|
|
40
|
+
- Hover: luminous glow shadow using primary color
|
|
41
|
+
- Active: spring press `scale(0.97)` / `scale(0.92)` for icon-button
|
|
42
|
+
|
|
43
|
+
## Examples
|
|
44
|
+
```html
|
|
45
|
+
<!-- Filled primary -->
|
|
46
|
+
<schmancy-button variant="filled" color="primary">Submit</schmancy-button>
|
|
47
|
+
|
|
48
|
+
<!-- Outlined error with icon prefix -->
|
|
49
|
+
<schmancy-button variant="outlined" color="error" size="sm">
|
|
50
|
+
<schmancy-icon slot="prefix">delete</schmancy-icon>
|
|
51
|
+
Delete
|
|
52
|
+
</schmancy-button>
|
|
53
|
+
|
|
54
|
+
<!-- Icon button with explicit icon prop -->
|
|
55
|
+
<schmancy-icon-button icon="settings" variant="tonal" size="sm"></schmancy-icon-button>
|
|
56
|
+
|
|
57
|
+
<!-- Full-width submit -->
|
|
58
|
+
<schmancy-button variant="filled" width="full" type="submit">Save Changes</schmancy-button>
|
|
59
|
+
```
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# schmancy-card
|
|
2
|
+
|
|
3
|
+
> Card container with luminous hover glow and spring press animation. Interactive cards get embedded `cursorGlow` directive.
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
```html
|
|
7
|
+
<schmancy-card type="elevated" interactive>
|
|
8
|
+
<div class="p-4">Card content</div>
|
|
9
|
+
</schmancy-card>
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## Properties
|
|
13
|
+
| Property | Type | Default | Description |
|
|
14
|
+
|----------|------|---------|-------------|
|
|
15
|
+
| `type` | `'elevated' \| 'filled' \| 'outlined'` | `'elevated'` | Visual style |
|
|
16
|
+
| `interactive` | `boolean` | `false` | Enables click, cursorGlow, keyboard nav, ripple |
|
|
17
|
+
| `disabled` | `boolean` | `false` | Disables interaction |
|
|
18
|
+
| `dragged` | `boolean` | `false` | Elevated drag state with extra glow |
|
|
19
|
+
| `href` | `string` | `undefined` | URL navigation on click |
|
|
20
|
+
| `target` | `string` | `undefined` | Link target (e.g. `_blank`) |
|
|
21
|
+
| `role` | `string` | `'article'` | ARIA role (auto-switches to `button`/`link` when interactive) |
|
|
22
|
+
|
|
23
|
+
## Events
|
|
24
|
+
| Event | Detail | Description |
|
|
25
|
+
|-------|--------|-------------|
|
|
26
|
+
| `schmancy-click` | `{ value: type }` | Fired on interactive card click |
|
|
27
|
+
|
|
28
|
+
## Physics
|
|
29
|
+
- **cursorGlow** directive on interactive cards (radius: 200, intensity: 0.1)
|
|
30
|
+
- Hover: luminous glow + lift (`translateY(-2px)` for elevated, `-1px` for others)
|
|
31
|
+
- Active: spring compress `scale(0.98)` with 100ms transition
|
|
32
|
+
- Dragged: enhanced glow + `translateY(-4px)`
|
|
33
|
+
|
|
34
|
+
## Examples
|
|
35
|
+
```html
|
|
36
|
+
<!-- Elevated clickable card -->
|
|
37
|
+
<schmancy-card type="elevated" interactive>
|
|
38
|
+
<div class="p-4">
|
|
39
|
+
<h3 class="text-surface-on font-medium">Title</h3>
|
|
40
|
+
<p class="text-surface-on-variant">Description</p>
|
|
41
|
+
</div>
|
|
42
|
+
</schmancy-card>
|
|
43
|
+
|
|
44
|
+
<!-- Outlined static card -->
|
|
45
|
+
<schmancy-card type="outlined">
|
|
46
|
+
<div class="p-4">Static content</div>
|
|
47
|
+
</schmancy-card>
|
|
48
|
+
|
|
49
|
+
<!-- Link card -->
|
|
50
|
+
<schmancy-card type="filled" interactive href="/details" target="_blank">
|
|
51
|
+
<div class="p-4">Opens in new tab</div>
|
|
52
|
+
</schmancy-card>
|
|
53
|
+
```
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# Schmancy Charts
|
|
2
|
+
|
|
3
|
+
> Canvas-rendered area chart and horizontal pill chart. Theme-aware, lazy-animated, with auto peak highlighting.
|
|
4
|
+
|
|
5
|
+
## schmancy-area-chart
|
|
6
|
+
|
|
7
|
+
> Smooth Catmull-Rom spline area chart with peak markers and hover tooltips.
|
|
8
|
+
|
|
9
|
+
```html
|
|
10
|
+
<schmancy-area-chart
|
|
11
|
+
.data=${[
|
|
12
|
+
{ label: '9 AM', value: 12.4 },
|
|
13
|
+
{ label: '10 AM', value: 18.9 },
|
|
14
|
+
{ label: '11 AM', value: 42.1, metadata: { users: 320 } },
|
|
15
|
+
{ label: '12 PM', value: 56.7 },
|
|
16
|
+
]}
|
|
17
|
+
value-prefix="EUR "
|
|
18
|
+
value-decimals="2"
|
|
19
|
+
peak-count="2"
|
|
20
|
+
height="240"
|
|
21
|
+
></schmancy-area-chart>
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### Properties
|
|
25
|
+
| Property | Type | Default | Description |
|
|
26
|
+
|----------|------|---------|-------------|
|
|
27
|
+
| `data` | `ChartDataPoint[]` | `[]` | `{ label, value, metadata? }[]` |
|
|
28
|
+
| `height` | number | `200` | Chart height in px |
|
|
29
|
+
| `showGrid` | boolean | `true` | Background grid lines |
|
|
30
|
+
| `showLabels` | boolean | `true` | X-axis labels |
|
|
31
|
+
| `showTooltip` | boolean | `true` | Hover tooltip |
|
|
32
|
+
| `peakCount` | number | `3` | Top-N points highlighted larger |
|
|
33
|
+
| `animationDuration` | number | `800` | Entrance animation ms |
|
|
34
|
+
| `animated` | boolean | `true` | Animate on first visible |
|
|
35
|
+
| `valuePrefix` | string | `''` | Display prefix (e.g. `"EUR "`) |
|
|
36
|
+
| `valueSuffix` | string | `''` | Display suffix (e.g. `"%"`) |
|
|
37
|
+
| `valueDecimals` | number | `2` | Decimal places |
|
|
38
|
+
| `theme` | `Partial<ChartTheme>` | `{}` | Override colors, stroke, radii |
|
|
39
|
+
|
|
40
|
+
### ChartTheme
|
|
41
|
+
| Key | Default | Description |
|
|
42
|
+
|-----|---------|-------------|
|
|
43
|
+
| `primaryColor` | `--schmancy-sys-color-primary` | Line + fill gradient color |
|
|
44
|
+
| `gradientOpacity` | `[0.4, 0.05]` | Top/bottom fill opacity |
|
|
45
|
+
| `strokeWidth` | `2` | Line thickness |
|
|
46
|
+
| `pointRadius` | `4` | Normal point radius |
|
|
47
|
+
| `peakRadius` | `6` | Peak point radius |
|
|
48
|
+
|
|
49
|
+
## schmancy-pills
|
|
50
|
+
|
|
51
|
+
> Horizontal bar chart with optional stacked segments, medal ranks, and peak/low styling.
|
|
52
|
+
|
|
53
|
+
```html
|
|
54
|
+
<schmancy-pills
|
|
55
|
+
.data=${[
|
|
56
|
+
{ label: 'Mon', value: 1240, rank: 1 },
|
|
57
|
+
{ label: 'Tue', value: 980 },
|
|
58
|
+
{ label: 'Wed', value: 1830, rank: 2, segments: [
|
|
59
|
+
{ label: 'Pizza', value: 1200 },
|
|
60
|
+
{ label: 'Drinks', value: 630 }
|
|
61
|
+
]},
|
|
62
|
+
]}
|
|
63
|
+
></schmancy-pills>
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### Properties
|
|
67
|
+
| Property | Type | Default | Description |
|
|
68
|
+
|----------|------|---------|-------------|
|
|
69
|
+
| `data` | `PillDataPoint[]` | `[]` | Rows with optional stacked `segments` |
|
|
70
|
+
| `valuePrefix` / `valueSuffix` / `valueDecimals` | — | — | Value formatting (same as area chart) |
|
|
71
|
+
| `showMedals` | boolean | `true` | Show 🥇🥈🥉 for rank 1/2/3 |
|
|
72
|
+
|
|
73
|
+
### PillDataPoint
|
|
74
|
+
```typescript
|
|
75
|
+
{
|
|
76
|
+
label: string
|
|
77
|
+
value: number
|
|
78
|
+
segments?: { label, value, color }[] // stacked
|
|
79
|
+
isPeak?: boolean // highlighted
|
|
80
|
+
isLow?: boolean // muted
|
|
81
|
+
rank?: 1 | 2 | 3 // medal
|
|
82
|
+
metadata?: Record<string, unknown>
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Behavior
|
|
87
|
+
- Both charts use an IntersectionObserver to defer animation until visible.
|
|
88
|
+
- Responsive — resize triggers a re-render.
|
|
89
|
+
- Dark/light aware via theme CSS variables.
|
|
90
|
+
|
|
91
|
+
## When to Use
|
|
92
|
+
- Area chart: time-series or comparative trends.
|
|
93
|
+
- Pills: ranked categorical data (leaderboards, top days, distribution).
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# schmancy-checkbox
|
|
2
|
+
|
|
3
|
+
> Checkbox with label support and form association.
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
```html
|
|
7
|
+
<schmancy-checkbox label="I agree to terms" @change=${(e) => handle(e.detail.value)}>
|
|
8
|
+
</schmancy-checkbox>
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Properties
|
|
12
|
+
| Property | Type | Default | Description |
|
|
13
|
+
|----------|------|---------|-------------|
|
|
14
|
+
| value | boolean | `false` | Whether the checkbox is checked |
|
|
15
|
+
| checked | boolean | `false` | Alias for value |
|
|
16
|
+
| label | string | `undefined` | Label text (alternative to slot) |
|
|
17
|
+
| name | string | auto | Form submission name |
|
|
18
|
+
| disabled | boolean | `false` | Whether the checkbox is disabled |
|
|
19
|
+
| required | boolean | `false` | Whether the checkbox is required |
|
|
20
|
+
| size | `'xxs'\|'xs'\|'sm'\|'md'\|'lg'` | `'md'` | Checkbox size |
|
|
21
|
+
|
|
22
|
+
## Events
|
|
23
|
+
| Event | Detail | Description |
|
|
24
|
+
|-------|--------|-------------|
|
|
25
|
+
| change | `{ value: boolean }` | When checked state changes |
|
|
26
|
+
|
|
27
|
+
## Examples
|
|
28
|
+
```html
|
|
29
|
+
<!-- With label property -->
|
|
30
|
+
<schmancy-checkbox label="Enable notifications" .value=${true}></schmancy-checkbox>
|
|
31
|
+
|
|
32
|
+
<!-- With slotted label -->
|
|
33
|
+
<schmancy-checkbox name="terms" required>
|
|
34
|
+
Accept <a href="/terms">terms and conditions</a>
|
|
35
|
+
</schmancy-checkbox>
|
|
36
|
+
```
|