@boostdev/design-system-components 2.8.0 → 2.11.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/AGENTS.md +54 -46
- package/README.md +34 -20
- package/dist/client.cjs +1317 -779
- package/dist/client.css +1029 -812
- package/dist/client.d.cts +88 -26
- package/dist/client.d.ts +88 -26
- package/dist/client.js +1278 -732
- package/dist/index.cjs +1317 -779
- package/dist/index.css +1029 -812
- package/dist/index.d.cts +88 -26
- package/dist/index.d.ts +88 -26
- package/dist/index.js +1278 -732
- package/dist/web-components/chunk-2OLVQUBU.js +193 -0
- package/dist/web-components/{chunk-OF6FFGOT.js → chunk-3AY2YKCM.js} +77 -21
- package/dist/web-components/chunk-3WAV6MDN.js +212 -0
- package/dist/web-components/{chunk-UUKSDCYS.js → chunk-47AT5KZD.js} +87 -15
- package/dist/web-components/chunk-4A2YYTYN.js +93 -0
- package/dist/web-components/{chunk-Q4T5BJT6.js → chunk-62NK3ZSC.js} +18 -3
- package/dist/web-components/chunk-66M6ETWD.js +77 -0
- package/dist/web-components/{chunk-NCPQ7AF3.js → chunk-6G22I2CK.js} +18 -3
- package/dist/web-components/{chunk-QDST57JC.js → chunk-7ZOJ7N4E.js} +14 -4
- package/dist/web-components/{chunk-QLT6MTZF.js → chunk-AIBOHNDU.js} +10 -0
- package/dist/web-components/{chunk-X3NQMBAQ.js → chunk-AP4RDUL2.js} +14 -3
- package/dist/web-components/{chunk-QWPACK5L.js → chunk-BPYKZVDK.js} +11 -1
- package/dist/web-components/{chunk-YLVTEY23.js → chunk-BTCMJQKB.js} +53 -21
- package/dist/web-components/chunk-CUKQ2L5B.js +245 -0
- package/dist/web-components/chunk-DIZDCL7Z.js +14 -0
- package/dist/web-components/{chunk-PC3IOQAH.js → chunk-DV5T43ZC.js} +27 -7
- package/dist/web-components/{chunk-2QA62WCQ.js → chunk-EF7IVYTY.js} +10 -0
- package/dist/web-components/{chunk-L3XHOMN6.js → chunk-F3ZDNHZZ.js} +26 -1
- package/dist/web-components/chunk-FEDABOR5.js +248 -0
- package/dist/web-components/{chunk-6I2DBFQ7.js → chunk-HGFCJXOQ.js} +36 -5
- package/dist/web-components/{chunk-SOQQ7RVJ.js → chunk-IPGHUCJT.js} +23 -8
- package/dist/web-components/chunk-ITD2MV5K.js +392 -0
- package/dist/web-components/{chunk-ARMKC4BQ.js → chunk-JH6LQKLK.js} +77 -5
- package/dist/web-components/chunk-JMCXAAFK.js +120 -0
- package/dist/web-components/{chunk-KUI55GFB.js → chunk-JUPCZVVW.js} +50 -18
- package/dist/web-components/chunk-JV5QT2OU.js +146 -0
- package/dist/web-components/{chunk-3GFWLSLS.js → chunk-KA3VPKMY.js} +29 -6
- package/dist/web-components/{chunk-CR5PGUHV.js → chunk-KJGRFDFI.js} +26 -11
- package/dist/web-components/{chunk-PY62FTRW.js → chunk-KZPRFY5P.js} +68 -33
- package/dist/web-components/{chunk-X46KL5BK.js → chunk-LDIPCTRN.js} +18 -1
- package/dist/web-components/chunk-M3ECULRH.js +174 -0
- package/dist/web-components/chunk-NBN2ENWJ.js +90 -0
- package/dist/web-components/chunk-NIN3JO6Q.js +189 -0
- package/dist/web-components/{chunk-2FGATTGT.js → chunk-NTQ4TCUT.js} +76 -55
- package/dist/web-components/chunk-OY74D4X6.js +302 -0
- package/dist/web-components/{chunk-3S42DZ7W.js → chunk-P24JYC5V.js} +7 -0
- package/dist/web-components/{chunk-BKIHQYJR.js → chunk-PXPPKCLT.js} +17 -2
- package/dist/web-components/{chunk-TQ7IQ4GZ.js → chunk-QEF2IRID.js} +71 -29
- package/dist/web-components/chunk-QZAIRJ75.js +111 -0
- package/dist/web-components/{chunk-6I3CFC26.js → chunk-RSZ3BWBK.js} +20 -5
- package/dist/web-components/chunk-RVF7W653.js +101 -0
- package/dist/web-components/chunk-SEO2F5KJ.js +234 -0
- package/dist/web-components/{chunk-VMMVWLXL.js → chunk-SFZ6Q4BP.js} +10 -0
- package/dist/web-components/{chunk-LY62SAVN.js → chunk-SYNLFKD3.js} +12 -2
- package/dist/web-components/chunk-TMWXRHGF.js +192 -0
- package/dist/web-components/{chunk-65JXQOBA.js → chunk-U3YZE6R6.js} +51 -7
- package/dist/web-components/chunk-UO7ROSHD.js +424 -0
- package/dist/web-components/chunk-VANAKB6D.js +152 -0
- package/dist/web-components/{chunk-PXZWYO6Z.js → chunk-VED2DFJ6.js} +108 -29
- package/dist/web-components/chunk-W6H5ID2U.js +161 -0
- package/dist/web-components/{chunk-FSZRP43R.js → chunk-WFVKU4GX.js} +21 -10
- package/dist/web-components/{chunk-OQTRTMAB.js → chunk-WIBAN7KP.js} +10 -0
- package/dist/web-components/chunk-XI7KRAH7.js +54 -0
- package/dist/web-components/{chunk-ORC56MDY.js → chunk-XIZWAWMJ.js} +45 -6
- package/dist/web-components/{chunk-FXURM6D5.js → chunk-YFAXGRPR.js} +10 -0
- package/dist/web-components/globals.js +1 -1
- package/dist/web-components/index.d.ts +77 -707
- package/dist/web-components/index.js +339 -2066
- package/dist/web-components/interaction/bds-accordion-item.js +1 -1
- package/dist/web-components/interaction/bds-accordion.js +1 -1
- package/dist/web-components/interaction/bds-button.d.ts +10 -2
- package/dist/web-components/interaction/bds-button.js +1 -1
- package/dist/web-components/interaction/bds-collapsible.d.ts +7 -2
- package/dist/web-components/interaction/bds-collapsible.js +1 -1
- package/dist/web-components/interaction/bds-dialog.d.ts +11 -3
- package/dist/web-components/interaction/bds-dialog.js +1 -1
- package/dist/web-components/interaction/bds-drawer.d.ts +7 -1
- package/dist/web-components/interaction/bds-drawer.js +1 -1
- package/dist/web-components/interaction/bds-dropdown-menu-item.d.ts +51 -0
- package/dist/web-components/interaction/bds-dropdown-menu-item.js +7 -0
- package/dist/web-components/interaction/bds-dropdown-menu.d.ts +70 -0
- package/dist/web-components/interaction/bds-dropdown-menu.js +7 -0
- package/dist/web-components/interaction/bds-popover.d.ts +14 -3
- package/dist/web-components/interaction/bds-popover.js +1 -1
- package/dist/web-components/interaction/bds-skip-link.js +1 -1
- package/dist/web-components/interaction/bds-tab-panel.js +1 -1
- package/dist/web-components/interaction/bds-tab.js +1 -1
- package/dist/web-components/interaction/bds-tabs.d.ts +1 -0
- package/dist/web-components/interaction/bds-tabs.js +1 -1
- package/dist/web-components/interaction/bds-toast-provider.js +1 -1
- package/dist/web-components/interaction/bds-tooltip.d.ts +19 -3
- package/dist/web-components/interaction/bds-tooltip.js +1 -1
- package/dist/web-components/interaction/form/bds-checkbox-group.d.ts +83 -0
- package/dist/web-components/interaction/form/bds-checkbox-group.js +7 -0
- package/dist/web-components/interaction/form/bds-checkbox.d.ts +6 -0
- package/dist/web-components/interaction/form/bds-checkbox.js +1 -1
- package/dist/web-components/interaction/form/bds-combobox.d.ts +18 -0
- package/dist/web-components/interaction/form/bds-combobox.js +1 -1
- package/dist/web-components/interaction/form/bds-field-group.d.ts +89 -0
- package/dist/web-components/interaction/form/bds-field-group.js +7 -0
- package/dist/web-components/interaction/form/bds-file-input.d.ts +1 -1
- package/dist/web-components/interaction/form/bds-file-input.js +1 -1
- package/dist/web-components/interaction/form/bds-form-input.d.ts +92 -0
- package/dist/web-components/interaction/form/bds-form-input.js +7 -0
- package/dist/web-components/interaction/form/bds-number-input.d.ts +18 -1
- package/dist/web-components/interaction/form/bds-number-input.js +1 -1
- package/dist/web-components/interaction/form/bds-radio-group.d.ts +81 -0
- package/dist/web-components/interaction/form/bds-radio-group.js +7 -0
- package/dist/web-components/interaction/form/bds-radio.d.ts +34 -6
- package/dist/web-components/interaction/form/bds-radio.js +1 -1
- package/dist/web-components/interaction/form/bds-segmented-control.d.ts +4 -4
- package/dist/web-components/interaction/form/bds-segmented-control.js +1 -1
- package/dist/web-components/interaction/form/bds-select.d.ts +22 -1
- package/dist/web-components/interaction/form/bds-select.js +1 -1
- package/dist/web-components/interaction/form/bds-slider.d.ts +42 -10
- package/dist/web-components/interaction/form/bds-slider.js +1 -1
- package/dist/web-components/interaction/form/bds-switch.d.ts +20 -0
- package/dist/web-components/interaction/form/bds-switch.js +1 -1
- package/dist/web-components/interaction/form/bds-textarea.d.ts +23 -3
- package/dist/web-components/interaction/form/bds-textarea.js +1 -1
- package/dist/web-components/layout/bds-grid-item.d.ts +63 -0
- package/dist/web-components/layout/bds-grid-item.js +7 -0
- package/dist/web-components/layout/bds-grid.d.ts +108 -0
- package/dist/web-components/layout/bds-grid.js +7 -0
- package/dist/web-components/ui/bds-alert.d.ts +16 -2
- package/dist/web-components/ui/bds-alert.js +1 -1
- package/dist/web-components/ui/bds-avatar.d.ts +2 -1
- package/dist/web-components/ui/bds-avatar.js +1 -1
- package/dist/web-components/ui/bds-badge.js +1 -1
- package/dist/web-components/ui/bds-breadcrumb.d.ts +3 -1
- package/dist/web-components/ui/bds-breadcrumb.js +1 -1
- package/dist/web-components/ui/bds-button-container.d.ts +52 -0
- package/dist/web-components/ui/bds-button-container.js +7 -0
- package/dist/web-components/ui/bds-button-group.d.ts +21 -0
- package/dist/web-components/ui/bds-button-group.js +8 -0
- package/dist/web-components/ui/bds-calendar.d.ts +121 -0
- package/dist/web-components/ui/bds-calendar.js +7 -0
- package/dist/web-components/ui/bds-card.d.ts +12 -3
- package/dist/web-components/ui/bds-card.js +1 -1
- package/dist/web-components/ui/bds-carousel.d.ts +98 -0
- package/dist/web-components/ui/bds-carousel.js +7 -0
- package/dist/web-components/ui/bds-description-list.js +1 -1
- package/dist/web-components/ui/bds-icon-wrapper.d.ts +0 -9
- package/dist/web-components/ui/bds-icon-wrapper.js +1 -1
- package/dist/web-components/ui/bds-link.js +1 -1
- package/dist/web-components/ui/bds-loading.js +1 -1
- package/dist/web-components/ui/bds-notification-banner.js +1 -1
- package/dist/web-components/ui/bds-pagination.d.ts +47 -0
- package/dist/web-components/ui/bds-pagination.js +7 -0
- package/dist/web-components/ui/bds-progress-circle.d.ts +3 -1
- package/dist/web-components/ui/bds-progress-circle.js +1 -1
- package/dist/web-components/ui/bds-progress.d.ts +3 -1
- package/dist/web-components/ui/bds-progress.js +1 -1
- package/dist/web-components/ui/bds-rating.js +1 -1
- package/dist/web-components/ui/bds-section-header.d.ts +18 -4
- package/dist/web-components/ui/bds-section-header.js +1 -1
- package/dist/web-components/ui/bds-separator.js +1 -1
- package/dist/web-components/ui/bds-skeleton.js +1 -1
- package/dist/web-components/ui/bds-table.d.ts +52 -0
- package/dist/web-components/ui/bds-table.js +7 -0
- package/dist/web-components/ui/bds-typography.d.ts +1 -0
- package/dist/web-components/ui/bds-typography.js +1 -1
- package/package.json +60 -3
- package/src/components/interaction/Button/Button.module.css +23 -14
- package/src/components/interaction/Button/Button.spec.tsx +20 -0
- package/src/components/interaction/Button/Button.tsx +2 -2
- package/src/components/interaction/Command/Command.mdx +5 -2
- package/src/components/interaction/Command/Command.module.css +23 -7
- package/src/components/interaction/Command/Command.spec.tsx +35 -0
- package/src/components/interaction/Command/Command.tsx +15 -4
- package/src/components/interaction/Command/index.ts +1 -1
- package/src/components/interaction/Dialog/Dialog.mdx +4 -4
- package/src/components/interaction/Dialog/Dialog.module.css +20 -0
- package/src/components/interaction/Dialog/Dialog.spec.tsx +20 -0
- package/src/components/interaction/Dialog/Dialog.tsx +8 -3
- package/src/components/interaction/Dialog/index.ts +1 -0
- package/src/components/interaction/Drawer/Drawer.mdx +5 -2
- package/src/components/interaction/Drawer/Drawer.module.css +34 -3
- package/src/components/interaction/Drawer/Drawer.spec.tsx +67 -1
- package/src/components/interaction/Drawer/Drawer.tsx +30 -12
- package/src/components/interaction/Drawer/index.ts +1 -0
- package/src/components/interaction/DropdownMenu/DropdownMenu.mdx +2 -0
- package/src/components/interaction/DropdownMenu/DropdownMenu.spec.tsx +34 -0
- package/src/components/interaction/DropdownMenu/DropdownMenu.tsx +15 -5
- package/src/components/interaction/DropdownMenu/index.ts +1 -0
- package/src/components/interaction/Popover/Popover.mdx +6 -2
- package/src/components/interaction/Popover/Popover.module.css +26 -18
- package/src/components/interaction/Popover/Popover.spec.tsx +38 -0
- package/src/components/interaction/Popover/Popover.tsx +19 -5
- package/src/components/interaction/Popover/index.ts +1 -0
- package/src/components/interaction/Rating/Rating.mdx +1 -1
- package/src/components/interaction/Rating/Rating.module.css +2 -2
- package/src/components/interaction/Rating/Rating.tsx +1 -1
- package/src/components/interaction/Rating/index.ts +1 -0
- package/src/components/interaction/Toast/Toast.mdx +3 -0
- package/src/components/interaction/Toast/Toast.module.css +35 -5
- package/src/components/interaction/Toast/Toast.spec.tsx +69 -1
- package/src/components/interaction/Toast/Toast.tsx +15 -9
- package/src/components/interaction/form/Checkbox/Checkbox.mdx +3 -0
- package/src/components/interaction/form/Checkbox/Checkbox.module.css +13 -6
- package/src/components/interaction/form/Checkbox/Checkbox.spec.tsx +6 -0
- package/src/components/interaction/form/Checkbox/Checkbox.tsx +1 -1
- package/src/components/interaction/form/CheckboxGroup/CheckboxGroup.mdx +16 -1
- package/src/components/interaction/form/CheckboxGroup/CheckboxGroup.module.css +24 -8
- package/src/components/interaction/form/CheckboxGroup/CheckboxGroup.spec.tsx +32 -2
- package/src/components/interaction/form/CheckboxGroup/CheckboxGroup.tsx +14 -2
- package/src/components/interaction/form/Combobox/Combobox.mdx +11 -4
- package/src/components/interaction/form/Combobox/Combobox.module.css +6 -6
- package/src/components/interaction/form/Combobox/Combobox.spec.tsx +47 -0
- package/src/components/interaction/form/Combobox/Combobox.tsx +10 -5
- package/src/components/interaction/form/FieldGroup/FieldGroup.mdx +9 -10
- package/src/components/interaction/form/FieldGroup/FieldGroup.module.css +57 -23
- package/src/components/interaction/form/FieldGroup/FieldGroup.spec.tsx +129 -7
- package/src/components/interaction/form/FieldGroup/FieldGroup.tsx +72 -12
- package/src/components/interaction/form/FileInput/FileInput.mdx +9 -1
- package/src/components/interaction/form/FileInput/FileInput.module.css +8 -8
- package/src/components/interaction/form/FileInput/FileInput.spec.tsx +89 -1
- package/src/components/interaction/form/FileInput/FileInput.tsx +6 -2
- package/src/components/interaction/form/FormInput/FormInput.mdx +9 -5
- package/src/components/interaction/form/FormInput/FormInput.module.css +17 -8
- package/src/components/interaction/form/FormInput/FormInput.spec.tsx +20 -0
- package/src/components/interaction/form/FormInput/FormInput.tsx +7 -2
- package/src/components/interaction/form/NumberInput/NumberInput.mdx +5 -1
- package/src/components/interaction/form/NumberInput/NumberInput.module.css +6 -6
- package/src/components/interaction/form/NumberInput/NumberInput.spec.tsx +51 -0
- package/src/components/interaction/form/NumberInput/NumberInput.tsx +36 -8
- package/src/components/interaction/form/Radio/Radio.mdx +8 -1
- package/src/components/interaction/form/Radio/Radio.module.css +20 -7
- package/src/components/interaction/form/Radio/Radio.spec.tsx +15 -0
- package/src/components/interaction/form/Radio/Radio.tsx +10 -4
- package/src/components/interaction/form/RadioGroup/RadioGroup.mdx +16 -1
- package/src/components/interaction/form/RadioGroup/RadioGroup.module.css +24 -8
- package/src/components/interaction/form/RadioGroup/RadioGroup.spec.tsx +32 -2
- package/src/components/interaction/form/RadioGroup/RadioGroup.tsx +14 -2
- package/src/components/interaction/form/SegmentedControl/SegmentedControl.mdx +9 -3
- package/src/components/interaction/form/SegmentedControl/SegmentedControl.module.css +25 -12
- package/src/components/interaction/form/SegmentedControl/SegmentedControl.spec.tsx +86 -5
- package/src/components/interaction/form/SegmentedControl/SegmentedControl.tsx +44 -4
- package/src/components/interaction/form/Select/Select.mdx +10 -4
- package/src/components/interaction/form/Select/Select.module.css +4 -4
- package/src/components/interaction/form/Select/Select.spec.tsx +34 -0
- package/src/components/interaction/form/Select/Select.tsx +21 -9
- package/src/components/interaction/form/Slider/Slider.mdx +4 -1
- package/src/components/interaction/form/Slider/Slider.module.css +32 -8
- package/src/components/interaction/form/Slider/Slider.spec.tsx +29 -0
- package/src/components/interaction/form/Slider/Slider.tsx +9 -7
- package/src/components/interaction/form/Switch/Switch.mdx +2 -2
- package/src/components/interaction/form/Switch/Switch.module.css +12 -13
- package/src/components/interaction/form/Switch/Switch.spec.tsx +20 -0
- package/src/components/interaction/form/Switch/Switch.tsx +2 -1
- package/src/components/interaction/form/Textarea/Textarea.mdx +5 -0
- package/src/components/interaction/form/Textarea/Textarea.module.css +5 -5
- package/src/components/interaction/form/Textarea/Textarea.spec.tsx +13 -0
- package/src/components/interaction/form/Textarea/Textarea.tsx +3 -1
- package/src/components/interaction/form/atoms/Message.module.css +1 -1
- package/src/components/interaction/form/atoms/Message.spec.tsx +29 -0
- package/src/components/interaction/form/atoms/Message.tsx +1 -1
- package/src/components/layout/ButtonGroup/ButtonGroup.mdx +11 -0
- package/src/components/layout/ButtonGroup/ButtonGroup.module.css +1 -5
- package/src/components/layout/ButtonGroup/ButtonGroup.stories.tsx +14 -0
- package/src/components/layout/Card/Card.mdx +6 -1
- package/src/components/layout/Card/Card.module.css +26 -5
- package/src/components/layout/Card/Card.spec.tsx +7 -0
- package/src/components/layout/Card/Card.tsx +4 -3
- package/src/components/layout/Grid/Grid.spec.tsx +44 -0
- package/src/components/layout/Grid/Grid.tsx +5 -5
- package/src/components/layout/Grid/GridItem.tsx +6 -6
- package/src/components/layout/Grid/masonry.ts +31 -5
- package/src/components/layout/Grid/useIsomorphicLayoutEffect.ts +11 -0
- package/src/components/layout/IconWrapper/IconWrapper.mdx +8 -2
- package/src/components/layout/IconWrapper/IconWrapper.module.css +9 -6
- package/src/components/layout/SectionHeader/SectionHeader.mdx +4 -1
- package/src/components/layout/SectionHeader/SectionHeader.module.css +10 -9
- package/src/components/ui/Accordion/Accordion.mdx +4 -1
- package/src/components/ui/Accordion/Accordion.module.css +2 -1
- package/src/components/ui/Alert/Alert.mdx +21 -4
- package/src/components/ui/Alert/Alert.module.css +9 -4
- package/src/components/ui/Alert/Alert.spec.tsx +20 -0
- package/src/components/ui/Avatar/Avatar.mdx +8 -3
- package/src/components/ui/Avatar/Avatar.module.css +13 -8
- package/src/components/ui/Badge/Badge.mdx +3 -1
- package/src/components/ui/Breadcrumb/Breadcrumb.mdx +3 -0
- package/src/components/ui/Breadcrumb/Breadcrumb.module.css +4 -0
- package/src/components/ui/Breadcrumb/Breadcrumb.spec.tsx +12 -0
- package/src/components/ui/Breadcrumb/Breadcrumb.tsx +11 -3
- package/src/components/ui/Calendar/Calendar.mdx +6 -0
- package/src/components/ui/Calendar/Calendar.module.css +68 -19
- package/src/components/ui/Calendar/Calendar.spec.tsx +139 -24
- package/src/components/ui/Calendar/Calendar.stories.tsx +14 -0
- package/src/components/ui/Calendar/Calendar.tsx +143 -154
- package/src/components/ui/Calendar/CalendarRange.mdx +39 -0
- package/src/components/ui/Calendar/CalendarRange.spec.tsx +119 -0
- package/src/components/ui/Calendar/CalendarRange.stories.tsx +51 -0
- package/src/components/ui/Calendar/CalendarRange.tsx +213 -0
- package/src/components/ui/Calendar/MonthGrid.tsx +141 -0
- package/src/components/ui/Calendar/calendar-core.spec.ts +176 -0
- package/src/components/ui/Calendar/calendar-core.ts +164 -0
- package/src/components/ui/Calendar/index.ts +1 -0
- package/src/components/ui/Carousel/Carousel.mdx +8 -3
- package/src/components/ui/Carousel/Carousel.module.css +7 -5
- package/src/components/ui/Carousel/Carousel.spec.tsx +67 -0
- package/src/components/ui/Carousel/Carousel.tsx +19 -7
- package/src/components/ui/Collapsible/Collapsible.mdx +17 -6
- package/src/components/ui/Collapsible/Collapsible.module.css +7 -2
- package/src/components/ui/Collapsible/Collapsible.spec.tsx +40 -0
- package/src/components/ui/Collapsible/Collapsible.tsx +19 -2
- package/src/components/ui/DescriptionList/DescriptionList.mdx +2 -0
- package/src/components/ui/Link/Link.mdx +4 -2
- package/src/components/ui/Loading/Loading.mdx +6 -3
- package/src/components/ui/Loading/Loading.module.css +7 -7
- package/src/components/ui/Loading/Loading.spec.tsx +12 -0
- package/src/components/ui/Loading/Loading.tsx +8 -3
- package/src/components/ui/NotificationBanner/NotificationBanner.mdx +4 -0
- package/src/components/ui/NotificationBanner/NotificationBanner.module.css +5 -0
- package/src/components/ui/NotificationBanner/NotificationBanner.spec.tsx +20 -0
- package/src/components/ui/Pagination/Pagination.mdx +29 -7
- package/src/components/ui/Pagination/Pagination.module.css +15 -14
- package/src/components/ui/Progress/Progress.mdx +6 -2
- package/src/components/ui/Progress/Progress.module.css +1 -1
- package/src/components/ui/Progress/Progress.spec.tsx +17 -0
- package/src/components/ui/Progress/Progress.tsx +2 -2
- package/src/components/ui/ProgressCircle/ProgressCircle.mdx +8 -4
- package/src/components/ui/ProgressCircle/ProgressCircle.module.css +2 -2
- package/src/components/ui/ProgressCircle/ProgressCircle.spec.tsx +11 -1
- package/src/components/ui/ProgressCircle/ProgressCircle.tsx +1 -1
- package/src/components/ui/Separator/Separator.mdx +7 -0
- package/src/components/ui/Separator/Separator.module.css +1 -0
- package/src/components/ui/Skeleton/Skeleton.mdx +17 -0
- package/src/components/ui/Skeleton/Skeleton.module.css +12 -5
- package/src/components/ui/SkipLink/SkipLink.mdx +19 -0
- package/src/components/ui/SkipLink/SkipLink.module.css +8 -7
- package/src/components/ui/SkipLink/SkipLink.spec.tsx +28 -0
- package/src/components/ui/Table/Table.mdx +14 -0
- package/src/components/ui/Table/Table.module.css +13 -8
- package/src/components/ui/Table/Table.spec.tsx +56 -0
- package/src/components/ui/Table/Table.tsx +44 -6
- package/src/components/ui/Tabs/Tabs.mdx +16 -0
- package/src/components/ui/Tabs/Tabs.module.css +3 -3
- package/src/components/ui/Tabs/Tabs.spec.tsx +20 -0
- package/src/components/ui/Tabs/Tabs.tsx +5 -1
- package/src/components/ui/Tooltip/Tooltip.mdx +9 -0
- package/src/components/ui/Tooltip/Tooltip.module.css +32 -12
- package/src/components/ui/Tooltip/Tooltip.spec.tsx +56 -0
- package/src/components/ui/Tooltip/Tooltip.tsx +26 -7
- package/src/components/ui/Typography/Typography.mdx +7 -0
- package/src/components/ui/Typography/Typography.module.css +5 -5
- package/src/index.ts +7 -3
- package/src/stories/DesignSystem/Borders.mdx +14 -9
- package/src/stories/DesignSystem/Colors.mdx +43 -41
- package/src/stories/DesignSystem/Overview.mdx +4 -3
- package/src/stories/Introduction.mdx +5 -5
- package/src/web-components/globals.ts +7 -0
- package/src/web-components/index.ts +2 -0
- package/src/web-components/interaction/BdsAccordion.mdx +10 -1
- package/src/web-components/interaction/BdsButton.mdx +15 -4
- package/src/web-components/interaction/BdsButton.stories.tsx +1 -1
- package/src/web-components/interaction/BdsCollapsible.mdx +3 -3
- package/src/web-components/interaction/BdsDialog.mdx +12 -7
- package/src/web-components/interaction/BdsDialog.stories.tsx +2 -2
- package/src/web-components/interaction/BdsDrawer.mdx +9 -6
- package/src/web-components/interaction/BdsDropdownMenu.mdx +20 -1
- package/src/web-components/interaction/BdsPopover.mdx +7 -3
- package/src/web-components/interaction/BdsSkipLink.mdx +14 -1
- package/src/web-components/interaction/BdsTabs.mdx +18 -1
- package/src/web-components/interaction/BdsToastProvider.mdx +21 -3
- package/src/web-components/interaction/BdsTooltip.mdx +4 -4
- package/src/web-components/interaction/bds-accordion-item.ts +10 -0
- package/src/web-components/interaction/bds-accordion.spec.ts +41 -0
- package/src/web-components/interaction/bds-accordion.ts +28 -2
- package/src/web-components/interaction/bds-button.spec.ts +81 -0
- package/src/web-components/interaction/bds-button.ts +55 -8
- package/src/web-components/interaction/bds-collapsible.spec.ts +93 -2
- package/src/web-components/interaction/bds-collapsible.ts +49 -7
- package/src/web-components/interaction/bds-dialog.spec.ts +49 -0
- package/src/web-components/interaction/bds-dialog.ts +68 -11
- package/src/web-components/interaction/bds-drawer.spec.ts +93 -4
- package/src/web-components/interaction/bds-drawer.ts +54 -21
- package/src/web-components/interaction/bds-dropdown-menu-item.ts +12 -1
- package/src/web-components/interaction/bds-dropdown-menu.spec.ts +63 -0
- package/src/web-components/interaction/bds-dropdown-menu.ts +45 -7
- package/src/web-components/interaction/bds-popover.spec.ts +80 -6
- package/src/web-components/interaction/bds-popover.ts +83 -32
- package/src/web-components/interaction/bds-skip-link.spec.ts +18 -0
- package/src/web-components/interaction/bds-skip-link.ts +29 -8
- package/src/web-components/interaction/bds-tab-panel.ts +10 -0
- package/src/web-components/interaction/bds-tab.spec.ts +25 -0
- package/src/web-components/interaction/bds-tab.ts +20 -5
- package/src/web-components/interaction/bds-tabs.spec.ts +92 -5
- package/src/web-components/interaction/bds-tabs.ts +42 -1
- package/src/web-components/interaction/bds-toast-provider.spec.ts +43 -0
- package/src/web-components/interaction/bds-toast-provider.ts +50 -21
- package/src/web-components/interaction/bds-tooltip.spec.ts +71 -0
- package/src/web-components/interaction/bds-tooltip.ts +100 -5
- package/src/web-components/interaction/form/BdsCheckbox.mdx +20 -1
- package/src/web-components/interaction/form/BdsCheckbox.stories.tsx +8 -0
- package/src/web-components/interaction/form/BdsCheckboxGroup.mdx +4 -3
- package/src/web-components/interaction/form/BdsCombobox.mdx +39 -2
- package/src/web-components/interaction/form/BdsCombobox.stories.tsx +31 -0
- package/src/web-components/interaction/form/BdsFieldGroup.mdx +8 -3
- package/src/web-components/interaction/form/BdsFieldGroup.stories.tsx +1 -1
- package/src/web-components/interaction/form/BdsFileInput.mdx +26 -5
- package/src/web-components/interaction/form/BdsFormInput.mdx +16 -1
- package/src/web-components/interaction/form/BdsNumberInput.mdx +34 -2
- package/src/web-components/interaction/form/BdsNumberInput.stories.tsx +27 -3
- package/src/web-components/interaction/form/BdsRadio.mdx +39 -12
- package/src/web-components/interaction/form/BdsRadio.stories.tsx +26 -0
- package/src/web-components/interaction/form/BdsRadioGroup.mdx +9 -4
- package/src/web-components/interaction/form/BdsSegmentedControl.mdx +37 -11
- package/src/web-components/interaction/form/BdsSelect.mdx +22 -4
- package/src/web-components/interaction/form/BdsSelect.stories.tsx +33 -0
- package/src/web-components/interaction/form/BdsSlider.mdx +36 -19
- package/src/web-components/interaction/form/BdsSlider.stories.tsx +24 -0
- package/src/web-components/interaction/form/BdsSwitch.mdx +38 -11
- package/src/web-components/interaction/form/BdsSwitch.stories.tsx +16 -0
- package/src/web-components/interaction/form/BdsTextarea.mdx +42 -16
- package/src/web-components/interaction/form/BdsTextarea.stories.tsx +21 -0
- package/src/web-components/interaction/form/bds-checkbox-group.spec.ts +99 -0
- package/src/web-components/interaction/form/bds-checkbox-group.ts +95 -9
- package/src/web-components/interaction/form/bds-checkbox.spec.ts +55 -0
- package/src/web-components/interaction/form/bds-checkbox.ts +30 -5
- package/src/web-components/interaction/form/bds-combobox.spec.ts +79 -0
- package/src/web-components/interaction/form/bds-combobox.ts +101 -16
- package/src/web-components/interaction/form/bds-field-group.spec.ts +158 -0
- package/src/web-components/interaction/form/bds-field-group.ts +167 -23
- package/src/web-components/interaction/form/bds-file-input.spec.ts +73 -5
- package/src/web-components/interaction/form/bds-file-input.ts +71 -34
- package/src/web-components/interaction/form/bds-form-input.spec.ts +22 -0
- package/src/web-components/interaction/form/bds-form-input.ts +27 -16
- package/src/web-components/interaction/form/bds-number-input.spec.ts +49 -0
- package/src/web-components/interaction/form/bds-number-input.ts +118 -29
- package/src/web-components/interaction/form/bds-radio-group.spec.ts +57 -0
- package/src/web-components/interaction/form/bds-radio-group.ts +60 -12
- package/src/web-components/interaction/form/bds-radio.spec.ts +123 -0
- package/src/web-components/interaction/form/bds-radio.ts +135 -22
- package/src/web-components/interaction/form/bds-segmented-control.spec.ts +55 -0
- package/src/web-components/interaction/form/bds-segmented-control.ts +81 -59
- package/src/web-components/interaction/form/bds-select.spec.ts +57 -0
- package/src/web-components/interaction/form/bds-select.ts +95 -7
- package/src/web-components/interaction/form/bds-slider.spec.ts +83 -0
- package/src/web-components/interaction/form/bds-slider.ts +154 -26
- package/src/web-components/interaction/form/bds-switch.spec.ts +68 -0
- package/src/web-components/interaction/form/bds-switch.ts +87 -20
- package/src/web-components/interaction/form/bds-textarea.spec.ts +71 -0
- package/src/web-components/interaction/form/bds-textarea.ts +108 -7
- package/src/web-components/layout/BdsGrid.mdx +6 -2
- package/src/web-components/layout/BdsGrid.stories.tsx +4 -0
- package/src/web-components/layout/bds-grid-item.spec.ts +21 -0
- package/src/web-components/layout/bds-grid-item.ts +17 -3
- package/src/web-components/layout/bds-grid.spec.ts +98 -0
- package/src/web-components/layout/bds-grid.ts +139 -19
- package/src/web-components/ui/BdsAlert.mdx +6 -5
- package/src/web-components/ui/BdsAlert.stories.tsx +6 -6
- package/src/web-components/ui/BdsAvatar.mdx +4 -2
- package/src/web-components/ui/BdsBreadcrumb.mdx +3 -2
- package/src/web-components/ui/BdsButtonContainer.mdx +64 -0
- package/src/web-components/ui/BdsButtonContainer.stories.tsx +84 -0
- package/src/web-components/ui/BdsCalendar.mdx +29 -4
- package/src/web-components/ui/BdsCalendar.stories.tsx +16 -18
- package/src/web-components/ui/BdsCalendarRange.mdx +71 -0
- package/src/web-components/ui/BdsCalendarRange.stories.tsx +31 -0
- package/src/web-components/ui/BdsCard.mdx +7 -3
- package/src/web-components/ui/BdsCard.stories.tsx +17 -1
- package/src/web-components/ui/BdsCarousel.mdx +40 -12
- package/src/web-components/ui/BdsDescriptionList.mdx +6 -1
- package/src/web-components/ui/BdsIconWrapper.mdx +3 -2
- package/src/web-components/ui/BdsLink.mdx +14 -2
- package/src/web-components/ui/BdsNotificationBanner.mdx +18 -0
- package/src/web-components/ui/BdsPagination.mdx +40 -1
- package/src/web-components/ui/BdsProgress.mdx +8 -2
- package/src/web-components/ui/BdsProgressCircle.mdx +5 -2
- package/src/web-components/ui/BdsRating.mdx +7 -0
- package/src/web-components/ui/BdsSectionHeader.mdx +22 -3
- package/src/web-components/ui/BdsSectionHeader.stories.tsx +15 -13
- package/src/web-components/ui/BdsTable.mdx +23 -2
- package/src/web-components/ui/BdsTable.stories.tsx +8 -2
- package/src/web-components/ui/BdsTypography.mdx +17 -1
- package/src/web-components/ui/bds-alert.spec.ts +17 -2
- package/src/web-components/ui/bds-alert.ts +31 -5
- package/src/web-components/ui/bds-avatar.spec.ts +29 -0
- package/src/web-components/ui/bds-avatar.ts +29 -11
- package/src/web-components/ui/bds-badge.spec.ts +5 -0
- package/src/web-components/ui/bds-badge.ts +11 -1
- package/src/web-components/ui/bds-breadcrumb.spec.ts +30 -0
- package/src/web-components/ui/bds-breadcrumb.ts +26 -4
- package/src/web-components/ui/bds-button-container.spec.ts +39 -0
- package/src/web-components/ui/bds-button-container.ts +123 -0
- package/src/web-components/ui/bds-button-group.spec.ts +14 -20
- package/src/web-components/ui/bds-button-group.ts +13 -64
- package/src/web-components/ui/bds-calendar-range.spec.ts +123 -0
- package/src/web-components/ui/bds-calendar-range.ts +307 -0
- package/src/web-components/ui/bds-calendar.spec.ts +176 -0
- package/src/web-components/ui/bds-calendar.ts +186 -344
- package/src/web-components/ui/bds-card.spec.ts +32 -0
- package/src/web-components/ui/bds-card.ts +34 -9
- package/src/web-components/ui/bds-carousel.spec.ts +147 -0
- package/src/web-components/ui/bds-carousel.ts +109 -32
- package/src/web-components/ui/bds-description-list.spec.ts +15 -0
- package/src/web-components/ui/bds-description-list.ts +37 -3
- package/src/web-components/ui/bds-icon-wrapper.spec.ts +12 -0
- package/src/web-components/ui/bds-icon-wrapper.ts +15 -14
- package/src/web-components/ui/bds-link.spec.ts +17 -0
- package/src/web-components/ui/bds-link.ts +26 -11
- package/src/web-components/ui/bds-loading.ts +10 -0
- package/src/web-components/ui/bds-notification-banner.spec.ts +13 -0
- package/src/web-components/ui/bds-notification-banner.ts +18 -1
- package/src/web-components/ui/bds-pagination.spec.ts +44 -0
- package/src/web-components/ui/bds-pagination.ts +39 -19
- package/src/web-components/ui/bds-progress-circle.spec.ts +21 -0
- package/src/web-components/ui/bds-progress-circle.ts +17 -5
- package/src/web-components/ui/bds-progress.spec.ts +21 -0
- package/src/web-components/ui/bds-progress.ts +17 -4
- package/src/web-components/ui/bds-rating.spec.ts +6 -0
- package/src/web-components/ui/bds-rating.ts +12 -2
- package/src/web-components/ui/bds-section-header.spec.ts +39 -8
- package/src/web-components/ui/bds-section-header.ts +47 -13
- package/src/web-components/ui/bds-separator.ts +10 -0
- package/src/web-components/ui/bds-skeleton.ts +10 -0
- package/src/web-components/ui/bds-table.spec.ts +63 -0
- package/src/web-components/ui/bds-table.ts +88 -28
- package/src/web-components/ui/bds-typography.spec.ts +47 -0
- package/src/web-components/ui/bds-typography.ts +28 -10
- package/src/web-components/ui/calendar-styles.ts +94 -0
- package/dist/web-components/chunk-7YURXHTS.js +0 -147
- package/dist/web-components/chunk-A3RLT3AS.js +0 -49
- package/dist/web-components/chunk-AGKJTMJI.js +0 -56
- package/dist/web-components/chunk-BQLZ7I4G.js +0 -56
- package/dist/web-components/chunk-DZOEPVFT.js +0 -107
- package/dist/web-components/chunk-JYYRJS2D.js +0 -118
- package/dist/web-components/chunk-Y4MAXTMA.js +0 -80
- package/dist/web-components/chunk-Y7V7LM6R.js +0 -98
- package/src/web-components/ui/BdsButtonGroup.mdx +0 -69
- package/src/web-components/ui/BdsButtonGroup.stories.tsx +0 -66
|
@@ -30,6 +30,9 @@ Use `<bds-checkbox>` whenever you need a single boolean toggle that participates
|
|
|
30
30
|
### Required
|
|
31
31
|
<Canvas of={Stories.Required} />
|
|
32
32
|
|
|
33
|
+
### Error
|
|
34
|
+
<Canvas of={Stories.WithError} />
|
|
35
|
+
|
|
33
36
|
### Disabled
|
|
34
37
|
<Canvas of={Stories.Disabled} />
|
|
35
38
|
|
|
@@ -49,6 +52,21 @@ Use `<bds-checkbox>` whenever you need a single boolean toggle that participates
|
|
|
49
52
|
| `checked` | boolean | `false` | Whether the checkbox is checked |
|
|
50
53
|
| `required` | boolean | `false` | Marks the field as required |
|
|
51
54
|
| `disabled` | boolean | `false` | Disables the checkbox |
|
|
55
|
+
| `error` | boolean | `false` | Puts the checkbox in an error state (border colour + `aria-invalid`) |
|
|
56
|
+
|
|
57
|
+
## CSS Custom Properties
|
|
58
|
+
|
|
59
|
+
| Property | Default | Description |
|
|
60
|
+
|------------------------------|--------------------------------|------------------------------------------------|
|
|
61
|
+
| `--checkbox_color` | `--bds-color_on-bg` | Border/frame colour (feeds `currentcolor`) |
|
|
62
|
+
| `--checkbox_border` | `none` | Real CSS `border` (in addition to the bdc inset outline) |
|
|
63
|
+
| `--checkbox_radius` | `--bdc-outline_radius` (`--bds-border_radius--xs`) | Corner radius |
|
|
64
|
+
| `--checkbox_shadow` | `--bdc-outline_shadow` | Extra box-shadow layered behind the inset border |
|
|
65
|
+
| `--checkbox_color_bg` | `--bds-color_bg` | Unchecked background colour |
|
|
66
|
+
| `--checkbox_color-active` | `--bdc-color_active` | Checked background colour |
|
|
67
|
+
| `--checkbox_color-on-active` | `--bdc-color_on-active` | Checkmark colour |
|
|
68
|
+
|
|
69
|
+
> **Deprecated:** `--checkbox_border-color` is a legacy alias for `--checkbox_color` kept for backwards compatibility — prefer `--checkbox_color`, which matches the React `Checkbox` component's token name.
|
|
52
70
|
|
|
53
71
|
## Slots
|
|
54
72
|
|
|
@@ -71,6 +89,7 @@ Use `<bds-checkbox>` whenever you need a single boolean toggle that participates
|
|
|
71
89
|
## Accessibility
|
|
72
90
|
|
|
73
91
|
- The inner `<input type="checkbox">` is associated with a `<label>` via matching `id`/`for` attributes
|
|
74
|
-
- `required` triggers native browser validation
|
|
92
|
+
- `required` triggers native browser validation; validity is recomputed both when `required` and when `checked` changes, so a required checkbox correctly unblocks form submission once checked
|
|
93
|
+
- `error` sets `aria-invalid="true"` on the inner input and switches the border colour to the error token
|
|
75
94
|
- `disabled` sets `pointer-events: none` and reduces opacity
|
|
76
95
|
- Use `<bds-checkbox-group>` for accessible grouping with `<fieldset>`/`<legend>`
|
|
@@ -8,6 +8,7 @@ function BdsCheckbox({
|
|
|
8
8
|
checked,
|
|
9
9
|
required,
|
|
10
10
|
disabled,
|
|
11
|
+
error,
|
|
11
12
|
children,
|
|
12
13
|
}: {
|
|
13
14
|
name?: string;
|
|
@@ -15,6 +16,7 @@ function BdsCheckbox({
|
|
|
15
16
|
checked?: boolean;
|
|
16
17
|
required?: boolean;
|
|
17
18
|
disabled?: boolean;
|
|
19
|
+
error?: boolean;
|
|
18
20
|
children?: React.ReactNode;
|
|
19
21
|
}) {
|
|
20
22
|
return React.createElement(
|
|
@@ -25,6 +27,7 @@ function BdsCheckbox({
|
|
|
25
27
|
checked: checked || undefined,
|
|
26
28
|
required: required || undefined,
|
|
27
29
|
disabled: disabled || undefined,
|
|
30
|
+
error: error || undefined,
|
|
28
31
|
},
|
|
29
32
|
children,
|
|
30
33
|
);
|
|
@@ -39,6 +42,7 @@ const meta = {
|
|
|
39
42
|
checked: { control: 'boolean' },
|
|
40
43
|
required: { control: 'boolean' },
|
|
41
44
|
disabled: { control: 'boolean' },
|
|
45
|
+
error: { control: 'boolean' },
|
|
42
46
|
},
|
|
43
47
|
} satisfies Meta<typeof BdsCheckbox>;
|
|
44
48
|
|
|
@@ -61,6 +65,10 @@ export const Required: Story = {
|
|
|
61
65
|
args: { name: 'option', value: 'yes', required: true, children: 'Required field' },
|
|
62
66
|
};
|
|
63
67
|
|
|
68
|
+
export const WithError: Story = {
|
|
69
|
+
args: { name: 'option', value: 'yes', error: true, children: 'Something went wrong' },
|
|
70
|
+
};
|
|
71
|
+
|
|
64
72
|
export const WithGroup: Story = {
|
|
65
73
|
render: () => (
|
|
66
74
|
<div style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>
|
|
@@ -45,7 +45,7 @@ Use `<bds-checkbox-group>` when you have multiple related checkboxes that belong
|
|
|
45
45
|
| `error` | string | — | Error message shown below items; takes priority over `hint` |
|
|
46
46
|
| `hint` | string | — | Helper text shown below items |
|
|
47
47
|
| `required` | boolean | `false` | Shows a required indicator on the legend |
|
|
48
|
-
| `disabled` | boolean | `false` | Disables the
|
|
48
|
+
| `disabled` | boolean | `false` | Disables the fieldset and propagates `disabled` to every slotted `<bds-checkbox>` (a checkbox individually marked `disabled` in markup stays disabled after the group re-enables) |
|
|
49
49
|
|
|
50
50
|
## Slots
|
|
51
51
|
|
|
@@ -65,6 +65,7 @@ Use `<bds-checkbox-group>` when you have multiple related checkboxes that belong
|
|
|
65
65
|
## Accessibility
|
|
66
66
|
|
|
67
67
|
- Renders a `<fieldset>` with a `<legend>`, which is announced as a group by screen readers
|
|
68
|
-
- `required`
|
|
69
|
-
- `disabled` on the group
|
|
68
|
+
- `required` adds a visible asterisk (`aria-hidden`) plus a visually-hidden "(required)" text alternative in the legend, so requiredness is announced in the group's accessible name. `aria-required` is deliberately **not** set on the fieldset — that attribute is only supported ARIA on the `checkbox`, `combobox`, `gridcell`, `listbox`, `radiogroup`, `spinbutton`, `textbox` and `tree` roles; a bare `<fieldset>` maps to the generic `group` role (there is no ARIA `checkboxgroup` role), so assistive tech would silently ignore it
|
|
69
|
+
- `disabled` on the group sets the shadow `<fieldset disabled>` **and** explicitly propagates the `disabled` attribute to every slotted `<bds-checkbox>` — a shadow-DOM `<fieldset disabled>` has no effect on slotted light-DOM custom elements on its own, so propagation happens in JS (on `disabled` change and on `slotchange`)
|
|
70
|
+
- The fieldset's `aria-describedby` points at the rendered error/hint message id, so screen readers announce it as part of the group's description
|
|
70
71
|
- Error messages use `role="alert"` so they are announced immediately
|
|
@@ -27,6 +27,12 @@ Use `<bds-combobox>` when users need to search and filter a list of options. For
|
|
|
27
27
|
### With disabled option
|
|
28
28
|
<Canvas of={Stories.WithDisabledOption} />
|
|
29
29
|
|
|
30
|
+
### With hint
|
|
31
|
+
<Canvas of={Stories.WithHint} />
|
|
32
|
+
|
|
33
|
+
### With error
|
|
34
|
+
<Canvas of={Stories.WithError} />
|
|
35
|
+
|
|
30
36
|
### Required
|
|
31
37
|
<Canvas of={Stories.Required} />
|
|
32
38
|
|
|
@@ -45,8 +51,34 @@ Use `<bds-combobox>` when users need to search and filter a list of options. For
|
|
|
45
51
|
| `value` | string | `""` | Currently selected value |
|
|
46
52
|
| `options` | string | `"[]"` | JSON array of `{ value, label, disabled? }` option objects |
|
|
47
53
|
| `placeholder` | string | `""` | Input placeholder text |
|
|
54
|
+
| `label` | string | `""` | Visible label text, associated to the input via `<label for>` |
|
|
55
|
+
| `hint` | string | — | Helper text shown below the input |
|
|
56
|
+
| `error` | string | — | Error message; when set the input enters error state |
|
|
48
57
|
| `disabled` | boolean | `false` | Disables the entire combobox |
|
|
49
58
|
|
|
59
|
+
## CSS Custom Properties
|
|
60
|
+
|
|
61
|
+
| Property | Default | Description |
|
|
62
|
+
|------------------------------------------|--------------------------------------------------------|---------------------------------------------------------------------------|
|
|
63
|
+
| `--combobox_border` | `none` | Real CSS `border` on the input (in addition to the bdc inset outline) |
|
|
64
|
+
| `--combobox_radius` | `--bdc-outline_radius` (`--bds-border_radius--full`) | Input corner radius |
|
|
65
|
+
| `--combobox_shadow` | `--bdc-outline_shadow` | Extra box-shadow layered behind the input's inset border |
|
|
66
|
+
| `--combobox_color_bg` | `--bds-color_bg` | Input and listbox background colour |
|
|
67
|
+
| `--combobox_color` | `--bds-color_on-bg` | Input text colour |
|
|
68
|
+
| `--combobox_on-color` | `--bds-color_on-bg` | Listbox/option text colour |
|
|
69
|
+
| `--combobox_listbox-border` | `none` | Real CSS `border` on the listbox (in addition to the bdc inset outline) |
|
|
70
|
+
| `--combobox_listbox-radius` | `--bdc-outline_radius` (`--bds-border_radius--s`) | Listbox corner radius |
|
|
71
|
+
| `--combobox_listbox-shadow` | `--bds-shadow_m` | Listbox elevation shadow |
|
|
72
|
+
| `--combobox_z-index` | `--bds-z-index_dropdown` | Listbox stacking order |
|
|
73
|
+
| `--combobox_option-bg--highlighted` | `--bds-color_bg--subtle` | Background of the hovered/keyboard-highlighted/selected option |
|
|
74
|
+
| `--combobox_option-color--highlighted` | `--bds-color_interactive_on-bg` | Text colour of the hovered/keyboard-highlighted/selected option |
|
|
75
|
+
|
|
76
|
+
> `--combobox_border-color` is a web-component-only override for the input's inset-border colour (`--bdc_color`, default `currentcolor`); it has no React `Combobox` equivalent. Most consumers should use `--combobox_color` (text colour), which the border also inherits via `currentcolor` unless `--combobox_border-color` is set explicitly.
|
|
77
|
+
|
|
78
|
+
## Slots
|
|
79
|
+
|
|
80
|
+
_None._
|
|
81
|
+
|
|
50
82
|
## Events
|
|
51
83
|
|
|
52
84
|
| Event | Detail | Description |
|
|
@@ -58,6 +90,7 @@ Use `<bds-combobox>` when users need to search and filter a list of options. For
|
|
|
58
90
|
```html
|
|
59
91
|
<bds-combobox
|
|
60
92
|
name="country"
|
|
93
|
+
label="Country"
|
|
61
94
|
placeholder="Search country…"
|
|
62
95
|
options='[{"value":"nl","label":"Netherlands"},{"value":"be","label":"Belgium"}]'
|
|
63
96
|
></bds-combobox>
|
|
@@ -65,7 +98,11 @@ Use `<bds-combobox>` when users need to search and filter a list of options. For
|
|
|
65
98
|
|
|
66
99
|
## Accessibility
|
|
67
100
|
|
|
68
|
-
-
|
|
69
|
-
-
|
|
101
|
+
- `<label>` is associated with the inner input via matching `id`/`for` attributes when `label` is set
|
|
102
|
+
- Uses `role="combobox"` on the input with `aria-expanded`, `aria-autocomplete="list"`, `aria-haspopup="listbox"`, and `autocomplete="off"`
|
|
103
|
+
- `aria-controls` points the input at the listbox; `aria-activedescendant` tracks the keyboard-highlighted option so the current selection is exposed to assistive tech
|
|
104
|
+
- Listbox uses `role="listbox"` and each option uses `role="option"` with `aria-selected` and `aria-disabled`; the "No results" placeholder uses `role="presentation"` so it isn't announced as a selectable option
|
|
105
|
+
- `error` sets `aria-invalid="true"` and links the error message via `aria-describedby`; the error message uses `role="alert"`
|
|
106
|
+
- `hint` is linked via `aria-describedby` for screen reader announcement when there is no error
|
|
70
107
|
- Full keyboard navigation: `ArrowDown`/`ArrowUp` to navigate, `Enter` to select, `Escape` to close
|
|
71
108
|
- Participates in HTML forms via the Form-Associated Custom Elements API
|
|
@@ -22,12 +22,18 @@ function BdsCombobox({
|
|
|
22
22
|
value,
|
|
23
23
|
options,
|
|
24
24
|
placeholder,
|
|
25
|
+
label,
|
|
26
|
+
hint,
|
|
27
|
+
error,
|
|
25
28
|
disabled,
|
|
26
29
|
}: {
|
|
27
30
|
name?: string;
|
|
28
31
|
value?: string;
|
|
29
32
|
options?: string;
|
|
30
33
|
placeholder?: string;
|
|
34
|
+
label?: string;
|
|
35
|
+
hint?: string;
|
|
36
|
+
error?: string;
|
|
31
37
|
disabled?: boolean;
|
|
32
38
|
}) {
|
|
33
39
|
return React.createElement('bds-combobox', {
|
|
@@ -35,6 +41,9 @@ function BdsCombobox({
|
|
|
35
41
|
value,
|
|
36
42
|
options,
|
|
37
43
|
placeholder,
|
|
44
|
+
label,
|
|
45
|
+
hint,
|
|
46
|
+
error,
|
|
38
47
|
disabled: disabled || undefined,
|
|
39
48
|
});
|
|
40
49
|
}
|
|
@@ -62,6 +71,7 @@ type Story = StoryObj<typeof meta>;
|
|
|
62
71
|
export const Default: Story = {
|
|
63
72
|
args: {
|
|
64
73
|
name: 'country',
|
|
74
|
+
label: 'Country',
|
|
65
75
|
options: COUNTRIES,
|
|
66
76
|
placeholder: 'Search country…',
|
|
67
77
|
},
|
|
@@ -70,11 +80,32 @@ export const Default: Story = {
|
|
|
70
80
|
export const WithDisabledOption: Story = {
|
|
71
81
|
args: {
|
|
72
82
|
name: 'country',
|
|
83
|
+
label: 'Country',
|
|
73
84
|
options: COUNTRIES_WITH_DISABLED,
|
|
74
85
|
placeholder: 'Search country…',
|
|
75
86
|
},
|
|
76
87
|
};
|
|
77
88
|
|
|
89
|
+
export const WithHint: Story = {
|
|
90
|
+
args: {
|
|
91
|
+
name: 'country',
|
|
92
|
+
label: 'Country',
|
|
93
|
+
hint: 'Start typing to filter the list',
|
|
94
|
+
options: COUNTRIES,
|
|
95
|
+
placeholder: 'Search country…',
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
export const WithError: Story = {
|
|
100
|
+
args: {
|
|
101
|
+
name: 'country',
|
|
102
|
+
label: 'Country',
|
|
103
|
+
error: 'Please select a country',
|
|
104
|
+
options: COUNTRIES,
|
|
105
|
+
placeholder: 'Search country…',
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
|
|
78
109
|
export const Required: Story = {
|
|
79
110
|
args: {
|
|
80
111
|
name: 'country',
|
|
@@ -5,7 +5,7 @@ import * as Stories from './BdsFieldGroup.stories';
|
|
|
5
5
|
|
|
6
6
|
# `<bds-field-group>`
|
|
7
7
|
|
|
8
|
-
Framework-agnostic FieldGroup custom element. Wraps slotted fields in a `<fieldset>` with a styled `<legend>` and lays them out horizontally (with auto-collapse to vertical
|
|
8
|
+
Framework-agnostic FieldGroup custom element. Wraps slotted fields in a `<fieldset>` with a styled `<legend>` and lays them out horizontally (with auto-collapse to vertical, driven by a `ResizeObserver` — not a CSS container query, see below) or vertically.
|
|
9
9
|
|
|
10
10
|
Mirrors the React `FieldGroup` component — same token surface, same behavior, same auto-derived collapse threshold.
|
|
11
11
|
|
|
@@ -15,7 +15,7 @@ Mirrors the React `FieldGroup` component — same token surface, same behavior,
|
|
|
15
15
|
|-----------|--------|---------|-------------|
|
|
16
16
|
| `variant` | `horizontal` \| `vertical` | `horizontal` | Layout direction. |
|
|
17
17
|
| `legend` | string | — | Optional legend text. Falls back to `aria-label` semantics if you set that on the host directly. |
|
|
18
|
-
| `disabled` | boolean | `false` | Forwards to the inner `<fieldset
|
|
18
|
+
| `disabled` | boolean | `false` | Forwards to the inner `<fieldset>` AND is propagated to each directly-slotted form control's `disabled` property (see [Notes on shadow DOM](#notes-on-shadow-dom) — the UA's fieldset-disables-descendants behaviour doesn't reach light-DOM children projected through a slot, so the component does it explicitly). |
|
|
19
19
|
|
|
20
20
|
## Slots
|
|
21
21
|
|
|
@@ -55,6 +55,7 @@ Same surface as the React component. All public tokens are read with foundation-
|
|
|
55
55
|
| Variable | Default |
|
|
56
56
|
|----------|---------|
|
|
57
57
|
| `--fieldGroup_legend-color` | `var(--bds-color_on-bg)` |
|
|
58
|
+
| `--fieldGroup_legend-font-family` | `var(--bds-font_family--body)` |
|
|
58
59
|
| `--fieldGroup_legend-font-size` | `var(--bds-font_size--heading-3)` |
|
|
59
60
|
| `--fieldGroup_legend-font-weight` | `var(--bds-font_weight--semibold)` |
|
|
60
61
|
| `--fieldGroup_legend-line-height` | `var(--bds-font_line-height--heading)` |
|
|
@@ -62,6 +63,10 @@ Same surface as the React component. All public tokens are read with foundation-
|
|
|
62
63
|
| `--fieldGroup_legend-gap` | `var(--bds-space_m)` |
|
|
63
64
|
| `--fieldGroup_legend-border-block-end` | `1px solid var(--bds-color_bg--subtle)` |
|
|
64
65
|
|
|
66
|
+
## How auto-collapse works
|
|
67
|
+
|
|
68
|
+
CSS [`@container`](https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/At-rules/@container) query *conditions* can't reference custom properties (`var()` inside a container-query feature value is invalid CSS), so the per-instance `--fieldGroup_collapse-threshold` can't drive an `@container` rule directly. Instead, the component renders a hidden `.probe` element whose own inline-size resolves `--fieldGroup_collapse-threshold` as a normal property value, and a `ResizeObserver` compares the probe's resolved pixel width against the `<fieldset>`'s own width, toggling `data-collapsed="true"` on the **host** when the fieldset is narrower. This mirrors the React `FieldGroup` component's mechanism exactly. `ResizeObserver` is required for the collapse to run; it's supported by all current browsers, and in its absence the layout simply stays in its declared variant.
|
|
69
|
+
|
|
65
70
|
## Notes on shadow DOM
|
|
66
71
|
|
|
67
|
-
The component renders its own `<fieldset>` inside the shadow root and projects fields through a `<slot>`.
|
|
72
|
+
The component renders its own `<fieldset>` inside the shadow root and projects fields through a `<slot>`. Slotted elements' actual DOM parent stays the host (not the shadow-root fieldset), so the UA's native `fieldset[disabled]` cascade-to-descendants behaviour — which walks the DOM tree, not the flattened/composed tree — **never reaches them**, in any browser. To compensate, the component explicitly sets `.disabled` on each directly-slotted form control whenever `disabled` changes or new fields are slotted in, and tracks which controls it disabled so re-enabling the group never overrides a control a consumer had individually disabled beforehand. Deeply-nested form controls (e.g. a slotted wrapper `<div>` containing an `<input>`) are not reached — keep form controls as direct children of `<bds-field-group>`.
|
|
@@ -34,7 +34,7 @@ const meta = {
|
|
|
34
34
|
description: {
|
|
35
35
|
component:
|
|
36
36
|
'Framework-agnostic FieldGroup. Wraps slotted fields in a `<fieldset>` ' +
|
|
37
|
-
'and lays them out horizontally with a
|
|
37
|
+
'and lays them out horizontally with a ResizeObserver-driven auto-collapse ' +
|
|
38
38
|
'to a single column when the host is too narrow to fit a complete row at minimum field width.',
|
|
39
39
|
},
|
|
40
40
|
},
|
|
@@ -59,7 +59,20 @@ Use `<bds-file-input>` wherever users need to attach one or more files to a form
|
|
|
59
59
|
|
|
60
60
|
| Event | Detail | Description |
|
|
61
61
|
|--------------|--------------|-----------------------------------------|
|
|
62
|
-
| `bds-change` | `FileList` | Fired when files are selected or
|
|
62
|
+
| `bds-change` | `FileList` | Fired when files are selected via the picker or accepted via drag-and-drop |
|
|
63
|
+
|
|
64
|
+
## CSS Custom Properties
|
|
65
|
+
|
|
66
|
+
Token names match the React `FileInput` component (`--fileInput_*`) so themes written
|
|
67
|
+
against React apply here unchanged. The previous web-component-only `--file-input_*`
|
|
68
|
+
names still work as deprecated aliases.
|
|
69
|
+
|
|
70
|
+
| Property | Default | Description |
|
|
71
|
+
|------------------------------------|-------------------------------------------------------------|-------------------------------------------|
|
|
72
|
+
| `--fileInput_color` | `var(--bds-color_on-bg)` | Zone text/icon colour; also drives the `currentcolor` dashed border |
|
|
73
|
+
| `--fileInput_border-color` | `currentcolor` | Border colour while the zone has focus (`:focus-within`) |
|
|
74
|
+
| `--fileInput_border-color--hover` | `var(--bds-color_interactive)` | Border colour on hover |
|
|
75
|
+
| `--fileInput_bg--hover` | `rgb(from var(--bds-color_interactive) r g b / 4%)` | Background colour on hover |
|
|
63
76
|
|
|
64
77
|
## Usage in plain HTML
|
|
65
78
|
|
|
@@ -72,8 +85,16 @@ Use `<bds-file-input>` wherever users need to attach one or more files to a form
|
|
|
72
85
|
|
|
73
86
|
## Accessibility
|
|
74
87
|
|
|
75
|
-
- The drop zone
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
-
|
|
88
|
+
- The drop zone is rendered as a `<label>` associated with the (visually hidden but
|
|
89
|
+
focusable) shadow file input — the slotted text becomes the input's accessible name,
|
|
90
|
+
no hardcoded `aria-label` overrides it
|
|
91
|
+
- The shadow input is the only tab stop; the zone itself carries no `role`/`tabindex`
|
|
92
|
+
- `.zone:focus-within` shows a visible focus ring (`--bds-outline_default`) when the
|
|
93
|
+
shadow input has keyboard focus
|
|
94
|
+
- `Enter` and `Space` open the native file picker via the input's native keyboard handling
|
|
95
|
+
- `disabled` disables the shadow input (removing it from the tab order) and sets
|
|
96
|
+
`pointer-events: none` on the host
|
|
97
|
+
- Dropped files are filtered against `accept` (extension, `type/*`, or exact MIME type)
|
|
98
|
+
before being applied — files that don't match are silently discarded, matching the
|
|
99
|
+
native file picker's behaviour
|
|
79
100
|
- Participates in HTML forms via the Form-Associated Custom Elements API; files are submitted as `FormData` entries
|
|
@@ -77,6 +77,20 @@ Use `<bds-form-input>` for single-line text fields in forms. It handles label as
|
|
|
77
77
|
| `bds-input` | `{ value: string }` | Fired on every keystroke |
|
|
78
78
|
| `bds-change` | `{ value: string }` | Fired when the value is committed |
|
|
79
79
|
|
|
80
|
+
## CSS variables
|
|
81
|
+
|
|
82
|
+
Token names mirror the React `FormInput` component so themes carry over between the two implementations.
|
|
83
|
+
|
|
84
|
+
| Variable | Default | Description |
|
|
85
|
+
|----------|---------|-------------|
|
|
86
|
+
| `--formInput_color_bg` | `var(--bds-color_bg)` | Background colour |
|
|
87
|
+
| `--formInput_color` | `var(--bds-color_on-bg)` | Text colour |
|
|
88
|
+
| `--formInput_border` | `none` | Border (layered on top of the inset focus/error ring) |
|
|
89
|
+
| `--formInput_radius` | `var(--bds-border_radius--full)` | Corner radius |
|
|
90
|
+
| `--formInput_shadow` | `var(--bdc-outline_shadow)` | Box shadow |
|
|
91
|
+
|
|
92
|
+
`--input_*` (e.g. `--input_border`, `--input_radius`, `--input_shadow`, `--input_color`, `--input_color_bg`) are deprecated aliases for the `--formInput_*` tokens above — they still work but `--formInput_*` is the documented, forward-compatible name. `--formInput_border-color` is a web-component-only legacy override for the inset ring colour (fallback `currentcolor`); prefer `--formInput_border` for adding a visible border.
|
|
93
|
+
|
|
80
94
|
## Usage in plain HTML
|
|
81
95
|
|
|
82
96
|
```html
|
|
@@ -94,5 +108,6 @@ Use `<bds-form-input>` for single-line text fields in forms. It handles label as
|
|
|
94
108
|
- `required` adds `aria-required="true"` and a visual asterisk
|
|
95
109
|
- `error` sets `aria-invalid="true"` and links the error message via `aria-describedby`
|
|
96
110
|
- `hint` is linked via `aria-describedby` for screen reader announcement
|
|
111
|
+
- When both `error` and `hint` are set, both messages render (matching the React component) so `aria-describedby` never references an id that isn't in the DOM
|
|
97
112
|
- Error messages use `role="alert"` so they are announced immediately
|
|
98
|
-
- The focus ring is applied to the wrapper element, not the inner input
|
|
113
|
+
- The focus ring is applied to the wrapper element, not the inner input, and only appears for keyboard/`:focus-visible` focus — clicking into the field highlights the frame colour without showing the outline ring
|
|
@@ -24,12 +24,21 @@ Use `<bds-number-input>` for quantity selectors, counters, or any numeric field
|
|
|
24
24
|
### Default
|
|
25
25
|
<Canvas of={Stories.Default} />
|
|
26
26
|
|
|
27
|
+
### With label
|
|
28
|
+
<Canvas of={Stories.WithLabel} />
|
|
29
|
+
|
|
27
30
|
### With min and max
|
|
28
31
|
<Canvas of={Stories.WithMinMax} />
|
|
29
32
|
|
|
30
33
|
### With custom step (5)
|
|
31
34
|
<Canvas of={Stories.WithStep} />
|
|
32
35
|
|
|
36
|
+
### With hint
|
|
37
|
+
<Canvas of={Stories.WithHint} />
|
|
38
|
+
|
|
39
|
+
### With error
|
|
40
|
+
<Canvas of={Stories.WithError} />
|
|
41
|
+
|
|
33
42
|
### Disabled
|
|
34
43
|
<Canvas of={Stories.Disabled} />
|
|
35
44
|
|
|
@@ -47,6 +56,9 @@ Use `<bds-number-input>` for quantity selectors, counters, or any numeric field
|
|
|
47
56
|
| `max` | number | — | Maximum allowed value |
|
|
48
57
|
| `step` | number | `1` | Increment/decrement step |
|
|
49
58
|
| `disabled` | boolean | `false` | Disables the input and steppers |
|
|
59
|
+
| `label` | string | `""` | Visible label text, associated with the input via `for`/`id` |
|
|
60
|
+
| `hint` | string | — | Helper text shown below the input when there is no `error` |
|
|
61
|
+
| `error` | string | — | Error message; when set the input enters error state and the message replaces the hint |
|
|
50
62
|
|
|
51
63
|
## Events
|
|
52
64
|
|
|
@@ -58,13 +70,33 @@ Use `<bds-number-input>` for quantity selectors, counters, or any numeric field
|
|
|
58
70
|
## Usage in plain HTML
|
|
59
71
|
|
|
60
72
|
```html
|
|
61
|
-
<bds-number-input name="qty" value="1" min="0" max="99" step="1"></bds-number-input>
|
|
73
|
+
<bds-number-input name="qty" label="Quantity" value="1" min="0" max="99" step="1"></bds-number-input>
|
|
62
74
|
```
|
|
63
75
|
|
|
64
76
|
## Accessibility
|
|
65
77
|
|
|
66
|
-
-
|
|
78
|
+
- `label` renders a shadow `<label for>` wired to the inner input's `id`, so the field always has an accessible name when a label is provided — leaving `label` unset renders no label element and no accessible name
|
|
79
|
+
- Decrement button has `aria-label="Decrease"` and increment has `aria-label="Increase"`, and both steppers carry `aria-controls` pointing at the input's `id`
|
|
80
|
+
- The input exposes `aria-invalid` (`"true"` when `error` is set) and `aria-describedby`, referencing the rendered error or hint message
|
|
67
81
|
- Stepper buttons are disabled when the value is at `min` or `max`
|
|
68
82
|
- The stepper buttons use `tabindex="-1"` so keyboard users navigate directly to the numeric input
|
|
69
83
|
- `disabled` disables both the input and the stepper buttons
|
|
70
84
|
- Participates in HTML forms via the Form-Associated Custom Elements API
|
|
85
|
+
|
|
86
|
+
## CSS Custom Properties
|
|
87
|
+
|
|
88
|
+
| Property | Default | Description |
|
|
89
|
+
|----------------------------------------|---------------------------------------|-------------------------------------------------|
|
|
90
|
+
| `--numberInput_border` | `none` | Extra CSS `border` on the row frame (on top of the inset bdc border) |
|
|
91
|
+
| `--numberInput_radius` | `--bds-border_radius--full` | Corner radius of the row frame and outer stepper corners |
|
|
92
|
+
| `--numberInput_shadow` | `--bdc-outline_shadow` | Additional `box-shadow` layered after the bdc inset border |
|
|
93
|
+
| `--numberInput_font-size` | `--bds-font_size--body` | Input font size |
|
|
94
|
+
| `--numberInput_padding` | `--bds-space_s` | Input padding |
|
|
95
|
+
| `--numberInput_color` | `--bds-color_on-bg` | Input text color |
|
|
96
|
+
| `--numberInput_stepper-padding` | `--bds-space_xs` | Padding of each stepper button (drives its size together with the icon) |
|
|
97
|
+
| `--numberInput_stepper-bg` | `--bds-color_bg--subtle` | Stepper background color |
|
|
98
|
+
| `--numberInput_stepper-bg--hover` | `--bds-color_bg--subtle` | Stepper background color on hover |
|
|
99
|
+
| `--numberInput_stepper-opacity--hover`| `0.7` | Stepper opacity on hover |
|
|
100
|
+
| `--numberInput_stepper-color` | `--bds-color_interactive` | Stepper icon color |
|
|
101
|
+
|
|
102
|
+
> **Deprecated:** `--number-input_border-color`, `--number-input_radius`, `--number-input_shadow`, `--number-input_color_bg`, and `--number-input_color` (the original kebab-cased `--number-input_*` names) still work as legacy fallbacks but are superseded by the `--numberInput_*` names above and will be removed in a future major version.
|
|
@@ -9,6 +9,9 @@ function BdsNumberInput({
|
|
|
9
9
|
max,
|
|
10
10
|
step,
|
|
11
11
|
disabled,
|
|
12
|
+
label,
|
|
13
|
+
hint,
|
|
14
|
+
error,
|
|
12
15
|
}: {
|
|
13
16
|
name?: string;
|
|
14
17
|
value?: number;
|
|
@@ -16,6 +19,9 @@ function BdsNumberInput({
|
|
|
16
19
|
max?: number;
|
|
17
20
|
step?: number;
|
|
18
21
|
disabled?: boolean;
|
|
22
|
+
label?: string;
|
|
23
|
+
hint?: string;
|
|
24
|
+
error?: string;
|
|
19
25
|
}) {
|
|
20
26
|
return React.createElement('bds-number-input', {
|
|
21
27
|
name,
|
|
@@ -24,6 +30,9 @@ function BdsNumberInput({
|
|
|
24
30
|
max,
|
|
25
31
|
step,
|
|
26
32
|
disabled: disabled || undefined,
|
|
33
|
+
label,
|
|
34
|
+
hint,
|
|
35
|
+
error,
|
|
27
36
|
});
|
|
28
37
|
}
|
|
29
38
|
|
|
@@ -38,6 +47,9 @@ const meta = {
|
|
|
38
47
|
min: { control: 'number' },
|
|
39
48
|
max: { control: 'number' },
|
|
40
49
|
step: { control: 'number' },
|
|
50
|
+
label: { control: 'text' },
|
|
51
|
+
hint: { control: 'text' },
|
|
52
|
+
error: { control: 'text' },
|
|
41
53
|
},
|
|
42
54
|
decorators: [
|
|
43
55
|
(Story: React.ComponentType) => (
|
|
@@ -55,14 +67,26 @@ export const Default: Story = {
|
|
|
55
67
|
args: { name: 'quantity', value: 0 },
|
|
56
68
|
};
|
|
57
69
|
|
|
70
|
+
export const WithLabel: Story = {
|
|
71
|
+
args: { name: 'quantity', label: 'Quantity', value: 1 },
|
|
72
|
+
};
|
|
73
|
+
|
|
58
74
|
export const WithMinMax: Story = {
|
|
59
|
-
args: { name: 'quantity', value: 5, min: 0, max: 10 },
|
|
75
|
+
args: { name: 'quantity', label: 'Quantity', value: 5, min: 0, max: 10 },
|
|
60
76
|
};
|
|
61
77
|
|
|
62
78
|
export const WithStep: Story = {
|
|
63
|
-
args: { name: 'quantity', value: 0, step: 5, min: 0, max: 100 },
|
|
79
|
+
args: { name: 'quantity', label: 'Quantity', value: 0, step: 5, min: 0, max: 100 },
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
export const WithHint: Story = {
|
|
83
|
+
args: { name: 'quantity', label: 'Quantity', value: 1, hint: 'Whole numbers only' },
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
export const WithError: Story = {
|
|
87
|
+
args: { name: 'quantity', label: 'Quantity', value: 0, min: 1, error: 'Quantity must be at least 1' },
|
|
64
88
|
};
|
|
65
89
|
|
|
66
90
|
export const Disabled: Story = {
|
|
67
|
-
args: { name: 'quantity', value: 3, disabled: true },
|
|
91
|
+
args: { name: 'quantity', label: 'Quantity', value: 3, disabled: true },
|
|
68
92
|
};
|
|
@@ -30,19 +30,30 @@ Use `<bds-radio>` for single-choice selection from a set of options. Always grou
|
|
|
30
30
|
### Disabled
|
|
31
31
|
<Canvas of={Stories.Disabled} />
|
|
32
32
|
|
|
33
|
+
### With description
|
|
34
|
+
<Canvas of={Stories.WithDescription} />
|
|
35
|
+
|
|
36
|
+
### With error
|
|
37
|
+
<Canvas of={Stories.WithError} />
|
|
38
|
+
|
|
39
|
+
### Group (mutually exclusive selection)
|
|
40
|
+
<Canvas of={Stories.Group} />
|
|
41
|
+
|
|
33
42
|
## Props
|
|
34
43
|
|
|
35
44
|
<ArgTypes of={Stories} />
|
|
36
45
|
|
|
37
46
|
## Attributes
|
|
38
47
|
|
|
39
|
-
| Attribute
|
|
40
|
-
|
|
41
|
-
| `name`
|
|
42
|
-
| `value`
|
|
43
|
-
| `checked`
|
|
44
|
-
| `required`
|
|
45
|
-
| `disabled`
|
|
48
|
+
| Attribute | Type | Default | Description |
|
|
49
|
+
|---------------|---------|---------|------------------------------------------------------------------|
|
|
50
|
+
| `name` | string | `""` | Form field name — radios sharing a `name` form a mutually exclusive group |
|
|
51
|
+
| `value` | string | `""` | Value submitted when this option is selected |
|
|
52
|
+
| `checked` | boolean | `false` | Whether this option is selected |
|
|
53
|
+
| `required` | boolean | `false` | Marks the field as required |
|
|
54
|
+
| `disabled` | boolean | `false` | Disables this radio option |
|
|
55
|
+
| `error` | boolean | `false` | Error visual state; sets `aria-invalid="true"` on the input |
|
|
56
|
+
| `description` | string | — | Supporting text rendered below the label, wired via `aria-describedby` |
|
|
46
57
|
|
|
47
58
|
## Slots
|
|
48
59
|
|
|
@@ -52,9 +63,23 @@ Use `<bds-radio>` for single-choice selection from a set of options. Always grou
|
|
|
52
63
|
|
|
53
64
|
## Events
|
|
54
65
|
|
|
55
|
-
| Event
|
|
56
|
-
|
|
57
|
-
| `change` |
|
|
66
|
+
| Event | Detail | Description |
|
|
67
|
+
|--------------|--------------------------------------|---------------------------------------------------------------------|
|
|
68
|
+
| `bds-change` | `{ value: string, checked: true }` | Fired when this radio becomes checked via user interaction (click or arrow-key navigation). Composed — crosses the shadow boundary, unlike the native `change` event. |
|
|
69
|
+
|
|
70
|
+
## Overridable CSS custom properties
|
|
71
|
+
|
|
72
|
+
| Token | Default | Description |
|
|
73
|
+
|------------------------------|-----------------------------------|-------------------------------------------------|
|
|
74
|
+
| `--radio_color` | `--bds-color_on-bg` (via `--radio_border-color`, deprecated) | Border/text colour driving the `currentcolor` frame |
|
|
75
|
+
| `--radio_border` | `none` | Border shorthand around the frame |
|
|
76
|
+
| `--radio_radius` | `--bds-border_radius--circle` | Corner radius |
|
|
77
|
+
| `--radio_shadow` | `--bdc-outline_shadow` | Extra box-shadow layered with the inset border |
|
|
78
|
+
| `--radio_color_bg` | `--bds-color_bg` | Background colour |
|
|
79
|
+
| `--radio_color-active` | `--bdc-color_active` | Colour of the inner dot / border when checked |
|
|
80
|
+
| `--radio_description-color` | `--bds-color_on-bg--subtle` | Colour of the `description` text |
|
|
81
|
+
|
|
82
|
+
> `--radio_border-color` is a **deprecated alias** for `--radio_color` — it still works but new code should use `--radio_color`.
|
|
58
83
|
|
|
59
84
|
## Usage in plain HTML
|
|
60
85
|
|
|
@@ -67,6 +92,8 @@ Use `<bds-radio>` for single-choice selection from a set of options. Always grou
|
|
|
67
92
|
## Accessibility
|
|
68
93
|
|
|
69
94
|
- The inner `<input type="radio">` is associated with a `<label>` via matching `id`/`for` attributes
|
|
70
|
-
- Radios
|
|
95
|
+
- Radios sharing a `name` form a real mutually exclusive group: checking one unchecks the others (searched within the same document/shadow root), and `ArrowUp`/`ArrowDown`/`ArrowLeft`/`ArrowRight` move selection between them
|
|
96
|
+
- Roving `tabindex`: only the checked radio (or the first radio if none is checked) is a tab stop within its group, matching native `<input type="radio">` keyboard semantics
|
|
97
|
+
- `error` sets `aria-invalid="true"` on the inner input; `description` is wired via `aria-describedby`
|
|
71
98
|
- Use `<bds-radio-group>` to wrap related radios in a `<fieldset>`/`<legend>` for proper screen reader announcements
|
|
72
|
-
- Participates in HTML forms via the Form-Associated Custom Elements API
|
|
99
|
+
- Participates in HTML forms via the Form-Associated Custom Elements API; `formResetCallback` restores the radio's initial `checked` state on form reset
|
|
@@ -8,6 +8,8 @@ function BdsRadio({
|
|
|
8
8
|
checked,
|
|
9
9
|
required,
|
|
10
10
|
disabled,
|
|
11
|
+
error,
|
|
12
|
+
description,
|
|
11
13
|
children,
|
|
12
14
|
}: {
|
|
13
15
|
name?: string;
|
|
@@ -15,6 +17,8 @@ function BdsRadio({
|
|
|
15
17
|
checked?: boolean;
|
|
16
18
|
required?: boolean;
|
|
17
19
|
disabled?: boolean;
|
|
20
|
+
error?: boolean;
|
|
21
|
+
description?: string;
|
|
18
22
|
children?: React.ReactNode;
|
|
19
23
|
}) {
|
|
20
24
|
return React.createElement(
|
|
@@ -25,6 +29,8 @@ function BdsRadio({
|
|
|
25
29
|
checked: checked || undefined,
|
|
26
30
|
required: required || undefined,
|
|
27
31
|
disabled: disabled || undefined,
|
|
32
|
+
error: error || undefined,
|
|
33
|
+
description,
|
|
28
34
|
},
|
|
29
35
|
children,
|
|
30
36
|
);
|
|
@@ -39,6 +45,8 @@ const meta = {
|
|
|
39
45
|
checked: { control: 'boolean' },
|
|
40
46
|
required: { control: 'boolean' },
|
|
41
47
|
disabled: { control: 'boolean' },
|
|
48
|
+
error: { control: 'boolean' },
|
|
49
|
+
description: { control: 'text' },
|
|
42
50
|
},
|
|
43
51
|
} satisfies Meta<typeof BdsRadio>;
|
|
44
52
|
|
|
@@ -56,3 +64,21 @@ export const Checked: Story = {
|
|
|
56
64
|
export const Disabled: Story = {
|
|
57
65
|
args: { name: 'size', value: 'm', disabled: true, children: 'Medium (disabled)' },
|
|
58
66
|
};
|
|
67
|
+
|
|
68
|
+
export const WithDescription: Story = {
|
|
69
|
+
args: { name: 'size', value: 'm', description: 'Fits most people', children: 'Medium' },
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
export const WithError: Story = {
|
|
73
|
+
args: { name: 'size', value: 'm', error: true, children: 'Medium' },
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
export const Group: Story = {
|
|
77
|
+
render: () => (
|
|
78
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: '0.5rem' }}>
|
|
79
|
+
{React.createElement('bds-radio', { name: 'group-size', value: 's' }, 'Small')}
|
|
80
|
+
{React.createElement('bds-radio', { name: 'group-size', value: 'm', checked: true }, 'Medium')}
|
|
81
|
+
{React.createElement('bds-radio', { name: 'group-size', value: 'l' }, 'Large')}
|
|
82
|
+
</div>
|
|
83
|
+
),
|
|
84
|
+
};
|