@mcp-b/web-components 0.2.0
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/LICENSE +21 -0
- package/README.md +49 -0
- package/dist/accordion-B1Q3kuP_.d.ts +373 -0
- package/dist/accordion-item-DvPfhpm8.js +307 -0
- package/dist/accordion-item-bPRIahNn.d.ts +63 -0
- package/dist/accordion-zDr-Br4V.js +483 -0
- package/dist/action-bar-CYsjmhwP.d.ts +29 -0
- package/dist/action-bar-CjN_UcnP.js +56 -0
- package/dist/alert-dialog-4CnO3Nb5.d.ts +60 -0
- package/dist/alert-dialog-D25Oi_TS.js +126 -0
- package/dist/avatar-Bje_KpZo.d.ts +141 -0
- package/dist/avatar-CRP0kW3x.js +224 -0
- package/dist/badge-Ct95U4UO.js +301 -0
- package/dist/badge-D1DNQrWn.d.ts +106 -0
- package/dist/breadcrumb-BxZ-nQE5.d.ts +365 -0
- package/dist/breadcrumb-item-BC454oQe.d.ts +59 -0
- package/dist/breadcrumb-item-P5pdq_gE.js +151 -0
- package/dist/breadcrumb-uURhiqWJ.js +384 -0
- package/dist/button-5k_aL_gD.js +802 -0
- package/dist/button-BQofnUt4.d.ts +354 -0
- package/dist/button-group-BydvJTQy.js +197 -0
- package/dist/button-group-COodHeuB.d.ts +155 -0
- package/dist/callout-B8zTf8Go.js +188 -0
- package/dist/callout-DFwPao36.d.ts +103 -0
- package/dist/card-BYDzdMAU.d.ts +177 -0
- package/dist/card-DIg1-X2G.js +332 -0
- package/dist/carousel-Bktu7wrD.js +843 -0
- package/dist/carousel-DQITCtEY.d.ts +423 -0
- package/dist/carousel-item-B5-X31Ha.js +79 -0
- package/dist/carousel-item-BB3jL2tk.d.ts +34 -0
- package/dist/cdn/loader.js +530 -0
- package/dist/checkbox-D6r7PVPj.js +641 -0
- package/dist/checkbox-DoFcDEKB.d.ts +354 -0
- package/dist/checkbox-group-CLvNAO_F.js +201 -0
- package/dist/checkbox-group-Cnh8rAn4.d.ts +152 -0
- package/dist/color-input-Bky89xg_.d.ts +470 -0
- package/dist/color-input-DPIxi9wR.js +894 -0
- package/dist/color-picker-adwOmtRl.js +1240 -0
- package/dist/color-picker-wQw8bPsq.d.ts +360 -0
- package/dist/combobox-B6al50UG.js +1693 -0
- package/dist/combobox-item-D2H1CMxC.d.ts +714 -0
- package/dist/combobox-item-yM6tDrGG.js +225 -0
- package/dist/comparison-B1-nMwmp.d.ts +134 -0
- package/dist/comparison-CyqKrCN-.js +435 -0
- package/dist/components/accordion/accordion.d.ts +2 -0
- package/dist/components/accordion/accordion.js +2 -0
- package/dist/components/accordion-item/accordion-item.d.ts +2 -0
- package/dist/components/accordion-item/accordion-item.js +2 -0
- package/dist/components/action-bar/action-bar.d.ts +2 -0
- package/dist/components/action-bar/action-bar.js +2 -0
- package/dist/components/alert-dialog/alert-dialog.d.ts +2 -0
- package/dist/components/alert-dialog/alert-dialog.js +2 -0
- package/dist/components/avatar/avatar.d.ts +2 -0
- package/dist/components/avatar/avatar.js +2 -0
- package/dist/components/badge/badge.d.ts +2 -0
- package/dist/components/badge/badge.js +2 -0
- package/dist/components/breadcrumb/breadcrumb.d.ts +2 -0
- package/dist/components/breadcrumb/breadcrumb.js +2 -0
- package/dist/components/breadcrumb-item/breadcrumb-item.d.ts +2 -0
- package/dist/components/breadcrumb-item/breadcrumb-item.js +2 -0
- package/dist/components/button/button.d.ts +2 -0
- package/dist/components/button/button.js +2 -0
- package/dist/components/button-group/button-group.d.ts +2 -0
- package/dist/components/button-group/button-group.js +2 -0
- package/dist/components/callout/callout.d.ts +2 -0
- package/dist/components/callout/callout.js +2 -0
- package/dist/components/card/card.d.ts +2 -0
- package/dist/components/card/card.js +2 -0
- package/dist/components/carousel/carousel.d.ts +2 -0
- package/dist/components/carousel/carousel.js +2 -0
- package/dist/components/carousel-item/carousel-item.d.ts +2 -0
- package/dist/components/carousel-item/carousel-item.js +2 -0
- package/dist/components/checkbox/checkbox.d.ts +2 -0
- package/dist/components/checkbox/checkbox.js +2 -0
- package/dist/components/checkbox-group/checkbox-group.d.ts +2 -0
- package/dist/components/checkbox-group/checkbox-group.js +2 -0
- package/dist/components/color-input/color-input.d.ts +2 -0
- package/dist/components/color-input/color-input.js +2 -0
- package/dist/components/color-picker/color-picker.d.ts +2 -0
- package/dist/components/color-picker/color-picker.js +2 -0
- package/dist/components/combobox/combobox.d.ts +2 -0
- package/dist/components/combobox/combobox.js +2 -0
- package/dist/components/combobox-item/combobox-item.d.ts +2 -0
- package/dist/components/combobox-item/combobox-item.js +2 -0
- package/dist/components/comparison/comparison.d.ts +2 -0
- package/dist/components/comparison/comparison.js +2 -0
- package/dist/components/copy/copy.d.ts +2 -0
- package/dist/components/copy/copy.js +291 -0
- package/dist/components/data-table/data-table.d.ts +2 -0
- package/dist/components/data-table/data-table.js +2 -0
- package/dist/components/date/date.d.ts +2 -0
- package/dist/components/date/date.js +2 -0
- package/dist/components/dialog/dialog.d.ts +2 -0
- package/dist/components/dialog/dialog.js +2 -0
- package/dist/components/divider/divider.d.ts +2 -0
- package/dist/components/divider/divider.js +2 -0
- package/dist/components/dropdown/dropdown.d.ts +2 -0
- package/dist/components/dropdown/dropdown.js +2 -0
- package/dist/components/dropdown-item/dropdown-item.d.ts +2 -0
- package/dist/components/dropdown-item/dropdown-item.js +2 -0
- package/dist/components/empty-result/empty-result.d.ts +2 -0
- package/dist/components/empty-result/empty-result.js +2 -0
- package/dist/components/empty-state/empty-state.d.ts +2 -0
- package/dist/components/empty-state/empty-state.js +2 -0
- package/dist/components/expander/expander.d.ts +2 -0
- package/dist/components/expander/expander.js +2 -0
- package/dist/components/field/field.d.ts +2 -0
- package/dist/components/field/field.js +2 -0
- package/dist/components/file-input/file-input.d.ts +2 -0
- package/dist/components/file-input/file-input.js +2 -0
- package/dist/components/filter-bar/filter-bar.d.ts +2 -0
- package/dist/components/filter-bar/filter-bar.js +2 -0
- package/dist/components/form-section/form-section.d.ts +2 -0
- package/dist/components/form-section/form-section.js +2 -0
- package/dist/components/icon/icon.d.ts +2 -0
- package/dist/components/icon/icon.js +2 -0
- package/dist/components/include/include.d.ts +2 -0
- package/dist/components/include/include.js +2 -0
- package/dist/components/index.d.ts +85 -0
- package/dist/components/index.js +86 -0
- package/dist/components/infinite-scroller/infinite-scroller.d.ts +2 -0
- package/dist/components/infinite-scroller/infinite-scroller.js +2 -0
- package/dist/components/intersection-observer/intersection-observer.d.ts +2 -0
- package/dist/components/intersection-observer/intersection-observer.js +2 -0
- package/dist/components/listbox/listbox.d.ts +2 -0
- package/dist/components/listbox/listbox.js +2 -0
- package/dist/components/listbox-item/listbox-item.d.ts +2 -0
- package/dist/components/listbox-item/listbox-item.js +2 -0
- package/dist/components/lorem-ipsum/lorem-ipsum.d.ts +2 -0
- package/dist/components/lorem-ipsum/lorem-ipsum.js +2 -0
- package/dist/components/meter/meter.d.ts +2 -0
- package/dist/components/meter/meter.js +2 -0
- package/dist/components/metric/metric.d.ts +2 -0
- package/dist/components/metric/metric.js +2 -0
- package/dist/components/metric-grid/metric-grid.d.ts +2 -0
- package/dist/components/metric-grid/metric-grid.js +2 -0
- package/dist/components/mutation-observer/mutation-observer.d.ts +2 -0
- package/dist/components/mutation-observer/mutation-observer.js +2 -0
- package/dist/components/navicon/navicon.d.ts +2 -0
- package/dist/components/navicon/navicon.js +2 -0
- package/dist/components/number/number.d.ts +2 -0
- package/dist/components/number/number.js +2 -0
- package/dist/components/number-field/number-field.d.ts +2 -0
- package/dist/components/number-field/number-field.js +2 -0
- package/dist/components/pagination/pagination.d.ts +2 -0
- package/dist/components/pagination/pagination.js +2 -0
- package/dist/components/popover/popover.d.ts +2 -0
- package/dist/components/popover/popover.js +2 -0
- package/dist/components/preview-card/preview-card.d.ts +2 -0
- package/dist/components/preview-card/preview-card.js +2 -0
- package/dist/components/progress/progress.d.ts +2 -0
- package/dist/components/progress/progress.js +2 -0
- package/dist/components/radio/radio.d.ts +2 -0
- package/dist/components/radio/radio.js +2 -0
- package/dist/components/radio-item/radio-item.d.ts +2 -0
- package/dist/components/radio-item/radio-item.js +2 -0
- package/dist/components/random-content/random-content.d.ts +2 -0
- package/dist/components/random-content/random-content.js +2 -0
- package/dist/components/rating/rating.d.ts +2 -0
- package/dist/components/rating/rating.js +2 -0
- package/dist/components/resize-observer/resize-observer.d.ts +2 -0
- package/dist/components/resize-observer/resize-observer.js +2 -0
- package/dist/components/scroll-area/scroll-area.d.ts +2 -0
- package/dist/components/scroll-area/scroll-area.js +2 -0
- package/dist/components/scroller/scroller.d.ts +2 -0
- package/dist/components/scroller/scroller.js +2 -0
- package/dist/components/search-list/search-list.d.ts +2 -0
- package/dist/components/search-list/search-list.js +2 -0
- package/dist/components/select/select.d.ts +2 -0
- package/dist/components/select/select.js +2 -0
- package/dist/components/selection-summary/selection-summary.d.ts +2 -0
- package/dist/components/selection-summary/selection-summary.js +2 -0
- package/dist/components/share/share.d.ts +2 -0
- package/dist/components/share/share.js +2 -0
- package/dist/components/slide-activator/slide-activator.d.ts +2 -0
- package/dist/components/slide-activator/slide-activator.js +2 -0
- package/dist/components/slider/slider.d.ts +2 -0
- package/dist/components/slider/slider.js +2 -0
- package/dist/components/sparkline/sparkline.d.ts +2 -0
- package/dist/components/sparkline/sparkline.js +2 -0
- package/dist/components/spinner/spinner.d.ts +2 -0
- package/dist/components/spinner/spinner.js +2 -0
- package/dist/components/splitter/splitter.d.ts +2 -0
- package/dist/components/splitter/splitter.js +2 -0
- package/dist/components/switch/switch.d.ts +2 -0
- package/dist/components/switch/switch.js +2 -0
- package/dist/components/tab/tab.d.ts +2 -0
- package/dist/components/tab/tab.js +2 -0
- package/dist/components/tab-list/tab-list.d.ts +2 -0
- package/dist/components/tab-list/tab-list.js +2 -0
- package/dist/components/tab-panel/tab-panel.d.ts +2 -0
- package/dist/components/tab-panel/tab-panel.js +2 -0
- package/dist/components/text-area/text-area.d.ts +2 -0
- package/dist/components/text-area/text-area.js +2 -0
- package/dist/components/text-field/text-field.d.ts +2 -0
- package/dist/components/text-field/text-field.js +2 -0
- package/dist/components/text-mask/text-mask.d.ts +2 -0
- package/dist/components/text-mask/text-mask.js +2 -0
- package/dist/components/timed-content/timed-content.d.ts +2 -0
- package/dist/components/timed-content/timed-content.js +2 -0
- package/dist/components/toast/toast.d.ts +2 -0
- package/dist/components/toast/toast.js +2 -0
- package/dist/components/toast-item/toast-item.d.ts +2 -0
- package/dist/components/toast-item/toast-item.js +2 -0
- package/dist/components/toggle-icon/toggle-icon.d.ts +2 -0
- package/dist/components/toggle-icon/toggle-icon.js +2 -0
- package/dist/components/toggle-tag/toggle-tag.d.ts +2 -0
- package/dist/components/toggle-tag/toggle-tag.js +2 -0
- package/dist/components/toolbar/toolbar.d.ts +2 -0
- package/dist/components/toolbar/toolbar.js +2 -0
- package/dist/components/tooltip/tooltip.d.ts +2 -0
- package/dist/components/tooltip/tooltip.js +2 -0
- package/dist/components/transition-group/transition-group.d.ts +2 -0
- package/dist/components/transition-group/transition-group.js +2 -0
- package/dist/components/zoomable-frame/zoomable-frame.d.ts +2 -0
- package/dist/components/zoomable-frame/zoomable-frame.js +2 -0
- package/dist/copy-CvC9vaGw.d.ts +206 -0
- package/dist/copy.styles-DWGvGNTP.js +100 -0
- package/dist/data-table-CITa8DSn.js +247 -0
- package/dist/data-table-DL5RhE0d.d.ts +89 -0
- package/dist/date-CJPmOdi9.js +146 -0
- package/dist/date-DtaTBM71.d.ts +142 -0
- package/dist/decorate-DcF3lt7P.js +9 -0
- package/dist/dialog-Cx46HMaZ.js +983 -0
- package/dist/dialog-N-v0woIy.d.ts +414 -0
- package/dist/divider-9vNsfHW8.js +169 -0
- package/dist/divider-DWuAxcXv.d.ts +79 -0
- package/dist/docs/custom-elements.json +29301 -0
- package/dist/dropdown-BXSKpVX9.js +1123 -0
- package/dist/dropdown-Bo00Vlr5.d.ts +537 -0
- package/dist/dropdown-item-_lIs-Tfd.d.ts +111 -0
- package/dist/dropdown-item-i77cRuN6.js +504 -0
- package/dist/empty-result-B2ln1yFL.js +65 -0
- package/dist/empty-result-B54x_Ab2.d.ts +31 -0
- package/dist/empty-state-BLWjtKUo.js +186 -0
- package/dist/empty-state-SGKjpwp3.d.ts +117 -0
- package/dist/expander-BUev0BmM.d.ts +174 -0
- package/dist/expander-Bwvxj6Oa.js +342 -0
- package/dist/field-BEyS909F.js +163 -0
- package/dist/field-ITx0jVw-.d.ts +69 -0
- package/dist/file-input-BEumLJjg.js +841 -0
- package/dist/file-input-D2D6YC0B.d.ts +378 -0
- package/dist/filter-bar-Bj2QzEn9.d.ts +35 -0
- package/dist/filter-bar-Dcs67aXo.js +66 -0
- package/dist/form-section-BchPetkj.js +83 -0
- package/dist/form-section-xFBTBULQ.d.ts +34 -0
- package/dist/icon-BPVkNsY4.js +165 -0
- package/dist/icon-Ci9CPZJV.d.ts +72 -0
- package/dist/icon-library-D_if7p2h.d.ts +2 -0
- package/dist/include-CQHVVtNs.d.ts +103 -0
- package/dist/include-qNUh_6kT.js +155 -0
- package/dist/index.d.ts +89 -0
- package/dist/index.js +92 -0
- package/dist/infinite-scroller-BmmtnWNt.js +285 -0
- package/dist/infinite-scroller-CuUEAlB9.d.ts +174 -0
- package/dist/intersection-observer-B6TciOAQ.js +503 -0
- package/dist/intersection-observer-B7nmP7Zz.d.ts +418 -0
- package/dist/listbox-C3XXRWGX.js +1257 -0
- package/dist/listbox-DD4ujIJe.d.ts +682 -0
- package/dist/listbox-item-CwD9s3VY.js +135 -0
- package/dist/listbox-item-DQEJWp4Z.d.ts +53 -0
- package/dist/localize-322EtXNX.d.ts +66 -0
- package/dist/lorem-ipsum-B2x3V-v8.js +198 -0
- package/dist/lorem-ipsum-CR82CSuJ.d.ts +130 -0
- package/dist/meter-BC7uaJWf.d.ts +73 -0
- package/dist/meter-BIDyjwFp.js +155 -0
- package/dist/metric-CjlLq_VA.d.ts +36 -0
- package/dist/metric-DbuOcDp_.js +86 -0
- package/dist/metric-grid-C2Pb0Zl3.js +37 -0
- package/dist/metric-grid-C5Xbb1_0.d.ts +27 -0
- package/dist/mutation-observer-BmrZ-GER.d.ts +326 -0
- package/dist/mutation-observer-DS8EBuOp.js +388 -0
- package/dist/navicon-Dic5Qjzb.d.ts +159 -0
- package/dist/navicon-_yMHY27-.js +486 -0
- package/dist/number-BNtNXNF3.js +162 -0
- package/dist/number-BwbnErlB.d.ts +143 -0
- package/dist/number-field-BQHB7UYo.js +726 -0
- package/dist/number-field-odk4lKXM.d.ts +422 -0
- package/dist/pagination-6z2qcf3U.d.ts +322 -0
- package/dist/pagination-DuKPuzdb.js +679 -0
- package/dist/popover-D0sxTU6o.d.ts +259 -0
- package/dist/popover-DJBrJ0za.js +556 -0
- package/dist/preview-card-C7H1FPfd.js +287 -0
- package/dist/preview-card-DitOCZTD.d.ts +86 -0
- package/dist/progress-Db0_axHQ.d.ts +181 -0
- package/dist/progress-DzVk260j.js +494 -0
- package/dist/radio-BtDG9xJM.js +658 -0
- package/dist/radio-CieMa4zU.d.ts +460 -0
- package/dist/radio-item-DIrUStAX.js +264 -0
- package/dist/radio-item-Xq2U3cMu.d.ts +69 -0
- package/dist/random-content-BhSeJFKz.d.ts +380 -0
- package/dist/random-content-BwiirXdG.js +450 -0
- package/dist/rating-4xNsWumY.d.ts +369 -0
- package/dist/rating-C1BcJDIO.js +722 -0
- package/dist/resize-observer-BseSbVWP.d.ts +187 -0
- package/dist/resize-observer-DcrLhddo.js +236 -0
- package/dist/scroll-area-COc1857S.js +127 -0
- package/dist/scroll-area-CVYDf5qY.d.ts +61 -0
- package/dist/scroller-LYgBVyfY.js +590 -0
- package/dist/scroller-bB2rGs7b.d.ts +374 -0
- package/dist/search-list-Clmrg8EV.js +884 -0
- package/dist/search-list-n0GYO7rh.d.ts +777 -0
- package/dist/select-CkZK2jJn.d.ts +506 -0
- package/dist/select-DLIaRnA4.js +690 -0
- package/dist/selection-summary-BVnNJ8Lw.js +48 -0
- package/dist/selection-summary-DmFkGyZI.d.ts +34 -0
- package/dist/share-DPlqP2dc.d.ts +162 -0
- package/dist/share-bsgXZCl7.js +250 -0
- package/dist/sigvelo.d.ts +5 -0
- package/dist/sigvelo.js +5 -0
- package/dist/sigvelo.loader.d.ts +3 -0
- package/dist/sigvelo.loader.js +102 -0
- package/dist/slide-activator-D7bBz69E.d.ts +429 -0
- package/dist/slide-activator-DlxQt9R9.js +798 -0
- package/dist/slider-B0FVsV1o.d.ts +921 -0
- package/dist/slider-B90Il7x3.js +1744 -0
- package/dist/sparkline-CcpTaJ_Z.js +358 -0
- package/dist/sparkline-DlCIt81-.d.ts +235 -0
- package/dist/spinner-C04Dmc0H.js +188 -0
- package/dist/spinner-CZ19x_dC.d.ts +99 -0
- package/dist/splitter-DBDJAzsp.d.ts +325 -0
- package/dist/splitter-MnD4In9H.js +638 -0
- package/dist/switch-CPaEKbog.js +581 -0
- package/dist/switch-Cief9M59.d.ts +248 -0
- package/dist/tab-BcqYGsuW.d.ts +44 -0
- package/dist/tab-C-FtuNmh.js +102 -0
- package/dist/tab-list-B_Ye_Oj9.js +691 -0
- package/dist/tab-list-DDvS8qHr.d.ts +450 -0
- package/dist/tab-panel-BaBl6eep.js +60 -0
- package/dist/tab-panel-BzSJlSfd.d.ts +38 -0
- package/dist/text-area-B_mjCE9W.d.ts +327 -0
- package/dist/text-area-Czixaz-_.js +556 -0
- package/dist/text-field-BClWMp6q.d.ts +424 -0
- package/dist/text-field-inpJfp0A.js +687 -0
- package/dist/text-mask-CNKVKSFp.d.ts +336 -0
- package/dist/text-mask-DDEurj90.js +370 -0
- package/dist/themes/sigvelo.css +10 -0
- package/dist/themes/utilities.css +9 -0
- package/dist/timed-content-D2mGFamc.d.ts +181 -0
- package/dist/timed-content-pvEP4l5V.js +226 -0
- package/dist/toast-BnZaIg6Z.js +636 -0
- package/dist/toast-cEBVK9NQ.d.ts +487 -0
- package/dist/toast-item-BPpJT6vD.d.ts +159 -0
- package/dist/toast-item-IS8IFUEg.js +372 -0
- package/dist/toggle-icon-4oLDeEt4.js +752 -0
- package/dist/toggle-icon-DlwMMWZL.d.ts +359 -0
- package/dist/toggle-tag-1sfTFJtg.js +434 -0
- package/dist/toggle-tag-IVvMGT4R.d.ts +245 -0
- package/dist/toolbar-CABq0ZL1.d.ts +122 -0
- package/dist/toolbar-CEZ0-F-X.js +196 -0
- package/dist/tooltip-DbyoPFNe.js +521 -0
- package/dist/tooltip-ahFthek8.d.ts +192 -0
- package/dist/transition-group-3hnAnwSd.js +801 -0
- package/dist/transition-group-DD_CjSNC.d.ts +608 -0
- package/dist/translations/en.d.ts +6 -0
- package/dist/translations/en.js +75 -0
- package/dist/translations/es.d.ts +6 -0
- package/dist/translations/es.js +75 -0
- package/dist/types/custom-element-jsx.d.ts +13723 -0
- package/dist/utilities/icon-library.d.ts +3 -0
- package/dist/utilities/icon-library.js +93 -0
- package/dist/utilities/localize.d.ts +2 -0
- package/dist/utilities/localize.js +6 -0
- package/dist/zoomable-frame-Cldvj5sE.js +398 -0
- package/dist/zoomable-frame-r6S6587z.d.ts +162 -0
- package/package.json +83 -0
|
@@ -0,0 +1,658 @@
|
|
|
1
|
+
import { t as __decorate } from "./decorate-DcF3lt7P.js";
|
|
2
|
+
import "./radio-item-DIrUStAX.js";
|
|
3
|
+
import { css, html } from "lit";
|
|
4
|
+
import { property, query, state } from "lit/decorators.js";
|
|
5
|
+
import hostStyles from "@mcp-b/wc-support/styles/host.styles";
|
|
6
|
+
import { SigveloFormControlElement } from "@mcp-b/wc-support/base/sigvelo-element";
|
|
7
|
+
import { classMap } from "lit/directives/class-map.js";
|
|
8
|
+
import { SigveloChangeEvent, SigveloInputEvent } from "@mcp-b/wc-support/events/form";
|
|
9
|
+
import formControlStyles from "@mcp-b/wc-support/styles/form-control.styles";
|
|
10
|
+
//#region src/components/radio/radio.styles.ts
|
|
11
|
+
var radio_styles_default = css`
|
|
12
|
+
#group {
|
|
13
|
+
display: flex;
|
|
14
|
+
margin-block: 0.5rem;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
:host([orientation="horizontal"]) #group {
|
|
18
|
+
flex-wrap: wrap;
|
|
19
|
+
gap: 1.25rem;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
:host([orientation="vertical"]) #group {
|
|
23
|
+
flex-direction: column;
|
|
24
|
+
gap: 0.5rem;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
:host(:state(disabled)) #label,
|
|
28
|
+
:host(:state(disabled)) #description {
|
|
29
|
+
cursor: not-allowed;
|
|
30
|
+
opacity: 0.5;
|
|
31
|
+
}
|
|
32
|
+
`;
|
|
33
|
+
//#endregion
|
|
34
|
+
//#region src/components/radio/radio.ts
|
|
35
|
+
const nativeRadio = document.createElement("input");
|
|
36
|
+
nativeRadio.name = "sigvelo-faux-radio";
|
|
37
|
+
nativeRadio.type = "radio";
|
|
38
|
+
nativeRadio.required = true;
|
|
39
|
+
const VALIDATION_MESSAGE = nativeRadio.validationMessage;
|
|
40
|
+
/**
|
|
41
|
+
* <sigvelo-radio>
|
|
42
|
+
*
|
|
43
|
+
* @summary Allows the user to select one option from a group of choices.
|
|
44
|
+
* @tag sigvelo-radio
|
|
45
|
+
* @documentation https://design-system.sigvelo.com/docs/components/radio
|
|
46
|
+
* @status stable
|
|
47
|
+
* @since 1.0
|
|
48
|
+
*
|
|
49
|
+
* @dependency sigvelo-radio-item
|
|
50
|
+
*
|
|
51
|
+
* @slot - The radio items to place in the group.
|
|
52
|
+
* @slot label - The radio's label. For plain-text labels, you can use the `label` attribute instead.
|
|
53
|
+
* @slot description - The radios's description. For plain-text descriptions, you can use the `description`
|
|
54
|
+
* attribute instead.
|
|
55
|
+
*
|
|
56
|
+
* @event sigvelo-change - Emitted when the user commits changes to the radio's value.
|
|
57
|
+
* @event sigvelo-input - Emitted when the radio receives input.
|
|
58
|
+
*
|
|
59
|
+
* @csspart label - The element that contains the radio's label.
|
|
60
|
+
* @csspart description - The element that contains the radio's description.
|
|
61
|
+
* @csspart group - The element that wraps the grouped radios.
|
|
62
|
+
*
|
|
63
|
+
* @cssstate user-valid - Applied when the radio is valid and the user has sufficiently interacted with it.
|
|
64
|
+
* @cssstate user-invalid - Applied when the radio is invalid and the user has sufficiently interacted with it.
|
|
65
|
+
*
|
|
66
|
+
* @example Default
|
|
67
|
+
* Radios follow the ARIA APG radio group pattern for accessibility. Unlike native radio buttons, Sigvelo radio items must be placed inside a radio controller as shown below.
|
|
68
|
+
*
|
|
69
|
+
* ```html
|
|
70
|
+
* <sigvelo-radio
|
|
71
|
+
* label="Color"
|
|
72
|
+
* description="Select a color for your new cat"
|
|
73
|
+
* name="color"
|
|
74
|
+
* value="black"
|
|
75
|
+
* >
|
|
76
|
+
* <sigvelo-radio-item value="black">Black</sigvelo-radio-item>
|
|
77
|
+
* <sigvelo-radio-item value="white">White</sigvelo-radio-item>
|
|
78
|
+
* <sigvelo-radio-item value="orange">Orange</sigvelo-radio-item>
|
|
79
|
+
* <sigvelo-radio-item value="gray">Gray</sigvelo-radio-item>
|
|
80
|
+
* </sigvelo-radio>
|
|
81
|
+
* ```
|
|
82
|
+
*
|
|
83
|
+
* @example Labels and descriptions
|
|
84
|
+
* You can use the `label` and `description` attributes to provide plain text labels and descriptions for the radio. If you want to provide HTML, use the `label` and `description` slots instead.
|
|
85
|
+
*
|
|
86
|
+
* ```html
|
|
87
|
+
* <sigvelo-radio label="Favorite pet" name="animal">
|
|
88
|
+
* <span slot="description">
|
|
89
|
+
* For more information, <a href="https://example.com/" target="_blank">visit our website</a>.
|
|
90
|
+
* </span>
|
|
91
|
+
* <sigvelo-radio-item value="cat">Cat</sigvelo-radio-item>
|
|
92
|
+
* <sigvelo-radio-item value="dog">Dog</sigvelo-radio-item>
|
|
93
|
+
* <sigvelo-radio-item value="bird">Bird</sigvelo-radio-item>
|
|
94
|
+
* <sigvelo-radio-item value="lizard">Lizard</sigvelo-radio-item>
|
|
95
|
+
* </sigvelo-radio>
|
|
96
|
+
* ```
|
|
97
|
+
*
|
|
98
|
+
* @example Providing an initial value
|
|
99
|
+
* Use the `value` attribute to provide an initial value for the radio. The value should match an existing radio item's value.
|
|
100
|
+
*
|
|
101
|
+
* ```html
|
|
102
|
+
* <sigvelo-radio label="Fur type" name="fur" value="short">
|
|
103
|
+
* <sigvelo-radio-item value="short">Short</sigvelo-radio-item>
|
|
104
|
+
* <sigvelo-radio-item value="medium">Medium</sigvelo-radio-item>
|
|
105
|
+
* <sigvelo-radio-item value="long">Long</sigvelo-radio-item>
|
|
106
|
+
* <sigvelo-radio-item value="hairless">Hairless</sigvelo-radio-item>
|
|
107
|
+
* </sigvelo-radio>
|
|
108
|
+
* ```
|
|
109
|
+
*
|
|
110
|
+
* **Warning:** This behavior is different from native radios that use the `checked` attribute to set the value. With `<sigvelo-radio>`, always use the `value` attribute to set the value.
|
|
111
|
+
*
|
|
112
|
+
* @example Changing the orientation
|
|
113
|
+
* To stack radio items on top of each other instead of side by side, set the `orientation` attribute to `vertical`.
|
|
114
|
+
*
|
|
115
|
+
* ```html
|
|
116
|
+
* <sigvelo-radio orientation="vertical" label="Fur type" name="fur">
|
|
117
|
+
* <sigvelo-radio-item value="short">Short</sigvelo-radio-item>
|
|
118
|
+
* <sigvelo-radio-item value="medium">Medium</sigvelo-radio-item>
|
|
119
|
+
* <sigvelo-radio-item value="long">Long</sigvelo-radio-item>
|
|
120
|
+
* <sigvelo-radio-item value="hairless">Hairless</sigvelo-radio-item>
|
|
121
|
+
* </sigvelo-radio>
|
|
122
|
+
* ```
|
|
123
|
+
*
|
|
124
|
+
* @example Filled radios
|
|
125
|
+
* Set the `variant` attribute to `filled` to change a radio item's variant.
|
|
126
|
+
*
|
|
127
|
+
* ```html
|
|
128
|
+
* <sigvelo-radio label="Favorite pet" name="animal">
|
|
129
|
+
* <sigvelo-radio-item variant="filled" value="cat">Cat</sigvelo-radio-item>
|
|
130
|
+
* <sigvelo-radio-item variant="filled" value="dog">Dog</sigvelo-radio-item>
|
|
131
|
+
* <sigvelo-radio-item variant="filled" value="bird">Bird</sigvelo-radio-item>
|
|
132
|
+
* <sigvelo-radio-item variant="filled" value="lizard">Lizard</sigvelo-radio-item>
|
|
133
|
+
* </sigvelo-radio>
|
|
134
|
+
* ```
|
|
135
|
+
*
|
|
136
|
+
* @example Changing the size
|
|
137
|
+
* Use the `size` attribute to change a radio item's size.
|
|
138
|
+
*
|
|
139
|
+
* ```html
|
|
140
|
+
* <sigvelo-radio label="Select a size" name="size" orientation="vertical">
|
|
141
|
+
* <sigvelo-radio-item size="xs" value="a">Extra small</sigvelo-radio-item>
|
|
142
|
+
* <sigvelo-radio-item size="sm" value="b">Small</sigvelo-radio-item>
|
|
143
|
+
* <sigvelo-radio-item size="md" value="c">Medium</sigvelo-radio-item>
|
|
144
|
+
* <sigvelo-radio-item size="lg" value="d">Large</sigvelo-radio-item>
|
|
145
|
+
* <sigvelo-radio-item size="xl" value="e">Extra large</sigvelo-radio-item>
|
|
146
|
+
* </sigvelo-radio>
|
|
147
|
+
* ```
|
|
148
|
+
*
|
|
149
|
+
* @example Disabling
|
|
150
|
+
* To disable the entire control, add the `disabled` attribute to the radio element.
|
|
151
|
+
*
|
|
152
|
+
* ```html
|
|
153
|
+
* <sigvelo-radio label="Favorite pet" name="animal" disabled value="cat">
|
|
154
|
+
* <sigvelo-radio-item value="cat">Cat</sigvelo-radio-item>
|
|
155
|
+
* <sigvelo-radio-item value="dog">Dog</sigvelo-radio-item>
|
|
156
|
+
* <sigvelo-radio-item value="bird">Bird</sigvelo-radio-item>
|
|
157
|
+
* <sigvelo-radio-item value="lizard">Lizard</sigvelo-radio-item>
|
|
158
|
+
* </sigvelo-radio>
|
|
159
|
+
* ```
|
|
160
|
+
*
|
|
161
|
+
* To disable individual options, add the `disabled` attribute to one or more radio items.
|
|
162
|
+
*
|
|
163
|
+
* ```html
|
|
164
|
+
* <sigvelo-radio label="Favorite pet" name="animal" value="cat">
|
|
165
|
+
* <sigvelo-radio-item value="cat">Cat</sigvelo-radio-item>
|
|
166
|
+
* <sigvelo-radio-item value="dog" disabled>Dog</sigvelo-radio-item>
|
|
167
|
+
* <sigvelo-radio-item value="bird" disabled>Bird</sigvelo-radio-item>
|
|
168
|
+
* <sigvelo-radio-item value="lizard">Lizard</sigvelo-radio-item>
|
|
169
|
+
* </sigvelo-radio>
|
|
170
|
+
* ```
|
|
171
|
+
*
|
|
172
|
+
* @example Validation
|
|
173
|
+
* The `required` attribute can be applied to enable validation using the Constraint Validation API. This will prevent form submission until a radio item is checked.
|
|
174
|
+
*
|
|
175
|
+
* ```html
|
|
176
|
+
* <form action="about:blank" method="get" target="_blank">
|
|
177
|
+
* <sigvelo-radio label="Select one" name="animal" required>
|
|
178
|
+
* <sigvelo-radio-item value="cats">Cats</sigvelo-radio-item>
|
|
179
|
+
* <sigvelo-radio-item value="dogs">Dogs</sigvelo-radio-item>
|
|
180
|
+
* </sigvelo-radio>
|
|
181
|
+
* <br>
|
|
182
|
+
* <sigvelo-button type="submit" color="primary">Submit</sigvelo-button>
|
|
183
|
+
* <sigvelo-button type="reset">Reset</sigvelo-button>
|
|
184
|
+
* </form>
|
|
185
|
+
* ```
|
|
186
|
+
*
|
|
187
|
+
* @example Using custom validation
|
|
188
|
+
* Use the `setCustomValidity()` method to make the radio invalid and show a custom error message on submit. This will override all other validation parameters. To clear the error, remove the attribute or set it to an empty string.
|
|
189
|
+
*
|
|
190
|
+
* ```html
|
|
191
|
+
* <form action="about:blank" method="get" target="_blank" id="radio__custom-validation">
|
|
192
|
+
* <sigvelo-radio label="Select one" name="animal">
|
|
193
|
+
* <sigvelo-radio-item value="cats">Cats</sigvelo-radio-item>
|
|
194
|
+
* <sigvelo-radio-item value="dogs">Dogs</sigvelo-radio-item>
|
|
195
|
+
* </sigvelo-radio>
|
|
196
|
+
* <br>
|
|
197
|
+
* <sigvelo-button type="submit" color="primary">Submit</sigvelo-button>
|
|
198
|
+
* <sigvelo-button type="reset">Reset</sigvelo-button>
|
|
199
|
+
* </form>
|
|
200
|
+
*
|
|
201
|
+
* <script type="module">
|
|
202
|
+
* import { allDefined } from '/dist/sigvelo.js';
|
|
203
|
+
*
|
|
204
|
+
* await allDefined();
|
|
205
|
+
*
|
|
206
|
+
* const form = document.getElementById('radio__custom-validation');
|
|
207
|
+
* const radio = form.querySelector('sigvelo-radio');
|
|
208
|
+
*
|
|
209
|
+
* radio.setCustomValidity('Not so fast, bubba!');
|
|
210
|
+
* <\/script>
|
|
211
|
+
* ```
|
|
212
|
+
*
|
|
213
|
+
* @example Styling validation
|
|
214
|
+
* You can style valid and invalid radios using the `:valid` and `:invalid` pseudo classes.
|
|
215
|
+
*
|
|
216
|
+
* ```html
|
|
217
|
+
* <form action="about:blank" method="get" target="_blank" class="radio__validation-pseudo">
|
|
218
|
+
* <sigvelo-radio label="Select one" name="animal" required>
|
|
219
|
+
* <sigvelo-radio-item value="cats">Cats</sigvelo-radio-item>
|
|
220
|
+
* <sigvelo-radio-item value="dogs">Dogs</sigvelo-radio-item>
|
|
221
|
+
* </sigvelo-radio>
|
|
222
|
+
* <br>
|
|
223
|
+
* <sigvelo-button type="submit" color="primary">Submit</sigvelo-button>
|
|
224
|
+
* <sigvelo-button type="reset">Reset</sigvelo-button>
|
|
225
|
+
* </form>
|
|
226
|
+
*
|
|
227
|
+
* <style>
|
|
228
|
+
* .radio__validation-pseudo {
|
|
229
|
+
* sigvelo-radio:valid {
|
|
230
|
+
* outline: solid 2px var(--sigvelo-color-success-border);
|
|
231
|
+
* outline-offset: .5rem;
|
|
232
|
+
* }
|
|
233
|
+
*
|
|
234
|
+
* sigvelo-radio:invalid {
|
|
235
|
+
* outline: solid 2px var(--sigvelo-color-danger-border);
|
|
236
|
+
* outline-offset: .5rem;
|
|
237
|
+
* }
|
|
238
|
+
* }
|
|
239
|
+
* </style>
|
|
240
|
+
* ```
|
|
241
|
+
*
|
|
242
|
+
* However, these selectors will match even before the user has had a chance to fill out the form. More often than not, you'll want to use the `user-valid` and `user-invalid` custom states instead. This way, validation styles are only shown _after_ the user interacts with the form control or when the form is submitted.
|
|
243
|
+
*
|
|
244
|
+
* ```html
|
|
245
|
+
* <form action="about:blank" method="get" target="_blank" class="radio__validation-custom">
|
|
246
|
+
* <sigvelo-radio label="Select one" name="animal" required>
|
|
247
|
+
* <sigvelo-radio-item value="cats">Cats</sigvelo-radio-item>
|
|
248
|
+
* <sigvelo-radio-item value="dogs">Dogs</sigvelo-radio-item>
|
|
249
|
+
* </sigvelo-radio>
|
|
250
|
+
* <br>
|
|
251
|
+
* <sigvelo-button type="submit" color="primary">Submit</sigvelo-button>
|
|
252
|
+
* <sigvelo-button type="reset">Reset</sigvelo-button>
|
|
253
|
+
* </form>
|
|
254
|
+
*
|
|
255
|
+
* <style>
|
|
256
|
+
* .radio__validation-custom {
|
|
257
|
+
* sigvelo-radio:state(user-valid) {
|
|
258
|
+
* outline: solid 2px var(--sigvelo-color-success-border);
|
|
259
|
+
* outline-offset: .5rem;
|
|
260
|
+
* }
|
|
261
|
+
*
|
|
262
|
+
* sigvelo-radio:state(user-invalid) {
|
|
263
|
+
* outline: solid 2px var(--sigvelo-color-danger-border);
|
|
264
|
+
* outline-offset: .5rem;
|
|
265
|
+
* }
|
|
266
|
+
* }
|
|
267
|
+
* </style>
|
|
268
|
+
* ```
|
|
269
|
+
*
|
|
270
|
+
* @example Styling radios
|
|
271
|
+
* Radios come with a simple, minimal appearance. Feel free to customize them with your own styles. Here are some examples, for inspiration.
|
|
272
|
+
*
|
|
273
|
+
* ```html
|
|
274
|
+
* <sigvelo-radio label="How would you like to login?" name="auth" class="radio__auth">
|
|
275
|
+
* <sigvelo-radio-item value="magic">
|
|
276
|
+
* <sigvelo-icon name="wand"></sigvelo-icon> Magic link
|
|
277
|
+
* </sigvelo-radio-item>
|
|
278
|
+
* <sigvelo-radio-item value="password">
|
|
279
|
+
* <sigvelo-icon name="password"></sigvelo-icon> Password
|
|
280
|
+
* </sigvelo-radio-item>
|
|
281
|
+
* </sigvelo-radio>
|
|
282
|
+
*
|
|
283
|
+
* <style>
|
|
284
|
+
* .radio__auth {
|
|
285
|
+
* sigvelo-radio-item {
|
|
286
|
+
* background: var(--sigvelo-color-surface);
|
|
287
|
+
* border: solid 1px var(--sigvelo-color-neutral-border-muted);
|
|
288
|
+
* border-radius: .5rem;
|
|
289
|
+
* box-shadow: var(--sigvelo-elevation-hairline);
|
|
290
|
+
* padding: 1rem;
|
|
291
|
+
* cursor: pointer;
|
|
292
|
+
* }
|
|
293
|
+
*
|
|
294
|
+
* sigvelo-radio-item:state(checked) {
|
|
295
|
+
* background-color: var(--sigvelo-color-primary-bg-subtle);
|
|
296
|
+
* border-color: var(--sigvelo-color-primary-border-muted);
|
|
297
|
+
* }
|
|
298
|
+
*
|
|
299
|
+
* sigvelo-radio-item:focus-visible {
|
|
300
|
+
* outline: var(--sigvelo-focus-ring);
|
|
301
|
+
* outline-offset: var(--sigvelo-focus-offset);
|
|
302
|
+
* }
|
|
303
|
+
* }
|
|
304
|
+
* </style>
|
|
305
|
+
* ```
|
|
306
|
+
*
|
|
307
|
+
* ```html
|
|
308
|
+
* <sigvelo-radio
|
|
309
|
+
* label="Select a plan"
|
|
310
|
+
* description="All plans come with a free cat"
|
|
311
|
+
* name="plan"
|
|
312
|
+
* class="radio__hosting"
|
|
313
|
+
* >
|
|
314
|
+
* <sigvelo-radio-item value="startup">
|
|
315
|
+
* Startup<br>
|
|
316
|
+
* <small>12GB · 6 CPUs · 256GB SSD</small>
|
|
317
|
+
* </sigvelo-radio-item>
|
|
318
|
+
*
|
|
319
|
+
* <sigvelo-radio-item value="business">
|
|
320
|
+
* Business<br>
|
|
321
|
+
* <small>16GB · 8 CPUs · 512GB SSD</small>
|
|
322
|
+
* </sigvelo-radio-item>
|
|
323
|
+
*
|
|
324
|
+
* <sigvelo-radio-item value="enterprise">
|
|
325
|
+
* Enterprise<br>
|
|
326
|
+
* <small>32GB · 12 CPUs · 1TB SSD</small>
|
|
327
|
+
* </sigvelo-radio-item>
|
|
328
|
+
* </sigvelo-radio>
|
|
329
|
+
*
|
|
330
|
+
* <style>
|
|
331
|
+
* .radio__hosting {
|
|
332
|
+
* sigvelo-radio-item {
|
|
333
|
+
* position: relative;
|
|
334
|
+
* width: 100%;
|
|
335
|
+
* background: var(--sigvelo-color-surface);
|
|
336
|
+
* border: solid 1px var(--sigvelo-color-neutral-border-muted);
|
|
337
|
+
* box-shadow: var(--sigvelo-elevation-hairline);
|
|
338
|
+
* border-radius: .5rem;
|
|
339
|
+
* padding: 1rem;
|
|
340
|
+
* }
|
|
341
|
+
*
|
|
342
|
+
* sigvelo-radio-item::part(label) {
|
|
343
|
+
* width: 100%;
|
|
344
|
+
* display: block;
|
|
345
|
+
* }
|
|
346
|
+
*
|
|
347
|
+
* sigvelo-radio-item::part(visual-box) {
|
|
348
|
+
* position: absolute;
|
|
349
|
+
* top: calc(50% - .625rem);
|
|
350
|
+
* right: 1rem;
|
|
351
|
+
* }
|
|
352
|
+
*
|
|
353
|
+
* sigvelo-radio-item:state(checked) {
|
|
354
|
+
* background-color: var(--sigvelo-color-primary-bg-subtle);
|
|
355
|
+
* border-color: var(--sigvelo-color-primary-border-muted);
|
|
356
|
+
* }
|
|
357
|
+
*
|
|
358
|
+
* sigvelo-radio-item:focus-visible {
|
|
359
|
+
* outline: var(--sigvelo-focus-ring);
|
|
360
|
+
* outline-offset: 2px;
|
|
361
|
+
* }
|
|
362
|
+
*
|
|
363
|
+
* small {
|
|
364
|
+
* color: var(--sigvelo-color-text-muted);
|
|
365
|
+
* }
|
|
366
|
+
* }
|
|
367
|
+
* </style>
|
|
368
|
+
* ```
|
|
369
|
+
*
|
|
370
|
+
* ```html
|
|
371
|
+
* <sigvelo-radio
|
|
372
|
+
* label="Color"
|
|
373
|
+
* description="Choose a color for your new device"
|
|
374
|
+
* name="color"
|
|
375
|
+
* class="radio__colors"
|
|
376
|
+
* >
|
|
377
|
+
* <sigvelo-radio-item value="silver" style="color: #b6b9c9;">Silver</sigvelo-radio-item>
|
|
378
|
+
* <sigvelo-radio-item value="blue" style="color: #83c0f5;">Blue</sigvelo-radio-item>
|
|
379
|
+
* <sigvelo-radio-item value="rose" style="color: #eea3bb;">Rose</sigvelo-radio-item>
|
|
380
|
+
* <sigvelo-radio-item value="gold" style="color: #d1b86c;">Gold</sigvelo-radio-item>
|
|
381
|
+
* </sigvelo-radio>
|
|
382
|
+
*
|
|
383
|
+
* <style>
|
|
384
|
+
* .radio__colors {
|
|
385
|
+
* &::part(group) {
|
|
386
|
+
* gap: .5rem;
|
|
387
|
+
* }
|
|
388
|
+
*
|
|
389
|
+
* sigvelo-radio-item {
|
|
390
|
+
* width: 3rem;
|
|
391
|
+
* height: 3rem;
|
|
392
|
+
* background-color: currentColor;
|
|
393
|
+
* background-image: linear-gradient(#fff8, transparent);
|
|
394
|
+
* box-shadow: inset 0 1px 2px color-mix(in oklab, currentColor, black 12.5%);
|
|
395
|
+
* border-radius: var(--sigvelo-radius-circle);
|
|
396
|
+
* cursor: pointer;
|
|
397
|
+
* }
|
|
398
|
+
*
|
|
399
|
+
* sigvelo-radio-item:state(checked) {
|
|
400
|
+
* outline: var(--sigvelo-border-style) var(--sigvelo-focus-width) currentColor;
|
|
401
|
+
* outline-offset: 2px;
|
|
402
|
+
* }
|
|
403
|
+
*
|
|
404
|
+
* sigvelo-radio-item:focus-visible {
|
|
405
|
+
* outline: var(--sigvelo-focus-ring);
|
|
406
|
+
* outline-offset: 2px;
|
|
407
|
+
* }
|
|
408
|
+
*
|
|
409
|
+
* sigvelo-radio-item::part(label) {
|
|
410
|
+
* position: absolute;
|
|
411
|
+
* width: 1px;
|
|
412
|
+
* height: 1px;
|
|
413
|
+
* overflow: hidden;
|
|
414
|
+
* white-space: nowrap;
|
|
415
|
+
* clip-path: inset(50%);
|
|
416
|
+
* }
|
|
417
|
+
* }
|
|
418
|
+
* </style>
|
|
419
|
+
* ```
|
|
420
|
+
*
|
|
421
|
+
* **Warning:** It's not recommended to hide the radio button unless your styles make it very clear to users that the control is selectable.
|
|
422
|
+
*/
|
|
423
|
+
var SigveloRadio = class extends SigveloFormControlElement {
|
|
424
|
+
constructor(..._args) {
|
|
425
|
+
super(..._args);
|
|
426
|
+
this.isInvalid = false;
|
|
427
|
+
this.hadUserInteraction = false;
|
|
428
|
+
this.wasSubmitted = false;
|
|
429
|
+
this.value = "";
|
|
430
|
+
this.orientation = "horizontal";
|
|
431
|
+
this.required = false;
|
|
432
|
+
this.disabled = false;
|
|
433
|
+
}
|
|
434
|
+
static {
|
|
435
|
+
this.formAssociated = true;
|
|
436
|
+
}
|
|
437
|
+
static {
|
|
438
|
+
this.observeSlots = true;
|
|
439
|
+
}
|
|
440
|
+
static {
|
|
441
|
+
this.styles = [
|
|
442
|
+
hostStyles,
|
|
443
|
+
formControlStyles,
|
|
444
|
+
radio_styles_default
|
|
445
|
+
];
|
|
446
|
+
}
|
|
447
|
+
get focusableAnchor() {
|
|
448
|
+
return this.getItems()[0];
|
|
449
|
+
}
|
|
450
|
+
connectedCallback() {
|
|
451
|
+
super.connectedCallback();
|
|
452
|
+
this.addEventListener("invalid", this.handleHostInvalid);
|
|
453
|
+
}
|
|
454
|
+
disconnectedCallback() {
|
|
455
|
+
super.disconnectedCallback();
|
|
456
|
+
this.removeEventListener("invalid", this.handleHostInvalid);
|
|
457
|
+
}
|
|
458
|
+
firstUpdated() {
|
|
459
|
+
if (this.value) {
|
|
460
|
+
const selectedItem = this.getSelectedItem({ includeDisabled: true });
|
|
461
|
+
if (selectedItem) this.setSelectedItem(selectedItem);
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
updated(changedProperties) {
|
|
465
|
+
this.updateValidity();
|
|
466
|
+
if (changedProperties.has("value")) this.internals.setFormValue(this.value);
|
|
467
|
+
if (changedProperties.has("disabled")) {
|
|
468
|
+
this.customStates.set("disabled", this.disabled);
|
|
469
|
+
this.updateControllerDisabledState();
|
|
470
|
+
}
|
|
471
|
+
if (this.hadUserInteraction || this.wasSubmitted) {
|
|
472
|
+
this.customStates.set("user-invalid", this.isInvalid);
|
|
473
|
+
this.customStates.set("user-valid", !this.isInvalid);
|
|
474
|
+
} else {
|
|
475
|
+
this.customStates.set("user-invalid", false);
|
|
476
|
+
this.customStates.set("user-valid", false);
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
/** @internal Called when a containing fieldset is disabled. */
|
|
480
|
+
formDisabledCallback(isDisabled) {
|
|
481
|
+
this.getItems({ includeDisabled: true }).forEach((item) => item.disabledByController = isDisabled);
|
|
482
|
+
}
|
|
483
|
+
/** @internal Called when the form is reset. */
|
|
484
|
+
formResetCallback() {
|
|
485
|
+
this.isInvalid = false;
|
|
486
|
+
this.hadUserInteraction = false;
|
|
487
|
+
this.wasSubmitted = false;
|
|
488
|
+
const itemToSelect = this.getItems().find((item) => item.getAttribute("value") === this.getAttribute("value"));
|
|
489
|
+
if (itemToSelect) this.setSelectedItem(itemToSelect);
|
|
490
|
+
else this.setSelectedItem(null);
|
|
491
|
+
}
|
|
492
|
+
/** Gets an array of radio items slotted into the radio. */
|
|
493
|
+
getItems(options) {
|
|
494
|
+
if (options?.includeDisabled) return [...this.querySelectorAll("sigvelo-radio-item")];
|
|
495
|
+
else return [...this.querySelectorAll("sigvelo-radio-item:not(:state(disabled))")];
|
|
496
|
+
}
|
|
497
|
+
handleHostInvalid() {
|
|
498
|
+
this.wasSubmitted = true;
|
|
499
|
+
}
|
|
500
|
+
async handleGroupClick(event) {
|
|
501
|
+
const selectedItem = this.getSelectedItem();
|
|
502
|
+
const radioItem = event.target.closest("sigvelo-radio-item");
|
|
503
|
+
if (radioItem && !radioItem.disabled && !radioItem.disabledByController) {
|
|
504
|
+
this.setSelectedItem(radioItem);
|
|
505
|
+
this.hadUserInteraction = true;
|
|
506
|
+
if (radioItem !== selectedItem) {
|
|
507
|
+
await this.updateComplete;
|
|
508
|
+
this.dispatchEvent(new SigveloInputEvent());
|
|
509
|
+
this.dispatchEvent(new InputEvent("input"));
|
|
510
|
+
this.dispatchEvent(new SigveloChangeEvent());
|
|
511
|
+
this.dispatchEvent(new Event("change", {
|
|
512
|
+
bubbles: true,
|
|
513
|
+
composed: true
|
|
514
|
+
}));
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
async handleGroupKeyDown(event) {
|
|
519
|
+
const target = event.target.closest("sigvelo-radio-item");
|
|
520
|
+
const radioItems = this.getItems();
|
|
521
|
+
const currentIndex = radioItems.findIndex((item) => item.tabIndex === 0) || 0;
|
|
522
|
+
let itemToSelect;
|
|
523
|
+
if (event.key === "ArrowLeft" || event.key === "ArrowUp") itemToSelect = radioItems[currentIndex <= 0 ? radioItems.length - 1 : currentIndex - 1];
|
|
524
|
+
if (event.key === "ArrowRight" || event.key === "ArrowDown") itemToSelect = radioItems[currentIndex >= radioItems.length - 1 ? 0 : currentIndex + 1];
|
|
525
|
+
if (event.key === "Home") itemToSelect = radioItems[0];
|
|
526
|
+
if (event.key === "End") itemToSelect = radioItems[radioItems.length - 1];
|
|
527
|
+
if (event.key === " " && target) itemToSelect = target;
|
|
528
|
+
if (itemToSelect) {
|
|
529
|
+
event.preventDefault();
|
|
530
|
+
this.setSelectedItem(itemToSelect);
|
|
531
|
+
itemToSelect.focus();
|
|
532
|
+
this.hadUserInteraction = true;
|
|
533
|
+
await this.updateComplete;
|
|
534
|
+
this.dispatchEvent(new SigveloInputEvent());
|
|
535
|
+
this.dispatchEvent(new InputEvent("input"));
|
|
536
|
+
this.dispatchEvent(new SigveloChangeEvent());
|
|
537
|
+
this.dispatchEvent(new Event("change", {
|
|
538
|
+
bubbles: true,
|
|
539
|
+
composed: true
|
|
540
|
+
}));
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
/**
|
|
544
|
+
* @internal Makes only the selected radio item tabbable. If no radio item is selected, the first non-disabled radio
|
|
545
|
+
* item will be tabbable.
|
|
546
|
+
*/
|
|
547
|
+
resetRovingTabIndex() {
|
|
548
|
+
const radioItems = this.getItems({ includeDisabled: true });
|
|
549
|
+
const selectedItem = this.getSelectedItem({ includeDisabled: true });
|
|
550
|
+
const selectedItemIndex = radioItems.findIndex((item) => item === selectedItem);
|
|
551
|
+
const targetIndex = selectedItemIndex > -1 ? selectedItemIndex : 0;
|
|
552
|
+
radioItems.forEach((item, index) => {
|
|
553
|
+
if (this.disabled) item.tabIndex = -1;
|
|
554
|
+
else item.tabIndex = index === targetIndex ? 0 : -1;
|
|
555
|
+
});
|
|
556
|
+
}
|
|
557
|
+
/** Gets the selected item. */
|
|
558
|
+
getSelectedItem(options) {
|
|
559
|
+
return this.getItems(options).find((item) => item.value === this.value) || null;
|
|
560
|
+
}
|
|
561
|
+
/**
|
|
562
|
+
* Sets the selected item and updates the roving tab index. If `null` is provided, the selection will be cleared and
|
|
563
|
+
* the tab index will go to the first radio item.
|
|
564
|
+
*/
|
|
565
|
+
setSelectedItem(selectedItem) {
|
|
566
|
+
const radioItems = this.getItems({ includeDisabled: true });
|
|
567
|
+
if (selectedItem) {
|
|
568
|
+
radioItems.forEach((item) => {
|
|
569
|
+
item.checked = item === selectedItem;
|
|
570
|
+
item.tabIndex = item === selectedItem ? 0 : -1;
|
|
571
|
+
});
|
|
572
|
+
this.value = selectedItem.value;
|
|
573
|
+
} else if (!selectedItem) {
|
|
574
|
+
radioItems.forEach((item) => {
|
|
575
|
+
item.checked = false;
|
|
576
|
+
item.tabIndex = -1;
|
|
577
|
+
});
|
|
578
|
+
radioItems[0].tabIndex = 0;
|
|
579
|
+
this.value = "";
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
/** Updates the controller disabled state for all radio items */
|
|
583
|
+
updateControllerDisabledState() {
|
|
584
|
+
this.getItems({ includeDisabled: true }).forEach((item) => item.disabledByController = this.disabled);
|
|
585
|
+
requestAnimationFrame(() => this.resetRovingTabIndex());
|
|
586
|
+
}
|
|
587
|
+
/** Sets the form control's validity */
|
|
588
|
+
async updateValidity() {
|
|
589
|
+
await this.updateComplete;
|
|
590
|
+
const hasCustomValidity = this.getCustomValidity().length > 0;
|
|
591
|
+
const hasMissingValue = this.required && !this.value;
|
|
592
|
+
const validationMessage = hasCustomValidity ? this.getCustomValidity() : VALIDATION_MESSAGE;
|
|
593
|
+
const flags = {
|
|
594
|
+
customError: hasCustomValidity,
|
|
595
|
+
valueMissing: hasMissingValue
|
|
596
|
+
};
|
|
597
|
+
this.isInvalid = hasCustomValidity ? true : hasMissingValue;
|
|
598
|
+
this.internals.setValidity(flags, validationMessage, this.focusableAnchor);
|
|
599
|
+
}
|
|
600
|
+
/** Sets focus to the selected item or the first item if none are selected. */
|
|
601
|
+
focus(options) {
|
|
602
|
+
const items = this.getItems();
|
|
603
|
+
const itemToFocus = items.find((item) => item.checked) || items[0];
|
|
604
|
+
if (itemToFocus) itemToFocus.focus(options);
|
|
605
|
+
}
|
|
606
|
+
render() {
|
|
607
|
+
const hasLabel = this.label || this.slotsWithContent.has("label");
|
|
608
|
+
const hasDescription = this.description || this.slotsWithContent.has("description");
|
|
609
|
+
return html`
|
|
610
|
+
<label
|
|
611
|
+
id="label"
|
|
612
|
+
part="label"
|
|
613
|
+
for="text-box"
|
|
614
|
+
class=${classMap({ vh: !hasLabel })}
|
|
615
|
+
@click=${this.focus}
|
|
616
|
+
>
|
|
617
|
+
<slot name="label">${this.label}</slot>
|
|
618
|
+
</label>
|
|
619
|
+
|
|
620
|
+
<div id="description" part="description" class=${classMap({ vh: !hasDescription })}>
|
|
621
|
+
<slot name="description">${this.description}</slot>
|
|
622
|
+
</div>
|
|
623
|
+
|
|
624
|
+
<div
|
|
625
|
+
id="group"
|
|
626
|
+
part="group"
|
|
627
|
+
role="radiogroup"
|
|
628
|
+
aria-labelledby="label"
|
|
629
|
+
aria-describedby="description"
|
|
630
|
+
@click=${this.handleGroupClick}
|
|
631
|
+
@keydown=${this.handleGroupKeyDown}
|
|
632
|
+
>
|
|
633
|
+
<slot @slotchange=${this.resetRovingTabIndex}></slot>
|
|
634
|
+
</div>
|
|
635
|
+
`;
|
|
636
|
+
}
|
|
637
|
+
};
|
|
638
|
+
__decorate([query("#group")], SigveloRadio.prototype, "group", void 0);
|
|
639
|
+
__decorate([state()], SigveloRadio.prototype, "isInvalid", void 0);
|
|
640
|
+
__decorate([state()], SigveloRadio.prototype, "hadUserInteraction", void 0);
|
|
641
|
+
__decorate([state()], SigveloRadio.prototype, "wasSubmitted", void 0);
|
|
642
|
+
__decorate([property()], SigveloRadio.prototype, "label", void 0);
|
|
643
|
+
__decorate([property()], SigveloRadio.prototype, "description", void 0);
|
|
644
|
+
__decorate([property({ reflect: true })], SigveloRadio.prototype, "name", void 0);
|
|
645
|
+
__decorate([property()], SigveloRadio.prototype, "value", void 0);
|
|
646
|
+
__decorate([property({ reflect: true })], SigveloRadio.prototype, "orientation", void 0);
|
|
647
|
+
__decorate([property()], SigveloRadio.prototype, "form", void 0);
|
|
648
|
+
__decorate([property({
|
|
649
|
+
type: Boolean,
|
|
650
|
+
reflect: true
|
|
651
|
+
})], SigveloRadio.prototype, "required", void 0);
|
|
652
|
+
__decorate([property({
|
|
653
|
+
type: Boolean,
|
|
654
|
+
reflect: true
|
|
655
|
+
})], SigveloRadio.prototype, "disabled", void 0);
|
|
656
|
+
customElements.define("sigvelo-radio", SigveloRadio);
|
|
657
|
+
//#endregion
|
|
658
|
+
export { SigveloRadio as t };
|