@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
|
@@ -48,15 +48,20 @@ export class RelSegmentedButton extends LitElement {
|
|
|
48
48
|
|
|
49
49
|
/* Base segment styling */
|
|
50
50
|
.segment {
|
|
51
|
-
background: var(--rel-colors-white);
|
|
51
|
+
background: var(--rel-colors-white, #fff);
|
|
52
52
|
border: none;
|
|
53
53
|
cursor: pointer;
|
|
54
|
-
font-weight: var(--rel-fontWeights-medium);
|
|
55
|
-
border-right: 2px solid var(--rel-colors-gray-border);
|
|
54
|
+
font-weight: var(--rel-fontWeights-medium, 500);
|
|
55
|
+
border-right: 2px solid var(--rel-colors-gray-border, #ddd);
|
|
56
56
|
transition: all 0.2s ease-in-out;
|
|
57
|
-
color: var(--rel-
|
|
58
|
-
font-family: var(--rel-fontFamilies-primary);
|
|
59
|
-
|
|
57
|
+
color: var(--rel-text-heading, #2b2b2b);
|
|
58
|
+
font-family: var(--rel-fontFamilies-primary, sans-serif);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.segment:focus-visible {
|
|
62
|
+
outline: 2px solid var(--rel-border-info, #0091ea);
|
|
63
|
+
outline-offset: -2px;
|
|
64
|
+
z-index: 1;
|
|
60
65
|
}
|
|
61
66
|
|
|
62
67
|
.segment:last-child {
|
|
@@ -65,18 +70,18 @@ export class RelSegmentedButton extends LitElement {
|
|
|
65
70
|
|
|
66
71
|
/* Hover */
|
|
67
72
|
.segment:hover:not(.disabled):not(.active) {
|
|
68
|
-
background: var(--rel-
|
|
73
|
+
background: var(--rel-surface-surface, #f5f5f5);
|
|
69
74
|
}
|
|
70
75
|
|
|
71
76
|
/* Active */
|
|
72
77
|
.segment.active {
|
|
73
|
-
background: var(--rel-
|
|
74
|
-
color: var(--rel-colors-white);
|
|
78
|
+
background: var(--rel-text-heading, #2b2b2b);
|
|
79
|
+
color: var(--rel-colors-white, #fff);
|
|
75
80
|
}
|
|
76
81
|
|
|
77
82
|
.segment.active:hover:not(.disabled) {
|
|
78
|
-
background: var(--rel-
|
|
79
|
-
color: var(--rel-colors-white);
|
|
83
|
+
background: var(--rel-text-heading, #2b2b2b);
|
|
84
|
+
color: var(--rel-colors-white, #fff);
|
|
80
85
|
}
|
|
81
86
|
|
|
82
87
|
/* Disabled */
|
|
@@ -84,8 +89,8 @@ export class RelSegmentedButton extends LitElement {
|
|
|
84
89
|
.segment:disabled {
|
|
85
90
|
cursor: not-allowed;
|
|
86
91
|
opacity: 0.5;
|
|
87
|
-
background: var(--rel-
|
|
88
|
-
color: var(--rel-
|
|
92
|
+
background: var(--rel-surface-surface, #f5f5f5);
|
|
93
|
+
color: var(--rel-text-disabled, #9e9e9e);
|
|
89
94
|
pointer-events: none;
|
|
90
95
|
}
|
|
91
96
|
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# rel-select
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
A customizable dropdown select component with support for icons, multiple states, and sizes. Features built-in validation states, supporting text, and comprehensive styling options for form-based interfaces.
|
|
5
|
+
|
|
6
|
+
## Usage
|
|
7
|
+
```html
|
|
8
|
+
<!-- Basic example -->
|
|
9
|
+
<rel-select id="countrySelect" label="Country" selected="USA"></rel-select>
|
|
10
|
+
<script>
|
|
11
|
+
const select = document.getElementById('countrySelect');
|
|
12
|
+
select.options = ['USA', 'Canada', 'Mexico'];
|
|
13
|
+
</script>
|
|
14
|
+
|
|
15
|
+
<!-- Example with common options -->
|
|
16
|
+
<rel-select
|
|
17
|
+
id="emailPreference"
|
|
18
|
+
label="Email Preference"
|
|
19
|
+
selected="Weekly"
|
|
20
|
+
size="medium"
|
|
21
|
+
state="default"
|
|
22
|
+
supportingText="Choose how often you want to receive emails"
|
|
23
|
+
leftIcon="📧">
|
|
24
|
+
</rel-select>
|
|
25
|
+
<script>
|
|
26
|
+
const emailPref = document.getElementById('emailPreference');
|
|
27
|
+
emailPref.options = ['Daily', 'Weekly', 'Monthly', 'Never'];
|
|
28
|
+
</script>
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## API
|
|
32
|
+
|
|
33
|
+
### Attributes/Properties
|
|
34
|
+
| Name | Type | Default | Description |
|
|
35
|
+
|------|------|---------|-------------|
|
|
36
|
+
| `label` | `string` | `""` | Label text displayed above the select |
|
|
37
|
+
| `options` | `string[]` | `[]` | Array of option values to display in dropdown |
|
|
38
|
+
| `selected` | `string` | `""` | Currently selected option value |
|
|
39
|
+
| `state` | `"default" \| "error" \| "disabled"` | `"default"` | Visual and interaction state of the select |
|
|
40
|
+
| `supportingText` | `string` | `""` | Helper or error text displayed below the select |
|
|
41
|
+
| `size` | `"small" \| "medium" \| "large"` | `"medium"` | Size variant affecting padding and font size |
|
|
42
|
+
| `border` | `"rounded" \| "sharp"` | `"rounded"` | Border radius style |
|
|
43
|
+
| `leftIcon` | `string` | `""` | Icon or text displayed on the left side |
|
|
44
|
+
| `rightIcon` | `string` | `""` | Icon or text displayed on the right side (before dropdown arrow) |
|
|
45
|
+
|
|
46
|
+
## Events
|
|
47
|
+
| Event | Detail | Description |
|
|
48
|
+
|-------|--------|-------------|
|
|
49
|
+
| `changed` | `{ value: string }` | Fired when the selected value changes |
|
|
50
|
+
|
|
51
|
+
## Slots
|
|
52
|
+
Default slot not used.
|
|
53
|
+
|
|
54
|
+
## CSS Parts
|
|
55
|
+
None exposed.
|
|
56
|
+
|
|
57
|
+
## Tokens / CSS Variables
|
|
58
|
+
|
|
59
|
+
### Semantic Tokens
|
|
60
|
+
- `--rel-fontFamilies-primary` - Font family
|
|
61
|
+
- `--rel-fontSizes-xs`, `--rel-fontSizes-sm`, `--rel-fontSizes-md` - Font sizes for different size variants
|
|
62
|
+
- `--rel-fontWeights-medium` - Font weight for label
|
|
63
|
+
|
|
64
|
+
### Spacing Tokens
|
|
65
|
+
- `--rel-spacing-space-3xs`, `--rel-spacing-space-2xs`, `--rel-spacing-space-xs` - Internal padding
|
|
66
|
+
- `--rel-spacing-space-sm`, `--rel-spacing-space-lg`, `--rel-spacing-space-xl`, `--rel-spacing-space-2xl`, `--rel-spacing-space-3xl` - Padding and icon positioning
|
|
67
|
+
|
|
68
|
+
### Color Tokens
|
|
69
|
+
- `--rel-colors-gray-heading` - Label text color
|
|
70
|
+
- `--rel-colors-gray-primary` - Icon and border hover color
|
|
71
|
+
- `--rel-colors-gray-border` - Default border color
|
|
72
|
+
- `--rel-colors-gray-placeholder` - Supporting text color
|
|
73
|
+
- `--rel-colors-white` - Background color
|
|
74
|
+
- `--rel-colors-primary-500` - Focus border and shadow color
|
|
75
|
+
- `--rel-colors-red-secondary` - Error state border color
|
|
76
|
+
- `--rel-background-error-light` - Error state focus shadow
|
|
77
|
+
- `--rel-surface-surface` - Disabled background
|
|
78
|
+
- `--rel-text-heading` - Select text color
|
|
79
|
+
- `--rel-text-disabled` - Disabled text color
|
|
80
|
+
|
|
81
|
+
### Border Tokens
|
|
82
|
+
- `--rel-borders-radius-border-radius-300` - Rounded border radius
|
|
83
|
+
|
|
84
|
+
## Accessibility
|
|
85
|
+
- Native `<select>` element provides built-in keyboard navigation
|
|
86
|
+
- Focus visible states with clear visual indicators (border color and box shadow)
|
|
87
|
+
- Label properly associated with select for screen readers
|
|
88
|
+
- Disabled state prevents interaction and reduces opacity
|
|
89
|
+
- Error state communicated through color and supporting text
|
|
90
|
+
|
|
91
|
+
### Keyboard Interactions
|
|
92
|
+
- `Space/Enter` - Open dropdown
|
|
93
|
+
- `Arrow Up/Down` - Navigate options
|
|
94
|
+
- `Escape` - Close dropdown
|
|
95
|
+
- `Tab` - Move focus to next element
|
|
96
|
+
|
|
97
|
+
### Focus Behavior
|
|
98
|
+
- Clear focus ring with primary color on keyboard focus
|
|
99
|
+
- Focus state uses box-shadow for visibility
|
|
100
|
+
|
|
101
|
+
## Notes / Edge Cases
|
|
102
|
+
- When `state="disabled"`, the select becomes non-interactive with reduced opacity and cursor indication
|
|
103
|
+
- Empty `selected` value shows placeholder text "Select Option" which is hidden from the dropdown list
|
|
104
|
+
- Icons (left/right) adjust internal padding automatically to accommodate icon space
|
|
105
|
+
- The native dropdown arrow is always visible on the right side, custom rightIcon appears before it
|
|
106
|
+
- In error state, supporting text is styled with error color for visual consistency
|
|
107
|
+
- Options array is rendered as-is; complex objects not supported (use string values only)
|
|
@@ -28,7 +28,7 @@ export class RelSelect extends LitElement {
|
|
|
28
28
|
static styles = css`
|
|
29
29
|
:host {
|
|
30
30
|
display: block;
|
|
31
|
-
font-family: var(--rel-fontFamilies-primary);
|
|
31
|
+
font-family: var(--rel-fontFamilies-primary, sans-serif);
|
|
32
32
|
width: 100%;
|
|
33
33
|
}
|
|
34
34
|
|
|
@@ -74,26 +74,26 @@ export class RelSelect extends LitElement {
|
|
|
74
74
|
select {
|
|
75
75
|
flex: 1;
|
|
76
76
|
appearance: none;
|
|
77
|
-
border: 1px solid var(--rel-colors-gray-border);
|
|
78
|
-
background-color: var(--rel-colors-white);
|
|
79
|
-
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='
|
|
77
|
+
border: 1px solid var(--rel-colors-gray-border, #ddd);
|
|
78
|
+
background-color: var(--rel-colors-white, #fff);
|
|
79
|
+
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='currentColor' d='M6 9L1 4h10z'/%3E%3C/svg%3E");
|
|
80
80
|
background-repeat: no-repeat;
|
|
81
81
|
background-position: right 12px center;
|
|
82
|
-
font-family: var(--rel-fontFamilies-primary);
|
|
82
|
+
font-family: var(--rel-fontFamilies-primary, sans-serif);
|
|
83
83
|
cursor: pointer;
|
|
84
84
|
transition: all 0.2s ease-in-out;
|
|
85
|
-
color: var(--rel-
|
|
85
|
+
color: var(--rel-text-heading, #2b2b2b);
|
|
86
86
|
width: 100%;
|
|
87
87
|
outline: none;
|
|
88
88
|
}
|
|
89
89
|
|
|
90
90
|
select:hover:not(:disabled) {
|
|
91
|
-
border-color: var(--rel-colors-gray-primary);
|
|
91
|
+
border-color: var(--rel-colors-gray-primary, #333);
|
|
92
92
|
}
|
|
93
93
|
|
|
94
|
-
select:focus:not(:disabled) {
|
|
95
|
-
border-color: var(--rel-colors-
|
|
96
|
-
box-shadow: 0 0 0
|
|
94
|
+
select:focus-visible:not(:disabled) {
|
|
95
|
+
border-color: var(--rel-colors-primary-500, #0091ea);
|
|
96
|
+
box-shadow: 0 0 0 2px var(--rel-colors-primary-500, #0091ea);
|
|
97
97
|
}
|
|
98
98
|
|
|
99
99
|
/* States */
|
|
@@ -102,13 +102,13 @@ export class RelSelect extends LitElement {
|
|
|
102
102
|
}
|
|
103
103
|
|
|
104
104
|
select.error:focus {
|
|
105
|
-
box-shadow: 0 0 0 3px
|
|
105
|
+
box-shadow: 0 0 0 3px var(--rel-background-error-light);
|
|
106
106
|
}
|
|
107
107
|
|
|
108
108
|
select:disabled {
|
|
109
|
-
background-color: var(--rel-
|
|
110
|
-
border-color: var(--rel-colors-gray-border);
|
|
111
|
-
color: var(--rel-
|
|
109
|
+
background-color: var(--rel-surface-surface, #f5f5f5);
|
|
110
|
+
border-color: var(--rel-colors-gray-border, #ddd);
|
|
111
|
+
color: var(--rel-text-disabled, #9e9e9e);
|
|
112
112
|
cursor: not-allowed;
|
|
113
113
|
opacity: 0.6;
|
|
114
114
|
}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
# rel-sheet
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
A slide-in panel component system with multiple helper components. Features four slide directions (top, right, bottom, left), configurable sizes, modal/non-modal modes, focus trapping, scroll locking, and optional overlay. Built with composition: `rel-sheet` (controller), `rel-sheet-trigger` (opener), `rel-sheet-content` (panel), and layout helpers (`rel-sheet-header`, `rel-sheet-footer`, `rel-sheet-title`, `rel-sheet-description`, `rel-sheet-close`).
|
|
5
|
+
|
|
6
|
+
## Components
|
|
7
|
+
- **`<rel-sheet>`**: Root wrapper that manages open state
|
|
8
|
+
- **`<rel-sheet-trigger>`**: Button to open the sheet
|
|
9
|
+
- **`<rel-sheet-content>`**: Slide-in panel with all visual elements
|
|
10
|
+
- **`<rel-sheet-header>`**: Header layout helper with bottom border
|
|
11
|
+
- **`<rel-sheet-footer>`**: Footer layout helper with top border
|
|
12
|
+
- **`<rel-sheet-title>`**: Title text (auto-linked to `aria-labelledby`)
|
|
13
|
+
- **`<rel-sheet-description>`**: Description text (auto-linked to `aria-describedby`)
|
|
14
|
+
- **`<rel-sheet-close>`**: Custom close button wrapper
|
|
15
|
+
|
|
16
|
+
## Usage
|
|
17
|
+
```html
|
|
18
|
+
<!-- Basic right-side sheet -->
|
|
19
|
+
<rel-sheet>
|
|
20
|
+
<rel-sheet-trigger>
|
|
21
|
+
<button>Open Settings</button>
|
|
22
|
+
</rel-sheet-trigger>
|
|
23
|
+
|
|
24
|
+
<rel-sheet-content>
|
|
25
|
+
<rel-sheet-header>
|
|
26
|
+
<rel-sheet-title>Settings</rel-sheet-title>
|
|
27
|
+
<rel-sheet-description>Configure your preferences</rel-sheet-description>
|
|
28
|
+
</rel-sheet-header>
|
|
29
|
+
|
|
30
|
+
<p>Sheet content goes here...</p>
|
|
31
|
+
|
|
32
|
+
<rel-sheet-footer>
|
|
33
|
+
<rel-sheet-close>
|
|
34
|
+
<button>Cancel</button>
|
|
35
|
+
</rel-sheet-close>
|
|
36
|
+
<button>Save</button>
|
|
37
|
+
</rel-sheet-footer>
|
|
38
|
+
</rel-sheet-content>
|
|
39
|
+
</rel-sheet>
|
|
40
|
+
|
|
41
|
+
<!-- Left-side sheet, large size -->
|
|
42
|
+
<rel-sheet>
|
|
43
|
+
<rel-sheet-trigger>
|
|
44
|
+
<button>Open Menu</button>
|
|
45
|
+
</rel-sheet-trigger>
|
|
46
|
+
|
|
47
|
+
<rel-sheet-content side="left" size="lg">
|
|
48
|
+
<nav>
|
|
49
|
+
<a href="#home">Home</a>
|
|
50
|
+
<a href="#about">About</a>
|
|
51
|
+
<a href="#contact">Contact</a>
|
|
52
|
+
</nav>
|
|
53
|
+
</rel-sheet-content>
|
|
54
|
+
</rel-sheet>
|
|
55
|
+
|
|
56
|
+
<!-- Bottom sheet without overlay -->
|
|
57
|
+
<rel-sheet defaultopen>
|
|
58
|
+
<rel-sheet-trigger>
|
|
59
|
+
<button>Toggle Bottom Sheet</button>
|
|
60
|
+
</rel-sheet-trigger>
|
|
61
|
+
|
|
62
|
+
<rel-sheet-content side="bottom" hide-overlay>
|
|
63
|
+
<p>Bottom sheet content</p>
|
|
64
|
+
</rel-sheet-content>
|
|
65
|
+
</rel-sheet>
|
|
66
|
+
|
|
67
|
+
<!-- Controlled state -->
|
|
68
|
+
<rel-sheet id="controlledSheet" open>
|
|
69
|
+
<rel-sheet-trigger>
|
|
70
|
+
<button>Open</button>
|
|
71
|
+
</rel-sheet-trigger>
|
|
72
|
+
|
|
73
|
+
<rel-sheet-content>
|
|
74
|
+
<p>This sheet is controlled externally</p>
|
|
75
|
+
</rel-sheet-content>
|
|
76
|
+
</rel-sheet>
|
|
77
|
+
<script>
|
|
78
|
+
const sheet = document.getElementById('controlledSheet');
|
|
79
|
+
sheet.addEventListener('rel-open-change', (e) => {
|
|
80
|
+
console.log('Sheet open:', e.detail.open);
|
|
81
|
+
console.log('Reason:', e.detail.reason);
|
|
82
|
+
});
|
|
83
|
+
</script>
|
|
84
|
+
|
|
85
|
+
<!-- Without built-in close button -->
|
|
86
|
+
<rel-sheet>
|
|
87
|
+
<rel-sheet-trigger>
|
|
88
|
+
<button>Open</button>
|
|
89
|
+
</rel-sheet-trigger>
|
|
90
|
+
|
|
91
|
+
<rel-sheet-content show-close="false">
|
|
92
|
+
<p>Custom close handling</p>
|
|
93
|
+
<rel-sheet-close>
|
|
94
|
+
<button>Close Me</button>
|
|
95
|
+
</rel-sheet-close>
|
|
96
|
+
</rel-sheet-content>
|
|
97
|
+
</rel-sheet>
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## API
|
|
101
|
+
|
|
102
|
+
### rel-sheet Properties
|
|
103
|
+
| Name | Type | Default | Description |
|
|
104
|
+
|------|------|---------|-------------|
|
|
105
|
+
| `open` (reflected) | `boolean?` | `undefined` | Controlled open state |
|
|
106
|
+
| `defaultopen` | `boolean` | `false` | Default open state (uncontrolled) |
|
|
107
|
+
| `disabled` | `boolean` | `false` | Disable trigger |
|
|
108
|
+
| `modal` | `boolean` | `true` | Enable modal behavior (focus trap) |
|
|
109
|
+
|
|
110
|
+
### rel-sheet-content Properties
|
|
111
|
+
| Name | Type | Default | Description |
|
|
112
|
+
|------|------|---------|-------------|
|
|
113
|
+
| `side` | `"top" \| "right" \| "bottom" \| "left"` | `"right"` | Which side the sheet slides from |
|
|
114
|
+
| `size` | `"sm" \| "md" \| "lg" \| "xl"` | `"md"` | Sheet width/height (320/420/540/640px) |
|
|
115
|
+
| `hide-overlay` | `boolean` | `false` | Hide the backdrop overlay |
|
|
116
|
+
| `close-on-overlay` | `boolean` | `true` | Allow closing by clicking overlay |
|
|
117
|
+
| `show-close` | `boolean` | `true` | Show built-in close button (✕) |
|
|
118
|
+
|
|
119
|
+
## Events
|
|
120
|
+
| Event | Detail | Description |
|
|
121
|
+
|-------|--------|-------------|
|
|
122
|
+
| `rel-open-change` | `{ open, reason }` | Fired when sheet opens/closes |
|
|
123
|
+
|
|
124
|
+
### Close Reasons
|
|
125
|
+
- `"trigger"`: Toggled via trigger button
|
|
126
|
+
- `"close"`: Closed via close button
|
|
127
|
+
- `"overlay"`: Closed by clicking overlay
|
|
128
|
+
- `"escape"`: Closed via Escape key
|
|
129
|
+
- `"api"`: Changed via `setOpen()` method
|
|
130
|
+
|
|
131
|
+
## Methods
|
|
132
|
+
|
|
133
|
+
### Sheet Methods
|
|
134
|
+
```typescript
|
|
135
|
+
sheet.setOpen(nextOpen: boolean, reason?: string): void
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## Slots
|
|
139
|
+
| Slot | Component | Description |
|
|
140
|
+
|------|-----------|-------------|
|
|
141
|
+
| (default) | `rel-sheet` | Trigger and content elements |
|
|
142
|
+
| (default) | `rel-sheet-trigger` | Trigger button/element |
|
|
143
|
+
| (default) | `rel-sheet-content` | Panel content |
|
|
144
|
+
| (default) | Layout helpers | Content within headers/footers/titles |
|
|
145
|
+
|
|
146
|
+
## CSS Parts
|
|
147
|
+
| Part | Description |
|
|
148
|
+
|------|-------------|
|
|
149
|
+
| `overlay` | Backdrop overlay element |
|
|
150
|
+
| `panel` | Main panel container |
|
|
151
|
+
|
|
152
|
+
## Tokens / CSS Variables
|
|
153
|
+
|
|
154
|
+
### Size Tokens (defined on `<rel-sheet-content>`)
|
|
155
|
+
- `--sheet-size-sm`: `320px`
|
|
156
|
+
- `--sheet-size-md`: `420px`
|
|
157
|
+
- `--sheet-size-lg`: `540px`
|
|
158
|
+
- `--sheet-size-xl`: `640px`
|
|
159
|
+
|
|
160
|
+
### Transition Tokens
|
|
161
|
+
- `--sheet-transition-duration`: `0.3s`
|
|
162
|
+
- `--sheet-transition-timing`: `cubic-bezier(0.32, 0.72, 0, 1)`
|
|
163
|
+
|
|
164
|
+
### Color Tokens
|
|
165
|
+
- `--rel-colors-white` - Panel background
|
|
166
|
+
- `--rel-colors-gray-heading` - Title and close button color
|
|
167
|
+
- `--rel-colors-gray-body` - Description color
|
|
168
|
+
- `--rel-colors-gray-surface` - Close button hover background
|
|
169
|
+
- `--rel-colors-gray-border` - Header/footer borders
|
|
170
|
+
- `--rel-overlay-scrim` - Overlay background
|
|
171
|
+
- `--rel-colors-primary-500` - Close button focus outline
|
|
172
|
+
|
|
173
|
+
### Shadow Tokens
|
|
174
|
+
- `--rel-shadows-shadow-500` - Panel shadow
|
|
175
|
+
|
|
176
|
+
### Border Tokens
|
|
177
|
+
- `--rel-borders-radius-border-radius-300` - Panel border radius (top corners for bottom, etc.)
|
|
178
|
+
|
|
179
|
+
### Spacing Tokens
|
|
180
|
+
- `--rel-spacing-space-lg` - Panel content padding
|
|
181
|
+
- `--rel-spacing-space-md` - Header/footer padding, close button positioning
|
|
182
|
+
- `--rel-spacing-space-xs` - Close button padding
|
|
183
|
+
|
|
184
|
+
## Accessibility
|
|
185
|
+
- Panel uses `role="dialog"` and `aria-modal`
|
|
186
|
+
- Auto-links `aria-labelledby` to `<rel-sheet-title>`
|
|
187
|
+
- Auto-links `aria-describedby` to `<rel-sheet-description>`
|
|
188
|
+
- Focus trap in modal mode
|
|
189
|
+
- Escape key closes sheet
|
|
190
|
+
- Restores focus to trigger on close
|
|
191
|
+
|
|
192
|
+
### Keyboard Interactions
|
|
193
|
+
| Key | Action |
|
|
194
|
+
|-----|--------|
|
|
195
|
+
| `Escape` | Close sheet |
|
|
196
|
+
| `Tab` | Focus trap within sheet (modal mode only) |
|
|
197
|
+
|
|
198
|
+
### Focus Behavior
|
|
199
|
+
- On open, focuses first focusable element (or panel if none found)
|
|
200
|
+
- Focus trapped within panel in modal mode
|
|
201
|
+
- On close, restores focus to trigger button
|
|
202
|
+
|
|
203
|
+
## Notes / Edge Cases
|
|
204
|
+
- **Side positioning and transforms**:
|
|
205
|
+
- **right**: Slides in from right edge, `translateX(100%)` to `translateX(0)`
|
|
206
|
+
- **left**: Slides in from left edge, `translateX(-100%)` to `translateX(0)`
|
|
207
|
+
- **bottom**: Slides in from bottom, `translateY(100%)` to `translateY(0)`
|
|
208
|
+
- **top**: Slides in from top, `translateY(-100%)` to `translateY(0)`
|
|
209
|
+
|
|
210
|
+
- **Size constraints**:
|
|
211
|
+
- Left/right: `max-width: 90vw`
|
|
212
|
+
- Top/bottom: `max-height: 80vh`
|
|
213
|
+
|
|
214
|
+
- **Scroll locking**: Body scroll is locked when sheet is open (with scrollbar width compensation)
|
|
215
|
+
- **Close button position**: Top-right by default, but top-left for `side="left"`
|
|
216
|
+
- **Reduced motion**: Transitions disabled, panel hidden via `display: none` instead of transform
|
|
217
|
+
- The sheet root uses `display: contents`
|
|
218
|
+
- Panel is overlaid with `z-index: 1000`, fixed position
|
|
219
|
+
- Overlay detection for `aria-labelledby`/`aria-describedby` happens automatically based on slotted `<rel-sheet-title>` and `<rel-sheet-description>` elements
|
|
220
|
+
- Built-in close button is "✕" character at font-size 20px
|
|
221
|
+
|
|
222
|
+
### Controlled vs Uncontrolled
|
|
223
|
+
- If `open` prop is set, the sheet is controlled and won't manage its own state
|
|
224
|
+
- Use `rel-open-change` event to sync controlled state
|