@boostdev/design-system-components 2.5.1 → 2.7.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/dist/client.cjs +257 -219
- package/dist/client.css +673 -626
- package/dist/client.d.cts +27 -1
- package/dist/client.d.ts +27 -1
- package/dist/client.js +220 -183
- package/dist/index.cjs +257 -219
- package/dist/index.css +673 -626
- package/dist/index.d.cts +27 -1
- package/dist/index.d.ts +27 -1
- package/dist/index.js +220 -183
- package/dist/web-components/{chunk-N3TN6WCH.js → chunk-GER5UJOF.js} +22 -15
- package/dist/web-components/chunk-QWPACK5L.js +72 -0
- package/dist/web-components/{chunk-YRXCVKHV.js → chunk-RTOS7LLG.js} +9 -7
- package/dist/web-components/{chunk-BX3IPVOB.js → chunk-ZNKEZIYE.js} +20 -16
- package/dist/web-components/index.d.ts +56 -1
- package/dist/web-components/index.js +121 -4
- package/dist/web-components/interaction/bds-button.js +1 -1
- package/dist/web-components/ui/bds-alert.js +1 -1
- package/dist/web-components/ui/bds-badge.js +1 -1
- package/dist/web-components/ui/bds-card.js +1 -1
- package/package.json +3 -2
- package/src/components/interaction/Button/Button.mdx +87 -13
- package/src/components/interaction/Button/Button.module.css +22 -17
- package/src/components/interaction/Toast/Toast.mdx +22 -3
- package/src/components/interaction/Toast/Toast.module.css +13 -10
- package/src/components/interaction/form/FieldGroup/FieldGroup.mdx +113 -0
- package/src/components/interaction/form/FieldGroup/FieldGroup.module.css +96 -0
- package/src/components/interaction/form/FieldGroup/FieldGroup.spec.tsx +196 -0
- package/src/components/interaction/form/FieldGroup/FieldGroup.stories.tsx +99 -0
- package/src/components/interaction/form/FieldGroup/FieldGroup.tsx +64 -0
- package/src/components/interaction/form/FieldGroup/index.ts +2 -0
- package/src/components/interaction/form/atoms/Message.module.css +4 -0
- package/src/components/layout/Card/Card.mdx +20 -8
- package/src/components/layout/Card/Card.module.css +5 -3
- package/src/components/ui/Alert/Alert.mdx +39 -5
- package/src/components/ui/Alert/Alert.module.css +21 -15
- package/src/components/ui/Badge/Badge.mdx +23 -3
- package/src/components/ui/Badge/Badge.module.css +15 -12
- package/src/components/ui/Link/Link.mdx +20 -2
- package/src/components/ui/Link/Link.module.css +12 -8
- package/src/components/ui/NotificationBanner/NotificationBanner.mdx +25 -6
- package/src/components/ui/NotificationBanner/NotificationBanner.module.css +18 -15
- package/src/components/ui/Pagination/Pagination.mdx +22 -9
- package/src/components/ui/Pagination/Pagination.module.css +10 -8
- package/src/components/ui/Tabs/Tabs.mdx +20 -5
- package/src/components/ui/Tabs/Tabs.module.css +8 -5
- package/src/index.ts +2 -0
- package/src/web-components/index.ts +2 -0
- package/src/web-components/interaction/bds-button.ts +22 -15
- package/src/web-components/interaction/form/BdsFieldGroup.mdx +67 -0
- package/src/web-components/interaction/form/BdsFieldGroup.stories.tsx +110 -0
- package/src/web-components/interaction/form/bds-checkbox-group.ts +1 -0
- package/src/web-components/interaction/form/bds-field-group.spec.ts +64 -0
- package/src/web-components/interaction/form/bds-field-group.ts +157 -0
- package/src/web-components/interaction/form/bds-form-input.ts +1 -0
- package/src/web-components/interaction/form/bds-radio-group.ts +1 -0
- package/src/web-components/ui/bds-alert.ts +20 -16
- package/src/web-components/ui/bds-badge.ts +16 -13
- package/src/web-components/ui/bds-card.ts +9 -7
- package/dist/web-components/chunk-OHUTLSIQ.js +0 -69
|
@@ -40,14 +40,20 @@ var BdsButton = class extends i2 {
|
|
|
40
40
|
white-space: nowrap;
|
|
41
41
|
line-height: 1;
|
|
42
42
|
|
|
43
|
+
/* Identity tokens — override --button_color + --button_on-color to re-theme */
|
|
43
44
|
--button_color: var(--bds-color_interactive);
|
|
44
45
|
--button_on-color: var(--bds-color_on-interactive);
|
|
46
|
+
|
|
47
|
+
/* Text-safe variant of --button_color for use on page background (outline text/border) */
|
|
45
48
|
--button_color--on-bg: var(--bds-color_interactive_on-bg);
|
|
46
49
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
50
|
+
/* Layered cascade: the consumer-facing overrides (--button_bg, --button_text,
|
|
51
|
+
--button_border) are read OUTERMOST so an ancestor-set value always wins
|
|
52
|
+
over variant + hover defaults. Variants and hover write to the inner
|
|
53
|
+
--button_*--variant slot, never to the public tokens. */
|
|
54
|
+
background-color: var(--button_bg, var(--button_bg--variant, var(--button_color)));
|
|
55
|
+
color: var(--button_text, var(--button_text--variant, var(--button_on-color)));
|
|
56
|
+
--bdc_color: var(--button_border, var(--button_border--variant, transparent));
|
|
51
57
|
|
|
52
58
|
box-shadow: inset 0 0 0 var(--bdc-outline_width) var(--bdc_color);
|
|
53
59
|
transition: var(--bds-animation_transition),
|
|
@@ -58,12 +64,13 @@ var BdsButton = class extends i2 {
|
|
|
58
64
|
text-decoration: none;
|
|
59
65
|
}
|
|
60
66
|
|
|
61
|
-
/* Variants
|
|
67
|
+
/* Variants — outline-resting overrides (--button_bg--outline, --button_text--outline,
|
|
68
|
+
--button_border--outline) are honored if the consumer sets them. */
|
|
62
69
|
.button.outline,
|
|
63
70
|
.button.ghost /* deprecated — use variant="outline" */ {
|
|
64
|
-
--button_bg:
|
|
65
|
-
--button_text: var(--button_color--on-bg);
|
|
66
|
-
--
|
|
71
|
+
--button_bg--variant: var(--button_bg--outline, transparent);
|
|
72
|
+
--button_text--variant: var(--button_text--outline, var(--button_color--on-bg));
|
|
73
|
+
--button_border--variant: var(--button_border--outline, var(--button_color--on-bg));
|
|
67
74
|
}
|
|
68
75
|
|
|
69
76
|
/* Sizes */
|
|
@@ -149,18 +156,18 @@ var BdsButton = class extends i2 {
|
|
|
149
156
|
|
|
150
157
|
/* Default hover */
|
|
151
158
|
.button.default:hover {
|
|
152
|
-
--button_bg:
|
|
153
|
-
--button_text:
|
|
154
|
-
--
|
|
155
|
-
--
|
|
159
|
+
--button_bg--variant: var(--button_bg--hover, var(--bds-color_bg));
|
|
160
|
+
--button_text--variant: var(--button_text--hover, var(--bds-color_interactive));
|
|
161
|
+
--button_border--variant: var(--button_border--hover, currentcolor);
|
|
162
|
+
--button_pulse-color: var(--button_pulse-color--hover, var(--bds-color_interactive));
|
|
156
163
|
}
|
|
157
164
|
|
|
158
165
|
/* Outline hover */
|
|
159
166
|
.button.outline:hover,
|
|
160
167
|
.button.ghost:hover {
|
|
161
|
-
--button_bg:
|
|
162
|
-
--button_text: var(--button_on-color);
|
|
163
|
-
--
|
|
168
|
+
--button_bg--variant: var(--button_bg--outline-hover, var(--button_color));
|
|
169
|
+
--button_text--variant: var(--button_text--outline-hover, var(--button_on-color));
|
|
170
|
+
--button_border--variant: var(--button_border--outline-hover, transparent);
|
|
164
171
|
}
|
|
165
172
|
}
|
|
166
173
|
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import {
|
|
2
|
+
T,
|
|
3
|
+
i,
|
|
4
|
+
i2
|
|
5
|
+
} from "./chunk-LGEZYFUU.js";
|
|
6
|
+
|
|
7
|
+
// src/web-components/ui/bds-badge.ts
|
|
8
|
+
var BdsBadge = class extends i2 {
|
|
9
|
+
static styles = i`
|
|
10
|
+
:host {
|
|
11
|
+
display: inline-flex;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
.badge {
|
|
15
|
+
display: inline-flex;
|
|
16
|
+
align-items: center;
|
|
17
|
+
justify-content: center;
|
|
18
|
+
padding: var(--bds-space_xxs) var(--bds-space_xs);
|
|
19
|
+
border-radius: var(--badge_radius, 2em);
|
|
20
|
+
font-size: var(--badge_font-size, var(--bds-font_size--body--s));
|
|
21
|
+
font-weight: var(--bds-font_weight--semibold);
|
|
22
|
+
line-height: 1;
|
|
23
|
+
white-space: nowrap;
|
|
24
|
+
/* Layered cascade: public overrides (--badge_bg, --badge_text) win over
|
|
25
|
+
per-variant defaults. Variants write to the inner --badge_*--variant slot. */
|
|
26
|
+
background-color: var(--badge_bg, var(--badge_bg--variant, var(--bds-color_blue)));
|
|
27
|
+
color: var(--badge_text, var(--badge_text--variant, var(--bds-color_on-blue)));
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/* Per-variant resting overrides — consumers can theme per-variant via
|
|
31
|
+
--badge_bg--primary / --badge_bg--success / ... */
|
|
32
|
+
:host([variant='primary']) .badge {
|
|
33
|
+
--badge_bg--variant: var(--badge_bg--primary, var(--bds-color_interactive));
|
|
34
|
+
--badge_text--variant: var(--badge_text--primary, var(--bds-color_on-interactive));
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
:host([variant='secondary']) .badge {
|
|
38
|
+
--badge_bg--variant: var(--badge_bg--secondary, var(--bds-color_bg));
|
|
39
|
+
--badge_text--variant: var(--badge_text--secondary, var(--bds-color_on-bg));
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
:host([variant='success']) .badge {
|
|
43
|
+
--badge_bg--variant: var(--badge_bg--success, var(--bds-color_success));
|
|
44
|
+
--badge_text--variant: var(--badge_text--success, var(--bds-color_on-success));
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
:host([variant='error']) .badge {
|
|
48
|
+
--badge_bg--variant: var(--badge_bg--error, var(--bds-color_error));
|
|
49
|
+
--badge_text--variant: var(--badge_text--error, var(--bds-color_on-error));
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
:host([variant='warning']) .badge {
|
|
53
|
+
--badge_bg--variant: var(--badge_bg--warning, var(--bds-color_warning));
|
|
54
|
+
--badge_text--variant: var(--badge_text--warning, var(--bds-color_on-warning));
|
|
55
|
+
}
|
|
56
|
+
`;
|
|
57
|
+
static properties = {
|
|
58
|
+
variant: { type: String, reflect: true }
|
|
59
|
+
};
|
|
60
|
+
constructor() {
|
|
61
|
+
super();
|
|
62
|
+
this.variant = "primary";
|
|
63
|
+
}
|
|
64
|
+
render() {
|
|
65
|
+
return T`<span class="badge"><slot></slot></span>`;
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
customElements.define("bds-badge", BdsBadge);
|
|
69
|
+
|
|
70
|
+
export {
|
|
71
|
+
BdsBadge
|
|
72
|
+
};
|
|
@@ -25,12 +25,14 @@ var BdsCard = class extends i2 {
|
|
|
25
25
|
border: none;
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
/* Resting shadows — consumers can override per-variant via
|
|
29
|
+
--card_shadow--default / --card_shadow--elevated / --card_shadow--outlined. */
|
|
30
|
+
.card.--default { box-shadow: var(--card_shadow--default, var(--bds-shadow_s)); }
|
|
31
|
+
.card.--elevated { box-shadow: var(--card_shadow--elevated, var(--bds-shadow_m)); }
|
|
30
32
|
|
|
31
33
|
.card.--outlined {
|
|
32
34
|
--bdc_color: currentcolor;
|
|
33
|
-
box-shadow: inset 0 0 0 var(--bdc-outline_width) var(--bdc_color), var(--bds-shadow_s);
|
|
35
|
+
box-shadow: var(--card_shadow--outlined, inset 0 0 0 var(--bdc-outline_width) var(--bdc_color), var(--bds-shadow_s));
|
|
34
36
|
}
|
|
35
37
|
|
|
36
38
|
.card.--padding-none { padding: 0; }
|
|
@@ -60,12 +62,12 @@ var BdsCard = class extends i2 {
|
|
|
60
62
|
@media (hover: hover) and (pointer: fine) {
|
|
61
63
|
.card.--clickable:hover {
|
|
62
64
|
transform: translateY(-2px);
|
|
63
|
-
box-shadow: var(--bds-shadow_xl);
|
|
65
|
+
box-shadow: var(--card_shadow--clickable-hover, var(--bds-shadow_xl));
|
|
64
66
|
}
|
|
65
67
|
|
|
66
|
-
.card.--default:hover { box-shadow: var(--bds-shadow_m); }
|
|
67
|
-
.card.--elevated:hover { box-shadow: var(--bds-shadow_2xl); }
|
|
68
|
-
.card.--outlined:hover { box-shadow: var(--bds-shadow_s); }
|
|
68
|
+
.card.--default:hover { box-shadow: var(--card_shadow--default-hover, var(--bds-shadow_m)); }
|
|
69
|
+
.card.--elevated:hover { box-shadow: var(--card_shadow--elevated-hover, var(--bds-shadow_2xl)); }
|
|
70
|
+
.card.--outlined:hover { box-shadow: var(--card_shadow--outlined-hover, var(--bds-shadow_s)); }
|
|
69
71
|
}
|
|
70
72
|
`;
|
|
71
73
|
static properties = {
|
|
@@ -18,36 +18,40 @@ var BdsAlert = class extends i2 {
|
|
|
18
18
|
gap: var(--bds-space_s);
|
|
19
19
|
padding: var(--bds-space_m);
|
|
20
20
|
border-radius: var(--bds-border_radius--s);
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
/* Layered cascade: public overrides (--alert_bg, --alert_text, --alert_border)
|
|
22
|
+
are read OUTERMOST so an ancestor-set value always wins over variant
|
|
23
|
+
defaults. Variants write to the inner --alert_*--variant slot. */
|
|
24
|
+
background-color: var(--alert_bg, var(--alert_bg--variant, var(--bds-color_blue--subtle)));
|
|
25
|
+
color: var(--alert_text, var(--alert_text--variant, var(--bds-color_on-blue--subtle)));
|
|
26
|
+
border-inline-start: var(--bds-space_s) solid var(--alert_border, var(--alert_border--variant, var(--bds-color_blue)));
|
|
24
27
|
font-size: var(--bds-font_size--body);
|
|
25
28
|
line-height: var(--bds-font_line-height--body);
|
|
26
29
|
}
|
|
27
30
|
|
|
28
|
-
/*
|
|
31
|
+
/* Per-variant resting overrides — consumers can theme per-variant via
|
|
32
|
+
--alert_bg--info / --alert_bg--success / ... */
|
|
29
33
|
:host([variant='info']) .alert {
|
|
30
|
-
--alert_bg: var(--bds-color_blue--subtle);
|
|
31
|
-
--alert_text: var(--bds-color_on-blue--subtle);
|
|
32
|
-
--alert_border: var(--bds-color_blue);
|
|
34
|
+
--alert_bg--variant: var(--alert_bg--info, var(--bds-color_blue--subtle));
|
|
35
|
+
--alert_text--variant: var(--alert_text--info, var(--bds-color_on-blue--subtle));
|
|
36
|
+
--alert_border--variant: var(--alert_border--info, var(--bds-color_blue));
|
|
33
37
|
}
|
|
34
38
|
|
|
35
39
|
:host([variant='success']) .alert {
|
|
36
|
-
--alert_bg: var(--bds-color_success--subtle);
|
|
37
|
-
--alert_text: var(--bds-color_on-success--subtle);
|
|
38
|
-
--alert_border: var(--bds-color_success);
|
|
40
|
+
--alert_bg--variant: var(--alert_bg--success, var(--bds-color_success--subtle));
|
|
41
|
+
--alert_text--variant: var(--alert_text--success, var(--bds-color_on-success--subtle));
|
|
42
|
+
--alert_border--variant: var(--alert_border--success, var(--bds-color_success));
|
|
39
43
|
}
|
|
40
44
|
|
|
41
45
|
:host([variant='warning']) .alert {
|
|
42
|
-
--alert_bg: var(--bds-color_orange--subtle);
|
|
43
|
-
--alert_text: var(--bds-color_on-orange--subtle);
|
|
44
|
-
--alert_border: var(--bds-color_warning);
|
|
46
|
+
--alert_bg--variant: var(--alert_bg--warning, var(--bds-color_orange--subtle));
|
|
47
|
+
--alert_text--variant: var(--alert_text--warning, var(--bds-color_on-orange--subtle));
|
|
48
|
+
--alert_border--variant: var(--alert_border--warning, var(--bds-color_warning));
|
|
45
49
|
}
|
|
46
50
|
|
|
47
51
|
:host([variant='error']) .alert {
|
|
48
|
-
--alert_bg: rgb(from var(--bds-color_error) r g b / 12%);
|
|
49
|
-
--alert_text: var(--bds-color_on-bg);
|
|
50
|
-
--alert_border: var(--bds-color_error);
|
|
52
|
+
--alert_bg--variant: var(--alert_bg--error, rgb(from var(--bds-color_error) r g b / 12%));
|
|
53
|
+
--alert_text--variant: var(--alert_text--error, var(--bds-color_on-bg));
|
|
54
|
+
--alert_border--variant: var(--alert_border--error, var(--bds-color_error));
|
|
51
55
|
}
|
|
52
56
|
|
|
53
57
|
/* Icon slot wrapper — hidden unless slot has content */
|
|
@@ -426,6 +426,61 @@ declare global {
|
|
|
426
426
|
}
|
|
427
427
|
}
|
|
428
428
|
|
|
429
|
+
type FieldGroupVariant = 'horizontal' | 'vertical';
|
|
430
|
+
/**
|
|
431
|
+
* `<bds-field-group>` — framework-agnostic FieldGroup custom element.
|
|
432
|
+
*
|
|
433
|
+
* Semantically groups related form fields under a single `<fieldset>` and
|
|
434
|
+
* lays them out either horizontally (with a CSS container query that
|
|
435
|
+
* collapses to a vertical stack when the FieldGroup itself is too narrow)
|
|
436
|
+
* or vertically. Mirrors the React `FieldGroup` component.
|
|
437
|
+
*
|
|
438
|
+
* Attributes:
|
|
439
|
+
* variant — "horizontal" (default) | "vertical"
|
|
440
|
+
* legend — optional legend text rendered above the fields
|
|
441
|
+
* disabled — boolean; forwarded to the inner <fieldset>
|
|
442
|
+
*
|
|
443
|
+
* Slots:
|
|
444
|
+
* (default) — form fields (any element). The slotted-element count is
|
|
445
|
+
* measured on each `slotchange` and surfaced via the
|
|
446
|
+
* `--fieldGroup_field-count` custom property, which the auto-derived
|
|
447
|
+
* collapse threshold reads.
|
|
448
|
+
*
|
|
449
|
+
* @example
|
|
450
|
+
* <bds-field-group variant="horizontal" legend="Contact details">
|
|
451
|
+
* <bds-form-input label="First name" name="first"></bds-form-input>
|
|
452
|
+
* <bds-form-input label="Last name" name="last"></bds-form-input>
|
|
453
|
+
* <bds-form-input label="Email" name="email"></bds-form-input>
|
|
454
|
+
* </bds-field-group>
|
|
455
|
+
*/
|
|
456
|
+
declare class BdsFieldGroup extends LitElement {
|
|
457
|
+
static styles: lit.CSSResult;
|
|
458
|
+
static properties: {
|
|
459
|
+
variant: {
|
|
460
|
+
type: StringConstructor;
|
|
461
|
+
reflect: boolean;
|
|
462
|
+
};
|
|
463
|
+
legend: {
|
|
464
|
+
type: StringConstructor;
|
|
465
|
+
};
|
|
466
|
+
disabled: {
|
|
467
|
+
type: BooleanConstructor;
|
|
468
|
+
reflect: boolean;
|
|
469
|
+
};
|
|
470
|
+
};
|
|
471
|
+
variant: FieldGroupVariant;
|
|
472
|
+
legend: string;
|
|
473
|
+
disabled: boolean;
|
|
474
|
+
constructor();
|
|
475
|
+
private _onSlotChange;
|
|
476
|
+
render(): lit.TemplateResult<1>;
|
|
477
|
+
}
|
|
478
|
+
declare global {
|
|
479
|
+
interface HTMLElementTagNameMap {
|
|
480
|
+
'bds-field-group': BdsFieldGroup;
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
|
|
429
484
|
/**
|
|
430
485
|
* `<bds-form-input>` — form-associated text input with label, hint, and error support.
|
|
431
486
|
*
|
|
@@ -749,4 +804,4 @@ declare global {
|
|
|
749
804
|
}
|
|
750
805
|
}
|
|
751
806
|
|
|
752
|
-
export { BdsButtonGroup, BdsCalendar, BdsCarousel, BdsCheckboxGroup, BdsDropdownMenu, BdsDropdownMenuItem, BdsFormInput, BdsGrid, BdsGridItem, BdsPagination, BdsRadioGroup, BdsTable };
|
|
807
|
+
export { BdsButtonGroup, BdsCalendar, BdsCarousel, BdsCheckboxGroup, BdsDropdownMenu, BdsDropdownMenuItem, BdsFieldGroup, type FieldGroupVariant as BdsFieldGroupVariant, BdsFormInput, BdsGrid, BdsGridItem, BdsPagination, BdsRadioGroup, BdsTable };
|
|
@@ -69,7 +69,7 @@ import {
|
|
|
69
69
|
} from "./chunk-UFFCKVZE.js";
|
|
70
70
|
import {
|
|
71
71
|
BdsButton
|
|
72
|
-
} from "./chunk-
|
|
72
|
+
} from "./chunk-GER5UJOF.js";
|
|
73
73
|
import {
|
|
74
74
|
BdsCollapsible
|
|
75
75
|
} from "./chunk-6I2DBFQ7.js";
|
|
@@ -104,23 +104,24 @@ import "./chunk-QPOKHLMQ.js";
|
|
|
104
104
|
import "./chunk-3S42DZ7W.js";
|
|
105
105
|
import {
|
|
106
106
|
BdsAlert
|
|
107
|
-
} from "./chunk-
|
|
107
|
+
} from "./chunk-ZNKEZIYE.js";
|
|
108
108
|
import {
|
|
109
109
|
BdsAvatar
|
|
110
110
|
} from "./chunk-57TRNCWQ.js";
|
|
111
111
|
import {
|
|
112
112
|
BdsBadge
|
|
113
|
-
} from "./chunk-
|
|
113
|
+
} from "./chunk-QWPACK5L.js";
|
|
114
114
|
import {
|
|
115
115
|
BdsBreadcrumb
|
|
116
116
|
} from "./chunk-Q4T5BJT6.js";
|
|
117
117
|
import {
|
|
118
118
|
BdsCard
|
|
119
|
-
} from "./chunk-
|
|
119
|
+
} from "./chunk-RTOS7LLG.js";
|
|
120
120
|
import {
|
|
121
121
|
BdsDescriptionList
|
|
122
122
|
} from "./chunk-AGKJTMJI.js";
|
|
123
123
|
import {
|
|
124
|
+
A,
|
|
124
125
|
T,
|
|
125
126
|
i,
|
|
126
127
|
i2
|
|
@@ -881,6 +882,7 @@ var BdsCheckboxGroup = class extends i2 {
|
|
|
881
882
|
|
|
882
883
|
.message--hint {
|
|
883
884
|
color: var(--bds-color_on-bg--subtle);
|
|
885
|
+
font-style: italic;
|
|
884
886
|
}
|
|
885
887
|
`;
|
|
886
888
|
static properties = {
|
|
@@ -957,6 +959,7 @@ var BdsRadioGroup = class extends i2 {
|
|
|
957
959
|
|
|
958
960
|
.message--hint {
|
|
959
961
|
color: var(--bds-color_on-bg--subtle);
|
|
962
|
+
font-style: italic;
|
|
960
963
|
}
|
|
961
964
|
`;
|
|
962
965
|
static properties = {
|
|
@@ -1007,6 +1010,118 @@ var BdsRadioGroup = class extends i2 {
|
|
|
1007
1010
|
};
|
|
1008
1011
|
customElements.define("bds-radio-group", BdsRadioGroup);
|
|
1009
1012
|
|
|
1013
|
+
// src/web-components/interaction/form/bds-field-group.ts
|
|
1014
|
+
var BdsFieldGroup = class extends i2 {
|
|
1015
|
+
static styles = i`
|
|
1016
|
+
:host {
|
|
1017
|
+
display: block;
|
|
1018
|
+
|
|
1019
|
+
/* Establish an inline-size containment context so the @container rule
|
|
1020
|
+
queries the host's own width — independent of the viewport. */
|
|
1021
|
+
container-type: inline-size;
|
|
1022
|
+
container-name: field-group;
|
|
1023
|
+
|
|
1024
|
+
/* Auto-derived collapse threshold (mirror of the React component).
|
|
1025
|
+
--fieldGroup_field-count is set inline by _onSlotChange; the other
|
|
1026
|
+
tokens use foundation-default fallbacks so the calc rebuilds when
|
|
1027
|
+
a consumer overrides --fieldGroup_min-field-width or _gap. */
|
|
1028
|
+
--fieldGroup_collapse-threshold:
|
|
1029
|
+
calc(
|
|
1030
|
+
var(--fieldGroup_field-count, 1)
|
|
1031
|
+
* var(--fieldGroup_min-field-width, 12rem)
|
|
1032
|
+
+ (var(--fieldGroup_field-count, 1) - 1)
|
|
1033
|
+
* var(--fieldGroup_gap, var(--bds-space_m))
|
|
1034
|
+
);
|
|
1035
|
+
}
|
|
1036
|
+
|
|
1037
|
+
fieldset {
|
|
1038
|
+
border: 0;
|
|
1039
|
+
margin: 0;
|
|
1040
|
+
padding: 0;
|
|
1041
|
+
min-inline-size: 0;
|
|
1042
|
+
}
|
|
1043
|
+
|
|
1044
|
+
.legend {
|
|
1045
|
+
inline-size: 100%;
|
|
1046
|
+
padding-inline: 0;
|
|
1047
|
+
|
|
1048
|
+
padding-block:
|
|
1049
|
+
var(--fieldGroup_legend-padding-block, var(--bds-space_xs));
|
|
1050
|
+
margin-block-end:
|
|
1051
|
+
var(--fieldGroup_legend-gap, var(--bds-space_m));
|
|
1052
|
+
border-block-end:
|
|
1053
|
+
var(--fieldGroup_legend-border-block-end, 1px solid var(--bds-color_bg--subtle));
|
|
1054
|
+
|
|
1055
|
+
color:
|
|
1056
|
+
var(--fieldGroup_legend-color, var(--bds-color_on-bg));
|
|
1057
|
+
font-family: var(--bds-font_family--body);
|
|
1058
|
+
font-size:
|
|
1059
|
+
var(--fieldGroup_legend-font-size, var(--bds-font_size--heading-3));
|
|
1060
|
+
font-weight:
|
|
1061
|
+
var(--fieldGroup_legend-font-weight, var(--bds-font_weight--semibold));
|
|
1062
|
+
line-height:
|
|
1063
|
+
var(--fieldGroup_legend-line-height, var(--bds-font_line-height--heading));
|
|
1064
|
+
}
|
|
1065
|
+
|
|
1066
|
+
.fields {
|
|
1067
|
+
display: flex;
|
|
1068
|
+
flex-direction: column;
|
|
1069
|
+
gap: var(--fieldGroup_gap, var(--bds-space_m));
|
|
1070
|
+
}
|
|
1071
|
+
|
|
1072
|
+
:host([variant='horizontal']) .fields {
|
|
1073
|
+
flex-flow: row wrap;
|
|
1074
|
+
}
|
|
1075
|
+
|
|
1076
|
+
:host([variant='horizontal']) .fields ::slotted(*) {
|
|
1077
|
+
flex: 1 1 var(--fieldGroup_min-field-width, 12rem);
|
|
1078
|
+
min-inline-size: 0;
|
|
1079
|
+
}
|
|
1080
|
+
|
|
1081
|
+
/* Auto-collapse: when the host's inline-size can't fit a complete
|
|
1082
|
+
horizontal row, switch to a single-column stack. Threshold scales
|
|
1083
|
+
with the actual slotted-element count (see :host calc above). */
|
|
1084
|
+
@container field-group (max-inline-size: var(--fieldGroup_collapse-threshold)) {
|
|
1085
|
+
:host([variant='horizontal']) .fields {
|
|
1086
|
+
flex-direction: column;
|
|
1087
|
+
}
|
|
1088
|
+
|
|
1089
|
+
:host([variant='horizontal']) .fields ::slotted(*) {
|
|
1090
|
+
flex: 1 1 auto;
|
|
1091
|
+
}
|
|
1092
|
+
}
|
|
1093
|
+
`;
|
|
1094
|
+
static properties = {
|
|
1095
|
+
variant: { type: String, reflect: true },
|
|
1096
|
+
legend: { type: String },
|
|
1097
|
+
disabled: { type: Boolean, reflect: true }
|
|
1098
|
+
};
|
|
1099
|
+
constructor() {
|
|
1100
|
+
super();
|
|
1101
|
+
this.variant = "horizontal";
|
|
1102
|
+
this.legend = "";
|
|
1103
|
+
this.disabled = false;
|
|
1104
|
+
}
|
|
1105
|
+
// Arrow-bound for stable identity (unused here but matches the
|
|
1106
|
+
// bds-popover / bds-button conventions for handlers attached in render).
|
|
1107
|
+
_onSlotChange = (e) => {
|
|
1108
|
+
const slot = e.target;
|
|
1109
|
+
const count = slot.assignedElements().length;
|
|
1110
|
+
this.style.setProperty("--fieldGroup_field-count", String(count));
|
|
1111
|
+
};
|
|
1112
|
+
render() {
|
|
1113
|
+
return T`
|
|
1114
|
+
<fieldset ?disabled=${this.disabled}>
|
|
1115
|
+
${this.legend ? T`<legend class="legend">${this.legend}</legend>` : A}
|
|
1116
|
+
<div class="fields">
|
|
1117
|
+
<slot @slotchange=${this._onSlotChange}></slot>
|
|
1118
|
+
</div>
|
|
1119
|
+
</fieldset>
|
|
1120
|
+
`;
|
|
1121
|
+
}
|
|
1122
|
+
};
|
|
1123
|
+
customElements.define("bds-field-group", BdsFieldGroup);
|
|
1124
|
+
|
|
1010
1125
|
// src/web-components/interaction/form/bds-form-input.ts
|
|
1011
1126
|
var BdsFormInput = class extends i2 {
|
|
1012
1127
|
static formAssociated = true;
|
|
@@ -1118,6 +1233,7 @@ var BdsFormInput = class extends i2 {
|
|
|
1118
1233
|
|
|
1119
1234
|
.message--hint {
|
|
1120
1235
|
color: var(--bds-color_on-bg--subtle);
|
|
1236
|
+
font-style: italic;
|
|
1121
1237
|
}
|
|
1122
1238
|
`;
|
|
1123
1239
|
static properties = {
|
|
@@ -2068,6 +2184,7 @@ export {
|
|
|
2068
2184
|
BdsDrawer,
|
|
2069
2185
|
BdsDropdownMenu,
|
|
2070
2186
|
BdsDropdownMenuItem,
|
|
2187
|
+
BdsFieldGroup,
|
|
2071
2188
|
BdsFileInput,
|
|
2072
2189
|
BdsFormInput,
|
|
2073
2190
|
BdsGrid,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@boostdev/design-system-components",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.7.0",
|
|
4
4
|
"description": "BoostDev React component library: accessible, token-driven components built on @boostdev/design-system-foundation",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"React",
|
|
@@ -335,5 +335,6 @@
|
|
|
335
335
|
],
|
|
336
336
|
"dependencies": {
|
|
337
337
|
"@oddbird/css-anchor-positioning": "^0.9.0"
|
|
338
|
-
}
|
|
338
|
+
},
|
|
339
|
+
"packageManager": "pnpm@11.0.8"
|
|
339
340
|
}
|
|
@@ -95,35 +95,109 @@ Provide `href` to render as an `<a>` with button styling. `disabled` on a link s
|
|
|
95
95
|
|
|
96
96
|
## CSS variables
|
|
97
97
|
|
|
98
|
+
The override surface is **layered** — pick the level of specificity you need. Every public token cascades through any ancestor, so you can theme one button, a section, or the whole app from the same selector.
|
|
99
|
+
|
|
100
|
+
### Quick theme — set two tokens
|
|
101
|
+
|
|
102
|
+
For most re-themes, the **identity tokens** are all you need. They drive both variants at rest, plus outline-hover.
|
|
103
|
+
|
|
104
|
+
```css
|
|
105
|
+
.brand-buttons {
|
|
106
|
+
--button_color: var(--color_viviq-green);
|
|
107
|
+
--button_on-color: var(--color_on-viviq-green);
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
What that gets you, automatically:
|
|
112
|
+
|
|
113
|
+
| State | Default variant | Outline variant |
|
|
114
|
+
| --- | --- | --- |
|
|
115
|
+
| Resting | bg = `--button_color`, text = `--button_on-color` | bg = transparent, text/border = `--button_color--on-bg` |
|
|
116
|
+
| Hover | bg = page surface, text = `--bds-color_interactive_on-bg` | bg = `--button_color`, text = `--button_on-color` |
|
|
117
|
+
|
|
118
|
+
Outline-resting still uses the **text-safe** `--button_color--on-bg` (a darker-on-light-bg variant) by default — so dark-on-light readability stays intact even when your identity colour is bright. To make the identity colour itself flow through outline-resting, set `--button_color--on-bg` too:
|
|
119
|
+
|
|
120
|
+
```css
|
|
121
|
+
.brand-buttons {
|
|
122
|
+
--button_color: var(--color_viviq-green);
|
|
123
|
+
--button_on-color: var(--color_on-viviq-green);
|
|
124
|
+
--button_color--on-bg: var(--color_viviq-green); /* outline-resting follows */
|
|
125
|
+
}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Full token surface
|
|
129
|
+
|
|
130
|
+
Every public token below can be set on the button or any ancestor — the consumer-set value always wins over variant + state defaults. Tokens are grouped by **state × variant** so the symmetry is visible.
|
|
131
|
+
|
|
132
|
+
#### Identity & geometry
|
|
133
|
+
|
|
98
134
|
<table>
|
|
99
135
|
<thead>
|
|
100
136
|
<tr><th>Variable</th><th>Default</th><th>Description</th></tr>
|
|
101
137
|
</thead>
|
|
102
138
|
<tbody>
|
|
103
|
-
<tr><td>`--button_color`</td><td>`var(--bds-color_interactive)`</td><td>Identity colour
|
|
104
|
-
<tr><td>`--button_on-color`</td><td>`var(--bds-color_on-interactive)`</td><td>Text/icon colour on
|
|
105
|
-
<tr><td>`--button_color--on-bg`</td><td>`var(--bds-color_interactive_on-bg)`</td><td>Text-safe variant of `--button_color` for outline
|
|
139
|
+
<tr><td>`--button_color`</td><td>`var(--bds-color_interactive)`</td><td>Identity colour. Fills default-resting; flows through outline-hover.</td></tr>
|
|
140
|
+
<tr><td>`--button_on-color`</td><td>`var(--bds-color_on-interactive)`</td><td>Text/icon colour on default-resting. Flows through outline-hover.</td></tr>
|
|
141
|
+
<tr><td>`--button_color--on-bg`</td><td>`var(--bds-color_interactive_on-bg)`</td><td>Text-safe variant of `--button_color` for outline-resting text + border.</td></tr>
|
|
142
|
+
<tr><td>`--button_pulse-color`</td><td>`var(--button_color)`</td><td>Halo colour for the pulse animation.</td></tr>
|
|
106
143
|
<tr><td>`--button_radius`</td><td>`var(--bds-border_radius--full)`</td><td>Button border radius.</td></tr>
|
|
107
144
|
<tr><td>`--button_height`</td><td>`3em` (medium)</td><td>Button height. Also drives the width when `isIconOnly` is set.</td></tr>
|
|
108
|
-
<tr><td>`--
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
145
|
+
<tr><td>`--button_font-size`</td><td>`inherit` (medium)</td><td>Button font size.</td></tr>
|
|
146
|
+
</tbody>
|
|
147
|
+
</table>
|
|
148
|
+
|
|
149
|
+
#### Default variant
|
|
150
|
+
|
|
151
|
+
<table>
|
|
152
|
+
<thead>
|
|
153
|
+
<tr><th>State</th><th>Variable</th><th>Default</th></tr>
|
|
154
|
+
</thead>
|
|
155
|
+
<tbody>
|
|
156
|
+
<tr><td rowspan="3">Resting</td><td>`--button_bg`</td><td>`var(--button_color)`</td></tr>
|
|
157
|
+
<tr><td>`--button_text`</td><td>`var(--button_on-color)`</td></tr>
|
|
158
|
+
<tr><td>`--button_border`</td><td>`transparent`</td></tr>
|
|
159
|
+
<tr><td rowspan="4">Hover</td><td>`--button_bg--hover`</td><td>`var(--bds-color_bg)`</td></tr>
|
|
160
|
+
<tr><td>`--button_text--hover`</td><td>`var(--bds-color_interactive_on-bg)`</td></tr>
|
|
161
|
+
<tr><td>`--button_border--hover`</td><td>`currentcolor`</td></tr>
|
|
162
|
+
<tr><td>`--button_pulse-color--hover`</td><td>`var(--bds-color_interactive_on-bg)`</td></tr>
|
|
113
163
|
</tbody>
|
|
114
164
|
</table>
|
|
115
165
|
|
|
116
|
-
|
|
166
|
+
#### Outline variant
|
|
117
167
|
|
|
118
|
-
|
|
168
|
+
<table>
|
|
169
|
+
<thead>
|
|
170
|
+
<tr><th>State</th><th>Variable</th><th>Default</th></tr>
|
|
171
|
+
</thead>
|
|
172
|
+
<tbody>
|
|
173
|
+
<tr><td rowspan="3">Resting</td><td>`--button_bg--outline`</td><td>`transparent`</td></tr>
|
|
174
|
+
<tr><td>`--button_text--outline`</td><td>`var(--button_color--on-bg)`</td></tr>
|
|
175
|
+
<tr><td>`--button_border--outline`</td><td>`var(--button_color--on-bg)`</td></tr>
|
|
176
|
+
<tr><td rowspan="3">Hover</td><td>`--button_bg--outline-hover`</td><td>`var(--button_color)`</td></tr>
|
|
177
|
+
<tr><td>`--button_text--outline-hover`</td><td>`var(--button_on-color)`</td></tr>
|
|
178
|
+
<tr><td>`--button_border--outline-hover`</td><td>`transparent`</td></tr>
|
|
179
|
+
</tbody>
|
|
180
|
+
</table>
|
|
181
|
+
|
|
182
|
+
### Worked example: brand re-theme with one fine-grained tweak
|
|
183
|
+
|
|
184
|
+
Most consumers stop at the quick-theme. If you need to override one specific state — for example, you want default-hover to stay branded instead of fading to the page surface — drop a state-specific override alongside the identity tokens:
|
|
119
185
|
|
|
120
186
|
```css
|
|
121
|
-
.
|
|
122
|
-
|
|
123
|
-
--
|
|
187
|
+
.brand-buttons {
|
|
188
|
+
/* Identity — themes both variants at rest, plus outline-hover */
|
|
189
|
+
--button_color: var(--color_viviq-green);
|
|
190
|
+
--button_on-color: var(--color_on-viviq-green);
|
|
191
|
+
--button_color--on-bg: var(--color_viviq-green);
|
|
192
|
+
|
|
193
|
+
/* One fine-grained override: keep default-hover on-brand instead of fading */
|
|
194
|
+
--button_bg--hover: var(--color_viviq-green--dark);
|
|
195
|
+
--button_text--hover: var(--color_on-viviq-green);
|
|
124
196
|
}
|
|
125
197
|
```
|
|
126
198
|
|
|
199
|
+
Outline-hover, default-resting, and outline-resting all derive from the identity tokens — you only spell out the override that diverges.
|
|
200
|
+
|
|
127
201
|
## Accessibility
|
|
128
202
|
|
|
129
203
|
- Always provide children **or** `aria-label` — icon-only buttons without an accessible name are a WCAG failure.
|