@boostdev/design-system-components 1.1.2 → 1.2.1

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.
Files changed (213) hide show
  1. package/AGENTS.md +38 -14
  2. package/dist/client.cjs +85 -103
  3. package/dist/client.css +610 -601
  4. package/dist/client.d.cts +13 -16
  5. package/dist/client.d.ts +13 -16
  6. package/dist/client.js +95 -113
  7. package/dist/index.cjs +85 -103
  8. package/dist/index.css +610 -601
  9. package/dist/index.d.cts +13 -16
  10. package/dist/index.d.ts +13 -16
  11. package/dist/index.js +95 -113
  12. package/dist/native/index.cjs +9 -8
  13. package/dist/native/index.d.cts +1 -1
  14. package/dist/native/index.d.ts +1 -1
  15. package/dist/native/index.js +9 -8
  16. package/dist/web-components/{chunk-K5CE6HSB.js → chunk-2FGATTGT.js} +79 -17
  17. package/dist/web-components/{chunk-O4UFI2RX.js → chunk-3REOIRDW.js} +13 -11
  18. package/dist/web-components/{chunk-5IPHEONG.js → chunk-6I2DBFQ7.js} +1 -0
  19. package/dist/web-components/{chunk-VM3YHGQ2.js → chunk-AJSXNDAP.js} +1 -2
  20. package/dist/web-components/{chunk-LSC4N56Q.js → chunk-BX3IPVOB.js} +1 -2
  21. package/dist/web-components/{chunk-CAPI25CU.js → chunk-DZRSJGPB.js} +3 -3
  22. package/dist/web-components/{chunk-VSS5ITNE.js → chunk-EBJM3VD4.js} +1 -3
  23. package/dist/web-components/{chunk-O7I63SQX.js → chunk-HHHRF2PS.js} +6 -12
  24. package/dist/web-components/{chunk-OTX4COSV.js → chunk-JUKB3BUP.js} +3 -4
  25. package/dist/web-components/{chunk-IQGLIQSO.js → chunk-N6IMUOY4.js} +2 -5
  26. package/dist/web-components/{chunk-CJ5ZOO42.js → chunk-OCODKRVZ.js} +68 -44
  27. package/dist/web-components/{chunk-QDRH46TF.js → chunk-QLZ2362S.js} +1 -3
  28. package/dist/web-components/{chunk-IK3PTFZ4.js → chunk-T6AETZRP.js} +1 -3
  29. package/dist/web-components/{chunk-4BX6AWXX.js → chunk-X3FKVHLK.js} +2 -4
  30. package/dist/web-components/{chunk-A67LCT7C.js → chunk-XNA6WTXG.js} +3 -4
  31. package/dist/web-components/{chunk-XIENXR7H.js → chunk-YRXCVKHV.js} +1 -3
  32. package/dist/web-components/{chunk-6T3RKUKG.js → chunk-ZTC6GRP7.js} +1 -2
  33. package/dist/web-components/globals.js +1 -1
  34. package/dist/web-components/index.d.ts +571 -1
  35. package/dist/web-components/index.js +1515 -18
  36. package/dist/web-components/interaction/bds-accordion.js +1 -1
  37. package/dist/web-components/interaction/bds-button.d.ts +2 -2
  38. package/dist/web-components/interaction/bds-button.js +1 -1
  39. package/dist/web-components/interaction/bds-collapsible.js +1 -1
  40. package/dist/web-components/interaction/bds-dialog.js +1 -1
  41. package/dist/web-components/interaction/bds-drawer.js +1 -1
  42. package/dist/web-components/interaction/form/bds-checkbox.js +1 -1
  43. package/dist/web-components/interaction/form/bds-combobox.js +1 -1
  44. package/dist/web-components/interaction/form/bds-number-input.js +1 -1
  45. package/dist/web-components/interaction/form/bds-radio.js +1 -1
  46. package/dist/web-components/interaction/form/bds-segmented-control.d.ts +20 -3
  47. package/dist/web-components/interaction/form/bds-segmented-control.js +1 -1
  48. package/dist/web-components/interaction/form/bds-select.js +1 -1
  49. package/dist/web-components/interaction/form/bds-switch.js +1 -1
  50. package/dist/web-components/interaction/form/bds-textarea.js +1 -1
  51. package/dist/web-components/ui/bds-alert.js +1 -1
  52. package/dist/web-components/ui/bds-card.js +1 -1
  53. package/dist/web-components/ui/bds-notification-banner.js +1 -1
  54. package/package.json +2 -2
  55. package/src/components/interaction/Button/Button.module.css +12 -11
  56. package/src/components/interaction/Button/Button.native.tsx +10 -9
  57. package/src/components/interaction/Button/Button.tsx +1 -1
  58. package/src/components/interaction/Command/Command.module.css +3 -7
  59. package/src/components/interaction/Dialog/Dialog.module.css +7 -5
  60. package/src/components/interaction/Drawer/Drawer.module.css +48 -25
  61. package/src/components/interaction/Drawer/Drawer.tsx +21 -17
  62. package/src/components/interaction/DropdownMenu/DropdownMenu.module.css +1 -3
  63. package/src/components/interaction/Popover/Popover.module.css +1 -3
  64. package/src/components/interaction/form/Checkbox/Checkbox.module.css +1 -3
  65. package/src/components/interaction/form/Combobox/Combobox.module.css +2 -6
  66. package/src/components/interaction/form/FormInput/FormInput.module.css +1 -3
  67. package/src/components/interaction/form/NumberInput/NumberInput.module.css +16 -4
  68. package/src/components/interaction/form/Radio/Radio.module.css +6 -16
  69. package/src/components/interaction/form/SegmentedControl/SegmentedControl.mdx +74 -25
  70. package/src/components/interaction/form/SegmentedControl/SegmentedControl.module.css +65 -36
  71. package/src/components/interaction/form/SegmentedControl/SegmentedControl.spec.tsx +127 -56
  72. package/src/components/interaction/form/SegmentedControl/SegmentedControl.stories.tsx +89 -72
  73. package/src/components/interaction/form/SegmentedControl/SegmentedControl.tsx +40 -62
  74. package/src/components/interaction/form/SegmentedControl/index.ts +1 -1
  75. package/src/components/interaction/form/Select/Select.module.css +2 -4
  76. package/src/components/interaction/form/Switch/Switch.module.css +5 -7
  77. package/src/components/interaction/form/Switch/Switch.native.spec.tsx +9 -9
  78. package/src/components/interaction/form/Switch/Switch.native.tsx +2 -2
  79. package/src/components/interaction/form/Textarea/Textarea.module.css +1 -3
  80. package/src/components/interaction/form/atoms/InputContainer.stories.tsx +64 -0
  81. package/src/components/interaction/form/atoms/Label.stories.tsx +33 -0
  82. package/src/components/interaction/form/atoms/Message.stories.tsx +33 -0
  83. package/src/components/layout/Card/Card.module.css +1 -3
  84. package/src/components/ui/Accordion/Accordion.module.css +1 -2
  85. package/src/components/ui/Alert/Alert.module.css +1 -2
  86. package/src/components/ui/Calendar/Calendar.module.css +2 -5
  87. package/src/components/ui/Carousel/Carousel.module.css +1 -3
  88. package/src/components/ui/NotificationBanner/NotificationBanner.module.css +1 -2
  89. package/src/components/ui/Pagination/Pagination.module.css +1 -2
  90. package/src/components/ui/SkipLink/SkipLink.module.css +1 -2
  91. package/src/components/ui/Table/Table.module.css +1 -2
  92. package/src/css/bdc.css +16 -11
  93. package/src/index.ts +1 -1
  94. package/src/stories/Introduction.mdx +2 -1
  95. package/src/web-components/globals.ts +3 -3
  96. package/src/web-components/index.ts +12 -0
  97. package/src/web-components/interaction/BdsAccordion.mdx +103 -0
  98. package/src/web-components/interaction/BdsAccordion.stories.tsx +94 -0
  99. package/src/web-components/interaction/BdsCollapsible.mdx +116 -0
  100. package/src/web-components/interaction/BdsCollapsible.stories.tsx +68 -0
  101. package/src/web-components/interaction/BdsDialog.mdx +110 -0
  102. package/src/web-components/interaction/BdsDialog.stories.tsx +157 -0
  103. package/src/web-components/interaction/BdsDrawer.mdx +108 -0
  104. package/src/web-components/interaction/BdsDrawer.stories.tsx +196 -0
  105. package/src/web-components/interaction/BdsDropdownMenu.mdx +108 -0
  106. package/src/web-components/interaction/BdsDropdownMenu.stories.tsx +91 -0
  107. package/src/web-components/interaction/BdsSkipLink.mdx +90 -0
  108. package/src/web-components/interaction/BdsSkipLink.stories.tsx +68 -0
  109. package/src/web-components/interaction/BdsTabs.mdx +117 -0
  110. package/src/web-components/interaction/BdsTabs.stories.tsx +94 -0
  111. package/src/web-components/interaction/BdsTooltip.mdx +104 -0
  112. package/src/web-components/interaction/BdsTooltip.stories.tsx +87 -0
  113. package/src/web-components/interaction/bds-accordion.ts +1 -2
  114. package/src/web-components/interaction/bds-button.ts +15 -13
  115. package/src/web-components/interaction/bds-collapsible.ts +1 -0
  116. package/src/web-components/interaction/bds-dialog.ts +2 -5
  117. package/src/web-components/interaction/bds-drawer.ts +70 -44
  118. package/src/web-components/interaction/bds-dropdown-menu-item.ts +124 -0
  119. package/src/web-components/interaction/bds-dropdown-menu.spec.ts +102 -0
  120. package/src/web-components/interaction/bds-dropdown-menu.ts +200 -0
  121. package/src/web-components/interaction/form/BdsCheckbox.mdx +76 -0
  122. package/src/web-components/interaction/form/BdsCheckbox.stories.tsx +72 -0
  123. package/src/web-components/interaction/form/BdsCheckboxGroup.mdx +70 -0
  124. package/src/web-components/interaction/form/BdsCheckboxGroup.stories.tsx +81 -0
  125. package/src/web-components/interaction/form/BdsCombobox.mdx +71 -0
  126. package/src/web-components/interaction/form/BdsCombobox.stories.tsx +93 -0
  127. package/src/web-components/interaction/form/BdsFileInput.mdx +79 -0
  128. package/src/web-components/interaction/form/BdsFileInput.stories.tsx +69 -0
  129. package/src/web-components/interaction/form/BdsFormInput.mdx +98 -0
  130. package/src/web-components/interaction/form/BdsFormInput.stories.tsx +139 -0
  131. package/src/web-components/interaction/form/BdsNumberInput.mdx +70 -0
  132. package/src/web-components/interaction/form/BdsNumberInput.stories.tsx +68 -0
  133. package/src/web-components/interaction/form/BdsRadio.mdx +72 -0
  134. package/src/web-components/interaction/form/BdsRadio.stories.tsx +58 -0
  135. package/src/web-components/interaction/form/BdsRadioGroup.mdx +73 -0
  136. package/src/web-components/interaction/form/BdsRadioGroup.stories.tsx +88 -0
  137. package/src/web-components/interaction/form/BdsSegmentedControl.mdx +95 -0
  138. package/src/web-components/interaction/form/BdsSegmentedControl.stories.tsx +102 -0
  139. package/src/web-components/interaction/form/BdsSelect.mdx +76 -0
  140. package/src/web-components/interaction/form/BdsSelect.stories.tsx +84 -0
  141. package/src/web-components/interaction/form/BdsSlider.mdx +77 -0
  142. package/src/web-components/interaction/form/BdsSlider.stories.tsx +68 -0
  143. package/src/web-components/interaction/form/BdsSwitch.mdx +72 -0
  144. package/src/web-components/interaction/form/BdsSwitch.stories.tsx +58 -0
  145. package/src/web-components/interaction/form/BdsTextarea.mdx +73 -0
  146. package/src/web-components/interaction/form/BdsTextarea.stories.tsx +70 -0
  147. package/src/web-components/interaction/form/bds-checkbox-group.spec.ts +55 -0
  148. package/src/web-components/interaction/form/bds-checkbox-group.ts +117 -0
  149. package/src/web-components/interaction/form/bds-checkbox.ts +1 -3
  150. package/src/web-components/interaction/form/bds-combobox.ts +1 -3
  151. package/src/web-components/interaction/form/bds-form-input.spec.ts +83 -0
  152. package/src/web-components/interaction/form/bds-form-input.ts +268 -0
  153. package/src/web-components/interaction/form/bds-number-input.ts +3 -4
  154. package/src/web-components/interaction/form/bds-radio-group.spec.ts +62 -0
  155. package/src/web-components/interaction/form/bds-radio-group.ts +142 -0
  156. package/src/web-components/interaction/form/bds-radio.ts +6 -12
  157. package/src/web-components/interaction/form/bds-segmented-control.ts +96 -20
  158. package/src/web-components/interaction/form/bds-select.ts +2 -4
  159. package/src/web-components/interaction/form/bds-switch.ts +3 -4
  160. package/src/web-components/interaction/form/bds-textarea.ts +1 -3
  161. package/src/web-components/ui/BdsAvatar.mdx +76 -0
  162. package/src/web-components/ui/BdsAvatar.stories.tsx +48 -0
  163. package/src/web-components/ui/BdsBreadcrumb.mdx +66 -0
  164. package/src/web-components/ui/BdsBreadcrumb.stories.tsx +49 -0
  165. package/src/web-components/ui/BdsButtonGroup.mdx +69 -0
  166. package/src/web-components/ui/BdsButtonGroup.stories.tsx +66 -0
  167. package/src/web-components/ui/BdsCalendar.mdx +93 -0
  168. package/src/web-components/ui/BdsCalendar.stories.tsx +63 -0
  169. package/src/web-components/ui/BdsCard.mdx +88 -0
  170. package/src/web-components/ui/BdsCard.stories.tsx +67 -0
  171. package/src/web-components/ui/BdsCarousel.mdx +83 -0
  172. package/src/web-components/ui/BdsCarousel.stories.tsx +96 -0
  173. package/src/web-components/ui/BdsDescriptionList.mdx +64 -0
  174. package/src/web-components/ui/BdsDescriptionList.stories.tsx +64 -0
  175. package/src/web-components/ui/BdsIconWrapper.mdx +70 -0
  176. package/src/web-components/ui/BdsIconWrapper.stories.tsx +81 -0
  177. package/src/web-components/ui/BdsLink.mdx +79 -0
  178. package/src/web-components/ui/BdsLink.stories.tsx +63 -0
  179. package/src/web-components/ui/BdsLoading.mdx +58 -0
  180. package/src/web-components/ui/BdsLoading.stories.tsx +35 -0
  181. package/src/web-components/ui/BdsNotificationBanner.mdx +85 -0
  182. package/src/web-components/ui/BdsNotificationBanner.stories.tsx +84 -0
  183. package/src/web-components/ui/BdsPagination.mdx +74 -0
  184. package/src/web-components/ui/BdsPagination.stories.tsx +36 -0
  185. package/src/web-components/ui/BdsProgress.mdx +70 -0
  186. package/src/web-components/ui/BdsProgress.stories.tsx +96 -0
  187. package/src/web-components/ui/BdsProgressCircle.mdx +70 -0
  188. package/src/web-components/ui/BdsProgressCircle.stories.tsx +57 -0
  189. package/src/web-components/ui/BdsRating.mdx +61 -0
  190. package/src/web-components/ui/BdsRating.stories.tsx +45 -0
  191. package/src/web-components/ui/BdsSectionHeader.mdx +72 -0
  192. package/src/web-components/ui/BdsSectionHeader.stories.tsx +54 -0
  193. package/src/web-components/ui/BdsSeparator.mdx +77 -0
  194. package/src/web-components/ui/BdsSeparator.stories.tsx +55 -0
  195. package/src/web-components/ui/BdsSkeleton.mdx +61 -0
  196. package/src/web-components/ui/BdsSkeleton.stories.tsx +50 -0
  197. package/src/web-components/ui/BdsTable.mdx +81 -0
  198. package/src/web-components/ui/BdsTable.stories.tsx +83 -0
  199. package/src/web-components/ui/BdsTypography.mdx +74 -0
  200. package/src/web-components/ui/BdsTypography.stories.tsx +52 -0
  201. package/src/web-components/ui/bds-alert.ts +1 -2
  202. package/src/web-components/ui/bds-button-group.spec.ts +40 -0
  203. package/src/web-components/ui/bds-button-group.ts +78 -0
  204. package/src/web-components/ui/bds-calendar.spec.ts +91 -0
  205. package/src/web-components/ui/bds-calendar.ts +427 -0
  206. package/src/web-components/ui/bds-card.ts +1 -3
  207. package/src/web-components/ui/bds-carousel.spec.ts +64 -0
  208. package/src/web-components/ui/bds-carousel.ts +296 -0
  209. package/src/web-components/ui/bds-notification-banner.ts +1 -2
  210. package/src/web-components/ui/bds-pagination.spec.ts +67 -0
  211. package/src/web-components/ui/bds-pagination.ts +197 -0
  212. package/src/web-components/ui/bds-table.spec.ts +45 -0
  213. package/src/web-components/ui/bds-table.ts +96 -0
