@mhmo91/schmancy 0.10.35 → 0.10.37
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/custom-elements.json +1165 -1109
- package/dist/SchmancyElement-BHfQg3Tj.cjs +2 -0
- package/dist/SchmancyElement-BHfQg3Tj.cjs.map +1 -0
- package/dist/SchmancyElement-CDT2q1lA.js +284 -0
- package/dist/SchmancyElement-CDT2q1lA.js.map +1 -0
- package/dist/agent/schmancy.agent.js +3488 -3290
- package/dist/agent/schmancy.agent.js.map +1 -1
- package/dist/agent/schmancy.manifest.json +335 -275
- package/dist/{area-DviXdbDx.js → area-KtULlxuA.js} +2 -2
- package/dist/{area-DviXdbDx.js.map → area-KtULlxuA.js.map} +1 -1
- package/dist/{area-CTSTgjlx.cjs → area-fdKhYB6T.cjs} +1 -1
- package/dist/{area-CTSTgjlx.cjs.map → area-fdKhYB6T.cjs.map} +1 -1
- package/dist/area.cjs +1 -1
- package/dist/area.js +1 -1
- package/dist/{audio-Q9oB_cQR.cjs → audio-CUMAv9D_.cjs} +1 -1
- package/dist/{audio-Q9oB_cQR.cjs.map → audio-CUMAv9D_.cjs.map} +1 -1
- package/dist/{audio-DFYoaw0M.js → audio-zIJVTo_V.js} +1 -1
- package/dist/{audio-DFYoaw0M.js.map → audio-zIJVTo_V.js.map} +1 -1
- package/dist/audio.cjs +1 -1
- package/dist/audio.js +2 -2
- package/dist/{autocomplete-DmLXJr7C.cjs → autocomplete-DEZk6wBD.cjs} +1 -1
- package/dist/{autocomplete-DmLXJr7C.cjs.map → autocomplete-DEZk6wBD.cjs.map} +1 -1
- package/dist/{autocomplete-BDvuma6D.js → autocomplete-DIScyo8Q.js} +3 -3
- package/dist/{autocomplete-BDvuma6D.js.map → autocomplete-DIScyo8Q.js.map} +1 -1
- package/dist/autocomplete.cjs +1 -1
- package/dist/autocomplete.js +1 -1
- package/dist/avatar.cjs +1 -1
- package/dist/avatar.js +3 -3
- package/dist/badge.cjs +1 -1
- package/dist/badge.js +1 -1
- package/dist/{boat-lr7MPZ7H.js → boat-BHPqSqJd.js} +67 -83
- package/dist/boat-BHPqSqJd.js.map +1 -0
- package/dist/boat-OBZ77exO.cjs +34 -0
- package/dist/boat-OBZ77exO.cjs.map +1 -0
- package/dist/boat.cjs +1 -1
- package/dist/boat.js +1 -1
- package/dist/breadcrumb.cjs +1 -1
- package/dist/breadcrumb.js +2 -2
- package/dist/{busy-CgzZbGfx.cjs → busy-BJNsKSCM.cjs} +1 -1
- package/dist/{busy-CgzZbGfx.cjs.map → busy-BJNsKSCM.cjs.map} +1 -1
- package/dist/{busy-DgQ4ux5N.js → busy-Dut78y4L.js} +2 -2
- package/dist/{busy-DgQ4ux5N.js.map → busy-Dut78y4L.js.map} +1 -1
- package/dist/busy.cjs +1 -1
- package/dist/busy.js +1 -1
- package/dist/{button-DFvR1iXX.cjs → button-DzlHLjWO.cjs} +1 -1
- package/dist/{button-DFvR1iXX.cjs.map → button-DzlHLjWO.cjs.map} +1 -1
- package/dist/{button-qbN1muQ0.js → button-kcpPQavY.js} +2 -2
- package/dist/{button-qbN1muQ0.js.map → button-kcpPQavY.js.map} +1 -1
- package/dist/button.cjs +4 -4
- package/dist/button.cjs.map +1 -1
- package/dist/button.js +16 -22
- package/dist/button.js.map +1 -1
- package/dist/{card-D_GlwZ5q.cjs → card-BLxPLqdQ.cjs} +1 -1
- package/dist/{card-D_GlwZ5q.cjs.map → card-BLxPLqdQ.cjs.map} +1 -1
- package/dist/{card-DAbr-7Vy.js → card-DxSKxCid.js} +2 -2
- package/dist/{card-DAbr-7Vy.js.map → card-DxSKxCid.js.map} +1 -1
- package/dist/card.cjs +1 -1
- package/dist/card.js +1 -1
- package/dist/{checkbox-BNORaxMF.js → checkbox-B1wiM3Dv.js} +2 -2
- package/dist/{checkbox-BNORaxMF.js.map → checkbox-B1wiM3Dv.js.map} +1 -1
- package/dist/{checkbox-BUY_uc_r.cjs → checkbox-BCLkhp5G.cjs} +1 -1
- package/dist/{checkbox-BUY_uc_r.cjs.map → checkbox-BCLkhp5G.cjs.map} +1 -1
- package/dist/checkbox.cjs +1 -1
- package/dist/checkbox.js +1 -1
- package/dist/{chips-CXZ4dJCK.cjs → chips-C9dS1WKn.cjs} +44 -33
- package/dist/chips-C9dS1WKn.cjs.map +1 -0
- package/dist/{chips-Dg6Lk6BT.js → chips-vWmwqQed.js} +145 -122
- package/dist/chips-vWmwqQed.js.map +1 -0
- package/dist/chips.cjs +1 -1
- package/dist/chips.js +2 -2
- package/dist/connectivity.cjs +1 -1
- package/dist/connectivity.js +3 -3
- package/dist/content-drawer.cjs +1 -1
- package/dist/content-drawer.js +1 -1
- package/dist/{date-range-C-_be3_E.cjs → date-range-BV6HuvLw.cjs} +25 -19
- package/dist/date-range-BV6HuvLw.cjs.map +1 -0
- package/dist/{date-range-BU6WX7d5.js → date-range-D3ge1b4c.js} +129 -137
- package/dist/date-range-D3ge1b4c.js.map +1 -0
- package/dist/{date-range-inline-DJtUmHKF.cjs → date-range-inline-DpYgdLRv.cjs} +1 -1
- package/dist/{date-range-inline-DJtUmHKF.cjs.map → date-range-inline-DpYgdLRv.cjs.map} +1 -1
- package/dist/{date-range-inline-7o7xtVIu.js → date-range-inline-DuWQaWps.js} +2 -2
- package/dist/{date-range-inline-7o7xtVIu.js.map → date-range-inline-DuWQaWps.js.map} +1 -1
- package/dist/date-range-inline.cjs +1 -1
- package/dist/date-range-inline.js +1 -1
- package/dist/date-range.cjs +1 -1
- package/dist/date-range.js +1 -1
- package/dist/delay.cjs +1 -1
- package/dist/delay.js +2 -2
- package/dist/{details-EfbDPVEo.js → details-C-GZaq3j.js} +2 -2
- package/dist/{details-EfbDPVEo.js.map → details-C-GZaq3j.js.map} +1 -1
- package/dist/{details-Bs0MyyvF.cjs → details-Dp5rLIWk.cjs} +1 -1
- package/dist/{details-Bs0MyyvF.cjs.map → details-Dp5rLIWk.cjs.map} +1 -1
- package/dist/details.cjs +1 -1
- package/dist/details.js +1 -1
- package/dist/{directives-fLwDj6b0.cjs → directives-D_l1E5H6.cjs} +3 -3
- package/dist/directives-D_l1E5H6.cjs.map +1 -0
- package/dist/{directives-zi1Mm2er.js → directives-DyS51FUh.js} +37 -21
- package/dist/directives-DyS51FUh.js.map +1 -0
- package/dist/directives.cjs +1 -1
- package/dist/directives.js +2 -2
- package/dist/{divider-CdIsWZrM.cjs → divider-CBnAmHMZ.cjs} +1 -1
- package/dist/{divider-CdIsWZrM.cjs.map → divider-CBnAmHMZ.cjs.map} +1 -1
- package/dist/{divider-CEPfrIwe.js → divider-nQffE0AD.js} +2 -2
- package/dist/{divider-CEPfrIwe.js.map → divider-nQffE0AD.js.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-g1vqqUp1.js → expand-DvTb-UPR.js} +3 -3
- package/dist/{expand-g1vqqUp1.js.map → expand-DvTb-UPR.js.map} +1 -1
- package/dist/{expand--at1k3qo.cjs → expand-mlP_3XWz.cjs} +1 -1
- package/dist/{expand--at1k3qo.cjs.map → expand-mlP_3XWz.cjs.map} +1 -1
- package/dist/expand.cjs +1 -1
- package/dist/expand.js +1 -1
- package/dist/fab.cjs +77 -0
- package/dist/fab.cjs.map +1 -0
- package/dist/fab.js +151 -0
- package/dist/fab.js.map +1 -0
- package/dist/{float-DxVzgI9o.js → float-C-Ko0Le3.js} +2 -2
- package/dist/{float-DxVzgI9o.js.map → float-C-Ko0Le3.js.map} +1 -1
- package/dist/{float-P9HukAm-.cjs → float-C17xgMT1.cjs} +1 -1
- package/dist/{float-P9HukAm-.cjs.map → float-C17xgMT1.cjs.map} +1 -1
- package/dist/float.cjs +1 -1
- package/dist/float.js +1 -1
- package/dist/{form-ByYhXe1p.cjs → form-CwPHcQYB.cjs} +1 -1
- package/dist/{form-ByYhXe1p.cjs.map → form-CwPHcQYB.cjs.map} +1 -1
- package/dist/{form-CqLaozHp.js → form-DA0hUu2h.js} +3 -3
- package/dist/{form-CqLaozHp.js.map → form-DA0hUu2h.js.map} +1 -1
- package/dist/form.cjs +6 -6
- package/dist/form.cjs.map +1 -1
- package/dist/form.js +25 -23
- package/dist/form.js.map +1 -1
- package/dist/handover/agent-runtime-followups.md +1 -1
- package/dist/handover/agent-runtime-v1.md +3 -3
- package/dist/{icons-CkphcMp6.js → icons-C6UfxmHZ.js} +2 -2
- package/dist/{icons-CkphcMp6.js.map → icons-C6UfxmHZ.js.map} +1 -1
- package/dist/{icons-DYtiRU5V.cjs → icons-CW3-oMSb.cjs} +1 -1
- package/dist/{icons-DYtiRU5V.cjs.map → icons-CW3-oMSb.cjs.map} +1 -1
- package/dist/icons.cjs +1 -1
- package/dist/icons.js +1 -1
- package/dist/{iframe-CjqJksl8.js → iframe-BTjZfYyh.js} +2 -2
- package/dist/{iframe-CjqJksl8.js.map → iframe-BTjZfYyh.js.map} +1 -1
- package/dist/{iframe-C3trkP8q.cjs → iframe-wuYT2xFz.cjs} +1 -1
- package/dist/{iframe-C3trkP8q.cjs.map → iframe-wuYT2xFz.cjs.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 +57 -56
- package/dist/{input-CG51zDVh.js → input-B_4g2ulO.js} +2 -2
- package/dist/{input-CG51zDVh.js.map → input-B_4g2ulO.js.map} +1 -1
- package/dist/{input-DuavpwNL.cjs → input-BrDiIT60.cjs} +1 -1
- package/dist/{input-DuavpwNL.cjs.map → input-BrDiIT60.cjs.map} +1 -1
- package/dist/{input-chip-57tgNXKT.cjs → input-chip-B-XWh4aE.cjs} +1 -1
- package/dist/input-chip-B-XWh4aE.cjs.map +1 -0
- package/dist/{input-chip-C6Lq1927.js → input-chip-BlWhOruv.js} +2 -2
- package/dist/input-chip-BlWhOruv.js.map +1 -0
- package/dist/input.cjs +1 -1
- package/dist/input.js +1 -1
- package/dist/json.cjs +1 -1
- package/dist/json.js +3 -3
- package/dist/kbd.cjs +1 -1
- package/dist/kbd.js +2 -2
- package/dist/{layout-6ipbiWTl.cjs → layout-BhyIcEVu.cjs} +1 -1
- package/dist/{layout-6ipbiWTl.cjs.map → layout-BhyIcEVu.cjs.map} +1 -1
- package/dist/{layout-D4IOwx7p.js → layout-Dxit9enO.js} +1 -1
- package/dist/{layout-D4IOwx7p.js.map → layout-Dxit9enO.js.map} +1 -1
- package/dist/layout.cjs +1 -1
- package/dist/layout.js +2 -2
- package/dist/{lightbox-H8pVWGMX.cjs → lightbox-CVBogswK.cjs} +1 -1
- package/dist/{lightbox-H8pVWGMX.cjs.map → lightbox-CVBogswK.cjs.map} +1 -1
- package/dist/{lightbox-CsyO2XSr.js → lightbox-D85XAAuC.js} +2 -2
- package/dist/{lightbox-CsyO2XSr.js.map → lightbox-D85XAAuC.js.map} +1 -1
- package/dist/lightbox.cjs +1 -1
- package/dist/lightbox.js +1 -1
- package/dist/{list-BAwH0pQW.js → list-DOF_yVn5.js} +2 -2
- package/dist/{list-BAwH0pQW.js.map → list-DOF_yVn5.js.map} +1 -1
- package/dist/{list-Bs9m8kw7.cjs → list-nVjLskgx.cjs} +1 -1
- package/dist/{list-Bs9m8kw7.cjs.map → list-nVjLskgx.cjs.map} +1 -1
- package/dist/list.cjs +1 -1
- package/dist/list.js +1 -1
- package/dist/{menu-BMcGzj1h.cjs → menu-DqmNjLgY.cjs} +1 -1
- package/dist/{menu-BMcGzj1h.cjs.map → menu-DqmNjLgY.cjs.map} +1 -1
- package/dist/{menu-tQVARVaC.js → menu-QrAK5Uu9.js} +3 -3
- package/dist/{menu-tQVARVaC.js.map → menu-QrAK5Uu9.js.map} +1 -1
- package/dist/menu.cjs +1 -1
- package/dist/menu.js +1 -1
- package/dist/{mixins-Bp0wIHg2.js → mixins-De1zjyhy.js} +1 -1
- package/dist/{mixins-Bp0wIHg2.js.map → mixins-De1zjyhy.js.map} +1 -1
- package/dist/{mixins-CGXSzZc7.cjs → mixins-DxHpyMHA.cjs} +1 -1
- package/dist/{mixins-CGXSzZc7.cjs.map → mixins-DxHpyMHA.cjs.map} +1 -1
- package/dist/mixins.cjs +1 -1
- package/dist/mixins.js +2 -2
- 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-D1tX2nx5.js → notification-BtAK7NK8.js} +4 -4
- package/dist/{notification-D1tX2nx5.js.map → notification-BtAK7NK8.js.map} +1 -1
- package/dist/{notification-Bz00zdpV.cjs → notification-DYzbUb5C.cjs} +1 -1
- package/dist/{notification-Bz00zdpV.cjs.map → notification-DYzbUb5C.cjs.map} +1 -1
- package/dist/notification.cjs +1 -1
- package/dist/notification.js +1 -1
- package/dist/{option-BpGV8Apj.js → option-DHwA0miA.js} +2 -2
- package/dist/{option-BpGV8Apj.js.map → option-DHwA0miA.js.map} +1 -1
- package/dist/{option-BnybLEDO.cjs → option-DnSPa8ro.cjs} +1 -1
- package/dist/{option-BnybLEDO.cjs.map → option-DnSPa8ro.cjs.map} +1 -1
- package/dist/option.cjs +1 -1
- package/dist/option.js +1 -1
- package/dist/{overlay-UQR2Dy3u.cjs → overlay-BVkqZmoS.cjs} +5 -5
- package/dist/overlay-BVkqZmoS.cjs.map +1 -0
- package/dist/{overlay-BpNhd74N.js → overlay-Del1sBEB.js} +108 -108
- package/dist/overlay-Del1sBEB.js.map +1 -0
- package/dist/overlay.cjs +1 -1
- package/dist/{overlay.confirm-body-CVDtVk5X.cjs → overlay.confirm-body-BV9umTAl.cjs} +1 -1
- package/dist/{overlay.confirm-body-CVDtVk5X.cjs.map → overlay.confirm-body-BV9umTAl.cjs.map} +1 -1
- package/dist/{overlay.confirm-body-BHcXu5Wk.js → overlay.confirm-body-DSONXUzl.js} +6 -6
- package/dist/{overlay.confirm-body-BHcXu5Wk.js.map → overlay.confirm-body-DSONXUzl.js.map} +1 -1
- package/dist/overlay.js +3 -3
- package/dist/{overlay.service-DTE6NwIM.js → overlay.service-BTp5Oq7f.js} +2 -2
- package/dist/{overlay.service-DTE6NwIM.js.map → overlay.service-BTp5Oq7f.js.map} +1 -1
- package/dist/{overlay.service-C8RsQzgM.cjs → overlay.service-XLlrsSdA.cjs} +1 -1
- package/dist/{overlay.service-C8RsQzgM.cjs.map → overlay.service-XLlrsSdA.cjs.map} +1 -1
- package/dist/{progress-gbIALDRs.cjs → progress-DUbTL9g9.cjs} +1 -1
- package/dist/{progress-gbIALDRs.cjs.map → progress-DUbTL9g9.cjs.map} +1 -1
- package/dist/{progress-CAKsxp29.js → progress-DYA83CFU.js} +2 -2
- package/dist/{progress-CAKsxp29.js.map → progress-DYA83CFU.js.map} +1 -1
- package/dist/progress.cjs +1 -1
- package/dist/progress.js +1 -1
- package/dist/{radio-group-CfJ5DtI4.cjs → radio-group-B-ORNtvR.cjs} +1 -1
- package/dist/{radio-group-CfJ5DtI4.cjs.map → radio-group-B-ORNtvR.cjs.map} +1 -1
- package/dist/{radio-group-otyvZvUk.js → radio-group-DxX0iJBo.js} +2 -2
- package/dist/{radio-group-otyvZvUk.js.map → radio-group-DxX0iJBo.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 +2 -2
- package/dist/{select-81jniVTs.cjs → select-B9uj_u-s.cjs} +1 -1
- package/dist/{select-81jniVTs.cjs.map → select-B9uj_u-s.cjs.map} +1 -1
- package/dist/{select-9vXx1fhr.js → select-C7gkA-ab.js} +3 -3
- package/dist/{select-9vXx1fhr.js.map → select-C7gkA-ab.js.map} +1 -1
- package/dist/select.cjs +1 -1
- package/dist/select.js +1 -1
- package/dist/skeleton.cjs +1 -1
- package/dist/skeleton.js +2 -2
- package/dist/skills/INDEX.md +1 -1
- package/dist/skills/SKILL.md +20 -18
- package/dist/skills/boat.md +21 -15
- package/dist/skills/fab.md +75 -0
- package/dist/skills/schmancy/INDEX.md +1 -1
- package/dist/skills/schmancy/SKILL.md +20 -18
- package/dist/skills/schmancy/boat.md +21 -15
- package/dist/skills/schmancy/fab.md +75 -0
- package/dist/skills/schmancy/steps.md +68 -34
- package/dist/skills/schmancy/theme.md +1 -1
- package/dist/skills/steps.md +68 -34
- package/dist/skills/theme.md +1 -1
- package/dist/slider.cjs +1 -1
- package/dist/slider.js +2 -2
- package/dist/{sound.service-CmIw63aM.cjs → sound.service-C7FDY_yD.cjs} +1 -1
- package/dist/{sound.service-CmIw63aM.cjs.map → sound.service-C7FDY_yD.cjs.map} +1 -1
- package/dist/{sound.service-D3ZSq1Kj.js → sound.service-O0232os6.js} +1 -1
- package/dist/{sound.service-D3ZSq1Kj.js.map → sound.service-O0232os6.js.map} +1 -1
- package/dist/{splash-screen-C5KAWXvA.cjs → splash-screen-DIS4odDr.cjs} +1 -1
- package/dist/{splash-screen-C5KAWXvA.cjs.map → splash-screen-DIS4odDr.cjs.map} +1 -1
- package/dist/{splash-screen-BOjrmGLk.js → splash-screen-jfE47xl0.js} +2 -2
- package/dist/{splash-screen-BOjrmGLk.js.map → splash-screen-jfE47xl0.js.map} +1 -1
- package/dist/splash-screen.cjs +1 -1
- package/dist/splash-screen.js +1 -1
- package/dist/{src-C5g3p1J5.js → src-BP3h-9d9.js} +36 -35
- package/dist/{src-C5g3p1J5.js.map → src-BP3h-9d9.js.map} +1 -1
- package/dist/{src-qzUpLbje.cjs → src-Um_pzb-U.cjs} +1 -1
- package/dist/{src-qzUpLbje.cjs.map → src-Um_pzb-U.cjs.map} +1 -1
- package/dist/{state-Cex3rmx2.cjs → state-Bj0M9a6T.cjs} +1 -1
- package/dist/{state-Cex3rmx2.cjs.map → state-Bj0M9a6T.cjs.map} +1 -1
- package/dist/{state-CWBRTSvE.js → state-DscWQpoM.js} +1 -1
- package/dist/{state-CWBRTSvE.js.map → state-DscWQpoM.js.map} +1 -1
- package/dist/state.cjs +1 -1
- package/dist/state.js +2 -2
- package/dist/steps.cjs +35 -19
- package/dist/steps.cjs.map +1 -1
- package/dist/steps.js +96 -73
- package/dist/steps.js.map +1 -1
- package/dist/{surface-9S5scTsD.js → surface-B4Wn4SOO.js} +2 -2
- package/dist/{surface-9S5scTsD.js.map → surface-B4Wn4SOO.js.map} +1 -1
- package/dist/{surface-PfiejLuw.cjs → surface-DRq6cVW6.cjs} +1 -1
- package/dist/{surface-PfiejLuw.cjs.map → surface-DRq6cVW6.cjs.map} +1 -1
- package/dist/surface.cjs +1 -1
- package/dist/surface.js +1 -1
- package/dist/switch.cjs +1 -1
- package/dist/switch.js +2 -2
- package/dist/table.cjs +1 -1
- package/dist/table.js +2 -2
- package/dist/{tabs-uYvb1P06.cjs → tabs-Ca_fbHPW.cjs} +1 -1
- package/dist/{tabs-uYvb1P06.cjs.map → tabs-Ca_fbHPW.cjs.map} +1 -1
- package/dist/{tabs-BBOjAmgG.js → tabs-CnQPo-XS.js} +2 -2
- package/dist/{tabs-BBOjAmgG.js.map → tabs-CnQPo-XS.js.map} +1 -1
- package/dist/tabs.cjs +1 -1
- package/dist/tabs.js +1 -1
- package/dist/teleport.cjs +1 -1
- package/dist/teleport.js +1 -1
- package/dist/{textarea-QzSj8Dkl.js → textarea-BvqENhTW.js} +2 -2
- package/dist/{textarea-QzSj8Dkl.js.map → textarea-BvqENhTW.js.map} +1 -1
- package/dist/{textarea-YPHX4g7Y.cjs → textarea-qr7oL8oU.cjs} +1 -1
- package/dist/{textarea-YPHX4g7Y.cjs.map → textarea-qr7oL8oU.cjs.map} +1 -1
- package/dist/textarea.cjs +1 -1
- package/dist/textarea.js +1 -1
- package/dist/theme-BSwJ2YZo.cjs +181 -0
- package/dist/{theme-iKUaS9JB.cjs.map → theme-BSwJ2YZo.cjs.map} +1 -1
- package/dist/{theme-C2Mp-VGt.js → theme-BV0EzHQ1.js} +6 -5
- package/dist/{theme-C2Mp-VGt.js.map → theme-BV0EzHQ1.js.map} +1 -1
- package/dist/{theme-button-CJmhxfMe.cjs → theme-button-C6fpUzPM.cjs} +1 -1
- package/dist/{theme-button-CJmhxfMe.cjs.map → theme-button-C6fpUzPM.cjs.map} +1 -1
- package/dist/{theme-button-DGWAXhzd.js → theme-button-O_xNCgI7.js} +2 -2
- package/dist/{theme-button-DGWAXhzd.js.map → theme-button-O_xNCgI7.js.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 +3 -3
- package/dist/{theme.service-hc4N-1Oz.js → theme.service-DwLhhOmP.js} +1 -1
- package/dist/{theme.service-hc4N-1Oz.js.map → theme.service-DwLhhOmP.js.map} +1 -1
- package/dist/{theme.service-p61RsJBF.cjs → theme.service-kn9MC025.cjs} +1 -1
- package/dist/{theme.service-p61RsJBF.cjs.map → theme.service-kn9MC025.cjs.map} +1 -1
- package/dist/tree.cjs +1 -1
- package/dist/tree.js +2 -2
- package/dist/{typography-DwV0sqht.js → typography-Dtdooaic.js} +2 -2
- package/dist/{typography-DwV0sqht.js.map → typography-Dtdooaic.js.map} +1 -1
- package/dist/{typography-Bdt8RlX2.cjs → typography-opFYuUYS.cjs} +1 -1
- package/dist/{typography-Bdt8RlX2.cjs.map → typography-opFYuUYS.cjs.map} +1 -1
- package/dist/typography.cjs +1 -1
- package/dist/typography.js +1 -1
- package/dist/visually-hidden.cjs +1 -1
- package/dist/visually-hidden.js +2 -2
- package/dist/{window-D2WfvNng.cjs → window-BSAemI9J.cjs} +1 -1
- package/dist/{window-D2WfvNng.cjs.map → window-BSAemI9J.cjs.map} +1 -1
- package/dist/{window-n4jN60B_.js → window-ConcHirJ.js} +3 -3
- package/dist/{window-n4jN60B_.js.map → window-ConcHirJ.js.map} +1 -1
- package/dist/window.cjs +1 -1
- package/dist/window.js +1 -1
- package/package.json +1 -1
- package/skills/schmancy/INDEX.md +1 -1
- package/skills/schmancy/SKILL.md +20 -18
- package/skills/schmancy/boat.md +21 -15
- package/skills/schmancy/fab.md +75 -0
- package/skills/schmancy/steps.md +68 -34
- package/skills/schmancy/theme.md +1 -1
- package/src/CLAUDE.md +22 -16
- package/src/boat/boat.test.ts +130 -0
- package/src/boat/boat.ts +144 -121
- package/src/button/icon-button.ts +18 -30
- package/src/chips/assist-chip.ts +2 -263
- package/src/chips/chips.ts +2 -259
- package/src/chips/filter-chip.ts +2 -255
- package/src/chips/index.ts +2 -5
- package/src/chips/input-chip.ts +2 -413
- package/src/chips/suggestion-chip.ts +2 -266
- package/src/directives/fill.ts +28 -5
- package/src/directives/reveal.ts +192 -118
- package/src/fab/fab.test.ts +101 -0
- package/src/fab/fab.ts +226 -0
- package/src/fab/index.ts +1 -0
- package/src/form/fields/chips/assist-chip.ts +263 -0
- package/src/form/fields/chips/chips.ts +234 -0
- package/src/form/fields/chips/filter-chip.ts +255 -0
- package/src/form/fields/chips/index.ts +5 -0
- package/src/form/fields/chips/input-chip.ts +413 -0
- package/src/form/fields/chips/suggestion-chip.ts +266 -0
- package/src/form/fields/date-range/date-range.test.ts +44 -0
- package/src/form/fields/date-range/date-range.ts +103 -97
- package/src/form/fields/index.ts +1 -0
- package/src/index.ts +2 -1
- package/src/overlay/overlay.animations.ts +2 -3
- package/src/overlay/overlay.component.ts +8 -4
- package/src/overlay/overlay.types.ts +14 -2
- package/src/steps/index.ts +1 -1
- package/src/steps/schmancy-step.ts +91 -65
- package/src/steps/{schmancy-steps-container.ts → schmancy-steps.ts} +18 -38
- package/src/steps/steps.context.ts +5 -4
- package/src/steps/steps.test.ts +120 -0
- package/src/theme/theme.component.ts +1 -0
- package/src/theme/theme.style.css +3 -0
- package/types/src/boat/boat.d.ts +27 -9
- package/types/src/boat/boat.test.d.ts +2 -0
- package/types/src/button/icon-button.d.ts +3 -2
- package/types/src/chips/assist-chip.d.ts +1 -47
- package/types/src/chips/chips.d.ts +1 -43
- package/types/src/chips/filter-chip.d.ts +1 -67
- package/types/src/chips/index.d.ts +1 -5
- package/types/src/chips/input-chip.d.ts +1 -82
- package/types/src/chips/suggestion-chip.d.ts +1 -52
- package/types/src/directives/reveal.d.ts +15 -5
- package/types/src/fab/fab.d.ts +80 -0
- package/types/src/fab/fab.test.d.ts +2 -0
- package/types/src/fab/index.d.ts +1 -0
- package/types/src/form/fields/chips/assist-chip.d.ts +47 -0
- package/types/src/form/fields/chips/chips.d.ts +35 -0
- package/types/src/form/fields/chips/filter-chip.d.ts +67 -0
- package/types/src/form/fields/chips/index.d.ts +5 -0
- package/types/src/form/fields/chips/input-chip.d.ts +82 -0
- package/types/src/form/fields/chips/suggestion-chip.d.ts +52 -0
- package/types/src/form/fields/date-range/date-range.d.ts +5 -10
- package/types/src/form/fields/index.d.ts +1 -0
- package/types/src/index.d.ts +2 -1
- package/types/src/overlay/overlay.component.d.ts +1 -0
- package/types/src/overlay/overlay.types.d.ts +12 -2
- package/types/src/steps/index.d.ts +1 -1
- package/types/src/steps/schmancy-step.d.ts +8 -23
- package/types/src/steps/{schmancy-steps-container.d.ts → schmancy-steps.d.ts} +8 -9
- package/types/src/steps/steps.context.d.ts +2 -1
- package/types/src/steps/steps.test.d.ts +2 -0
- package/types/src/theme/theme.component.d.ts +1 -0
- package/dist/SchmancyElement-CA0Wqt8m.js +0 -284
- package/dist/SchmancyElement-CA0Wqt8m.js.map +0 -1
- package/dist/SchmancyElement-CYIif26I.cjs +0 -2
- package/dist/SchmancyElement-CYIif26I.cjs.map +0 -1
- package/dist/boat-Vqjgo10B.cjs +0 -33
- package/dist/boat-Vqjgo10B.cjs.map +0 -1
- package/dist/boat-lr7MPZ7H.js.map +0 -1
- package/dist/chips-CXZ4dJCK.cjs.map +0 -1
- package/dist/chips-Dg6Lk6BT.js.map +0 -1
- package/dist/date-range-BU6WX7d5.js.map +0 -1
- package/dist/date-range-C-_be3_E.cjs.map +0 -1
- package/dist/directives-fLwDj6b0.cjs.map +0 -1
- package/dist/directives-zi1Mm2er.js.map +0 -1
- package/dist/input-chip-57tgNXKT.cjs.map +0 -1
- package/dist/input-chip-C6Lq1927.js.map +0 -1
- package/dist/overlay-BpNhd74N.js.map +0 -1
- package/dist/overlay-UQR2Dy3u.cjs.map +0 -1
- package/dist/theme-iKUaS9JB.cjs +0 -181
package/src/chips/input-chip.ts
CHANGED
|
@@ -1,413 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import { customElement, property, state } from 'lit/decorators.js'
|
|
4
|
-
import { classMap } from 'lit/directives/class-map.js'
|
|
5
|
-
import { BehaviorSubject, combineLatest } from 'rxjs'
|
|
6
|
-
import { map, takeUntil, tap } from 'rxjs/operators'
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Input chip component - represents user-provided information that can be removed.
|
|
10
|
-
*
|
|
11
|
-
* IMPORTANT: Per Material Design 3 specification, input chips do NOT have selected state.
|
|
12
|
-
* They represent discrete pieces of user input (like entered tags, selections from lists, etc.)
|
|
13
|
-
* that can only be removed, not toggled on/off.
|
|
14
|
-
*
|
|
15
|
-
* Use cases:
|
|
16
|
-
* - Displaying selected recipients in an email
|
|
17
|
-
* - Showing applied filters that can be removed
|
|
18
|
-
* - Tags or keywords entered by the user
|
|
19
|
-
* - Selected items from a multi-select dropdown
|
|
20
|
-
*
|
|
21
|
-
* @fires click - Optional click event on chip body (value)
|
|
22
|
-
* @fires remove - Dispatched when remove button is clicked (value)
|
|
23
|
-
*
|
|
24
|
-
* @example
|
|
25
|
-
* ```html
|
|
26
|
-
* <schmancy-input-chip value="john@example.com" avatar="/avatars/john.jpg">
|
|
27
|
-
* John Doe
|
|
28
|
-
* </schmancy-input-chip>
|
|
29
|
-
* ```
|
|
30
|
-
*/
|
|
31
|
-
@customElement('schmancy-input-chip')
|
|
32
|
-
export class SchmancyInputChip extends SchmancyElement {
|
|
33
|
-
static styles = [css`
|
|
34
|
-
:host {
|
|
35
|
-
display: inline-block;
|
|
36
|
-
outline: none;
|
|
37
|
-
width: fit-content;
|
|
38
|
-
min-width: fit-content;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
:host([disabled]) {
|
|
42
|
-
pointer-events: none;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
button {
|
|
46
|
-
font-family: inherit;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
.avatar-img {
|
|
50
|
-
width: 20px;
|
|
51
|
-
height: 20px;
|
|
52
|
-
object-fit: cover;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/* Material Symbols font for icons */
|
|
56
|
-
.material-symbols-outlined {
|
|
57
|
-
font-family: 'Material Symbols Outlined';
|
|
58
|
-
font-weight: normal;
|
|
59
|
-
font-style: normal;
|
|
60
|
-
font-size: 18px;
|
|
61
|
-
line-height: 1;
|
|
62
|
-
letter-spacing: normal;
|
|
63
|
-
text-transform: none;
|
|
64
|
-
display: inline-block;
|
|
65
|
-
white-space: nowrap;
|
|
66
|
-
word-wrap: normal;
|
|
67
|
-
direction: ltr;
|
|
68
|
-
-webkit-font-smoothing: antialiased;
|
|
69
|
-
text-rendering: optimizeLegibility;
|
|
70
|
-
-moz-osx-font-smoothing: grayscale;
|
|
71
|
-
font-feature-settings: 'liga';
|
|
72
|
-
vertical-align: middle;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
.ripple {
|
|
76
|
-
position: absolute;
|
|
77
|
-
border-radius: 50%;
|
|
78
|
-
transform: scale(0);
|
|
79
|
-
animation: ripple 600ms linear;
|
|
80
|
-
background-color: rgba(0, 0, 0, 0.08);
|
|
81
|
-
pointer-events: none;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
@keyframes ripple {
|
|
85
|
-
to {
|
|
86
|
-
transform: scale(4);
|
|
87
|
-
opacity: 0;
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
/* State layer for M3 hover/focus/pressed states */
|
|
92
|
-
.state-layer {
|
|
93
|
-
position: absolute;
|
|
94
|
-
inset: 0;
|
|
95
|
-
border-radius: inherit;
|
|
96
|
-
pointer-events: none;
|
|
97
|
-
background-color: currentColor;
|
|
98
|
-
opacity: 0;
|
|
99
|
-
transition: opacity 200ms ease;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
:host(:not([disabled])) .chip-container:hover .state-layer {
|
|
103
|
-
opacity: 0.08;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
:host(:not([disabled])) .chip-container:focus-visible .state-layer {
|
|
107
|
-
opacity: 0.1;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
:host(:not([disabled])) .chip-container:active .state-layer {
|
|
111
|
-
opacity: 0.1;
|
|
112
|
-
}
|
|
113
|
-
`];
|
|
114
|
-
/** Value identifier for the chip */
|
|
115
|
-
@property({ type: String, reflect: true })
|
|
116
|
-
value: string = ''
|
|
117
|
-
|
|
118
|
-
/** Optional icon name (Material Symbols) */
|
|
119
|
-
@property({ type: String, reflect: true })
|
|
120
|
-
icon: string = ''
|
|
121
|
-
|
|
122
|
-
/** Optional avatar image URL */
|
|
123
|
-
@property({ type: String, reflect: true })
|
|
124
|
-
avatar: string = ''
|
|
125
|
-
|
|
126
|
-
/** Whether to show remove button (default true for input chips) */
|
|
127
|
-
@property({ type: Boolean, reflect: true })
|
|
128
|
-
removable: boolean = true
|
|
129
|
-
|
|
130
|
-
/** Disable the chip */
|
|
131
|
-
@property({ type: Boolean, reflect: true })
|
|
132
|
-
disabled: boolean = false
|
|
133
|
-
|
|
134
|
-
/** Elevated style variant */
|
|
135
|
-
@property({ type: Boolean, reflect: true })
|
|
136
|
-
elevated: boolean = false
|
|
137
|
-
|
|
138
|
-
// RxJS state streams
|
|
139
|
-
private chipHover$ = new BehaviorSubject<boolean>(false)
|
|
140
|
-
private removeHover$ = new BehaviorSubject<boolean>(false)
|
|
141
|
-
private focused$ = new BehaviorSubject<boolean>(false)
|
|
142
|
-
private pressed$ = new BehaviorSubject<boolean>(false)
|
|
143
|
-
|
|
144
|
-
// UI state from combined streams
|
|
145
|
-
@state() uiState = {
|
|
146
|
-
chipHover: false,
|
|
147
|
-
removeHover: false,
|
|
148
|
-
focused: false,
|
|
149
|
-
pressed: false
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
// Ripple effects
|
|
153
|
-
@state() private ripples: Array<{ x: number; y: number; id: number }> = []
|
|
154
|
-
private nextRippleId = 0
|
|
155
|
-
|
|
156
|
-
constructor() {
|
|
157
|
-
super()
|
|
158
|
-
try {
|
|
159
|
-
this.internals = this.attachInternals()
|
|
160
|
-
} catch {
|
|
161
|
-
this.internals = undefined
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
protected static shadowRootOptions = {
|
|
166
|
-
...LitElement.shadowRootOptions,
|
|
167
|
-
delegatesFocus: true,
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
static formAssociated = true
|
|
171
|
-
internals: ElementInternals | undefined
|
|
172
|
-
get form() {
|
|
173
|
-
return this.internals?.form
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
protected updated(changed: Map<string, unknown>) {
|
|
177
|
-
super.updated?.(changed)
|
|
178
|
-
if (changed.has('value')) {
|
|
179
|
-
this.internals?.setFormValue(this.value || null)
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
connectedCallback() {
|
|
184
|
-
super.connectedCallback()
|
|
185
|
-
|
|
186
|
-
// Combine all UI state streams
|
|
187
|
-
combineLatest([
|
|
188
|
-
this.chipHover$,
|
|
189
|
-
this.removeHover$,
|
|
190
|
-
this.focused$,
|
|
191
|
-
this.pressed$
|
|
192
|
-
]).pipe(
|
|
193
|
-
map(([chipHover, removeHover, focused, pressed]) => ({
|
|
194
|
-
chipHover,
|
|
195
|
-
removeHover,
|
|
196
|
-
focused,
|
|
197
|
-
pressed
|
|
198
|
-
})),
|
|
199
|
-
tap(state => {
|
|
200
|
-
this.uiState = state
|
|
201
|
-
}),
|
|
202
|
-
takeUntil(this.disconnecting)
|
|
203
|
-
).subscribe()
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
private handleChipClick = (e: MouseEvent) => {
|
|
207
|
-
if (this.disabled) return
|
|
208
|
-
|
|
209
|
-
// Add ripple effect
|
|
210
|
-
const chip = this.shadowRoot?.querySelector('.chip-container') as HTMLElement
|
|
211
|
-
if (chip) {
|
|
212
|
-
const rect = chip.getBoundingClientRect()
|
|
213
|
-
const x = e.clientX - rect.left
|
|
214
|
-
const y = e.clientY - rect.top
|
|
215
|
-
const id = this.nextRippleId++
|
|
216
|
-
|
|
217
|
-
this.ripples = [...this.ripples, { x, y, id }]
|
|
218
|
-
|
|
219
|
-
// Remove ripple after animation
|
|
220
|
-
setTimeout(() => {
|
|
221
|
-
this.ripples = this.ripples.filter(r => r.id !== id)
|
|
222
|
-
}, 600)
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
// Dispatch optional click event (for custom handling if needed)
|
|
226
|
-
this.dispatchEvent(
|
|
227
|
-
new CustomEvent('click', {
|
|
228
|
-
detail: { value: this.value },
|
|
229
|
-
bubbles: true,
|
|
230
|
-
composed: true,
|
|
231
|
-
})
|
|
232
|
-
)
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
private handleRemove = (e: Event) => {
|
|
236
|
-
if (this.disabled) return
|
|
237
|
-
|
|
238
|
-
e.stopPropagation()
|
|
239
|
-
|
|
240
|
-
// Dispatch remove event
|
|
241
|
-
this.dispatchEvent(
|
|
242
|
-
new CustomEvent('remove', {
|
|
243
|
-
detail: { value: this.value },
|
|
244
|
-
bubbles: true,
|
|
245
|
-
composed: true,
|
|
246
|
-
})
|
|
247
|
-
)
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
private handleKeyDown = (e: KeyboardEvent) => {
|
|
251
|
-
if (this.disabled) return
|
|
252
|
-
|
|
253
|
-
// Delete or Backspace removes the chip
|
|
254
|
-
if ((e.key === 'Delete' || e.key === 'Backspace') && this.removable) {
|
|
255
|
-
e.preventDefault()
|
|
256
|
-
this.handleRemove(e)
|
|
257
|
-
}
|
|
258
|
-
// Enter can optionally trigger click
|
|
259
|
-
else if (e.key === 'Enter') {
|
|
260
|
-
e.preventDefault()
|
|
261
|
-
const clickEvent = new MouseEvent('click', {
|
|
262
|
-
bubbles: true,
|
|
263
|
-
cancelable: true,
|
|
264
|
-
clientX: 0,
|
|
265
|
-
clientY: 0
|
|
266
|
-
})
|
|
267
|
-
this.handleChipClick(clickEvent)
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
private handleFocus = () => {
|
|
272
|
-
this.focused$.next(true)
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
private handleBlur = () => {
|
|
276
|
-
this.focused$.next(false)
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
protected render(): unknown {
|
|
280
|
-
const hasLeadingIcon = this.avatar || this.icon;
|
|
281
|
-
|
|
282
|
-
const chipClasses = {
|
|
283
|
-
'chip-container': true,
|
|
284
|
-
'inline-flex': true,
|
|
285
|
-
'items-center': true,
|
|
286
|
-
'gap-2': true,
|
|
287
|
-
'h-8': true, // M3: 32px height
|
|
288
|
-
'min-h-[32px]': true,
|
|
289
|
-
'rounded-full': true,
|
|
290
|
-
'cursor-default': true,
|
|
291
|
-
'transition-all': true,
|
|
292
|
-
'duration-200': true,
|
|
293
|
-
'select-none': true,
|
|
294
|
-
'text-sm': true, // M3: 14px Label Large
|
|
295
|
-
'font-medium': true, // M3: 500 weight
|
|
296
|
-
'relative': true,
|
|
297
|
-
'overflow-hidden': true,
|
|
298
|
-
|
|
299
|
-
// M3 Padding: 8px with icon, 16px without (leading), 8px with trailing icon
|
|
300
|
-
'pl-2': hasLeadingIcon, // 8px with avatar/icon
|
|
301
|
-
'pl-4': !hasLeadingIcon, // 16px without
|
|
302
|
-
'pr-2': this.removable, // 8px with remove button
|
|
303
|
-
'pr-4': !this.removable, // 16px without
|
|
304
|
-
|
|
305
|
-
// M3 Colors for input chips
|
|
306
|
-
'bg-surface-containerLow': true,
|
|
307
|
-
'text-surface-onVariant': true,
|
|
308
|
-
// Input chips are flat (no elevation) per M3
|
|
309
|
-
|
|
310
|
-
// Focus-visible state
|
|
311
|
-
'focus-visible:outline': !this.disabled,
|
|
312
|
-
'focus-visible:outline-2': !this.disabled,
|
|
313
|
-
'focus-visible:outline-primary': !this.disabled,
|
|
314
|
-
'focus-visible:outline-offset-2': !this.disabled,
|
|
315
|
-
|
|
316
|
-
// Disabled state
|
|
317
|
-
'opacity-38': this.disabled, // M3 disabled opacity
|
|
318
|
-
'cursor-not-allowed': this.disabled
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
const removeButtonClasses = {
|
|
322
|
-
'size-[18px]': true, // M3: 18px icon size
|
|
323
|
-
'flex': true,
|
|
324
|
-
'items-center': true,
|
|
325
|
-
'justify-center': true,
|
|
326
|
-
'rounded-full': true,
|
|
327
|
-
'transition-all': true,
|
|
328
|
-
'duration-200': true,
|
|
329
|
-
'cursor-pointer': !this.disabled,
|
|
330
|
-
'-mr-1': true, // Adjust for visual balance
|
|
331
|
-
|
|
332
|
-
// Hover state for remove button
|
|
333
|
-
'hover:bg-surface-containerHighest': !this.disabled,
|
|
334
|
-
'opacity-50': this.disabled
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
return html`
|
|
338
|
-
<div
|
|
339
|
-
class=${classMap(chipClasses)}
|
|
340
|
-
@click=${this.handleChipClick}
|
|
341
|
-
@keydown=${this.handleKeyDown}
|
|
342
|
-
@mouseenter=${() => this.chipHover$.next(true)}
|
|
343
|
-
@mouseleave=${() => this.chipHover$.next(false)}
|
|
344
|
-
@mousedown=${() => this.pressed$.next(true)}
|
|
345
|
-
@mouseup=${() => this.pressed$.next(false)}
|
|
346
|
-
@focus=${this.handleFocus}
|
|
347
|
-
@blur=${this.handleBlur}
|
|
348
|
-
role="button"
|
|
349
|
-
tabindex=${this.disabled ? '-1' : '0'}
|
|
350
|
-
aria-disabled=${this.disabled}
|
|
351
|
-
aria-label=${this.value}
|
|
352
|
-
>
|
|
353
|
-
<!-- Avatar image (if provided) -->
|
|
354
|
-
${this.avatar ? html`
|
|
355
|
-
<img
|
|
356
|
-
src=${this.avatar}
|
|
357
|
-
alt=""
|
|
358
|
-
class="avatar-img rounded-full size-5"
|
|
359
|
-
/>
|
|
360
|
-
` : ''}
|
|
361
|
-
|
|
362
|
-
<!-- Icon (if provided and no avatar) -->
|
|
363
|
-
${this.icon && !this.avatar ? html`
|
|
364
|
-
<span class="material-symbols-outlined text-[18px] shrink-0">
|
|
365
|
-
${this.icon}
|
|
366
|
-
</span>
|
|
367
|
-
` : ''}
|
|
368
|
-
|
|
369
|
-
<!-- Chip content -->
|
|
370
|
-
<span class="text-sm font-medium leading-5">
|
|
371
|
-
<slot></slot>
|
|
372
|
-
</span>
|
|
373
|
-
|
|
374
|
-
<!-- Remove button (shown by default for input chips) -->
|
|
375
|
-
${this.removable ? html`
|
|
376
|
-
<button
|
|
377
|
-
class=${classMap(removeButtonClasses)}
|
|
378
|
-
@click=${this.handleRemove}
|
|
379
|
-
@mouseenter=${() => this.removeHover$.next(true)}
|
|
380
|
-
@mouseleave=${() => this.removeHover$.next(false)}
|
|
381
|
-
aria-label="Remove"
|
|
382
|
-
tabindex="-1"
|
|
383
|
-
?disabled=${this.disabled}
|
|
384
|
-
>
|
|
385
|
-
<span class="material-symbols-outlined text-[18px]">
|
|
386
|
-
close
|
|
387
|
-
</span>
|
|
388
|
-
</button>
|
|
389
|
-
` : ''}
|
|
390
|
-
|
|
391
|
-
<!-- Ripple effects -->
|
|
392
|
-
${this.ripples.map(ripple => html`
|
|
393
|
-
<span
|
|
394
|
-
class="ripple"
|
|
395
|
-
style="left: ${ripple.x}px; top: ${ripple.y}px;"
|
|
396
|
-
></span>
|
|
397
|
-
`)}
|
|
398
|
-
|
|
399
|
-
<!-- State layer for M3 hover/focus/pressed states -->
|
|
400
|
-
<div class="state-layer"></div>
|
|
401
|
-
</div>
|
|
402
|
-
`
|
|
403
|
-
}
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
declare global {
|
|
407
|
-
interface HTMLElementTagNameMap {
|
|
408
|
-
'schmancy-input-chip': SchmancyInputChip
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
export type InputChipClickEvent = { value: string }
|
|
413
|
-
export type InputChipRemoveEvent = { value: string }
|
|
1
|
+
// Moved to src/form/fields/chips/ — this is a backward-compat re-export shim.
|
|
2
|
+
export * from '../form/fields/chips/input-chip';
|
|
@@ -1,266 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import { customElement, property, state } from 'lit/decorators.js'
|
|
4
|
-
import { classMap } from 'lit/directives/class-map.js'
|
|
5
|
-
import { BehaviorSubject, combineLatest } from 'rxjs'
|
|
6
|
-
import { takeUntil } from 'rxjs/operators'
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Suggestion chip component - provides contextual recommendations to users
|
|
10
|
-
*
|
|
11
|
-
* IMPORTANT: Suggestion chips do NOT have a selected state. They are designed to
|
|
12
|
-
* provide suggestions and recommendations that trigger actions when clicked.
|
|
13
|
-
* Unlike filter chips, they cannot be toggled on/off.
|
|
14
|
-
*
|
|
15
|
-
* Pure Schmancy implementation with Tailwind CSS and RxJS state management
|
|
16
|
-
*/
|
|
17
|
-
@customElement('schmancy-suggestion-chip')
|
|
18
|
-
export class SchmancySuggestionChip extends SchmancyElement {
|
|
19
|
-
static styles = [css`
|
|
20
|
-
:host {
|
|
21
|
-
display: inline-block;
|
|
22
|
-
outline: none;
|
|
23
|
-
width: fit-content;
|
|
24
|
-
min-width: fit-content;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
:host([disabled]) {
|
|
28
|
-
pointer-events: none;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
.ripple {
|
|
32
|
-
position: absolute;
|
|
33
|
-
border-radius: 50%;
|
|
34
|
-
transform: scale(0);
|
|
35
|
-
animation: ripple 600ms linear;
|
|
36
|
-
background-color: rgba(0, 0, 0, 0.08);
|
|
37
|
-
pointer-events: none;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
@keyframes ripple {
|
|
41
|
-
to {
|
|
42
|
-
transform: scale(4);
|
|
43
|
-
opacity: 0;
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/* State layer for M3 hover/focus/pressed states */
|
|
48
|
-
.state-layer {
|
|
49
|
-
position: absolute;
|
|
50
|
-
inset: 0;
|
|
51
|
-
border-radius: inherit;
|
|
52
|
-
pointer-events: none;
|
|
53
|
-
background-color: currentColor;
|
|
54
|
-
opacity: 0;
|
|
55
|
-
transition: opacity 200ms ease;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
:host(:not([disabled])) button:hover .state-layer {
|
|
59
|
-
opacity: 0.08;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
:host(:not([disabled])) button:focus-visible .state-layer {
|
|
63
|
-
opacity: 0.1;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
:host(:not([disabled])) button:active .state-layer {
|
|
67
|
-
opacity: 0.1;
|
|
68
|
-
}
|
|
69
|
-
`];
|
|
70
|
-
/** Value identifier for the chip */
|
|
71
|
-
@property({ reflect: true }) value = ''
|
|
72
|
-
|
|
73
|
-
/** Optional icon name (Material Symbols) */
|
|
74
|
-
@property({ reflect: true }) icon = ''
|
|
75
|
-
|
|
76
|
-
/** Optional href for navigation */
|
|
77
|
-
@property({ reflect: true }) href = ''
|
|
78
|
-
|
|
79
|
-
/** Target for navigation (e.g., '_blank') */
|
|
80
|
-
@property({ reflect: true }) target = ''
|
|
81
|
-
|
|
82
|
-
/** Disable the chip */
|
|
83
|
-
@property({ type: Boolean, reflect: true }) disabled = false
|
|
84
|
-
|
|
85
|
-
/** Elevated style variant - flat by default per M3 spec */
|
|
86
|
-
@property({ type: Boolean, reflect: true }) elevated = false
|
|
87
|
-
|
|
88
|
-
// RxJS state streams
|
|
89
|
-
private hover$ = new BehaviorSubject<boolean>(false)
|
|
90
|
-
private pressed$ = new BehaviorSubject<boolean>(false)
|
|
91
|
-
private focused$ = new BehaviorSubject<boolean>(false)
|
|
92
|
-
|
|
93
|
-
// UI state - only ripples needed for rendering
|
|
94
|
-
@state() private ripples: Array<{ x: number; y: number; id: number }> = []
|
|
95
|
-
|
|
96
|
-
protected static shadowRootOptions = { ...LitElement.shadowRootOptions, delegatesFocus: true }
|
|
97
|
-
|
|
98
|
-
private nextRippleId = 0
|
|
99
|
-
|
|
100
|
-
connectedCallback() {
|
|
101
|
-
super.connectedCallback()
|
|
102
|
-
|
|
103
|
-
// Stream management for future extensions
|
|
104
|
-
// Currently, states are handled directly in event handlers
|
|
105
|
-
// This pipeline can be extended for more complex state interactions
|
|
106
|
-
combineLatest([
|
|
107
|
-
this.hover$,
|
|
108
|
-
this.pressed$,
|
|
109
|
-
this.focused$
|
|
110
|
-
]).pipe(
|
|
111
|
-
// States are managed through event handlers directly
|
|
112
|
-
// This pipeline is kept for potential future state combinations
|
|
113
|
-
takeUntil(this.disconnecting)
|
|
114
|
-
).subscribe()
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
private handleClick = (e: MouseEvent) => {
|
|
118
|
-
if (this.disabled) return
|
|
119
|
-
|
|
120
|
-
// Add ripple effect
|
|
121
|
-
const button = this.shadowRoot?.querySelector('button')
|
|
122
|
-
if (button) {
|
|
123
|
-
const rect = button.getBoundingClientRect()
|
|
124
|
-
const x = e.clientX - rect.left
|
|
125
|
-
const y = e.clientY - rect.top
|
|
126
|
-
const id = this.nextRippleId++
|
|
127
|
-
|
|
128
|
-
this.ripples = [...this.ripples, { x, y, id }]
|
|
129
|
-
|
|
130
|
-
// Remove ripple after animation
|
|
131
|
-
setTimeout(() => {
|
|
132
|
-
this.ripples = this.ripples.filter(r => r.id !== id)
|
|
133
|
-
}, 600)
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
// Navigate if href is provided
|
|
137
|
-
if (this.href) {
|
|
138
|
-
if (this.target === '_blank') {
|
|
139
|
-
window.open(this.href, '_blank')
|
|
140
|
-
} else {
|
|
141
|
-
window.location.href = this.href
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
// Dispatch action event
|
|
146
|
-
this.dispatchEvent(new CustomEvent('action', {
|
|
147
|
-
detail: { value: this.value },
|
|
148
|
-
bubbles: true,
|
|
149
|
-
composed: true
|
|
150
|
-
}))
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
private handleKeyDown = (e: KeyboardEvent) => {
|
|
154
|
-
if (this.disabled) return
|
|
155
|
-
|
|
156
|
-
if (e.key === 'Enter' || e.key === ' ') {
|
|
157
|
-
e.preventDefault()
|
|
158
|
-
this.pressed$.next(true)
|
|
159
|
-
|
|
160
|
-
// Simulate click
|
|
161
|
-
const clickEvent = new MouseEvent('click', {
|
|
162
|
-
bubbles: true,
|
|
163
|
-
cancelable: true,
|
|
164
|
-
clientX: 0,
|
|
165
|
-
clientY: 0
|
|
166
|
-
})
|
|
167
|
-
this.handleClick(clickEvent)
|
|
168
|
-
|
|
169
|
-
setTimeout(() => this.pressed$.next(false), 100)
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
private handleFocus = () => {
|
|
174
|
-
this.focused$.next(true)
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
private handleBlur = () => {
|
|
178
|
-
this.focused$.next(false)
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
protected render(): unknown {
|
|
182
|
-
const hasIcon = !!this.icon;
|
|
183
|
-
|
|
184
|
-
const classes = {
|
|
185
|
-
'relative': true,
|
|
186
|
-
'inline-flex': true,
|
|
187
|
-
'items-center': true,
|
|
188
|
-
'gap-2': true,
|
|
189
|
-
'h-8': true, // M3: 32px height
|
|
190
|
-
'min-h-[32px]': true,
|
|
191
|
-
'rounded-full': true,
|
|
192
|
-
'cursor-pointer': !this.disabled,
|
|
193
|
-
'transition-all': true,
|
|
194
|
-
'duration-200': true,
|
|
195
|
-
'select-none': true,
|
|
196
|
-
'overflow-hidden': true,
|
|
197
|
-
|
|
198
|
-
// M3 Padding: 8px with icon, 16px without (leading), 16px trailing
|
|
199
|
-
'pl-2': hasIcon, // 8px with icon
|
|
200
|
-
'pl-4': !hasIcon, // 16px without icon
|
|
201
|
-
'pr-4': true, // 16px trailing
|
|
202
|
-
|
|
203
|
-
// M3 Colors for suggestion chips
|
|
204
|
-
'bg-surface-containerLow': true,
|
|
205
|
-
'text-surface-onVariant': true,
|
|
206
|
-
|
|
207
|
-
// Suggestion chips are flat by default (no elevation per M3)
|
|
208
|
-
|
|
209
|
-
// Focus state
|
|
210
|
-
'focus-visible:outline': !this.disabled,
|
|
211
|
-
'focus-visible:outline-2': !this.disabled,
|
|
212
|
-
'focus-visible:outline-primary': !this.disabled,
|
|
213
|
-
'focus-visible:outline-offset-2': !this.disabled,
|
|
214
|
-
|
|
215
|
-
// Disabled
|
|
216
|
-
'opacity-38': this.disabled, // M3 disabled opacity
|
|
217
|
-
'cursor-not-allowed': this.disabled
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
return html`
|
|
221
|
-
<button
|
|
222
|
-
type="button"
|
|
223
|
-
class=${classMap(classes)}
|
|
224
|
-
?disabled=${this.disabled}
|
|
225
|
-
@click=${this.handleClick}
|
|
226
|
-
@keydown=${this.handleKeyDown}
|
|
227
|
-
@mouseenter=${() => this.hover$.next(true)}
|
|
228
|
-
@mouseleave=${() => this.hover$.next(false)}
|
|
229
|
-
@mousedown=${() => this.pressed$.next(true)}
|
|
230
|
-
@mouseup=${() => this.pressed$.next(false)}
|
|
231
|
-
@focus=${this.handleFocus}
|
|
232
|
-
@blur=${this.handleBlur}
|
|
233
|
-
tabindex=${this.disabled ? '-1' : '0'}
|
|
234
|
-
role="button"
|
|
235
|
-
aria-disabled=${this.disabled}
|
|
236
|
-
aria-label=${this.value}
|
|
237
|
-
>
|
|
238
|
-
${this.icon ? html`
|
|
239
|
-
<schmancy-icon class="text-[18px] shrink-0">${this.icon}</schmancy-icon>
|
|
240
|
-
` : ''}
|
|
241
|
-
<span class="text-sm font-medium leading-5">
|
|
242
|
-
<slot></slot>
|
|
243
|
-
</span>
|
|
244
|
-
|
|
245
|
-
<!-- Ripple effects -->
|
|
246
|
-
${this.ripples.map(ripple => html`
|
|
247
|
-
<span
|
|
248
|
-
class="ripple"
|
|
249
|
-
style="left: ${ripple.x}px; top: ${ripple.y}px;"
|
|
250
|
-
></span>
|
|
251
|
-
`)}
|
|
252
|
-
|
|
253
|
-
<!-- State layer for M3 hover/focus/pressed states -->
|
|
254
|
-
<div class="state-layer"></div>
|
|
255
|
-
</button>
|
|
256
|
-
`
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
declare global {
|
|
261
|
-
interface HTMLElementTagNameMap {
|
|
262
|
-
'schmancy-suggestion-chip': SchmancySuggestionChip
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
export type SuggestionChipActionEvent = { value: string }
|
|
1
|
+
// Moved to src/form/fields/chips/ — this is a backward-compat re-export shim.
|
|
2
|
+
export * from '../form/fields/chips/suggestion-chip';
|