@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.
Files changed (145) hide show
  1. package/dist/components/rel-accordion/README.md +132 -0
  2. package/dist/components/rel-accordion/rel-accordion.ts +61 -29
  3. package/dist/components/rel-alert/README.md +141 -0
  4. package/dist/components/rel-alert/rel-alert.ts +110 -67
  5. package/dist/components/rel-avatar/README.md +119 -0
  6. package/dist/components/rel-avatar/rel-avatar.ts +8 -15
  7. package/dist/components/rel-badge/README.md +86 -0
  8. package/dist/components/rel-badge/rel-badge.ts +28 -21
  9. package/dist/components/rel-breadcrumb/README.md +102 -0
  10. package/dist/components/rel-breadcrumb/rel-breadcrumb.ts +24 -18
  11. package/dist/components/rel-button/README.md +130 -0
  12. package/dist/components/rel-button/rel-button.ts +39 -59
  13. package/dist/components/rel-calendar/README.md +109 -0
  14. package/dist/components/rel-calendar/index.ts +1 -0
  15. package/dist/components/rel-calendar/rel-calendar.ts +467 -0
  16. package/dist/components/rel-card/README.md +94 -0
  17. package/dist/components/rel-card/rel-card.ts +21 -11
  18. package/dist/components/rel-cardmedia/README.md +127 -0
  19. package/dist/components/rel-cardmedia/rel-cardmedia.ts +22 -18
  20. package/dist/components/rel-carousel/README.md +166 -0
  21. package/dist/components/rel-carousel/index.ts +1 -0
  22. package/dist/components/rel-carousel/rel-carousel.ts +469 -0
  23. package/dist/components/rel-chart/README.md +286 -0
  24. package/dist/components/rel-chart/index.ts +1 -0
  25. package/dist/components/rel-chart/rel-chart.ts +736 -0
  26. package/dist/components/rel-checkbox/README.md +77 -0
  27. package/dist/components/rel-checkbox/rel-checkbox.ts +36 -45
  28. package/dist/components/rel-chip/README.md +114 -0
  29. package/dist/components/rel-chip/rel-chip.ts +47 -122
  30. package/dist/components/rel-container/README.md +99 -0
  31. package/dist/components/rel-container/rel-container.ts +1 -6
  32. package/dist/components/rel-date-picker/README.md +253 -0
  33. package/dist/components/rel-date-picker/index.ts +1 -0
  34. package/dist/components/rel-date-picker/rel-date-picker.ts +916 -0
  35. package/dist/components/rel-divider/README.md +100 -0
  36. package/dist/components/rel-divider/rel-divider.ts +37 -37
  37. package/dist/components/rel-drawer/README.md +200 -0
  38. package/dist/components/rel-drawer/index.ts +1 -0
  39. package/dist/components/rel-drawer/rel-drawer.ts +621 -0
  40. package/dist/components/rel-kbd/README.md +151 -0
  41. package/dist/components/rel-kbd/rel-kbd.ts +118 -0
  42. package/dist/components/rel-layout/README.md +88 -0
  43. package/dist/components/rel-layout/rel-layout.ts +12 -14
  44. package/dist/components/rel-menu/README.md +151 -0
  45. package/dist/components/rel-menu/rel-menu.ts +18 -10
  46. package/dist/components/rel-menubar/README.md +329 -0
  47. package/dist/components/rel-menubar/index.ts +2 -0
  48. package/dist/components/rel-menubar/rel-menubar-menu.ts +16 -0
  49. package/dist/components/rel-menubar/rel-menubar.ts +576 -0
  50. package/dist/components/rel-nav-menu/README.md +289 -0
  51. package/dist/components/rel-nav-menu/index.ts +3 -0
  52. package/dist/components/rel-nav-menu/rel-nav-menu-item.ts +143 -0
  53. package/dist/components/rel-nav-menu/rel-nav-menu-panel.ts +53 -0
  54. package/dist/components/rel-nav-menu/rel-nav-menu.ts +331 -0
  55. package/dist/components/rel-navbar/README.md +126 -0
  56. package/dist/components/rel-navbar/rel-navbar.ts +91 -0
  57. package/dist/components/rel-otp/README.md +440 -0
  58. package/dist/components/rel-otp/index.ts +1 -0
  59. package/dist/components/rel-otp/rel-otp.ts +504 -0
  60. package/dist/components/rel-pagination/README.md +410 -0
  61. package/dist/components/rel-pagination/index.ts +1 -0
  62. package/dist/components/rel-pagination/rel-pagination.ts +376 -0
  63. package/dist/components/rel-popover/README.md +568 -0
  64. package/dist/components/rel-popover/index.ts +2 -0
  65. package/dist/components/rel-popover/rel-popover-content.ts +55 -0
  66. package/dist/components/rel-popover/rel-popover.ts +327 -0
  67. package/dist/components/rel-progress/README.md +110 -0
  68. package/dist/components/rel-progress/rel-progress.ts +58 -20
  69. package/dist/components/rel-quote-page/README.md +166 -0
  70. package/dist/components/rel-quote-page/rel-quote-page.ts +816 -0
  71. package/dist/components/rel-radio/README.md +120 -0
  72. package/dist/components/rel-radio/rel-radio.ts +41 -73
  73. package/dist/components/rel-resizable/README.md +140 -0
  74. package/dist/components/rel-resizable/index.ts +3 -0
  75. package/dist/components/rel-resizable/rel-resizable-group.ts +374 -0
  76. package/dist/components/rel-resizable/rel-resizable-handle.ts +149 -0
  77. package/dist/components/rel-resizable/rel-resizable-panel.ts +47 -0
  78. package/dist/components/rel-segmented-button/README.md +141 -0
  79. package/dist/components/rel-segmented-button/rel-segmented-button.ts +18 -13
  80. package/dist/components/rel-select/README.md +107 -0
  81. package/dist/components/rel-select/rel-select.ts +14 -14
  82. package/dist/components/rel-sheet/README.md +224 -0
  83. package/dist/components/rel-sheet/rel-sheet.ts +683 -0
  84. package/dist/components/rel-sidebar/README.md +209 -0
  85. package/dist/components/rel-sidebar/rel-sidebar.ts +1158 -0
  86. package/dist/components/rel-slider/README.md +135 -0
  87. package/dist/components/rel-slider/rel-slider.ts +19 -7
  88. package/dist/components/rel-snackbar/README.md +134 -0
  89. package/dist/components/rel-snackbar/rel-snackbar.ts +73 -2
  90. package/dist/components/rel-stepper/README.md +160 -0
  91. package/dist/components/rel-stepper/rel-stepper.ts +29 -8
  92. package/dist/components/rel-switch/README.md +102 -0
  93. package/dist/components/rel-switch/rel-switch.ts +22 -11
  94. package/dist/components/rel-tab/README.md +163 -0
  95. package/dist/components/rel-tab/rel-tab.ts +46 -22
  96. package/dist/components/rel-table/README.md +178 -0
  97. package/dist/components/rel-table/rel-table-body.ts +16 -0
  98. package/dist/components/rel-table/rel-table-caption.ts +22 -0
  99. package/dist/components/rel-table/rel-table-cell.ts +49 -0
  100. package/dist/components/rel-table/rel-table-footer.ts +18 -0
  101. package/dist/components/rel-table/rel-table-head.ts +33 -0
  102. package/dist/components/rel-table/rel-table-header.ts +16 -0
  103. package/dist/components/rel-table/rel-table-row.ts +32 -0
  104. package/dist/components/rel-table/rel-table.ts +47 -0
  105. package/dist/components/rel-textfield/README.md +90 -0
  106. package/dist/components/rel-textfield/rel-textfield.ts +37 -21
  107. package/dist/components/rel-toast/README.md +148 -0
  108. package/dist/components/rel-toast/rel-toast.ts +32 -14
  109. package/dist/components/rel-tooltip/README.md +103 -0
  110. package/dist/components/rel-tooltip/rel-tooltip.ts +9 -9
  111. package/dist/index.d.mts +846 -7
  112. package/dist/index.d.ts +846 -7
  113. package/dist/index.js +10860 -1803
  114. package/dist/index.js.map +1 -1
  115. package/dist/index.mjs +10820 -1809
  116. package/dist/index.mjs.map +1 -1
  117. package/dist/styles/vars.css +293 -183
  118. package/dist/vars-ITL2K3KO.css +294 -0
  119. package/package.json +2 -2
  120. package/dist/components/rel-accordion/rel-accordion.stories.ts +0 -313
  121. package/dist/components/rel-alert/rel-alert.stories.ts +0 -412
  122. package/dist/components/rel-avatar/rel-avatar.stories.ts +0 -327
  123. package/dist/components/rel-badge/rel-badge.stories.ts +0 -350
  124. package/dist/components/rel-breadcrumb/rel-breadcrumb.stories.ts +0 -306
  125. package/dist/components/rel-button/rel-button.stories.ts +0 -356
  126. package/dist/components/rel-card/rel-card.stories.ts +0 -299
  127. package/dist/components/rel-cardmedia/rel-cardmedia.stories.ts +0 -368
  128. package/dist/components/rel-checkbox/rel-checkbox.stories.ts +0 -414
  129. package/dist/components/rel-chip/rel-chip.stories.ts +0 -552
  130. package/dist/components/rel-container/rel-container.stories.ts +0 -239
  131. package/dist/components/rel-divider/rel-divider.stories.ts +0 -229
  132. package/dist/components/rel-layout/rel-layout.stories.ts +0 -713
  133. package/dist/components/rel-menu/rel-menu.stories.ts +0 -910
  134. package/dist/components/rel-progress/rel-progress.stories.ts +0 -817
  135. package/dist/components/rel-radio/rel-radio.stories.ts +0 -1048
  136. package/dist/components/rel-segmented-button/rel-segmented-button.stories.ts +0 -1079
  137. package/dist/components/rel-select/rel-select.stories.ts +0 -1201
  138. package/dist/components/rel-slider/rel-slider.stories.ts +0 -730
  139. package/dist/components/rel-snackbar/rel-snackbar.stories.ts +0 -808
  140. package/dist/components/rel-stepper/rel-stepper.stories.ts +0 -752
  141. package/dist/components/rel-switch/rel-switch.stories.ts +0 -441
  142. package/dist/components/rel-tab/rel-tab.stories.ts +0 -492
  143. package/dist/components/rel-textfield/rel-textfield.stories.ts +0 -710
  144. package/dist/components/rel-toast/rel-toast.stories.ts +0 -394
  145. 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: string = "radio-group";
