@boostdev/design-system-components 1.1.1 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +13 -10
- package/dist/client.cjs +77 -99
- package/dist/client.css +611 -580
- package/dist/client.d.cts +13 -16
- package/dist/client.d.ts +13 -16
- package/dist/client.js +87 -109
- package/dist/index.cjs +77 -99
- package/dist/index.css +611 -580
- package/dist/index.d.cts +13 -16
- package/dist/index.d.ts +13 -16
- package/dist/index.js +87 -109
- package/dist/native/index.cjs +9 -8
- package/dist/native/index.d.cts +1 -1
- package/dist/native/index.d.ts +1 -1
- package/dist/native/index.js +9 -8
- package/dist/web-components/chunk-2QA62WCQ.js +48 -0
- package/dist/web-components/chunk-3REOIRDW.js +246 -0
- package/dist/web-components/chunk-57TRNCWQ.js +93 -0
- package/dist/web-components/chunk-5IPHEONG.js +139 -0
- package/dist/web-components/chunk-5R6IFELV.js +63 -0
- package/dist/web-components/chunk-5TFWOPLH.js +49 -0
- package/dist/web-components/chunk-6I3CFC26.js +89 -0
- package/dist/web-components/chunk-6MH5UWUD.js +226 -0
- package/dist/web-components/chunk-7FMR53BW.js +127 -0
- package/dist/web-components/chunk-AGKJTMJI.js +56 -0
- package/dist/web-components/chunk-AJSXNDAP.js +151 -0
- package/dist/web-components/chunk-BQLZ7I4G.js +56 -0
- package/dist/web-components/chunk-BX3IPVOB.js +167 -0
- package/dist/web-components/chunk-CR5PGUHV.js +109 -0
- package/dist/web-components/chunk-DI46Q2EA.js +278 -0
- package/dist/web-components/chunk-DZRSJGPB.js +53 -0
- package/dist/web-components/chunk-EBJM3VD4.js +107 -0
- package/dist/web-components/chunk-ECW3HHWA.js +185 -0
- package/dist/web-components/chunk-HGBNDR22.js +98 -0
- package/dist/web-components/chunk-HHHRF2PS.js +118 -0
- package/dist/web-components/chunk-ITHLKR7Q.js +105 -0
- package/dist/web-components/chunk-JUKB3BUP.js +186 -0
- package/dist/web-components/chunk-L3XHOMN6.js +111 -0
- package/dist/{web-components.js → web-components/chunk-LGEZYFUU.js} +62 -844
- package/dist/web-components/chunk-LY62SAVN.js +64 -0
- package/dist/web-components/chunk-N6IMUOY4.js +185 -0
- package/dist/web-components/chunk-OHUTLSIQ.js +69 -0
- package/dist/web-components/chunk-OQTRTMAB.js +27 -0
- package/dist/web-components/chunk-PY62FTRW.js +179 -0
- package/dist/web-components/chunk-Q4T5BJT6.js +94 -0
- package/dist/web-components/chunk-QDST57JC.js +119 -0
- package/dist/web-components/chunk-QLZ2362S.js +279 -0
- package/dist/web-components/chunk-QPOKHLMQ.js +45 -0
- package/dist/web-components/chunk-SOQQ7RVJ.js +88 -0
- package/dist/web-components/chunk-T6AETZRP.js +131 -0
- package/dist/web-components/chunk-UFFCKVZE.js +149 -0
- package/dist/web-components/chunk-VMMVWLXL.js +53 -0
- package/dist/web-components/chunk-X3FKVHLK.js +144 -0
- package/dist/web-components/chunk-XNA6WTXG.js +133 -0
- package/dist/web-components/chunk-Y4MAXTMA.js +80 -0
- package/dist/web-components/chunk-YLVTEY23.js +165 -0
- package/dist/web-components/chunk-YRXCVKHV.js +116 -0
- package/dist/web-components/chunk-ZTC6GRP7.js +64 -0
- package/dist/web-components/globals.d.ts +2 -0
- package/dist/web-components/globals.js +1 -0
- package/dist/web-components/index.d.ts +41 -0
- package/dist/web-components/index.js +165 -0
- package/dist/web-components/interaction/bds-accordion-item.d.ts +54 -0
- package/dist/web-components/interaction/bds-accordion-item.js +7 -0
- package/dist/web-components/interaction/bds-accordion.d.ts +50 -0
- package/dist/web-components/interaction/bds-accordion.js +7 -0
- package/dist/web-components/interaction/bds-button.d.ts +100 -0
- package/dist/web-components/interaction/bds-button.js +7 -0
- package/dist/web-components/interaction/bds-collapsible.d.ts +52 -0
- package/dist/web-components/interaction/bds-collapsible.js +7 -0
- package/dist/web-components/interaction/bds-dialog.d.ts +56 -0
- package/dist/web-components/interaction/bds-dialog.js +7 -0
- package/dist/web-components/interaction/bds-drawer.d.ts +64 -0
- package/dist/web-components/interaction/bds-drawer.js +7 -0
- package/dist/web-components/interaction/bds-popover.d.ts +62 -0
- package/dist/web-components/interaction/bds-popover.js +7 -0
- package/dist/web-components/interaction/bds-skip-link.d.ts +36 -0
- package/dist/web-components/interaction/bds-skip-link.js +7 -0
- package/dist/web-components/interaction/bds-tab-panel.d.ts +26 -0
- package/dist/web-components/interaction/bds-tab-panel.js +7 -0
- package/dist/web-components/interaction/bds-tab.d.ts +45 -0
- package/dist/web-components/interaction/bds-tab.js +7 -0
- package/dist/web-components/interaction/bds-tabs.d.ts +46 -0
- package/dist/web-components/interaction/bds-tabs.js +7 -0
- package/dist/web-components/interaction/bds-toast-provider.d.ts +57 -0
- package/dist/web-components/interaction/bds-toast-provider.js +7 -0
- package/dist/web-components/interaction/bds-tooltip.d.ts +50 -0
- package/dist/web-components/interaction/bds-tooltip.js +7 -0
- package/dist/web-components/interaction/form/bds-checkbox.d.ts +70 -0
- package/dist/web-components/interaction/form/bds-checkbox.js +7 -0
- package/dist/web-components/interaction/form/bds-combobox.d.ts +84 -0
- package/dist/web-components/interaction/form/bds-combobox.js +7 -0
- package/dist/web-components/interaction/form/bds-file-input.d.ts +62 -0
- package/dist/web-components/interaction/form/bds-file-input.js +7 -0
- package/dist/web-components/interaction/form/bds-number-input.d.ts +68 -0
- package/dist/web-components/interaction/form/bds-number-input.js +7 -0
- package/dist/web-components/interaction/form/bds-radio.d.ts +68 -0
- package/dist/web-components/interaction/form/bds-radio.js +7 -0
- package/dist/web-components/interaction/form/bds-segmented-control.d.ts +88 -0
- package/dist/web-components/interaction/form/bds-segmented-control.js +7 -0
- package/dist/web-components/interaction/form/bds-select.d.ts +79 -0
- package/dist/web-components/interaction/form/bds-select.js +7 -0
- package/dist/web-components/interaction/form/bds-slider.d.ts +70 -0
- package/dist/web-components/interaction/form/bds-slider.js +7 -0
- package/dist/web-components/interaction/form/bds-switch.d.ts +67 -0
- package/dist/web-components/interaction/form/bds-switch.js +7 -0
- package/dist/web-components/interaction/form/bds-textarea.d.ts +70 -0
- package/dist/web-components/interaction/form/bds-textarea.js +7 -0
- package/dist/web-components/ui/bds-alert.d.ts +66 -0
- package/dist/web-components/ui/bds-alert.js +7 -0
- package/dist/web-components/ui/bds-avatar.d.ts +50 -0
- package/dist/web-components/ui/bds-avatar.js +7 -0
- package/dist/web-components/ui/bds-badge.d.ts +35 -0
- package/dist/web-components/ui/bds-badge.js +7 -0
- package/dist/web-components/ui/bds-breadcrumb.d.ts +35 -0
- package/dist/web-components/ui/bds-breadcrumb.js +7 -0
- package/dist/web-components/ui/bds-card.d.ts +72 -0
- package/dist/web-components/ui/bds-card.js +7 -0
- package/dist/web-components/ui/bds-description-list.d.ts +42 -0
- package/dist/web-components/ui/bds-description-list.js +7 -0
- package/dist/web-components/ui/bds-icon-wrapper.d.ts +39 -0
- package/dist/web-components/ui/bds-icon-wrapper.js +7 -0
- package/dist/web-components/ui/bds-link.d.ts +59 -0
- package/dist/web-components/ui/bds-link.js +7 -0
- package/dist/web-components/ui/bds-loading.d.ts +32 -0
- package/dist/web-components/ui/bds-loading.js +7 -0
- package/dist/web-components/ui/bds-notification-banner.d.ts +61 -0
- package/dist/web-components/ui/bds-notification-banner.js +7 -0
- package/dist/web-components/ui/bds-progress-circle.d.ts +53 -0
- package/dist/web-components/ui/bds-progress-circle.js +7 -0
- package/dist/web-components/ui/bds-progress.d.ts +54 -0
- package/dist/web-components/ui/bds-progress.js +7 -0
- package/dist/web-components/ui/bds-rating.d.ts +36 -0
- package/dist/web-components/ui/bds-rating.js +7 -0
- package/dist/web-components/ui/bds-section-header.d.ts +53 -0
- package/dist/web-components/ui/bds-section-header.js +8 -0
- package/dist/web-components/ui/bds-separator.d.ts +32 -0
- package/dist/web-components/ui/bds-separator.js +7 -0
- package/dist/web-components/ui/bds-skeleton.d.ts +22 -0
- package/dist/web-components/ui/bds-skeleton.js +7 -0
- package/dist/web-components/ui/bds-typography.d.ts +44 -0
- package/dist/web-components/ui/bds-typography.js +8 -0
- package/package.json +170 -5
- package/src/components/interaction/Button/Button.module.css +12 -11
- package/src/components/interaction/Button/Button.native.tsx +10 -9
- package/src/components/interaction/Button/Button.tsx +1 -1
- package/src/components/interaction/Command/Command.module.css +3 -7
- package/src/components/interaction/Dialog/Dialog.module.css +7 -5
- package/src/components/interaction/Drawer/Drawer.module.css +49 -1
- package/src/components/interaction/DropdownMenu/DropdownMenu.module.css +1 -3
- package/src/components/interaction/Popover/Popover.module.css +1 -3
- package/src/components/interaction/form/Checkbox/Checkbox.module.css +1 -3
- package/src/components/interaction/form/Combobox/Combobox.module.css +2 -6
- package/src/components/interaction/form/FormInput/FormInput.module.css +1 -3
- package/src/components/interaction/form/NumberInput/NumberInput.module.css +16 -4
- package/src/components/interaction/form/Radio/Radio.module.css +6 -16
- package/src/components/interaction/form/SegmentedControl/SegmentedControl.mdx +70 -25
- package/src/components/interaction/form/SegmentedControl/SegmentedControl.module.css +55 -33
- package/src/components/interaction/form/SegmentedControl/SegmentedControl.spec.tsx +127 -56
- package/src/components/interaction/form/SegmentedControl/SegmentedControl.stories.tsx +89 -72
- package/src/components/interaction/form/SegmentedControl/SegmentedControl.tsx +40 -62
- package/src/components/interaction/form/SegmentedControl/index.ts +1 -1
- package/src/components/interaction/form/Select/Select.module.css +2 -4
- package/src/components/interaction/form/Switch/Switch.module.css +5 -7
- package/src/components/interaction/form/Switch/Switch.native.spec.tsx +9 -9
- package/src/components/interaction/form/Switch/Switch.native.tsx +2 -2
- package/src/components/interaction/form/Textarea/Textarea.module.css +1 -3
- package/src/components/interaction/form/atoms/InputContainer.stories.tsx +64 -0
- package/src/components/interaction/form/atoms/Label.stories.tsx +33 -0
- package/src/components/interaction/form/atoms/Message.stories.tsx +33 -0
- package/src/components/layout/Card/Card.module.css +1 -3
- package/src/components/ui/Accordion/Accordion.module.css +1 -2
- package/src/components/ui/Alert/Alert.module.css +1 -2
- package/src/components/ui/Calendar/Calendar.module.css +2 -5
- package/src/components/ui/Carousel/Carousel.module.css +1 -3
- package/src/components/ui/NotificationBanner/NotificationBanner.module.css +1 -2
- package/src/components/ui/Pagination/Pagination.module.css +1 -2
- package/src/components/ui/SkipLink/SkipLink.module.css +1 -2
- package/src/components/ui/Table/Table.module.css +1 -2
- package/src/css/bdc.css +16 -11
- package/src/index.ts +1 -1
- package/src/web-components/globals.ts +3 -3
- package/src/web-components/index.ts +47 -0
- package/src/web-components/interaction/BdsAccordion.mdx +51 -0
- package/src/web-components/interaction/BdsAccordion.stories.tsx +85 -0
- package/src/web-components/interaction/BdsCollapsible.mdx +46 -0
- package/src/web-components/interaction/BdsCollapsible.stories.tsx +87 -0
- package/src/web-components/interaction/BdsDialog.mdx +49 -0
- package/src/web-components/interaction/BdsDialog.stories.tsx +75 -0
- package/src/web-components/interaction/BdsDrawer.mdx +50 -0
- package/src/web-components/interaction/BdsDrawer.stories.tsx +66 -0
- package/src/web-components/interaction/BdsSkipLink.mdx +34 -0
- package/src/web-components/interaction/BdsSkipLink.stories.tsx +55 -0
- package/src/web-components/interaction/BdsTabs.mdx +47 -0
- package/src/web-components/interaction/BdsTabs.stories.tsx +80 -0
- package/src/web-components/interaction/BdsTooltip.mdx +38 -0
- package/src/web-components/interaction/BdsTooltip.stories.tsx +68 -0
- package/src/web-components/interaction/bds-accordion-item.spec.ts +75 -0
- package/src/web-components/interaction/bds-accordion-item.ts +181 -0
- package/src/web-components/interaction/bds-accordion.spec.ts +73 -0
- package/src/web-components/interaction/bds-accordion.ts +98 -0
- package/src/web-components/interaction/bds-button.ts +15 -13
- package/src/web-components/interaction/bds-collapsible.spec.ts +56 -0
- package/src/web-components/interaction/bds-collapsible.ts +170 -0
- package/src/web-components/interaction/bds-dialog.spec.ts +119 -0
- package/src/web-components/interaction/bds-dialog.ts +221 -0
- package/src/web-components/interaction/bds-drawer.spec.ts +113 -0
- package/src/web-components/interaction/bds-drawer.ts +315 -0
- package/src/web-components/interaction/bds-skip-link.spec.ts +42 -0
- package/src/web-components/interaction/bds-skip-link.ts +74 -0
- package/src/web-components/interaction/bds-tab-panel.spec.ts +32 -0
- package/src/web-components/interaction/bds-tab-panel.ts +38 -0
- package/src/web-components/interaction/bds-tab.spec.ts +71 -0
- package/src/web-components/interaction/bds-tab.ts +110 -0
- package/src/web-components/interaction/bds-tabs.spec.ts +120 -0
- package/src/web-components/interaction/bds-tabs.ts +152 -0
- package/src/web-components/interaction/bds-tooltip.spec.ts +49 -0
- package/src/web-components/interaction/bds-tooltip.ts +127 -0
- package/src/web-components/interaction/form/BdsCheckbox.mdx +39 -0
- package/src/web-components/interaction/form/BdsCheckbox.stories.tsx +73 -0
- package/src/web-components/interaction/form/BdsCombobox.mdx +52 -0
- package/src/web-components/interaction/form/BdsCombobox.stories.tsx +91 -0
- package/src/web-components/interaction/form/BdsFileInput.mdx +44 -0
- package/src/web-components/interaction/form/BdsFileInput.stories.tsx +84 -0
- package/src/web-components/interaction/form/BdsNumberInput.mdx +41 -0
- package/src/web-components/interaction/form/BdsNumberInput.stories.tsx +90 -0
- package/src/web-components/interaction/form/BdsRadio.mdx +41 -0
- package/src/web-components/interaction/form/BdsRadio.stories.tsx +90 -0
- package/src/web-components/interaction/form/BdsSegmentedControl.mdx +42 -0
- package/src/web-components/interaction/form/BdsSegmentedControl.stories.tsx +92 -0
- package/src/web-components/interaction/form/BdsSelect.mdx +38 -0
- package/src/web-components/interaction/form/BdsSelect.stories.tsx +93 -0
- package/src/web-components/interaction/form/BdsSlider.mdx +49 -0
- package/src/web-components/interaction/form/BdsSlider.stories.tsx +89 -0
- package/src/web-components/interaction/form/BdsSwitch.mdx +39 -0
- package/src/web-components/interaction/form/BdsSwitch.stories.tsx +73 -0
- package/src/web-components/interaction/form/BdsTextarea.mdx +41 -0
- package/src/web-components/interaction/form/BdsTextarea.stories.tsx +79 -0
- package/src/web-components/interaction/form/bds-checkbox.spec.ts +63 -0
- package/src/web-components/interaction/form/bds-checkbox.ts +166 -0
- package/src/web-components/interaction/form/bds-combobox.spec.ts +117 -0
- package/src/web-components/interaction/form/bds-combobox.ts +334 -0
- package/src/web-components/interaction/form/bds-file-input.spec.ts +58 -0
- package/src/web-components/interaction/form/bds-file-input.ts +209 -0
- package/src/web-components/interaction/form/bds-number-input.spec.ts +87 -0
- package/src/web-components/interaction/form/bds-number-input.ts +220 -0
- package/src/web-components/interaction/form/bds-radio.spec.ts +70 -0
- package/src/web-components/interaction/form/bds-radio.ts +151 -0
- package/src/web-components/interaction/form/bds-segmented-control.spec.ts +74 -0
- package/src/web-components/interaction/form/bds-segmented-control.ts +282 -0
- package/src/web-components/interaction/form/bds-select.spec.ts +74 -0
- package/src/web-components/interaction/form/bds-select.ts +188 -0
- package/src/web-components/interaction/form/bds-slider.spec.ts +41 -0
- package/src/web-components/interaction/form/bds-slider.ts +162 -0
- package/src/web-components/interaction/form/bds-switch.spec.ts +62 -0
- package/src/web-components/interaction/form/bds-switch.ts +165 -0
- package/src/web-components/interaction/form/bds-textarea.spec.ts +55 -0
- package/src/web-components/interaction/form/bds-textarea.ts +141 -0
- package/src/web-components/ui/BdsAvatar.mdx +67 -0
- package/src/web-components/ui/BdsAvatar.stories.tsx +62 -0
- package/src/web-components/ui/BdsBreadcrumb.mdx +63 -0
- package/src/web-components/ui/BdsBreadcrumb.stories.tsx +59 -0
- package/src/web-components/ui/BdsCard.mdx +83 -0
- package/src/web-components/ui/BdsCard.stories.tsx +90 -0
- package/src/web-components/ui/BdsDescriptionList.mdx +67 -0
- package/src/web-components/ui/BdsDescriptionList.stories.tsx +79 -0
- package/src/web-components/ui/BdsIconWrapper.mdx +70 -0
- package/src/web-components/ui/BdsIconWrapper.stories.tsx +76 -0
- package/src/web-components/ui/BdsLink.mdx +75 -0
- package/src/web-components/ui/BdsLink.stories.tsx +64 -0
- package/src/web-components/ui/BdsLoading.mdx +62 -0
- package/src/web-components/ui/BdsLoading.stories.tsx +37 -0
- package/src/web-components/ui/BdsNotificationBanner.mdx +90 -0
- package/src/web-components/ui/BdsNotificationBanner.stories.tsx +93 -0
- package/src/web-components/ui/BdsProgress.mdx +63 -0
- package/src/web-components/ui/BdsProgress.stories.tsx +70 -0
- package/src/web-components/ui/BdsProgressCircle.mdx +64 -0
- package/src/web-components/ui/BdsProgressCircle.stories.tsx +69 -0
- package/src/web-components/ui/BdsRating.mdx +61 -0
- package/src/web-components/ui/BdsRating.stories.tsx +39 -0
- package/src/web-components/ui/BdsSectionHeader.mdx +69 -0
- package/src/web-components/ui/BdsSectionHeader.stories.tsx +56 -0
- package/src/web-components/ui/BdsSeparator.mdx +63 -0
- package/src/web-components/ui/BdsSeparator.stories.tsx +47 -0
- package/src/web-components/ui/BdsSkeleton.mdx +67 -0
- package/src/web-components/ui/BdsSkeleton.stories.tsx +50 -0
- package/src/web-components/ui/BdsTypography.mdx +83 -0
- package/src/web-components/ui/BdsTypography.stories.tsx +51 -0
- package/src/web-components/ui/bds-alert.ts +1 -2
- package/src/web-components/ui/bds-avatar.spec.ts +75 -0
- package/src/web-components/ui/bds-avatar.ts +122 -0
- package/src/web-components/ui/bds-breadcrumb.spec.ts +55 -0
- package/src/web-components/ui/bds-breadcrumb.ts +114 -0
- package/src/web-components/ui/bds-card.spec.ts +70 -0
- package/src/web-components/ui/bds-card.ts +154 -0
- package/src/web-components/ui/bds-description-list.spec.ts +36 -0
- package/src/web-components/ui/bds-description-list.ts +79 -0
- package/src/web-components/ui/bds-icon-wrapper.spec.ts +21 -0
- package/src/web-components/ui/bds-icon-wrapper.ts +68 -0
- package/src/web-components/ui/bds-link.spec.ts +72 -0
- package/src/web-components/ui/bds-link.ts +138 -0
- package/src/web-components/ui/bds-loading.spec.ts +38 -0
- package/src/web-components/ui/bds-loading.ts +76 -0
- package/src/web-components/ui/bds-notification-banner.spec.ts +82 -0
- package/src/web-components/ui/bds-notification-banner.ts +184 -0
- package/src/web-components/ui/bds-progress-circle.spec.ts +58 -0
- package/src/web-components/ui/bds-progress-circle.ts +142 -0
- package/src/web-components/ui/bds-progress.spec.ts +66 -0
- package/src/web-components/ui/bds-progress.ts +127 -0
- package/src/web-components/ui/bds-rating.spec.ts +70 -0
- package/src/web-components/ui/bds-rating.ts +80 -0
- package/src/web-components/ui/bds-section-header.spec.ts +57 -0
- package/src/web-components/ui/bds-section-header.ts +96 -0
- package/src/web-components/ui/bds-separator.spec.ts +50 -0
- package/src/web-components/ui/bds-separator.ts +66 -0
- package/src/web-components/ui/bds-skeleton.spec.ts +22 -0
- package/src/web-components/ui/bds-skeleton.ts +55 -0
- package/src/web-components/ui/bds-typography.spec.ts +76 -0
- package/src/web-components/ui/bds-typography.ts +112 -0
- package/dist/web-components.d.ts +0 -304
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { LitElement, css, html } from 'lit';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* `<bds-textarea>` — form-associated Textarea custom element.
|
|
5
|
+
*
|
|
6
|
+
* Wraps a native `<textarea>` for consistent styling while participating
|
|
7
|
+
* in HTML forms via the Form-Associated Custom Elements API.
|
|
8
|
+
*
|
|
9
|
+
* Attributes:
|
|
10
|
+
* name — form field name
|
|
11
|
+
* value — text value
|
|
12
|
+
* placeholder — placeholder text
|
|
13
|
+
* rows — number of visible rows (default: 4)
|
|
14
|
+
* required — boolean
|
|
15
|
+
* disabled — boolean
|
|
16
|
+
*
|
|
17
|
+
* Events:
|
|
18
|
+
* input — native input event
|
|
19
|
+
* change — native change event
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* <bds-textarea name="message" placeholder="Enter message…" rows="6"></bds-textarea>
|
|
23
|
+
*/
|
|
24
|
+
export class BdsTextarea extends LitElement {
|
|
25
|
+
static formAssociated = true;
|
|
26
|
+
|
|
27
|
+
static styles = css`
|
|
28
|
+
:host {
|
|
29
|
+
display: block;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
:host([disabled]) {
|
|
33
|
+
opacity: 0.5;
|
|
34
|
+
pointer-events: none;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.textarea {
|
|
38
|
+
inline-size: 100%;
|
|
39
|
+
font-family: var(--bds-font_family--body);
|
|
40
|
+
font-size: var(--bds-font_size--body);
|
|
41
|
+
line-height: var(--bds-font_line-height--body);
|
|
42
|
+
padding: var(--bds-space_s);
|
|
43
|
+
border: none;
|
|
44
|
+
--bdc_color: currentcolor;
|
|
45
|
+
--bdc-outline_radius: var(--bds-border_radius--xs);
|
|
46
|
+
|
|
47
|
+
border-radius: var(--textarea_radius, var(--bdc-outline_radius));
|
|
48
|
+
box-shadow: inset 0 0 0 var(--bdc-outline_width) var(--bdc_color), var(--textarea_shadow, var(--bdc-outline_shadow));
|
|
49
|
+
background-color: var(--textarea_color_bg, var(--bds-color_bg));
|
|
50
|
+
color: var(--textarea_color, var(--bds-color_on-bg));
|
|
51
|
+
resize: vertical;
|
|
52
|
+
min-block-size: calc(var(--bds-space_m) * 5);
|
|
53
|
+
box-sizing: border-box;
|
|
54
|
+
transition: --bdc_color var(--bds-animation_transition-duration) var(--bds-animation_easing),
|
|
55
|
+
background-color var(--bds-animation_transition-duration) var(--bds-animation_easing);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.textarea:focus {
|
|
59
|
+
--bdc_color: var(--bdc_color--focus);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.textarea:focus-visible {
|
|
63
|
+
outline: var(--bds-outline_default);
|
|
64
|
+
outline-offset: var(--bds-outline_offset);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.textarea:disabled {
|
|
68
|
+
opacity: 0.5;
|
|
69
|
+
cursor: not-allowed;
|
|
70
|
+
resize: none;
|
|
71
|
+
}
|
|
72
|
+
`;
|
|
73
|
+
|
|
74
|
+
static properties = {
|
|
75
|
+
name: { type: String, reflect: true },
|
|
76
|
+
value: { type: String },
|
|
77
|
+
placeholder: { type: String },
|
|
78
|
+
rows: { type: Number },
|
|
79
|
+
required: { type: Boolean, reflect: true },
|
|
80
|
+
disabled: { type: Boolean, reflect: true },
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
declare name: string;
|
|
84
|
+
declare value: string;
|
|
85
|
+
declare placeholder: string;
|
|
86
|
+
declare rows: number;
|
|
87
|
+
declare required: boolean;
|
|
88
|
+
declare disabled: boolean;
|
|
89
|
+
|
|
90
|
+
private _internals!: ElementInternals;
|
|
91
|
+
|
|
92
|
+
constructor() {
|
|
93
|
+
super();
|
|
94
|
+
this._internals = this.attachInternals();
|
|
95
|
+
this.name = '';
|
|
96
|
+
this.value = '';
|
|
97
|
+
this.placeholder = '';
|
|
98
|
+
this.rows = 4;
|
|
99
|
+
this.required = false;
|
|
100
|
+
this.disabled = false;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
updated(changed: Map<string, unknown>) {
|
|
104
|
+
super.updated(changed);
|
|
105
|
+
if (changed.has('value')) {
|
|
106
|
+
this._internals.setFormValue?.(this.value || null);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
formResetCallback() {
|
|
111
|
+
this.value = '';
|
|
112
|
+
this._internals.setFormValue?.(null);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
private _handleInput(e: Event) {
|
|
116
|
+
this.value = (e.target as HTMLTextAreaElement).value;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
render() {
|
|
120
|
+
return html`
|
|
121
|
+
<textarea
|
|
122
|
+
class="textarea"
|
|
123
|
+
name=${this.name}
|
|
124
|
+
.value=${this.value}
|
|
125
|
+
placeholder=${this.placeholder}
|
|
126
|
+
rows=${this.rows}
|
|
127
|
+
?required=${this.required}
|
|
128
|
+
?disabled=${this.disabled}
|
|
129
|
+
@input=${this._handleInput}
|
|
130
|
+
></textarea>
|
|
131
|
+
`;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
customElements.define('bds-textarea', BdsTextarea);
|
|
136
|
+
|
|
137
|
+
declare global {
|
|
138
|
+
interface HTMLElementTagNameMap {
|
|
139
|
+
'bds-textarea': BdsTextarea;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { Meta, Canvas, ArgTypes } from '@storybook/blocks';
|
|
2
|
+
import * as Stories from './BdsAvatar.stories';
|
|
3
|
+
|
|
4
|
+
<Meta of={Stories} />
|
|
5
|
+
|
|
6
|
+
# <bds-avatar>
|
|
7
|
+
|
|
8
|
+
Framework-agnostic Avatar custom element. Displays a profile image when `src` is set; falls back to initials derived from the `name` attribute.
|
|
9
|
+
|
|
10
|
+
> **Status: experimental** — API may change before stable release.
|
|
11
|
+
|
|
12
|
+
## Installation
|
|
13
|
+
|
|
14
|
+
```js
|
|
15
|
+
import '@boostdev/components/web-components';
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Examples
|
|
19
|
+
|
|
20
|
+
### All sizes
|
|
21
|
+
<Canvas of={Stories.AllSizes} />
|
|
22
|
+
|
|
23
|
+
### With initials
|
|
24
|
+
<Canvas of={Stories.Default} />
|
|
25
|
+
|
|
26
|
+
### All variants
|
|
27
|
+
<Canvas of={Stories.AllVariants} />
|
|
28
|
+
|
|
29
|
+
## Props
|
|
30
|
+
|
|
31
|
+
<ArgTypes of={Stories} />
|
|
32
|
+
|
|
33
|
+
## Attributes
|
|
34
|
+
|
|
35
|
+
| Attribute | Type | Default | Description |
|
|
36
|
+
|-----------|------|---------|-------------|
|
|
37
|
+
| `name` | string | — | Full name; used to compute initials and as `aria-label` fallback |
|
|
38
|
+
| `src` | string | — | Image URL; when set, shows the image instead of initials |
|
|
39
|
+
| `alt` | string | — | Alt text for the image (defaults to `name`) |
|
|
40
|
+
| `size` | `"small" \| "medium" \| "large"` | `"medium"` | Avatar diameter (`2em` / `3em` / `4.5em`) |
|
|
41
|
+
|
|
42
|
+
## CSS Custom Properties
|
|
43
|
+
|
|
44
|
+
| Property | Description |
|
|
45
|
+
|----------|-------------|
|
|
46
|
+
| `--avatar_size` | Override the diameter directly |
|
|
47
|
+
| `--avatar_bg` | Fallback background colour (defaults to `--bds-color_blue`) |
|
|
48
|
+
| `--avatar_text` | Initials text colour (defaults to `--bds-color_on-blue`) |
|
|
49
|
+
|
|
50
|
+
## Usage in plain HTML
|
|
51
|
+
|
|
52
|
+
```html
|
|
53
|
+
<!-- Initials fallback -->
|
|
54
|
+
<bds-avatar name="Jane Doe"></bds-avatar>
|
|
55
|
+
|
|
56
|
+
<!-- With image -->
|
|
57
|
+
<bds-avatar src="/path/to/photo.jpg" name="Jane Doe" alt="Jane Doe's avatar"></bds-avatar>
|
|
58
|
+
|
|
59
|
+
<!-- Large size -->
|
|
60
|
+
<bds-avatar name="John Smith" size="large"></bds-avatar>
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Accessibility
|
|
64
|
+
|
|
65
|
+
- When showing initials: renders `role="img"` with `aria-label` set to the `name` value
|
|
66
|
+
- When showing an image: renders a standard `<img>` with `alt` text
|
|
67
|
+
- Initials are hidden from assistive technology (`aria-hidden="true"`) — the label is on the container
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
3
|
+
import '../index';
|
|
4
|
+
|
|
5
|
+
function BdsAvatar({
|
|
6
|
+
name,
|
|
7
|
+
src,
|
|
8
|
+
alt,
|
|
9
|
+
size,
|
|
10
|
+
}: {
|
|
11
|
+
name?: string;
|
|
12
|
+
src?: string;
|
|
13
|
+
alt?: string;
|
|
14
|
+
size?: 'small' | 'medium' | 'large';
|
|
15
|
+
}) {
|
|
16
|
+
return React.createElement('bds-avatar', { name, src, alt, size });
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const meta = {
|
|
20
|
+
title: 'Web Components/UI/Avatar',
|
|
21
|
+
component: BdsAvatar,
|
|
22
|
+
tags: ['!stable', 'experimental'],
|
|
23
|
+
parameters: { layout: 'centered' },
|
|
24
|
+
argTypes: {
|
|
25
|
+
size: { control: 'select', options: ['small', 'medium', 'large'] },
|
|
26
|
+
},
|
|
27
|
+
} satisfies Meta<typeof BdsAvatar>;
|
|
28
|
+
|
|
29
|
+
export default meta;
|
|
30
|
+
type Story = StoryObj<typeof meta>;
|
|
31
|
+
|
|
32
|
+
export const Default: Story = { args: { name: 'Jane Doe' } };
|
|
33
|
+
export const SingleInitial: Story = { args: { name: 'Jane' } };
|
|
34
|
+
export const Small: Story = { args: { name: 'Jane Doe', size: 'small' } };
|
|
35
|
+
export const Medium: Story = { args: { name: 'Jane Doe', size: 'medium' } };
|
|
36
|
+
export const Large: Story = { args: { name: 'Jane Doe', size: 'large' } };
|
|
37
|
+
|
|
38
|
+
export const AllSizes: Story = {
|
|
39
|
+
render: () => (
|
|
40
|
+
<div style={{ display: 'flex', alignItems: 'center', gap: '24px' }}>
|
|
41
|
+
{(['small', 'medium', 'large'] as const).map(s => (
|
|
42
|
+
<div key={s} style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: '8px' }}>
|
|
43
|
+
<BdsAvatar name="Jane Doe" size={s} />
|
|
44
|
+
<span style={{ fontSize: '0.75rem', color: '#888' }}>{s}</span>
|
|
45
|
+
</div>
|
|
46
|
+
))}
|
|
47
|
+
</div>
|
|
48
|
+
),
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
export const AllVariants: Story = {
|
|
52
|
+
render: () => (
|
|
53
|
+
<div style={{ display: 'flex', alignItems: 'center', gap: '16px', flexWrap: 'wrap' }}>
|
|
54
|
+
<BdsAvatar name="Jane Doe" />
|
|
55
|
+
<BdsAvatar name="John Smith" />
|
|
56
|
+
<BdsAvatar name="Alice" />
|
|
57
|
+
<BdsAvatar name="Bob" />
|
|
58
|
+
<BdsAvatar name="Jane Doe" size="small" />
|
|
59
|
+
<BdsAvatar name="Jane Doe" size="large" />
|
|
60
|
+
</div>
|
|
61
|
+
),
|
|
62
|
+
};
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { Meta, Canvas, ArgTypes } from '@storybook/blocks';
|
|
2
|
+
import * as Stories from './BdsBreadcrumb.stories';
|
|
3
|
+
|
|
4
|
+
<Meta of={Stories} />
|
|
5
|
+
|
|
6
|
+
# <bds-breadcrumb>
|
|
7
|
+
|
|
8
|
+
Framework-agnostic Breadcrumb navigation custom element. Renders an ordered list of links showing the user's location in the site hierarchy.
|
|
9
|
+
|
|
10
|
+
> **Status: experimental** — API may change before stable release.
|
|
11
|
+
|
|
12
|
+
## Installation
|
|
13
|
+
|
|
14
|
+
```js
|
|
15
|
+
import '@boostdev/components/web-components';
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Examples
|
|
19
|
+
|
|
20
|
+
### Default (3 levels)
|
|
21
|
+
<Canvas of={Stories.Default} />
|
|
22
|
+
|
|
23
|
+
### Deep nested
|
|
24
|
+
<Canvas of={Stories.DeepNested} />
|
|
25
|
+
|
|
26
|
+
### All variants
|
|
27
|
+
<Canvas of={Stories.AllVariants} />
|
|
28
|
+
|
|
29
|
+
## Props
|
|
30
|
+
|
|
31
|
+
<ArgTypes of={Stories} />
|
|
32
|
+
|
|
33
|
+
## Attributes
|
|
34
|
+
|
|
35
|
+
| Attribute | Type | Default | Description |
|
|
36
|
+
|-----------|------|---------|-------------|
|
|
37
|
+
| `items` | JSON string | `"[]"` | Array of `{ label: string, href?: string }` objects. The last item is the current page (no link). |
|
|
38
|
+
|
|
39
|
+
## Usage in plain HTML
|
|
40
|
+
|
|
41
|
+
```html
|
|
42
|
+
<bds-breadcrumb items='[
|
|
43
|
+
{"label":"Home","href":"/"},
|
|
44
|
+
{"label":"Products","href":"/products"},
|
|
45
|
+
{"label":"Detail"}
|
|
46
|
+
]'></bds-breadcrumb>
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
In JavaScript:
|
|
50
|
+
```js
|
|
51
|
+
const crumb = document.querySelector('bds-breadcrumb');
|
|
52
|
+
crumb.items = [
|
|
53
|
+
{ label: 'Home', href: '/' },
|
|
54
|
+
{ label: 'Products', href: '/products' },
|
|
55
|
+
{ label: 'Detail' },
|
|
56
|
+
];
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Accessibility
|
|
60
|
+
|
|
61
|
+
- Renders as `<nav aria-label="Breadcrumb">` with an `<ol>` list
|
|
62
|
+
- The last item gets `aria-current="page"` — it is not a link
|
|
63
|
+
- Separators (`›`) are hidden from screen readers with `aria-hidden="true"`
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
3
|
+
import type { BreadcrumbItem } from './bds-breadcrumb';
|
|
4
|
+
import '../index';
|
|
5
|
+
|
|
6
|
+
function BdsBreadcrumb({ items = [] }: { items?: BreadcrumbItem[] }) {
|
|
7
|
+
return React.createElement('bds-breadcrumb', { items: JSON.stringify(items) });
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const meta = {
|
|
11
|
+
title: 'Web Components/UI/Breadcrumb',
|
|
12
|
+
component: BdsBreadcrumb,
|
|
13
|
+
tags: ['!stable', 'experimental'],
|
|
14
|
+
parameters: { layout: 'padded' },
|
|
15
|
+
} satisfies Meta<typeof BdsBreadcrumb>;
|
|
16
|
+
|
|
17
|
+
export default meta;
|
|
18
|
+
type Story = StoryObj<typeof meta>;
|
|
19
|
+
|
|
20
|
+
export const Default: Story = {
|
|
21
|
+
args: {
|
|
22
|
+
items: [
|
|
23
|
+
{ label: 'Home', href: '/' },
|
|
24
|
+
{ label: 'Products', href: '/products' },
|
|
25
|
+
{ label: 'Current page' },
|
|
26
|
+
],
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export const TwoLevels: Story = {
|
|
31
|
+
args: {
|
|
32
|
+
items: [
|
|
33
|
+
{ label: 'Home', href: '/' },
|
|
34
|
+
{ label: 'Current page' },
|
|
35
|
+
],
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export const DeepNested: Story = {
|
|
40
|
+
args: {
|
|
41
|
+
items: [
|
|
42
|
+
{ label: 'Home', href: '/' },
|
|
43
|
+
{ label: 'Category', href: '/category' },
|
|
44
|
+
{ label: 'Subcategory', href: '/category/sub' },
|
|
45
|
+
{ label: 'Section', href: '/category/sub/section' },
|
|
46
|
+
{ label: 'Current page' },
|
|
47
|
+
],
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
export const AllVariants: Story = {
|
|
52
|
+
render: () => (
|
|
53
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: '16px' }}>
|
|
54
|
+
<BdsBreadcrumb items={[{ label: 'Home', href: '/' }, { label: 'Current' }]} />
|
|
55
|
+
<BdsBreadcrumb items={[{ label: 'Home', href: '/' }, { label: 'Products', href: '/products' }, { label: 'Detail' }]} />
|
|
56
|
+
<BdsBreadcrumb items={[{ label: 'Home', href: '/' }, { label: 'A', href: '/a' }, { label: 'B', href: '/a/b' }, { label: 'C', href: '/a/b/c' }, { label: 'Current' }]} />
|
|
57
|
+
</div>
|
|
58
|
+
),
|
|
59
|
+
};
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { Meta, Canvas, ArgTypes } from '@storybook/blocks';
|
|
2
|
+
import * as Stories from './BdsCard.stories';
|
|
3
|
+
|
|
4
|
+
<Meta of={Stories} />
|
|
5
|
+
|
|
6
|
+
# <bds-card>
|
|
7
|
+
|
|
8
|
+
Framework-agnostic Card layout element. Groups related content in a contained surface with optional elevation or outline. Can be made clickable.
|
|
9
|
+
|
|
10
|
+
> **Status: experimental** — API may change before stable release.
|
|
11
|
+
|
|
12
|
+
## Installation
|
|
13
|
+
|
|
14
|
+
```js
|
|
15
|
+
import '@boostdev/components/web-components';
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Examples
|
|
19
|
+
|
|
20
|
+
### All variants
|
|
21
|
+
<Canvas of={Stories.AllVariants} />
|
|
22
|
+
|
|
23
|
+
### Clickable
|
|
24
|
+
<Canvas of={Stories.Interactive} />
|
|
25
|
+
|
|
26
|
+
## Props
|
|
27
|
+
|
|
28
|
+
<ArgTypes of={Stories} />
|
|
29
|
+
|
|
30
|
+
## Attributes
|
|
31
|
+
|
|
32
|
+
| Attribute | Type | Default | Description |
|
|
33
|
+
|-----------|------|---------|-------------|
|
|
34
|
+
| `variant` | `"default" \| "elevated" \| "outlined"` | `"default"` | Visual style |
|
|
35
|
+
| `padding` | `"none" \| "small" \| "medium" \| "large"` | `"medium"` | Internal spacing |
|
|
36
|
+
| `text-align` | `"start" \| "center" \| "end"` | `"start"` | Content alignment |
|
|
37
|
+
| `clickable` | boolean | `false` | Renders as `<button>`, adds hover/active effects |
|
|
38
|
+
| `aria-label` | string | — | Accessible label (required when `clickable` and the card content is not descriptive enough) |
|
|
39
|
+
|
|
40
|
+
## Slots
|
|
41
|
+
|
|
42
|
+
| Slot | Description |
|
|
43
|
+
|------|-------------|
|
|
44
|
+
| `(default)` | Card content |
|
|
45
|
+
|
|
46
|
+
## Events
|
|
47
|
+
|
|
48
|
+
| Event | Detail | Bubbles | Composed | Description |
|
|
49
|
+
|-------|--------|---------|----------|-------------|
|
|
50
|
+
| `bds-click` | — | Yes | Yes | Fired when a clickable card is activated |
|
|
51
|
+
|
|
52
|
+
## CSS Custom Properties
|
|
53
|
+
|
|
54
|
+
| Property | Description |
|
|
55
|
+
|----------|-------------|
|
|
56
|
+
| `--card_color` | Card background colour |
|
|
57
|
+
| `--card_on-color` | Card text colour |
|
|
58
|
+
|
|
59
|
+
## Usage in plain HTML
|
|
60
|
+
|
|
61
|
+
```html
|
|
62
|
+
<bds-card variant="elevated" padding="large">
|
|
63
|
+
<h3>Card title</h3>
|
|
64
|
+
<p>Card body text.</p>
|
|
65
|
+
</bds-card>
|
|
66
|
+
|
|
67
|
+
<bds-card clickable aria-label="View product details">
|
|
68
|
+
<strong>Clickable card</strong>
|
|
69
|
+
</bds-card>
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Listen for click:
|
|
73
|
+
```js
|
|
74
|
+
document.querySelector('bds-card[clickable]').addEventListener('bds-click', () => {
|
|
75
|
+
console.log('card clicked');
|
|
76
|
+
});
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Accessibility
|
|
80
|
+
|
|
81
|
+
- Non-clickable cards are `<div>` elements — they have no interactive role
|
|
82
|
+
- Clickable cards render as `<button>` with keyboard and pointer support
|
|
83
|
+
- Always provide `aria-label` on clickable cards when the text content alone is not descriptive
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
3
|
+
import type { CardVariant, CardPadding, CardTextAlign } from './bds-card';
|
|
4
|
+
import '../index';
|
|
5
|
+
|
|
6
|
+
function BdsCard({
|
|
7
|
+
variant,
|
|
8
|
+
padding,
|
|
9
|
+
textAlign,
|
|
10
|
+
clickable,
|
|
11
|
+
ariaLabel,
|
|
12
|
+
onClick,
|
|
13
|
+
children,
|
|
14
|
+
}: {
|
|
15
|
+
variant?: CardVariant;
|
|
16
|
+
padding?: CardPadding;
|
|
17
|
+
textAlign?: CardTextAlign;
|
|
18
|
+
clickable?: boolean;
|
|
19
|
+
ariaLabel?: string;
|
|
20
|
+
onClick?: () => void;
|
|
21
|
+
children?: React.ReactNode;
|
|
22
|
+
}) {
|
|
23
|
+
return React.createElement(
|
|
24
|
+
'bds-card',
|
|
25
|
+
{
|
|
26
|
+
variant,
|
|
27
|
+
padding,
|
|
28
|
+
'text-align': textAlign,
|
|
29
|
+
clickable: clickable || undefined,
|
|
30
|
+
'aria-label': ariaLabel,
|
|
31
|
+
onbdsclick: onClick,
|
|
32
|
+
},
|
|
33
|
+
children,
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const meta = {
|
|
38
|
+
title: 'Web Components/UI/Card',
|
|
39
|
+
component: BdsCard,
|
|
40
|
+
tags: ['!stable', 'experimental'],
|
|
41
|
+
parameters: { layout: 'centered' },
|
|
42
|
+
argTypes: {
|
|
43
|
+
variant: { control: 'select', options: ['default', 'elevated', 'outlined'] },
|
|
44
|
+
padding: { control: 'select', options: ['none', 'small', 'medium', 'large'] },
|
|
45
|
+
textAlign: { control: 'select', options: ['start', 'center', 'end'] },
|
|
46
|
+
},
|
|
47
|
+
} satisfies Meta<typeof BdsCard>;
|
|
48
|
+
|
|
49
|
+
export default meta;
|
|
50
|
+
type Story = StoryObj<typeof meta>;
|
|
51
|
+
|
|
52
|
+
const cardContent = React.createElement(
|
|
53
|
+
'div',
|
|
54
|
+
null,
|
|
55
|
+
React.createElement('strong', null, 'Card title'),
|
|
56
|
+
React.createElement('p', { style: { margin: '8px 0 0' } }, 'Card body with some descriptive text.'),
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
export const Default: Story = { args: { variant: 'default', children: cardContent } };
|
|
60
|
+
export const Elevated: Story = { args: { variant: 'elevated', children: cardContent } };
|
|
61
|
+
export const Outlined: Story = { args: { variant: 'outlined', children: cardContent } };
|
|
62
|
+
export const Clickable: Story = { args: { variant: 'default', clickable: true, ariaLabel: 'Open details', children: cardContent } };
|
|
63
|
+
|
|
64
|
+
export const AllVariants: Story = {
|
|
65
|
+
render: () => (
|
|
66
|
+
<div style={{ display: 'flex', gap: '16px', flexWrap: 'wrap' }}>
|
|
67
|
+
{(['default', 'elevated', 'outlined'] as const).map(v => (
|
|
68
|
+
<BdsCard key={v} variant={v} style={{ width: '200px' } as React.CSSProperties}>
|
|
69
|
+
<strong>{v}</strong>
|
|
70
|
+
<p style={{ margin: '8px 0 0' }}>Card variant</p>
|
|
71
|
+
</BdsCard>
|
|
72
|
+
))}
|
|
73
|
+
</div>
|
|
74
|
+
),
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
export const Interactive: Story = {
|
|
78
|
+
render: () => {
|
|
79
|
+
const [count, setCount] = React.useState(0);
|
|
80
|
+
return (
|
|
81
|
+
<div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: '16px' }}>
|
|
82
|
+
<BdsCard variant="elevated" clickable ariaLabel="Click me" onClick={() => setCount(c => c + 1)}>
|
|
83
|
+
<strong>Clickable card</strong>
|
|
84
|
+
<p style={{ margin: '8px 0 0' }}>Click to increment counter</p>
|
|
85
|
+
</BdsCard>
|
|
86
|
+
<p style={{ margin: 0 }}>Clicked {count} times</p>
|
|
87
|
+
</div>
|
|
88
|
+
);
|
|
89
|
+
},
|
|
90
|
+
};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { Meta, Canvas, ArgTypes } from '@storybook/blocks';
|
|
2
|
+
import * as Stories from './BdsDescriptionList.stories';
|
|
3
|
+
|
|
4
|
+
<Meta of={Stories} />
|
|
5
|
+
|
|
6
|
+
# <bds-description-list>
|
|
7
|
+
|
|
8
|
+
Framework-agnostic Description List custom element. Wraps a semantic `<dl>` element for rendering key–value pairs. Consumers provide `<dt>` and `<dd>` elements as slotted children.
|
|
9
|
+
|
|
10
|
+
> **Status: experimental** — API may change before stable release.
|
|
11
|
+
|
|
12
|
+
## Installation
|
|
13
|
+
|
|
14
|
+
```js
|
|
15
|
+
import '@boostdev/components/web-components';
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Examples
|
|
19
|
+
|
|
20
|
+
### All layouts
|
|
21
|
+
<Canvas of={Stories.AllVariants} />
|
|
22
|
+
|
|
23
|
+
### Stacked
|
|
24
|
+
<Canvas of={Stories.Stacked} />
|
|
25
|
+
|
|
26
|
+
### Inline
|
|
27
|
+
<Canvas of={Stories.Inline} />
|
|
28
|
+
|
|
29
|
+
## Props
|
|
30
|
+
|
|
31
|
+
<ArgTypes of={Stories} />
|
|
32
|
+
|
|
33
|
+
## Attributes
|
|
34
|
+
|
|
35
|
+
| Attribute | Type | Default | Description |
|
|
36
|
+
|-----------|------|---------|-------------|
|
|
37
|
+
| `layout` | `"stacked" \| "inline"` | `"stacked"` | Arrangement of terms and details |
|
|
38
|
+
|
|
39
|
+
## Slots
|
|
40
|
+
|
|
41
|
+
| Slot | Description |
|
|
42
|
+
|------|-------------|
|
|
43
|
+
| `(default)` | `<dt>` and `<dd>` element pairs |
|
|
44
|
+
|
|
45
|
+
## Usage in plain HTML
|
|
46
|
+
|
|
47
|
+
```html
|
|
48
|
+
<bds-description-list>
|
|
49
|
+
<dt>Name</dt>
|
|
50
|
+
<dd>Jane Doe</dd>
|
|
51
|
+
<dt>Email</dt>
|
|
52
|
+
<dd>jane@example.com</dd>
|
|
53
|
+
</bds-description-list>
|
|
54
|
+
|
|
55
|
+
<bds-description-list layout="inline">
|
|
56
|
+
<dt>Status</dt>
|
|
57
|
+
<dd>Active</dd>
|
|
58
|
+
<dt>Role</dt>
|
|
59
|
+
<dd>Designer</dd>
|
|
60
|
+
</bds-description-list>
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Accessibility
|
|
64
|
+
|
|
65
|
+
- Renders a semantic `<dl>` element — screen readers announce it as a description list
|
|
66
|
+
- Ensure `<dt>` and `<dd>` elements are properly paired
|
|
67
|
+
- The `::slotted(dt)` and `::slotted(dd)` CSS selectors apply the visual styling
|