@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
@@ -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-colors-gray-heading);
58
- font-family: var(--rel-fontFamilies-primary);
59
- outline: none;
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-colors-gray-bg);
73
+ background: var(--rel-surface-surface, #f5f5f5);
69
74
  }
70
75
 
71
76
  /* Active */
72
77
  .segment.active {
73
- background: var(--rel-colors-black);
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-colors-black);
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-colors-gray-bg);
88
- color: var(--rel-colors-gray-placeholder);
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='%23666' d='M6 9L1 4h10z'/%3E%3C/svg%3E");
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-colors-gray-heading);
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-black);
96
- box-shadow: 0 0 0 3px rgba(0, 0, 0, 0.1);
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 rgba(213, 0, 0, 0.1);
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-colors-gray-bg);
110
- border-color: var(--rel-colors-gray-border);
111
- color: var(--rel-colors-gray-placeholder);
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