16
+ @property({ type: String }) name = "radio-group";
17
17
 
18
- @property({ type: String }) selectedValue: string | null = null;
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
- position: relative;
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
- .rel-radio-option input {
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-colors-black);
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
- .rel-radio-option input:focus + .radio-custom {
65
- outline: var(--rel-borders-width-stroke-200) solid var(--rel-colors-black);
66
- outline-offset: var(--rel-spacing-space-3xs);
69
+ input:focus-visible + .radio-custom {
70
+ outline: 2px solid var(--rel-border-info, #0091ea);
71
+ outline-offset: 2px;
67
72
  }
68
73
 
69
- .rel-radio-option input:checked + .radio-custom::after {
74
+ input:checked + .radio-custom::after {
70
75
  content: "";
71
76
  position: absolute;
72
- top: 50%;
73
- left: 50%;
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-colors-gray-heading);
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
- line-height: var(--rel-lineHeights-xs);
91
+ color: var(--rel-text-placeholder, #a9a9a9);
123
92
  }
124
93
 
125
- .radio-supporting.error-text {
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.isChecked(option.value);
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
- option.disabled ? "disabled" : "",
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="${option.disabled}"
164
- @change="${() => !option.disabled && this.onChange(option.value)}" />
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((option) => this.renderOption(option))}
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
@@ -0,0 +1,3 @@
1
+ export * from "./rel-resizable-group";
2
+ export * from "./rel-resizable-panel";
3
+ export * from "./rel-resizable-handle";