@boostdev/design-system-components 2.7.1 → 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-3AY2YKCM.js +223 -0
- package/dist/web-components/chunk-3WAV6MDN.js +212 -0
- package/dist/web-components/{chunk-CZBIVR4V.js → chunk-47AT5KZD.js} +88 -16
- 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-5R6IFELV.js → chunk-AIBOHNDU.js} +11 -1
- package/dist/web-components/{chunk-ITHLKR7Q.js → chunk-AP4RDUL2.js} +16 -5
- 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-CM3KYZ6Z.js → chunk-JH6LQKLK.js} +78 -6
- 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-57TRNCWQ.js → chunk-WFVKU4GX.js} +22 -11
- 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-F5E3IT7G.js → chunk-XIZWAWMJ.js} +50 -11
- 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 +60 -13
- 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 +102 -17
- 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 +136 -23
- 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 +96 -8
- package/src/web-components/interaction/form/bds-slider.spec.ts +83 -0
- package/src/web-components/interaction/form/bds-slider.ts +181 -33
- package/src/web-components/interaction/form/bds-switch.spec.ts +68 -0
- package/src/web-components/interaction/form/bds-switch.ts +142 -41
- package/src/web-components/interaction/form/bds-textarea.spec.ts +71 -0
- package/src/web-components/interaction/form/bds-textarea.ts +109 -8
- 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 +30 -12
- 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 +113 -36
- 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 +16 -15
- 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 +11 -1
- 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 +19 -6
- 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-5TFWOPLH.js +0 -49
- package/dist/web-components/chunk-7FMR53BW.js +0 -127
- package/dist/web-components/chunk-AGKJTMJI.js +0 -56
- package/dist/web-components/chunk-BQLZ7I4G.js +0 -56
- package/dist/web-components/chunk-IYGF6CD5.js +0 -118
- package/dist/web-components/chunk-QBB6ZX4R.js +0 -107
- package/dist/web-components/chunk-Y3POAKGS.js +0 -133
- 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
|
@@ -7,27 +7,39 @@ describe('bds-section-header', () => {
|
|
|
7
7
|
});
|
|
8
8
|
|
|
9
9
|
it('renders an <h2> title by default', async () => {
|
|
10
|
-
const el = await fixture('<bds-section-header
|
|
10
|
+
const el = await fixture('<bds-section-header heading="Hello"></bds-section-header>');
|
|
11
11
|
const h2 = el.shadowRoot!.querySelector('h2');
|
|
12
12
|
expect(h2).not.toBeNull();
|
|
13
13
|
expect(h2!.textContent).toBe('Hello');
|
|
14
14
|
cleanup(el);
|
|
15
15
|
});
|
|
16
16
|
|
|
17
|
-
it('renders the
|
|
18
|
-
const el = await fixture('<bds-section-header
|
|
17
|
+
it('renders the heading text', async () => {
|
|
18
|
+
const el = await fixture('<bds-section-header heading="Welcome"></bds-section-header>');
|
|
19
19
|
expect(el.shadowRoot!.querySelector('.title')!.textContent).toBe('Welcome');
|
|
20
20
|
cleanup(el);
|
|
21
21
|
});
|
|
22
22
|
|
|
23
|
+
it('falls back to the deprecated title attribute when heading is unset', async () => {
|
|
24
|
+
const el = await fixture('<bds-section-header title="Legacy heading"></bds-section-header>');
|
|
25
|
+
expect(el.shadowRoot!.querySelector('.title')!.textContent).toBe('Legacy heading');
|
|
26
|
+
cleanup(el);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('prefers heading over the deprecated title attribute when both are set', async () => {
|
|
30
|
+
const el = await fixture('<bds-section-header heading="New" title="Old"></bds-section-header>');
|
|
31
|
+
expect(el.shadowRoot!.querySelector('.title')!.textContent).toBe('New');
|
|
32
|
+
cleanup(el);
|
|
33
|
+
});
|
|
34
|
+
|
|
23
35
|
it('does not render subtitle when not set', async () => {
|
|
24
|
-
const el = await fixture('<bds-section-header
|
|
36
|
+
const el = await fixture('<bds-section-header heading="Hello"></bds-section-header>');
|
|
25
37
|
expect(el.shadowRoot!.querySelector('.subtitle')).toBeNull();
|
|
26
38
|
cleanup(el);
|
|
27
39
|
});
|
|
28
40
|
|
|
29
41
|
it('renders subtitle when set', async () => {
|
|
30
|
-
const el = await fixture('<bds-section-header
|
|
42
|
+
const el = await fixture('<bds-section-header heading="Hello" subtitle="Subtitle text"></bds-section-header>');
|
|
31
43
|
const subtitle = el.shadowRoot!.querySelector('.subtitle');
|
|
32
44
|
expect(subtitle).not.toBeNull();
|
|
33
45
|
expect(subtitle!.textContent).toBe('Subtitle text');
|
|
@@ -35,23 +47,42 @@ describe('bds-section-header', () => {
|
|
|
35
47
|
});
|
|
36
48
|
|
|
37
49
|
it('uses title-as to override the title element', async () => {
|
|
38
|
-
const el = await fixture('<bds-section-header
|
|
50
|
+
const el = await fixture('<bds-section-header heading="Hello" title-as="h1"></bds-section-header>');
|
|
39
51
|
expect(el.shadowRoot!.querySelector('h1')).not.toBeNull();
|
|
40
52
|
expect(el.shadowRoot!.querySelector('h2')).toBeNull();
|
|
41
53
|
cleanup(el);
|
|
42
54
|
});
|
|
43
55
|
|
|
44
56
|
it('applies alignment class', async () => {
|
|
45
|
-
const el = await fixture('<bds-section-header
|
|
57
|
+
const el = await fixture('<bds-section-header heading="Hello" alignment="center"></bds-section-header>');
|
|
46
58
|
const header = el.shadowRoot!.querySelector('.header');
|
|
47
59
|
expect(header!.classList.contains('--center')).toBe(true);
|
|
48
60
|
cleanup(el);
|
|
49
61
|
});
|
|
50
62
|
|
|
51
63
|
it('applies size class', async () => {
|
|
52
|
-
const el = await fixture('<bds-section-header
|
|
64
|
+
const el = await fixture('<bds-section-header heading="Hello" size="large"></bds-section-header>');
|
|
53
65
|
const header = el.shadowRoot!.querySelector('.header');
|
|
54
66
|
expect(header!.classList.contains('--large')).toBe(true);
|
|
55
67
|
cleanup(el);
|
|
56
68
|
});
|
|
69
|
+
|
|
70
|
+
it('applies the xs size class (previously unstyled)', async () => {
|
|
71
|
+
const el = await fixture('<bds-section-header heading="Hello" size="xs"></bds-section-header>');
|
|
72
|
+
const header = el.shadowRoot!.querySelector('.header');
|
|
73
|
+
expect(header!.classList.contains('--xs')).toBe(true);
|
|
74
|
+
cleanup(el);
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
it('spans the full grid row via --bds-grid_span-100', async () => {
|
|
78
|
+
const el = await fixture('<bds-section-header heading="Hello"></bds-section-header>');
|
|
79
|
+
expect(BdsSectionHeader.styles.cssText).toMatch(/:host\s*{[^}]*grid-column:\s*var\(--bds-grid_span-100\)/);
|
|
80
|
+
cleanup(el);
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
it('mirrors React size-token fallbacks for the xs variant', () => {
|
|
84
|
+
const cssText = BdsSectionHeader.styles.cssText;
|
|
85
|
+
expect(cssText).toMatch(/\.header\.--xs\s+\.title\s*{[^}]*font-size:\s*var\(--sectionHeader_title-size,\s*var\(--bds-font_size--heading-2\)\)/);
|
|
86
|
+
expect(cssText).toMatch(/\.header\.--xs\s+\.subtitle\s*{[^}]*font-size:\s*var\(--sectionHeader_subtitle-size,\s*var\(--bds-font_size--body\)\)/);
|
|
87
|
+
});
|
|
57
88
|
});
|
|
@@ -5,29 +5,45 @@ import { html as staticHtml, unsafeStatic } from 'lit/static-html.js';
|
|
|
5
5
|
* `<bds-section-header>` — framework-agnostic Section Header custom element.
|
|
6
6
|
*
|
|
7
7
|
* Attributes:
|
|
8
|
-
*
|
|
8
|
+
* heading — heading text (required)
|
|
9
|
+
* title — deprecated alias for `heading`. Collides with the global HTML
|
|
10
|
+
* `title` attribute, which triggers a native browser tooltip on
|
|
11
|
+
* hover — use `heading` instead. Kept working for backwards
|
|
12
|
+
* compatibility; will be removed in a later major.
|
|
9
13
|
* subtitle — optional subheading text
|
|
10
14
|
* alignment — "start" (default) | "center" | "end"
|
|
11
|
-
* size — "small" | "medium" (default) | "large"
|
|
15
|
+
* size — "xs" | "small" | "medium" (default) | "large"
|
|
12
16
|
* title-as — tag name for the title element (default: "h2")
|
|
13
17
|
*
|
|
14
18
|
* @example
|
|
15
|
-
* <bds-section-header
|
|
19
|
+
* <bds-section-header heading="Our Products" subtitle="Browse the full range" size="large"></bds-section-header>
|
|
16
20
|
*/
|
|
17
21
|
export class BdsSectionHeader extends LitElement {
|
|
18
22
|
static styles = css`
|
|
23
|
+
/* Shadow DOM does not inherit the global box-sizing reset, so set it
|
|
24
|
+
here; otherwise elements with an explicit size + padding size as
|
|
25
|
+
content-box and layouts drift from the React (light-DOM) versions. */
|
|
26
|
+
:host,
|
|
27
|
+
*,
|
|
28
|
+
*::before,
|
|
29
|
+
*::after {
|
|
30
|
+
box-sizing: border-box;
|
|
31
|
+
}
|
|
32
|
+
|
|
19
33
|
:host {
|
|
20
34
|
display: block;
|
|
35
|
+
grid-column: var(--bds-grid_span-100);
|
|
21
36
|
}
|
|
22
37
|
|
|
23
38
|
.header {
|
|
24
39
|
display: flex;
|
|
25
40
|
flex-direction: column;
|
|
26
|
-
gap: var(--bds-space_m);
|
|
41
|
+
gap: var(--sectionHeader_gap, var(--bds-space_m));
|
|
27
42
|
}
|
|
28
43
|
|
|
29
44
|
.title {
|
|
30
|
-
|
|
45
|
+
/* --sectionHeader-title-color (kebab delimiter) is deprecated -- use --sectionHeader_title-color */
|
|
46
|
+
color: var(--sectionHeader_title-color, var(--sectionHeader-title-color, var(--bds-color_on-bg)));
|
|
31
47
|
margin: 0;
|
|
32
48
|
font-family: var(--bds-font_family--body);
|
|
33
49
|
}
|
|
@@ -43,17 +59,22 @@ export class BdsSectionHeader extends LitElement {
|
|
|
43
59
|
.header.--center { align-items: center; text-align: center; }
|
|
44
60
|
.header.--end { align-items: flex-end; text-align: end; }
|
|
45
61
|
|
|
46
|
-
|
|
47
|
-
.header.--
|
|
62
|
+
/* medium first -- default size, so MCP extraction picks up its fallbacks */
|
|
63
|
+
.header.--medium .title { font-size: var(--sectionHeader_title-size, var(--bds-font_size--heading-1)); line-height: var(--sectionHeader_title-line-height, var(--bds-font_line-height--heading)); font-weight: var(--sectionHeader_title-weight, var(--bds-font_weight--bold)); }
|
|
64
|
+
.header.--medium .subtitle { font-size: var(--sectionHeader_subtitle-size, var(--bds-font_size--heading-3)); line-height: var(--sectionHeader_subtitle-line-height, 1.3); }
|
|
65
|
+
|
|
66
|
+
.header.--xs .title { font-size: var(--sectionHeader_title-size, var(--bds-font_size--heading-2)); line-height: var(--sectionHeader_title-line-height, var(--bds-font_line-height--heading)); font-weight: var(--sectionHeader_title-weight, var(--bds-font_weight--bold)); }
|
|
67
|
+
.header.--xs .subtitle { font-size: var(--sectionHeader_subtitle-size, var(--bds-font_size--body)); line-height: var(--sectionHeader_subtitle-line-height, 1.4); }
|
|
48
68
|
|
|
49
|
-
.header.--
|
|
50
|
-
.header.--
|
|
69
|
+
.header.--small .title { font-size: var(--sectionHeader_title-size, var(--bds-font_size--heading-1)); line-height: var(--sectionHeader_title-line-height, var(--bds-font_line-height--heading)); font-weight: var(--sectionHeader_title-weight, var(--bds-font_weight--bold)); }
|
|
70
|
+
.header.--small .subtitle { font-size: var(--sectionHeader_subtitle-size, var(--bds-font_size--body)); line-height: var(--sectionHeader_subtitle-line-height, 1.4); }
|
|
51
71
|
|
|
52
|
-
.header.--large .title { font-size: var(--bds-font_size--display); line-height: var(--bds-font_line-height--display); font-weight: var(--bds-font_weight--bold); letter-spacing: var(--bds-font_tracking--tight); }
|
|
53
|
-
.header.--large .subtitle { font-size: var(--bds-font_size--heading-2); line-height: 1.3; font-weight: var(--bds-font_weight--medium); }
|
|
72
|
+
.header.--large .title { font-size: var(--sectionHeader_title-size, var(--bds-font_size--display)); line-height: var(--sectionHeader_title-line-height, var(--bds-font_line-height--display)); font-weight: var(--sectionHeader_title-weight, var(--bds-font_weight--bold)); letter-spacing: var(--bds-font_tracking--tight); }
|
|
73
|
+
.header.--large .subtitle { font-size: var(--sectionHeader_subtitle-size, var(--bds-font_size--heading-2)); line-height: var(--sectionHeader_subtitle-line-height, 1.3); font-weight: var(--bds-font_weight--medium); }
|
|
54
74
|
`;
|
|
55
75
|
|
|
56
76
|
static properties = {
|
|
77
|
+
heading: { type: String },
|
|
57
78
|
title: { type: String },
|
|
58
79
|
subtitle: { type: String },
|
|
59
80
|
alignment: { type: String, reflect: true },
|
|
@@ -61,14 +82,23 @@ export class BdsSectionHeader extends LitElement {
|
|
|
61
82
|
titleAs: { type: String, attribute: 'title-as' },
|
|
62
83
|
};
|
|
63
84
|
|
|
85
|
+
// `declare` annotates the type without emitting a class field initializer
|
|
86
|
+
// that would shadow Lit's reactive accessors on the prototype.
|
|
87
|
+
declare heading: string;
|
|
88
|
+
/**
|
|
89
|
+
* @deprecated Use `heading` instead. Sharing the name with the global HTML
|
|
90
|
+
* `title` attribute makes the browser show a native tooltip on hover.
|
|
91
|
+
* Still read as a fallback for the heading text when `heading` is unset.
|
|
92
|
+
*/
|
|
64
93
|
declare title: string;
|
|
65
94
|
declare subtitle: string;
|
|
66
95
|
declare alignment: 'start' | 'center' | 'end';
|
|
67
|
-
declare size: 'small' | 'medium' | 'large';
|
|
96
|
+
declare size: 'xs' | 'small' | 'medium' | 'large';
|
|
68
97
|
declare titleAs: string;
|
|
69
98
|
|
|
70
99
|
constructor() {
|
|
71
100
|
super();
|
|
101
|
+
this.heading = '';
|
|
72
102
|
this.title = '';
|
|
73
103
|
this.subtitle = '';
|
|
74
104
|
this.alignment = 'start';
|
|
@@ -76,11 +106,15 @@ export class BdsSectionHeader extends LitElement {
|
|
|
76
106
|
this.titleAs = 'h2';
|
|
77
107
|
}
|
|
78
108
|
|
|
109
|
+
private get _headingText() {
|
|
110
|
+
return this.heading || this.title;
|
|
111
|
+
}
|
|
112
|
+
|
|
79
113
|
render() {
|
|
80
114
|
const tag = unsafeStatic(this.titleAs || 'h2');
|
|
81
115
|
return html`
|
|
82
116
|
<div class="header --${this.alignment} --${this.size}">
|
|
83
|
-
${staticHtml`<${tag} class="title">${this.
|
|
117
|
+
${staticHtml`<${tag} class="title">${this._headingText}</${tag}>`}
|
|
84
118
|
${this.subtitle ? html`<p class="subtitle">${this.subtitle}</p>` : nothing}
|
|
85
119
|
</div>
|
|
86
120
|
`;
|
|
@@ -12,6 +12,16 @@ import { LitElement, css, html } from 'lit';
|
|
|
12
12
|
*/
|
|
13
13
|
export class BdsSeparator extends LitElement {
|
|
14
14
|
static styles = css`
|
|
15
|
+
/* Shadow DOM does not inherit the global box-sizing reset, so set it
|
|
16
|
+
here; otherwise elements with an explicit size + padding size as
|
|
17
|
+
content-box and layouts drift from the React (light-DOM) versions. */
|
|
18
|
+
:host,
|
|
19
|
+
*,
|
|
20
|
+
*::before,
|
|
21
|
+
*::after {
|
|
22
|
+
box-sizing: border-box;
|
|
23
|
+
}
|
|
24
|
+
|
|
15
25
|
:host {
|
|
16
26
|
display: block;
|
|
17
27
|
}
|
|
@@ -10,6 +10,16 @@ import { LitElement, css, html } from 'lit';
|
|
|
10
10
|
*/
|
|
11
11
|
export class BdsSkeleton extends LitElement {
|
|
12
12
|
static styles = css`
|
|
13
|
+
/* Shadow DOM does not inherit the global box-sizing reset, so set it
|
|
14
|
+
here; otherwise elements with an explicit size + padding size as
|
|
15
|
+
content-box and layouts drift from the React (light-DOM) versions. */
|
|
16
|
+
:host,
|
|
17
|
+
*,
|
|
18
|
+
*::before,
|
|
19
|
+
*::after {
|
|
20
|
+
box-sizing: border-box;
|
|
21
|
+
}
|
|
22
|
+
|
|
13
23
|
:host {
|
|
14
24
|
display: block;
|
|
15
25
|
}
|
|
@@ -42,4 +42,67 @@ describe('bds-table', () => {
|
|
|
42
42
|
expect(el.querySelector('table')).not.toBeNull();
|
|
43
43
|
cleanup(el);
|
|
44
44
|
});
|
|
45
|
+
|
|
46
|
+
it('adopts a document-level stylesheet styling slotted thead/th/td descendants', () => {
|
|
47
|
+
// ::slotted() only matches the directly-slotted <table>, never its thead/th/td
|
|
48
|
+
// descendants, so those must be styled from a document-level adopted stylesheet.
|
|
49
|
+
const cssText = Array.from(document.adoptedStyleSheets ?? [])
|
|
50
|
+
.flatMap((sheet) => Array.from(sheet.cssRules))
|
|
51
|
+
.map((rule) => rule.cssText)
|
|
52
|
+
.join('\n');
|
|
53
|
+
expect(cssText).toContain('bds-table > table thead');
|
|
54
|
+
expect(cssText).toContain('bds-table > table th');
|
|
55
|
+
expect(cssText).toContain('bds-table > table td');
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it('ships a sticky-header rule targeting slotted thead th', () => {
|
|
59
|
+
const cssText = Array.from(document.adoptedStyleSheets ?? [])
|
|
60
|
+
.flatMap((sheet) => Array.from(sheet.cssRules))
|
|
61
|
+
.map((rule) => rule.cssText)
|
|
62
|
+
.join('\n');
|
|
63
|
+
expect(cssText).toContain('bds-table[sticky-header] > table thead th');
|
|
64
|
+
expect(cssText).toContain('position: sticky');
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it('wrapper is keyboard-focusable so it can be scrolled without a mouse', async () => {
|
|
68
|
+
const el = await fixture('<bds-table></bds-table>');
|
|
69
|
+
const wrapper = el.shadowRoot!.querySelector('.wrapper') as HTMLElement;
|
|
70
|
+
expect(wrapper.getAttribute('tabindex')).toBe('0');
|
|
71
|
+
cleanup(el);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it('wrapper has no region role when no aria-label is provided', async () => {
|
|
75
|
+
const el = await fixture('<bds-table></bds-table>');
|
|
76
|
+
const wrapper = el.shadowRoot!.querySelector('.wrapper') as HTMLElement;
|
|
77
|
+
expect(wrapper.getAttribute('role')).toBeNull();
|
|
78
|
+
expect(wrapper.getAttribute('aria-label')).toBeNull();
|
|
79
|
+
cleanup(el);
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
it('forwards aria-label onto the wrapper as an accessible region name', async () => {
|
|
83
|
+
const el = await fixture('<bds-table aria-label="Team members"></bds-table>') as BdsTable;
|
|
84
|
+
expect(el.ariaLabel).toBe('Team members');
|
|
85
|
+
const wrapper = el.shadowRoot!.querySelector('.wrapper') as HTMLElement;
|
|
86
|
+
expect(wrapper.getAttribute('role')).toBe('region');
|
|
87
|
+
expect(wrapper.getAttribute('aria-label')).toBe('Team members');
|
|
88
|
+
cleanup(el);
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
it('wrapper radius resolves through the shared --bdc-outline_radius token', async () => {
|
|
92
|
+
const el = await fixture('<bds-table></bds-table>');
|
|
93
|
+
// jsdom in this project falls back to a <style> tag in the shadow root (no adoptedStyleSheets
|
|
94
|
+
// support on Document.prototype), so the compiled CSS text is readable directly.
|
|
95
|
+
const shadowStyle = el.shadowRoot!.querySelector('style')!.textContent!;
|
|
96
|
+
expect(shadowStyle).toContain('border-radius: var(--table_radius, var(--bdc-outline_radius))');
|
|
97
|
+
cleanup(el);
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it('ships a --table_row-bg--hover token for slotted row hover, matching React Table', () => {
|
|
101
|
+
const cssText = Array.from(document.adoptedStyleSheets ?? [])
|
|
102
|
+
.flatMap((sheet) => Array.from(sheet.cssRules))
|
|
103
|
+
.map((rule) => rule.cssText)
|
|
104
|
+
.join('\n');
|
|
105
|
+
expect(cssText).toContain('bds-table > table tbody tr:hover');
|
|
106
|
+
expect(cssText).toContain('var(--table_row-bg--hover, var(--bds-color_bg--subtle))');
|
|
107
|
+
});
|
|
45
108
|
});
|
|
@@ -1,19 +1,81 @@
|
|
|
1
|
-
import { LitElement, css, html } from 'lit';
|
|
1
|
+
import { LitElement, css, html, nothing } from 'lit';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* `::slotted()` only matches the node placed directly into the slot — the `<table>` itself —
|
|
5
|
+
* never its descendants (`<thead>`, `<th>`, `<td>`, …). Those have to be styled from outside
|
|
6
|
+
* the shadow root, so this stylesheet is adopted onto the document once (guarded so re-imports
|
|
7
|
+
* / hot-reload don't duplicate it) and targets the slotted table via light-DOM selectors scoped
|
|
8
|
+
* to `bds-table > table`. Keep these rules in sync with `src/components/ui/Table/Table.module.css`
|
|
9
|
+
* (the React counterpart is the token source of truth).
|
|
10
|
+
*/
|
|
11
|
+
const tableLightDomCss = `
|
|
12
|
+
@layer boostdev.component {
|
|
13
|
+
bds-table > table thead {
|
|
14
|
+
background-color: var(--bds-color_bg--subtle);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
bds-table > table th {
|
|
18
|
+
padding: var(--bds-space_s) var(--bds-space_m);
|
|
19
|
+
font-weight: var(--bds-font_weight--semibold);
|
|
20
|
+
font-size: var(--bds-font_size--body--s);
|
|
21
|
+
text-align: start;
|
|
22
|
+
color: var(--bds-color_on-bg--subtle);
|
|
23
|
+
border-block-end: 1px solid var(--bds-color_bg--subtle);
|
|
24
|
+
white-space: nowrap;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
bds-table > table td {
|
|
28
|
+
padding: var(--bds-space_s) var(--bds-space_m);
|
|
29
|
+
border-block-end: 1px solid var(--bds-color_bg--subtle);
|
|
30
|
+
vertical-align: middle;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
bds-table > table tr:last-child td {
|
|
34
|
+
border-block-end: none;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
bds-table[sticky-header] > table thead th {
|
|
38
|
+
position: sticky;
|
|
39
|
+
inset-block-start: 0;
|
|
40
|
+
background-color: var(--bds-color_bg--subtle);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
@media (hover: hover) and (pointer: fine) {
|
|
44
|
+
bds-table > table tbody tr:hover {
|
|
45
|
+
background-color: var(--table_row-bg--hover, var(--bds-color_bg--subtle));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
`;
|
|
50
|
+
|
|
51
|
+
if (!('__bdsTableStylesInjected' in document)) {
|
|
52
|
+
Object.defineProperty(document, '__bdsTableStylesInjected', { value: true });
|
|
53
|
+
const sheet = new CSSStyleSheet();
|
|
54
|
+
sheet.replaceSync(tableLightDomCss);
|
|
55
|
+
// Some environments (older Safari, certain jsdom versions) report `document.adoptedStyleSheets`
|
|
56
|
+
// as `undefined` until it has been assigned at least once — default to an empty array so the
|
|
57
|
+
// spread never throws.
|
|
58
|
+
document.adoptedStyleSheets = [...(document.adoptedStyleSheets ?? []), sheet];
|
|
59
|
+
}
|
|
2
60
|
|
|
3
61
|
/**
|
|
4
62
|
* `<bds-table>` — scrollable table wrapper with design-system styles.
|
|
5
63
|
*
|
|
6
64
|
* Slotted content should be a standard `<table>` with `<thead>` / `<tbody>`.
|
|
7
|
-
*
|
|
65
|
+
* The `<table>` itself is styled via `::slotted(table)` inside the shadow root; its
|
|
66
|
+
* `thead`/`th`/`td` descendants are styled from a document-level stylesheet (adopted once by
|
|
67
|
+
* this module) scoped to `bds-table > table …`, since `::slotted()` cannot reach descendants
|
|
68
|
+
* of the slotted node.
|
|
8
69
|
*
|
|
9
70
|
* Attributes:
|
|
10
71
|
* sticky-header — freezes `<thead>` at the top when the table overflows vertically
|
|
72
|
+
* aria-label — accessible name for the scrollable region (also enables `role="region"`)
|
|
11
73
|
*
|
|
12
74
|
* Slots:
|
|
13
75
|
* (default) — a `<table>` element
|
|
14
76
|
*
|
|
15
77
|
* @example
|
|
16
|
-
* <bds-table sticky-header>
|
|
78
|
+
* <bds-table sticky-header aria-label="Team members">
|
|
17
79
|
* <table>
|
|
18
80
|
* <thead><tr><th>Name</th><th>Value</th></tr></thead>
|
|
19
81
|
* <tbody><tr><td>Alpha</td><td>1</td></tr></tbody>
|
|
@@ -22,6 +84,16 @@ import { LitElement, css, html } from 'lit';
|
|
|
22
84
|
*/
|
|
23
85
|
export class BdsTable extends LitElement {
|
|
24
86
|
static styles = css`
|
|
87
|
+
/* Shadow DOM does not inherit the global box-sizing reset, so set it
|
|
88
|
+
here; otherwise elements with an explicit size + padding size as
|
|
89
|
+
content-box and layouts drift from the React (light-DOM) versions. */
|
|
90
|
+
:host,
|
|
91
|
+
*,
|
|
92
|
+
*::before,
|
|
93
|
+
*::after {
|
|
94
|
+
box-sizing: border-box;
|
|
95
|
+
}
|
|
96
|
+
|
|
25
97
|
:host {
|
|
26
98
|
display: block;
|
|
27
99
|
}
|
|
@@ -30,11 +102,17 @@ export class BdsTable extends LitElement {
|
|
|
30
102
|
overflow-inline: auto;
|
|
31
103
|
-webkit-overflow-scrolling: touch;
|
|
32
104
|
border: var(--table_border, none);
|
|
33
|
-
border-radius: var(--table_radius, var(--bds-border_radius--s));
|
|
34
105
|
--bdc_color: var(--bds-color_bg--subtle);
|
|
106
|
+
--bdc-outline_radius: var(--bds-border_radius--s);
|
|
107
|
+
border-radius: var(--table_radius, var(--bdc-outline_radius));
|
|
35
108
|
box-shadow: inset 0 0 0 var(--bdc-outline_width) var(--bdc_color);
|
|
36
109
|
}
|
|
37
110
|
|
|
111
|
+
.wrapper:focus-visible {
|
|
112
|
+
outline: var(--bds-outline_default);
|
|
113
|
+
outline-offset: calc(var(--bds-outline_offset) * -1);
|
|
114
|
+
}
|
|
115
|
+
|
|
38
116
|
::slotted(table) {
|
|
39
117
|
inline-size: 100%;
|
|
40
118
|
border-collapse: collapse;
|
|
@@ -42,47 +120,29 @@ export class BdsTable extends LitElement {
|
|
|
42
120
|
font-family: var(--bds-font_family--body);
|
|
43
121
|
color: var(--bds-color_on-bg);
|
|
44
122
|
}
|
|
45
|
-
|
|
46
|
-
::slotted(thead) {
|
|
47
|
-
background-color: var(--bds-color_bg--subtle);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
::slotted(th) {
|
|
51
|
-
padding: var(--bds-space_xs) var(--bds-space_s);
|
|
52
|
-
font-weight: var(--bds-font_weight--semibold);
|
|
53
|
-
font-size: var(--bds-font_size--body--s);
|
|
54
|
-
text-align: start;
|
|
55
|
-
color: var(--bds-color_on-bg--subtle);
|
|
56
|
-
border-block-end: 1px solid var(--bds-color_bg--subtle);
|
|
57
|
-
white-space: nowrap;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
::slotted(td) {
|
|
61
|
-
padding: var(--bds-space_xs) var(--bds-space_s);
|
|
62
|
-
border-block-end: 1px solid var(--bds-color_bg--subtle);
|
|
63
|
-
vertical-align: middle;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
::slotted(tr:last-child td) {
|
|
67
|
-
border-block-end: none;
|
|
68
|
-
}
|
|
69
123
|
`;
|
|
70
124
|
|
|
71
125
|
static properties = {
|
|
72
126
|
stickyHeader: { type: Boolean, attribute: 'sticky-header', reflect: true },
|
|
127
|
+
ariaLabel: { type: String, attribute: 'aria-label' },
|
|
73
128
|
};
|
|
74
129
|
|
|
75
130
|
declare stickyHeader: boolean;
|
|
131
|
+
declare ariaLabel: string | null;
|
|
76
132
|
|
|
77
133
|
constructor() {
|
|
78
134
|
super();
|
|
79
135
|
this.stickyHeader = false;
|
|
136
|
+
this.ariaLabel = null;
|
|
80
137
|
}
|
|
81
138
|
|
|
82
139
|
render() {
|
|
83
140
|
return html`
|
|
84
141
|
<div
|
|
85
142
|
class="wrapper"
|
|
143
|
+
tabindex="0"
|
|
144
|
+
role=${this.ariaLabel ? 'region' : nothing}
|
|
145
|
+
aria-label=${this.ariaLabel ?? nothing}
|
|
86
146
|
style=${this.stickyHeader ? 'max-block-size: 100%; overflow-block: auto;' : ''}
|
|
87
147
|
>
|
|
88
148
|
<slot></slot>
|
|
@@ -73,4 +73,51 @@ describe('bds-typography', () => {
|
|
|
73
73
|
expect(el.shadowRoot!.querySelector('h2')).not.toBeNull();
|
|
74
74
|
cleanup(el);
|
|
75
75
|
});
|
|
76
|
+
|
|
77
|
+
it('binds the variant into the class attribute as plain text, not parsed as markup (no unsafeStatic injection)', async () => {
|
|
78
|
+
const el = await fixture('<bds-typography>Text</bds-typography>') as BdsTypography;
|
|
79
|
+
// Simulate an untrusted/attacker-controlled value bypassing the TypographyVariant
|
|
80
|
+
// union at runtime (e.g. via direct property assignment or a compromised upstream value).
|
|
81
|
+
const malicious = 'h1"><img src="x">';
|
|
82
|
+
(el as unknown as { variant: string }).variant = malicious;
|
|
83
|
+
await el.updateComplete;
|
|
84
|
+
// With unsafeStatic removed, the value is set via a normal (safe) attribute binding —
|
|
85
|
+
// it must never be parsed as markup, so no <img> element should appear in the shadow DOM.
|
|
86
|
+
expect(el.shadowRoot!.querySelector('img')).toBeNull();
|
|
87
|
+
const p = el.shadowRoot!.querySelector('p');
|
|
88
|
+
expect(p).not.toBeNull();
|
|
89
|
+
expect(p!.getAttribute('class')).toBe(`typography --${malicious}`);
|
|
90
|
+
cleanup(el);
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
it('reflects the component property to an attribute so :host([component]) selectors match', async () => {
|
|
94
|
+
const el = await fixture('<bds-typography>Text</bds-typography>') as BdsTypography;
|
|
95
|
+
el.component = 'span';
|
|
96
|
+
await el.updateComplete;
|
|
97
|
+
expect(el.getAttribute('component')).toBe('span');
|
|
98
|
+
cleanup(el);
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
it('reflects component="span" so it is present as an attribute for :host([component]) matching', async () => {
|
|
102
|
+
const el = await fixture(
|
|
103
|
+
'<bds-typography component="span">Text</bds-typography>',
|
|
104
|
+
) as BdsTypography;
|
|
105
|
+
await el.updateComplete;
|
|
106
|
+
expect(el.getAttribute('component')).toBe('span');
|
|
107
|
+
cleanup(el);
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
// jsdom's CSS engine does not reliably evaluate :host([attr=value]) selectors
|
|
111
|
+
// via getComputedStyle (see other bds-*.spec.ts files, e.g. bds-drawer's
|
|
112
|
+
// :host([side='left']) is likewise only verified structurally). Assert the
|
|
113
|
+
// rule exists in source instead of relying on computed style in tests.
|
|
114
|
+
it('defines a :host([component="span"]) rule that switches the host to display:inline', () => {
|
|
115
|
+
const cssText = BdsTypography.styles.cssText;
|
|
116
|
+
expect(cssText).toMatch(/:host\(\[component=['"]span['"]\]\)\s*{[^}]*display:\s*inline/);
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
it('defines the default :host rule as display:block', () => {
|
|
120
|
+
const cssText = BdsTypography.styles.cssText;
|
|
121
|
+
expect(cssText).toMatch(/:host\s*{[^}]*display:\s*block/);
|
|
122
|
+
});
|
|
76
123
|
});
|
|
@@ -29,10 +29,26 @@ const VARIANT_TAG: Record<TypographyVariant, string> = {
|
|
|
29
29
|
*/
|
|
30
30
|
export class BdsTypography extends LitElement {
|
|
31
31
|
static styles = css`
|
|
32
|
+
/* Shadow DOM does not inherit the global box-sizing reset, so set it
|
|
33
|
+
here; otherwise elements with an explicit size + padding size as
|
|
34
|
+
content-box and layouts drift from the React (light-DOM) versions. */
|
|
35
|
+
:host,
|
|
36
|
+
*,
|
|
37
|
+
*::before,
|
|
38
|
+
*::after {
|
|
39
|
+
box-sizing: border-box;
|
|
40
|
+
}
|
|
41
|
+
|
|
32
42
|
:host {
|
|
33
43
|
display: block;
|
|
34
44
|
}
|
|
35
45
|
|
|
46
|
+
/* component="span" (or any inline tag) should flow inline, matching the
|
|
47
|
+
React counterpart which has no host wrapper to force block layout. */
|
|
48
|
+
:host([component='span']) {
|
|
49
|
+
display: inline;
|
|
50
|
+
}
|
|
51
|
+
|
|
36
52
|
.typography {
|
|
37
53
|
margin: 0;
|
|
38
54
|
font-family: var(--bds-font_family--body);
|
|
@@ -41,39 +57,39 @@ export class BdsTypography extends LitElement {
|
|
|
41
57
|
|
|
42
58
|
.typography.--h1 {
|
|
43
59
|
font-family: var(--bds-font_family--heading);
|
|
44
|
-
font-size: var(--bds-font_size--heading-1);
|
|
60
|
+
font-size: var(--typography_font-size--h1, var(--bds-font_size--heading-1));
|
|
45
61
|
font-weight: var(--bds-font_weight--bold);
|
|
46
62
|
line-height: var(--bds-font_line-height--heading);
|
|
47
63
|
}
|
|
48
64
|
|
|
49
65
|
.typography.--h2 {
|
|
50
66
|
font-family: var(--bds-font_family--heading);
|
|
51
|
-
font-size: var(--bds-font_size--heading-2);
|
|
67
|
+
font-size: var(--typography_font-size--h2, var(--bds-font_size--heading-2));
|
|
52
68
|
font-weight: var(--bds-font_weight--semibold);
|
|
53
69
|
line-height: var(--bds-font_line-height--heading);
|
|
54
70
|
}
|
|
55
71
|
|
|
56
72
|
.typography.--h3 {
|
|
57
73
|
font-family: var(--bds-font_family--heading);
|
|
58
|
-
font-size: var(--bds-font_size--heading-3);
|
|
74
|
+
font-size: var(--typography_font-size--h3, var(--bds-font_size--heading-3));
|
|
59
75
|
font-weight: var(--bds-font_weight--semibold);
|
|
60
76
|
line-height: var(--bds-font_line-height--heading);
|
|
61
77
|
}
|
|
62
78
|
|
|
63
79
|
.typography.--body {
|
|
64
|
-
font-size: var(--bds-font_size--body);
|
|
80
|
+
font-size: var(--typography_font-size--body, var(--bds-font_size--body));
|
|
65
81
|
line-height: var(--bds-font_line-height--body);
|
|
66
82
|
}
|
|
67
83
|
|
|
68
84
|
.typography.--body_s {
|
|
69
|
-
font-size: var(--bds-font_size--body--s);
|
|
85
|
+
font-size: var(--typography_font-size--body_s, var(--bds-font_size--body--s));
|
|
70
86
|
line-height: var(--bds-font_line-height--body);
|
|
71
87
|
}
|
|
72
88
|
`;
|
|
73
89
|
|
|
74
90
|
static properties = {
|
|
75
91
|
variant: { type: String, reflect: true },
|
|
76
|
-
component: { type: String },
|
|
92
|
+
component: { type: String, reflect: true },
|
|
77
93
|
};
|
|
78
94
|
|
|
79
95
|
declare variant: TypographyVariant;
|
|
@@ -91,12 +107,14 @@ export class BdsTypography extends LitElement {
|
|
|
91
107
|
}
|
|
92
108
|
|
|
93
109
|
render() {
|
|
94
|
-
// unsafeStatic is
|
|
95
|
-
//
|
|
110
|
+
// unsafeStatic is required here only for the tag name — Lit's html templates
|
|
111
|
+
// can't bind a dynamic element name any other way. Tag values come from a
|
|
112
|
+
// known allowlist (VARIANT_TAG map + the developer-controlled `component`
|
|
113
|
+
// property). The class attribute below is bound normally (not unsafeStatic)
|
|
114
|
+
// since it is ordinary, escaped attribute content — no injection sink.
|
|
96
115
|
const tag = unsafeStatic(this._tag);
|
|
97
|
-
const variant = unsafeStatic(this.variant);
|
|
98
116
|
return html`
|
|
99
|
-
<${tag} class="typography --${variant}">
|
|
117
|
+
<${tag} class="typography --${this.variant}">
|
|
100
118
|
<slot></slot>
|
|
101
119
|
</${tag}>
|
|
102
120
|
`;
|