@reliability-design/web 1.0.2 → 1.0.6
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/components/rel-accordion/README.md +132 -0
- package/dist/components/rel-accordion/rel-accordion.ts +61 -29
- package/dist/components/rel-alert/README.md +141 -0
- package/dist/components/rel-alert/rel-alert.ts +110 -67
- package/dist/components/rel-avatar/README.md +119 -0
- package/dist/components/rel-avatar/rel-avatar.ts +8 -15
- package/dist/components/rel-badge/README.md +86 -0
- package/dist/components/rel-badge/rel-badge.ts +28 -21
- package/dist/components/rel-breadcrumb/README.md +102 -0
- package/dist/components/rel-breadcrumb/rel-breadcrumb.ts +24 -18
- package/dist/components/rel-button/README.md +130 -0
- package/dist/components/rel-button/rel-button.ts +39 -59
- package/dist/components/rel-calendar/README.md +109 -0
- package/dist/components/rel-calendar/index.ts +1 -0
- package/dist/components/rel-calendar/rel-calendar.ts +467 -0
- package/dist/components/rel-card/README.md +94 -0
- package/dist/components/rel-card/rel-card.ts +21 -11
- package/dist/components/rel-cardmedia/README.md +127 -0
- package/dist/components/rel-cardmedia/rel-cardmedia.ts +22 -18
- package/dist/components/rel-carousel/README.md +166 -0
- package/dist/components/rel-carousel/index.ts +1 -0
- package/dist/components/rel-carousel/rel-carousel.ts +469 -0
- package/dist/components/rel-chart/README.md +286 -0
- package/dist/components/rel-chart/index.ts +1 -0
- package/dist/components/rel-chart/rel-chart.ts +736 -0
- package/dist/components/rel-checkbox/README.md +77 -0
- package/dist/components/rel-checkbox/rel-checkbox.ts +36 -45
- package/dist/components/rel-chip/README.md +114 -0
- package/dist/components/rel-chip/rel-chip.ts +47 -122
- package/dist/components/rel-container/README.md +99 -0
- package/dist/components/rel-container/rel-container.ts +1 -6
- package/dist/components/rel-date-picker/README.md +253 -0
- package/dist/components/rel-date-picker/index.ts +1 -0
- package/dist/components/rel-date-picker/rel-date-picker.ts +916 -0
- package/dist/components/rel-divider/README.md +100 -0
- package/dist/components/rel-divider/rel-divider.ts +37 -37
- package/dist/components/rel-drawer/README.md +200 -0
- package/dist/components/rel-drawer/index.ts +1 -0
- package/dist/components/rel-drawer/rel-drawer.ts +621 -0
- package/dist/components/rel-kbd/README.md +151 -0
- package/dist/components/rel-kbd/rel-kbd.ts +118 -0
- package/dist/components/rel-layout/README.md +88 -0
- package/dist/components/rel-layout/rel-layout.ts +12 -14
- package/dist/components/rel-menu/README.md +151 -0
- package/dist/components/rel-menu/rel-menu.ts +18 -10
- package/dist/components/rel-menubar/README.md +329 -0
- package/dist/components/rel-menubar/index.ts +2 -0
- package/dist/components/rel-menubar/rel-menubar-menu.ts +16 -0
- package/dist/components/rel-menubar/rel-menubar.ts +576 -0
- package/dist/components/rel-nav-menu/README.md +289 -0
- package/dist/components/rel-nav-menu/index.ts +3 -0
- package/dist/components/rel-nav-menu/rel-nav-menu-item.ts +143 -0
- package/dist/components/rel-nav-menu/rel-nav-menu-panel.ts +53 -0
- package/dist/components/rel-nav-menu/rel-nav-menu.ts +331 -0
- package/dist/components/rel-navbar/README.md +126 -0
- package/dist/components/rel-navbar/rel-navbar.ts +91 -0
- package/dist/components/rel-otp/README.md +440 -0
- package/dist/components/rel-otp/index.ts +1 -0
- package/dist/components/rel-otp/rel-otp.ts +504 -0
- package/dist/components/rel-pagination/README.md +410 -0
- package/dist/components/rel-pagination/index.ts +1 -0
- package/dist/components/rel-pagination/rel-pagination.ts +376 -0
- package/dist/components/rel-popover/README.md +568 -0
- package/dist/components/rel-popover/index.ts +2 -0
- package/dist/components/rel-popover/rel-popover-content.ts +55 -0
- package/dist/components/rel-popover/rel-popover.ts +327 -0
- package/dist/components/rel-progress/README.md +110 -0
- package/dist/components/rel-progress/rel-progress.ts +58 -20
- package/dist/components/rel-quote-page/README.md +166 -0
- package/dist/components/rel-quote-page/rel-quote-page.ts +816 -0
- package/dist/components/rel-radio/README.md +120 -0
- package/dist/components/rel-radio/rel-radio.ts +41 -73
- package/dist/components/rel-resizable/README.md +140 -0
- package/dist/components/rel-resizable/index.ts +3 -0
- package/dist/components/rel-resizable/rel-resizable-group.ts +374 -0
- package/dist/components/rel-resizable/rel-resizable-handle.ts +149 -0
- package/dist/components/rel-resizable/rel-resizable-panel.ts +47 -0
- package/dist/components/rel-segmented-button/README.md +141 -0
- package/dist/components/rel-segmented-button/rel-segmented-button.ts +18 -13
- package/dist/components/rel-select/README.md +107 -0
- package/dist/components/rel-select/rel-select.ts +14 -14
- package/dist/components/rel-sheet/README.md +224 -0
- package/dist/components/rel-sheet/rel-sheet.ts +683 -0
- package/dist/components/rel-sidebar/README.md +209 -0
- package/dist/components/rel-sidebar/rel-sidebar.ts +1158 -0
- package/dist/components/rel-slider/README.md +135 -0
- package/dist/components/rel-slider/rel-slider.ts +19 -7
- package/dist/components/rel-snackbar/README.md +134 -0
- package/dist/components/rel-snackbar/rel-snackbar.ts +73 -2
- package/dist/components/rel-stepper/README.md +160 -0
- package/dist/components/rel-stepper/rel-stepper.ts +29 -8
- package/dist/components/rel-switch/README.md +102 -0
- package/dist/components/rel-switch/rel-switch.ts +22 -11
- package/dist/components/rel-tab/README.md +163 -0
- package/dist/components/rel-tab/rel-tab.ts +46 -22
- package/dist/components/rel-table/README.md +178 -0
- package/dist/components/rel-table/rel-table-body.ts +16 -0
- package/dist/components/rel-table/rel-table-caption.ts +22 -0
- package/dist/components/rel-table/rel-table-cell.ts +49 -0
- package/dist/components/rel-table/rel-table-footer.ts +18 -0
- package/dist/components/rel-table/rel-table-head.ts +33 -0
- package/dist/components/rel-table/rel-table-header.ts +16 -0
- package/dist/components/rel-table/rel-table-row.ts +32 -0
- package/dist/components/rel-table/rel-table.ts +47 -0
- package/dist/components/rel-textfield/README.md +90 -0
- package/dist/components/rel-textfield/rel-textfield.ts +37 -21
- package/dist/components/rel-toast/README.md +148 -0
- package/dist/components/rel-toast/rel-toast.ts +32 -14
- package/dist/components/rel-tooltip/README.md +103 -0
- package/dist/components/rel-tooltip/rel-tooltip.ts +9 -9
- package/dist/index.d.mts +846 -7
- package/dist/index.d.ts +846 -7
- package/dist/index.js +10860 -1803
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +10820 -1809
- package/dist/index.mjs.map +1 -1
- package/dist/styles/vars.css +293 -183
- package/dist/vars-ITL2K3KO.css +294 -0
- package/package.json +2 -2
- package/dist/components/rel-accordion/rel-accordion.stories.ts +0 -313
- package/dist/components/rel-alert/rel-alert.stories.ts +0 -412
- package/dist/components/rel-avatar/rel-avatar.stories.ts +0 -327
- package/dist/components/rel-badge/rel-badge.stories.ts +0 -350
- package/dist/components/rel-breadcrumb/rel-breadcrumb.stories.ts +0 -306
- package/dist/components/rel-button/rel-button.stories.ts +0 -356
- package/dist/components/rel-card/rel-card.stories.ts +0 -299
- package/dist/components/rel-cardmedia/rel-cardmedia.stories.ts +0 -368
- package/dist/components/rel-checkbox/rel-checkbox.stories.ts +0 -414
- package/dist/components/rel-chip/rel-chip.stories.ts +0 -552
- package/dist/components/rel-container/rel-container.stories.ts +0 -239
- package/dist/components/rel-divider/rel-divider.stories.ts +0 -229
- package/dist/components/rel-layout/rel-layout.stories.ts +0 -713
- package/dist/components/rel-menu/rel-menu.stories.ts +0 -910
- package/dist/components/rel-progress/rel-progress.stories.ts +0 -817
- package/dist/components/rel-radio/rel-radio.stories.ts +0 -1048
- package/dist/components/rel-segmented-button/rel-segmented-button.stories.ts +0 -1079
- package/dist/components/rel-select/rel-select.stories.ts +0 -1201
- package/dist/components/rel-slider/rel-slider.stories.ts +0 -730
- package/dist/components/rel-snackbar/rel-snackbar.stories.ts +0 -808
- package/dist/components/rel-stepper/rel-stepper.stories.ts +0 -752
- package/dist/components/rel-switch/rel-switch.stories.ts +0 -441
- package/dist/components/rel-tab/rel-tab.stories.ts +0 -492
- package/dist/components/rel-textfield/rel-textfield.stories.ts +0 -710
- package/dist/components/rel-toast/rel-toast.stories.ts +0 -394
- package/dist/components/rel-tooltip/rel-tooltip.stories.ts +0 -364
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# rel-radio
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
A radio button group component that allows users to select a single option from a list. Supports individual option states (disabled, error), supporting text, and comprehensive styling with design tokens.
|
|
5
|
+
|
|
6
|
+
## Usage
|
|
7
|
+
```html
|
|
8
|
+
<!-- Basic example -->
|
|
9
|
+
<rel-radio id="colorRadio" name="color-group" selectedValue="blue"></rel-radio>
|
|
10
|
+
<script>
|
|
11
|
+
const radio = document.getElementById('colorRadio');
|
|
12
|
+
radio.options = [
|
|
13
|
+
{ value: 'red', label: 'Red' },
|
|
14
|
+
{ value: 'blue', label: 'Blue' },
|
|
15
|
+
{ value: 'green', label: 'Green' }
|
|
16
|
+
];
|
|
17
|
+
</script>
|
|
18
|
+
|
|
19
|
+
<!-- Example with supporting text and states -->
|
|
20
|
+
<rel-radio id="planRadio" name="plan-group"></rel-radio>
|
|
21
|
+
<script>
|
|
22
|
+
const planRadio = document.getElementById('planRadio');
|
|
23
|
+
planRadio.options = [
|
|
24
|
+
{ value: 'basic', label: 'Basic Plan', supportingText: '$9.99/month' },
|
|
25
|
+
{ value: 'pro', label: 'Pro Plan', supportingText: '$19.99/month' },
|
|
26
|
+
{ value: 'enterprise', label: 'Enterprise', supportingText: 'Contact sales', disabled: true }
|
|
27
|
+
];
|
|
28
|
+
planRadio.selectedValue = 'basic';
|
|
29
|
+
</script>
|
|
30
|
+
|
|
31
|
+
<!-- Listen for changes -->
|
|
32
|
+
<rel-radio id="preferenceRadio"></rel-radio>
|
|
33
|
+
<script>
|
|
34
|
+
const prefRadio = document.getElementById('preferenceRadio');
|
|
35
|
+
prefRadio.options = [
|
|
36
|
+
{ value: 'email', label: 'Email' },
|
|
37
|
+
{ value: 'sms', label: 'SMS' }
|
|
38
|
+
];
|
|
39
|
+
prefRadio.addEventListener('changed', (e) => {
|
|
40
|
+
console.log('Selected:', prefRadio.selectedValue);
|
|
41
|
+
});
|
|
42
|
+
</script>
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## API
|
|
46
|
+
|
|
47
|
+
### Attributes/Properties
|
|
48
|
+
| Name | Type | Default | Description |
|
|
49
|
+
|------|------|---------|-------------|
|
|
50
|
+
| `options` | `RadioOption[]` | `[]` | Array of radio options (see RadioOption interface below) |
|
|
51
|
+
| `name` | `string` | `"radio-group"` | Name attribute for the radio group (for form grouping) |
|
|
52
|
+
| `selectedValue` | `string \| null` | `null` | Currently selected option value (reflected attribute) |
|
|
53
|
+
| `disabled` | `boolean` | `false` | Disables the entire radio group |
|
|
54
|
+
|
|
55
|
+
### RadioOption Interface
|
|
56
|
+
```typescript
|
|
57
|
+
interface RadioOption {
|
|
58
|
+
value: string; // Unique value for this option
|
|
59
|
+
label: string; // Display label
|
|
60
|
+
supportingText?: string; // Optional helper text below the label
|
|
61
|
+
disabled?: boolean; // Disable individual option
|
|
62
|
+
error?: boolean; // Show error state for individual option
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Events
|
|
67
|
+
| Event | Detail | Description |
|
|
68
|
+
|-------|--------|-------------|
|
|
69
|
+
| `changed` | None (read `selectedValue` property) | Fired when the selected option changes |
|
|
70
|
+
|
|
71
|
+
## Slots
|
|
72
|
+
Default slot not used.
|
|
73
|
+
|
|
74
|
+
## CSS Parts
|
|
75
|
+
None exposed.
|
|
76
|
+
|
|
77
|
+
## Tokens / CSS Variables
|
|
78
|
+
|
|
79
|
+
### Semantic Tokens
|
|
80
|
+
- `--rel-fontFamilies-primary` - Font family
|
|
81
|
+
- `--rel-fontSizes-sm`, `--rel-fontSizes-xs` - Font sizes for label and supporting text
|
|
82
|
+
- `--rel-fontWeights-medium` - Font weight for labels
|
|
83
|
+
|
|
84
|
+
### Spacing Tokens
|
|
85
|
+
- `--rel-spacing-space-xs` - Gap between radio options
|
|
86
|
+
- `--rel-spacing-space-3xs` - Gap within each option (label and supporting text)
|
|
87
|
+
- `--rel-spacing-space-2xs` - Gap between radio circle and label
|
|
88
|
+
|
|
89
|
+
### Color Tokens
|
|
90
|
+
- `--rel-text-heading` - Radio button border and checked dot color
|
|
91
|
+
- `--rel-text-primary` - Label text color
|
|
92
|
+
- `--rel-text-placeholder` - Supporting text color
|
|
93
|
+
- `--rel-border-info` - Focus outline color
|
|
94
|
+
- `--rel-colors-red-secondary` - Error state border and dot color
|
|
95
|
+
|
|
96
|
+
## Accessibility
|
|
97
|
+
- Uses visually hidden native radio inputs for proper screen reader support
|
|
98
|
+
- Custom visual radio circle with proper focus indicators
|
|
99
|
+
- Focus visible state with outline offset for keyboard navigation
|
|
100
|
+
- Label click targets the radio for larger interaction area
|
|
101
|
+
- Disabled state communicated through reduced opacity and cursor change
|
|
102
|
+
- Proper `name` grouping ensures only one option can be selected
|
|
103
|
+
|
|
104
|
+
### Keyboard Interactions
|
|
105
|
+
- `Tab` - Move focus to/from radio group
|
|
106
|
+
- `Arrow Up/Down` - Navigate between radio options
|
|
107
|
+
- `Space` - Select focused option
|
|
108
|
+
|
|
109
|
+
### Focus Behavior
|
|
110
|
+
- Focus outline appears with offset around the custom radio circle
|
|
111
|
+
- Uses info border color for high contrast
|
|
112
|
+
|
|
113
|
+
## Notes / Edge Cases
|
|
114
|
+
- The `selectedValue` property is reflected as an attribute and can be set programmatically or via HTML
|
|
115
|
+
- When `disabled` is true on the component, all options are disabled regardless of individual option settings
|
|
116
|
+
- Individual options can be disabled via the `disabled` property in the `RadioOption` object
|
|
117
|
+
- The `error` property on `RadioOption` changes the radio button color to red but does not prevent selection
|
|
118
|
+
- Supporting text is optional and appears below the label with left margin alignment
|
|
119
|
+
- Native radio inputs are visually hidden but maintain all accessibility features
|
|
120
|
+
- The `name` attribute groups radios together for form submission and mutual exclusion
|
|
@@ -13,9 +13,13 @@ export interface RadioOption {
|
|
|
13
13
|
export class RelRadio extends LitElement {
|
|
14
14
|
@property({ type: Array }) options: RadioOption[] = [];
|
|
15
15
|
|
|
16
|
-
@property({ type: String }) name
|
|
16
|
+
@property({ type: String }) name = "radio-group";
|
|
17
17
|
|
|
18
|
-
@property({ type: String
|
|
18
|
+
@property({ type: String, reflect: true })
|
|
19
|
+
selectedValue: string | null = null;
|
|
20
|
+
|
|
21
|
+
@property({ type: Boolean })
|
|
22
|
+
disabled = false;
|
|
19
23
|
|
|
20
24
|
static styles = css`
|
|
21
25
|
:host {
|
|
@@ -32,10 +36,13 @@ export class RelRadio extends LitElement {
|
|
|
32
36
|
.rel-radio-option {
|
|
33
37
|
display: flex;
|
|
34
38
|
flex-direction: column;
|
|
35
|
-
align-items: flex-start;
|
|
36
39
|
gap: var(--rel-spacing-space-3xs);
|
|
37
40
|
cursor: pointer;
|
|
38
|
-
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
.rel-radio-option.disabled {
|
|
44
|
+
opacity: 0.6;
|
|
45
|
+
cursor: not-allowed !important;
|
|
39
46
|
}
|
|
40
47
|
|
|
41
48
|
.radio-main {
|
|
@@ -44,7 +51,7 @@ export class RelRadio extends LitElement {
|
|
|
44
51
|
gap: var(--rel-spacing-space-2xs);
|
|
45
52
|
}
|
|
46
53
|
|
|
47
|
-
|
|
54
|
+
input {
|
|
48
55
|
position: absolute;
|
|
49
56
|
opacity: 0;
|
|
50
57
|
pointer-events: none;
|
|
@@ -53,100 +60,65 @@ export class RelRadio extends LitElement {
|
|
|
53
60
|
.radio-custom {
|
|
54
61
|
width: 20px;
|
|
55
62
|
height: 20px;
|
|
56
|
-
border: 2px solid var(--rel-
|
|
63
|
+
border: 2px solid var(--rel-text-heading, #2b2b2b);
|
|
57
64
|
border-radius: 50%;
|
|
58
|
-
display: inline-block;
|
|
59
65
|
position: relative;
|
|
60
66
|
flex-shrink: 0;
|
|
61
|
-
transition: all 0.2s ease-in-out;
|
|
62
67
|
}
|
|
63
68
|
|
|
64
|
-
|
|
65
|
-
outline:
|
|
66
|
-
outline-offset:
|
|
69
|
+
input:focus-visible + .radio-custom {
|
|
70
|
+
outline: 2px solid var(--rel-border-info, #0091ea);
|
|
71
|
+
outline-offset: 2px;
|
|
67
72
|
}
|
|
68
73
|
|
|
69
|
-
|
|
74
|
+
input:checked + .radio-custom::after {
|
|
70
75
|
content: "";
|
|
71
76
|
position: absolute;
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
width: 10px;
|
|
75
|
-
height: 10px;
|
|
76
|
-
background-color: var(--rel-colors-black);
|
|
77
|
+
inset: 4px;
|
|
78
|
+
background: var(--rel-text-heading, #2b2b2b);
|
|
77
79
|
border-radius: 50%;
|
|
78
|
-
transform: translate(-50%, -50%);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
/* Error state */
|
|
82
|
-
.rel-radio-option.error .radio-custom {
|
|
83
|
-
border-color: var(--rel-colors-red-secondary);
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
.rel-radio-option.error input:checked + .radio-custom::after {
|
|
87
|
-
background-color: var(--rel-colors-red-secondary);
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
.rel-radio-option.error .radio-label,
|
|
91
|
-
.rel-radio-option.error .radio-supporting {
|
|
92
|
-
color: var(--rel-colors-red-secondary);
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
.rel-radio-option.error input:focus + .radio-custom {
|
|
96
|
-
outline: var(--rel-borders-width-stroke-200) solid var(--rel-colors-red-secondary);
|
|
97
80
|
}
|
|
98
81
|
|
|
99
|
-
/* Disabled state */
|
|
100
|
-
.rel-radio-option.disabled {
|
|
101
|
-
opacity: 0.6;
|
|
102
|
-
cursor: not-allowed !important;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
.rel-radio-option.disabled .radio-label,
|
|
106
|
-
.rel-radio-option.disabled .radio-supporting {
|
|
107
|
-
cursor: not-allowed !important;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
/* Text styles */
|
|
111
82
|
.radio-label {
|
|
112
|
-
font-size: var(--rel-fontSizes-sm);
|
|
113
|
-
font-weight: var(--rel-fontWeights-medium);
|
|
114
|
-
color: var(--rel-
|
|
115
|
-
line-height: var(--rel-lineHeights-sm);
|
|
83
|
+
font-size: var(--rel-fontSizes-sm, 12px);
|
|
84
|
+
font-weight: var(--rel-fontWeights-medium, 500);
|
|
85
|
+
color: var(--rel-text-primary, #333);
|
|
116
86
|
}
|
|
117
87
|
|
|
118
88
|
.radio-supporting {
|
|
119
|
-
font-size: var(--rel-fontSizes-xs);
|
|
120
|
-
color: var(--rel-colors-gray-placeholder);
|
|
89
|
+
font-size: var(--rel-fontSizes-xs, 10px);
|
|
121
90
|
margin-left: 28px;
|
|
122
|
-
|
|
91
|
+
color: var(--rel-text-placeholder, #a9a9a9);
|
|
123
92
|
}
|
|
124
93
|
|
|
125
|
-
.radio-
|
|
126
|
-
color: var(--rel-colors-red-secondary);
|
|
94
|
+
.error .radio-custom {
|
|
95
|
+
border-color: var(--rel-colors-red-secondary);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.error input:checked + .radio-custom::after {
|
|
99
|
+
background: var(--rel-colors-red-secondary);
|
|
127
100
|
}
|
|
128
101
|
`;
|
|
129
102
|
|
|
130
103
|
private onChange(value: string) {
|
|
104
|
+
if (this.disabled) return;
|
|
105
|
+
|
|
131
106
|
this.selectedValue = value;
|
|
132
107
|
this.dispatchEvent(
|
|
133
108
|
new CustomEvent("changed", {
|
|
134
|
-
detail: { value },
|
|
135
109
|
bubbles: true,
|
|
136
110
|
composed: true,
|
|
137
111
|
})
|
|
138
112
|
);
|
|
139
113
|
}
|
|
140
114
|
|
|
141
|
-
private isChecked(value: string): boolean {
|
|
142
|
-
return this.selectedValue === value;
|
|
143
|
-
}
|
|
144
|
-
|
|
145
115
|
private renderOption(option: RadioOption) {
|
|
146
|
-
const isChecked = this.
|
|
116
|
+
const isChecked = this.selectedValue === option.value;
|
|
117
|
+
const isDisabled = this.disabled || option.disabled;
|
|
118
|
+
|
|
147
119
|
const classes = [
|
|
148
120
|
"rel-radio-option",
|
|
149
|
-
|
|
121
|
+
isDisabled ? "disabled" : "",
|
|
150
122
|
option.error ? "error" : "",
|
|
151
123
|
]
|
|
152
124
|
.filter(Boolean)
|
|
@@ -158,20 +130,16 @@ export class RelRadio extends LitElement {
|
|
|
158
130
|
<input
|
|
159
131
|
type="radio"
|
|
160
132
|
name="${this.name}"
|
|
161
|
-
.value="${option.value}"
|
|
162
133
|
.checked="${isChecked}"
|
|
163
|
-
?disabled="${
|
|
164
|
-
@change="${() =>
|
|
134
|
+
?disabled="${isDisabled}"
|
|
135
|
+
@change="${() => this.onChange(option.value)}"
|
|
136
|
+
/>
|
|
165
137
|
<span class="radio-custom"></span>
|
|
166
138
|
<span class="radio-label">${option.label}</span>
|
|
167
139
|
</div>
|
|
168
140
|
|
|
169
141
|
${option.supportingText
|
|
170
|
-
? html
|
|
171
|
-
<div class="radio-supporting ${option.error ? "error-text" : ""}">
|
|
172
|
-
${option.supportingText}
|
|
173
|
-
</div>
|
|
174
|
-
`
|
|
142
|
+
? html`<div class="radio-supporting">${option.supportingText}</div>`
|
|
175
143
|
: ""}
|
|
176
144
|
</label>
|
|
177
145
|
`;
|
|
@@ -180,7 +148,7 @@ export class RelRadio extends LitElement {
|
|
|
180
148
|
render() {
|
|
181
149
|
return html`
|
|
182
150
|
<div class="rel-radio-group">
|
|
183
|
-
${this.options.map((
|
|
151
|
+
${this.options.map((o) => this.renderOption(o))}
|
|
184
152
|
</div>
|
|
185
153
|
`;
|
|
186
154
|
}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# Resizable Components
|
|
2
|
+
|
|
3
|
+
A flexible resizable panel system built with Lit web components for the Reliability Design System.
|
|
4
|
+
|
|
5
|
+
## Components
|
|
6
|
+
|
|
7
|
+
### `<rel-resizable-group>`
|
|
8
|
+
Container for resizable panels. Manages layout direction and coordinates resizing between panels.
|
|
9
|
+
|
|
10
|
+
**Attributes:**
|
|
11
|
+
- `direction` (string): Layout direction - `"horizontal"` (default) or `"vertical"`
|
|
12
|
+
|
|
13
|
+
**Events:**
|
|
14
|
+
- `rel-resize`: Emitted during resize with detail `{ direction, sizes: number[] }`
|
|
15
|
+
- `rel-resize-end`: Emitted when resize completes with detail `{ direction, sizes: number[] }`
|
|
16
|
+
|
|
17
|
+
### `<rel-resizable-panel>`
|
|
18
|
+
Individual resizable panel within a group.
|
|
19
|
+
|
|
20
|
+
**Attributes:**
|
|
21
|
+
- `defaultsize` (number): Initial size in percentage (optional)
|
|
22
|
+
- `minsize` (number): Minimum size in percentage (default: 10)
|
|
23
|
+
- `maxsize` (number): Maximum size in percentage (default: 90)
|
|
24
|
+
|
|
25
|
+
### `<rel-resizable-handle>`
|
|
26
|
+
Draggable separator between panels.
|
|
27
|
+
|
|
28
|
+
**Features:**
|
|
29
|
+
- Pointer drag support (click and drag to resize)
|
|
30
|
+
- Keyboard navigation:
|
|
31
|
+
- Horizontal: ArrowLeft/ArrowRight (2% step, 5% with Shift)
|
|
32
|
+
- Vertical: ArrowUp/ArrowDown (2% step, 5% with Shift)
|
|
33
|
+
- Accessible with `role="separator"` and ARIA attributes
|
|
34
|
+
- Visual feedback on hover/focus/drag
|
|
35
|
+
|
|
36
|
+
## Usage
|
|
37
|
+
|
|
38
|
+
### Basic Horizontal Layout
|
|
39
|
+
```html
|
|
40
|
+
<rel-resizable-group direction="horizontal">
|
|
41
|
+
<rel-resizable-panel defaultsize="50">
|
|
42
|
+
Left Panel
|
|
43
|
+
</rel-resizable-panel>
|
|
44
|
+
<rel-resizable-handle></rel-resizable-handle>
|
|
45
|
+
<rel-resizable-panel defaultsize="50">
|
|
46
|
+
Right Panel
|
|
47
|
+
</rel-resizable-panel>
|
|
48
|
+
</rel-resizable-group>
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### Vertical Layout
|
|
52
|
+
```html
|
|
53
|
+
<rel-resizable-group direction="vertical">
|
|
54
|
+
<rel-resizable-panel defaultsize="40">
|
|
55
|
+
Top Panel
|
|
56
|
+
</rel-resizable-panel>
|
|
57
|
+
<rel-resizable-handle></rel-resizable-handle>
|
|
58
|
+
<rel-resizable-panel defaultsize="60">
|
|
59
|
+
Bottom Panel
|
|
60
|
+
</rel-resizable-panel>
|
|
61
|
+
</rel-resizable-group>
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Nested Layout
|
|
65
|
+
```html
|
|
66
|
+
<rel-resizable-group direction="horizontal">
|
|
67
|
+
<rel-resizable-panel defaultsize="33">
|
|
68
|
+
Left Sidebar
|
|
69
|
+
</rel-resizable-panel>
|
|
70
|
+
<rel-resizable-handle></rel-resizable-handle>
|
|
71
|
+
<rel-resizable-panel defaultsize="67">
|
|
72
|
+
<rel-resizable-group direction="vertical">
|
|
73
|
+
<rel-resizable-panel defaultsize="50">
|
|
74
|
+
Top Content
|
|
75
|
+
</rel-resizable-panel>
|
|
76
|
+
<rel-resizable-handle></rel-resizable-handle>
|
|
77
|
+
<rel-resizable-panel defaultsize="50">
|
|
78
|
+
Bottom Content
|
|
79
|
+
</rel-resizable-panel>
|
|
80
|
+
</rel-resizable-group>
|
|
81
|
+
</rel-resizable-panel>
|
|
82
|
+
</rel-resizable-group>
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### With Constraints
|
|
86
|
+
```html
|
|
87
|
+
<rel-resizable-group direction="horizontal">
|
|
88
|
+
<rel-resizable-panel defaultsize="30" minsize="20" maxsize="50">
|
|
89
|
+
Constrained Panel
|
|
90
|
+
</rel-resizable-panel>
|
|
91
|
+
<rel-resizable-handle></rel-resizable-handle>
|
|
92
|
+
<rel-resizable-panel defaultsize="70">
|
|
93
|
+
Main Panel
|
|
94
|
+
</rel-resizable-panel>
|
|
95
|
+
</rel-resizable-group>
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## How It Works
|
|
99
|
+
|
|
100
|
+
### Size Calculation
|
|
101
|
+
1. **Initialization**: On first render, the group reads all direct child panels and handles
|
|
102
|
+
2. **Default Sizes**: If panels specify `defaultsize`, those are used; otherwise space is distributed evenly
|
|
103
|
+
3. **Normalization**: All sizes are normalized to total 100% across all panels
|
|
104
|
+
4. **Percentage-Based**: Sizes are always in percentages, ensuring responsive layouts
|
|
105
|
+
|
|
106
|
+
### Resizing Behavior
|
|
107
|
+
- **Pointer Drag**: Click and drag a handle to resize adjacent panels
|
|
108
|
+
- **Keyboard**: Focus a handle and use arrow keys (direction-aware)
|
|
109
|
+
- **Constraints**: Min/max sizes are enforced; total percentage is always preserved
|
|
110
|
+
- **Pair Adjustment**: Only the two panels adjacent to a handle are resized
|
|
111
|
+
|
|
112
|
+
### Events
|
|
113
|
+
- Use `rel-resize` to track live resizing (useful for updating dependent content)
|
|
114
|
+
- Use `rel-resize-end` to react after resize completes (useful for saving preferences)
|
|
115
|
+
|
|
116
|
+
## Accessibility
|
|
117
|
+
|
|
118
|
+
- Handles are keyboard focusable with `tabindex="0"`
|
|
119
|
+
- `role="separator"` with appropriate `aria-orientation`
|
|
120
|
+
- `aria-valuenow`, `aria-valuemin`, `aria-valuemax` reflect current split
|
|
121
|
+
- Visual focus indicators using design tokens
|
|
122
|
+
- Standard cursor changes (col-resize/row-resize)
|
|
123
|
+
|
|
124
|
+
## Styling
|
|
125
|
+
|
|
126
|
+
All styling uses Reliability Design System tokens:
|
|
127
|
+
- Borders: `--rel-borders-width-stroke-100`
|
|
128
|
+
- Colors: `--rel-colors-gray-*`, `--rel-colors-blue-primary`, `--rel-colors-white`
|
|
129
|
+
- Spacing: `--rel-spacing-space-*`
|
|
130
|
+
- Border radius: `--rel-borders-radius-border-radius-*`
|
|
131
|
+
|
|
132
|
+
Panels have `overflow: auto` by default for scrollable content.
|
|
133
|
+
|
|
134
|
+
## Limitations
|
|
135
|
+
|
|
136
|
+
1. **Direct Children Only**: Panels and handles must be direct children of the group
|
|
137
|
+
2. **Handle Placement**: Handles should be placed between panels in the expected order
|
|
138
|
+
3. **No Collapse**: Panels cannot collapse to 0% (use min/max to control)
|
|
139
|
+
4. **Single Direction**: Each group has one direction; nest groups for complex layouts
|
|
140
|
+
5. **Manual Updates**: Group doesn't automatically observe DOM changes after initialization
|