@@ -0,0 +1,102 @@
1
+ import React from 'react';
2
+ import type { Meta, StoryObj } from '@storybook/react';
3
+ import '../../index'; // auto-registers all custom elements
4
+
5
+ const VIEW_OPTIONS = JSON.stringify([
6
+ { value: 'list', label: 'List' },
7
+ { value: 'grid', label: 'Grid' },
8
+ { value: 'map', label: 'Map' },
9
+ ]);
10
+
11
+ const OPTIONS_WITH_DISABLED = JSON.stringify([
12
+ { value: 'list', label: 'List' },
13
+ { value: 'grid', label: 'Grid', disabled: true },
14
+ { value: 'map', label: 'Map' },
15
+ ]);
16
+
17
+ const NAV_OPTIONS = JSON.stringify([
18
+ { value: 'home', label: 'Home', href: '/' },
19
+ { value: 'about', label: 'About', href: '/about' },
20
+ { value: 'contact', label: 'Contact', href: '/contact' },
21
+ ]);
22
+
23
+ function BdsSegmentedControl({
24
+ name,
25
+ value,
26
+ options,
27
+ disabled,
28
+ variant,
29
+ }: {
30
+ name?: string;
31
+ value?: string;
32
+ options?: string;
33
+ disabled?: boolean;
34
+ variant?: 'outline' | 'filled';
35
+ }) {
36
+ return React.createElement('bds-segmented-control', {
37
+ name,
38
+ value,
39
+ options,
40
+ disabled: disabled || undefined,
41
+ variant,
42
+ });
43
+ }
44
+
45
+ const meta = {
46
+ title: 'Web Components/Interaction/Form/SegmentedControl',
47
+ component: BdsSegmentedControl,
48
+ tags: ['!stable', 'experimental'],
49
+ parameters: { layout: 'centered' },
50
+ argTypes: {
51
+ variant: { control: 'select', options: ['outline', 'filled'] },
52
+ disabled: { control: 'boolean' },
53
+ },
54
+ } satisfies Meta<typeof BdsSegmentedControl>;
55
+
56
+ export default meta;
57
+ type Story = StoryObj<typeof meta>;
58
+
59
+ export const Default: Story = {
60
+ args: {
61
+ name: 'view',
62
+ value: 'list',
63
+ options: VIEW_OPTIONS,
64
+ variant: 'outline',
65
+ },
66
+ };
67
+
68
+ export const Filled: Story = {
69
+ args: {
70
+ name: 'view',
71
+ value: 'list',
72
+ options: VIEW_OPTIONS,
73
+ variant: 'filled',
74
+ },
75
+ };
76
+
77
+ export const WithDisabledOption: Story = {
78
+ args: {
79
+ name: 'view',
80
+ value: 'list',
81
+ options: OPTIONS_WITH_DISABLED,
82
+ variant: 'outline',
83
+ },
84
+ };
85
+
86
+ export const AsNavLinks: Story = {
87
+ args: {
88
+ value: 'home',
89
+ options: NAV_OPTIONS,
90
+ variant: 'outline',
91
+ },
92
+ };
93
+
94
+ export const Disabled: Story = {
95
+ args: {
96
+ name: 'view',
97
+ value: 'list',
98
+ options: VIEW_OPTIONS,
99
+ disabled: true,
100
+ variant: 'outline',
101
+ },
102
+ };
@@ -0,0 +1,76 @@
1
+ import { Meta, Canvas, ArgTypes } from '@storybook/blocks';
2
+ import * as Stories from './BdsSelect.stories';
3
+
4
+ <Meta of={Stories} />
5
+
6
+ # &lt;bds-select&gt;
7
+
8
+ Form-associated select custom element. Wraps a native `<select>` with consistent styling. Options are passed as a JSON attribute because slotting `<option>` elements into shadow DOM is not supported cross-browser.
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
+ ## When to use
19
+
20
+ Use `<bds-select>` for pick-from-list dropdowns where users cannot type to search. For searchable/filterable lists, use `<bds-combobox>` instead.
21
+
22
+ ## Examples
23
+
24
+ ### Default (pre-selected value)
25
+ <Canvas of={Stories.Default} />
26
+
27
+ ### With placeholder
28
+ <Canvas of={Stories.WithPlaceholder} />
29
+
30
+ ### Required
31
+ <Canvas of={Stories.Required} />
32
+
33
+ ### Disabled
34
+ <Canvas of={Stories.Disabled} />
35
+
36
+ ### With a disabled option
37
+ <Canvas of={Stories.WithDisabledOption} />
38
+
39
+ ## Props
40
+
41
+ <ArgTypes of={Stories} />
42
+
43
+ ## Attributes
44
+
45
+ | Attribute | Type | Default | Description |
46
+ |---------------|---------|---------|----------------------------------------------------------------|
47
+ | `name` | string | `""` | Form field name |
48
+ | `value` | string | `""` | Currently selected value |
49
+ | `options` | string | `"[]"` | JSON array of `{ value, label, disabled? }` option objects |
50
+ | `placeholder` | string | `""` | Placeholder option label (disabled, empty value) |
51
+ | `required` | boolean | `false` | Marks the field as required |
52
+ | `disabled` | boolean | `false` | Disables the select |
53
+
54
+ ## Events
55
+
56
+ | Event | Detail | Description |
57
+ |----------|--------|-------------------------------------------------------|
58
+ | `change` | — | Native change event forwarded from the inner `<select>` |
59
+
60
+ ## Usage in plain HTML
61
+
62
+ ```html
63
+ <bds-select
64
+ name="country"
65
+ placeholder="Choose a country…"
66
+ options='[{"value":"nl","label":"Netherlands"},{"value":"be","label":"Belgium"}]'
67
+ ></bds-select>
68
+ ```
69
+
70
+ ## Accessibility
71
+
72
+ - Wraps a native `<select>` which has full browser and assistive technology support
73
+ - The custom chevron icon is `aria-hidden="true"` to avoid duplicate announcements
74
+ - `required` uses the native `<select required>` attribute for browser validation
75
+ - `disabled` uses the native `<select disabled>` attribute
76
+ - Participates in HTML forms via the Form-Associated Custom Elements API
@@ -0,0 +1,84 @@
1
+ import React from 'react';
2
+ import type { Meta, StoryObj } from '@storybook/react';
3
+ import '../../index'; // auto-registers all custom elements
4
+
5
+ const COUNTRIES = JSON.stringify([
6
+ { value: 'nl', label: 'Netherlands' },
7
+ { value: 'be', label: 'Belgium' },
8
+ { value: 'de', label: 'Germany' },
9
+ { value: 'fr', label: 'France' },
10
+ { value: 'gb', label: 'United Kingdom' },
11
+ ]);
12
+
13
+ const COUNTRIES_WITH_DISABLED = JSON.stringify([
14
+ { value: 'nl', label: 'Netherlands' },
15
+ { value: 'be', label: 'Belgium' },
16
+ { value: 'de', label: 'Germany', disabled: true },
17
+ { value: 'fr', label: 'France' },
18
+ ]);
19
+
20
+ function BdsSelect({
21
+ name,
22
+ value,
23
+ options,
24
+ placeholder,
25
+ required,
26
+ disabled,
27
+ }: {
28
+ name?: string;
29
+ value?: string;
30
+ options?: string;
31
+ placeholder?: string;
32
+ required?: boolean;
33
+ disabled?: boolean;
34
+ }) {
35
+ return React.createElement('bds-select', {
36
+ name,
37
+ value,
38
+ options,
39
+ placeholder,
40
+ required: required || undefined,
41
+ disabled: disabled || undefined,
42
+ });
43
+ }
44
+
45
+ const meta = {
46
+ title: 'Web Components/Interaction/Form/Select',
47
+ component: BdsSelect,
48
+ tags: ['!stable', 'experimental'],
49
+ parameters: { layout: 'centered' },
50
+ argTypes: {
51
+ required: { control: 'boolean' },
52
+ disabled: { control: 'boolean' },
53
+ },
54
+ decorators: [
55
+ (Story: React.ComponentType) => (
56
+ <div style={{ width: '280px' }}>
57
+ <Story />
58
+ </div>
59
+ ),
60
+ ],
61
+ } satisfies Meta<typeof BdsSelect>;
62
+
63
+ export default meta;
64
+ type Story = StoryObj<typeof meta>;
65
+
66
+ export const Default: Story = {
67
+ args: { name: 'country', options: COUNTRIES, value: 'nl' },
68
+ };
69
+
70
+ export const WithPlaceholder: Story = {
71
+ args: { name: 'country', options: COUNTRIES, placeholder: 'Choose a country…' },
72
+ };
73
+
74
+ export const Required: Story = {
75
+ args: { name: 'country', options: COUNTRIES, placeholder: 'Choose a country…', required: true },
76
+ };
77
+
78
+ export const Disabled: Story = {
79
+ args: { name: 'country', options: COUNTRIES, value: 'nl', disabled: true },
80
+ };
81
+
82
+ export const WithDisabledOption: Story = {
83
+ args: { name: 'country', options: COUNTRIES_WITH_DISABLED, placeholder: 'Choose a country…' },
84
+ };
@@ -0,0 +1,77 @@
1
+ import { Meta, Canvas, ArgTypes } from '@storybook/blocks';
2
+ import * as Stories from './BdsSlider.stories';
3
+
4
+ <Meta of={Stories} />
5
+
6
+ # &lt;bds-slider&gt;
7
+
8
+ Form-associated range slider. Wraps a native `<input type="range">` with a styled fill track driven by the `--slider_fill` CSS custom property.
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
+ ## When to use
19
+
20
+ Use `<bds-slider>` for continuous or stepped numeric ranges — volume controls, price ranges, ratings, or any value that benefits from visual representation of position within a range.
21
+
22
+ ## Examples
23
+
24
+ ### Default (0–100)
25
+ <Canvas of={Stories.Default} />
26
+
27
+ ### With step (25)
28
+ <Canvas of={Stories.WithStep} />
29
+
30
+ ### With custom min/max (1–5)
31
+ <Canvas of={Stories.WithMinMax} />
32
+
33
+ ### Disabled
34
+ <Canvas of={Stories.Disabled} />
35
+
36
+ ## Props
37
+
38
+ <ArgTypes of={Stories} />
39
+
40
+ ## Attributes
41
+
42
+ | Attribute | Type | Default | Description |
43
+ |------------|---------|---------|------------------------------------------|
44
+ | `name` | string | `""` | Form field name |
45
+ | `value` | number | `0` | Current value |
46
+ | `min` | number | `0` | Minimum value |
47
+ | `max` | number | `100` | Maximum value |
48
+ | `step` | number | `1` | Step increment |
49
+ | `disabled` | boolean | `false` | Disables the slider |
50
+
51
+ ## Events
52
+
53
+ | Event | Detail | Description |
54
+ |----------|--------|--------------------------------------|
55
+ | `input` | — | Fired continuously as the user drags |
56
+ | `change` | — | Fired when the user releases |
57
+
58
+ ## CSS Custom Properties
59
+
60
+ | Property | Description |
61
+ |-------------------------|-----------------------------------------|
62
+ | `--slider_fill-color` | Fill track colour (defaults to `--bds-color_interactive`) |
63
+ | `--slider_track-color` | Unfilled track colour (defaults to `--bds-color_bg--subtle`) |
64
+ | `--slider_thumb-color` | Thumb colour (defaults to `--bds-color_interactive`) |
65
+
66
+ ## Usage in plain HTML
67
+
68
+ ```html
69
+ <bds-slider name="volume" value="50" min="0" max="100" step="5"></bds-slider>
70
+ ```
71
+
72
+ ## Accessibility
73
+
74
+ - Wraps a native `<input type="range">` which has full browser and assistive technology support
75
+ - Arrow keys adjust the value by `step`
76
+ - `disabled` prevents interaction and reduces opacity
77
+ - Participates in HTML forms via the Form-Associated Custom Elements API
@@ -0,0 +1,68 @@
1
+ import React from 'react';
2
+ import type { Meta, StoryObj } from '@storybook/react';
3
+ import '../../index'; // auto-registers all custom elements
4
+
5
+ function BdsSlider({
6
+ name,
7
+ value,
8
+ min,
9
+ max,
10
+ step,
11
+ disabled,
12
+ }: {
13
+ name?: string;
14
+ value?: number;
15
+ min?: number;
16
+ max?: number;
17
+ step?: number;
18
+ disabled?: boolean;
19
+ }) {
20
+ return React.createElement('bds-slider', {
21
+ name,
22
+ value,
23
+ min,
24
+ max,
25
+ step,
26
+ disabled: disabled || undefined,
27
+ });
28
+ }
29
+
30
+ const meta = {
31
+ title: 'Web Components/Interaction/Form/Slider',
32
+ component: BdsSlider,
33
+ tags: ['!stable', 'experimental'],
34
+ parameters: { layout: 'centered' },
35
+ argTypes: {
36
+ value: { control: 'number' },
37
+ min: { control: 'number' },
38
+ max: { control: 'number' },
39
+ step: { control: 'number' },
40
+ disabled: { control: 'boolean' },
41
+ },
42
+ decorators: [
43
+ (Story: React.ComponentType) => (
44
+ <div style={{ width: '300px' }}>
45
+ <Story />
46
+ </div>
47
+ ),
48
+ ],
49
+ } satisfies Meta<typeof BdsSlider>;
50
+
51
+ export default meta;
52
+ type Story = StoryObj<typeof meta>;
53
+
54
+ export const Default: Story = {
55
+ args: { name: 'volume', value: 50 },
56
+ };
57
+
58
+ export const WithStep: Story = {
59
+ args: { name: 'volume', value: 25, min: 0, max: 100, step: 25 },
60
+ };
61
+
62
+ export const WithMinMax: Story = {
63
+ args: { name: 'rating', value: 3, min: 1, max: 5 },
64
+ };
65
+
66
+ export const Disabled: Story = {
67
+ args: { name: 'volume', value: 40, disabled: true },
68
+ };
@@ -0,0 +1,72 @@
1
+ import { Meta, Canvas, ArgTypes } from '@storybook/blocks';
2
+ import * as Stories from './BdsSwitch.stories';
3
+
4
+ <Meta of={Stories} />
5
+
6
+ # &lt;bds-switch&gt;
7
+
8
+ Form-associated toggle switch. Visually a sliding toggle but semantically equivalent to a checkbox (`role="switch"`). Participates in HTML forms via the Form-Associated Custom Elements API.
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
+ ## When to use
19
+
20
+ Use `<bds-switch>` for binary on/off settings where the change takes immediate effect, such as enabling or disabling a feature. For settings that require form submission, `<bds-checkbox>` may be more appropriate.
21
+
22
+ ## Examples
23
+
24
+ ### Default (off)
25
+ <Canvas of={Stories.Default} />
26
+
27
+ ### Checked (on)
28
+ <Canvas of={Stories.Checked} />
29
+
30
+ ### Disabled
31
+ <Canvas of={Stories.Disabled} />
32
+
33
+ ## Props
34
+
35
+ <ArgTypes of={Stories} />
36
+
37
+ ## Attributes
38
+
39
+ | Attribute | Type | Default | Description |
40
+ |------------|---------|---------|--------------------------------------------------|
41
+ | `name` | string | `""` | Form field name |
42
+ | `value` | string | `"on"` | Value submitted when the switch is on |
43
+ | `checked` | boolean | `false` | Whether the switch is on |
44
+ | `required` | boolean | `false` | Marks the field as required |
45
+ | `disabled` | boolean | `false` | Disables the switch |
46
+
47
+ ## Slots
48
+
49
+ | Slot | Description |
50
+ |-------------|--------------------|
51
+ | `(default)` | Label text content |
52
+
53
+ ## Events
54
+
55
+ | Event | Detail | Description |
56
+ |----------|--------|------------------------------------------------|
57
+ | `change` | — | Fired when the switch state changes |
58
+
59
+ ## Usage in plain HTML
60
+
61
+ ```html
62
+ <bds-switch name="notifications" value="enabled">Enable notifications</bds-switch>
63
+ <bds-switch name="darkMode" value="on" checked>Dark mode</bds-switch>
64
+ ```
65
+
66
+ ## Accessibility
67
+
68
+ - Uses `role="switch"` on the inner `<input type="checkbox">` for correct screen reader announcement
69
+ - The inner `<input>` is associated with a `<label>` via matching `id`/`for` attributes
70
+ - The visual track and thumb are inside the `<label>` — clicking the label or the track both toggle the switch
71
+ - `disabled` sets `pointer-events: none` and reduces opacity
72
+ - Participates in HTML forms via the Form-Associated Custom Elements API
@@ -0,0 +1,58 @@
1
+ import React from 'react';
2
+ import type { Meta, StoryObj } from '@storybook/react';
3
+ import '../../index'; // auto-registers all custom elements
4
+
5
+ function BdsSwitch({
6
+ name,
7
+ value,
8
+ checked,
9
+ required,
10
+ disabled,
11
+ children,
12
+ }: {
13
+ name?: string;
14
+ value?: string;
15
+ checked?: boolean;
16
+ required?: boolean;
17
+ disabled?: boolean;
18
+ children?: React.ReactNode;
19
+ }) {
20
+ return React.createElement(
21
+ 'bds-switch',
22
+ {
23
+ name,
24
+ value,
25
+ checked: checked || undefined,
26
+ required: required || undefined,
27
+ disabled: disabled || undefined,
28
+ },
29
+ children,
30
+ );
31
+ }
32
+
33
+ const meta = {
34
+ title: 'Web Components/Interaction/Form/Switch',
35
+ component: BdsSwitch,
36
+ tags: ['!stable', 'experimental'],
37
+ parameters: { layout: 'centered' },
38
+ argTypes: {
39
+ checked: { control: 'boolean' },
40
+ required: { control: 'boolean' },
41
+ disabled: { control: 'boolean' },
42
+ },
43
+ } satisfies Meta<typeof BdsSwitch>;
44
+
45
+ export default meta;
46
+ type Story = StoryObj<typeof meta>;
47
+
48
+ export const Default: Story = {
49
+ args: { name: 'notifications', value: 'enabled', children: 'Enable notifications' },
50
+ };
51
+
52
+ export const Checked: Story = {
53
+ args: { name: 'notifications', value: 'enabled', checked: true, children: 'Notifications enabled' },
54
+ };
55
+
56
+ export const Disabled: Story = {
57
+ args: { name: 'notifications', value: 'enabled', disabled: true, children: 'Notifications (disabled)' },
58
+ };
@@ -0,0 +1,73 @@
1
+ import { Meta, Canvas, ArgTypes } from '@storybook/blocks';
2
+ import * as Stories from './BdsTextarea.stories';
3
+
4
+ <Meta of={Stories} />
5
+
6
+ # &lt;bds-textarea&gt;
7
+
8
+ Form-associated multiline text input. Wraps a native `<textarea>` with consistent styling while participating in HTML forms via the Form-Associated Custom Elements API.
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
+ ## When to use
19
+
20
+ Use `<bds-textarea>` for multiline text entry — messages, comments, descriptions, or any input that may span more than one line.
21
+
22
+ ## Examples
23
+
24
+ ### Default
25
+ <Canvas of={Stories.Default} />
26
+
27
+ ### Pre-filled value
28
+ <Canvas of={Stories.WithValue} />
29
+
30
+ ### Tall (8 rows)
31
+ <Canvas of={Stories.TallRows} />
32
+
33
+ ### Required
34
+ <Canvas of={Stories.Required} />
35
+
36
+ ### Disabled
37
+ <Canvas of={Stories.Disabled} />
38
+
39
+ ## Props
40
+
41
+ <ArgTypes of={Stories} />
42
+
43
+ ## Attributes
44
+
45
+ | Attribute | Type | Default | Description |
46
+ |---------------|---------|---------|------------------------------------------|
47
+ | `name` | string | `""` | Form field name |
48
+ | `value` | string | `""` | Text value |
49
+ | `placeholder` | string | `""` | Placeholder text |
50
+ | `rows` | number | `4` | Number of visible rows |
51
+ | `required` | boolean | `false` | Marks the field as required |
52
+ | `disabled` | boolean | `false` | Disables the textarea |
53
+
54
+ ## Events
55
+
56
+ | Event | Detail | Description |
57
+ |----------|--------|-----------------------------------------------------|
58
+ | `input` | — | Fired on every keystroke (native input event) |
59
+ | `change` | — | Fired when the value is committed (native change event) |
60
+
61
+ ## Usage in plain HTML
62
+
63
+ ```html
64
+ <bds-textarea name="message" placeholder="Enter message…" rows="6"></bds-textarea>
65
+ <bds-textarea name="bio" required rows="4"></bds-textarea>
66
+ ```
67
+
68
+ ## Accessibility
69
+
70
+ - Wraps a native `<textarea>` which has full browser and assistive technology support
71
+ - `required` uses the native `required` attribute for browser validation
72
+ - `disabled` sets `pointer-events: none`, reduces opacity, and removes the resize handle
73
+ - Participates in HTML forms via the Form-Associated Custom Elements API
@@ -0,0 +1,70 @@
1
+ import React from 'react';
2
+ import type { Meta, StoryObj } from '@storybook/react';
3
+ import '../../index'; // auto-registers all custom elements
4
+
5
+ function BdsTextarea({
6
+ name,
7
+ value,
8
+ placeholder,
9
+ rows,
10
+ required,
11
+ disabled,
12
+ }: {
13
+ name?: string;
14
+ value?: string;
15
+ placeholder?: string;
16
+ rows?: number;
17
+ required?: boolean;
18
+ disabled?: boolean;
19
+ }) {
20
+ return React.createElement('bds-textarea', {
21
+ name,
22
+ value,
23
+ placeholder,
24
+ rows,
25
+ required: required || undefined,
26
+ disabled: disabled || undefined,
27
+ });
28
+ }
29
+
30
+ const meta = {
31
+ title: 'Web Components/Interaction/Form/Textarea',
32
+ component: BdsTextarea,
33
+ tags: ['!stable', 'experimental'],
34
+ parameters: { layout: 'centered' },
35
+ argTypes: {
36
+ rows: { control: 'number' },
37
+ required: { control: 'boolean' },
38
+ disabled: { control: 'boolean' },
39
+ },
40
+ decorators: [
41
+ (Story: React.ComponentType) => (
42
+ <div style={{ width: '360px' }}>
43
+ <Story />
44
+ </div>
45
+ ),
46
+ ],
47
+ } satisfies Meta<typeof BdsTextarea>;
48
+
49
+ export default meta;
50
+ type Story = StoryObj<typeof meta>;
51
+
52
+ export const Default: Story = {
53
+ args: { name: 'message', placeholder: 'Enter your message…' },
54
+ };
55
+
56
+ export const WithValue: Story = {
57
+ args: { name: 'message', value: 'Hello, this is a pre-filled message.' },
58
+ };
59
+
60
+ export const TallRows: Story = {
61
+ args: { name: 'message', placeholder: 'Enter a longer text…', rows: 8 },
62
+ };
63
+
64
+ export const Required: Story = {
65
+ args: { name: 'message', placeholder: 'Required field', required: true },
66
+ };
67
+
68
+ export const Disabled: Story = {
69
+ args: { name: 'message', value: 'Read-only content', disabled: true },
70
+ };