@reliability-design/web 1.0.6 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/dist/components/rel-accordion/rel-accordion.ts +20 -31
  2. package/dist/components/rel-alert/rel-alert.ts +81 -11
  3. package/dist/components/rel-avatar/rel-avatar.ts +6 -3
  4. package/dist/components/rel-badge/rel-badge.ts +8 -3
  5. package/dist/components/rel-breadcrumb/rel-breadcrumb.ts +6 -6
  6. package/dist/components/rel-button/rel-button.ts +118 -16
  7. package/dist/components/rel-calendar/rel-calendar.ts +16 -9
  8. package/dist/components/rel-card/rel-card.ts +9 -17
  9. package/dist/components/rel-cardmedia/rel-cardmedia.ts +20 -23
  10. package/dist/components/rel-carousel/rel-carousel.ts +596 -469
  11. package/dist/components/rel-checkbox/rel-checkbox.ts +98 -15
  12. package/dist/components/rel-chip/rel-chip.ts +291 -186
  13. package/dist/components/rel-container/rel-container.ts +2 -2
  14. package/dist/components/rel-date-picker/rel-date-picker.ts +23 -19
  15. package/dist/components/rel-divider/rel-divider.ts +12 -3
  16. package/dist/components/rel-drawer/rel-drawer-footer.ts +27 -0
  17. package/dist/components/rel-drawer/rel-drawer.ts +57 -113
  18. package/dist/components/rel-kbd/rel-kbd.ts +94 -118
  19. package/dist/components/rel-layout/rel-layout.ts +49 -58
  20. package/dist/components/rel-menu/rel-menu.ts +359 -327
  21. package/dist/components/rel-menubar/rel-menubar-menu.css +3 -0
  22. package/dist/components/rel-menubar/rel-menubar-menu.ts +2 -1
  23. package/dist/components/rel-menubar/rel-menubar.ts +602 -576
  24. package/dist/components/rel-nav-menu/rel-nav-menu-item.ts +240 -143
  25. package/dist/components/rel-nav-menu/rel-nav-menu.ts +227 -331
  26. package/dist/components/rel-navbar/rel-navbar.ts +13 -0
  27. package/dist/components/rel-otp/rel-otp.ts +22 -25
  28. package/dist/components/rel-pagination/rel-pagination.ts +112 -63
  29. package/dist/components/rel-popover/rel-popover-content.ts +6 -5
  30. package/dist/components/rel-popover/rel-popover.ts +42 -20
  31. package/dist/components/rel-progress/rel-progress.ts +10 -9
  32. package/dist/components/rel-radio/rel-radio.ts +228 -155
  33. package/dist/components/rel-range-picker/rel-range-picker.css +349 -0
  34. package/dist/components/rel-range-picker/rel-range-picker.ts +1079 -0
  35. package/dist/components/rel-resizable/rel-resizable-handle.ts +12 -15
  36. package/dist/components/rel-segmented-button/rel-segmented-button.ts +41 -20
  37. package/dist/components/rel-select/rel-select.ts +112 -27
  38. package/dist/components/rel-sheet/rel-sheet.ts +362 -683
  39. package/dist/components/rel-sidebar/rel-sidebar.ts +13 -5
  40. package/dist/components/rel-slider/rel-slider.ts +74 -29
  41. package/dist/components/rel-snackbar/rel-snackbar.ts +67 -37
  42. package/dist/components/rel-stepper/rel-stepper.ts +43 -31
  43. package/dist/components/rel-switch/rel-switch.ts +26 -12
  44. package/dist/components/rel-tab/rel-tab.ts +57 -37
  45. package/dist/components/rel-table/rel-table-body.ts +5 -0
  46. package/dist/components/rel-table/rel-table-caption.ts +6 -1
  47. package/dist/components/rel-table/rel-table-cell.ts +42 -49
  48. package/dist/components/rel-table/rel-table-footer.ts +5 -0
  49. package/dist/components/rel-table/rel-table-head.ts +13 -1
  50. package/dist/components/rel-table/rel-table-header.ts +5 -0
  51. package/dist/components/rel-table/rel-table-row.ts +7 -3
  52. package/dist/components/rel-table/rel-table.ts +8 -2
  53. package/dist/components/rel-textfield/rel-textfield.ts +153 -44
  54. package/dist/components/rel-toast/rel-toast.ts +56 -22
  55. package/dist/components/rel-tooltip/rel-tooltip.ts +52 -9
  56. package/dist/components/rel-topbar/rel-topbar-actions.ts +24 -0
  57. package/dist/components/rel-topbar/rel-topbar-brand.ts +47 -0
  58. package/dist/components/rel-topbar/rel-topbar-dropdown-item.ts +63 -0
  59. package/dist/components/rel-topbar/rel-topbar-dropdown.ts +28 -0
  60. package/dist/components/rel-topbar/rel-topbar-item.ts +320 -0
  61. package/dist/components/rel-topbar/rel-topbar-mobile-panel.ts +24 -0
  62. package/dist/components/rel-topbar/rel-topbar-profile.ts +222 -0
  63. package/dist/components/rel-topbar/rel-topbar-utilities.ts +24 -0
  64. package/dist/components/rel-topbar/rel-topbar.ts +438 -0
  65. package/dist/index.d.mts +375 -411
  66. package/dist/index.d.ts +375 -411
  67. package/dist/index.js +7587 -7980
  68. package/dist/index.js.map +1 -1
  69. package/dist/index.mjs +7647 -8023
  70. package/dist/index.mjs.map +1 -1
  71. package/dist/rel-menubar-menu-BEEQDAXW.css +3 -0
  72. package/dist/styles/vars-v2.css +525 -0
  73. package/dist/styles/vars.css +79 -27
  74. package/dist/{vars-ITL2K3KO.css → vars-I2PC74XD.css} +79 -27
  75. package/dist/vars-v2-VMGWTFJZ.css +525 -0
  76. package/package.json +3 -1
  77. package/dist/components/rel-quote-page/README.md +0 -166
  78. package/dist/components/rel-quote-page/rel-quote-page.ts +0 -816
