@mhmo91/schmancy 0.10.29 → 0.10.31
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/dist/{mixins-CxGRIPYQ.cjs → SchmancyElement-D8_z9JrW.cjs} +2 -242
- package/dist/SchmancyElement-D8_z9JrW.cjs.map +1 -0
- package/dist/{mixins-BfazlmLD.js → SchmancyElement-DuzT2AMa.js} +149 -492
- package/dist/SchmancyElement-DuzT2AMa.js.map +1 -0
- package/dist/agent/{flow-3RrZM-e7.js.map → flow-CvG1fLW5.js.map} +1 -1
- package/dist/agent/schmancy.agent.js +8465 -2980
- package/dist/agent/schmancy.agent.js.map +1 -1
- package/dist/agent/{vendor-material-color-33Mj762T.js.map → vendor-material-color-DcL7ZPxx.js.map} +1 -1
- package/dist/animation-CCOIW4wJ.cjs.map +1 -1
- package/dist/animation-DCznELuT.js.map +1 -1
- package/dist/{area-D5wIy4Fn.js → area-0l8V7HlF.js} +2 -2
- package/dist/{area-D5wIy4Fn.js.map → area-0l8V7HlF.js.map} +1 -1
- package/dist/area-WGfTrwcJ.cjs +21 -0
- package/dist/{area-HXuLLQnN.cjs.map → area-WGfTrwcJ.cjs.map} +1 -1
- package/dist/area.cjs +1 -1
- package/dist/area.js +1 -1
- package/dist/{audio-Cvmemu84.cjs → audio-9QLk4pU-.cjs} +1 -1
- package/dist/{audio-Cvmemu84.cjs.map → audio-9QLk4pU-.cjs.map} +1 -1
- package/dist/{audio-CxO5a2HL.js → audio-x9oLVKBH.js} +1 -1
- package/dist/{audio-CxO5a2HL.js.map → audio-x9oLVKBH.js.map} +1 -1
- package/dist/audio.cjs +1 -1
- package/dist/audio.js +2 -2
- package/dist/{autocomplete-hj2AQyEF.cjs → autocomplete-CjjfXbJC.cjs} +2 -2
- package/dist/{autocomplete-hj2AQyEF.cjs.map → autocomplete-CjjfXbJC.cjs.map} +1 -1
- package/dist/{autocomplete-DCkkdDON.js → autocomplete-sjZovPcs.js} +7 -7
- package/dist/{autocomplete-DCkkdDON.js.map → autocomplete-sjZovPcs.js.map} +1 -1
- package/dist/autocomplete.cjs +1 -1
- package/dist/autocomplete.js +1 -1
- package/dist/avatar.cjs +3 -3
- package/dist/avatar.cjs.map +1 -1
- package/dist/avatar.js +3 -3
- package/dist/avatar.js.map +1 -1
- package/dist/badge.cjs +1 -1
- package/dist/badge.js +1 -1
- package/dist/{boat-BfgbRnhA.js → boat-CEaQaCmG.js} +3 -3
- package/dist/{boat-BfgbRnhA.js.map → boat-CEaQaCmG.js.map} +1 -1
- package/dist/{boat-B_5F_rFr.cjs → boat-CI5rcGS5.cjs} +11 -11
- package/dist/{boat-B_5F_rFr.cjs.map → boat-CI5rcGS5.cjs.map} +1 -1
- package/dist/boat.cjs +1 -1
- package/dist/boat.js +1 -1
- package/dist/breadcrumb.cjs +4 -4
- package/dist/breadcrumb.cjs.map +1 -1
- package/dist/breadcrumb.js +2 -2
- package/dist/breadcrumb.js.map +1 -1
- package/dist/{busy-zIt9bTZn.cjs → busy-DDKXlzDA.cjs} +8 -8
- package/dist/{busy-zIt9bTZn.cjs.map → busy-DDKXlzDA.cjs.map} +1 -1
- package/dist/{busy-D6tAS-kW.js → busy-DwD-XHqS.js} +2 -2
- package/dist/{busy-D6tAS-kW.js.map → busy-DwD-XHqS.js.map} +1 -1
- package/dist/busy.cjs +1 -1
- package/dist/busy.js +1 -1
- package/dist/{button-D7AejvfK.js → button-BnGN6SsV.js} +2 -2
- package/dist/{button-D7AejvfK.js.map → button-BnGN6SsV.js.map} +1 -1
- package/dist/{button-8oMffyiO.cjs → button-DlqCWuk-.cjs} +15 -15
- package/dist/{button-8oMffyiO.cjs.map → button-DlqCWuk-.cjs.map} +1 -1
- package/dist/button.cjs +19 -19
- package/dist/button.cjs.map +1 -1
- package/dist/button.js +3 -3
- package/dist/button.js.map +1 -1
- package/dist/{card-CUt9fm_4.js → card-D3IxxBBP.js} +2 -2
- package/dist/{card-CUt9fm_4.js.map → card-D3IxxBBP.js.map} +1 -1
- package/dist/{card-CTucMMgp.cjs → card-DWZhZ5Ds.cjs} +10 -10
- package/dist/{card-CTucMMgp.cjs.map → card-DWZhZ5Ds.cjs.map} +1 -1
- package/dist/card.cjs +1 -1
- package/dist/card.js +1 -1
- package/dist/{checkbox-DrKsfzC4.cjs → checkbox-BBttnA_a.cjs} +3 -3
- package/dist/{checkbox-DrKsfzC4.cjs.map → checkbox-BBttnA_a.cjs.map} +1 -1
- package/dist/{checkbox-DMmqe2OO.js → checkbox-t__wRS-9.js} +5 -5
- package/dist/{checkbox-DMmqe2OO.js.map → checkbox-t__wRS-9.js.map} +1 -1
- package/dist/checkbox.cjs +1 -1
- package/dist/checkbox.js +1 -1
- package/dist/{chips-DRGsqDMA.js → chips-B8HM25xv.js} +4 -4
- package/dist/{chips-DRGsqDMA.js.map → chips-B8HM25xv.js.map} +1 -1
- package/dist/{chips-B1yQgLyW.cjs → chips-lipKBK9P.cjs} +18 -18
- package/dist/{chips-B1yQgLyW.cjs.map → chips-lipKBK9P.cjs.map} +1 -1
- package/dist/chips.cjs +1 -1
- package/dist/chips.js +2 -2
- package/dist/connectivity.cjs +7 -7
- package/dist/connectivity.cjs.map +1 -1
- package/dist/connectivity.js +3 -3
- package/dist/connectivity.js.map +1 -1
- package/dist/content-drawer.cjs +1 -1
- package/dist/content-drawer.js +1 -1
- package/dist/cursor-glow-Ah7VXSj7.js.map +1 -1
- package/dist/cursor-glow-Bulq-38P.cjs.map +1 -1
- package/dist/{date-range-TDF-f0ss.js → date-range-CObvXmZ4.js} +6 -6
- package/dist/{date-range-TDF-f0ss.js.map → date-range-CObvXmZ4.js.map} +1 -1
- package/dist/{date-range-BeF0dW1W.cjs → date-range-DXct0_Jg.cjs} +3 -3
- package/dist/{date-range-BeF0dW1W.cjs.map → date-range-DXct0_Jg.cjs.map} +1 -1
- package/dist/{date-range-inline-JLsmcle2.js → date-range-inline-BEP-oWJZ.js} +5 -5
- package/dist/{date-range-inline-JLsmcle2.js.map → date-range-inline-BEP-oWJZ.js.map} +1 -1
- package/dist/date-range-inline-lhkwHFxY.cjs +43 -0
- package/dist/{date-range-inline-BnhQZTK0.cjs.map → date-range-inline-lhkwHFxY.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.cjs +4 -4
- package/dist/delay.cjs.map +1 -1
- package/dist/delay.js +2 -2
- package/dist/delay.js.map +1 -1
- package/dist/{details-T75tUASO.cjs → details-DSGEewvZ.cjs} +2 -2
- package/dist/{details-T75tUASO.cjs.map → details-DSGEewvZ.cjs.map} +1 -1
- package/dist/{details-ChMhQpcY.js → details-nRdT8J-W.js} +11 -11
- package/dist/{details-ChMhQpcY.js.map → details-nRdT8J-W.js.map} +1 -1
- package/dist/details.cjs +1 -1
- package/dist/details.js +1 -1
- package/dist/{directives-BkSqmLBV.cjs → directives-DJbBHfID.cjs} +1 -1
- package/dist/{directives-BkSqmLBV.cjs.map → directives-DJbBHfID.cjs.map} +1 -1
- package/dist/{directives-DgPbz0lQ.js → directives-DZzxV3Hh.js} +3 -3
- package/dist/{directives-DgPbz0lQ.js.map → directives-DZzxV3Hh.js.map} +1 -1
- package/dist/directives.cjs +1 -1
- package/dist/directives.js +2 -2
- package/dist/discovery.service-CIa3Eeuk.cjs.map +1 -1
- package/dist/discovery.service-DZFxtRwW.js.map +1 -1
- package/dist/{divider-D69bhEUY.js → divider-BHgrisGQ.js} +2 -2
- package/dist/{divider-D69bhEUY.js.map → divider-BHgrisGQ.js.map} +1 -1
- package/dist/{divider-DopO0yKi.cjs → divider-D21yKZNJ.cjs} +3 -3
- package/dist/{divider-DopO0yKi.cjs.map → divider-D21yKZNJ.cjs.map} +1 -1
- package/dist/divider.cjs +1 -1
- package/dist/divider.js +1 -1
- package/dist/dropdown.cjs +4 -4
- package/dist/dropdown.cjs.map +1 -1
- package/dist/dropdown.js +2 -2
- package/dist/dropdown.js.map +1 -1
- package/dist/{expand-KLSx5dea.js → expand-2TTbmm_z.js} +9 -9
- package/dist/{expand-KLSx5dea.js.map → expand-2TTbmm_z.js.map} +1 -1
- package/dist/{expand-C386rVT8.cjs → expand-wRphbpW6.cjs} +3 -3
- package/dist/{expand-C386rVT8.cjs.map → expand-wRphbpW6.cjs.map} +1 -1
- package/dist/expand.cjs +1 -1
- package/dist/expand.js +1 -1
- package/dist/float-B0L_CH4v.cjs +1 -0
- package/dist/{float-DyaPI0qO.cjs.map → float-B0L_CH4v.cjs.map} +1 -1
- package/dist/{float-BoPLNysg.js → float-dtDqRmcL.js} +2 -2
- package/dist/{float-BoPLNysg.js.map → float-dtDqRmcL.js.map} +1 -1
- package/dist/float.cjs +1 -1
- package/dist/float.js +1 -1
- package/dist/{form-CYeMWHmy.js → form-BxY-9F6N.js} +6 -6
- package/dist/{form-CYeMWHmy.js.map → form-BxY-9F6N.js.map} +1 -1
- package/dist/{form-CGIJlQyP.cjs → form-DvqHReDF.cjs} +3 -3
- package/dist/{form-CGIJlQyP.cjs.map → form-DvqHReDF.cjs.map} +1 -1
- package/dist/form.cjs +6 -6
- package/dist/form.cjs.map +1 -1
- package/dist/form.js +10 -10
- package/dist/form.js.map +1 -1
- package/dist/gravity-6pL6CfIr.cjs.map +1 -1
- package/dist/gravity-sVK3zGBF.js.map +1 -1
- package/dist/handover/agent-runtime-followups.md +1 -1
- package/dist/handover/agent-runtime-v1.md +3 -3
- package/dist/hashContent-BqU6v1Xr.js.map +1 -1
- package/dist/hashContent-iRZJJWtE.cjs.map +1 -1
- package/dist/{icons-CJUA5bfI.cjs → icons-BbC4t44c.cjs} +6 -6
- package/dist/{icons-CJUA5bfI.cjs.map → icons-BbC4t44c.cjs.map} +1 -1
- package/dist/{icons-BUQNMhjw.js → icons-CO8UrTJQ.js} +2 -2
- package/dist/{icons-BUQNMhjw.js.map → icons-CO8UrTJQ.js.map} +1 -1
- package/dist/icons.cjs +1 -1
- package/dist/icons.js +1 -1
- package/dist/{iframe-pn7MIeH8.cjs → iframe-BepoWz9Z.cjs} +5 -5
- package/dist/{iframe-pn7MIeH8.cjs.map → iframe-BepoWz9Z.cjs.map} +1 -1
- package/dist/{iframe-CbL0jCo1.js → iframe-t5zo89Fs.js} +2 -2
- package/dist/{iframe-CbL0jCo1.js.map → iframe-t5zo89Fs.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 +68 -69
- package/dist/{input-C1h5lLiJ.js → input-2OR6wjfT.js} +15 -15
- package/dist/{input-C1h5lLiJ.js.map → input-2OR6wjfT.js.map} +1 -1
- package/dist/{input-Cmc0IoUP.cjs → input-B-wPPC5o.cjs} +2 -2
- package/dist/{input-Cmc0IoUP.cjs.map → input-B-wPPC5o.cjs.map} +1 -1
- package/dist/{input-chip-DqAR4nPD.js → input-chip-NBsnZkzu.js} +2 -2
- package/dist/{input-chip-DqAR4nPD.js.map → input-chip-NBsnZkzu.js.map} +1 -1
- package/dist/{input-chip-B0X_CodJ.cjs → input-chip-O5-pgek1.cjs} +9 -9
- package/dist/{input-chip-B0X_CodJ.cjs.map → input-chip-O5-pgek1.cjs.map} +1 -1
- package/dist/input.cjs +1 -1
- package/dist/input.js +1 -1
- package/dist/json.cjs +3 -3
- package/dist/json.cjs.map +1 -1
- package/dist/json.js +3 -3
- package/dist/json.js.map +1 -1
- package/dist/kbd.cjs +2 -2
- package/dist/kbd.cjs.map +1 -1
- package/dist/kbd.js +2 -2
- package/dist/kbd.js.map +1 -1
- package/dist/{layout-DSAjo92m.js → layout-CJ01zE9V.js} +1 -1
- package/dist/{layout-DSAjo92m.js.map → layout-CJ01zE9V.js.map} +1 -1
- package/dist/{layout-eXb9wjDh.cjs → layout-D7nKwpa5.cjs} +1 -1
- package/dist/{layout-eXb9wjDh.cjs.map → layout-D7nKwpa5.cjs.map} +1 -1
- package/dist/layout.cjs +2 -2
- package/dist/layout.cjs.map +1 -1
- package/dist/layout.js +2 -2
- package/dist/layout.js.map +1 -1
- package/dist/lazy-CayEFyC3.cjs.map +1 -1
- package/dist/lazy-D-bO2r4m.js.map +1 -1
- package/dist/{lightbox-BiNK_plj.cjs → lightbox-DVpvjsYb.cjs} +21 -21
- package/dist/{lightbox-BiNK_plj.cjs.map → lightbox-DVpvjsYb.cjs.map} +1 -1
- package/dist/{lightbox-C3zomJ-r.js → lightbox-Droe9dYY.js} +8 -8
- package/dist/{lightbox-C3zomJ-r.js.map → lightbox-Droe9dYY.js.map} +1 -1
- package/dist/lightbox.cjs +1 -1
- package/dist/lightbox.js +1 -1
- package/dist/{list-Bbmp1uMa.js → list-DzAWv99q.js} +2 -2
- package/dist/{list-Bbmp1uMa.js.map → list-DzAWv99q.js.map} +1 -1
- package/dist/{list-CbM9w9OM.cjs → list-JjUsFCP6.cjs} +5 -5
- package/dist/{list-CbM9w9OM.cjs.map → list-JjUsFCP6.cjs.map} +1 -1
- package/dist/list.cjs +1 -1
- package/dist/list.js +1 -1
- package/dist/magnetic-B2VKNfDu.js.map +1 -1
- package/dist/magnetic-MQ3HMHJi.cjs.map +1 -1
- package/dist/menu-BNPbrAmd.cjs +23 -0
- package/dist/{menu-Bfay8vF8.cjs.map → menu-BNPbrAmd.cjs.map} +1 -1
- package/dist/{menu-Ph2hboJd.js → menu-D2cZSp74.js} +3 -3
- package/dist/{menu-Ph2hboJd.js.map → menu-D2cZSp74.js.map} +1 -1
- package/dist/menu.cjs +1 -1
- package/dist/menu.js +1 -1
- package/dist/mixins-Cevarn7V.js +412 -0
- package/dist/mixins-Cevarn7V.js.map +1 -0
- package/dist/mixins-JyO9GSGy.cjs +245 -0
- package/dist/mixins-JyO9GSGy.cjs.map +1 -0
- package/dist/mixins.cjs +1 -1
- package/dist/mixins.js +3 -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 +10 -10
- package/dist/navigation-rail.cjs.map +1 -1
- package/dist/navigation-rail.js +2 -2
- package/dist/navigation-rail.js.map +1 -1
- package/dist/notification-CaeRS5US.cjs +24 -0
- package/dist/{notification-DT_cAi8U.cjs.map → notification-CaeRS5US.cjs.map} +1 -1
- package/dist/{notification-Du5FRbYp.js → notification-Dxwx0Zln.js} +4 -4
- package/dist/{notification-Du5FRbYp.js.map → notification-Dxwx0Zln.js.map} +1 -1
- package/dist/notification.cjs +1 -1
- package/dist/notification.js +1 -1
- package/dist/{option-B7y4FhOn.js → option-BCnYutZz.js} +2 -2
- package/dist/{option-B7y4FhOn.js.map → option-BCnYutZz.js.map} +1 -1
- package/dist/{option-Cl5Q987d.cjs → option-C6wXFQOM.cjs} +5 -5
- package/dist/{option-Cl5Q987d.cjs.map → option-C6wXFQOM.cjs.map} +1 -1
- package/dist/option.cjs +1 -1
- package/dist/option.js +1 -1
- package/dist/{overlay-B79m-KXf.js → overlay-BVdgWkIj.js} +5 -5
- package/dist/{overlay-B79m-KXf.js.map → overlay-BVdgWkIj.js.map} +1 -1
- package/dist/overlay-U5jr3OYG.cjs +43 -0
- package/dist/{overlay-CRwfhbyi.cjs.map → overlay-U5jr3OYG.cjs.map} +1 -1
- package/dist/overlay-stack-Bdr9lOqi.cjs.map +1 -1
- package/dist/overlay-stack-D2rgxQLh.js.map +1 -1
- package/dist/overlay.cjs +1 -1
- package/dist/overlay.confirm-body-BCWt92R7.cjs +70 -0
- package/dist/{overlay.confirm-body-CxOomuN6.cjs.map → overlay.confirm-body-BCWt92R7.cjs.map} +1 -1
- package/dist/{overlay.confirm-body-CW_spktW.js → overlay.confirm-body-BYPEKZtR.js} +6 -6
- package/dist/{overlay.confirm-body-CW_spktW.js.map → overlay.confirm-body-BYPEKZtR.js.map} +1 -1
- package/dist/overlay.js +3 -3
- package/dist/{overlay.service-fb3KaMiP.cjs → overlay.service-D4_SgGuT.cjs} +1 -1
- package/dist/{overlay.service-fb3KaMiP.cjs.map → overlay.service-D4_SgGuT.cjs.map} +1 -1
- package/dist/{overlay.service-DsBb_UwG.js → overlay.service-Dq2X6ibl.js} +2 -2
- package/dist/{overlay.service-DsBb_UwG.js.map → overlay.service-Dq2X6ibl.js.map} +1 -1
- package/dist/{progress-fnGrmHpm.cjs → progress-Bc_IBaNH.cjs} +7 -7
- package/dist/{progress-fnGrmHpm.cjs.map → progress-Bc_IBaNH.cjs.map} +1 -1
- package/dist/{progress-CMwUEDB1.js → progress-BoFm3r6h.js} +2 -2
- package/dist/{progress-CMwUEDB1.js.map → progress-BoFm3r6h.js.map} +1 -1
- package/dist/progress.cjs +1 -1
- package/dist/progress.js +1 -1
- package/dist/radio-group-C34WDjrN.cjs +19 -0
- package/dist/{radio-group-DQRJGMgS.cjs.map → radio-group-C34WDjrN.cjs.map} +1 -1
- package/dist/{radio-group-Zb0fies1.js → radio-group-DnHhGrXp.js} +6 -6
- package/dist/{radio-group-Zb0fies1.js.map → radio-group-DnHhGrXp.js.map} +1 -1
- package/dist/radio-group.cjs +1 -1
- package/dist/radio-group.js +1 -1
- package/dist/range.cjs +2 -2
- package/dist/range.cjs.map +1 -1
- package/dist/range.js +5 -5
- package/dist/range.js.map +1 -1
- package/dist/reduced-motion-D-L12p7G.js.map +1 -1
- package/dist/reduced-motion-Ds-HjMzn.cjs.map +1 -1
- package/dist/rxjs-utils-Csnks202.cjs.map +1 -1
- package/dist/rxjs-utils-d-ivVN84.js.map +1 -1
- package/dist/search-DPKoC-dT.cjs.map +1 -1
- package/dist/search-MvIBA93K.js.map +1 -1
- package/dist/{select-C-acFFtV.cjs → select-Gb9fTA4M.cjs} +2 -2
- package/dist/{select-C-acFFtV.cjs.map → select-Gb9fTA4M.cjs.map} +1 -1
- package/dist/{select-BJJKYtEi.js → select-gRJb1TEf.js} +6 -6
- package/dist/{select-BJJKYtEi.js.map → select-gRJb1TEf.js.map} +1 -1
- package/dist/select.cjs +1 -1
- package/dist/select.js +1 -1
- package/dist/skeleton.cjs +2 -2
- package/dist/skeleton.cjs.map +1 -1
- package/dist/skeleton.js +2 -2
- package/dist/skeleton.js.map +1 -1
- package/dist/skills/form.md +34 -0
- package/dist/skills/schmancy/form.md +34 -0
- package/dist/slider.cjs +7 -7
- package/dist/slider.cjs.map +1 -1
- package/dist/slider.js +2 -2
- package/dist/slider.js.map +1 -1
- package/dist/{sound.service-v_jqCkos.js → sound.service-Cuo4-X_-.js} +1 -1
- package/dist/{sound.service-v_jqCkos.js.map → sound.service-Cuo4-X_-.js.map} +1 -1
- package/dist/{sound.service-DVJZb9ox.cjs → sound.service-Czs3gmRx.cjs} +1 -1
- package/dist/{sound.service-DVJZb9ox.cjs.map → sound.service-Czs3gmRx.cjs.map} +1 -1
- package/dist/splash-screen-C0oeDPxV.cjs +41 -0
- package/dist/{splash-screen-CGnhHDB_.cjs.map → splash-screen-C0oeDPxV.cjs.map} +1 -1
- package/dist/{splash-screen-CCDpzGg_.js → splash-screen-CbcYpkIx.js} +2 -2
- package/dist/{splash-screen-CCDpzGg_.js.map → splash-screen-CbcYpkIx.js.map} +1 -1
- package/dist/splash-screen.cjs +1 -1
- package/dist/splash-screen.js +1 -1
- package/dist/src-C_7k7YhE.cjs +263 -0
- package/dist/{src-C0MzzF_S.cjs.map → src-C_7k7YhE.cjs.map} +1 -1
- package/dist/{src-CUcUMK0M.js → src-DavVEUeO.js} +35 -35
- package/dist/{src-CUcUMK0M.js.map → src-DavVEUeO.js.map} +1 -1
- package/dist/{state-CHbIt2Dw.js → state-B-5H9i10.js} +280 -273
- package/dist/state-B-5H9i10.js.map +1 -0
- package/dist/state-D85Se4Fx.cjs +1 -0
- package/dist/state-D85Se4Fx.cjs.map +1 -0
- package/dist/state.cjs +1 -1
- package/dist/state.js +3 -3
- package/dist/steps.cjs +10 -10
- package/dist/steps.cjs.map +1 -1
- package/dist/steps.js +2 -2
- package/dist/steps.js.map +1 -1
- package/dist/surface-DHPaLOTA.cjs +7 -0
- package/dist/{surface-DPzlMMYX.cjs.map → surface-DHPaLOTA.cjs.map} +1 -1
- package/dist/{surface-CLcc26d2.js → surface-gZpeCF6E.js} +4 -4
- package/dist/{surface-CLcc26d2.js.map → surface-gZpeCF6E.js.map} +1 -1
- package/dist/surface.cjs +1 -1
- package/dist/surface.js +1 -1
- package/dist/switch.cjs +2 -2
- package/dist/switch.cjs.map +1 -1
- package/dist/switch.js +6 -6
- package/dist/switch.js.map +1 -1
- package/dist/table.cjs +11 -11
- package/dist/table.cjs.map +1 -1
- package/dist/table.js +2 -2
- package/dist/table.js.map +1 -1
- package/dist/{tabs-BvEal6oS.js → tabs-DJNdoE-x.js} +2 -2
- package/dist/{tabs-BvEal6oS.js.map → tabs-DJNdoE-x.js.map} +1 -1
- package/dist/{tabs-DEKOKYrn.cjs → tabs-DgaVwuOo.cjs} +4 -4
- package/dist/{tabs-DEKOKYrn.cjs.map → tabs-DgaVwuOo.cjs.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-2QE5z6Ny.cjs +43 -0
- package/dist/{textarea-Cjlsy3y9.cjs.map → textarea-2QE5z6Ny.cjs.map} +1 -1
- package/dist/{textarea-CH62STRD.js → textarea-8x0prbgm.js} +9 -9
- package/dist/{textarea-CH62STRD.js.map → textarea-8x0prbgm.js.map} +1 -1
- package/dist/textarea.cjs +1 -1
- package/dist/textarea.js +1 -1
- package/dist/theme-D0yboni1.cjs +181 -0
- package/dist/{theme-CG3Gpne7.cjs.map → theme-D0yboni1.cjs.map} +1 -1
- package/dist/{theme-z82BIRuw.js → theme-DSD9Bs69.js} +8 -8
- package/dist/{theme-z82BIRuw.js.map → theme-DSD9Bs69.js.map} +1 -1
- package/dist/theme-button-Dpr6SGzB.cjs +8 -0
- package/dist/{theme-button-CEc_Kl54.cjs.map → theme-button-Dpr6SGzB.cjs.map} +1 -1
- package/dist/{theme-button-oWeOoeSw.js → theme-button-nd6Z7plT.js} +2 -2
- package/dist/{theme-button-oWeOoeSw.js.map → theme-button-nd6Z7plT.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.interface-CSt7JUBD.cjs.map +1 -1
- package/dist/theme.interface-odQEpZZH.js.map +1 -1
- package/dist/theme.js +3 -3
- package/dist/{theme.service-Y-e8b331.cjs → theme.service-LtQw04e6.cjs} +1 -1
- package/dist/{theme.service-Y-e8b331.cjs.map → theme.service-LtQw04e6.cjs.map} +1 -1
- package/dist/{theme.service-Bh08uOSJ.js → theme.service-mRlvWZVs.js} +1 -1
- package/dist/{theme.service-Bh08uOSJ.js.map → theme.service-mRlvWZVs.js.map} +1 -1
- package/dist/tooltip.cjs.map +1 -1
- package/dist/tooltip.js.map +1 -1
- package/dist/tree.cjs +3 -3
- package/dist/tree.cjs.map +1 -1
- package/dist/tree.js +2 -2
- package/dist/tree.js.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/typewriter.cjs.map +1 -1
- package/dist/typewriter.js.map +1 -1
- package/dist/{typography-CjAvaB88.cjs → typography-CiZQpzE4.cjs} +4 -4
- package/dist/{typography-CjAvaB88.cjs.map → typography-CiZQpzE4.cjs.map} +1 -1
- package/dist/{typography-DP82e3GJ.js → typography-DXyf-KdK.js} +2 -2
- package/dist/{typography-DP82e3GJ.js.map → typography-DXyf-KdK.js.map} +1 -1
- package/dist/typography.cjs +1 -1
- package/dist/typography.js +1 -1
- package/dist/utils-DTa3QHxk.cjs.map +1 -1
- package/dist/utils-H8wNknWC.js.map +1 -1
- package/dist/visually-hidden.cjs +2 -2
- package/dist/visually-hidden.cjs.map +1 -1
- package/dist/visually-hidden.js +2 -2
- package/dist/visually-hidden.js.map +1 -1
- package/dist/{window-BkPXY-8m.js → window-C_ATa3qM.js} +3 -3
- package/dist/{window-BkPXY-8m.js.map → window-C_ATa3qM.js.map} +1 -1
- package/dist/window-qKfP5c6M.cjs +59 -0
- package/dist/{window-aVXgfw__.cjs.map → window-qKfP5c6M.cjs.map} +1 -1
- package/dist/window.cjs +1 -1
- package/dist/window.js +1 -1
- package/package.json +1 -1
- package/skills/schmancy/form.md +34 -0
- package/src/state/index.ts +27 -2
- package/src/state/schmancy-context.ts +89 -88
- package/src/surface/surface.styles.ts +14 -10
- package/types/src/state/index.d.ts +15 -1
- package/types/src/state/schmancy-context.d.ts +2 -2
- package/dist/active-host-BP0zy_Y9.js +0 -63
- package/dist/active-host-BP0zy_Y9.js.map +0 -1
- package/dist/active-host-jH3iloCR.cjs +0 -1
- package/dist/active-host-jH3iloCR.cjs.map +0 -1
- package/dist/agent/overlay.confirm-body-BFYWMa45.js +0 -5518
- package/dist/agent/overlay.confirm-body-BFYWMa45.js.map +0 -1
- package/dist/area-HXuLLQnN.cjs +0 -21
- package/dist/date-range-inline-BnhQZTK0.cjs +0 -43
- package/dist/float-DyaPI0qO.cjs +0 -1
- package/dist/menu-Bfay8vF8.cjs +0 -23
- package/dist/mixins-BfazlmLD.js.map +0 -1
- package/dist/mixins-CxGRIPYQ.cjs.map +0 -1
- package/dist/notification-DT_cAi8U.cjs +0 -24
- package/dist/overlay-CRwfhbyi.cjs +0 -43
- package/dist/overlay.confirm-body-CxOomuN6.cjs +0 -70
- package/dist/radio-group-DQRJGMgS.cjs +0 -19
- package/dist/splash-screen-CGnhHDB_.cjs +0 -41
- package/dist/src-C0MzzF_S.cjs +0 -263
- package/dist/state-CHbIt2Dw.js.map +0 -1
- package/dist/state-DcGj-pJJ.cjs +0 -1
- package/dist/state-DcGj-pJJ.cjs.map +0 -1
- package/dist/surface-DPzlMMYX.cjs +0 -7
- package/dist/textarea-Cjlsy3y9.cjs +0 -43
- package/dist/theme-CG3Gpne7.cjs +0 -181
- package/dist/theme-button-CEc_Kl54.cjs +0 -8
- package/dist/window-aVXgfw__.cjs +0 -59
- /package/dist/agent/{flow-3RrZM-e7.js → flow-CvG1fLW5.js} +0 -0
- /package/dist/agent/{vendor-material-color-33Mj762T.js → vendor-material-color-DcL7ZPxx.js} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"surface-
|
|
1
|
+
{"version":3,"file":"surface-DHPaLOTA.cjs","names":[],"sources":["../src/surface/surface.ts"],"sourcesContent":["import { createContext, provide } from '@lit/context'\nimport { SchmancyElement } from '@mixins/index'\nimport { SurfaceMixin } from '@mixins/surface.mixin'\nimport { TSurfaceColor } from '@schmancy/types'\nimport { css, html } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\nexport const SchmancySurfaceTypeContext = createContext<TSurfaceColor>('surface')\n\nexport type { SchmancySurfaceRounded, SchmancySurfaceElevation } from '@mixins/surface.mixin'\n\n/**\n * `<schmancy-surface>` component\n *\n * Styled container that supports rounding, elevation, and background/text color variants.\n * Sizing is the consumer's responsibility — use Tailwind utilities (`class=\"w-full h-full\"`)\n * on the element directly.\n *\n * SurfaceMixin automatically provides surfaceStyles CSS.\n *\n * @element schmancy-surface\n * @slot - Default slot for projecting child content.\n *\n * @example\n * <schmancy-surface class=\"w-full h-full\" rounded=\"all\" elevation=\"3\" type=\"surfaceBright\" scroller>\n * <p>Your scrollable content here</p>\n * </schmancy-surface>\n */\n@customElement('schmancy-surface')\nexport class SchmancySurface extends SurfaceMixin(SchmancyElement) {\n\tstatic styles = [css`\n\t\t:host {\n\t\t\tdisplay: block;\n\t\t\tbox-sizing: border-box;\n\t\t\toverflow: visible;\n\t\t}\n\t`];\n\t/**\n\t * Specifies the surface type for styling.\n\t * Provided to descendant components via context.\n\t * @default 'container'\n\t */\n\t@provide({ context: SchmancySurfaceTypeContext })\n\t@property({ reflect: true })\n\toverride type: TSurfaceColor = 'subtle'\n\n\tprotected render(): unknown {\n\t\treturn html`<slot></slot>`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-surface': SchmancySurface\n\t}\n}\n"],"mappings":"mMAOA,IAAa,GAAA,EAAA,EAAA,eAA0D,SAAA,EAsBhE,EAAA,cAA8B,EAAA,EAAa,EAAA,CAAA,CAAA,CAAA,YAAA,GAAA,EAAA,CAAA,MAAA,GAAA,CAAA,EAAA,KAAA,KAelB,QAAA,CAAA,OAAA,KAAA,OAdf,CAAC,EAAA,GAAG;;;;;;IAgBpB,QAAA,CACC,MAAO,GAAA,IAAI,eACZ,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,SANS,CAAE,QAAS,CAAA,CAAA,GAA4B,EAAA,EAAA,UACtC,CAAE,QAAA,CAAS,CAAA,CAAA,CAAA,EAAM,EAAA,UAAA,OAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,eAfb,kBAAA,CAAA,EAAkB,CAAA,EAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,CAAA,CAAA,CAAA,EAAA,OAAA,eAAA,QAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,CAAA,CAAA,CAAA"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { t as e, u as t } from "./SchmancyElement-DuzT2AMa.js";
|
|
2
|
+
import { t as n } from "./mixins-Cevarn7V.js";
|
|
3
3
|
import { createContext as r, provide as i } from "@lit/context";
|
|
4
4
|
import { customElement as a, property as o } from "lit/decorators.js";
|
|
5
5
|
import { css as s, html as c } from "lit";
|
|
6
|
-
var l = r("surface"), u = class extends
|
|
6
|
+
var l = r("surface"), u = class extends n(e) {
|
|
7
7
|
constructor(...e) {
|
|
8
8
|
super(...e), this.type = "subtle";
|
|
9
9
|
}
|
|
@@ -20,5 +20,5 @@ var l = r("surface"), u = class extends t(e) {
|
|
|
20
20
|
return c`<slot></slot>`;
|
|
21
21
|
}
|
|
22
22
|
};
|
|
23
|
-
|
|
23
|
+
t([i({ context: l }), o({ reflect: !0 })], u.prototype, "type", void 0), u = t([a("schmancy-surface")], u);
|
|
24
24
|
export { l as n, u as t };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"surface-
|
|
1
|
+
{"version":3,"file":"surface-gZpeCF6E.js","names":[],"sources":["../src/surface/surface.ts"],"sourcesContent":["import { createContext, provide } from '@lit/context'\nimport { SchmancyElement } from '@mixins/index'\nimport { SurfaceMixin } from '@mixins/surface.mixin'\nimport { TSurfaceColor } from '@schmancy/types'\nimport { css, html } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\nexport const SchmancySurfaceTypeContext = createContext<TSurfaceColor>('surface')\n\nexport type { SchmancySurfaceRounded, SchmancySurfaceElevation } from '@mixins/surface.mixin'\n\n/**\n * `<schmancy-surface>` component\n *\n * Styled container that supports rounding, elevation, and background/text color variants.\n * Sizing is the consumer's responsibility — use Tailwind utilities (`class=\"w-full h-full\"`)\n * on the element directly.\n *\n * SurfaceMixin automatically provides surfaceStyles CSS.\n *\n * @element schmancy-surface\n * @slot - Default slot for projecting child content.\n *\n * @example\n * <schmancy-surface class=\"w-full h-full\" rounded=\"all\" elevation=\"3\" type=\"surfaceBright\" scroller>\n * <p>Your scrollable content here</p>\n * </schmancy-surface>\n */\n@customElement('schmancy-surface')\nexport class SchmancySurface extends SurfaceMixin(SchmancyElement) {\n\tstatic styles = [css`\n\t\t:host {\n\t\t\tdisplay: block;\n\t\t\tbox-sizing: border-box;\n\t\t\toverflow: visible;\n\t\t}\n\t`];\n\t/**\n\t * Specifies the surface type for styling.\n\t * Provided to descendant components via context.\n\t * @default 'container'\n\t */\n\t@provide({ context: SchmancySurfaceTypeContext })\n\t@property({ reflect: true })\n\toverride type: TSurfaceColor = 'subtle'\n\n\tprotected render(): unknown {\n\t\treturn html`<slot></slot>`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-surface': SchmancySurface\n\t}\n}\n"],"mappings":";;;;;AAOA,IAAa,IAA6B,EAA6B,SAAA,GAsBhE,IAAA,cAA8B,EAAa,CAAA,EAAA;CAAA,YAAA,GAAA,GAAA;EAAA,MAAA,GAAA,CAAA,GAAA,KAAA,OAelB;CAAA;CAAA;EAAA,KAAA,SAdf,CAAC,CAAG;;;;;;;;CAgBpB,SAAA;EACC,OAAO,CAAI;CACZ;AAAA;AAAA,EAAA,CANC,EAAQ,EAAE,SAAS,EAAA,CAAA,GACnB,EAAS,EAAE,SAAA,CAAS,EAAA,CAAA,CAAA,GAAM,EAAA,WAAA,QAAA,KAAA,CAAA,GAAA,IAAA,EAAA,CAf3B,EAAc,kBAAA,CAAA,GAAkB,CAAA;AAAA,SAAA,KAAA,GAAA,KAAA"}
|
package/dist/surface.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./surface-
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./surface-DHPaLOTA.cjs`);Object.defineProperty(exports,`SchmancySurface`,{enumerable:!0,get:function(){return e.t}}),exports.SchmancySurfaceTypeContext=e.n;
|
package/dist/surface.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as e, t } from "./surface-
|
|
1
|
+
import { n as e, t } from "./surface-gZpeCF6E.js";
|
|
2
2
|
export { t as SchmancySurface, e as SchmancySurfaceTypeContext };
|
package/dist/switch.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`./chunk-CncqDLb2.cjs`);const e=require(`./
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`./chunk-CncqDLb2.cjs`);const e=require(`./SchmancyElement-D8_z9JrW.cjs`),t=require(`./mixins-JyO9GSGy.cjs`);let n=require(`lit/decorators.js`),r=require(`lit`);var i=class extends t.o(r.css`
|
|
2
2
|
:host {
|
|
3
3
|
display: inline-block;
|
|
4
4
|
}
|
|
@@ -66,4 +66,4 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`./ch
|
|
|
66
66
|
<span part="thumb" class="thumb"></span>
|
|
67
67
|
</span>
|
|
68
68
|
</button>
|
|
69
|
-
`}};
|
|
69
|
+
`}};e.u([(0,n.property)({type:String,reflect:!0})],i.prototype,`value`,void 0),e.u([(0,n.property)({type:Boolean,reflect:!0})],i.prototype,`checked`,void 0),i=e.u([(0,n.customElement)(`schmancy-switch`)],i),Object.defineProperty(exports,`SchmancySwitch`,{enumerable:!0,get:function(){return i}});
|
package/dist/switch.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"switch.cjs","names":[],"sources":["../src/form/fields/switch/switch.ts"],"sourcesContent":["import { css, html, LitElement, nothing, type PropertyValues } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport { SchmancyFormField } from '@mixins/index'\n\nexport type SchmancySwitchChangeEvent = CustomEvent<{ value: boolean }>\n\n/**\n * Binary on/off control. Form-associated, keyboard-accessible, semantically a\n * switch (ARIA role=\"switch\"). Distinct from `schmancy-checkbox`: a switch\n * represents an immediate state change, a checkbox represents a selection in\n * a form to be submitted.\n *\n * @element schmancy-switch\n * @fires change - `CustomEvent<{ value: boolean }>` when the state changes.\n * @csspart track - The background track.\n * @csspart thumb - The moving thumb.\n */\n@customElement('schmancy-switch')\nexport class SchmancySwitch extends SchmancyFormField(css`\n\t:host {\n\t\tdisplay: inline-block;\n\t}\n\t:host([disabled]) {\n\t\topacity: 0.38;\n\t\tpointer-events: none;\n\t}\n\tbutton {\n\t\tappearance: none;\n\t\tbackground: none;\n\t\tborder: 0;\n\t\tpadding: 0;\n\t\tcursor: pointer;\n\t\tfont: inherit;\n\t}\n\t.track {\n\t\twidth: 2.25rem;\n\t\theight: 1.25rem;\n\t\tborder-radius: 999px;\n\t\tbackground: var(--schmancy-sys-color-surface-containerHighest, #e0e0e0);\n\t\tborder: 1px solid var(--schmancy-sys-color-outline, #79747e);\n\t\tposition: relative;\n\t\ttransition: background 150ms ease, border-color 150ms ease;\n\t}\n\t:host(:state(checked)) .track {\n\t\tbackground: var(--schmancy-sys-color-primary-default, #6750a4);\n\t\tborder-color: var(--schmancy-sys-color-primary-default, #6750a4);\n\t}\n\t.thumb {\n\t\tposition: absolute;\n\t\ttop: 50%;\n\t\tleft: 0.125rem;\n\t\twidth: 0.75rem;\n\t\theight: 0.75rem;\n\t\tborder-radius: 999px;\n\t\tbackground: var(--schmancy-sys-color-outline, #79747e);\n\t\ttransform: translateY(-50%);\n\t\ttransition: transform 150ms ease, background 150ms ease, width 150ms ease, height 150ms ease;\n\t}\n\t:host(:state(checked)) .thumb {\n\t\ttransform: translate(1rem, -50%);\n\t\twidth: 1rem;\n\t\theight: 1rem;\n\t\tbackground: var(--schmancy-sys-color-primary-on, #ffffff);\n\t}\n\tbutton:focus-visible .track {\n\t\toutline: 2px solid var(--schmancy-sys-color-primary-default, #6750a4);\n\t\toutline-offset: 2px;\n\t}\n\t@media (prefers-reduced-motion: reduce) {\n\t\t.track, .thumb { transition: none; }\n\t}\n`) {\n\t// `formAssociated`, `internals`, `name`, `disabled`, `required`, `id`,\n\t// `label`, `error`, `validationMessage`, `validateOn`, touched/dirty/submitted,\n\t// `markTouched/markSubmitted`, `formResetCallback`, `formDisabledCallback`,\n\t// FIELD_CONNECT_EVENT dispatch — all from the mixin.\n\n\t// Inner <button> is the focusable surface; route host focus to it.\n\tprotected static shadowRootOptions = {\n\t\t...LitElement.shadowRootOptions,\n\t\tdelegatesFocus: true,\n\t}\n\n\t/**\n\t * The string written to FormData when the switch is on. Native\n\t * `<input type=checkbox value=\"...\">` semantics. Defaults to `'on'` to\n\t * match HTML checkbox conventions.\n\t */\n\t@property({ type: String, reflect: true })\n\toverride value: string = 'on'\n\n\t/** Boolean on/off state. Native `<input type=checkbox>.checked` semantics. */\n\t@property({ type: Boolean, reflect: true })\n\tchecked: boolean = false\n\n\t/** Snapshot of `checked` at first render — drives the `dirty` override. */\n\tprivate _checkedDefault: boolean = false\n\n\toverride firstUpdated(changed: PropertyValues): void {\n\t\tsuper.firstUpdated(changed)\n\t\tthis._checkedDefault = this.checked\n\t}\n\n\t/**\n\t * Override the mixin's value-vs-default `dirty` getter — for switch the\n\t * meaningful state is `checked`, not the FormData string.\n\t */\n\toverride get dirty(): boolean {\n\t\treturn this.checked !== this._checkedDefault\n\t}\n\n\toverride willUpdate(changed: PropertyValues): void {\n\t\tsuper.willUpdate(changed)\n\t\tif (changed.has('checked') || changed.has('value') || changed.has('name')) {\n\t\t\t// Switch contributes `value` to FormData when on, nothing when off\n\t\t\t// (native checkbox semantics; overrides the mixin's scalar default).\n\t\t\tthis.internals?.setFormValue(this.checked ? this.value : null)\n\t\t\tif (this.checked) this.internals?.states.add('checked')\n\t\t\telse this.internals?.states.delete('checked')\n\t\t\t// Mixin's value-changed branch won't fire `checkValidity` here\n\t\t\t// (validateOn: 'dirty' gate stays closed until checked diverges).\n\t\t\t// Sync platform validity explicitly so `form.checkValidity()` is\n\t\t\t// correct from first render.\n\t\t\tthis.checkValidity()\n\t\t}\n\t\tif (changed.has('required') || changed.has('disabled')) {\n\t\t\tthis.checkValidity()\n\t\t}\n\t}\n\n\t/** Override — switch validity is `checked === true` when required. */\n\toverride checkValidity(): boolean {\n\t\tif (this.disabled) {\n\t\t\tthis.internals?.setValidity({})\n\t\t\treturn true\n\t\t}\n\t\tconst isValid = !this.required || this.checked\n\t\tconst message = isValid ? '' : 'This switch is required.'\n\n\t\tthis.internals?.setValidity(\n\t\t\tisValid ? {} : { valueMissing: true },\n\t\t\tisValid ? undefined : message,\n\t\t)\n\n\t\tif (this._shouldShowError()) {\n\t\t\tthis.error = !isValid\n\t\t\tthis.validationMessage = message\n\t\t}\n\t\treturn isValid\n\t}\n\n\t/** Override — emit only when the switch is on. */\n\toverride toFormEntries(): Array<[string, FormDataEntryValue]> {\n\t\tif (!this.name || this.disabled || !this.checked) return []\n\t\treturn [[this.name, this.value]]\n\t}\n\n\toverride resetForm(): void {\n\t\tthis.checked = this._checkedDefault\n\t\tsuper.resetForm()\n\t}\n\n\tprivate _toggle = () => {\n\t\tif (this.disabled) return\n\t\tthis.checked = !this.checked\n\t\tthis.markTouched()\n\t\tthis.emitChange({ value: this.checked })\n\t}\n\n\tprivate _onKeydown = (e: KeyboardEvent) => {\n\t\tif (e.key === ' ' || e.key === 'Enter') {\n\t\t\te.preventDefault()\n\t\t\tthis._toggle()\n\t\t}\n\t}\n\n\trender() {\n\t\treturn html`\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\trole=\"switch\"\n\t\t\t\taria-checked=${this.checked ? 'true' : 'false'}\n\t\t\t\taria-label=${this.label || nothing}\n\t\t\t\taria-required=${this.required ? 'true' : 'false'}\n\t\t\t\t?disabled=${this.disabled}\n\t\t\t\t@click=${this._toggle}\n\t\t\t\t@keydown=${this._onKeydown}\n\t\t\t>\n\t\t\t\t<span part=\"track\" class=\"track\">\n\t\t\t\t\t<span part=\"thumb\" class=\"thumb\"></span>\n\t\t\t\t</span>\n\t\t\t</button>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-switch': SchmancySwitch\n\t}\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"switch.cjs","names":[],"sources":["../src/form/fields/switch/switch.ts"],"sourcesContent":["import { css, html, LitElement, nothing, type PropertyValues } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport { SchmancyFormField } from '@mixins/index'\n\nexport type SchmancySwitchChangeEvent = CustomEvent<{ value: boolean }>\n\n/**\n * Binary on/off control. Form-associated, keyboard-accessible, semantically a\n * switch (ARIA role=\"switch\"). Distinct from `schmancy-checkbox`: a switch\n * represents an immediate state change, a checkbox represents a selection in\n * a form to be submitted.\n *\n * @element schmancy-switch\n * @fires change - `CustomEvent<{ value: boolean }>` when the state changes.\n * @csspart track - The background track.\n * @csspart thumb - The moving thumb.\n */\n@customElement('schmancy-switch')\nexport class SchmancySwitch extends SchmancyFormField(css`\n\t:host {\n\t\tdisplay: inline-block;\n\t}\n\t:host([disabled]) {\n\t\topacity: 0.38;\n\t\tpointer-events: none;\n\t}\n\tbutton {\n\t\tappearance: none;\n\t\tbackground: none;\n\t\tborder: 0;\n\t\tpadding: 0;\n\t\tcursor: pointer;\n\t\tfont: inherit;\n\t}\n\t.track {\n\t\twidth: 2.25rem;\n\t\theight: 1.25rem;\n\t\tborder-radius: 999px;\n\t\tbackground: var(--schmancy-sys-color-surface-containerHighest, #e0e0e0);\n\t\tborder: 1px solid var(--schmancy-sys-color-outline, #79747e);\n\t\tposition: relative;\n\t\ttransition: background 150ms ease, border-color 150ms ease;\n\t}\n\t:host(:state(checked)) .track {\n\t\tbackground: var(--schmancy-sys-color-primary-default, #6750a4);\n\t\tborder-color: var(--schmancy-sys-color-primary-default, #6750a4);\n\t}\n\t.thumb {\n\t\tposition: absolute;\n\t\ttop: 50%;\n\t\tleft: 0.125rem;\n\t\twidth: 0.75rem;\n\t\theight: 0.75rem;\n\t\tborder-radius: 999px;\n\t\tbackground: var(--schmancy-sys-color-outline, #79747e);\n\t\ttransform: translateY(-50%);\n\t\ttransition: transform 150ms ease, background 150ms ease, width 150ms ease, height 150ms ease;\n\t}\n\t:host(:state(checked)) .thumb {\n\t\ttransform: translate(1rem, -50%);\n\t\twidth: 1rem;\n\t\theight: 1rem;\n\t\tbackground: var(--schmancy-sys-color-primary-on, #ffffff);\n\t}\n\tbutton:focus-visible .track {\n\t\toutline: 2px solid var(--schmancy-sys-color-primary-default, #6750a4);\n\t\toutline-offset: 2px;\n\t}\n\t@media (prefers-reduced-motion: reduce) {\n\t\t.track, .thumb { transition: none; }\n\t}\n`) {\n\t// `formAssociated`, `internals`, `name`, `disabled`, `required`, `id`,\n\t// `label`, `error`, `validationMessage`, `validateOn`, touched/dirty/submitted,\n\t// `markTouched/markSubmitted`, `formResetCallback`, `formDisabledCallback`,\n\t// FIELD_CONNECT_EVENT dispatch — all from the mixin.\n\n\t// Inner <button> is the focusable surface; route host focus to it.\n\tprotected static shadowRootOptions = {\n\t\t...LitElement.shadowRootOptions,\n\t\tdelegatesFocus: true,\n\t}\n\n\t/**\n\t * The string written to FormData when the switch is on. Native\n\t * `<input type=checkbox value=\"...\">` semantics. Defaults to `'on'` to\n\t * match HTML checkbox conventions.\n\t */\n\t@property({ type: String, reflect: true })\n\toverride value: string = 'on'\n\n\t/** Boolean on/off state. Native `<input type=checkbox>.checked` semantics. */\n\t@property({ type: Boolean, reflect: true })\n\tchecked: boolean = false\n\n\t/** Snapshot of `checked` at first render — drives the `dirty` override. */\n\tprivate _checkedDefault: boolean = false\n\n\toverride firstUpdated(changed: PropertyValues): void {\n\t\tsuper.firstUpdated(changed)\n\t\tthis._checkedDefault = this.checked\n\t}\n\n\t/**\n\t * Override the mixin's value-vs-default `dirty` getter — for switch the\n\t * meaningful state is `checked`, not the FormData string.\n\t */\n\toverride get dirty(): boolean {\n\t\treturn this.checked !== this._checkedDefault\n\t}\n\n\toverride willUpdate(changed: PropertyValues): void {\n\t\tsuper.willUpdate(changed)\n\t\tif (changed.has('checked') || changed.has('value') || changed.has('name')) {\n\t\t\t// Switch contributes `value` to FormData when on, nothing when off\n\t\t\t// (native checkbox semantics; overrides the mixin's scalar default).\n\t\t\tthis.internals?.setFormValue(this.checked ? this.value : null)\n\t\t\tif (this.checked) this.internals?.states.add('checked')\n\t\t\telse this.internals?.states.delete('checked')\n\t\t\t// Mixin's value-changed branch won't fire `checkValidity` here\n\t\t\t// (validateOn: 'dirty' gate stays closed until checked diverges).\n\t\t\t// Sync platform validity explicitly so `form.checkValidity()` is\n\t\t\t// correct from first render.\n\t\t\tthis.checkValidity()\n\t\t}\n\t\tif (changed.has('required') || changed.has('disabled')) {\n\t\t\tthis.checkValidity()\n\t\t}\n\t}\n\n\t/** Override — switch validity is `checked === true` when required. */\n\toverride checkValidity(): boolean {\n\t\tif (this.disabled) {\n\t\t\tthis.internals?.setValidity({})\n\t\t\treturn true\n\t\t}\n\t\tconst isValid = !this.required || this.checked\n\t\tconst message = isValid ? '' : 'This switch is required.'\n\n\t\tthis.internals?.setValidity(\n\t\t\tisValid ? {} : { valueMissing: true },\n\t\t\tisValid ? undefined : message,\n\t\t)\n\n\t\tif (this._shouldShowError()) {\n\t\t\tthis.error = !isValid\n\t\t\tthis.validationMessage = message\n\t\t}\n\t\treturn isValid\n\t}\n\n\t/** Override — emit only when the switch is on. */\n\toverride toFormEntries(): Array<[string, FormDataEntryValue]> {\n\t\tif (!this.name || this.disabled || !this.checked) return []\n\t\treturn [[this.name, this.value]]\n\t}\n\n\toverride resetForm(): void {\n\t\tthis.checked = this._checkedDefault\n\t\tsuper.resetForm()\n\t}\n\n\tprivate _toggle = () => {\n\t\tif (this.disabled) return\n\t\tthis.checked = !this.checked\n\t\tthis.markTouched()\n\t\tthis.emitChange({ value: this.checked })\n\t}\n\n\tprivate _onKeydown = (e: KeyboardEvent) => {\n\t\tif (e.key === ' ' || e.key === 'Enter') {\n\t\t\te.preventDefault()\n\t\t\tthis._toggle()\n\t\t}\n\t}\n\n\trender() {\n\t\treturn html`\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\trole=\"switch\"\n\t\t\t\taria-checked=${this.checked ? 'true' : 'false'}\n\t\t\t\taria-label=${this.label || nothing}\n\t\t\t\taria-required=${this.required ? 'true' : 'false'}\n\t\t\t\t?disabled=${this.disabled}\n\t\t\t\t@click=${this._toggle}\n\t\t\t\t@keydown=${this._onKeydown}\n\t\t\t>\n\t\t\t\t<span part=\"track\" class=\"track\">\n\t\t\t\t\t<span part=\"thumb\" class=\"thumb\"></span>\n\t\t\t\t</span>\n\t\t\t</button>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-switch': SchmancySwitch\n\t}\n}\n"],"mappings":"4OAkBO,IAAA,EAAA,cAA6B,EAAA,EAAkB,EAAA,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4CAuE/B,KAAA,KAAA,QAAA,CAIN,EAAA,KAAA,gBAAA,CAGgB,EAAA,KAAA,YAAA,CAmE9B,KAAK,WACT,KAAK,QAAA,CAAW,KAAK,QACrB,KAAK,YAAA,EACL,KAAK,WAAW,CAAE,MAAO,KAAK,OAAA,CAAA,EAAA,EAAA,KAAA,WAGT,GAAA,CACjB,EAAE,MAAQ,KAAO,EAAE,MAAQ,UAC9B,EAAE,eAAA,EACF,KAAK,QAAA,EAAA,CAAA,CAAA,OAAA,KAAA,kBA9F8B,CAAA,GACjC,EAAA,WAAW,kBACd,eAAA,CAAgB,CAAA,CAAA,CAkBjB,aAAsB,EAAA,CACrB,MAAM,aAAa,CAAA,EACnB,KAAK,gBAAkB,KAAK,OAC7B,CAMA,IAAA,OAAa,CACZ,OAAO,KAAK,UAAY,KAAK,eAC9B,CAEA,WAAoB,EAAA,CACnB,MAAM,WAAW,CAAA,GACb,EAAQ,IAAI,SAAA,GAAc,EAAQ,IAAI,OAAA,GAAY,EAAQ,IAAI,MAAA,KAGjE,KAAK,WAAW,aAAa,KAAK,QAAU,KAAK,MAAQ,IAAA,EACrD,KAAK,QAAS,KAAK,WAAW,OAAO,IAAI,SAAA,EACxC,KAAK,WAAW,OAAO,OAAO,SAAA,EAKnC,KAAK,cAAA,IAEF,EAAQ,IAAI,UAAA,GAAe,EAAQ,IAAI,UAAA,IAC1C,KAAK,cAAA,CAEP,CAGA,eAAA,CACC,GAAI,KAAK,SAER,OADA,KAAK,WAAW,YAAY,CAAC,CAAA,EAAA,CACtB,EAER,IAAM,EAAA,CAAW,KAAK,UAAY,KAAK,QACjC,EAAU,EAAU,GAAK,2BAW/B,OATA,KAAK,WAAW,YACf,EAAU,CAAC,EAAI,CAAE,aAAA,CAAc,CAAA,EAC/B,EAAA,IAAU,GAAY,CAAA,EAGnB,KAAK,iBAAA,IACR,KAAK,MAAA,CAAS,EACd,KAAK,kBAAoB,GAEnB,CACR,CAGA,eAAA,CACC,OAAK,KAAK,MAAA,CAAQ,KAAK,UAAa,KAAK,QAClC,CAAC,CAAC,KAAK,KAAM,KAAK,KAAA,CAAA,EADgC,CAAA,CAE1D,CAEA,WAAA,CACC,KAAK,QAAU,KAAK,gBACpB,MAAM,UAAA,CACP,CAgBA,QAAA,CACC,MAAO,GAAA,IAAI;;;;mBAIM,KAAK,QAAU,OAAS,QAAA;iBAC1B,KAAK,OAAS,EAAA,QAAA;oBACX,KAAK,SAAW,OAAS,QAAA;gBAC7B,KAAK,SAAA;aACR,KAAK,QAAA;eACH,KAAK,WAAA;;;;;;GAOnB,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAzGU,CAAE,KAAM,OAAQ,QAAA,CAAS,CAAA,CAAA,CAAA,EAAM,EAAA,UAAA,QAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAI/B,CAAE,KAAM,QAAS,QAAA,CAAS,CAAA,CAAA,CAAA,EAAM,EAAA,UAAA,UAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,eA3E5B,iBAAA,CAAA,EAAiB,CAAA,EAAA,OAAA,eAAA,QAAA,iBAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,CAAA,CAAA,CAAA"}
|
package/dist/switch.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { u as e } from "./SchmancyElement-DuzT2AMa.js";
|
|
2
|
+
import { o as t } from "./mixins-Cevarn7V.js";
|
|
3
3
|
import { customElement as n, property as r } from "lit/decorators.js";
|
|
4
4
|
import { LitElement as i, css as a, html as o, nothing as s } from "lit";
|
|
5
|
-
var c = class extends
|
|
5
|
+
var c = class extends t(a`
|
|
6
6
|
:host {
|
|
7
7
|
display: inline-block;
|
|
8
8
|
}
|
|
@@ -108,11 +108,11 @@ var c = class extends e(a`
|
|
|
108
108
|
`;
|
|
109
109
|
}
|
|
110
110
|
};
|
|
111
|
-
|
|
111
|
+
e([r({
|
|
112
112
|
type: String,
|
|
113
113
|
reflect: !0
|
|
114
|
-
})], c.prototype, "value", void 0),
|
|
114
|
+
})], c.prototype, "value", void 0), e([r({
|
|
115
115
|
type: Boolean,
|
|
116
116
|
reflect: !0
|
|
117
|
-
})], c.prototype, "checked", void 0), c =
|
|
117
|
+
})], c.prototype, "checked", void 0), c = e([n("schmancy-switch")], c);
|
|
118
118
|
export { c as SchmancySwitch };
|
package/dist/switch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"switch.js","names":[],"sources":["../src/form/fields/switch/switch.ts"],"sourcesContent":["import { css, html, LitElement, nothing, type PropertyValues } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport { SchmancyFormField } from '@mixins/index'\n\nexport type SchmancySwitchChangeEvent = CustomEvent<{ value: boolean }>\n\n/**\n * Binary on/off control. Form-associated, keyboard-accessible, semantically a\n * switch (ARIA role=\"switch\"). Distinct from `schmancy-checkbox`: a switch\n * represents an immediate state change, a checkbox represents a selection in\n * a form to be submitted.\n *\n * @element schmancy-switch\n * @fires change - `CustomEvent<{ value: boolean }>` when the state changes.\n * @csspart track - The background track.\n * @csspart thumb - The moving thumb.\n */\n@customElement('schmancy-switch')\nexport class SchmancySwitch extends SchmancyFormField(css`\n\t:host {\n\t\tdisplay: inline-block;\n\t}\n\t:host([disabled]) {\n\t\topacity: 0.38;\n\t\tpointer-events: none;\n\t}\n\tbutton {\n\t\tappearance: none;\n\t\tbackground: none;\n\t\tborder: 0;\n\t\tpadding: 0;\n\t\tcursor: pointer;\n\t\tfont: inherit;\n\t}\n\t.track {\n\t\twidth: 2.25rem;\n\t\theight: 1.25rem;\n\t\tborder-radius: 999px;\n\t\tbackground: var(--schmancy-sys-color-surface-containerHighest, #e0e0e0);\n\t\tborder: 1px solid var(--schmancy-sys-color-outline, #79747e);\n\t\tposition: relative;\n\t\ttransition: background 150ms ease, border-color 150ms ease;\n\t}\n\t:host(:state(checked)) .track {\n\t\tbackground: var(--schmancy-sys-color-primary-default, #6750a4);\n\t\tborder-color: var(--schmancy-sys-color-primary-default, #6750a4);\n\t}\n\t.thumb {\n\t\tposition: absolute;\n\t\ttop: 50%;\n\t\tleft: 0.125rem;\n\t\twidth: 0.75rem;\n\t\theight: 0.75rem;\n\t\tborder-radius: 999px;\n\t\tbackground: var(--schmancy-sys-color-outline, #79747e);\n\t\ttransform: translateY(-50%);\n\t\ttransition: transform 150ms ease, background 150ms ease, width 150ms ease, height 150ms ease;\n\t}\n\t:host(:state(checked)) .thumb {\n\t\ttransform: translate(1rem, -50%);\n\t\twidth: 1rem;\n\t\theight: 1rem;\n\t\tbackground: var(--schmancy-sys-color-primary-on, #ffffff);\n\t}\n\tbutton:focus-visible .track {\n\t\toutline: 2px solid var(--schmancy-sys-color-primary-default, #6750a4);\n\t\toutline-offset: 2px;\n\t}\n\t@media (prefers-reduced-motion: reduce) {\n\t\t.track, .thumb { transition: none; }\n\t}\n`) {\n\t// `formAssociated`, `internals`, `name`, `disabled`, `required`, `id`,\n\t// `label`, `error`, `validationMessage`, `validateOn`, touched/dirty/submitted,\n\t// `markTouched/markSubmitted`, `formResetCallback`, `formDisabledCallback`,\n\t// FIELD_CONNECT_EVENT dispatch — all from the mixin.\n\n\t// Inner <button> is the focusable surface; route host focus to it.\n\tprotected static shadowRootOptions = {\n\t\t...LitElement.shadowRootOptions,\n\t\tdelegatesFocus: true,\n\t}\n\n\t/**\n\t * The string written to FormData when the switch is on. Native\n\t * `<input type=checkbox value=\"...\">` semantics. Defaults to `'on'` to\n\t * match HTML checkbox conventions.\n\t */\n\t@property({ type: String, reflect: true })\n\toverride value: string = 'on'\n\n\t/** Boolean on/off state. Native `<input type=checkbox>.checked` semantics. */\n\t@property({ type: Boolean, reflect: true })\n\tchecked: boolean = false\n\n\t/** Snapshot of `checked` at first render — drives the `dirty` override. */\n\tprivate _checkedDefault: boolean = false\n\n\toverride firstUpdated(changed: PropertyValues): void {\n\t\tsuper.firstUpdated(changed)\n\t\tthis._checkedDefault = this.checked\n\t}\n\n\t/**\n\t * Override the mixin's value-vs-default `dirty` getter — for switch the\n\t * meaningful state is `checked`, not the FormData string.\n\t */\n\toverride get dirty(): boolean {\n\t\treturn this.checked !== this._checkedDefault\n\t}\n\n\toverride willUpdate(changed: PropertyValues): void {\n\t\tsuper.willUpdate(changed)\n\t\tif (changed.has('checked') || changed.has('value') || changed.has('name')) {\n\t\t\t// Switch contributes `value` to FormData when on, nothing when off\n\t\t\t// (native checkbox semantics; overrides the mixin's scalar default).\n\t\t\tthis.internals?.setFormValue(this.checked ? this.value : null)\n\t\t\tif (this.checked) this.internals?.states.add('checked')\n\t\t\telse this.internals?.states.delete('checked')\n\t\t\t// Mixin's value-changed branch won't fire `checkValidity` here\n\t\t\t// (validateOn: 'dirty' gate stays closed until checked diverges).\n\t\t\t// Sync platform validity explicitly so `form.checkValidity()` is\n\t\t\t// correct from first render.\n\t\t\tthis.checkValidity()\n\t\t}\n\t\tif (changed.has('required') || changed.has('disabled')) {\n\t\t\tthis.checkValidity()\n\t\t}\n\t}\n\n\t/** Override — switch validity is `checked === true` when required. */\n\toverride checkValidity(): boolean {\n\t\tif (this.disabled) {\n\t\t\tthis.internals?.setValidity({})\n\t\t\treturn true\n\t\t}\n\t\tconst isValid = !this.required || this.checked\n\t\tconst message = isValid ? '' : 'This switch is required.'\n\n\t\tthis.internals?.setValidity(\n\t\t\tisValid ? {} : { valueMissing: true },\n\t\t\tisValid ? undefined : message,\n\t\t)\n\n\t\tif (this._shouldShowError()) {\n\t\t\tthis.error = !isValid\n\t\t\tthis.validationMessage = message\n\t\t}\n\t\treturn isValid\n\t}\n\n\t/** Override — emit only when the switch is on. */\n\toverride toFormEntries(): Array<[string, FormDataEntryValue]> {\n\t\tif (!this.name || this.disabled || !this.checked) return []\n\t\treturn [[this.name, this.value]]\n\t}\n\n\toverride resetForm(): void {\n\t\tthis.checked = this._checkedDefault\n\t\tsuper.resetForm()\n\t}\n\n\tprivate _toggle = () => {\n\t\tif (this.disabled) return\n\t\tthis.checked = !this.checked\n\t\tthis.markTouched()\n\t\tthis.emitChange({ value: this.checked })\n\t}\n\n\tprivate _onKeydown = (e: KeyboardEvent) => {\n\t\tif (e.key === ' ' || e.key === 'Enter') {\n\t\t\te.preventDefault()\n\t\t\tthis._toggle()\n\t\t}\n\t}\n\n\trender() {\n\t\treturn html`\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\trole=\"switch\"\n\t\t\t\taria-checked=${this.checked ? 'true' : 'false'}\n\t\t\t\taria-label=${this.label || nothing}\n\t\t\t\taria-required=${this.required ? 'true' : 'false'}\n\t\t\t\t?disabled=${this.disabled}\n\t\t\t\t@click=${this._toggle}\n\t\t\t\t@keydown=${this._onKeydown}\n\t\t\t>\n\t\t\t\t<span part=\"track\" class=\"track\">\n\t\t\t\t\t<span part=\"thumb\" class=\"thumb\"></span>\n\t\t\t\t</span>\n\t\t\t</button>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-switch': SchmancySwitch\n\t}\n}\n"],"mappings":";;;;AAkBO,IAAA,IAAA,cAA6B,EAAkB,CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BAuE/B,MAAA,KAAA,UAAA,CAIN,GAAA,KAAA,kBAAA,CAGgB,GAAA,KAAA,gBAAA;GAmE9B,KAAK,aACT,KAAK,UAAA,CAAW,KAAK,SACrB,KAAK,
|
|
1
|
+
{"version":3,"file":"switch.js","names":[],"sources":["../src/form/fields/switch/switch.ts"],"sourcesContent":["import { css, html, LitElement, nothing, type PropertyValues } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport { SchmancyFormField } from '@mixins/index'\n\nexport type SchmancySwitchChangeEvent = CustomEvent<{ value: boolean }>\n\n/**\n * Binary on/off control. Form-associated, keyboard-accessible, semantically a\n * switch (ARIA role=\"switch\"). Distinct from `schmancy-checkbox`: a switch\n * represents an immediate state change, a checkbox represents a selection in\n * a form to be submitted.\n *\n * @element schmancy-switch\n * @fires change - `CustomEvent<{ value: boolean }>` when the state changes.\n * @csspart track - The background track.\n * @csspart thumb - The moving thumb.\n */\n@customElement('schmancy-switch')\nexport class SchmancySwitch extends SchmancyFormField(css`\n\t:host {\n\t\tdisplay: inline-block;\n\t}\n\t:host([disabled]) {\n\t\topacity: 0.38;\n\t\tpointer-events: none;\n\t}\n\tbutton {\n\t\tappearance: none;\n\t\tbackground: none;\n\t\tborder: 0;\n\t\tpadding: 0;\n\t\tcursor: pointer;\n\t\tfont: inherit;\n\t}\n\t.track {\n\t\twidth: 2.25rem;\n\t\theight: 1.25rem;\n\t\tborder-radius: 999px;\n\t\tbackground: var(--schmancy-sys-color-surface-containerHighest, #e0e0e0);\n\t\tborder: 1px solid var(--schmancy-sys-color-outline, #79747e);\n\t\tposition: relative;\n\t\ttransition: background 150ms ease, border-color 150ms ease;\n\t}\n\t:host(:state(checked)) .track {\n\t\tbackground: var(--schmancy-sys-color-primary-default, #6750a4);\n\t\tborder-color: var(--schmancy-sys-color-primary-default, #6750a4);\n\t}\n\t.thumb {\n\t\tposition: absolute;\n\t\ttop: 50%;\n\t\tleft: 0.125rem;\n\t\twidth: 0.75rem;\n\t\theight: 0.75rem;\n\t\tborder-radius: 999px;\n\t\tbackground: var(--schmancy-sys-color-outline, #79747e);\n\t\ttransform: translateY(-50%);\n\t\ttransition: transform 150ms ease, background 150ms ease, width 150ms ease, height 150ms ease;\n\t}\n\t:host(:state(checked)) .thumb {\n\t\ttransform: translate(1rem, -50%);\n\t\twidth: 1rem;\n\t\theight: 1rem;\n\t\tbackground: var(--schmancy-sys-color-primary-on, #ffffff);\n\t}\n\tbutton:focus-visible .track {\n\t\toutline: 2px solid var(--schmancy-sys-color-primary-default, #6750a4);\n\t\toutline-offset: 2px;\n\t}\n\t@media (prefers-reduced-motion: reduce) {\n\t\t.track, .thumb { transition: none; }\n\t}\n`) {\n\t// `formAssociated`, `internals`, `name`, `disabled`, `required`, `id`,\n\t// `label`, `error`, `validationMessage`, `validateOn`, touched/dirty/submitted,\n\t// `markTouched/markSubmitted`, `formResetCallback`, `formDisabledCallback`,\n\t// FIELD_CONNECT_EVENT dispatch — all from the mixin.\n\n\t// Inner <button> is the focusable surface; route host focus to it.\n\tprotected static shadowRootOptions = {\n\t\t...LitElement.shadowRootOptions,\n\t\tdelegatesFocus: true,\n\t}\n\n\t/**\n\t * The string written to FormData when the switch is on. Native\n\t * `<input type=checkbox value=\"...\">` semantics. Defaults to `'on'` to\n\t * match HTML checkbox conventions.\n\t */\n\t@property({ type: String, reflect: true })\n\toverride value: string = 'on'\n\n\t/** Boolean on/off state. Native `<input type=checkbox>.checked` semantics. */\n\t@property({ type: Boolean, reflect: true })\n\tchecked: boolean = false\n\n\t/** Snapshot of `checked` at first render — drives the `dirty` override. */\n\tprivate _checkedDefault: boolean = false\n\n\toverride firstUpdated(changed: PropertyValues): void {\n\t\tsuper.firstUpdated(changed)\n\t\tthis._checkedDefault = this.checked\n\t}\n\n\t/**\n\t * Override the mixin's value-vs-default `dirty` getter — for switch the\n\t * meaningful state is `checked`, not the FormData string.\n\t */\n\toverride get dirty(): boolean {\n\t\treturn this.checked !== this._checkedDefault\n\t}\n\n\toverride willUpdate(changed: PropertyValues): void {\n\t\tsuper.willUpdate(changed)\n\t\tif (changed.has('checked') || changed.has('value') || changed.has('name')) {\n\t\t\t// Switch contributes `value` to FormData when on, nothing when off\n\t\t\t// (native checkbox semantics; overrides the mixin's scalar default).\n\t\t\tthis.internals?.setFormValue(this.checked ? this.value : null)\n\t\t\tif (this.checked) this.internals?.states.add('checked')\n\t\t\telse this.internals?.states.delete('checked')\n\t\t\t// Mixin's value-changed branch won't fire `checkValidity` here\n\t\t\t// (validateOn: 'dirty' gate stays closed until checked diverges).\n\t\t\t// Sync platform validity explicitly so `form.checkValidity()` is\n\t\t\t// correct from first render.\n\t\t\tthis.checkValidity()\n\t\t}\n\t\tif (changed.has('required') || changed.has('disabled')) {\n\t\t\tthis.checkValidity()\n\t\t}\n\t}\n\n\t/** Override — switch validity is `checked === true` when required. */\n\toverride checkValidity(): boolean {\n\t\tif (this.disabled) {\n\t\t\tthis.internals?.setValidity({})\n\t\t\treturn true\n\t\t}\n\t\tconst isValid = !this.required || this.checked\n\t\tconst message = isValid ? '' : 'This switch is required.'\n\n\t\tthis.internals?.setValidity(\n\t\t\tisValid ? {} : { valueMissing: true },\n\t\t\tisValid ? undefined : message,\n\t\t)\n\n\t\tif (this._shouldShowError()) {\n\t\t\tthis.error = !isValid\n\t\t\tthis.validationMessage = message\n\t\t}\n\t\treturn isValid\n\t}\n\n\t/** Override — emit only when the switch is on. */\n\toverride toFormEntries(): Array<[string, FormDataEntryValue]> {\n\t\tif (!this.name || this.disabled || !this.checked) return []\n\t\treturn [[this.name, this.value]]\n\t}\n\n\toverride resetForm(): void {\n\t\tthis.checked = this._checkedDefault\n\t\tsuper.resetForm()\n\t}\n\n\tprivate _toggle = () => {\n\t\tif (this.disabled) return\n\t\tthis.checked = !this.checked\n\t\tthis.markTouched()\n\t\tthis.emitChange({ value: this.checked })\n\t}\n\n\tprivate _onKeydown = (e: KeyboardEvent) => {\n\t\tif (e.key === ' ' || e.key === 'Enter') {\n\t\t\te.preventDefault()\n\t\t\tthis._toggle()\n\t\t}\n\t}\n\n\trender() {\n\t\treturn html`\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\trole=\"switch\"\n\t\t\t\taria-checked=${this.checked ? 'true' : 'false'}\n\t\t\t\taria-label=${this.label || nothing}\n\t\t\t\taria-required=${this.required ? 'true' : 'false'}\n\t\t\t\t?disabled=${this.disabled}\n\t\t\t\t@click=${this._toggle}\n\t\t\t\t@keydown=${this._onKeydown}\n\t\t\t>\n\t\t\t\t<span part=\"track\" class=\"track\">\n\t\t\t\t\t<span part=\"thumb\" class=\"thumb\"></span>\n\t\t\t\t</span>\n\t\t\t</button>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-switch': SchmancySwitch\n\t}\n}\n"],"mappings":";;;;AAkBO,IAAA,IAAA,cAA6B,EAAkB,CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BAuE/B,MAAA,KAAA,UAAA,CAIN,GAAA,KAAA,kBAAA,CAGgB,GAAA,KAAA,gBAAA;GAmE9B,KAAK,aACT,KAAK,UAAA,CAAW,KAAK,SACrB,KAAK,YAAA,GACL,KAAK,WAAW,EAAE,OAAO,KAAK,QAAA,CAAA;EAAA,GAAA,KAAA,cAGT,MAAA;GACP,AAAV,EAAE,QAAQ,OAAO,EAAE,QAAQ,YAC9B,EAAE,eAAA,GACF,KAAK,QAAA;EAAA;CAAA;CAAA;EAAA,KAAA,oBA9F8B;GAAA,GACjC,EAAW;GACd,gBAAA,CAAgB;EAAA;CAAA;CAkBjB,aAAsB,GAAA;EACrB,MAAM,aAAa,CAAA,GACnB,KAAK,kBAAkB,KAAK;CAC7B;CAMA,IAAA,QAAa;EACZ,OAAO,KAAK,YAAY,KAAK;CAC9B;CAEA,WAAoB,GAAA;EACnB,MAAM,WAAW,CAAA,IACb,EAAQ,IAAI,SAAA,KAAc,EAAQ,IAAI,OAAA,KAAY,EAAQ,IAAI,MAAA,OAGjE,KAAK,WAAW,aAAa,KAAK,UAAU,KAAK,QAAQ,IAAA,GACrD,KAAK,UAAS,KAAK,WAAW,OAAO,IAAI,SAAA,IACxC,KAAK,WAAW,OAAO,OAAO,SAAA,GAKnC,KAAK,cAAA,KAEF,EAAQ,IAAI,UAAA,KAAe,EAAQ,IAAI,UAAA,MAC1C,KAAK,cAAA;CAEP;CAGA,gBAAA;EACC,IAAI,KAAK,UAER,OADA,KAAK,WAAW,YAAY,CAAC,CAAA,GAAA,CACtB;EAER,IAAM,IAAA,CAAW,KAAK,YAAY,KAAK,SACjC,IAAU,IAAU,KAAK;EAW/B,OATA,KAAK,WAAW,YACf,IAAU,CAAC,IAAI,EAAE,cAAA,CAAc,EAAA,GAC/B,IAAA,KAAU,IAAY,CAAA,GAGnB,KAAK,iBAAA,MACR,KAAK,QAAA,CAAS,GACd,KAAK,oBAAoB,IAEnB;CACR;CAGA,gBAAA;EACC,OAAK,KAAK,QAAA,CAAQ,KAAK,YAAa,KAAK,UAClC,CAAC,CAAC,KAAK,MAAM,KAAK,KAAA,CAAA,IADgC,CAAA;CAE1D;CAEA,YAAA;EACC,KAAK,UAAU,KAAK,iBACpB,MAAM,UAAA;CACP;CAgBA,SAAA;EACC,OAAO,CAAI;;;;mBAIM,KAAK,UAAU,SAAS,QAAA;iBAC1B,KAAK,SAAS,EAAA;oBACX,KAAK,WAAW,SAAS,QAAA;gBAC7B,KAAK,SAAA;aACR,KAAK,QAAA;eACH,KAAK,WAAA;;;;;;;CAOnB;AAAA;AAAA,EAAA,CAzGC,EAAS;CAAE,MAAM;CAAQ,SAAA,CAAS;AAAA,CAAA,CAAA,GAAM,EAAA,WAAA,SAAA,KAAA,CAAA,GAAA,EAAA,CAIxC,EAAS;CAAE,MAAM;CAAS,SAAA,CAAS;AAAA,CAAA,CAAA,GAAM,EAAA,WAAA,WAAA,KAAA,CAAA,GAAA,IAAA,EAAA,CA3E1C,EAAc,iBAAA,CAAA,GAAiB,CAAA;AAAA,SAAA,KAAA"}
|
package/dist/table.cjs
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`./chunk-CncqDLb2.cjs`);const e=require(`./
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`./chunk-CncqDLb2.cjs`);const e=require(`./SchmancyElement-D8_z9JrW.cjs`);require(`./mixins-JyO9GSGy.cjs`);let t=require(`lit/decorators.js`),n=require(`lit`);require(`@lit-labs/virtualizer`);var r=class extends e.t{constructor(...e){super(...e),this.columns=[],this.cols=this.columns.map(()=>`1fr`).join(` `)}renderCell(e){if(e.render)return n.html`
|
|
2
2
|
<div class="overflow-hidden text-ellipsis">
|
|
3
3
|
<schmancy-typography align="${e.align||`left`}" maxLines="2" weight="${e.weight||`normal`}">
|
|
4
4
|
${e.render(this.item)}
|
|
5
5
|
</schmancy-typography>
|
|
6
6
|
</div>
|
|
7
|
-
`;let t=e.key?this.item[e.key]:``;return
|
|
7
|
+
`;let t=e.key?this.item[e.key]:``;return n.html`
|
|
8
8
|
<div class="overflow-hidden text-ellipsis">
|
|
9
9
|
<schmancy-typography align="${e.align||`left`}" maxLines="2" weight="${e.weight||`normal`}">
|
|
10
10
|
${t}
|
|
11
11
|
</schmancy-typography>
|
|
12
12
|
</div>
|
|
13
|
-
`}render(){return
|
|
13
|
+
`}render(){return n.html`
|
|
14
14
|
<schmancy-list-item class="w-full">
|
|
15
15
|
<div
|
|
16
16
|
class="grid items-center gap-4"
|
|
@@ -19,11 +19,11 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`./ch
|
|
|
19
19
|
${this.columns.map(e=>this.renderCell(e))}
|
|
20
20
|
</div>
|
|
21
21
|
</schmancy-list-item>
|
|
22
|
-
`}};
|
|
22
|
+
`}};e.u([(0,t.property)({type:Array,attribute:!1})],r.prototype,`columns`,void 0),e.u([(0,t.property)({type:Object,attribute:!1})],r.prototype,`item`,void 0),e.u([(0,t.property)({type:String})],r.prototype,`cols`,void 0),r=e.u([(0,t.customElement)(`schmancy-table-row`)],r);var i=class extends e.t{constructor(){super(),this.columns=[],this.data=[],this.keyField=`id`,this.cols=`1fr`,this.sortable=!1,this.sortColumn=null,this.sortDirection=null,this.filteredData=[],this.filteredData=this.data}willUpdate(e){(e.has(`data`)||e.has(`sortColumn`)||e.has(`sortDirection`))&&this.processData()}isDate(e){return e&&typeof e==`object`&&Object.prototype.toString.call(e)===`[object Date]`}processData(){let e=[...this.data];if(this.sortable&&this.sortColumn&&this.sortDirection){let t=this.columns.find(e=>e.key===this.sortColumn);e.sort((e,n)=>{let r,i;if(t&&t.value?(r=t.value(e),i=t.value(n)):(r=e[this.sortColumn],i=n[this.sortColumn]),r==null)return this.sortDirection===`asc`?1:-1;if(i==null)return this.sortDirection===`asc`?-1:1;if(typeof r==`number`&&typeof i==`number`)return this.sortDirection===`asc`?r-i:i-r;let a=typeof r==`string`&&!isNaN(Number(r)),o=typeof i==`string`&&!isNaN(Number(i));if(a&&o){let e=parseFloat(r),t=parseFloat(i);return this.sortDirection===`asc`?e-t:t-e}if(this.isDate(r)&&this.isDate(i))return this.sortDirection===`asc`?r.getTime()-i.getTime():i.getTime()-r.getTime();let s=String(r),c=String(i);return this.sortDirection===`asc`?s.localeCompare(c):c.localeCompare(s)})}this.filteredData=e}toggleSort(e){if(!e.key||!1===e.sortable)return;let t=e.key;t===this.sortColumn?this.sortDirection===`asc`?this.sortDirection=`desc`:this.sortDirection===`desc`?this.sortDirection=null:this.sortDirection=`asc`:(this.sortColumn=t,this.sortDirection=`asc`),this.dispatchEvent(new CustomEvent(`sort-change`,{detail:{column:this.sortColumn,direction:this.sortDirection},bubbles:!0,composed:!0}))}renderSortIndicator(e){return this.sortable&&!1!==e.sortable&&e.key&&e.key===this.sortColumn?n.html`
|
|
23
23
|
<span class="ml-1">
|
|
24
|
-
${this.sortDirection===`asc`?
|
|
24
|
+
${this.sortDirection===`asc`?n.html`<schmancy-icon class="text-base">arrow_upward</schmancy-icon>`:this.sortDirection===`desc`?n.html`<schmancy-icon class="text-base">arrow_downward</schmancy-icon>`:null}
|
|
25
25
|
</span>
|
|
26
|
-
`:null}render(){let e=e=>({"flex items-center":!0,"cursor-pointer gap-1":this.sortable&&!1!==e.sortable&&e.key});return
|
|
26
|
+
`:null}render(){let e=e=>({"flex items-center":!0,"cursor-pointer gap-1":this.sortable&&!1!==e.sortable&&e.key});return n.html`
|
|
27
27
|
<div
|
|
28
28
|
class="grid h-full w-full"
|
|
29
29
|
style="grid-template-columns: 1fr; grid-template-rows: auto 1fr;"
|
|
@@ -33,7 +33,7 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`./ch
|
|
|
33
33
|
class="grid items-center gap-4 px-4 py-3"
|
|
34
34
|
style=${this.styleMap({gridTemplateColumns:this.cols,gridTemplateRows:`1fr`})}
|
|
35
35
|
>
|
|
36
|
-
${this.columns.map(t=>
|
|
36
|
+
${this.columns.map(t=>n.html`
|
|
37
37
|
<div
|
|
38
38
|
class=${this.classMap(e(t))}
|
|
39
39
|
@click=${()=>this.sortable&&!1!==t.sortable?this.toggleSort(t):null}
|
|
@@ -47,13 +47,13 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`./ch
|
|
|
47
47
|
</div>
|
|
48
48
|
</schmancy-surface>
|
|
49
49
|
|
|
50
|
-
${this.filteredData.length>0?
|
|
50
|
+
${this.filteredData.length>0?n.html`
|
|
51
51
|
<lit-virtualizer
|
|
52
52
|
scroller
|
|
53
53
|
class="w-full h-full relative overflow-auto"
|
|
54
54
|
.items=${this.filteredData}
|
|
55
55
|
.keyFunction=${(e,t)=>{let n=e?.[this.keyField];return n==null?t:typeof n==`string`||typeof n==`number`?n:String(n)}}
|
|
56
|
-
.renderItem=${(e,t)=>
|
|
56
|
+
.renderItem=${(e,t)=>n.html`
|
|
57
57
|
<schmancy-table-row
|
|
58
58
|
class="w-full border-b border-solid border-outlineVariant"
|
|
59
59
|
.columns=${this.columns}
|
|
@@ -63,10 +63,10 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`./ch
|
|
|
63
63
|
></schmancy-table-row>
|
|
64
64
|
`}
|
|
65
65
|
></lit-virtualizer>
|
|
66
|
-
`:
|
|
66
|
+
`:n.html`
|
|
67
67
|
<div class="flex items-center justify-center w-full h-full p-8 text-center">
|
|
68
68
|
<schmancy-typography type="body" token="lg"> No data available </schmancy-typography>
|
|
69
69
|
</div>
|
|
70
70
|
`}
|
|
71
71
|
</div>
|
|
72
|
-
`}};
|
|
72
|
+
`}};e.u([(0,t.property)({type:Array,attribute:!1})],i.prototype,`columns`,void 0),e.u([(0,t.property)({type:Array,attribute:!1})],i.prototype,`data`,void 0),e.u([(0,t.property)({type:String})],i.prototype,`keyField`,void 0),e.u([(0,t.property)({type:String})],i.prototype,`cols`,void 0),e.u([(0,t.property)({type:Boolean})],i.prototype,`sortable`,void 0),e.u([(0,t.state)()],i.prototype,`sortColumn`,void 0),e.u([(0,t.state)()],i.prototype,`sortDirection`,void 0),e.u([(0,t.state)()],i.prototype,`filteredData`,void 0),i=e.u([(0,t.customElement)(`schmancy-table`)],i),Object.defineProperty(exports,`SchmancyDataTable`,{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,`SchmancyTableRow`,{enumerable:!0,get:function(){return r}});
|
package/dist/table.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table.cjs","names":[],"sources":["../src/table/row.ts","../src/table/table.ts"],"sourcesContent":["import { SchmancyElement } from '@mixins/index'\nimport { html, TemplateResult } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport { TableColumn } from './table' // Import TableColumn interface with updated types\n\n@customElement('schmancy-table-row')\nexport class SchmancyTableRow<T extends Record<string, any> = any> extends SchmancyElement {\n\t@property({ type: Array, attribute: false })\n\tcolumns: TableColumn<T>[] = []\n\n\t@property({ type: Object, attribute: false })\n\titem!: T\n\n\t@property({ type: String })\n\tcols: string = this.columns.map(() => '1fr').join(' ')\n\n\t/**\n\t * Renders a cell based on column configuration.\n\t * Uses custom render function if provided, otherwise extracts data from item.\n\t */\n\tprivate renderCell(column: TableColumn<T>): TemplateResult {\n\t\t// Use the render function if provided\n\t\tif (column.render) {\n\t\t\treturn html`\n\t\t\t\t<div class=\"overflow-hidden text-ellipsis\">\n\t\t\t\t\t<schmancy-typography align=\"${column.align || 'left'}\" maxLines=\"2\" weight=\"${column.weight || 'normal'}\">\n\t\t\t\t\t\t${column.render(this.item)}\n\t\t\t\t\t</schmancy-typography>\n\t\t\t\t</div>\n\t\t\t`\n\t\t}\n\n\t\t// Otherwise extract data using the key if available\n\t\tconst value = column.key ? this.item[column.key] : ''\n\n\t\treturn html`\n\t\t\t<div class=\"overflow-hidden text-ellipsis\">\n\t\t\t\t<schmancy-typography align=\"${column.align || 'left'}\" maxLines=\"2\" weight=\"${column.weight || 'normal'}\">\n\t\t\t\t\t${value}\n\t\t\t\t</schmancy-typography>\n\t\t\t</div>\n\t\t`\n\t}\n\n\trender(): TemplateResult {\n\t\treturn html`\n\t\t\t<schmancy-list-item class=\"w-full\">\n\t\t\t\t<div\n\t\t\t\t\tclass=\"grid items-center gap-4\"\n\t\t\t\t\tstyle=${this.styleMap({ gridTemplateColumns: this.cols })}\n\t\t\t\t>\n\t\t\t\t\t${this.columns.map(column => this.renderCell(column))}\n\t\t\t\t</div>\n\t\t\t</schmancy-list-item>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-table-row': SchmancyTableRow\n\t}\n}\n","import '@lit-labs/virtualizer'\nimport { SchmancyElement } from '@mixins/index'\nimport { html, TemplateResult } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport './row' // Import the schmancy-table-row component\n\n// Define a generic TableColumn interface.\n// The `key` is now a key of T, and the render function accepts T.\nexport interface TableColumn<T extends Record<string, any> = any> {\n\tname: string\n\tkey?: keyof T // Key to access the property on the data object.\n\talign?: 'left' | 'right' | 'center'\n\tweight?: 'normal' | 'bold'\n\trender?: (item: T) => TemplateResult | string | number // Custom render function for complex content\n\tsortable?: boolean // Whether this column is sortable\n\tvalue?: (item: T) => any // Custom value function for sorting\n}\n\n// Define an event detail interface for row events.\nexport interface RowEventDetail<T> {\n\titem: T\n\tindex: number\n}\n\n// Define sort direction type\nexport type SortDirection = 'asc' | 'desc' | null\n\n/**\n * SchmancyDataTable is a generic data table component.\n * It supports sorting, filtering, and custom rendering of rows.\n *\n */\n@customElement('schmancy-table')\nexport class SchmancyDataTable<T extends Record<string, any> = any> extends SchmancyElement {\n\t@property({ type: Array, attribute: false })\n\tcolumns: TableColumn<T>[] = []\n\n\t@property({ type: Array, attribute: false })\n\tdata: T[] = []\n\n\t// The keyField is now of type keyof T.\n\t@property({ type: String })\n\tkeyField: keyof T = 'id' as keyof T\n\n\t@property({ type: String })\n\tcols: string = '1fr'\n\n\t// Sorting property\n\t@property({ type: Boolean })\n\tsortable: boolean = false\n\n\t// Internal state properties\n\t@state() private sortColumn: keyof T | null = null\n\t@state() private sortDirection: SortDirection = null\n\t@state() private filteredData: T[] = []\n\n\tconstructor() {\n\t\tsuper()\n\t\tthis.filteredData = this.data\n\t}\n\n\t// Process the data whenever our dependencies change\n\tprotected willUpdate(changedProperties: Map<PropertyKey, unknown>): void {\n\t\tif (\n\t\t\tchangedProperties.has('data') ||\n\t\t\tchangedProperties.has('sortColumn') ||\n\t\t\tchangedProperties.has('sortDirection')\n\t\t) {\n\t\t\tthis.processData()\n\t\t}\n\t}\n\n\t/**\n\t * Helper function to check if a value is a Date object in a type-safe way\n\t */\n\tprivate isDate(value: any): value is Date {\n\t\treturn value && typeof value === 'object' && Object.prototype.toString.call(value) === '[object Date]'\n\t}\n\n\tprivate processData(): void {\n\t\tlet result = [...this.data]\n\n\t\t// Apply sorting\n\t\tif (this.sortable && this.sortColumn && this.sortDirection) {\n\t\t\t// Find the column configuration for the sorting column\n\t\t\tconst sortColumnConfig = this.columns.find(col => col.key === this.sortColumn)\n\n\t\t\tresult.sort((a, b) => {\n\t\t\t\t// Use the value function if provided in the column configuration\n\t\t\t\tlet aValue, bValue\n\n\t\t\t\tif (sortColumnConfig && sortColumnConfig.value) {\n\t\t\t\t\t// Use custom value function for sorting\n\t\t\t\t\taValue = sortColumnConfig.value(a)\n\t\t\t\t\tbValue = sortColumnConfig.value(b)\n\t\t\t\t} else {\n\t\t\t\t\t// Use standard property access\n\t\t\t\t\taValue = a[this.sortColumn as keyof T]\n\t\t\t\t\tbValue = b[this.sortColumn as keyof T]\n\t\t\t\t}\n\n\t\t\t\t// Handle null/undefined values - always sort them to the end regardless of sort direction\n\t\t\t\tif (aValue === null || aValue === undefined) {\n\t\t\t\t\treturn this.sortDirection === 'asc' ? 1 : -1\n\t\t\t\t}\n\t\t\t\tif (bValue === null || bValue === undefined) {\n\t\t\t\t\treturn this.sortDirection === 'asc' ? -1 : 1\n\t\t\t\t}\n\n\t\t\t\t// Handle numbers\n\t\t\t\tif (typeof aValue === 'number' && typeof bValue === 'number') {\n\t\t\t\t\treturn this.sortDirection === 'asc' ? aValue - bValue : bValue - aValue\n\t\t\t\t}\n\n\t\t\t\t// Detect and handle numeric strings - convert to numbers if both values are numeric\n\t\t\t\tconst aNumeric = typeof aValue === 'string' && !isNaN(Number(aValue))\n\t\t\t\tconst bNumeric = typeof bValue === 'string' && !isNaN(Number(bValue))\n\n\t\t\t\tif (aNumeric && bNumeric) {\n\t\t\t\t\tconst aNum = parseFloat(aValue as string)\n\t\t\t\t\tconst bNum = parseFloat(bValue as string)\n\t\t\t\t\treturn this.sortDirection === 'asc' ? aNum - bNum : bNum - aNum\n\t\t\t\t}\n\n\t\t\t\t// Handle dates - with proper type checking\n\t\t\t\tif (this.isDate(aValue) && this.isDate(bValue)) {\n\t\t\t\t\treturn this.sortDirection === 'asc'\n\t\t\t\t\t\t? aValue.getTime() - bValue.getTime()\n\t\t\t\t\t\t: bValue.getTime() - aValue.getTime()\n\t\t\t\t}\n\n\t\t\t\t// Convert to strings for string comparison or fallback comparison\n\t\t\t\tconst aStr = String(aValue)\n\t\t\t\tconst bStr = String(bValue)\n\t\t\t\treturn this.sortDirection === 'asc' ? aStr.localeCompare(bStr) : bStr.localeCompare(aStr)\n\t\t\t})\n\t\t}\n\n\t\tthis.filteredData = result\n\t}\n\n\t// Toggle sort for a column\n\tprivate toggleSort(column: TableColumn<T>): void {\n\t\tif (!column.key || column.sortable === false) return\n\n\t\tconst columnKey = column.key\n\n\t\t// If clicking the same column, cycle through sort states: asc -> desc -> null\n\t\tif (columnKey === this.sortColumn) {\n\t\t\tif (this.sortDirection === 'asc') {\n\t\t\t\tthis.sortDirection = 'desc'\n\t\t\t} else if (this.sortDirection === 'desc') {\n\t\t\t\tthis.sortDirection = null\n\t\t\t} else {\n\t\t\t\tthis.sortDirection = 'asc'\n\t\t\t}\n\t\t} else {\n\t\t\t// New column, start with ascending\n\t\t\tthis.sortColumn = columnKey\n\t\t\tthis.sortDirection = 'asc'\n\t\t}\n\n\t\t// Dispatch sort event\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent('sort-change', {\n\t\t\t\tdetail: {\n\t\t\t\t\tcolumn: this.sortColumn,\n\t\t\t\t\tdirection: this.sortDirection,\n\t\t\t\t},\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t}),\n\t\t)\n\t}\n\n\t// Render sort indicator\n\tprivate renderSortIndicator(column: TableColumn<T>): TemplateResult | null {\n\t\tif (!this.sortable || column.sortable === false || !column.key || column.key !== this.sortColumn) {\n\t\t\treturn null\n\t\t}\n\n\t\treturn html`\n\t\t\t<span class=\"ml-1\">\n\t\t\t\t${this.sortDirection === 'asc'\n\t\t\t\t\t? html`<schmancy-icon class=\"text-base\">arrow_upward</schmancy-icon>`\n\t\t\t\t\t: this.sortDirection === 'desc'\n\t\t\t\t\t\t? html`<schmancy-icon class=\"text-base\">arrow_downward</schmancy-icon>`\n\t\t\t\t\t\t: null}\n\t\t\t</span>\n\t\t`\n\t}\n\n\trender(): TemplateResult {\n\t\tconst columnHeadClasses = column => ({\n\t\t\t'flex items-center': true,\n\t\t\t'cursor-pointer gap-1': this.sortable && column.sortable !== false && column.key,\n\t\t})\n\t\treturn html`\n\t\t\t<div\n\t\t\t\tclass=\"grid h-full w-full\"\n\t\t\t\tstyle=\"grid-template-columns: 1fr; grid-template-rows: auto 1fr;\"\n\t\t\t>\n\t\t\t\t<schmancy-surface rounded=\"top\" elevation=\"1\" type=\"glass\" class=\"sticky top-0 z-10\">\n\t\t\t\t\t<div\n\t\t\t\t\t\tclass=\"grid items-center gap-4 px-4 py-3\"\n\t\t\t\t\t\tstyle=${this.styleMap({\n\t\t\t\t\t\t\tgridTemplateColumns: this.cols,\n\t\t\t\t\t\t\tgridTemplateRows: '1fr',\n\t\t\t\t\t\t})}\n\t\t\t\t\t>\n\t\t\t\t\t\t${this.columns.map(\n\t\t\t\t\t\t\tcolumn => html`\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclass=${this.classMap(columnHeadClasses(column))}\n\t\t\t\t\t\t\t\t\t@click=${() => (this.sortable && column.sortable !== false ? this.toggleSort(column) : null)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<schmancy-typography align=${column.align ?? 'left'} weight=${column.weight ?? 'bold'}>\n\t\t\t\t\t\t\t\t\t\t${column.name}\n\t\t\t\t\t\t\t\t\t</schmancy-typography>\n\t\t\t\t\t\t\t\t\t${this.renderSortIndicator(column)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t`,\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t</schmancy-surface>\n\n\t\t\t\t${this.filteredData.length > 0\n\t\t\t\t\t? html`\n\t\t\t\t\t\t\t<lit-virtualizer\n\t\t\t\t\t\t\t\tscroller\n\t\t\t\t\t\t\t\tclass=\"w-full h-full relative overflow-auto\"\n\t\t\t\t\t\t\t\t.items=${this.filteredData}\n\t\t\t\t\t\t\t\t.keyFunction=${(item: T, index: number) => {\n\t\t\t\t\t\t\t\t\tconst keyValue = item?.[this.keyField]\n\t\t\t\t\t\t\t\t\tif (keyValue === undefined || keyValue === null) {\n\t\t\t\t\t\t\t\t\t\treturn index\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn typeof keyValue === 'string' || typeof keyValue === 'number' ? keyValue : String(keyValue)\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t.renderItem=${(item: T, index: number) =>\n\t\t\t\t\t\t\t\t\thtml`\n\t\t\t\t\t\t\t\t\t\t<schmancy-table-row\n\t\t\t\t\t\t\t\t\t\t\tclass=\"w-full border-b border-solid border-outlineVariant\"\n\t\t\t\t\t\t\t\t\t\t\t.columns=${this.columns}\n\t\t\t\t\t\t\t\t\t\t\t.item=${item}\n\t\t\t\t\t\t\t\t\t\t\tcols=${this.cols}\n\t\t\t\t\t\t\t\t\t\t\t@click=${() => {\n\t\t\t\t\t\t\t\t\t\t\t\tconst detail = { item, index }\n\t\t\t\t\t\t\t\t\t\t\t\tthis.dispatchEvent(\n\t\t\t\t\t\t\t\t\t\t\t\t\tnew CustomEvent('click', {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdetail,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbubbles: true,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tcomposed: true,\n\t\t\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t></schmancy-table-row>\n\t\t\t\t\t\t\t\t\t` as TemplateResult}\n\t\t\t\t\t\t\t></lit-virtualizer>\n\t\t\t\t\t\t`\n\t\t\t\t\t: html`\n\t\t\t\t\t\t\t<div class=\"flex items-center justify-center w-full h-full p-8 text-center\">\n\t\t\t\t\t\t\t\t<schmancy-typography type=\"body\" token=\"lg\"> No data available </schmancy-typography>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t`}\n\t\t\t</div>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-table': SchmancyDataTable\n\t}\n}\n"],"mappings":"yQAMO,IAAA,EAAA,cAAoE,EAAA,CAAA,CAAA,YAAA,GAAA,EAAA,CAAA,MAAA,GAAA,EAAA,CAAA,KAAA,QAE9C,EAAA,CAAA,KAAA,KAMb,KAAK,QAAQ,QAAU,MAAA,CAAO,KAAK,IAAA,CAMlD,WAAmB,EAAA,CAElB,GAAI,EAAO,OACV,MAAO,GAAA,IAAI;;mCAEqB,EAAO,OAAS,OAAA,yBAAgC,EAAO,QAAU,SAAA;QAC5F,EAAO,OAAO,KAAK,KAAA,CAAA;;;KAOzB,IAAM,EAAQ,EAAO,IAAM,KAAK,KAAK,EAAO,KAAO,GAEnD,MAAO,GAAA,IAAI;;kCAEqB,EAAO,OAAS,OAAA,yBAAgC,EAAO,QAAU,SAAA;OAC5F,EAAA;;;IAMN,QAAA,CACC,MAAO,GAAA,IAAI;;;;aAIA,KAAK,SAAS,CAAE,oBAAqB,KAAK,KAAA,CAAA,CAAA;;OAEhD,KAAK,QAAQ,IAAI,GAAU,KAAK,WAAW,EAAA,CAAA,CAAA;;;0BA5CvC,CAAE,KAAM,MAAO,UAAA,CAAW,EAAA,CAAA,CAAA,CAAQ,EAAA,UAAA,UAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAGlC,CAAE,KAAM,OAAQ,UAAA,CAAW,EAAA,CAAA,CAAA,CAAQ,EAAA,UAAA,OAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAGnC,CAAE,KAAM,OAAA,CAAA,CAAA,CAAS,EAAA,UAAA,OAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,eARb,qBAAA,CAAA,CAAqB,EAAA,CC4B7B,IAAA,EAAA,cAAqE,EAAA,CAAA,CAuB3E,aAAA,CACC,OAAA,CAAA,KAAA,QAtB2B,EAAA,CAAA,KAAA,KAGhB,EAAA,CAAA,KAAA,SAIQ,KAAA,KAAA,KAGL,MAAA,KAAA,SAAA,CAIK,EAAA,KAAA,WAG0B,KAAA,KAAA,cACE,KAAA,KAAA,aACX,EAAA,CAIpC,KAAK,aAAe,KAAK,KAI1B,WAAqB,EAAA,EAEnB,EAAkB,IAAI,OAAA,EACtB,EAAkB,IAAI,aAAA,EACtB,EAAkB,IAAI,gBAAA,GAEtB,KAAK,aAAA,CAOP,OAAe,EAAA,CACd,OAAO,GAA0B,OAAV,GAAU,UAAY,OAAO,UAAU,SAAS,KAAK,EAAA,GAAW,gBAGxF,aAAA,CACC,IAAI,EAAS,CAAA,GAAI,KAAK,KAAA,CAGtB,GAAI,KAAK,UAAY,KAAK,YAAc,KAAK,cAAe,CAE3D,IAAM,EAAmB,KAAK,QAAQ,KAAK,GAAO,EAAI,MAAQ,KAAK,WAAA,CAEnE,EAAO,MAAM,EAAG,IAAA,CAEf,IAAI,EAAQ,EAaZ,GAXI,GAAoB,EAAiB,OAExC,EAAS,EAAiB,MAAM,EAAA,CAChC,EAAS,EAAiB,MAAM,EAAA,GAGhC,EAAS,EAAE,KAAK,YAChB,EAAS,EAAE,KAAK,aAIb,GAAA,KACH,OAAO,KAAK,gBAAkB,MAAQ,EAAA,GAEvC,GAAI,GAAA,KACH,OAAO,KAAK,gBAAkB,MAAlB,GAA+B,EAI5C,GAAsB,OAAX,GAAW,UAA8B,OAAX,GAAW,SACnD,OAAO,KAAK,gBAAkB,MAAQ,EAAS,EAAS,EAAS,EAIlE,IAAM,EAA6B,OAAX,GAAW,UAAX,CAAwB,MAAM,OAAO,EAAA,CAAA,CACvD,EAA6B,OAAX,GAAW,UAAX,CAAwB,MAAM,OAAO,EAAA,CAAA,CAE7D,GAAI,GAAY,EAAU,CACzB,IAAM,EAAO,WAAW,EAAA,CAClB,EAAO,WAAW,EAAA,CACxB,OAAO,KAAK,gBAAkB,MAAQ,EAAO,EAAO,EAAO,EAI5D,GAAI,KAAK,OAAO,EAAA,EAAW,KAAK,OAAO,EAAA,CACtC,OAAO,KAAK,gBAAkB,MAC3B,EAAO,SAAA,CAAY,EAAO,SAAA,CAC1B,EAAO,SAAA,CAAY,EAAO,SAAA,CAI9B,IAAM,EAAO,OAAO,EAAA,CACd,EAAO,OAAO,EAAA,CACpB,OAAO,KAAK,gBAAkB,MAAQ,EAAK,cAAc,EAAA,CAAQ,EAAK,cAAc,EAAA,EAAA,CAItF,KAAK,aAAe,EAIrB,WAAmB,EAAA,CAClB,GAAA,CAAK,EAAO,KAAA,CAA2B,IAApB,EAAO,SAAoB,OAE9C,IAAM,EAAY,EAAO,IAGrB,IAAc,KAAK,WAClB,KAAK,gBAAkB,MAC1B,KAAK,cAAgB,OACX,KAAK,gBAAkB,OACjC,KAAK,cAAgB,KAErB,KAAK,cAAgB,OAItB,KAAK,WAAa,EAClB,KAAK,cAAgB,OAItB,KAAK,cACJ,IAAI,YAAY,cAAe,CAC9B,OAAQ,CACP,OAAQ,KAAK,WACb,UAAW,KAAK,cAAA,CAEjB,QAAA,CAAS,EACT,SAAA,CAAU,EAAA,CAAA,CAAA,CAMb,oBAA4B,EAAA,CAC3B,OAAK,KAAK,UAAA,CAAgC,IAApB,EAAO,UAAuB,EAAO,KAAO,EAAO,MAAQ,KAAK,WAI/E,EAAA,IAAI;;MAEP,KAAK,gBAAkB,MACtB,EAAA,IAAI,gEACJ,KAAK,gBAAkB,OACtB,EAAA,IAAI,kEACJ,KAAA;;IATE,KAcT,QAAA,CACC,IAAM,EAAoB,IAAA,CACzB,oBAAA,CAAqB,EACrB,uBAAwB,KAAK,UAAA,CAAgC,IAApB,EAAO,UAAsB,EAAO,IAAA,EAE9E,MAAO,GAAA,IAAI;;;;;;;;cAQC,KAAK,SAAS,CACrB,oBAAqB,KAAK,KAC1B,iBAAkB,MAAA,CAAA,CAAA;;QAGjB,KAAK,QAAQ,IACd,GAAU,EAAA,IAAI;;iBAEJ,KAAK,SAAS,EAAkB,EAAA,CAAA,CAAA;sBACxB,KAAK,UAAA,CAAgC,IAApB,EAAO,SAAqB,KAAK,WAAW,EAAA,CAAU,KAAA;;sCAE1D,EAAO,OAAS,OAAA,UAAiB,EAAO,QAAU,OAAA;YAC5E,EAAO,KAAA;;WAER,KAAK,oBAAoB,EAAA,CAAA;;;;;;MAO9B,KAAK,aAAa,OAAS,EAC1B,EAAA,IAAI;;;;iBAIM,KAAK,aAAA;wBACE,EAAS,IAAA,CACxB,IAAM,EAAW,IAAO,KAAK,UAC7B,OAAI,GAAA,KACI,EAEmB,OAAb,GAAa,UAAgC,OAAb,GAAa,SAAW,EAAW,OAAO,EAAA,EAAA;uBAE1E,EAAS,IACvB,EAAA,IAAI;;;sBAGS,KAAK,QAAA;mBACR,EAAA;kBACD,KAAK,KAAA;yBAEX,IAAM,EAAS,CAAE,KAAA,EAAM,MAAA,EAAA,CACvB,KAAK,cACJ,IAAI,YAAY,QAAS,CACxB,OAAA,EACA,QAAA,CAAS,EACT,SAAA,CAAU,EAAA,CAAA,CAAA,EAAA;;;;QAQjB,EAAA,IAAI;;;;;;0BAlOA,CAAE,KAAM,MAAO,UAAA,CAAW,EAAA,CAAA,CAAA,CAAQ,EAAA,UAAA,UAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAGlC,CAAE,KAAM,MAAO,UAAA,CAAW,EAAA,CAAA,CAAA,CAAQ,EAAA,UAAA,OAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAIlC,CAAE,KAAM,OAAA,CAAA,CAAA,CAAS,EAAA,UAAA,WAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAGjB,CAAE,KAAM,OAAA,CAAA,CAAA,CAAS,EAAA,UAAA,OAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAIjB,CAAE,KAAM,QAAA,CAAA,CAAA,CAAU,EAAA,UAAA,WAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,QAAA,CAAA,CAIpB,EAAA,UAAA,aAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,QAAA,CAAA,CACA,EAAA,UAAA,gBAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,QAAA,CAAA,CACA,EAAA,UAAA,eAAA,IAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,eAtBM,iBAAA,CAAA,CAAiB,EAAA,CAAA,OAAA,eAAA,QAAA,oBAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,GAAA,CAAA,CAAA,OAAA,eAAA,QAAA,mBAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,GAAA,CAAA"}
|
|
1
|
+
{"version":3,"file":"table.cjs","names":[],"sources":["../src/table/row.ts","../src/table/table.ts"],"sourcesContent":["import { SchmancyElement } from '@mixins/index'\nimport { html, TemplateResult } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport { TableColumn } from './table' // Import TableColumn interface with updated types\n\n@customElement('schmancy-table-row')\nexport class SchmancyTableRow<T extends Record<string, any> = any> extends SchmancyElement {\n\t@property({ type: Array, attribute: false })\n\tcolumns: TableColumn<T>[] = []\n\n\t@property({ type: Object, attribute: false })\n\titem!: T\n\n\t@property({ type: String })\n\tcols: string = this.columns.map(() => '1fr').join(' ')\n\n\t/**\n\t * Renders a cell based on column configuration.\n\t * Uses custom render function if provided, otherwise extracts data from item.\n\t */\n\tprivate renderCell(column: TableColumn<T>): TemplateResult {\n\t\t// Use the render function if provided\n\t\tif (column.render) {\n\t\t\treturn html`\n\t\t\t\t<div class=\"overflow-hidden text-ellipsis\">\n\t\t\t\t\t<schmancy-typography align=\"${column.align || 'left'}\" maxLines=\"2\" weight=\"${column.weight || 'normal'}\">\n\t\t\t\t\t\t${column.render(this.item)}\n\t\t\t\t\t</schmancy-typography>\n\t\t\t\t</div>\n\t\t\t`\n\t\t}\n\n\t\t// Otherwise extract data using the key if available\n\t\tconst value = column.key ? this.item[column.key] : ''\n\n\t\treturn html`\n\t\t\t<div class=\"overflow-hidden text-ellipsis\">\n\t\t\t\t<schmancy-typography align=\"${column.align || 'left'}\" maxLines=\"2\" weight=\"${column.weight || 'normal'}\">\n\t\t\t\t\t${value}\n\t\t\t\t</schmancy-typography>\n\t\t\t</div>\n\t\t`\n\t}\n\n\trender(): TemplateResult {\n\t\treturn html`\n\t\t\t<schmancy-list-item class=\"w-full\">\n\t\t\t\t<div\n\t\t\t\t\tclass=\"grid items-center gap-4\"\n\t\t\t\t\tstyle=${this.styleMap({ gridTemplateColumns: this.cols })}\n\t\t\t\t>\n\t\t\t\t\t${this.columns.map(column => this.renderCell(column))}\n\t\t\t\t</div>\n\t\t\t</schmancy-list-item>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-table-row': SchmancyTableRow\n\t}\n}\n","import '@lit-labs/virtualizer'\nimport { SchmancyElement } from '@mixins/index'\nimport { html, TemplateResult } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport './row' // Import the schmancy-table-row component\n\n// Define a generic TableColumn interface.\n// The `key` is now a key of T, and the render function accepts T.\nexport interface TableColumn<T extends Record<string, any> = any> {\n\tname: string\n\tkey?: keyof T // Key to access the property on the data object.\n\talign?: 'left' | 'right' | 'center'\n\tweight?: 'normal' | 'bold'\n\trender?: (item: T) => TemplateResult | string | number // Custom render function for complex content\n\tsortable?: boolean // Whether this column is sortable\n\tvalue?: (item: T) => any // Custom value function for sorting\n}\n\n// Define an event detail interface for row events.\nexport interface RowEventDetail<T> {\n\titem: T\n\tindex: number\n}\n\n// Define sort direction type\nexport type SortDirection = 'asc' | 'desc' | null\n\n/**\n * SchmancyDataTable is a generic data table component.\n * It supports sorting, filtering, and custom rendering of rows.\n *\n */\n@customElement('schmancy-table')\nexport class SchmancyDataTable<T extends Record<string, any> = any> extends SchmancyElement {\n\t@property({ type: Array, attribute: false })\n\tcolumns: TableColumn<T>[] = []\n\n\t@property({ type: Array, attribute: false })\n\tdata: T[] = []\n\n\t// The keyField is now of type keyof T.\n\t@property({ type: String })\n\tkeyField: keyof T = 'id' as keyof T\n\n\t@property({ type: String })\n\tcols: string = '1fr'\n\n\t// Sorting property\n\t@property({ type: Boolean })\n\tsortable: boolean = false\n\n\t// Internal state properties\n\t@state() private sortColumn: keyof T | null = null\n\t@state() private sortDirection: SortDirection = null\n\t@state() private filteredData: T[] = []\n\n\tconstructor() {\n\t\tsuper()\n\t\tthis.filteredData = this.data\n\t}\n\n\t// Process the data whenever our dependencies change\n\tprotected willUpdate(changedProperties: Map<PropertyKey, unknown>): void {\n\t\tif (\n\t\t\tchangedProperties.has('data') ||\n\t\t\tchangedProperties.has('sortColumn') ||\n\t\t\tchangedProperties.has('sortDirection')\n\t\t) {\n\t\t\tthis.processData()\n\t\t}\n\t}\n\n\t/**\n\t * Helper function to check if a value is a Date object in a type-safe way\n\t */\n\tprivate isDate(value: any): value is Date {\n\t\treturn value && typeof value === 'object' && Object.prototype.toString.call(value) === '[object Date]'\n\t}\n\n\tprivate processData(): void {\n\t\tlet result = [...this.data]\n\n\t\t// Apply sorting\n\t\tif (this.sortable && this.sortColumn && this.sortDirection) {\n\t\t\t// Find the column configuration for the sorting column\n\t\t\tconst sortColumnConfig = this.columns.find(col => col.key === this.sortColumn)\n\n\t\t\tresult.sort((a, b) => {\n\t\t\t\t// Use the value function if provided in the column configuration\n\t\t\t\tlet aValue, bValue\n\n\t\t\t\tif (sortColumnConfig && sortColumnConfig.value) {\n\t\t\t\t\t// Use custom value function for sorting\n\t\t\t\t\taValue = sortColumnConfig.value(a)\n\t\t\t\t\tbValue = sortColumnConfig.value(b)\n\t\t\t\t} else {\n\t\t\t\t\t// Use standard property access\n\t\t\t\t\taValue = a[this.sortColumn as keyof T]\n\t\t\t\t\tbValue = b[this.sortColumn as keyof T]\n\t\t\t\t}\n\n\t\t\t\t// Handle null/undefined values - always sort them to the end regardless of sort direction\n\t\t\t\tif (aValue === null || aValue === undefined) {\n\t\t\t\t\treturn this.sortDirection === 'asc' ? 1 : -1\n\t\t\t\t}\n\t\t\t\tif (bValue === null || bValue === undefined) {\n\t\t\t\t\treturn this.sortDirection === 'asc' ? -1 : 1\n\t\t\t\t}\n\n\t\t\t\t// Handle numbers\n\t\t\t\tif (typeof aValue === 'number' && typeof bValue === 'number') {\n\t\t\t\t\treturn this.sortDirection === 'asc' ? aValue - bValue : bValue - aValue\n\t\t\t\t}\n\n\t\t\t\t// Detect and handle numeric strings - convert to numbers if both values are numeric\n\t\t\t\tconst aNumeric = typeof aValue === 'string' && !isNaN(Number(aValue))\n\t\t\t\tconst bNumeric = typeof bValue === 'string' && !isNaN(Number(bValue))\n\n\t\t\t\tif (aNumeric && bNumeric) {\n\t\t\t\t\tconst aNum = parseFloat(aValue as string)\n\t\t\t\t\tconst bNum = parseFloat(bValue as string)\n\t\t\t\t\treturn this.sortDirection === 'asc' ? aNum - bNum : bNum - aNum\n\t\t\t\t}\n\n\t\t\t\t// Handle dates - with proper type checking\n\t\t\t\tif (this.isDate(aValue) && this.isDate(bValue)) {\n\t\t\t\t\treturn this.sortDirection === 'asc'\n\t\t\t\t\t\t? aValue.getTime() - bValue.getTime()\n\t\t\t\t\t\t: bValue.getTime() - aValue.getTime()\n\t\t\t\t}\n\n\t\t\t\t// Convert to strings for string comparison or fallback comparison\n\t\t\t\tconst aStr = String(aValue)\n\t\t\t\tconst bStr = String(bValue)\n\t\t\t\treturn this.sortDirection === 'asc' ? aStr.localeCompare(bStr) : bStr.localeCompare(aStr)\n\t\t\t})\n\t\t}\n\n\t\tthis.filteredData = result\n\t}\n\n\t// Toggle sort for a column\n\tprivate toggleSort(column: TableColumn<T>): void {\n\t\tif (!column.key || column.sortable === false) return\n\n\t\tconst columnKey = column.key\n\n\t\t// If clicking the same column, cycle through sort states: asc -> desc -> null\n\t\tif (columnKey === this.sortColumn) {\n\t\t\tif (this.sortDirection === 'asc') {\n\t\t\t\tthis.sortDirection = 'desc'\n\t\t\t} else if (this.sortDirection === 'desc') {\n\t\t\t\tthis.sortDirection = null\n\t\t\t} else {\n\t\t\t\tthis.sortDirection = 'asc'\n\t\t\t}\n\t\t} else {\n\t\t\t// New column, start with ascending\n\t\t\tthis.sortColumn = columnKey\n\t\t\tthis.sortDirection = 'asc'\n\t\t}\n\n\t\t// Dispatch sort event\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent('sort-change', {\n\t\t\t\tdetail: {\n\t\t\t\t\tcolumn: this.sortColumn,\n\t\t\t\t\tdirection: this.sortDirection,\n\t\t\t\t},\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t}),\n\t\t)\n\t}\n\n\t// Render sort indicator\n\tprivate renderSortIndicator(column: TableColumn<T>): TemplateResult | null {\n\t\tif (!this.sortable || column.sortable === false || !column.key || column.key !== this.sortColumn) {\n\t\t\treturn null\n\t\t}\n\n\t\treturn html`\n\t\t\t<span class=\"ml-1\">\n\t\t\t\t${this.sortDirection === 'asc'\n\t\t\t\t\t? html`<schmancy-icon class=\"text-base\">arrow_upward</schmancy-icon>`\n\t\t\t\t\t: this.sortDirection === 'desc'\n\t\t\t\t\t\t? html`<schmancy-icon class=\"text-base\">arrow_downward</schmancy-icon>`\n\t\t\t\t\t\t: null}\n\t\t\t</span>\n\t\t`\n\t}\n\n\trender(): TemplateResult {\n\t\tconst columnHeadClasses = column => ({\n\t\t\t'flex items-center': true,\n\t\t\t'cursor-pointer gap-1': this.sortable && column.sortable !== false && column.key,\n\t\t})\n\t\treturn html`\n\t\t\t<div\n\t\t\t\tclass=\"grid h-full w-full\"\n\t\t\t\tstyle=\"grid-template-columns: 1fr; grid-template-rows: auto 1fr;\"\n\t\t\t>\n\t\t\t\t<schmancy-surface rounded=\"top\" elevation=\"1\" type=\"glass\" class=\"sticky top-0 z-10\">\n\t\t\t\t\t<div\n\t\t\t\t\t\tclass=\"grid items-center gap-4 px-4 py-3\"\n\t\t\t\t\t\tstyle=${this.styleMap({\n\t\t\t\t\t\t\tgridTemplateColumns: this.cols,\n\t\t\t\t\t\t\tgridTemplateRows: '1fr',\n\t\t\t\t\t\t})}\n\t\t\t\t\t>\n\t\t\t\t\t\t${this.columns.map(\n\t\t\t\t\t\t\tcolumn => html`\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclass=${this.classMap(columnHeadClasses(column))}\n\t\t\t\t\t\t\t\t\t@click=${() => (this.sortable && column.sortable !== false ? this.toggleSort(column) : null)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<schmancy-typography align=${column.align ?? 'left'} weight=${column.weight ?? 'bold'}>\n\t\t\t\t\t\t\t\t\t\t${column.name}\n\t\t\t\t\t\t\t\t\t</schmancy-typography>\n\t\t\t\t\t\t\t\t\t${this.renderSortIndicator(column)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t`,\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t</schmancy-surface>\n\n\t\t\t\t${this.filteredData.length > 0\n\t\t\t\t\t? html`\n\t\t\t\t\t\t\t<lit-virtualizer\n\t\t\t\t\t\t\t\tscroller\n\t\t\t\t\t\t\t\tclass=\"w-full h-full relative overflow-auto\"\n\t\t\t\t\t\t\t\t.items=${this.filteredData}\n\t\t\t\t\t\t\t\t.keyFunction=${(item: T, index: number) => {\n\t\t\t\t\t\t\t\t\tconst keyValue = item?.[this.keyField]\n\t\t\t\t\t\t\t\t\tif (keyValue === undefined || keyValue === null) {\n\t\t\t\t\t\t\t\t\t\treturn index\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn typeof keyValue === 'string' || typeof keyValue === 'number' ? keyValue : String(keyValue)\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t.renderItem=${(item: T, index: number) =>\n\t\t\t\t\t\t\t\t\thtml`\n\t\t\t\t\t\t\t\t\t\t<schmancy-table-row\n\t\t\t\t\t\t\t\t\t\t\tclass=\"w-full border-b border-solid border-outlineVariant\"\n\t\t\t\t\t\t\t\t\t\t\t.columns=${this.columns}\n\t\t\t\t\t\t\t\t\t\t\t.item=${item}\n\t\t\t\t\t\t\t\t\t\t\tcols=${this.cols}\n\t\t\t\t\t\t\t\t\t\t\t@click=${() => {\n\t\t\t\t\t\t\t\t\t\t\t\tconst detail = { item, index }\n\t\t\t\t\t\t\t\t\t\t\t\tthis.dispatchEvent(\n\t\t\t\t\t\t\t\t\t\t\t\t\tnew CustomEvent('click', {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdetail,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbubbles: true,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tcomposed: true,\n\t\t\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t></schmancy-table-row>\n\t\t\t\t\t\t\t\t\t` as TemplateResult}\n\t\t\t\t\t\t\t></lit-virtualizer>\n\t\t\t\t\t\t`\n\t\t\t\t\t: html`\n\t\t\t\t\t\t\t<div class=\"flex items-center justify-center w-full h-full p-8 text-center\">\n\t\t\t\t\t\t\t\t<schmancy-typography type=\"body\" token=\"lg\"> No data available </schmancy-typography>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t`}\n\t\t\t</div>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-table': SchmancyDataTable\n\t}\n}\n"],"mappings":"2QAMO,IAAA,EAAA,cAAoE,EAAA,CAAA,CAAA,YAAA,GAAA,EAAA,CAAA,MAAA,GAAA,CAAA,EAAA,KAAA,QAE9C,CAAA,EAAA,KAAA,KAMb,KAAK,QAAQ,QAAU,KAAA,EAAO,KAAK,GAAA,CAAA,CAMlD,WAAmB,EAAA,CAElB,GAAI,EAAO,OACV,MAAO,GAAA,IAAI;;mCAEqB,EAAO,OAAS,OAAA,yBAAgC,EAAO,QAAU,SAAA;QAC5F,EAAO,OAAO,KAAK,IAAA,EAAA;;;KAOzB,IAAM,EAAQ,EAAO,IAAM,KAAK,KAAK,EAAO,KAAO,GAEnD,MAAO,GAAA,IAAI;;kCAEqB,EAAO,OAAS,OAAA,yBAAgC,EAAO,QAAU,SAAA;OAC5F,EAAA;;;GAIN,CAEA,QAAA,CACC,MAAO,GAAA,IAAI;;;;aAIA,KAAK,SAAS,CAAE,oBAAqB,KAAK,IAAA,CAAA,EAAA;;OAEhD,KAAK,QAAQ,IAAI,GAAU,KAAK,WAAW,CAAA,CAAA,EAAA;;;GAIjD,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAhDU,CAAE,KAAM,MAAO,UAAA,CAAW,CAAA,CAAA,CAAA,EAAO,EAAA,UAAA,UAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAGjC,CAAE,KAAM,OAAQ,UAAA,CAAW,CAAA,CAAA,CAAA,EAAO,EAAA,UAAA,OAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAGlC,CAAE,KAAM,MAAA,CAAA,CAAA,EAAQ,EAAA,UAAA,OAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,eARZ,oBAAA,CAAA,EAAoB,CAAA,EC4B5B,IAAA,EAAA,cAAqE,EAAA,CAAA,CAuB3E,aAAA,CACC,MAAA,EAAA,KAAA,QAtB2B,CAAA,EAAA,KAAA,KAGhB,CAAA,EAAA,KAAA,SAIQ,KAAA,KAAA,KAGL,MAAA,KAAA,SAAA,CAIK,EAAA,KAAA,WAG0B,KAAA,KAAA,cACE,KAAA,KAAA,aACX,CAAA,EAIpC,KAAK,aAAe,KAAK,IAC1B,CAGA,WAAqB,EAAA,EAEnB,EAAkB,IAAI,MAAA,GACtB,EAAkB,IAAI,YAAA,GACtB,EAAkB,IAAI,eAAA,IAEtB,KAAK,YAAA,CAEP,CAKA,OAAe,EAAA,CACd,OAAO,GAA0B,OAAV,GAAU,UAAY,OAAO,UAAU,SAAS,KAAK,CAAA,IAAW,eACxF,CAEA,aAAA,CACC,IAAI,EAAS,CAAA,GAAI,KAAK,IAAA,EAGtB,GAAI,KAAK,UAAY,KAAK,YAAc,KAAK,cAAe,CAE3D,IAAM,EAAmB,KAAK,QAAQ,KAAK,GAAO,EAAI,MAAQ,KAAK,UAAA,EAEnE,EAAO,MAAM,EAAG,IAAA,CAEf,IAAI,EAAQ,EAaZ,GAXI,GAAoB,EAAiB,OAExC,EAAS,EAAiB,MAAM,CAAA,EAChC,EAAS,EAAiB,MAAM,CAAA,IAGhC,EAAS,EAAE,KAAK,YAChB,EAAS,EAAE,KAAK,aAIb,GAAA,KACH,OAAO,KAAK,gBAAkB,MAAQ,EAAA,GAEvC,GAAI,GAAA,KACH,OAAO,KAAK,gBAAkB,MAAlB,GAA+B,EAI5C,GAAsB,OAAX,GAAW,UAA8B,OAAX,GAAW,SACnD,OAAO,KAAK,gBAAkB,MAAQ,EAAS,EAAS,EAAS,EAIlE,IAAM,EAA6B,OAAX,GAAW,UAAX,CAAwB,MAAM,OAAO,CAAA,CAAA,EACvD,EAA6B,OAAX,GAAW,UAAX,CAAwB,MAAM,OAAO,CAAA,CAAA,EAE7D,GAAI,GAAY,EAAU,CACzB,IAAM,EAAO,WAAW,CAAA,EAClB,EAAO,WAAW,CAAA,EACxB,OAAO,KAAK,gBAAkB,MAAQ,EAAO,EAAO,EAAO,CAC5D,CAGA,GAAI,KAAK,OAAO,CAAA,GAAW,KAAK,OAAO,CAAA,EACtC,OAAO,KAAK,gBAAkB,MAC3B,EAAO,QAAA,EAAY,EAAO,QAAA,EAC1B,EAAO,QAAA,EAAY,EAAO,QAAA,EAI9B,IAAM,EAAO,OAAO,CAAA,EACd,EAAO,OAAO,CAAA,EACpB,OAAO,KAAK,gBAAkB,MAAQ,EAAK,cAAc,CAAA,EAAQ,EAAK,cAAc,CAAA,CAAA,CAAA,CAEtF,CAEA,KAAK,aAAe,CACrB,CAGA,WAAmB,EAAA,CAClB,GAAA,CAAK,EAAO,KAAA,CAA2B,IAApB,EAAO,SAAoB,OAE9C,IAAM,EAAY,EAAO,IAGrB,IAAc,KAAK,WAClB,KAAK,gBAAkB,MAC1B,KAAK,cAAgB,OACX,KAAK,gBAAkB,OACjC,KAAK,cAAgB,KAErB,KAAK,cAAgB,OAItB,KAAK,WAAa,EAClB,KAAK,cAAgB,OAItB,KAAK,cACJ,IAAI,YAAY,cAAe,CAC9B,OAAQ,CACP,OAAQ,KAAK,WACb,UAAW,KAAK,aAAA,EAEjB,QAAA,CAAS,EACT,SAAA,CAAU,CAAA,CAAA,CAAA,CAGb,CAGA,oBAA4B,EAAA,CAC3B,OAAK,KAAK,UAAA,CAAgC,IAApB,EAAO,UAAuB,EAAO,KAAO,EAAO,MAAQ,KAAK,WAI/E,EAAA,IAAI;;MAEP,KAAK,gBAAkB,MACtB,EAAA,IAAI,gEACJ,KAAK,gBAAkB,OACtB,EAAA,IAAI,kEACJ,KAAA;;IATE,IAYT,CAEA,QAAA,CACC,IAAM,EAAoB,IAAA,CACzB,oBAAA,CAAqB,EACrB,uBAAwB,KAAK,UAAA,CAAgC,IAApB,EAAO,UAAsB,EAAO,GAAA,GAE9E,MAAO,GAAA,IAAI;;;;;;;;cAQC,KAAK,SAAS,CACrB,oBAAqB,KAAK,KAC1B,iBAAkB,KAAA,CAAA,EAAA;;QAGjB,KAAK,QAAQ,IACd,GAAU,EAAA,IAAI;;iBAEJ,KAAK,SAAS,EAAkB,CAAA,CAAA,EAAA;sBACxB,KAAK,UAAA,CAAgC,IAApB,EAAO,SAAqB,KAAK,WAAW,CAAA,EAAU,KAAA;;sCAE1D,EAAO,OAAS,OAAA,UAAiB,EAAO,QAAU,OAAA;YAC5E,EAAO,KAAA;;WAER,KAAK,oBAAoB,CAAA,EAAA;;;;;;MAO9B,KAAK,aAAa,OAAS,EAC1B,EAAA,IAAI;;;;iBAIM,KAAK,aAAA;wBACE,EAAS,IAAA,CACxB,IAAM,EAAW,IAAO,KAAK,UAC7B,OAAI,GAAA,KACI,EAEmB,OAAb,GAAa,UAAgC,OAAb,GAAa,SAAW,EAAW,OAAO,CAAA,CAAA,EAAA;uBAE1E,EAAS,IACvB,EAAA,IAAI;;;sBAGS,KAAK,QAAA;mBACR,EAAA;kBACD,KAAK,KAAA;yBAEX,IAAM,EAAS,CAAE,KAAA,EAAM,MAAA,CAAA,EACvB,KAAK,cACJ,IAAI,YAAY,QAAS,CACxB,OAAA,EACA,QAAA,CAAS,EACT,SAAA,CAAU,CAAA,CAAA,CAAA,CAAA,EAAA;;;;QAQjB,EAAA,IAAI;;;;;;GAOV,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAzOU,CAAE,KAAM,MAAO,UAAA,CAAW,CAAA,CAAA,CAAA,EAAO,EAAA,UAAA,UAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAGjC,CAAE,KAAM,MAAO,UAAA,CAAW,CAAA,CAAA,CAAA,EAAO,EAAA,UAAA,OAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAIjC,CAAE,KAAM,MAAA,CAAA,CAAA,EAAQ,EAAA,UAAA,WAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAGhB,CAAE,KAAM,MAAA,CAAA,CAAA,EAAQ,EAAA,UAAA,OAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,UAIhB,CAAE,KAAM,OAAA,CAAA,CAAA,EAAS,EAAA,UAAA,WAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,CAAA,EAIpB,EAAA,UAAA,aAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,CAAA,EACA,EAAA,UAAA,gBAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,CAAA,EACA,EAAA,UAAA,eAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,eAtBO,gBAAA,CAAA,EAAgB,CAAA,EAAA,OAAA,eAAA,QAAA,oBAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,CAAA,CAAA,CAAA,EAAA,OAAA,eAAA,QAAA,mBAAA,CAAA,WAAA,CAAA,EAAA,IAAA,UAAA,CAAA,OAAA,CAAA,CAAA,CAAA"}
|
package/dist/table.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
1
|
+
import { t as e, u as t } from "./SchmancyElement-DuzT2AMa.js";
|
|
2
|
+
import "./mixins-Cevarn7V.js";
|
|
3
3
|
import { customElement as n, property as r, state as i } from "lit/decorators.js";
|
|
4
4
|
import { html as a } from "lit";
|
|
5
5
|
import "@lit-labs/virtualizer";
|
package/dist/table.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table.js","names":[],"sources":["../src/table/row.ts","../src/table/table.ts"],"sourcesContent":["import { SchmancyElement } from '@mixins/index'\nimport { html, TemplateResult } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport { TableColumn } from './table' // Import TableColumn interface with updated types\n\n@customElement('schmancy-table-row')\nexport class SchmancyTableRow<T extends Record<string, any> = any> extends SchmancyElement {\n\t@property({ type: Array, attribute: false })\n\tcolumns: TableColumn<T>[] = []\n\n\t@property({ type: Object, attribute: false })\n\titem!: T\n\n\t@property({ type: String })\n\tcols: string = this.columns.map(() => '1fr').join(' ')\n\n\t/**\n\t * Renders a cell based on column configuration.\n\t * Uses custom render function if provided, otherwise extracts data from item.\n\t */\n\tprivate renderCell(column: TableColumn<T>): TemplateResult {\n\t\t// Use the render function if provided\n\t\tif (column.render) {\n\t\t\treturn html`\n\t\t\t\t<div class=\"overflow-hidden text-ellipsis\">\n\t\t\t\t\t<schmancy-typography align=\"${column.align || 'left'}\" maxLines=\"2\" weight=\"${column.weight || 'normal'}\">\n\t\t\t\t\t\t${column.render(this.item)}\n\t\t\t\t\t</schmancy-typography>\n\t\t\t\t</div>\n\t\t\t`\n\t\t}\n\n\t\t// Otherwise extract data using the key if available\n\t\tconst value = column.key ? this.item[column.key] : ''\n\n\t\treturn html`\n\t\t\t<div class=\"overflow-hidden text-ellipsis\">\n\t\t\t\t<schmancy-typography align=\"${column.align || 'left'}\" maxLines=\"2\" weight=\"${column.weight || 'normal'}\">\n\t\t\t\t\t${value}\n\t\t\t\t</schmancy-typography>\n\t\t\t</div>\n\t\t`\n\t}\n\n\trender(): TemplateResult {\n\t\treturn html`\n\t\t\t<schmancy-list-item class=\"w-full\">\n\t\t\t\t<div\n\t\t\t\t\tclass=\"grid items-center gap-4\"\n\t\t\t\t\tstyle=${this.styleMap({ gridTemplateColumns: this.cols })}\n\t\t\t\t>\n\t\t\t\t\t${this.columns.map(column => this.renderCell(column))}\n\t\t\t\t</div>\n\t\t\t</schmancy-list-item>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-table-row': SchmancyTableRow\n\t}\n}\n","import '@lit-labs/virtualizer'\nimport { SchmancyElement } from '@mixins/index'\nimport { html, TemplateResult } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport './row' // Import the schmancy-table-row component\n\n// Define a generic TableColumn interface.\n// The `key` is now a key of T, and the render function accepts T.\nexport interface TableColumn<T extends Record<string, any> = any> {\n\tname: string\n\tkey?: keyof T // Key to access the property on the data object.\n\talign?: 'left' | 'right' | 'center'\n\tweight?: 'normal' | 'bold'\n\trender?: (item: T) => TemplateResult | string | number // Custom render function for complex content\n\tsortable?: boolean // Whether this column is sortable\n\tvalue?: (item: T) => any // Custom value function for sorting\n}\n\n// Define an event detail interface for row events.\nexport interface RowEventDetail<T> {\n\titem: T\n\tindex: number\n}\n\n// Define sort direction type\nexport type SortDirection = 'asc' | 'desc' | null\n\n/**\n * SchmancyDataTable is a generic data table component.\n * It supports sorting, filtering, and custom rendering of rows.\n *\n */\n@customElement('schmancy-table')\nexport class SchmancyDataTable<T extends Record<string, any> = any> extends SchmancyElement {\n\t@property({ type: Array, attribute: false })\n\tcolumns: TableColumn<T>[] = []\n\n\t@property({ type: Array, attribute: false })\n\tdata: T[] = []\n\n\t// The keyField is now of type keyof T.\n\t@property({ type: String })\n\tkeyField: keyof T = 'id' as keyof T\n\n\t@property({ type: String })\n\tcols: string = '1fr'\n\n\t// Sorting property\n\t@property({ type: Boolean })\n\tsortable: boolean = false\n\n\t// Internal state properties\n\t@state() private sortColumn: keyof T | null = null\n\t@state() private sortDirection: SortDirection = null\n\t@state() private filteredData: T[] = []\n\n\tconstructor() {\n\t\tsuper()\n\t\tthis.filteredData = this.data\n\t}\n\n\t// Process the data whenever our dependencies change\n\tprotected willUpdate(changedProperties: Map<PropertyKey, unknown>): void {\n\t\tif (\n\t\t\tchangedProperties.has('data') ||\n\t\t\tchangedProperties.has('sortColumn') ||\n\t\t\tchangedProperties.has('sortDirection')\n\t\t) {\n\t\t\tthis.processData()\n\t\t}\n\t}\n\n\t/**\n\t * Helper function to check if a value is a Date object in a type-safe way\n\t */\n\tprivate isDate(value: any): value is Date {\n\t\treturn value && typeof value === 'object' && Object.prototype.toString.call(value) === '[object Date]'\n\t}\n\n\tprivate processData(): void {\n\t\tlet result = [...this.data]\n\n\t\t// Apply sorting\n\t\tif (this.sortable && this.sortColumn && this.sortDirection) {\n\t\t\t// Find the column configuration for the sorting column\n\t\t\tconst sortColumnConfig = this.columns.find(col => col.key === this.sortColumn)\n\n\t\t\tresult.sort((a, b) => {\n\t\t\t\t// Use the value function if provided in the column configuration\n\t\t\t\tlet aValue, bValue\n\n\t\t\t\tif (sortColumnConfig && sortColumnConfig.value) {\n\t\t\t\t\t// Use custom value function for sorting\n\t\t\t\t\taValue = sortColumnConfig.value(a)\n\t\t\t\t\tbValue = sortColumnConfig.value(b)\n\t\t\t\t} else {\n\t\t\t\t\t// Use standard property access\n\t\t\t\t\taValue = a[this.sortColumn as keyof T]\n\t\t\t\t\tbValue = b[this.sortColumn as keyof T]\n\t\t\t\t}\n\n\t\t\t\t// Handle null/undefined values - always sort them to the end regardless of sort direction\n\t\t\t\tif (aValue === null || aValue === undefined) {\n\t\t\t\t\treturn this.sortDirection === 'asc' ? 1 : -1\n\t\t\t\t}\n\t\t\t\tif (bValue === null || bValue === undefined) {\n\t\t\t\t\treturn this.sortDirection === 'asc' ? -1 : 1\n\t\t\t\t}\n\n\t\t\t\t// Handle numbers\n\t\t\t\tif (typeof aValue === 'number' && typeof bValue === 'number') {\n\t\t\t\t\treturn this.sortDirection === 'asc' ? aValue - bValue : bValue - aValue\n\t\t\t\t}\n\n\t\t\t\t// Detect and handle numeric strings - convert to numbers if both values are numeric\n\t\t\t\tconst aNumeric = typeof aValue === 'string' && !isNaN(Number(aValue))\n\t\t\t\tconst bNumeric = typeof bValue === 'string' && !isNaN(Number(bValue))\n\n\t\t\t\tif (aNumeric && bNumeric) {\n\t\t\t\t\tconst aNum = parseFloat(aValue as string)\n\t\t\t\t\tconst bNum = parseFloat(bValue as string)\n\t\t\t\t\treturn this.sortDirection === 'asc' ? aNum - bNum : bNum - aNum\n\t\t\t\t}\n\n\t\t\t\t// Handle dates - with proper type checking\n\t\t\t\tif (this.isDate(aValue) && this.isDate(bValue)) {\n\t\t\t\t\treturn this.sortDirection === 'asc'\n\t\t\t\t\t\t? aValue.getTime() - bValue.getTime()\n\t\t\t\t\t\t: bValue.getTime() - aValue.getTime()\n\t\t\t\t}\n\n\t\t\t\t// Convert to strings for string comparison or fallback comparison\n\t\t\t\tconst aStr = String(aValue)\n\t\t\t\tconst bStr = String(bValue)\n\t\t\t\treturn this.sortDirection === 'asc' ? aStr.localeCompare(bStr) : bStr.localeCompare(aStr)\n\t\t\t})\n\t\t}\n\n\t\tthis.filteredData = result\n\t}\n\n\t// Toggle sort for a column\n\tprivate toggleSort(column: TableColumn<T>): void {\n\t\tif (!column.key || column.sortable === false) return\n\n\t\tconst columnKey = column.key\n\n\t\t// If clicking the same column, cycle through sort states: asc -> desc -> null\n\t\tif (columnKey === this.sortColumn) {\n\t\t\tif (this.sortDirection === 'asc') {\n\t\t\t\tthis.sortDirection = 'desc'\n\t\t\t} else if (this.sortDirection === 'desc') {\n\t\t\t\tthis.sortDirection = null\n\t\t\t} else {\n\t\t\t\tthis.sortDirection = 'asc'\n\t\t\t}\n\t\t} else {\n\t\t\t// New column, start with ascending\n\t\t\tthis.sortColumn = columnKey\n\t\t\tthis.sortDirection = 'asc'\n\t\t}\n\n\t\t// Dispatch sort event\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent('sort-change', {\n\t\t\t\tdetail: {\n\t\t\t\t\tcolumn: this.sortColumn,\n\t\t\t\t\tdirection: this.sortDirection,\n\t\t\t\t},\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t}),\n\t\t)\n\t}\n\n\t// Render sort indicator\n\tprivate renderSortIndicator(column: TableColumn<T>): TemplateResult | null {\n\t\tif (!this.sortable || column.sortable === false || !column.key || column.key !== this.sortColumn) {\n\t\t\treturn null\n\t\t}\n\n\t\treturn html`\n\t\t\t<span class=\"ml-1\">\n\t\t\t\t${this.sortDirection === 'asc'\n\t\t\t\t\t? html`<schmancy-icon class=\"text-base\">arrow_upward</schmancy-icon>`\n\t\t\t\t\t: this.sortDirection === 'desc'\n\t\t\t\t\t\t? html`<schmancy-icon class=\"text-base\">arrow_downward</schmancy-icon>`\n\t\t\t\t\t\t: null}\n\t\t\t</span>\n\t\t`\n\t}\n\n\trender(): TemplateResult {\n\t\tconst columnHeadClasses = column => ({\n\t\t\t'flex items-center': true,\n\t\t\t'cursor-pointer gap-1': this.sortable && column.sortable !== false && column.key,\n\t\t})\n\t\treturn html`\n\t\t\t<div\n\t\t\t\tclass=\"grid h-full w-full\"\n\t\t\t\tstyle=\"grid-template-columns: 1fr; grid-template-rows: auto 1fr;\"\n\t\t\t>\n\t\t\t\t<schmancy-surface rounded=\"top\" elevation=\"1\" type=\"glass\" class=\"sticky top-0 z-10\">\n\t\t\t\t\t<div\n\t\t\t\t\t\tclass=\"grid items-center gap-4 px-4 py-3\"\n\t\t\t\t\t\tstyle=${this.styleMap({\n\t\t\t\t\t\t\tgridTemplateColumns: this.cols,\n\t\t\t\t\t\t\tgridTemplateRows: '1fr',\n\t\t\t\t\t\t})}\n\t\t\t\t\t>\n\t\t\t\t\t\t${this.columns.map(\n\t\t\t\t\t\t\tcolumn => html`\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclass=${this.classMap(columnHeadClasses(column))}\n\t\t\t\t\t\t\t\t\t@click=${() => (this.sortable && column.sortable !== false ? this.toggleSort(column) : null)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<schmancy-typography align=${column.align ?? 'left'} weight=${column.weight ?? 'bold'}>\n\t\t\t\t\t\t\t\t\t\t${column.name}\n\t\t\t\t\t\t\t\t\t</schmancy-typography>\n\t\t\t\t\t\t\t\t\t${this.renderSortIndicator(column)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t`,\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t</schmancy-surface>\n\n\t\t\t\t${this.filteredData.length > 0\n\t\t\t\t\t? html`\n\t\t\t\t\t\t\t<lit-virtualizer\n\t\t\t\t\t\t\t\tscroller\n\t\t\t\t\t\t\t\tclass=\"w-full h-full relative overflow-auto\"\n\t\t\t\t\t\t\t\t.items=${this.filteredData}\n\t\t\t\t\t\t\t\t.keyFunction=${(item: T, index: number) => {\n\t\t\t\t\t\t\t\t\tconst keyValue = item?.[this.keyField]\n\t\t\t\t\t\t\t\t\tif (keyValue === undefined || keyValue === null) {\n\t\t\t\t\t\t\t\t\t\treturn index\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn typeof keyValue === 'string' || typeof keyValue === 'number' ? keyValue : String(keyValue)\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t.renderItem=${(item: T, index: number) =>\n\t\t\t\t\t\t\t\t\thtml`\n\t\t\t\t\t\t\t\t\t\t<schmancy-table-row\n\t\t\t\t\t\t\t\t\t\t\tclass=\"w-full border-b border-solid border-outlineVariant\"\n\t\t\t\t\t\t\t\t\t\t\t.columns=${this.columns}\n\t\t\t\t\t\t\t\t\t\t\t.item=${item}\n\t\t\t\t\t\t\t\t\t\t\tcols=${this.cols}\n\t\t\t\t\t\t\t\t\t\t\t@click=${() => {\n\t\t\t\t\t\t\t\t\t\t\t\tconst detail = { item, index }\n\t\t\t\t\t\t\t\t\t\t\t\tthis.dispatchEvent(\n\t\t\t\t\t\t\t\t\t\t\t\t\tnew CustomEvent('click', {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdetail,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbubbles: true,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tcomposed: true,\n\t\t\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t></schmancy-table-row>\n\t\t\t\t\t\t\t\t\t` as TemplateResult}\n\t\t\t\t\t\t\t></lit-virtualizer>\n\t\t\t\t\t\t`\n\t\t\t\t\t: html`\n\t\t\t\t\t\t\t<div class=\"flex items-center justify-center w-full h-full p-8 text-center\">\n\t\t\t\t\t\t\t\t<schmancy-typography type=\"body\" token=\"lg\"> No data available </schmancy-typography>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t`}\n\t\t\t</div>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-table': SchmancyDataTable\n\t}\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"table.js","names":[],"sources":["../src/table/row.ts","../src/table/table.ts"],"sourcesContent":["import { SchmancyElement } from '@mixins/index'\nimport { html, TemplateResult } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport { TableColumn } from './table' // Import TableColumn interface with updated types\n\n@customElement('schmancy-table-row')\nexport class SchmancyTableRow<T extends Record<string, any> = any> extends SchmancyElement {\n\t@property({ type: Array, attribute: false })\n\tcolumns: TableColumn<T>[] = []\n\n\t@property({ type: Object, attribute: false })\n\titem!: T\n\n\t@property({ type: String })\n\tcols: string = this.columns.map(() => '1fr').join(' ')\n\n\t/**\n\t * Renders a cell based on column configuration.\n\t * Uses custom render function if provided, otherwise extracts data from item.\n\t */\n\tprivate renderCell(column: TableColumn<T>): TemplateResult {\n\t\t// Use the render function if provided\n\t\tif (column.render) {\n\t\t\treturn html`\n\t\t\t\t<div class=\"overflow-hidden text-ellipsis\">\n\t\t\t\t\t<schmancy-typography align=\"${column.align || 'left'}\" maxLines=\"2\" weight=\"${column.weight || 'normal'}\">\n\t\t\t\t\t\t${column.render(this.item)}\n\t\t\t\t\t</schmancy-typography>\n\t\t\t\t</div>\n\t\t\t`\n\t\t}\n\n\t\t// Otherwise extract data using the key if available\n\t\tconst value = column.key ? this.item[column.key] : ''\n\n\t\treturn html`\n\t\t\t<div class=\"overflow-hidden text-ellipsis\">\n\t\t\t\t<schmancy-typography align=\"${column.align || 'left'}\" maxLines=\"2\" weight=\"${column.weight || 'normal'}\">\n\t\t\t\t\t${value}\n\t\t\t\t</schmancy-typography>\n\t\t\t</div>\n\t\t`\n\t}\n\n\trender(): TemplateResult {\n\t\treturn html`\n\t\t\t<schmancy-list-item class=\"w-full\">\n\t\t\t\t<div\n\t\t\t\t\tclass=\"grid items-center gap-4\"\n\t\t\t\t\tstyle=${this.styleMap({ gridTemplateColumns: this.cols })}\n\t\t\t\t>\n\t\t\t\t\t${this.columns.map(column => this.renderCell(column))}\n\t\t\t\t</div>\n\t\t\t</schmancy-list-item>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-table-row': SchmancyTableRow\n\t}\n}\n","import '@lit-labs/virtualizer'\nimport { SchmancyElement } from '@mixins/index'\nimport { html, TemplateResult } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport './row' // Import the schmancy-table-row component\n\n// Define a generic TableColumn interface.\n// The `key` is now a key of T, and the render function accepts T.\nexport interface TableColumn<T extends Record<string, any> = any> {\n\tname: string\n\tkey?: keyof T // Key to access the property on the data object.\n\talign?: 'left' | 'right' | 'center'\n\tweight?: 'normal' | 'bold'\n\trender?: (item: T) => TemplateResult | string | number // Custom render function for complex content\n\tsortable?: boolean // Whether this column is sortable\n\tvalue?: (item: T) => any // Custom value function for sorting\n}\n\n// Define an event detail interface for row events.\nexport interface RowEventDetail<T> {\n\titem: T\n\tindex: number\n}\n\n// Define sort direction type\nexport type SortDirection = 'asc' | 'desc' | null\n\n/**\n * SchmancyDataTable is a generic data table component.\n * It supports sorting, filtering, and custom rendering of rows.\n *\n */\n@customElement('schmancy-table')\nexport class SchmancyDataTable<T extends Record<string, any> = any> extends SchmancyElement {\n\t@property({ type: Array, attribute: false })\n\tcolumns: TableColumn<T>[] = []\n\n\t@property({ type: Array, attribute: false })\n\tdata: T[] = []\n\n\t// The keyField is now of type keyof T.\n\t@property({ type: String })\n\tkeyField: keyof T = 'id' as keyof T\n\n\t@property({ type: String })\n\tcols: string = '1fr'\n\n\t// Sorting property\n\t@property({ type: Boolean })\n\tsortable: boolean = false\n\n\t// Internal state properties\n\t@state() private sortColumn: keyof T | null = null\n\t@state() private sortDirection: SortDirection = null\n\t@state() private filteredData: T[] = []\n\n\tconstructor() {\n\t\tsuper()\n\t\tthis.filteredData = this.data\n\t}\n\n\t// Process the data whenever our dependencies change\n\tprotected willUpdate(changedProperties: Map<PropertyKey, unknown>): void {\n\t\tif (\n\t\t\tchangedProperties.has('data') ||\n\t\t\tchangedProperties.has('sortColumn') ||\n\t\t\tchangedProperties.has('sortDirection')\n\t\t) {\n\t\t\tthis.processData()\n\t\t}\n\t}\n\n\t/**\n\t * Helper function to check if a value is a Date object in a type-safe way\n\t */\n\tprivate isDate(value: any): value is Date {\n\t\treturn value && typeof value === 'object' && Object.prototype.toString.call(value) === '[object Date]'\n\t}\n\n\tprivate processData(): void {\n\t\tlet result = [...this.data]\n\n\t\t// Apply sorting\n\t\tif (this.sortable && this.sortColumn && this.sortDirection) {\n\t\t\t// Find the column configuration for the sorting column\n\t\t\tconst sortColumnConfig = this.columns.find(col => col.key === this.sortColumn)\n\n\t\t\tresult.sort((a, b) => {\n\t\t\t\t// Use the value function if provided in the column configuration\n\t\t\t\tlet aValue, bValue\n\n\t\t\t\tif (sortColumnConfig && sortColumnConfig.value) {\n\t\t\t\t\t// Use custom value function for sorting\n\t\t\t\t\taValue = sortColumnConfig.value(a)\n\t\t\t\t\tbValue = sortColumnConfig.value(b)\n\t\t\t\t} else {\n\t\t\t\t\t// Use standard property access\n\t\t\t\t\taValue = a[this.sortColumn as keyof T]\n\t\t\t\t\tbValue = b[this.sortColumn as keyof T]\n\t\t\t\t}\n\n\t\t\t\t// Handle null/undefined values - always sort them to the end regardless of sort direction\n\t\t\t\tif (aValue === null || aValue === undefined) {\n\t\t\t\t\treturn this.sortDirection === 'asc' ? 1 : -1\n\t\t\t\t}\n\t\t\t\tif (bValue === null || bValue === undefined) {\n\t\t\t\t\treturn this.sortDirection === 'asc' ? -1 : 1\n\t\t\t\t}\n\n\t\t\t\t// Handle numbers\n\t\t\t\tif (typeof aValue === 'number' && typeof bValue === 'number') {\n\t\t\t\t\treturn this.sortDirection === 'asc' ? aValue - bValue : bValue - aValue\n\t\t\t\t}\n\n\t\t\t\t// Detect and handle numeric strings - convert to numbers if both values are numeric\n\t\t\t\tconst aNumeric = typeof aValue === 'string' && !isNaN(Number(aValue))\n\t\t\t\tconst bNumeric = typeof bValue === 'string' && !isNaN(Number(bValue))\n\n\t\t\t\tif (aNumeric && bNumeric) {\n\t\t\t\t\tconst aNum = parseFloat(aValue as string)\n\t\t\t\t\tconst bNum = parseFloat(bValue as string)\n\t\t\t\t\treturn this.sortDirection === 'asc' ? aNum - bNum : bNum - aNum\n\t\t\t\t}\n\n\t\t\t\t// Handle dates - with proper type checking\n\t\t\t\tif (this.isDate(aValue) && this.isDate(bValue)) {\n\t\t\t\t\treturn this.sortDirection === 'asc'\n\t\t\t\t\t\t? aValue.getTime() - bValue.getTime()\n\t\t\t\t\t\t: bValue.getTime() - aValue.getTime()\n\t\t\t\t}\n\n\t\t\t\t// Convert to strings for string comparison or fallback comparison\n\t\t\t\tconst aStr = String(aValue)\n\t\t\t\tconst bStr = String(bValue)\n\t\t\t\treturn this.sortDirection === 'asc' ? aStr.localeCompare(bStr) : bStr.localeCompare(aStr)\n\t\t\t})\n\t\t}\n\n\t\tthis.filteredData = result\n\t}\n\n\t// Toggle sort for a column\n\tprivate toggleSort(column: TableColumn<T>): void {\n\t\tif (!column.key || column.sortable === false) return\n\n\t\tconst columnKey = column.key\n\n\t\t// If clicking the same column, cycle through sort states: asc -> desc -> null\n\t\tif (columnKey === this.sortColumn) {\n\t\t\tif (this.sortDirection === 'asc') {\n\t\t\t\tthis.sortDirection = 'desc'\n\t\t\t} else if (this.sortDirection === 'desc') {\n\t\t\t\tthis.sortDirection = null\n\t\t\t} else {\n\t\t\t\tthis.sortDirection = 'asc'\n\t\t\t}\n\t\t} else {\n\t\t\t// New column, start with ascending\n\t\t\tthis.sortColumn = columnKey\n\t\t\tthis.sortDirection = 'asc'\n\t\t}\n\n\t\t// Dispatch sort event\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent('sort-change', {\n\t\t\t\tdetail: {\n\t\t\t\t\tcolumn: this.sortColumn,\n\t\t\t\t\tdirection: this.sortDirection,\n\t\t\t\t},\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t}),\n\t\t)\n\t}\n\n\t// Render sort indicator\n\tprivate renderSortIndicator(column: TableColumn<T>): TemplateResult | null {\n\t\tif (!this.sortable || column.sortable === false || !column.key || column.key !== this.sortColumn) {\n\t\t\treturn null\n\t\t}\n\n\t\treturn html`\n\t\t\t<span class=\"ml-1\">\n\t\t\t\t${this.sortDirection === 'asc'\n\t\t\t\t\t? html`<schmancy-icon class=\"text-base\">arrow_upward</schmancy-icon>`\n\t\t\t\t\t: this.sortDirection === 'desc'\n\t\t\t\t\t\t? html`<schmancy-icon class=\"text-base\">arrow_downward</schmancy-icon>`\n\t\t\t\t\t\t: null}\n\t\t\t</span>\n\t\t`\n\t}\n\n\trender(): TemplateResult {\n\t\tconst columnHeadClasses = column => ({\n\t\t\t'flex items-center': true,\n\t\t\t'cursor-pointer gap-1': this.sortable && column.sortable !== false && column.key,\n\t\t})\n\t\treturn html`\n\t\t\t<div\n\t\t\t\tclass=\"grid h-full w-full\"\n\t\t\t\tstyle=\"grid-template-columns: 1fr; grid-template-rows: auto 1fr;\"\n\t\t\t>\n\t\t\t\t<schmancy-surface rounded=\"top\" elevation=\"1\" type=\"glass\" class=\"sticky top-0 z-10\">\n\t\t\t\t\t<div\n\t\t\t\t\t\tclass=\"grid items-center gap-4 px-4 py-3\"\n\t\t\t\t\t\tstyle=${this.styleMap({\n\t\t\t\t\t\t\tgridTemplateColumns: this.cols,\n\t\t\t\t\t\t\tgridTemplateRows: '1fr',\n\t\t\t\t\t\t})}\n\t\t\t\t\t>\n\t\t\t\t\t\t${this.columns.map(\n\t\t\t\t\t\t\tcolumn => html`\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclass=${this.classMap(columnHeadClasses(column))}\n\t\t\t\t\t\t\t\t\t@click=${() => (this.sortable && column.sortable !== false ? this.toggleSort(column) : null)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<schmancy-typography align=${column.align ?? 'left'} weight=${column.weight ?? 'bold'}>\n\t\t\t\t\t\t\t\t\t\t${column.name}\n\t\t\t\t\t\t\t\t\t</schmancy-typography>\n\t\t\t\t\t\t\t\t\t${this.renderSortIndicator(column)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t`,\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t</schmancy-surface>\n\n\t\t\t\t${this.filteredData.length > 0\n\t\t\t\t\t? html`\n\t\t\t\t\t\t\t<lit-virtualizer\n\t\t\t\t\t\t\t\tscroller\n\t\t\t\t\t\t\t\tclass=\"w-full h-full relative overflow-auto\"\n\t\t\t\t\t\t\t\t.items=${this.filteredData}\n\t\t\t\t\t\t\t\t.keyFunction=${(item: T, index: number) => {\n\t\t\t\t\t\t\t\t\tconst keyValue = item?.[this.keyField]\n\t\t\t\t\t\t\t\t\tif (keyValue === undefined || keyValue === null) {\n\t\t\t\t\t\t\t\t\t\treturn index\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn typeof keyValue === 'string' || typeof keyValue === 'number' ? keyValue : String(keyValue)\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t.renderItem=${(item: T, index: number) =>\n\t\t\t\t\t\t\t\t\thtml`\n\t\t\t\t\t\t\t\t\t\t<schmancy-table-row\n\t\t\t\t\t\t\t\t\t\t\tclass=\"w-full border-b border-solid border-outlineVariant\"\n\t\t\t\t\t\t\t\t\t\t\t.columns=${this.columns}\n\t\t\t\t\t\t\t\t\t\t\t.item=${item}\n\t\t\t\t\t\t\t\t\t\t\tcols=${this.cols}\n\t\t\t\t\t\t\t\t\t\t\t@click=${() => {\n\t\t\t\t\t\t\t\t\t\t\t\tconst detail = { item, index }\n\t\t\t\t\t\t\t\t\t\t\t\tthis.dispatchEvent(\n\t\t\t\t\t\t\t\t\t\t\t\t\tnew CustomEvent('click', {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdetail,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbubbles: true,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tcomposed: true,\n\t\t\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t></schmancy-table-row>\n\t\t\t\t\t\t\t\t\t` as TemplateResult}\n\t\t\t\t\t\t\t></lit-virtualizer>\n\t\t\t\t\t\t`\n\t\t\t\t\t: html`\n\t\t\t\t\t\t\t<div class=\"flex items-center justify-center w-full h-full p-8 text-center\">\n\t\t\t\t\t\t\t\t<schmancy-typography type=\"body\" token=\"lg\"> No data available </schmancy-typography>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t`}\n\t\t\t</div>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-table': SchmancyDataTable\n\t}\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
1
|
+
import { t as e, u as t } from "./SchmancyElement-DuzT2AMa.js";
|
|
2
|
+
import "./mixins-Cevarn7V.js";
|
|
3
3
|
import { filter as n, fromEvent as r, interval as i, map as a, take as o, throttleTime as s } from "rxjs";
|
|
4
4
|
import { consume as c, createContext as l, provide as u } from "@lit/context";
|
|
5
5
|
import { customElement as d, property as f, query as p, queryAssignedElements as m, state as h } from "lit/decorators.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tabs-BvEal6oS.js","names":[],"sources":["../src/tabs/context.ts","../src/tabs/tab.ts","../src/tabs/tabs-group.ts"],"sourcesContent":["import { createContext } from '@lit/context'\n\nexport type TSchmancyTabsMode = 'scroll' | 'tabs'\n\nexport const SchmancyTabsModeContext = createContext<TSchmancyTabsMode>('tabs')\n","import { consume } from '@lit/context'\nimport { SchmancyElement } from '@mixins/index'\nimport { html } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { SchmancyTabsModeContext } from './context'\n\n@customElement('schmancy-tab')\nexport default class SchmancyTab extends SchmancyElement {\n\t@property({ type: String, reflect: true }) label\n\t@property({ type: String, reflect: true }) value\n\t@property({ type: Boolean, reflect: true }) active!: boolean\n\n\t@consume({ context: SchmancyTabsModeContext, subscribe: true })\n\t@state()\n\tmode\n\n\tprotected updated(changedProperties: Map<PropertyKey, unknown>) {\n\t\tif (changedProperties.has('active') && this.active) {\n\t\t\t// Trigger resize for virtualizers to recalculate when tab becomes visible\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\twindow.dispatchEvent(new Event('resize'))\n\t\t\t})\n\t\t}\n\t}\n\n\tprotected render(): unknown {\n\t\t// Don't render content until tab is active (virtualizers need actual layout, not hidden)\n\t\tif (this.mode === 'tabs' && !this.active) {\n\t\t\treturn html``\n\t\t}\n\t\treturn html`<slot></slot>`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-tab': SchmancyTab\n\t}\n}\n","import { provide } from '@lit/context'\nimport { SchmancyElement } from '@mixins/index'\nimport { css, html } from 'lit'\nimport { customElement, property, query, queryAssignedElements, state } from 'lit/decorators.js'\nimport { repeat } from 'lit/directives/repeat.js'\nimport { filter, fromEvent, interval, map, take, throttleTime } from 'rxjs'\nimport { SchmancyTabsModeContext, TSchmancyTabsMode } from './context'\nimport SchmancyTab from './tab'\n\n/**\n * @slot - The content of the tab group\n * @fires tab-changed - The event fired when the tab is changed\n */\n@customElement('schmancy-tab-group')\nexport default class SchmancyTabGroup extends SchmancyElement {\n\tstatic styles = [css`\n\t:host {\n\t\tdisplay: block;\n\t\theight: 100%;\n\t}\n`];\n\t@provide({ context: SchmancyTabsModeContext })\n\t@property({ type: String })\n\tmode: TSchmancyTabsMode = 'tabs'\n\n\t@property({ type: Boolean }) rounded = true\n\n\t@property({ type: String, reflect: true }) activeTab: string\n\t@queryAssignedElements({\n\t\tflatten: true,\n\t})\n\tprivate tabsElements!: Array<SchmancyTab>\n\n\t@query('#tabsNavigation') navElement!: HTMLElement\n\t@query('#tabsContent') tabsContent!: HTMLElement\n\n\t@state()\n\tprivate tabs: Array<SchmancyTab> = []\n\n\tconnectedCallback(): void {\n\t\tsuper.connectedCallback()\n\t\tfromEvent(window, 'scroll')\n\t\t\t.pipe(\n\t\t\t\tthrottleTime(1000),\n\t\t\t\tfilter(() => this.mode === 'scroll'),\n\t\t\t\tmap(() => {\n\t\t\t\t\tlet closestDiv = null\n\t\t\t\t\tlet closestDistance = Infinity\n\t\t\t\t\tthis.tabsElements.forEach(div => {\n\t\t\t\t\t\tconst distance =\n\t\t\t\t\t\t\tdiv.getBoundingClientRect().top - this.navElement.clientHeight + document.body.offsetHeight / 3\n\n\t\t\t\t\t\tif (distance < closestDistance && distance > 0) {\n\t\t\t\t\t\t\tclosestDistance = distance\n\t\t\t\t\t\t\tclosestDiv = div\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\treturn closestDiv\n\t\t\t\t}),\n\t\t\t\tfilter((el: SchmancyTab | null) => el !== null),\n\t\t\t)\n\t\t\t.subscribe({\n\t\t\t\tnext: (el: SchmancyTab) => {\n\t\t\t\t\tthis.activeTab = el.value\n\t\t\t\t},\n\t\t\t})\n\t}\n\n\tfirstUpdated() {\n\t\tinterval(0)\n\t\t\t.pipe(\n\t\t\t\tfilter(() => !!this.navElement.clientHeight),\n\t\t\t\ttake(1),\n\t\t\t)\n\t\t\t.subscribe(() => {\n\t\t\t\tthis.tabsElements.forEach(tab => {\n\t\t\t\t\tif (this.mode === 'scroll') tab.style.paddingTop = this.navElement.clientHeight + 'px'\n\t\t\t\t})\n\t\t\t})\n\t}\n\n\thydrateTabs() {\n\t\tthis.tabs = this.tabsElements\n\t\tif (!this.activeTab && this.tabsElements[0]) {\n\t\t\tthis.activeTab = this.tabsElements[0].value\n\t\t\tthis.tabsElements[0].active = true\n\t\t} else {\n\t\t\tthis.tabsElements.forEach(tab => {\n\t\t\t\tif (tab.value === this.activeTab) tab.active = true\n\t\t\t\telse tab.active = false\n\t\t\t})\n\t\t}\n\t\tconst lastTab = this.tabs?.[-1]\n\t\tif (lastTab) {\n\t\t\tlastTab.style.paddingBottom = lastTab.offsetHeight + 'px'\n\t\t}\n\t}\n\n\ttabChanged(selectedTab: { label: string; value: string }) {\n\t\tlet activeTabElement: SchmancyTab | undefined\n\t\tthis.tabsElements.forEach(tab => {\n\t\t\tif (tab.value === selectedTab.value) {\n\t\t\t\ttab.active = true\n\t\t\t\tactiveTabElement = tab\n\t\t\t\t// scroll to the tab\n\t\t\t\tif (this.mode === 'scroll') {\n\t\t\t\t\t// Scroll the desired element into view\n\t\t\t\t\tactiveTabElement.scrollIntoView({\n\t\t\t\t\t\tbehavior: 'smooth',\n\t\t\t\t\t\tblock: 'start',\n\t\t\t\t\t\tinline: 'start',\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\ttab.active = false\n\t\t\t}\n\t\t})\n\t\tif (this.mode === 'tabs') {\n\t\t\tthis.activeTab = selectedTab.value\n\t\t}\n\t\tthis.dispatchEvent(new CustomEvent('tab-changed', { detail: this.activeTab }))\n\t}\n\n\tprotected render(): unknown {\n\t\tconst tabs = {\n\t\t\t'bg-surface-default color-surface-on': true,\n\t\t\t'flex z-50 overflow-auto': true,\n\t\t\t'sticky top-0 shadow-md': this.mode === 'scroll',\n\t\t\t'rounded-full': this.rounded,\n\t\t}\n\n\t\tconst activeTab = {\n\t\t\t'text-primary-default': true,\n\t\t}\n\n\t\tconst inactiveTab = {\n\t\t\t'border-transparent': true,\n\t\t\t'hover:text-surface-on': true,\n\t\t\t'hover:border-outlineVariant': true,\n\t\t\t'text-surface-onVariant': true,\n\t\t}\n\n\t\treturn html`\n\t\t\t<section id=\"tabsNavigation\" class=\"${this.classMap(tabs)}\" aria-label=\"Tabs\">\n\t\t\t\t${repeat(\n\t\t\t\t\tthis.tabs,\n\t\t\t\t\ttab => tab.value,\n\t\t\t\t\ttab => html`\n\t\t\t\t\t\t<schmancy-button\n\t\t\t\t\t\t\t@click=${() => {\n\t\t\t\t\t\t\t\tthis.tabChanged({\n\t\t\t\t\t\t\t\t\tlabel: tab.label,\n\t\t\t\t\t\t\t\t\tvalue: tab.value,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\taria-current=\"page\"\n\t\t\t\t\t\t\tclass=\"h-auto relative\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclass=\"px-4 py-3 ${this.activeTab === tab.value\n\t\t\t\t\t\t\t\t\t? this.classMap(activeTab)\n\t\t\t\t\t\t\t\t\t: this.classMap(inactiveTab)}\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<schmancy-typography class=\"h-full align-middle flex \" type=\"title\" token=\"md\" weight=\"medium\">\n\t\t\t\t\t\t\t\t\t${tab.label}\n\t\t\t\t\t\t\t\t</schmancy-typography>\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t.hidden=${this.activeTab !== tab.value}\n\t\t\t\t\t\t\t\t\tclass=\"border-primary-default absolute bottom-0 inset-x-6 border-solid border-2 rounded-t-full\"\n\t\t\t\t\t\t\t\t></div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</schmancy-button>\n\t\t\t\t\t`,\n\t\t\t\t)}\n\t\t\t</section>\n\t\t\t<section id=\"tabsContent\" class=\"h-full\">\n\t\t\t\t<slot @slotchange=${() => this.hydrateTabs()}></slot>\n\t\t\t</section>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-tab-group': SchmancyTabGroup\n\t}\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tabs-DJNdoE-x.js","names":[],"sources":["../src/tabs/context.ts","../src/tabs/tab.ts","../src/tabs/tabs-group.ts"],"sourcesContent":["import { createContext } from '@lit/context'\n\nexport type TSchmancyTabsMode = 'scroll' | 'tabs'\n\nexport const SchmancyTabsModeContext = createContext<TSchmancyTabsMode>('tabs')\n","import { consume } from '@lit/context'\nimport { SchmancyElement } from '@mixins/index'\nimport { html } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { SchmancyTabsModeContext } from './context'\n\n@customElement('schmancy-tab')\nexport default class SchmancyTab extends SchmancyElement {\n\t@property({ type: String, reflect: true }) label\n\t@property({ type: String, reflect: true }) value\n\t@property({ type: Boolean, reflect: true }) active!: boolean\n\n\t@consume({ context: SchmancyTabsModeContext, subscribe: true })\n\t@state()\n\tmode\n\n\tprotected updated(changedProperties: Map<PropertyKey, unknown>) {\n\t\tif (changedProperties.has('active') && this.active) {\n\t\t\t// Trigger resize for virtualizers to recalculate when tab becomes visible\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\twindow.dispatchEvent(new Event('resize'))\n\t\t\t})\n\t\t}\n\t}\n\n\tprotected render(): unknown {\n\t\t// Don't render content until tab is active (virtualizers need actual layout, not hidden)\n\t\tif (this.mode === 'tabs' && !this.active) {\n\t\t\treturn html``\n\t\t}\n\t\treturn html`<slot></slot>`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-tab': SchmancyTab\n\t}\n}\n","import { provide } from '@lit/context'\nimport { SchmancyElement } from '@mixins/index'\nimport { css, html } from 'lit'\nimport { customElement, property, query, queryAssignedElements, state } from 'lit/decorators.js'\nimport { repeat } from 'lit/directives/repeat.js'\nimport { filter, fromEvent, interval, map, take, throttleTime } from 'rxjs'\nimport { SchmancyTabsModeContext, TSchmancyTabsMode } from './context'\nimport SchmancyTab from './tab'\n\n/**\n * @slot - The content of the tab group\n * @fires tab-changed - The event fired when the tab is changed\n */\n@customElement('schmancy-tab-group')\nexport default class SchmancyTabGroup extends SchmancyElement {\n\tstatic styles = [css`\n\t:host {\n\t\tdisplay: block;\n\t\theight: 100%;\n\t}\n`];\n\t@provide({ context: SchmancyTabsModeContext })\n\t@property({ type: String })\n\tmode: TSchmancyTabsMode = 'tabs'\n\n\t@property({ type: Boolean }) rounded = true\n\n\t@property({ type: String, reflect: true }) activeTab: string\n\t@queryAssignedElements({\n\t\tflatten: true,\n\t})\n\tprivate tabsElements!: Array<SchmancyTab>\n\n\t@query('#tabsNavigation') navElement!: HTMLElement\n\t@query('#tabsContent') tabsContent!: HTMLElement\n\n\t@state()\n\tprivate tabs: Array<SchmancyTab> = []\n\n\tconnectedCallback(): void {\n\t\tsuper.connectedCallback()\n\t\tfromEvent(window, 'scroll')\n\t\t\t.pipe(\n\t\t\t\tthrottleTime(1000),\n\t\t\t\tfilter(() => this.mode === 'scroll'),\n\t\t\t\tmap(() => {\n\t\t\t\t\tlet closestDiv = null\n\t\t\t\t\tlet closestDistance = Infinity\n\t\t\t\t\tthis.tabsElements.forEach(div => {\n\t\t\t\t\t\tconst distance =\n\t\t\t\t\t\t\tdiv.getBoundingClientRect().top - this.navElement.clientHeight + document.body.offsetHeight / 3\n\n\t\t\t\t\t\tif (distance < closestDistance && distance > 0) {\n\t\t\t\t\t\t\tclosestDistance = distance\n\t\t\t\t\t\t\tclosestDiv = div\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\treturn closestDiv\n\t\t\t\t}),\n\t\t\t\tfilter((el: SchmancyTab | null) => el !== null),\n\t\t\t)\n\t\t\t.subscribe({\n\t\t\t\tnext: (el: SchmancyTab) => {\n\t\t\t\t\tthis.activeTab = el.value\n\t\t\t\t},\n\t\t\t})\n\t}\n\n\tfirstUpdated() {\n\t\tinterval(0)\n\t\t\t.pipe(\n\t\t\t\tfilter(() => !!this.navElement.clientHeight),\n\t\t\t\ttake(1),\n\t\t\t)\n\t\t\t.subscribe(() => {\n\t\t\t\tthis.tabsElements.forEach(tab => {\n\t\t\t\t\tif (this.mode === 'scroll') tab.style.paddingTop = this.navElement.clientHeight + 'px'\n\t\t\t\t})\n\t\t\t})\n\t}\n\n\thydrateTabs() {\n\t\tthis.tabs = this.tabsElements\n\t\tif (!this.activeTab && this.tabsElements[0]) {\n\t\t\tthis.activeTab = this.tabsElements[0].value\n\t\t\tthis.tabsElements[0].active = true\n\t\t} else {\n\t\t\tthis.tabsElements.forEach(tab => {\n\t\t\t\tif (tab.value === this.activeTab) tab.active = true\n\t\t\t\telse tab.active = false\n\t\t\t})\n\t\t}\n\t\tconst lastTab = this.tabs?.[-1]\n\t\tif (lastTab) {\n\t\t\tlastTab.style.paddingBottom = lastTab.offsetHeight + 'px'\n\t\t}\n\t}\n\n\ttabChanged(selectedTab: { label: string; value: string }) {\n\t\tlet activeTabElement: SchmancyTab | undefined\n\t\tthis.tabsElements.forEach(tab => {\n\t\t\tif (tab.value === selectedTab.value) {\n\t\t\t\ttab.active = true\n\t\t\t\tactiveTabElement = tab\n\t\t\t\t// scroll to the tab\n\t\t\t\tif (this.mode === 'scroll') {\n\t\t\t\t\t// Scroll the desired element into view\n\t\t\t\t\tactiveTabElement.scrollIntoView({\n\t\t\t\t\t\tbehavior: 'smooth',\n\t\t\t\t\t\tblock: 'start',\n\t\t\t\t\t\tinline: 'start',\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\ttab.active = false\n\t\t\t}\n\t\t})\n\t\tif (this.mode === 'tabs') {\n\t\t\tthis.activeTab = selectedTab.value\n\t\t}\n\t\tthis.dispatchEvent(new CustomEvent('tab-changed', { detail: this.activeTab }))\n\t}\n\n\tprotected render(): unknown {\n\t\tconst tabs = {\n\t\t\t'bg-surface-default color-surface-on': true,\n\t\t\t'flex z-50 overflow-auto': true,\n\t\t\t'sticky top-0 shadow-md': this.mode === 'scroll',\n\t\t\t'rounded-full': this.rounded,\n\t\t}\n\n\t\tconst activeTab = {\n\t\t\t'text-primary-default': true,\n\t\t}\n\n\t\tconst inactiveTab = {\n\t\t\t'border-transparent': true,\n\t\t\t'hover:text-surface-on': true,\n\t\t\t'hover:border-outlineVariant': true,\n\t\t\t'text-surface-onVariant': true,\n\t\t}\n\n\t\treturn html`\n\t\t\t<section id=\"tabsNavigation\" class=\"${this.classMap(tabs)}\" aria-label=\"Tabs\">\n\t\t\t\t${repeat(\n\t\t\t\t\tthis.tabs,\n\t\t\t\t\ttab => tab.value,\n\t\t\t\t\ttab => html`\n\t\t\t\t\t\t<schmancy-button\n\t\t\t\t\t\t\t@click=${() => {\n\t\t\t\t\t\t\t\tthis.tabChanged({\n\t\t\t\t\t\t\t\t\tlabel: tab.label,\n\t\t\t\t\t\t\t\t\tvalue: tab.value,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\taria-current=\"page\"\n\t\t\t\t\t\t\tclass=\"h-auto relative\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclass=\"px-4 py-3 ${this.activeTab === tab.value\n\t\t\t\t\t\t\t\t\t? this.classMap(activeTab)\n\t\t\t\t\t\t\t\t\t: this.classMap(inactiveTab)}\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<schmancy-typography class=\"h-full align-middle flex \" type=\"title\" token=\"md\" weight=\"medium\">\n\t\t\t\t\t\t\t\t\t${tab.label}\n\t\t\t\t\t\t\t\t</schmancy-typography>\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t.hidden=${this.activeTab !== tab.value}\n\t\t\t\t\t\t\t\t\tclass=\"border-primary-default absolute bottom-0 inset-x-6 border-solid border-2 rounded-t-full\"\n\t\t\t\t\t\t\t\t></div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</schmancy-button>\n\t\t\t\t\t`,\n\t\t\t\t)}\n\t\t\t</section>\n\t\t\t<section id=\"tabsContent\" class=\"h-full\">\n\t\t\t\t<slot @slotchange=${() => this.hydrateTabs()}></slot>\n\t\t\t</section>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-tab-group': SchmancyTabGroup\n\t}\n}\n"],"mappings":"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"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
require(`./chunk-CncqDLb2.cjs`);const e=require(`./
|
|
1
|
+
require(`./chunk-CncqDLb2.cjs`);const e=require(`./SchmancyElement-D8_z9JrW.cjs`);require(`./mixins-JyO9GSGy.cjs`);let t=require(`rxjs`),n=require(`@lit/context`),r=require(`lit/decorators.js`),i=require(`lit`),a=require(`lit/directives/repeat.js`);var o=(0,n.createContext)(`tabs`),s=class extends e.t{updated(e){e.has(`active`)&&this.active&&requestAnimationFrame(()=>{window.dispatchEvent(new Event(`resize`))})}render(){return this.mode!==`tabs`||this.active?i.html`<slot></slot>`:i.html``}};e.u([(0,r.property)({type:String,reflect:!0})],s.prototype,`label`,void 0),e.u([(0,r.property)({type:String,reflect:!0})],s.prototype,`value`,void 0),e.u([(0,r.property)({type:Boolean,reflect:!0})],s.prototype,`active`,void 0),e.u([(0,n.consume)({context:o,subscribe:!0}),(0,r.state)()],s.prototype,`mode`,void 0),s=e.u([(0,r.customElement)(`schmancy-tab`)],s);var c=class extends e.t{constructor(...e){super(...e),this.mode=`tabs`,this.rounded=!0,this.tabs=[]}static{this.styles=[i.css`
|
|
2
2
|
:host {
|
|
3
3
|
display: block;
|
|
4
4
|
height: 100%;
|
|
5
5
|
}
|
|
6
|
-
`]}connectedCallback(){super.connectedCallback(),(0,
|
|
6
|
+
`]}connectedCallback(){super.connectedCallback(),(0,t.fromEvent)(window,`scroll`).pipe((0,t.throttleTime)(1e3),(0,t.filter)(()=>this.mode===`scroll`),(0,t.map)(()=>{let e=null,t=1/0;return this.tabsElements.forEach(n=>{let r=n.getBoundingClientRect().top-this.navElement.clientHeight+document.body.offsetHeight/3;r<t&&r>0&&(t=r,e=n)}),e}),(0,t.filter)(e=>e!==null)).subscribe({next:e=>{this.activeTab=e.value}})}firstUpdated(){(0,t.interval)(0).pipe((0,t.filter)(()=>!!this.navElement.clientHeight),(0,t.take)(1)).subscribe(()=>{this.tabsElements.forEach(e=>{this.mode===`scroll`&&(e.style.paddingTop=this.navElement.clientHeight+`px`)})})}hydrateTabs(){this.tabs=this.tabsElements,!this.activeTab&&this.tabsElements[0]?(this.activeTab=this.tabsElements[0].value,this.tabsElements[0].active=!0):this.tabsElements.forEach(e=>{e.value===this.activeTab?e.active=!0:e.active=!1});let e=this.tabs?.[-1];e&&(e.style.paddingBottom=e.offsetHeight+`px`)}tabChanged(e){let t;this.tabsElements.forEach(n=>{n.value===e.value?(n.active=!0,t=n,this.mode===`scroll`&&t.scrollIntoView({behavior:`smooth`,block:`start`,inline:`start`})):n.active=!1}),this.mode===`tabs`&&(this.activeTab=e.value),this.dispatchEvent(new CustomEvent(`tab-changed`,{detail:this.activeTab}))}render(){let e={"bg-surface-default color-surface-on":!0,"flex z-50 overflow-auto":!0,"sticky top-0 shadow-md":this.mode===`scroll`,"rounded-full":this.rounded},t={"text-primary-default":!0},n={"border-transparent":!0,"hover:text-surface-on":!0,"hover:border-outlineVariant":!0,"text-surface-onVariant":!0};return i.html`
|
|
7
7
|
<section id="tabsNavigation" class="${this.classMap(e)}" aria-label="Tabs">
|
|
8
|
-
${(0,
|
|
8
|
+
${(0,a.repeat)(this.tabs,e=>e.value,e=>i.html`
|
|
9
9
|
<schmancy-button
|
|
10
10
|
@click=${()=>{this.tabChanged({label:e.label,value:e.value})}}
|
|
11
11
|
aria-current="page"
|
|
@@ -28,4 +28,4 @@ require(`./chunk-CncqDLb2.cjs`);const e=require(`./mixins-CxGRIPYQ.cjs`),t=requi
|
|
|
28
28
|
<section id="tabsContent" class="h-full">
|
|
29
29
|
<slot @slotchange=${()=>this.hydrateTabs()}></slot>
|
|
30
30
|
</section>
|
|
31
|
-
`}};
|
|
31
|
+
`}};e.u([(0,n.provide)({context:o}),(0,r.property)({type:String})],c.prototype,`mode`,void 0),e.u([(0,r.property)({type:Boolean})],c.prototype,`rounded`,void 0),e.u([(0,r.property)({type:String,reflect:!0})],c.prototype,`activeTab`,void 0),e.u([(0,r.queryAssignedElements)({flatten:!0})],c.prototype,`tabsElements`,void 0),e.u([(0,r.query)(`#tabsNavigation`)],c.prototype,`navElement`,void 0),e.u([(0,r.query)(`#tabsContent`)],c.prototype,`tabsContent`,void 0),e.u([(0,r.state)()],c.prototype,`tabs`,void 0),c=e.u([(0,r.customElement)(`schmancy-tab-group`)],c);
|