@@ -9,7 +9,7 @@ interface CalendarDay {
9
9
  isSelected: boolean;
10
10
  isDisabled: boolean;
11
11
  }
12
-
12
+
13
13
  @customElement("rel-date-picker")
14
14
  export class RelDatePicker extends LitElement {
15
15
  @property({ type: String, reflect: true }) value: string | null = null;
@@ -47,6 +47,10 @@ export class RelDatePicker extends LitElement {
47
47
 
48
48
  :host([disabled]) {
49
49
  opacity: 0.6;
50
+ cursor: not-allowed;
51
+ }
52
+
53
+ :host([disabled]) * {
50
54
  pointer-events: none;
51
55
  }
52
56
 
@@ -70,7 +74,7 @@ export class RelDatePicker extends LitElement {
70
74
  justify-content: space-between;
71
75
  gap: var(--rel-spacing-space-xs);
72
76
  padding: var(--rel-spacing-space-sm) var(--rel-spacing-space-md);
73
- background: var(--rel-colors-white);
77
+ background: var(--rel-color-bg-primary);
74
78
  border: 1px solid var(--rel-border-default);
75
79
  border-radius: var(--rel-borders-radius-border-radius-200);
76
80
  font-family: var(--rel-fontFamilies-primary);
@@ -82,13 +86,13 @@ export class RelDatePicker extends LitElement {
82
86
  }
83
87
 
84
88
  .trigger-button:hover:not(:disabled) {
85
- border-color: var(--rel-colors-gray-heading);
89
+ border-color: var(--rel-color-border-strong);
86
90
  }
87
91
 
88
92
  .trigger-button:focus-visible {
89
- outline: 2px solid var(--rel-colors-blue-primary);
93
+ outline: 2px solid var(--rel-color-border-focus);
90
94
  outline-offset: 2px;
91
- border-color: var(--rel-colors-blue-primary);
95
+ border-color: var(--rel-color-border-focus);
92
96
  }
93
97
 
94
98
  .trigger-button:disabled {
@@ -116,7 +120,7 @@ export class RelDatePicker extends LitElement {
116
120
  border: none;
117
121
  padding: var(--rel-spacing-space-3xs);
118
122
  cursor: pointer;
119
- color: var(--rel-colors-gray-placeholder);
123
+ color: var(--rel-color-text-placeholder);
120
124
  display: flex;
121
125
  align-items: center;
122
126
  justify-content: center;
@@ -126,7 +130,7 @@ export class RelDatePicker extends LitElement {
126
130
 
127
131
  .icon-button:hover {
128
132
  background: var(--rel-surface-secondary);
129
- color: var(--rel-colors-gray-heading);
133
+ color: var(--rel-color-text-primary);
130
134
  }
131
135
 
132
136
  .icon-button svg {
@@ -139,7 +143,7 @@ export class RelDatePicker extends LitElement {
139
143
  top: calc(100% + 4px);
140
144
  left: 0;
141
145
  z-index: 1000;
142
- background: var(--rel-colors-white);
146
+ background: var(--rel-color-bg-primary);
143
147
  border: 1px solid var(--rel-border-default);
144
148
  border-radius: var(--rel-borders-radius-border-radius-200);
145
149
  box-shadow: var(--rel-shadows-shadow-300);
@@ -170,7 +174,7 @@ export class RelDatePicker extends LitElement {
170
174
  align-items: center;
171
175
  justify-content: center;
172
176
  cursor: pointer;
173
- color: var(--rel-colors-gray-primary);
177
+ color: var(--rel-color-text-primary);
174
178
  transition: background-color 0.15s ease;
175
179
  }
176
180
 
@@ -179,7 +183,7 @@ export class RelDatePicker extends LitElement {
179
183
  }
180
184
 
181
185
  .nav-button:focus-visible {
182
- outline: 2px solid var(--rel-colors-blue-primary);
186
+ outline: 2px solid var(--rel-color-border-focus);
183
187
  outline-offset: 2px;
184
188
  }
185
189
 
@@ -191,7 +195,7 @@ export class RelDatePicker extends LitElement {
191
195
  .dropdown-trigger {
192
196
  width: 100%;
193
197
  padding: var(--rel-spacing-space-xs) var(--rel-spacing-space-sm);
194
- background: var(--rel-colors-white);
198
+ background: var(--rel-color-bg-primary);
195
199
  border: 1px solid var(--rel-border-default);
196
200
  border-radius: var(--rel-borders-radius-border-radius-200);
197
201
  font-family: var(--rel-fontFamilies-primary);
@@ -208,7 +212,7 @@ export class RelDatePicker extends LitElement {
208
212
  }
209
213
 
210
214
  .dropdown-trigger:focus-visible {
211
- outline: 2px solid var(--rel-colors-blue-primary);
215
+ outline: 2px solid var(--rel-color-border-focus);
212
216
  outline-offset: 2px;
213
217
  }
214
218
 
@@ -218,7 +222,7 @@ export class RelDatePicker extends LitElement {
218
222
  left: 0;
219
223
  right: 0;
220
224
  z-index: 10;
221
- background: var(--rel-colors-white);
225
+ background: var(--rel-color-bg-primary);
222
226
  border: 1px solid var(--rel-border-default);
223
227
  border-radius: var(--rel-borders-radius-border-radius-200);
224
228
  box-shadow: var(--rel-shadows-shadow-200);
@@ -244,8 +248,8 @@ export class RelDatePicker extends LitElement {
244
248
  }
245
249
 
246
250
  .dropdown-item.selected {
247
- background: var(--rel-colors-blue-bg);
248
- color: var(--rel-colors-blue-primary);
251
+ background: var(--rel-background-info);
252
+ color: var(--rel-text-info);
249
253
  font-weight: var(--rel-fontWeights-semibold);
250
254
  }
251
255
 
@@ -260,7 +264,7 @@ export class RelDatePicker extends LitElement {
260
264
  text-align: center;
261
265
  font-size: var(--rel-fontSizes-xs);
262
266
  font-weight: var(--rel-fontWeights-semibold);
263
- color: var(--rel-colors-gray-placeholder);
267
+ color: var(--rel-color-text-placeholder);
264
268
  padding: var(--rel-spacing-space-xs);
265
269
  text-transform: uppercase;
266
270
  }
@@ -290,18 +294,18 @@ export class RelDatePicker extends LitElement {
290
294
  }
291
295
 
292
296
  .day-button:focus-visible {
293
- outline: 2px solid var(--rel-colors-blue-primary);
297
+ outline: 2px solid var(--rel-color-border-focus);
294
298
  outline-offset: -2px;
295
299
  z-index: 1;
296
300
  }
297
301
 
298
302
  .day-button.today:not(.selected) {
299
- border: 2px solid var(--rel-colors-blue-primary);
303
+ border: 2px solid var(--rel-colors-green-primary);
300
304
  }
301
305
 
302
306
  .day-button.selected {
303
307
  background: var(--rel-colors-green-primary);
304
- color: var(--rel-colors-black);
308
+ color: var(--rel-color-text-inverse);
305
309
  font-weight: var(--rel-fontWeights-semibold);
306
310
  }
307
311
 
@@ -15,27 +15,36 @@
15
15
  display: flex;
16
16
  background: transparent;
17
17
  font-family: var(--rel-fontFamilies-primary);
18
- color: var(--rel-colors-gray-primary);
18
+ color: var(--rel-color-text-primary);
19
19
  }
20
20
 
21
21
  /* Horizontal */
22
22
  .rel-divider.horizontal {
23
23
  width: 100%;
24
24
  height: var(--rel-borders-width-stroke-100);
25
- background-color: var(--rel-colors-gray-border);
25
+ background-color: var(--rel-color-border-divider);
26
26
  margin: var(--rel-spacing-space-md) 0;
27
27
  }
28
28
 
29
29
  /* Vertical */
30
30
  .rel-divider.vertical {
31
31
  width: var(--rel-borders-width-stroke-100);
32
- background-color: var(--rel-colors-gray-border);
32
+ background-color: var(--rel-color-border-divider);
33
33
  margin: 0 var(--rel-spacing-space-md);
34
34
  align-self: stretch;
35
35
  height: 100%;
36
36
  }
37
37
  `;
38
38
 
39
+ connectedCallback() {
40
+ super.connectedCallback();
41
+ this.setAttribute("role", "separator");
42
+ }
43
+
44
+ updated() {
45
+ this.setAttribute("aria-orientation", this.orientation ?? "horizontal");
46
+ }
47
+
39
48
  render() {
40
49
  return html`
41
50
  <div class="rel-divider ${this.orientation}" role="separator"></div>
@@ -0,0 +1,27 @@
1
+ import { LitElement, html, css } from "lit";
2
+ import { customElement } from "lit/decorators.js";
3
+
4
+ @customElement("rel-drawer-footer")
5
+ export class RelDrawerFooter extends LitElement {
6
+ static styles = css`
7
+ .drawer-footer {
8
+ display: flex;
9
+ justify-content: flex-end;
10
+ gap: var(--rel-spacing-space-xs);
11
+ }
12
+ `;
13
+
14
+ render() {
15
+ return html`
16
+ <div class="drawer-footer">
17
+ <slot></slot>
18
+ </div>
19
+ `;
20
+ }
21
+ }
22
+
23
+ declare global {
24
+ interface HTMLElementTagNameMap {
25
+ "rel-drawer-footer": RelDrawerFooter;
26
+ }
27
+ }
@@ -1,7 +1,9 @@
1
1
  import { LitElement, html, css } from "lit";
2
2
  import { customElement, property, state, query } from "lit/decorators.js";
3
+ import "@reliability-design/icons/rel-icon";
4
+ import "./rel-drawer-footer";
3
5
 
4
- export type DrawerSide = "bottom" | "left" | "right" | "top";
6
+ export type DrawerSide = "bottom" | "left" | "right";
5
7
  export type DrawerCloseReason = "backdrop" | "escape" | "drag" | "programmatic";
6
8
 
7
9
  @customElement("rel-drawer")
@@ -16,8 +18,9 @@ export class RelDrawer extends LitElement {
16
18
  @property({ type: Boolean }) draggable = true;
17
19
  @property({ type: Number, attribute: "snap-threshold" }) snapThreshold = 0.25;
18
20
  @property({ type: String, attribute: "max-height" }) maxHeight = "80vh";
19
- @property({ type: String }) width = "420px";
20
- @property({ type: Boolean, reflect: true }) disabled = false;
21
+ @property({ type: String }) width = "";
22
+ @property({ type: String }) title: string = "";
23
+ @property({ type: String }) description: string = "";
21
24
 
22
25
  @state() private isDragging = false;
23
26
  @state() private dragOffset = 0;
@@ -37,11 +40,6 @@ export class RelDrawer extends LitElement {
37
40
  --drawer-transition-timing: cubic-bezier(0.32, 0.72, 0, 1);
38
41
  }
39
42
 
40
- :host([disabled]) {
41
- pointer-events: none;
42
- opacity: 0.6;
43
- }
44
-
45
43
  .drawer-container {
46
44
  position: fixed;
47
45
  top: 0;
@@ -69,16 +67,17 @@ export class RelDrawer extends LitElement {
69
67
  }
70
68
 
71
69
  .drawer-container.open .overlay {
72
- opacity: 1;
70
+ opacity: var(--rel-drawer-scrim-opacity, 1);
73
71
  }
74
72
 
75
73
  /* Panel base */
76
74
  .panel {
77
75
  position: absolute;
78
- background: var(--rel-colors-white);
76
+ background: var(--rel-color-bg-primary);
79
77
  box-shadow: var(--rel-shadows-shadow-500);
80
78
  display: flex;
81
79
  flex-direction: column;
80
+ overflow: hidden;
82
81
  outline: none;
83
82
  font-family: var(--rel-fontFamilies-primary);
84
83
  transition: transform var(--drawer-transition-duration) var(--drawer-transition-timing);
@@ -87,16 +86,19 @@ export class RelDrawer extends LitElement {
87
86
  /* Bottom drawer */
88
87
  .panel[data-side="bottom"] {
89
88
  bottom: 0;
90
- left: 0;
91
- right: 0;
92
- max-height: var(--drawer-max-height, 80vh);
93
- border-top-left-radius: var(--rel-borders-radius-border-radius-300);
94
- border-top-right-radius: var(--rel-borders-radius-border-radius-300);
95
- transform: translateY(100%);
89
+ left: 50%;
90
+ right: auto;
91
+ width: var(--drawer-width, clamp(640px, 66vw, 952px));
92
+ height: var(--drawer-height, clamp(360px, 49vh, 600px));
93
+ border-radius: var(--rel-borders-radius-border-radius-200)
94
+ var(--rel-borders-radius-border-radius-200)
95
+ 0
96
+ 0;
97
+ transform: translateX(-50%) translateY(100%);
96
98
  }
97
99
 
98
100
  .drawer-container.open .panel[data-side="bottom"] {
99
- transform: translateY(0);
101
+ transform: translateX(-50%) translateY(0);
100
102
  }
101
103
 
102
104
  /* Left drawer */
@@ -104,10 +106,8 @@ export class RelDrawer extends LitElement {
104
106
  top: 0;
105
107
  left: 0;
106
108
  bottom: 0;
107
- width: var(--drawer-width, 420px);
108
- max-width: 90vw;
109
- border-top-right-radius: var(--rel-borders-radius-border-radius-300);
110
- border-bottom-right-radius: var(--rel-borders-radius-border-radius-300);
109
+ width: var(--drawer-width, clamp(280px, 24vw, 420px));
110
+ border-radius: 0;
111
111
  transform: translateX(-100%);
112
112
  }
113
113
 
@@ -120,10 +120,8 @@ export class RelDrawer extends LitElement {
120
120
  top: 0;
121
121
  right: 0;
122
122
  bottom: 0;
123
- width: var(--drawer-width, 420px);
124
- max-width: 90vw;
125
- border-top-left-radius: var(--rel-borders-radius-border-radius-300);
126
- border-bottom-left-radius: var(--rel-borders-radius-border-radius-300);
123
+ width: var(--drawer-width, clamp(280px, 24vw, 420px));
124
+ border-radius: 0;
127
125
  transform: translateX(100%);
128
126
  }
129
127
 
@@ -131,21 +129,6 @@ export class RelDrawer extends LitElement {
131
129
  transform: translateX(0);
132
130
  }
133
131
 
134
- /* Top drawer */
135
- .panel[data-side="top"] {
136
- top: 0;
137
- left: 0;
138
- right: 0;
139
- max-height: var(--drawer-max-height, 80vh);
140
- border-bottom-left-radius: var(--rel-borders-radius-border-radius-300);
141
- border-bottom-right-radius: var(--rel-borders-radius-border-radius-300);
142
- transform: translateY(-100%);
143
- }
144
-
145
- .drawer-container.open .panel[data-side="top"] {
146
- transform: translateY(0);
147
- }
148
-
149
132
  /* Dragging state */
150
133
  .panel.dragging {
151
134
  transition: none;
@@ -155,13 +138,17 @@ export class RelDrawer extends LitElement {
155
138
  transition: none;
156
139
  }
157
140
 
141
+ .overlay.no-modal {
142
+ display: none !important;
143
+ }
144
+
158
145
  /* Handle */
159
146
  .handle {
160
147
  width: 48px;
161
148
  height: 4px;
162
- background: var(--rel-colors-gray-divider);
149
+ background: var(--rel-color-border-divider);
163
150
  border-radius: var(--rel-borders-radius-border-radius-500);
164
- margin: var(--rel-spacing-space-sm) auto var(--rel-spacing-space-xs);
151
+ margin: var(--rel-spacing-space-xs) auto var(--rel-spacing-space-2xs);
165
152
  cursor: grab;
166
153
  touch-action: none;
167
154
  }
@@ -180,7 +167,7 @@ export class RelDrawer extends LitElement {
180
167
  flex-direction: column;
181
168
  gap: var(--rel-spacing-space-2xs);
182
169
  padding: var(--rel-spacing-space-md) var(--rel-spacing-space-lg);
183
- border-bottom: var(--rel-borders-width-stroke-100) solid var(--rel-colors-gray-border);
170
+ border-bottom: var(--rel-borders-width-stroke-100) solid var(--rel-color-border-default);
184
171
  }
185
172
 
186
173
  .header.empty {
@@ -189,7 +176,7 @@ export class RelDrawer extends LitElement {
189
176
 
190
177
  .header-top {
191
178
  display: flex;
192
- align-items: center;
179
+ align-items: flex-start;
193
180
  justify-content: space-between;
194
181
  }
195
182
 
@@ -215,8 +202,10 @@ export class RelDrawer extends LitElement {
215
202
  display: flex;
216
203
  align-items: center;
217
204
  justify-content: center;
205
+ align-self: flex-start;
206
+ flex-shrink: 0;
218
207
  border-radius: var(--rel-borders-radius-border-radius-100);
219
- color: var(--rel-colors-gray-primary, #333);
208
+ color: var(--rel-color-text-primary);
220
209
  transition: background 0.15s ease;
221
210
  }
222
211
 
@@ -225,11 +214,11 @@ export class RelDrawer extends LitElement {
225
214
  }
226
215
 
227
216
  .close-button:active {
228
- background: var(--rel-colors-gray-divider, #bdbdbd);
217
+ background: var(--rel-color-border-divider);
229
218
  }
230
219
 
231
220
  .close-button:focus-visible {
232
- outline: 2px solid var(--rel-colors-blue-primary, #0091ea);
221
+ outline: 2px solid var(--rel-color-border-focus);
233
222
  outline-offset: 2px;
234
223
  }
235
224
 
@@ -242,12 +231,9 @@ export class RelDrawer extends LitElement {
242
231
 
243
232
  /* Footer */
244
233
  .footer {
234
+ flex-shrink: 0;
245
235
  padding: var(--rel-spacing-space-md) var(--rel-spacing-space-lg);
246
- border-top: var(--rel-borders-width-stroke-100) solid var(--rel-colors-gray-border);
247
- }
248
-
249
- .footer.empty {
250
- display: none;
236
+ border-top: var(--rel-borders-width-stroke-100) solid var(--rel-color-border-default);
251
237
  }
252
238
 
253
239
  /* Reduced motion */
@@ -295,9 +281,10 @@ export class RelDrawer extends LitElement {
295
281
  this.lockScroll();
296
282
 
297
283
  if (this.modal) {
298
- setTimeout(() => {
299
- this.focusPanel();
300
- }, 50);
284
+ this.updateComplete.then(() => {
285
+ const focusTarget = this.shadowRoot?.querySelector<HTMLElement>("[autofocus], .close-button, .panel");
286
+ focusTarget?.focus();
287
+ });
301
288
  }
302
289
 
303
290
  document.addEventListener("keydown", this.handleKeydown);
@@ -316,10 +303,10 @@ export class RelDrawer extends LitElement {
316
303
  document.removeEventListener("keydown", this.handleKeydown);
317
304
 
318
305
  if (this.previousFocus && this.previousFocus.focus) {
319
- setTimeout(() => {
306
+ this.updateComplete.then(() => {
320
307
  this.previousFocus?.focus();
321
308
  this.previousFocus = null;
322
- }, 50);
309
+ });
323
310
  }
324
311
 
325
312
  this.dispatchEvent(
@@ -352,17 +339,6 @@ export class RelDrawer extends LitElement {
352
339
  document.body.style.paddingRight = this.originalBodyPaddingRight;
353
340
  }
354
341
 
355
- private focusPanel() {
356
- if (!this.panelElement) return;
357
-
358
- const focusable = this.getFocusableElements();
359
- if (focusable.length > 0) {
360
- focusable[0].focus();
361
- } else {
362
- this.panelElement.focus();
363
- }
364
- }
365
-
366
342
  private getFocusableElements(): HTMLElement[] {
367
343
  if (!this.panelElement) return [];
368
344
 
@@ -439,16 +415,8 @@ export class RelDrawer extends LitElement {
439
415
  this.close("programmatic");
440
416
  }
441
417
 
442
- private close(reason: DrawerCloseReason) {
418
+ private close(_reason: DrawerCloseReason) {
443
419
  this.open = false;
444
-
445
- this.dispatchEvent(
446
- new CustomEvent("rel-close", {
447
- detail: { reason },
448
- bubbles: true,
449
- composed: true,
450
- })
451
- );
452
420
  }
453
421
 
454
422
  // Drag-to-close handlers
@@ -480,7 +448,7 @@ export class RelDrawer extends LitElement {
480
448
  }
481
449
  };
482
450
 
483
- private handlePointerUp = (e: PointerEvent) => {
451
+ private handlePointerUp = (_e: PointerEvent) => {
484
452
  if (!this.isDragging) return;
485
453
 
486
454
  this.isDragging = false;
@@ -504,7 +472,7 @@ export class RelDrawer extends LitElement {
504
472
  return "";
505
473
  }
506
474
 
507
- return `transform: translateY(${this.dragOffset}px);`;
475
+ return `transform: translateX(-50%) translateY(${this.dragOffset}px);`;
508
476
  }
509
477
 
510
478
  private getOverlayStyle() {
@@ -519,17 +487,9 @@ export class RelDrawer extends LitElement {
519
487
  return `opacity: ${opacity};`;
520
488
  }
521
489
 
522
- private hasSlotContent(slotName?: string): boolean {
523
- const slot = this.shadowRoot?.querySelector(
524
- slotName ? `slot[name="${slotName}"]` : "slot:not([name])"
525
- ) as HTMLSlotElement;
526
- return slot ? slot.assignedElements({ flatten: true }).length > 0 : false;
527
- }
528
-
529
490
  render() {
530
- const hasTitle = this.hasSlotContent("title");
531
- const hasDescription = this.hasSlotContent("description");
532
- const hasFooter = this.hasSlotContent("footer");
491
+ const hasTitle = !!this.title;
492
+ const hasDescription = !!this.description;
533
493
  const showCloseButton = this.dismissible;
534
494
  const hasHeader = hasTitle || hasDescription || showCloseButton;
535
495
 
@@ -540,7 +500,7 @@ export class RelDrawer extends LitElement {
540
500
  <div class="drawer-container ${this.open ? "open" : ""}">
541
501
  <div
542
502
  part="overlay"
543
- class="overlay ${this.isDragging ? "dragging" : ""}"
503
+ class="overlay ${!this.modal ? 'no-modal' : ''} ${this.isDragging ? 'dragging' : ''}"
544
504
  style="${this.getOverlayStyle()}"
545
505
  @click="${this.handleOverlayClick}"></div>
546
506
 
@@ -548,8 +508,7 @@ export class RelDrawer extends LitElement {
548
508
  part="panel"
549
509
  class="panel ${this.isDragging ? "dragging" : ""}"
550
510
  data-side="${this.side}"
551
- style="--drawer-width: ${this.width}; --drawer-max-height: ${this
552
- .maxHeight}; ${this.getPanelStyle()}"
511
+ style="${this.width ? `--drawer-width: ${this.width};` : ''}${this.maxHeight ? `--drawer-max-height: ${this.maxHeight};` : ''}${this.getPanelStyle()}"
553
512
  role="${this.modal ? "dialog" : "region"}"
554
513
  aria-modal="${this.modal}"
555
514
  tabindex="-1">
@@ -566,14 +525,10 @@ export class RelDrawer extends LitElement {
566
525
  <div class="header-top">
567
526
  <div>
568
527
  ${hasTitle
569
- ? html`<h2 class="title">
570
- <slot name="title"></slot>
571
- </h2>`
528
+ ? html`<h2 class="title">${this.title}</h2>`
572
529
  : ""}
573
530
  ${hasDescription
574
- ? html`<p class="description">
575
- <slot name="description"></slot>
576
- </p>`
531
+ ? html`<p class="description">${this.description}</p>`
577
532
  : ""}
578
533
  </div>
579
534
  ${showCloseButton
@@ -582,16 +537,7 @@ export class RelDrawer extends LitElement {
582
537
  class="close-button"
583
538
  @click="${this.handleCloseButtonClick}"
584
539
  aria-label="Close">
585
- <svg
586
- width="16"
587
- height="16"
588
- viewBox="0 0 16 16"
589
- fill="none"
590
- xmlns="http://www.w3.org/2000/svg">
591
- <path
592
- d="M12.8 4.27L11.73 3.2L8 6.93L4.27 3.2L3.2 4.27L6.93 8L3.2 11.73L4.27 12.8L8 9.07L11.73 12.8L12.8 11.73L9.07 8L12.8 4.27Z"
593
- fill="currentColor" />
594
- </svg>
540
+ <rel-icon name="close" size="sm"></rel-icon>
595
541
  </button>`
596
542
  : ""}
597
543
  </div>
@@ -603,11 +549,9 @@ export class RelDrawer extends LitElement {
603
549
  <slot></slot>
604
550
  </div>
605
551
 
606
- ${hasFooter
607
- ? html`<div part="footer" class="footer">
608
- <slot name="footer"></slot>
609
- </div>`
610
- : ""}
552
+ <div part="footer" class="footer">
553
+ <rel-drawer-footer><slot name="footer"></slot></rel-drawer-footer>
554
+ </div>
611
555
  </div>
612
556
  </div>
613
557
  `;