@reliability-design/web 1.0.2

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 (60) hide show
  1. package/dist/components/rel-accordion/rel-accordion.stories.ts +313 -0
  2. package/dist/components/rel-accordion/rel-accordion.ts +114 -0
  3. package/dist/components/rel-alert/rel-alert.stories.ts +412 -0
  4. package/dist/components/rel-alert/rel-alert.ts +194 -0
  5. package/dist/components/rel-avatar/rel-avatar.stories.ts +327 -0
  6. package/dist/components/rel-avatar/rel-avatar.ts +100 -0
  7. package/dist/components/rel-badge/rel-badge.stories.ts +350 -0
  8. package/dist/components/rel-badge/rel-badge.ts +70 -0
  9. package/dist/components/rel-breadcrumb/rel-breadcrumb.stories.ts +306 -0
  10. package/dist/components/rel-breadcrumb/rel-breadcrumb.ts +97 -0
  11. package/dist/components/rel-button/rel-button.stories.ts +356 -0
  12. package/dist/components/rel-button/rel-button.ts +204 -0
  13. package/dist/components/rel-card/rel-card.stories.ts +299 -0
  14. package/dist/components/rel-card/rel-card.ts +33 -0
  15. package/dist/components/rel-cardmedia/rel-cardmedia.stories.ts +368 -0
  16. package/dist/components/rel-cardmedia/rel-cardmedia.ts +80 -0
  17. package/dist/components/rel-checkbox/rel-checkbox.stories.ts +414 -0
  18. package/dist/components/rel-checkbox/rel-checkbox.ts +164 -0
  19. package/dist/components/rel-chip/rel-chip.stories.ts +552 -0
  20. package/dist/components/rel-chip/rel-chip.ts +261 -0
  21. package/dist/components/rel-container/rel-container.stories.ts +239 -0
  22. package/dist/components/rel-container/rel-container.ts +74 -0
  23. package/dist/components/rel-divider/rel-divider.stories.ts +229 -0
  24. package/dist/components/rel-divider/rel-divider.ts +44 -0
  25. package/dist/components/rel-layout/rel-layout.stories.ts +713 -0
  26. package/dist/components/rel-layout/rel-layout.ts +60 -0
  27. package/dist/components/rel-menu/rel-menu.stories.ts +910 -0
  28. package/dist/components/rel-menu/rel-menu.ts +319 -0
  29. package/dist/components/rel-progress/rel-progress.stories.ts +817 -0
  30. package/dist/components/rel-progress/rel-progress.ts +182 -0
  31. package/dist/components/rel-radio/rel-radio.stories.ts +1048 -0
  32. package/dist/components/rel-radio/rel-radio.ts +187 -0
  33. package/dist/components/rel-segmented-button/rel-segmented-button.stories.ts +1079 -0
  34. package/dist/components/rel-segmented-button/rel-segmented-button.ts +150 -0
  35. package/dist/components/rel-select/rel-select.stories.ts +1201 -0
  36. package/dist/components/rel-select/rel-select.ts +261 -0
  37. package/dist/components/rel-slider/rel-slider.stories.ts +730 -0
  38. package/dist/components/rel-slider/rel-slider.ts +440 -0
  39. package/dist/components/rel-snackbar/rel-snackbar.stories.ts +808 -0
  40. package/dist/components/rel-snackbar/rel-snackbar.ts +212 -0
  41. package/dist/components/rel-stepper/rel-stepper.stories.ts +752 -0
  42. package/dist/components/rel-stepper/rel-stepper.ts +425 -0
  43. package/dist/components/rel-switch/rel-switch.stories.ts +441 -0
  44. package/dist/components/rel-switch/rel-switch.ts +161 -0
  45. package/dist/components/rel-tab/rel-tab.stories.ts +492 -0
  46. package/dist/components/rel-tab/rel-tab.ts +145 -0
  47. package/dist/components/rel-textfield/rel-textfield.stories.ts +710 -0
  48. package/dist/components/rel-textfield/rel-textfield.ts +224 -0
  49. package/dist/components/rel-toast/rel-toast.stories.ts +394 -0
  50. package/dist/components/rel-toast/rel-toast.ts +154 -0
  51. package/dist/components/rel-tooltip/rel-tooltip.stories.ts +364 -0
  52. package/dist/components/rel-tooltip/rel-tooltip.ts +80 -0
  53. package/dist/index.d.mts +372 -0
  54. package/dist/index.d.ts +372 -0
  55. package/dist/index.js +4593 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/index.mjs +4544 -0
  58. package/dist/index.mjs.map +1 -0
  59. package/dist/styles/vars.css +184 -0
  60. package/package.json +32 -0
package/dist/index.js ADDED
@@ -0,0 +1,4593 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var __decorateClass = (decorators, target, key, kind) => {
20
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
21
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
22
+ if (decorator = decorators[i])
23
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
24
+ if (kind && result) __defProp(target, key, result);
25
+ return result;
26
+ };
27
+
28
+ // src/index.ts
29
+ var index_exports = {};
30
+ __export(index_exports, {
31
+ RelAccordion: () => RelAccordion,
32
+ RelAlert: () => RelAlert,
33
+ RelAvatar: () => RelAvatar,
34
+ RelBadge: () => RelBadge,
35
+ RelBreadcrumbs: () => RelBreadcrumbs,
36
+ RelButton: () => RelButton,
37
+ RelCard: () => RelCard,
38
+ RelCardMedia: () => RelCardMedia,
39
+ RelCheckbox: () => RelCheckbox,
40
+ RelChip: () => RelChip,
41
+ RelContainer: () => RelContainer,
42
+ RelDivider: () => RelDivider,
43
+ RelLayout: () => RelLayout,
44
+ RelMenu: () => RelMenu,
45
+ RelProgress: () => RelProgress,
46
+ RelRadio: () => RelRadio,
47
+ RelSegmentedButton: () => RelSegmentedButton,
48
+ RelSelect: () => RelSelect,
49
+ RelSlider: () => RelSlider,
50
+ RelSnackbar: () => RelSnackbar,
51
+ RelStepper: () => RelStepper,
52
+ RelSwitch: () => RelSwitch,
53
+ RelTab: () => RelTab,
54
+ RelTextfield: () => RelTextfield,
55
+ RelToast: () => RelToast,
56
+ RelTooltip: () => RelTooltip
57
+ });
58
+ module.exports = __toCommonJS(index_exports);
59
+
60
+ // src/components/rel-accordion/rel-accordion.ts
61
+ var import_lit = require("lit");
62
+ var import_decorators = require("lit/decorators.js");
63
+ var RelAccordion = class extends import_lit.LitElement {
64
+ constructor() {
65
+ super(...arguments);
66
+ this.title = "Accordion";
67
+ this.open = false;
68
+ }
69
+ toggle() {
70
+ this.open = !this.open;
71
+ }
72
+ chevron() {
73
+ return import_lit.html`
74
+ <svg viewBox="0 0 24 24">
75
+ <polyline points="6 9 12 15 18 9"></polyline>
76
+ </svg>
77
+ `;
78
+ }
79
+ render() {
80
+ return import_lit.html`
81
+ <div class="accordion">
82
+ <div class="header" @click=${this.toggle}>
83
+ <div class="title">${this.title}</div>
84
+
85
+ <div class="icon ${this.open ? "rotated" : ""}">
86
+ ${this.chevron()}
87
+ </div>
88
+ </div>
89
+
90
+ ${this.open ? import_lit.html`<div class="body"><slot></slot></div>` : ""}
91
+ </div>
92
+ `;
93
+ }
94
+ };
95
+ RelAccordion.styles = import_lit.css`
96
+ :host {
97
+ display: block;
98
+ width: 100%;
99
+ font-family: var(--rel-fontFamilies-primary);
100
+ }
101
+
102
+ .accordion {
103
+ background: var(--rel-colors-white);
104
+ border: 1px solid var(--rel-border-default);
105
+ border-radius: var(--rel-borders-radius-border-radius-200); /* 8px */
106
+ box-shadow: var(--rel-shadows-shadow-100);
107
+ transition: all 0.2s ease;
108
+ overflow: hidden;
109
+ }
110
+
111
+ /* HEADER --------------------------------------------------- */
112
+ .header {
113
+ display: flex;
114
+ justify-content: space-between;
115
+ align-items: center;
116
+ padding: var(--rel-spacing-space-md); /* 16px */
117
+ cursor: pointer;
118
+ user-select: none;
119
+ }
120
+
121
+ .title {
122
+ font-size: var(--rel-fontSizes-lg); /* 20px */
123
+ font-weight: var(--rel-fontWeights-medium);
124
+ color: var(--rel-colors-black);
125
+ }
126
+
127
+ /* ICON ----------------------------------------------------- */
128
+ .icon {
129
+ width: 20px;
130
+ height: 20px;
131
+ display: flex;
132
+ align-items: center;
133
+ justify-content: center;
134
+ transition: transform 0.25s ease;
135
+ }
136
+
137
+ .icon svg {
138
+ width: 20px;
139
+ height: 20px;
140
+ stroke: var(--rel-colors-gray-primary);
141
+ stroke-width: 2;
142
+ fill: none;
143
+ stroke-linecap: round;
144
+ stroke-linejoin: round;
145
+ }
146
+
147
+ .rotated {
148
+ transform: rotate(180deg);
149
+ }
150
+
151
+ /* BODY ------------------------------------------------------ */
152
+ .body {
153
+ padding: var(--rel-spacing-space-xl) var(--rel-spacing-space-md)
154
+ var(--rel-spacing-space-lg);
155
+ /* 24px 16px 20px */
156
+ font-size: var(--rel-fontSizes-lg); /* 20px */
157
+ color: var(--rel-colors-gray-primary);
158
+ animation: fadeIn 0.2s ease;
159
+ }
160
+
161
+ @keyframes fadeIn {
162
+ from {
163
+ opacity: 0;
164
+ transform: translateY(-4px);
165
+ }
166
+ to {
167
+ opacity: 1;
168
+ transform: translateY(0);
169
+ }
170
+ }
171
+ `;
172
+ __decorateClass([
173
+ (0, import_decorators.property)({ type: String })
174
+ ], RelAccordion.prototype, "title", 2);
175
+ __decorateClass([
176
+ (0, import_decorators.property)({ type: Boolean })
177
+ ], RelAccordion.prototype, "open", 2);
178
+ RelAccordion = __decorateClass([
179
+ (0, import_decorators.customElement)("rel-accordion")
180
+ ], RelAccordion);
181
+
182
+ // src/components/rel-alert/rel-alert.ts
183
+ var import_lit2 = require("lit");
184
+ var import_decorators2 = require("lit/decorators.js");
185
+ var RelAlert = class extends import_lit2.LitElement {
186
+ constructor() {
187
+ super(...arguments);
188
+ this.type = "neutral";
189
+ this.message1 = "";
190
+ this.dismissible = true;
191
+ this.dismissed = false;
192
+ }
193
+ get iconSvg() {
194
+ switch (this.type) {
195
+ case "info":
196
+ return import_lit2.html`<svg viewBox="0 0 18 18" fill="none">
197
+ <path
198
+ d="M9 4.75c-.24 0-.44.08-.61.25-.16.16-.24.36-.24.6 0 .24.08.44.24.61.17.17.37.25.61.25.24 0 .44-.08.61-.25.17-.16.24-.36.24-.61 0-.24-.08-.44-.24-.6-.17-.17-.37-.25-.61-.25Zm.85 3.4h-1.7v5.1h1.7V8.15ZM9 .5c1.18 0 2.29.22 3.32.67 1.03.45 1.93 1.05 2.69 1.81.75.76 1.35 1.66 1.8 2.69.46 1.03.68 2.14.68 3.33 0 1.18-.22 2.29-.68 3.32-.45 1.04-1.05 1.93-1.8 2.69-.76.75-1.66 1.35-2.69 1.8-1.04.46-2.15.68-3.32.68-1.18 0-2.29-.22-3.32-.68-1.04-.45-1.93-1.05-2.69-1.8-.75-.76-1.35-1.66-1.8-2.69C1.92 11.28 1.7 10.17 1.7 9c0-1.18.22-2.29.68-3.32.45-1.04 1.05-1.93 1.8-2.69.76-.75 1.66-1.35 2.69-1.8C6.71.73 7.82.5 9 .5Z"
199
+ fill="#4A90E2"
200
+ />
201
+ </svg>`;
202
+ case "success":
203
+ return import_lit2.html`<svg viewBox="0 0 18 18" fill="none">
204
+ <path
205
+ d="M7.81 12.91 13.8 6.92l-1.19-1.19L7.81 10.53 5.39 8.11 4.2 9.3l3.61 3.61ZM9 17.5a8.49 8.49 0 1 1 0-17 8.49 8.49 0 0 1 0 17Z"
206
+ fill="#4CAA47"
207
+ />
208
+ </svg>`;
209
+ case "warning":
210
+ return import_lit2.html`<svg viewBox="0 0 16 14" fill="none">
211
+ <path
212
+ d="M0 14 8 0l8 14H0Zm2.51-1.47h10.98L8 2.95 2.51 12.53ZM8 11.79c.21 0 .38-.07.52-.21.14-.14.21-.31.21-.52 0-.21-.07-.38-.21-.52A.7.7 0 0 0 8 10.32a.7.7 0 0 0-.52.21c-.14.14-.21.31-.21.52 0 .21.07.38.21.52.14.14.31.21.52.21Zm-.73-2.21h1.46V5.89H7.27v3.69Z"
213
+ fill="#FF6D00"
214
+ />
215
+ </svg>`;
216
+ case "error":
217
+ return import_lit2.html`<svg viewBox="0 0 18 18" fill="none">
218
+ <path
219
+ d="M9 13.25c.24 0 .44-.08.61-.24.17-.17.24-.38.24-.61 0-.24-.08-.44-.24-.61-.17-.16-.37-.24-.61-.24-.24 0-.44.08-.61.24-.17.17-.24.37-.24.61 0 .24.08.44.24.61.17.16.37.24.61.24Zm-.85-3.4h1.7V4.75h-1.7v5.1ZM9 17.5c-1.18 0-2.29-.23-3.32-.68C4.64 16.37 3.74 15.77 2.99 15.02c-.75-.75-1.35-1.65-1.8-2.69C.73 11.29.5 10.18.5 9c0-1.18.23-2.29.68-3.32.45-1.03 1.05-1.93 1.8-2.69C5.03 1.23 5.94.63 6.97.18 8 .72 9.12.5 10.3.5c1.17 0 2.28.23 3.32.68 1.03.45 1.93 1.05 2.68 1.8.75.76 1.35 1.66 1.8 2.69.46 1.03.68 2.14.68 3.33 0 1.18-.22 2.29-.68 3.32-.45 1.04-1.05 1.93-1.8 2.69-.76.75-1.66 1.35-2.69 1.8-1.04.46-2.15.68-3.32.68Z"
220
+ fill="#C62828"
221
+ />
222
+ </svg>`;
223
+ default:
224
+ return import_lit2.html``;
225
+ }
226
+ }
227
+ dismissAlert() {
228
+ this.dismissed = true;
229
+ }
230
+ render() {
231
+ if (this.dismissed) return null;
232
+ return import_lit2.html`
233
+ <div class="rel-alert alert-${this.type}">
234
+ <div class="rel-icon">${this.iconSvg}</div>
235
+
236
+ <div class="rel-content">
237
+ <p class="rel-message1">${this.message1}</p>
238
+
239
+ ${this.message2 ? import_lit2.html`<p class="rel-message2">${this.message2}</p>` : ""}
240
+ ${this.urlText && this.urlHref ? import_lit2.html`<a class="rel-link" href="${this.urlHref}"
241
+ >${this.urlText}</a
242
+ >` : ""}
243
+ </div>
244
+
245
+ ${this.dismissible ? import_lit2.html`<button class="rel-close" @click=${this.dismissAlert}>
246
+ ✕
247
+ </button>` : ""}
248
+ </div>
249
+ `;
250
+ }
251
+ };
252
+ RelAlert.styles = import_lit2.css`
253
+ :host {
254
+ display: block;
255
+ font-family: var(--rel-fontFamilies-primary);
256
+ }
257
+
258
+ .rel-alert {
259
+ display: flex;
260
+ align-items: center;
261
+ gap: var(--rel-spacing-space-xs); /* 8px */
262
+ padding: var(--rel-spacing-space-sm) var(--rel-spacing-space-md);
263
+ /* 12px vertical, 16px horizontal */
264
+ border-radius: var(--rel-borders-radius-border-radius-200); /* 8px */
265
+ width: fit-content;
266
+ min-width: 360px;
267
+ box-sizing: border-box;
268
+ }
269
+
270
+ .rel-content {
271
+ display: flex;
272
+ flex-direction: column;
273
+ gap: 4px;
274
+ }
275
+
276
+ .rel-message1 {
277
+ display: flex;
278
+ align-items: center;
279
+ margin: 0;
280
+ font-size: var(--rel-fontSizes-md);
281
+ font-weight: var(--rel-fontWeights-medium);
282
+ }
283
+
284
+ .rel-message2 {
285
+ margin: 0;
286
+ font-size: var(--rel-fontSizes-sm);
287
+ font-weight: var(--rel-fontWeights-regular);
288
+ opacity: 0.9;
289
+ }
290
+
291
+ .rel-icon {
292
+ display: flex;
293
+ align-items: center;
294
+ justify-content: center;
295
+ }
296
+
297
+ .rel-icon svg {
298
+ width: 16px;
299
+ height: 16px;
300
+ }
301
+
302
+ .rel-link {
303
+ font-size: var(--rel-fontSizes-sm);
304
+ font-weight: var(--rel-fontWeights-medium);
305
+ text-decoration: underline;
306
+ margin-top: 2px;
307
+ color: inherit;
308
+ }
309
+
310
+ .rel-close {
311
+ margin-left: auto;
312
+ background: none;
313
+ border: none;
314
+ cursor: pointer;
315
+ width: 16px;
316
+ height: 16px;
317
+ opacity: 0.6;
318
+ padding: 0;
319
+ display: flex;
320
+ align-items: center;
321
+ justify-content: center;
322
+ }
323
+
324
+ .rel-close:hover {
325
+ opacity: 1;
326
+ }
327
+
328
+ /* COLORS — using token system */
329
+
330
+ .alert-info {
331
+ background: var(--rel-background-info);
332
+ color: var(--rel-text-info);
333
+ }
334
+
335
+ .alert-success {
336
+ background: var(--rel-background-success);
337
+ color: var(--rel-text-success);
338
+ }
339
+
340
+ .alert-warning {
341
+ background: var(--rel-background-warning);
342
+ color: var(--rel-text-warning);
343
+ }
344
+
345
+ .alert-error {
346
+ background: var(--rel-background-error);
347
+ color: var(--rel-text-error);
348
+ }
349
+
350
+ .alert-neutral {
351
+ background: var(--rel-colors-white);
352
+ color: var(--rel-text-primary);
353
+ border: 1px solid var(--rel-border-default);
354
+ }
355
+ `;
356
+ __decorateClass([
357
+ (0, import_decorators2.property)({ type: String })
358
+ ], RelAlert.prototype, "type", 2);
359
+ __decorateClass([
360
+ (0, import_decorators2.property)({ type: String })
361
+ ], RelAlert.prototype, "message1", 2);
362
+ __decorateClass([
363
+ (0, import_decorators2.property)({ type: String })
364
+ ], RelAlert.prototype, "message2", 2);
365
+ __decorateClass([
366
+ (0, import_decorators2.property)({ type: String })
367
+ ], RelAlert.prototype, "urlText", 2);
368
+ __decorateClass([
369
+ (0, import_decorators2.property)({ type: String })
370
+ ], RelAlert.prototype, "urlHref", 2);
371
+ __decorateClass([
372
+ (0, import_decorators2.property)({ type: Boolean })
373
+ ], RelAlert.prototype, "dismissible", 2);
374
+ __decorateClass([
375
+ (0, import_decorators2.property)({ type: Boolean })
376
+ ], RelAlert.prototype, "dismissed", 2);
377
+ RelAlert = __decorateClass([
378
+ (0, import_decorators2.customElement)("rel-alert")
379
+ ], RelAlert);
380
+
381
+ // src/components/rel-avatar/rel-avatar.ts
382
+ var import_lit3 = require("lit");
383
+ var import_decorators3 = require("lit/decorators.js");
384
+ var RelAvatar = class extends import_lit3.LitElement {
385
+ constructor() {
386
+ super(...arguments);
387
+ this.size = "md";
388
+ this.type = "image";
389
+ this.src = "";
390
+ this.text = "";
391
+ this.alt = "Avatar";
392
+ }
393
+ render() {
394
+ return import_lit3.html`
395
+ <div class="avatar avatar-${this.size}">
396
+ ${this.type === "image" ? import_lit3.html`<img src=${this.src} alt=${this.alt} />` : this.type === "text" ? import_lit3.html`<span>${this.text}</span>` : import_lit3.html`<span class="icon-slot"><slot></slot></span>`}
397
+ </div>
398
+ `;
399
+ }
400
+ };
401
+ RelAvatar.styles = import_lit3.css`
402
+ :host {
403
+ display: inline-flex;
404
+ font-family: var(--rel-fontFamilies-primary);
405
+ }
406
+
407
+ .avatar {
408
+ display: inline-flex;
409
+ align-items: center;
410
+ justify-content: center;
411
+ border-radius: 50%;
412
+ overflow: hidden;
413
+
414
+ background-color: var(--rel-colors-gray-heading);
415
+ color: var(--rel-colors-white);
416
+ font-weight: var(--rel-fontWeights-bold);
417
+
418
+ user-select: none;
419
+ text-transform: uppercase;
420
+ }
421
+
422
+ /* -------------------------
423
+ CORRECTED SIZE CLASSES
424
+ ------------------------- */
425
+ .avatar-lg {
426
+ width: 40px;
427
+ height: 40px;
428
+ font-size: var(--rel-fontSizes-xl);
429
+ line-height: 38px;
430
+ }
431
+
432
+ .avatar-md {
433
+ width: 32px;
434
+ height: 32px;
435
+ font-size: var(--rel-fontSizes-lg);
436
+ line-height: 32px;
437
+ }
438
+
439
+ .avatar-sm {
440
+ width: 24px;
441
+ height: 24px;
442
+ font-size: var(--rel-fontSizes-md);
443
+ line-height: 24px;
444
+ }
445
+
446
+ .avatar-xs {
447
+ width: 18px;
448
+ height: 18px;
449
+ font-size: var(--rel-fontSizes-xs);
450
+ line-height: 18px;
451
+ }
452
+
453
+ img {
454
+ width: 100%;
455
+ height: 100%;
456
+ object-fit: cover;
457
+ }
458
+
459
+ .icon-slot {
460
+ width: 100%;
461
+ height: 100%;
462
+ display: inline-flex;
463
+ align-items: center;
464
+ justify-content: center;
465
+ }
466
+
467
+ .icon-slot ::slotted(*) {
468
+ font-size: var(--rel-fontSizes-md);
469
+ }
470
+
471
+ .icon-slot ::slotted(svg) {
472
+ width: 50%;
473
+ height: 50%;
474
+ }
475
+ `;
476
+ __decorateClass([
477
+ (0, import_decorators3.property)({ type: String })
478
+ ], RelAvatar.prototype, "size", 2);
479
+ __decorateClass([
480
+ (0, import_decorators3.property)({ type: String })
481
+ ], RelAvatar.prototype, "type", 2);
482
+ __decorateClass([
483
+ (0, import_decorators3.property)({ type: String })
484
+ ], RelAvatar.prototype, "src", 2);
485
+ __decorateClass([
486
+ (0, import_decorators3.property)({ type: String })
487
+ ], RelAvatar.prototype, "text", 2);
488
+ __decorateClass([
489
+ (0, import_decorators3.property)({ type: String })
490
+ ], RelAvatar.prototype, "alt", 2);
491
+ RelAvatar = __decorateClass([
492
+ (0, import_decorators3.customElement)("rel-avatar")
493
+ ], RelAvatar);
494
+
495
+ // src/components/rel-badge/rel-badge.ts
496
+ var import_lit4 = require("lit");
497
+ var import_decorators4 = require("lit/decorators.js");
498
+ var RelBadge = class extends import_lit4.LitElement {
499
+ constructor() {
500
+ super(...arguments);
501
+ this.number = "";
502
+ this.size = "md";
503
+ this.variant = "number";
504
+ }
505
+ get classes() {
506
+ return ["badge", `badge-${this.size}`, `badge-${this.variant}`].join(" ");
507
+ }
508
+ render() {
509
+ const isDot = this.variant === "dot";
510
+ return import_lit4.html`
511
+ <span class="${this.classes}">${isDot ? "" : this.number}</span>
512
+ `;
513
+ }
514
+ };
515
+ RelBadge.styles = import_lit4.css`
516
+ :host {
517
+ display: inline-flex;
518
+ }
519
+
520
+ .badge {
521
+ display: inline-flex;
522
+ align-items: center;
523
+ justify-content: center;
524
+ font-family: "Poppins", sans-serif;
525
+ font-weight: 600;
526
+ background-color: var(--rel-colors-red-primary);
527
+ color: var(--rel-colors-white);
528
+ border-radius: 50%;
529
+ }
530
+
531
+ /* PERFECT CIRCLES — FIXED SIZES */
532
+ .badge-sm {
533
+ width: 20px;
534
+ height: 20px;
535
+ font-size: 12px;
536
+ }
537
+
538
+ .badge-md {
539
+ width: 28px;
540
+ height: 28px;
541
+ font-size: 14px;
542
+ }
543
+
544
+ .badge-lg {
545
+ width: 40px;
546
+ height: 40px;
547
+ font-size: 20px;
548
+ }
549
+
550
+ /* DOT — smaller circle */
551
+ .badge-dot {
552
+ width: 10px !important;
553
+ height: 10px !important;
554
+ padding: 0 !important;
555
+ }
556
+
557
+ .badge-number {
558
+ display: flex;
559
+ align-items: center;
560
+ justify-content: center;
561
+ }
562
+ `;
563
+ __decorateClass([
564
+ (0, import_decorators4.property)({ type: String })
565
+ ], RelBadge.prototype, "number", 2);
566
+ __decorateClass([
567
+ (0, import_decorators4.property)({ type: String })
568
+ ], RelBadge.prototype, "size", 2);
569
+ __decorateClass([
570
+ (0, import_decorators4.property)({ type: String })
571
+ ], RelBadge.prototype, "variant", 2);
572
+ RelBadge = __decorateClass([
573
+ (0, import_decorators4.customElement)("rel-badge")
574
+ ], RelBadge);
575
+
576
+ // src/components/rel-breadcrumb/rel-breadcrumb.ts
577
+ var import_lit5 = require("lit");
578
+ var import_decorators5 = require("lit/decorators.js");
579
+ var RelBreadcrumbs = class extends import_lit5.LitElement {
580
+ constructor() {
581
+ super(...arguments);
582
+ this.items = [];
583
+ }
584
+ render() {
585
+ return import_lit5.html`
586
+ <nav aria-label="Breadcrumb">
587
+ <ol>
588
+ ${this.items.map((item, index) => {
589
+ const last = index === this.items.length - 1;
590
+ return import_lit5.html`
591
+ <li>
592
+ ${item.url && !last ? import_lit5.html`<a href="${item.url}">${item.label}</a>` : import_lit5.html`<span class="current">${item.label}</span>`}
593
+ ${!last ? import_lit5.html`
594
+ <svg viewBox="0 0 24 24">
595
+ <polyline
596
+ points="9 18 15 12 9 6"
597
+ fill="none"
598
+ stroke="currentColor"
599
+ stroke-width="2"
600
+ stroke-linecap="round"
601
+ stroke-linejoin="round"
602
+ ></polyline>
603
+ </svg>
604
+ ` : ""}
605
+ </li>
606
+ `;
607
+ })}
608
+ </ol>
609
+ </nav>
610
+ `;
611
+ }
612
+ };
613
+ RelBreadcrumbs.styles = import_lit5.css`
614
+ :host {
615
+ display: block;
616
+ font-family: var(--rel-fontFamilies-primary);
617
+ font-size: var(--rel-fontSizes-md);
618
+ color: var(--rel-colors-gray-text);
619
+ }
620
+
621
+ nav {
622
+ display: block;
623
+ width: 100%;
624
+ }
625
+
626
+ ol {
627
+ display: flex;
628
+ flex-wrap: wrap;
629
+ padding: 0;
630
+ margin: 0;
631
+ list-style: none;
632
+ }
633
+
634
+ li {
635
+ display: flex;
636
+ align-items: center;
637
+ }
638
+
639
+ a {
640
+ text-decoration: none;
641
+ font-weight: var(--rel-fontWeights-medium);
642
+ color: var(--rel-colors-gray-heading);
643
+ transition: color 0.2s ease;
644
+ }
645
+
646
+ a:hover {
647
+ text-decoration: underline;
648
+ color: var(--rel-colors-primary);
649
+ }
650
+
651
+ .current {
652
+ font-weight: var(--rel-fontWeights-bold);
653
+ color: var(--rel-colors-black);
654
+ cursor: default;
655
+ }
656
+
657
+ svg {
658
+ stroke: var(--rel-colors-gray-text);
659
+ width: 16px;
660
+ height: 16px;
661
+ margin: 0 10px;
662
+ }
663
+ `;
664
+ __decorateClass([
665
+ (0, import_decorators5.property)({ type: Array })
666
+ ], RelBreadcrumbs.prototype, "items", 2);
667
+ RelBreadcrumbs = __decorateClass([
668
+ (0, import_decorators5.customElement)("rel-breadcrumbs")
669
+ ], RelBreadcrumbs);
670
+
671
+ // src/components/rel-button/rel-button.ts
672
+ var import_lit6 = require("lit");
673
+ var import_decorators6 = require("lit/decorators.js");
674
+ var RelButton = class extends import_lit6.LitElement {
675
+ constructor() {
676
+ super(...arguments);
677
+ this.variant = "default";
678
+ this.tone = "default";
679
+ this.size = "medium";
680
+ this.border = "corner-radius";
681
+ this.disabled = false;
682
+ }
683
+ get classes() {
684
+ return [
685
+ `btn-${this.variant}`,
686
+ `tone-${this.tone}`,
687
+ `size-${this.size}`,
688
+ `border-${this.border}`,
689
+ this.disabled ? "btn-disabled" : ""
690
+ ].join(" ");
691
+ }
692
+ render() {
693
+ return import_lit6.html`
694
+ <button class="${this.classes}" ?disabled=${this.disabled}>
695
+ <slot></slot>
696
+ </button>
697
+ `;
698
+ }
699
+ };
700
+ RelButton.styles = import_lit6.css`
701
+ :host {
702
+ display: inline-flex;
703
+ }
704
+
705
+ button {
706
+ font-family: var(--rel-fontFamilies-primary);
707
+ font-weight: var(--rel-fontWeights-semibold);
708
+ cursor: pointer;
709
+ border: none;
710
+ transition: all 0.15s ease;
711
+ display: inline-flex;
712
+ align-items: center;
713
+ justify-content: center;
714
+ gap: var(--rel-spacing-space-2xs);
715
+ outline: none;
716
+ }
717
+
718
+ /* -------------------------
719
+ SIZES (Figma)
720
+ -------------------------- */
721
+ .size-small {
722
+ height: 32px;
723
+ padding: 0 var(--rel-spacing-space-md);
724
+ font-size: var(--rel-fontSizes-sm);
725
+ }
726
+
727
+ .size-medium {
728
+ height: 40px;
729
+ padding: 0 var(--rel-spacing-space-lg);
730
+ font-size: var(--rel-fontSizes-md);
731
+ }
732
+
733
+ .size-large {
734
+ height: 48px;
735
+ padding: 0 var(--rel-spacing-space-xl);
736
+ font-size: var(--rel-fontSizes-lg);
737
+ }
738
+
739
+ /* -------------------------
740
+ BORDER RADII (Tokens)
741
+ -------------------------- */
742
+ .border-corner-radius {
743
+ border-radius: var(--rel-borders-radius-border-radius-500);
744
+ }
745
+
746
+ .border-small-corner-radius {
747
+ border-radius: var(--rel-borders-radius-border-radius-200);
748
+ }
749
+
750
+ .border-no-corner-radius {
751
+ border-radius: var(--rel-borders-radius-border-radius-0);
752
+ }
753
+
754
+ /* -------------------------
755
+ DISABLED STATE
756
+ -------------------------- */
757
+ :host([disabled]) button,
758
+ button:disabled {
759
+ cursor: not-allowed;
760
+ background-color: var(--rel-colors-gray-border) !important;
761
+ color: var(--rel-colors-gray-disabled-text) !important;
762
+ border-color: var(--rel-colors-gray-border) !important;
763
+ opacity: 1;
764
+ pointer-events: none;
765
+ }
766
+
767
+ /* -------------------------
768
+ VARIANTS & TONES
769
+ -------------------------- */
770
+
771
+ /* DEFAULT */
772
+ .btn-default.tone-default {
773
+ background: var(--rel-colors-gray-primary);
774
+ color: var(--rel-colors-white);
775
+ }
776
+ .btn-default.tone-critical {
777
+ background: var(--rel-colors-red-primary);
778
+ color: var(--rel-colors-white);
779
+ }
780
+ .btn-default.tone-success {
781
+ background: var(--rel-colors-green-success);
782
+ color: var(--rel-colors-white);
783
+ }
784
+
785
+ /* PRIMARY */
786
+ .btn-primary.tone-default {
787
+ background: var(--rel-colors-green-primary);
788
+ color: var(--rel-colors-black);
789
+ }
790
+ .btn-primary.tone-critical {
791
+ background: var(--rel-colors-red-primary);
792
+ color: var(--rel-colors-white);
793
+ }
794
+ .btn-primary.tone-success {
795
+ background: var(--rel-colors-green-success);
796
+ color: var(--rel-colors-white);
797
+ }
798
+
799
+ /* SECONDARY */
800
+ .btn-secondary {
801
+ background: var(--rel-colors-white);
802
+ border: 1px solid var(--rel-colors-black);
803
+ color: var(--rel-colors-black);
804
+ }
805
+
806
+ /* TEXT */
807
+ .btn-text {
808
+ background: transparent;
809
+ color: var(--rel-colors-black);
810
+ }
811
+
812
+ /* LINK */
813
+ .btn-link {
814
+ background: transparent;
815
+ color: var(--rel-colors-blue-primary);
816
+ text-decoration: underline;
817
+ }
818
+
819
+ /* ICON */
820
+ .btn-icon {
821
+ width: 40px;
822
+ height: 40px;
823
+ padding: 0;
824
+ border-radius: 50%;
825
+ background: var(--rel-colors-gray-light);
826
+ color: var(--rel-colors-black);
827
+ }
828
+
829
+ /* -------------------------
830
+ STATES: Hover / Active
831
+ -------------------------- */
832
+ button:hover:not(.btn-disabled) {
833
+ filter: brightness(0.92);
834
+ }
835
+
836
+ button:active:not(.btn-disabled) {
837
+ transform: scale(0.97);
838
+ }
839
+
840
+ /* TEXT BUTTON — hover border */
841
+ .btn-text:not(.btn-disabled):hover {
842
+ border: 1px solid var(--rel-colors-black);
843
+ text-decoration: none;
844
+ }
845
+
846
+ /* LINK BUTTON — hover border */
847
+ .btn-link:not(.btn-disabled):hover {
848
+ border: 1px solid var(--rel-colors-blue-primary);
849
+ text-decoration: underline;
850
+ }
851
+
852
+ /* -------------------------
853
+ FOCUS RING
854
+ -------------------------- */
855
+ button:focus-visible {
856
+ outline: 2px solid var(--rel-colors-blue-primary);
857
+ outline-offset: 2px;
858
+ }
859
+ `;
860
+ __decorateClass([
861
+ (0, import_decorators6.property)({ type: String })
862
+ ], RelButton.prototype, "variant", 2);
863
+ __decorateClass([
864
+ (0, import_decorators6.property)({ type: String })
865
+ ], RelButton.prototype, "tone", 2);
866
+ __decorateClass([
867
+ (0, import_decorators6.property)({ type: String })
868
+ ], RelButton.prototype, "size", 2);
869
+ __decorateClass([
870
+ (0, import_decorators6.property)({ type: String })
871
+ ], RelButton.prototype, "border", 2);
872
+ __decorateClass([
873
+ (0, import_decorators6.property)({ type: Boolean, reflect: true })
874
+ ], RelButton.prototype, "disabled", 2);
875
+ RelButton = __decorateClass([
876
+ (0, import_decorators6.customElement)("rel-button")
877
+ ], RelButton);
878
+
879
+ // src/components/rel-card/rel-card.ts
880
+ var import_lit7 = require("lit");
881
+ var import_decorators7 = require("lit/decorators.js");
882
+ var RelCard = class extends import_lit7.LitElement {
883
+ render() {
884
+ return import_lit7.html` <div class="card"><slot></slot></div> `;
885
+ }
886
+ };
887
+ RelCard.styles = import_lit7.css`
888
+ :host {
889
+ display: block;
890
+ }
891
+
892
+ .card {
893
+ background-color: var(--rel-colors-white, #ffffff);
894
+ border-radius: var(--rel-borderRadius-lg, 12px);
895
+ padding: var(--rel-spacing-space-md, 16px);
896
+
897
+ box-shadow: 0px 3px 3px rgba(0, 0, 0, 0.3),
898
+ 0px 6px 10px 4px rgba(0, 0, 0, 0.15);
899
+
900
+ font-family: var(--rel-fontFamilies-primary);
901
+ transition: transform 0.2s ease, box-shadow 0.2s ease;
902
+ }
903
+
904
+ .card:hover {
905
+ transform: translateY(-3px);
906
+ box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.35),
907
+ 0px 8px 14px 4px rgba(0, 0, 0, 0.2);
908
+ }
909
+ `;
910
+ RelCard = __decorateClass([
911
+ (0, import_decorators7.customElement)("rel-card")
912
+ ], RelCard);
913
+
914
+ // src/components/rel-cardmedia/rel-cardmedia.ts
915
+ var import_lit8 = require("lit");
916
+ var import_decorators8 = require("lit/decorators.js");
917
+ var RelCardMedia = class extends import_lit8.LitElement {
918
+ constructor() {
919
+ super(...arguments);
920
+ this.imageSrc = "";
921
+ this.imageAlt = "Card image";
922
+ this.title = "";
923
+ this.subtitle = "";
924
+ }
925
+ render() {
926
+ return import_lit8.html`
927
+ <div class="card-media">
928
+ ${this.imageSrc ? import_lit8.html`
929
+ <div class="card-image">
930
+ <img src="${this.imageSrc}" alt="${this.imageAlt}" />
931
+ </div>
932
+ ` : null}
933
+
934
+ <div class="card-content">
935
+ ${this.title ? import_lit8.html`<h3>${this.title}</h3>` : null}
936
+ ${this.subtitle ? import_lit8.html`<p>${this.subtitle}</p>` : null}
937
+
938
+ <!-- Slot for extra content such as buttons, descriptions, etc -->
939
+ <slot></slot>
940
+ </div>
941
+ </div>
942
+ `;
943
+ }
944
+ };
945
+ RelCardMedia.styles = import_lit8.css`
946
+ :host {
947
+ display: block;
948
+ font-family: var(--rel-fontFamilies-primary);
949
+ }
950
+
951
+ .card-media {
952
+ background-color: var(--rel-colors-white, #ffffff);
953
+ border-radius: var(--rel-borderRadius-lg, 12px);
954
+ overflow: hidden;
955
+
956
+ box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.3),
957
+ 0px 8px 12px 6px rgba(0, 0, 0, 0.15);
958
+
959
+ transition: transform 0.2s ease, box-shadow 0.2s ease;
960
+ }
961
+
962
+ .card-media:hover {
963
+ transform: translateY(-4px);
964
+ box-shadow: 0px 6px 10px rgba(0, 0, 0, 0.35),
965
+ 0px 10px 16px 6px rgba(0, 0, 0, 0.2);
966
+ }
967
+
968
+ .card-image img {
969
+ display: block;
970
+ width: 100%;
971
+ height: auto;
972
+ object-fit: cover;
973
+ }
974
+
975
+ .card-content {
976
+ padding: var(--rel-spacing-space-md, 16px);
977
+ }
978
+
979
+ .card-content h3 {
980
+ margin: 0 0 4px 0;
981
+ font-size: var(--rel-fontSizes-md, 16px);
982
+ font-weight: var(--rel-fontWeights-semibold, 600);
983
+ color: var(--rel-colors-gray-heading, #2b2b2b);
984
+ }
985
+
986
+ .card-content p {
987
+ margin: 0 0 8px 0;
988
+ font-size: var(--rel-fontSizes-sm, 14px);
989
+ color: var(--rel-colors-gray-text, #555);
990
+ }
991
+ `;
992
+ __decorateClass([
993
+ (0, import_decorators8.property)({ type: String })
994
+ ], RelCardMedia.prototype, "imageSrc", 2);
995
+ __decorateClass([
996
+ (0, import_decorators8.property)({ type: String })
997
+ ], RelCardMedia.prototype, "imageAlt", 2);
998
+ __decorateClass([
999
+ (0, import_decorators8.property)({ type: String })
1000
+ ], RelCardMedia.prototype, "title", 2);
1001
+ __decorateClass([
1002
+ (0, import_decorators8.property)({ type: String })
1003
+ ], RelCardMedia.prototype, "subtitle", 2);
1004
+ RelCardMedia = __decorateClass([
1005
+ (0, import_decorators8.customElement)("rel-card-media")
1006
+ ], RelCardMedia);
1007
+
1008
+ // src/components/rel-checkbox/rel-checkbox.ts
1009
+ var import_lit9 = require("lit");
1010
+ var import_decorators9 = require("lit/decorators.js");
1011
+ var RelCheckbox = class extends import_lit9.LitElement {
1012
+ constructor() {
1013
+ super(...arguments);
1014
+ this.label = "Label";
1015
+ this.supportingtext = "";
1016
+ this.state = "default";
1017
+ this.status = "unchecked";
1018
+ }
1019
+ toggle() {
1020
+ if (this.state === "disabled") return;
1021
+ if (this.status === "unchecked") this.status = "checked";
1022
+ else if (this.status === "checked") this.status = "indeterminate";
1023
+ else this.status = "unchecked";
1024
+ this.dispatchEvent(new CustomEvent("changed", { detail: this.status }));
1025
+ }
1026
+ render() {
1027
+ const className = `
1028
+ wrapper
1029
+ ${this.state}
1030
+ ${this.status}
1031
+ `;
1032
+ return import_lit9.html`
1033
+ <div class="${className}">
1034
+ <label class="row">
1035
+ <input
1036
+ type="checkbox"
1037
+ @change=${this.toggle}
1038
+ ?disabled=${this.state === "disabled"}
1039
+ />
1040
+
1041
+ <span class="box">
1042
+ <!-- CHECK ICON -->
1043
+ <svg class="check-icon" viewBox="0 0 18 14" fill="white">
1044
+ <path
1045
+ d="M6.44479 14L0.5 7.36383L1.9862 5.70478L6.44479 10.6819L16.0138 0L17.5 1.65904L6.44479 14Z"
1046
+ />
1047
+ </svg>
1048
+
1049
+ <!-- INDETERMINATE ICON -->
1050
+ <svg class="indeterminate-icon" viewBox="0 0 16 2" fill="white">
1051
+ <rect width="16" height="2" />
1052
+ </svg>
1053
+ </span>
1054
+
1055
+ <span class="label">${this.label}</span>
1056
+ </label>
1057
+
1058
+ ${this.supportingtext ? import_lit9.html`<span class="text">${this.supportingtext}</span>` : null}
1059
+ </div>
1060
+ `;
1061
+ }
1062
+ };
1063
+ RelCheckbox.styles = import_lit9.css`
1064
+ :host {
1065
+ display: block;
1066
+ font-family: var(--rel-fontFamilies-primary);
1067
+ }
1068
+
1069
+ .wrapper {
1070
+ display: flex;
1071
+ flex-direction: column;
1072
+ gap: 4px;
1073
+ }
1074
+
1075
+ .row {
1076
+ display: flex;
1077
+ align-items: center;
1078
+ gap: 10px;
1079
+ cursor: pointer;
1080
+ }
1081
+
1082
+ input {
1083
+ position: absolute;
1084
+ opacity: 0;
1085
+ pointer-events: none;
1086
+ }
1087
+
1088
+ .box {
1089
+ width: 18px;
1090
+ height: 18px;
1091
+ border-radius: 4px;
1092
+ border: 2px solid var(--rel-colors-gray-heading);
1093
+ background: var(--rel-colors-white);
1094
+ display: flex;
1095
+ align-items: center;
1096
+ justify-content: center;
1097
+ transition: all 0.2s;
1098
+ }
1099
+
1100
+ /* ICONS FIXED SIZE */
1101
+ svg {
1102
+ width: 12px;
1103
+ height: 12px;
1104
+ display: none;
1105
+ pointer-events: none;
1106
+ }
1107
+
1108
+ /* CHECKED */
1109
+ .checked .box {
1110
+ background: var(--rel-colors-gray-heading);
1111
+ border-color: var(--rel-colors-gray-heading);
1112
+ }
1113
+ .checked .check-icon {
1114
+ display: block;
1115
+ }
1116
+
1117
+ /* INDETERMINATE */
1118
+ .indeterminate .box {
1119
+ background: var(--rel-colors-gray-heading);
1120
+ border-color: var(--rel-colors-gray-heading);
1121
+ }
1122
+ .indeterminate .indeterminate-icon {
1123
+ display: block;
1124
+ }
1125
+
1126
+ /* ERROR */
1127
+ .error .box {
1128
+ border-color: var(--rel-colors-red-primary);
1129
+ }
1130
+ .error.checked .box,
1131
+ .error.indeterminate .box {
1132
+ background: var(--rel-colors-red-primary);
1133
+ border-color: var(--rel-colors-red-primary);
1134
+ }
1135
+ .error .label,
1136
+ .error .text {
1137
+ color: var(--rel-colors-red-primary);
1138
+ }
1139
+
1140
+ /* DISABLED */
1141
+ .disabled {
1142
+ opacity: 0.55;
1143
+ cursor: not-allowed !important;
1144
+ }
1145
+
1146
+ .label {
1147
+ font-size: var(--rel-fontSizes-md);
1148
+ color: var(--rel-colors-gray-heading);
1149
+ font-weight: var(--rel-fontWeights-medium);
1150
+ }
1151
+
1152
+ .text {
1153
+ font-size: var(--rel-fontSizes-sm);
1154
+ color: var(--rel-colors-gray-text);
1155
+ }
1156
+
1157
+ /* Focus ring */
1158
+ input:focus-visible + .box {
1159
+ outline: 2px solid var(--rel-colors-blue-primary);
1160
+ outline-offset: 2px;
1161
+ }
1162
+ `;
1163
+ __decorateClass([
1164
+ (0, import_decorators9.property)({ type: String })
1165
+ ], RelCheckbox.prototype, "label", 2);
1166
+ __decorateClass([
1167
+ (0, import_decorators9.property)({ type: String })
1168
+ ], RelCheckbox.prototype, "supportingtext", 2);
1169
+ __decorateClass([
1170
+ (0, import_decorators9.property)({ type: String })
1171
+ ], RelCheckbox.prototype, "state", 2);
1172
+ __decorateClass([
1173
+ (0, import_decorators9.property)({ type: String })
1174
+ ], RelCheckbox.prototype, "status", 2);
1175
+ RelCheckbox = __decorateClass([
1176
+ (0, import_decorators9.customElement)("rel-checkbox")
1177
+ ], RelCheckbox);
1178
+
1179
+ // src/components/rel-chip/rel-chip.ts
1180
+ var import_lit10 = require("lit");
1181
+ var import_decorators10 = require("lit/decorators.js");
1182
+ var RelChip = class extends import_lit10.LitElement {
1183
+ constructor() {
1184
+ super(...arguments);
1185
+ this.label = "Label";
1186
+ this.tone = "default";
1187
+ this.removable = false;
1188
+ this.outline = false;
1189
+ this.removed = false;
1190
+ }
1191
+ get classes() {
1192
+ return [
1193
+ "chip",
1194
+ `chip-${this.tone}`,
1195
+ this.outline ? "chip-outline" : ""
1196
+ ].join(" ");
1197
+ }
1198
+ handleRemove(event) {
1199
+ event.stopPropagation();
1200
+ this.removed = true;
1201
+ this.dispatchEvent(
1202
+ new CustomEvent("removed", {
1203
+ bubbles: true,
1204
+ composed: true
1205
+ })
1206
+ );
1207
+ }
1208
+ handleKeyDown(event) {
1209
+ if (!this.removable) return;
1210
+ if (event.key === "Backspace" || event.key === "Delete") {
1211
+ event.preventDefault();
1212
+ this.handleRemove(event);
1213
+ }
1214
+ }
1215
+ render() {
1216
+ if (this.removed) {
1217
+ return null;
1218
+ }
1219
+ return import_lit10.html`
1220
+ <button
1221
+ class="${this.classes}"
1222
+ type="button"
1223
+ role="button"
1224
+ aria-label="${this.label}"
1225
+ @keydown=${this.handleKeyDown}
1226
+ tabindex="0"
1227
+ >
1228
+ ${this.avatar ? import_lit10.html`<img src="${this.avatar}" alt="avatar" class="chip-avatar" />` : ""}
1229
+ ${this.leadingIcon ? import_lit10.html`<span class="chip-icon leading">
1230
+ <slot name="leading-icon">${this.renderIcon(this.leadingIcon)}</slot>
1231
+ </span>` : ""}
1232
+ <span class="chip-label">${this.label}</span>
1233
+ ${this.trailingIcon ? import_lit10.html`<span class="chip-icon trailing">
1234
+ <slot name="trailing-icon">${this.renderIcon(this.trailingIcon)}</slot>
1235
+ </span>` : ""}
1236
+ ${this.removable ? import_lit10.html`<button
1237
+ type="button"
1238
+ class="chip-remove"
1239
+ @click=${this.handleRemove}
1240
+ aria-label="Remove chip"
1241
+ >
1242
+ 
1243
+ </button>` : ""}
1244
+ </button>
1245
+ `;
1246
+ }
1247
+ renderIcon(iconString) {
1248
+ const template = document.createElement("template");
1249
+ template.innerHTML = iconString.trim();
1250
+ return import_lit10.html`${template.content.cloneNode(true)}`;
1251
+ }
1252
+ };
1253
+ RelChip.styles = import_lit10.css`
1254
+ :host {
1255
+ display: inline-block;
1256
+ }
1257
+
1258
+ :host([removed]) {
1259
+ display: none;
1260
+ }
1261
+
1262
+ .chip {
1263
+ display: inline-flex;
1264
+ align-items: center;
1265
+ font-family: var(--rel-fontFamilies-primary);
1266
+ font-size: var(--rel-fontSizes-md);
1267
+ font-weight: var(--rel-fontWeights-medium);
1268
+ border-radius: var(--rel-borders-radius-border-radius-500);
1269
+ padding: var(--rel-spacing-space-2xs) var(--rel-spacing-space-sm);
1270
+ gap: var(--rel-spacing-space-2xs);
1271
+ cursor: pointer;
1272
+ transition: all 0.2s ease-in-out;
1273
+ border: var(--rel-borders-width-stroke-100) solid transparent;
1274
+ user-select: none;
1275
+ white-space: nowrap;
1276
+ }
1277
+
1278
+ .chip:hover {
1279
+ filter: brightness(0.92);
1280
+ transform: translateY(-1px);
1281
+ box-shadow: var(--rel-shadows-shadow-100);
1282
+ }
1283
+
1284
+ .chip:focus:not(:focus-visible) {
1285
+ outline: none;
1286
+ }
1287
+
1288
+ .chip:active {
1289
+ transform: scale(0.97) translateY(0);
1290
+ box-shadow: none;
1291
+ filter: brightness(0.88);
1292
+ }
1293
+
1294
+ /* Tone Variants - Filled */
1295
+ .chip-default {
1296
+ background: var(--rel-colors-gray-border);
1297
+ color: var(--rel-colors-black);
1298
+ }
1299
+
1300
+ .chip-default:focus {
1301
+ outline: var(--rel-borders-width-stroke-200) solid var(--rel-colors-gray-primary);
1302
+ outline-offset: var(--rel-spacing-space-3xs);
1303
+ }
1304
+
1305
+ .chip-blue {
1306
+ background: var(--rel-colors-blue-tertiary);
1307
+ color: var(--rel-colors-white);
1308
+ }
1309
+
1310
+ .chip-blue:focus {
1311
+ outline: var(--rel-borders-width-stroke-200) solid var(--rel-colors-blue-tertiary);
1312
+ outline-offset: var(--rel-spacing-space-3xs);
1313
+ }
1314
+
1315
+ .chip-yellow {
1316
+ background: var(--rel-colors-yellow-pending);
1317
+ color: var(--rel-colors-black);
1318
+ }
1319
+
1320
+ .chip-yellow:focus {
1321
+ outline: var(--rel-borders-width-stroke-200) solid var(--rel-colors-yellow-pending);
1322
+ outline-offset: var(--rel-spacing-space-3xs);
1323
+ }
1324
+
1325
+ .chip-red {
1326
+ background: var(--rel-colors-red-secondary);
1327
+ color: var(--rel-colors-white);
1328
+ }
1329
+
1330
+ .chip-red:focus {
1331
+ outline: var(--rel-borders-width-stroke-200) solid var(--rel-colors-red-secondary);
1332
+ outline-offset: var(--rel-spacing-space-3xs);
1333
+ }
1334
+
1335
+ .chip-green {
1336
+ background: var(--rel-colors-green-success);
1337
+ color: var(--rel-colors-white);
1338
+ }
1339
+
1340
+ .chip-green:focus {
1341
+ outline: var(--rel-borders-width-stroke-200) solid var(--rel-colors-green-success);
1342
+ outline-offset: var(--rel-spacing-space-3xs);
1343
+ }
1344
+
1345
+ /* Outline Variants */
1346
+ .chip-outline.chip-default {
1347
+ background: transparent;
1348
+ border-color: var(--rel-colors-gray-border);
1349
+ color: var(--rel-colors-black);
1350
+ }
1351
+
1352
+ .chip-outline.chip-blue {
1353
+ background: transparent;
1354
+ border-color: var(--rel-colors-blue-tertiary);
1355
+ color: var(--rel-colors-blue-tertiary);
1356
+ }
1357
+
1358
+ .chip-outline.chip-yellow {
1359
+ background: transparent;
1360
+ border-color: var(--rel-colors-yellow-pending);
1361
+ color: var(--rel-colors-yellow-pending);
1362
+ }
1363
+
1364
+ .chip-outline.chip-red {
1365
+ background: transparent;
1366
+ border-color: var(--rel-colors-red-secondary);
1367
+ color: var(--rel-colors-red-secondary);
1368
+ }
1369
+
1370
+ .chip-outline.chip-green {
1371
+ background: transparent;
1372
+ border-color: var(--rel-colors-green-success);
1373
+ color: var(--rel-colors-green-success);
1374
+ }
1375
+
1376
+ .chip-avatar {
1377
+ width: 20px;
1378
+ height: 20px;
1379
+ border-radius: var(--rel-borders-radius-border-radius-500);
1380
+ object-fit: cover;
1381
+ }
1382
+
1383
+ .chip-icon {
1384
+ display: flex;
1385
+ align-items: center;
1386
+ line-height: 0;
1387
+ }
1388
+
1389
+ .chip-icon ::slotted(svg),
1390
+ .chip-icon svg {
1391
+ width: 16px;
1392
+ height: 16px;
1393
+ fill: currentColor;
1394
+ }
1395
+
1396
+ .chip-label {
1397
+ line-height: var(--rel-lineHeights-md);
1398
+ }
1399
+
1400
+ .chip-remove {
1401
+ background: transparent;
1402
+ border: none;
1403
+ color: inherit;
1404
+ font-size: var(--rel-fontSizes-md);
1405
+ cursor: pointer;
1406
+ display: flex;
1407
+ align-items: center;
1408
+ padding: 0;
1409
+ margin-left: var(--rel-spacing-space-3xs);
1410
+ }
1411
+
1412
+ .chip-remove:hover {
1413
+ opacity: 0.6;
1414
+ }
1415
+ `;
1416
+ __decorateClass([
1417
+ (0, import_decorators10.property)({ type: String })
1418
+ ], RelChip.prototype, "label", 2);
1419
+ __decorateClass([
1420
+ (0, import_decorators10.property)({ type: String })
1421
+ ], RelChip.prototype, "tone", 2);
1422
+ __decorateClass([
1423
+ (0, import_decorators10.property)({ type: String })
1424
+ ], RelChip.prototype, "leadingIcon", 2);
1425
+ __decorateClass([
1426
+ (0, import_decorators10.property)({ type: String })
1427
+ ], RelChip.prototype, "trailingIcon", 2);
1428
+ __decorateClass([
1429
+ (0, import_decorators10.property)({ type: String })
1430
+ ], RelChip.prototype, "avatar", 2);
1431
+ __decorateClass([
1432
+ (0, import_decorators10.property)({ type: Boolean })
1433
+ ], RelChip.prototype, "removable", 2);
1434
+ __decorateClass([
1435
+ (0, import_decorators10.property)({ type: Boolean })
1436
+ ], RelChip.prototype, "outline", 2);
1437
+ __decorateClass([
1438
+ (0, import_decorators10.state)()
1439
+ ], RelChip.prototype, "removed", 2);
1440
+ RelChip = __decorateClass([
1441
+ (0, import_decorators10.customElement)("rel-chip")
1442
+ ], RelChip);
1443
+
1444
+ // src/components/rel-container/rel-container.ts
1445
+ var import_lit11 = require("lit");
1446
+ var import_decorators11 = require("lit/decorators.js");
1447
+ var RelContainer = class extends import_lit11.LitElement {
1448
+ constructor() {
1449
+ super(...arguments);
1450
+ this.padding = "md";
1451
+ this.shadow = false;
1452
+ this.background = "white";
1453
+ }
1454
+ get classes() {
1455
+ return [
1456
+ "reliability-container",
1457
+ `bg-${this.background}`,
1458
+ `padding-${this.padding}`,
1459
+ this.shadow ? "shadow" : ""
1460
+ ].join(" ");
1461
+ }
1462
+ render() {
1463
+ return import_lit11.html`
1464
+ <div class="${this.classes}">
1465
+ <slot></slot>
1466
+ </div>
1467
+ `;
1468
+ }
1469
+ };
1470
+ RelContainer.styles = import_lit11.css`
1471
+ :host {
1472
+ display: block;
1473
+ width: 100%;
1474
+ box-sizing: border-box;
1475
+ }
1476
+
1477
+ .reliability-container {
1478
+ border-radius: var(--rel-borders-radius-border-radius-200);
1479
+ display: block;
1480
+ width: 100%;
1481
+ box-sizing: border-box;
1482
+ }
1483
+
1484
+ /* Background Variants */
1485
+ .bg-white {
1486
+ background-color: var(--rel-colors-white);
1487
+ }
1488
+
1489
+ .bg-light {
1490
+ background-color: var(--rel-colors-gray-light);
1491
+ }
1492
+
1493
+ .bg-none {
1494
+ background: transparent;
1495
+ }
1496
+
1497
+ /* Padding Variants */
1498
+ .padding-sm {
1499
+ padding: var(--rel-spacing-space-xs);
1500
+ }
1501
+
1502
+ .padding-md {
1503
+ padding: var(--rel-spacing-space-md);
1504
+ }
1505
+
1506
+ .padding-lg {
1507
+ padding: var(--rel-spacing-space-2xl);
1508
+ }
1509
+
1510
+ /* Shadow */
1511
+ .shadow {
1512
+ box-shadow: var(--rel-shadows-shadow-300);
1513
+ }
1514
+ `;
1515
+ __decorateClass([
1516
+ (0, import_decorators11.property)({ type: String })
1517
+ ], RelContainer.prototype, "padding", 2);
1518
+ __decorateClass([
1519
+ (0, import_decorators11.property)({ type: Boolean })
1520
+ ], RelContainer.prototype, "shadow", 2);
1521
+ __decorateClass([
1522
+ (0, import_decorators11.property)({ type: String })
1523
+ ], RelContainer.prototype, "background", 2);
1524
+ RelContainer = __decorateClass([
1525
+ (0, import_decorators11.customElement)("rel-container")
1526
+ ], RelContainer);
1527
+
1528
+ // src/components/rel-divider/rel-divider.ts
1529
+ var import_lit12 = require("lit");
1530
+ var import_decorators12 = require("lit/decorators.js");
1531
+ var RelDivider = class extends import_lit12.LitElement {
1532
+ constructor() {
1533
+ super(...arguments);
1534
+ this.orientation = "horizontal";
1535
+ }
1536
+ render() {
1537
+ return import_lit12.html`
1538
+ <div class="rel-divider ${this.orientation}" role="separator"></div>
1539
+ `;
1540
+ }
1541
+ };
1542
+ RelDivider.styles = import_lit12.css`
1543
+ :host {
1544
+ display: block;
1545
+ }
1546
+
1547
+ .rel-divider {
1548
+ position: relative;
1549
+ display: flex;
1550
+ background: transparent;
1551
+ font-family: var(--rel-fontFamilies-primary);
1552
+ color: var(--rel-colors-gray-primary);
1553
+ }
1554
+
1555
+ /* Horizontal */
1556
+ .rel-divider.horizontal {
1557
+ width: 100%;
1558
+ height: var(--rel-borders-width-stroke-100);
1559
+ background-color: var(--rel-colors-gray-border);
1560
+ margin: var(--rel-spacing-space-md) 0;
1561
+ }
1562
+
1563
+ /* Vertical */
1564
+ .rel-divider.vertical {
1565
+ width: var(--rel-borders-width-stroke-100);
1566
+ background-color: var(--rel-colors-gray-border);
1567
+ margin: 0 var(--rel-spacing-space-md);
1568
+ align-self: stretch;
1569
+ height: 100%;
1570
+ }
1571
+ `;
1572
+ __decorateClass([
1573
+ (0, import_decorators12.property)({ type: String })
1574
+ ], RelDivider.prototype, "orientation", 2);
1575
+ RelDivider = __decorateClass([
1576
+ (0, import_decorators12.customElement)("rel-divider")
1577
+ ], RelDivider);
1578
+
1579
+ // src/components/rel-layout/rel-layout.ts
1580
+ var import_lit13 = require("lit");
1581
+ var import_decorators13 = require("lit/decorators.js");
1582
+ var RelLayout = class extends import_lit13.LitElement {
1583
+ constructor() {
1584
+ super(...arguments);
1585
+ this.gap = "1rem";
1586
+ this.columns = 4;
1587
+ this.responsive = true;
1588
+ }
1589
+ render() {
1590
+ const gridStyle = `
1591
+ gap: ${this.gap};
1592
+ grid-template-columns: repeat(${this.columns}, 1fr);
1593
+ `;
1594
+ return import_lit13.html`
1595
+ <div class="layout-grid" style="${gridStyle}">
1596
+ <slot></slot>
1597
+ </div>
1598
+ `;
1599
+ }
1600
+ };
1601
+ RelLayout.styles = import_lit13.css`
1602
+ :host {
1603
+ display: block;
1604
+ width: 100%;
1605
+ }
1606
+
1607
+ .layout-grid {
1608
+ display: grid;
1609
+ width: 100%;
1610
+ font-family: var(--rel-fontFamilies-primary);
1611
+ }
1612
+
1613
+ /* Responsive breakpoints - only applied when responsive is true */
1614
+ :host([responsive]) .layout-grid {
1615
+ /* Default: use columns property */
1616
+ }
1617
+
1618
+ @media (max-width: 1024px) {
1619
+ :host([responsive]) .layout-grid {
1620
+ grid-template-columns: repeat(3, 1fr) !important;
1621
+ }
1622
+ }
1623
+
1624
+ @media (max-width: 768px) {
1625
+ :host([responsive]) .layout-grid {
1626
+ grid-template-columns: repeat(2, 1fr) !important;
1627
+ }
1628
+ }
1629
+
1630
+ @media (max-width: 480px) {
1631
+ :host([responsive]) .layout-grid {
1632
+ grid-template-columns: 1fr !important;
1633
+ }
1634
+ }
1635
+ `;
1636
+ __decorateClass([
1637
+ (0, import_decorators13.property)({ type: String })
1638
+ ], RelLayout.prototype, "gap", 2);
1639
+ __decorateClass([
1640
+ (0, import_decorators13.property)({ type: Number })
1641
+ ], RelLayout.prototype, "columns", 2);
1642
+ __decorateClass([
1643
+ (0, import_decorators13.property)({ type: Boolean })
1644
+ ], RelLayout.prototype, "responsive", 2);
1645
+ RelLayout = __decorateClass([
1646
+ (0, import_decorators13.customElement)("rel-layout")
1647
+ ], RelLayout);
1648
+
1649
+ // src/components/rel-menu/rel-menu.ts
1650
+ var import_lit14 = require("lit");
1651
+ var import_decorators14 = require("lit/decorators.js");
1652
+ var RelMenu = class extends import_lit14.LitElement {
1653
+ constructor() {
1654
+ super(...arguments);
1655
+ this.type = "default";
1656
+ this.items = [];
1657
+ this.focusedIndex = 0;
1658
+ this.handleDocumentClick = (e) => {
1659
+ const path = e.composedPath();
1660
+ const hit = path.some((n) => n?.classList?.contains("rel-menu"));
1661
+ if (!hit) {
1662
+ this.items.forEach((i) => i.open = false);
1663
+ this.requestUpdate();
1664
+ }
1665
+ };
1666
+ }
1667
+ connectedCallback() {
1668
+ super.connectedCallback();
1669
+ document.addEventListener("click", this.handleDocumentClick);
1670
+ }
1671
+ disconnectedCallback() {
1672
+ super.disconnectedCallback();
1673
+ document.removeEventListener("click", this.handleDocumentClick);
1674
+ }
1675
+ onItemEnter(item) {
1676
+ if (this.type === "arrow" && item.submenu?.length) {
1677
+ this.items.forEach((i) => {
1678
+ if (i !== item) i.open = false;
1679
+ });
1680
+ item.open = true;
1681
+ this.requestUpdate();
1682
+ }
1683
+ }
1684
+ onItemLeave(_item) {
1685
+ }
1686
+ onItemClick(item, index, ev) {
1687
+ ev?.stopPropagation();
1688
+ if (item.disabled) return;
1689
+ this.focusedIndex = index;
1690
+ if (this.type === "checkbox") {
1691
+ item.checked = !item.checked;
1692
+ this.dispatchEvent(
1693
+ new CustomEvent("item-checked", {
1694
+ detail: { item, checked: item.checked },
1695
+ bubbles: true,
1696
+ composed: true
1697
+ })
1698
+ );
1699
+ this.requestUpdate();
1700
+ return;
1701
+ }
1702
+ if (this.type === "arrow" && item.submenu?.length) {
1703
+ const next = !item.open;
1704
+ this.items.forEach((i) => i.open = false);
1705
+ item.open = next;
1706
+ this.requestUpdate();
1707
+ return;
1708
+ }
1709
+ this.items.forEach((i) => i.active = false);
1710
+ item.active = true;
1711
+ this.dispatchEvent(
1712
+ new CustomEvent("item-selected", {
1713
+ detail: { item },
1714
+ bubbles: true,
1715
+ composed: true
1716
+ })
1717
+ );
1718
+ this.requestUpdate();
1719
+ }
1720
+ onSubClick(parent, sub, ev) {
1721
+ ev?.stopPropagation();
1722
+ this.items.forEach((i) => {
1723
+ i.active = false;
1724
+ i.submenu?.forEach((s) => s.active = false);
1725
+ });
1726
+ sub.active = true;
1727
+ parent.open = false;
1728
+ this.dispatchEvent(
1729
+ new CustomEvent("submenu-selected", {
1730
+ detail: { parent, sub },
1731
+ bubbles: true,
1732
+ composed: true
1733
+ })
1734
+ );
1735
+ this.requestUpdate();
1736
+ }
1737
+ toggleCheckbox(item, ev) {
1738
+ ev.stopPropagation();
1739
+ if (!item.disabled) {
1740
+ item.checked = !item.checked;
1741
+ this.dispatchEvent(
1742
+ new CustomEvent("item-checked", {
1743
+ detail: { item, checked: item.checked },
1744
+ bubbles: true,
1745
+ composed: true
1746
+ })
1747
+ );
1748
+ this.requestUpdate();
1749
+ }
1750
+ }
1751
+ onKeydown(ev) {
1752
+ const last = this.items.length - 1;
1753
+ if (ev.key === "ArrowDown") {
1754
+ this.focusedIndex = Math.min(last, this.focusedIndex + 1);
1755
+ ev.preventDefault();
1756
+ } else if (ev.key === "ArrowUp") {
1757
+ this.focusedIndex = Math.max(0, this.focusedIndex - 1);
1758
+ ev.preventDefault();
1759
+ } else if (ev.key === "ArrowRight") {
1760
+ const item = this.items[this.focusedIndex];
1761
+ if (this.type === "arrow" && item?.submenu?.length) {
1762
+ item.open = true;
1763
+ this.requestUpdate();
1764
+ }
1765
+ } else if (ev.key === "ArrowLeft" || ev.key === "Escape") {
1766
+ this.items.forEach((i) => i.open = false);
1767
+ this.requestUpdate();
1768
+ } else if (ev.key === "Enter" || ev.key === " ") {
1769
+ const item = this.items[this.focusedIndex];
1770
+ this.onItemClick(item, this.focusedIndex);
1771
+ ev.preventDefault();
1772
+ }
1773
+ }
1774
+ renderMenuItem(item, index) {
1775
+ const isFocused = this.focusedIndex === index;
1776
+ return import_lit14.html`
1777
+ <div
1778
+ class="rel-menu-item ${item.active ? "active" : ""} ${item.disabled ? "disabled" : ""}"
1779
+ role="menuitem"
1780
+ ?data-focused="${isFocused}"
1781
+ @mouseenter="${() => this.onItemEnter(item)}"
1782
+ @mouseleave="${() => this.onItemLeave(item)}"
1783
+ @click="${(e) => this.onItemClick(item, index, e)}">
1784
+ ${this.type === "checkbox" ? import_lit14.html`
1785
+ <div class="menu-check-row">
1786
+ <input
1787
+ class="menu-checkbox"
1788
+ type="checkbox"
1789
+ .checked="${item.checked || false}"
1790
+ ?disabled="${item.disabled}"
1791
+ @click="${(e) => this.toggleCheckbox(item, e)}" />
1792
+ <span class="menu-label">${item.label}</span>
1793
+ </div>
1794
+ ` : import_lit14.html`
1795
+ <span class="menu-label">${item.label}</span>
1796
+ ${this.type === "arrow" && item.submenu?.length ? import_lit14.html`<span class="chevron">▸</span>` : ""}
1797
+ `}
1798
+ ${this.type === "arrow" && item.submenu?.length ? import_lit14.html`
1799
+ <div
1800
+ class="rel-submenu ${item.open ? "visible" : ""}"
1801
+ @click="${(e) => e.stopPropagation()}">
1802
+ ${item.submenu.map(
1803
+ (sub) => import_lit14.html`
1804
+ <div
1805
+ class="rel-menu-item ${sub.active ? "active" : ""}"
1806
+ role="menuitem"
1807
+ @click="${(e) => this.onSubClick(item, sub, e)}">
1808
+ <span class="menu-label">${sub.label}</span>
1809
+ </div>
1810
+ `
1811
+ )}
1812
+ </div>
1813
+ ` : ""}
1814
+ </div>
1815
+ `;
1816
+ }
1817
+ render() {
1818
+ return import_lit14.html`
1819
+ <div
1820
+ class="rel-menu"
1821
+ role="menu"
1822
+ tabindex="0"
1823
+ @keydown="${this.onKeydown}"
1824
+ @click="${(e) => e.stopPropagation()}">
1825
+ ${this.items.map((item, index) => this.renderMenuItem(item, index))}
1826
+ </div>
1827
+ `;
1828
+ }
1829
+ };
1830
+ RelMenu.styles = import_lit14.css`
1831
+ :host {
1832
+ display: inline-block;
1833
+ }
1834
+
1835
+ .rel-menu {
1836
+ position: relative;
1837
+ display: inline-block;
1838
+ background: var(--rel-colors-white);
1839
+ border-radius: var(--rel-borders-radius-border-radius-300);
1840
+ box-shadow: var(--rel-shadows-shadow-300);
1841
+ min-width: 220px;
1842
+ font-family: var(--rel-fontFamilies-primary);
1843
+ font-size: var(--rel-fontSizes-sm);
1844
+ padding: var(--rel-spacing-space-3xs) 0;
1845
+ outline: none;
1846
+ }
1847
+
1848
+ .rel-menu-item {
1849
+ position: relative;
1850
+ display: flex;
1851
+ align-items: center;
1852
+ gap: var(--rel-spacing-space-xs);
1853
+ padding: var(--rel-spacing-space-xs) var(--rel-spacing-space-sm);
1854
+ line-height: var(--rel-lineHeights-sm);
1855
+ cursor: pointer;
1856
+ transition: background 0.15s ease, color 0.15s ease;
1857
+ user-select: none;
1858
+ }
1859
+
1860
+ .rel-menu-item:hover {
1861
+ background: var(--rel-colors-gray-border);
1862
+ }
1863
+
1864
+ .rel-menu-item:active {
1865
+ background: var(--rel-colors-gray-tertiary);
1866
+ }
1867
+
1868
+ .rel-menu-item.active {
1869
+ background: var(--rel-colors-gray-tertiary);
1870
+ }
1871
+
1872
+ .rel-menu-item.disabled {
1873
+ background-color: var(--rel-colors-gray-light);
1874
+ color: var(--rel-colors-gray-placeholder);
1875
+ cursor: not-allowed;
1876
+ }
1877
+
1878
+ .rel-menu-item[data-focused="true"] {
1879
+ border-top: var(--rel-borders-width-stroke-200) solid var(--rel-colors-gray-primary);
1880
+ border-bottom: var(--rel-borders-width-stroke-200) solid var(--rel-colors-gray-primary);
1881
+ }
1882
+
1883
+ .menu-check-row {
1884
+ display: inline-flex;
1885
+ align-items: center;
1886
+ gap: var(--rel-spacing-space-2xs);
1887
+ width: 100%;
1888
+ }
1889
+
1890
+ .menu-checkbox {
1891
+ width: 16px;
1892
+ height: 16px;
1893
+ cursor: pointer;
1894
+ }
1895
+
1896
+ .menu-checkbox:disabled {
1897
+ cursor: not-allowed;
1898
+ }
1899
+
1900
+ .menu-label {
1901
+ flex: 1 1 auto;
1902
+ }
1903
+
1904
+ .chevron {
1905
+ font-size: var(--rel-fontSizes-lg);
1906
+ opacity: 0.75;
1907
+ transform: translateY(1px);
1908
+ }
1909
+
1910
+ .rel-submenu {
1911
+ position: absolute;
1912
+ top: calc(-1 * var(--rel-spacing-space-3xs));
1913
+ left: calc(100% + var(--rel-spacing-space-2xs));
1914
+ min-width: 200px;
1915
+ background: var(--rel-colors-white);
1916
+ border-radius: var(--rel-borders-radius-border-radius-300);
1917
+ box-shadow: var(--rel-shadows-shadow-300);
1918
+ padding: var(--rel-spacing-space-3xs) 0;
1919
+ display: none;
1920
+ z-index: 20;
1921
+ }
1922
+
1923
+ .rel-submenu.visible {
1924
+ display: block;
1925
+ }
1926
+
1927
+ .rel-submenu .rel-menu-item {
1928
+ padding: var(--rel-spacing-space-xs) var(--rel-spacing-space-sm);
1929
+ }
1930
+ `;
1931
+ __decorateClass([
1932
+ (0, import_decorators14.property)({ type: String })
1933
+ ], RelMenu.prototype, "type", 2);
1934
+ __decorateClass([
1935
+ (0, import_decorators14.property)({ type: Array })
1936
+ ], RelMenu.prototype, "items", 2);
1937
+ __decorateClass([
1938
+ (0, import_decorators14.state)()
1939
+ ], RelMenu.prototype, "focusedIndex", 2);
1940
+ RelMenu = __decorateClass([
1941
+ (0, import_decorators14.customElement)("rel-menu")
1942
+ ], RelMenu);
1943
+
1944
+ // src/components/rel-progress/rel-progress.ts
1945
+ var import_lit15 = require("lit");
1946
+ var import_decorators15 = require("lit/decorators.js");
1947
+ var RelProgress = class extends import_lit15.LitElement {
1948
+ constructor() {
1949
+ super(...arguments);
1950
+ this.mode = "linear-determinate";
1951
+ this.value = 0;
1952
+ this.radius = 15.9155;
1953
+ this.circumference = 2 * Math.PI * this.radius;
1954
+ }
1955
+ renderLinearDeterminate() {
1956
+ return import_lit15.html`
1957
+ <div class="linear-track">
1958
+ <div class="linear-bar" style="width: ${this.value}%"></div>
1959
+ </div>
1960
+ `;
1961
+ }
1962
+ renderLinearIndeterminate() {
1963
+ return import_lit15.html`
1964
+ <div class="linear-track">
1965
+ <div class="linear-bar indeterminate"></div>
1966
+ </div>
1967
+ `;
1968
+ }
1969
+ renderCircularDeterminate() {
1970
+ const offset = this.circumference - this.value / 100 * this.circumference;
1971
+ return import_lit15.html`
1972
+ <div class="circular">
1973
+ <svg viewBox="0 0 36 36" class="circular-svg">
1974
+ <circle class="circular-bg" cx="18" cy="18" r="15.9155" />
1975
+ <circle
1976
+ class="circular-progress"
1977
+ cx="18"
1978
+ cy="18"
1979
+ r="15.9155"
1980
+ stroke-dasharray="${this.circumference}"
1981
+ stroke-dashoffset="${offset}" />
1982
+ </svg>
1983
+ </div>
1984
+ `;
1985
+ }
1986
+ renderCircularIndeterminate() {
1987
+ return import_lit15.html`
1988
+ <div class="circular">
1989
+ <svg viewBox="0 0 50 50" class="spinner">
1990
+ <circle class="spinner-path" cx="25" cy="25" r="20" fill="none" stroke-width="4" />
1991
+ </svg>
1992
+ </div>
1993
+ `;
1994
+ }
1995
+ render() {
1996
+ switch (this.mode) {
1997
+ case "linear-determinate":
1998
+ return this.renderLinearDeterminate();
1999
+ case "linear-indeterminate":
2000
+ return this.renderLinearIndeterminate();
2001
+ case "circular-determinate":
2002
+ return this.renderCircularDeterminate();
2003
+ case "circular-indeterminate":
2004
+ return this.renderCircularIndeterminate();
2005
+ default:
2006
+ return this.renderLinearDeterminate();
2007
+ }
2008
+ }
2009
+ };
2010
+ RelProgress.styles = import_lit15.css`
2011
+ :host {
2012
+ display: block;
2013
+ font-family: var(--rel-fontFamilies-primary);
2014
+ }
2015
+
2016
+ :host([mode*="circular"]) {
2017
+ display: inline-block;
2018
+ }
2019
+
2020
+ /* Linear Progress */
2021
+ .linear-track {
2022
+ background: var(--rel-colors-gray-border);
2023
+ border-radius: var(--rel-borders-radius-border-radius-200);
2024
+ height: 6px;
2025
+ overflow: hidden;
2026
+ width: 100%;
2027
+ }
2028
+
2029
+ .linear-bar {
2030
+ background: var(--rel-colors-black);
2031
+ height: 100%;
2032
+ transition: width 0.3s ease;
2033
+ }
2034
+
2035
+ .linear-bar.indeterminate {
2036
+ width: 30%;
2037
+ animation: linear-indeterminate 1.5s infinite;
2038
+ }
2039
+
2040
+ @keyframes linear-indeterminate {
2041
+ 0% {
2042
+ margin-left: -30%;
2043
+ }
2044
+ 50% {
2045
+ margin-left: 50%;
2046
+ }
2047
+ 100% {
2048
+ margin-left: 100%;
2049
+ }
2050
+ }
2051
+
2052
+ /* Circular Progress */
2053
+ .circular {
2054
+ display: inline-block;
2055
+ width: 48px;
2056
+ height: 48px;
2057
+ }
2058
+
2059
+ .circular-svg {
2060
+ transform: rotate(-90deg);
2061
+ width: 100%;
2062
+ height: 100%;
2063
+ }
2064
+
2065
+ .circular-bg {
2066
+ fill: none;
2067
+ stroke: var(--rel-colors-gray-border);
2068
+ stroke-width: 3;
2069
+ }
2070
+
2071
+ .circular-progress {
2072
+ fill: none;
2073
+ stroke: var(--rel-colors-black);
2074
+ stroke-width: 3;
2075
+ stroke-linecap: round;
2076
+ transition: stroke-dashoffset 0.35s;
2077
+ transform: rotate(0deg);
2078
+ transform-origin: center;
2079
+ }
2080
+
2081
+ /* Circular Indeterminate Spinner */
2082
+ .spinner {
2083
+ animation: rotate 2s linear infinite;
2084
+ }
2085
+
2086
+ .spinner-path {
2087
+ stroke: var(--rel-colors-black);
2088
+ stroke-linecap: round;
2089
+ animation: dash 1.5s ease-in-out infinite;
2090
+ }
2091
+
2092
+ @keyframes rotate {
2093
+ 100% {
2094
+ transform: rotate(360deg);
2095
+ }
2096
+ }
2097
+
2098
+ @keyframes dash {
2099
+ 0% {
2100
+ stroke-dasharray: 1, 150;
2101
+ stroke-dashoffset: 0;
2102
+ }
2103
+ 50% {
2104
+ stroke-dasharray: 90, 150;
2105
+ stroke-dashoffset: -35;
2106
+ }
2107
+ 100% {
2108
+ stroke-dasharray: 90, 150;
2109
+ stroke-dashoffset: -124;
2110
+ }
2111
+ }
2112
+ `;
2113
+ __decorateClass([
2114
+ (0, import_decorators15.property)({ type: String })
2115
+ ], RelProgress.prototype, "mode", 2);
2116
+ __decorateClass([
2117
+ (0, import_decorators15.property)({ type: Number })
2118
+ ], RelProgress.prototype, "value", 2);
2119
+ RelProgress = __decorateClass([
2120
+ (0, import_decorators15.customElement)("rel-progress")
2121
+ ], RelProgress);
2122
+
2123
+ // src/components/rel-radio/rel-radio.ts
2124
+ var import_lit16 = require("lit");
2125
+ var import_decorators16 = require("lit/decorators.js");
2126
+ var RelRadio = class extends import_lit16.LitElement {
2127
+ constructor() {
2128
+ super(...arguments);
2129
+ this.options = [];
2130
+ this.name = "radio-group";
2131
+ this.selectedValue = null;
2132
+ }
2133
+ onChange(value) {
2134
+ this.selectedValue = value;
2135
+ this.dispatchEvent(
2136
+ new CustomEvent("changed", {
2137
+ detail: { value },
2138
+ bubbles: true,
2139
+ composed: true
2140
+ })
2141
+ );
2142
+ }
2143
+ isChecked(value) {
2144
+ return this.selectedValue === value;
2145
+ }
2146
+ renderOption(option) {
2147
+ const isChecked = this.isChecked(option.value);
2148
+ const classes = [
2149
+ "rel-radio-option",
2150
+ option.disabled ? "disabled" : "",
2151
+ option.error ? "error" : ""
2152
+ ].filter(Boolean).join(" ");
2153
+ return import_lit16.html`
2154
+ <label class="${classes}">
2155
+ <div class="radio-main">
2156
+ <input
2157
+ type="radio"
2158
+ name="${this.name}"
2159
+ .value="${option.value}"
2160
+ .checked="${isChecked}"
2161
+ ?disabled="${option.disabled}"
2162
+ @change="${() => !option.disabled && this.onChange(option.value)}" />
2163
+ <span class="radio-custom"></span>
2164
+ <span class="radio-label">${option.label}</span>
2165
+ </div>
2166
+
2167
+ ${option.supportingText ? import_lit16.html`
2168
+ <div class="radio-supporting ${option.error ? "error-text" : ""}">
2169
+ ${option.supportingText}
2170
+ </div>
2171
+ ` : ""}
2172
+ </label>
2173
+ `;
2174
+ }
2175
+ render() {
2176
+ return import_lit16.html`
2177
+ <div class="rel-radio-group">
2178
+ ${this.options.map((option) => this.renderOption(option))}
2179
+ </div>
2180
+ `;
2181
+ }
2182
+ };
2183
+ RelRadio.styles = import_lit16.css`
2184
+ :host {
2185
+ display: block;
2186
+ font-family: var(--rel-fontFamilies-primary);
2187
+ }
2188
+
2189
+ .rel-radio-group {
2190
+ display: flex;
2191
+ flex-direction: column;
2192
+ gap: var(--rel-spacing-space-xs);
2193
+ }
2194
+
2195
+ .rel-radio-option {
2196
+ display: flex;
2197
+ flex-direction: column;
2198
+ align-items: flex-start;
2199
+ gap: var(--rel-spacing-space-3xs);
2200
+ cursor: pointer;
2201
+ position: relative;
2202
+ }
2203
+
2204
+ .radio-main {
2205
+ display: flex;
2206
+ align-items: center;
2207
+ gap: var(--rel-spacing-space-2xs);
2208
+ }
2209
+
2210
+ .rel-radio-option input {
2211
+ position: absolute;
2212
+ opacity: 0;
2213
+ pointer-events: none;
2214
+ }
2215
+
2216
+ .radio-custom {
2217
+ width: 20px;
2218
+ height: 20px;
2219
+ border: 2px solid var(--rel-colors-black);
2220
+ border-radius: 50%;
2221
+ display: inline-block;
2222
+ position: relative;
2223
+ flex-shrink: 0;
2224
+ transition: all 0.2s ease-in-out;
2225
+ }
2226
+
2227
+ .rel-radio-option input:focus + .radio-custom {
2228
+ outline: var(--rel-borders-width-stroke-200) solid var(--rel-colors-black);
2229
+ outline-offset: var(--rel-spacing-space-3xs);
2230
+ }
2231
+
2232
+ .rel-radio-option input:checked + .radio-custom::after {
2233
+ content: "";
2234
+ position: absolute;
2235
+ top: 50%;
2236
+ left: 50%;
2237
+ width: 10px;
2238
+ height: 10px;
2239
+ background-color: var(--rel-colors-black);
2240
+ border-radius: 50%;
2241
+ transform: translate(-50%, -50%);
2242
+ }
2243
+
2244
+ /* Error state */
2245
+ .rel-radio-option.error .radio-custom {
2246
+ border-color: var(--rel-colors-red-secondary);
2247
+ }
2248
+
2249
+ .rel-radio-option.error input:checked + .radio-custom::after {
2250
+ background-color: var(--rel-colors-red-secondary);
2251
+ }
2252
+
2253
+ .rel-radio-option.error .radio-label,
2254
+ .rel-radio-option.error .radio-supporting {
2255
+ color: var(--rel-colors-red-secondary);
2256
+ }
2257
+
2258
+ .rel-radio-option.error input:focus + .radio-custom {
2259
+ outline: var(--rel-borders-width-stroke-200) solid var(--rel-colors-red-secondary);
2260
+ }
2261
+
2262
+ /* Disabled state */
2263
+ .rel-radio-option.disabled {
2264
+ opacity: 0.6;
2265
+ cursor: not-allowed !important;
2266
+ }
2267
+
2268
+ .rel-radio-option.disabled .radio-label,
2269
+ .rel-radio-option.disabled .radio-supporting {
2270
+ cursor: not-allowed !important;
2271
+ }
2272
+
2273
+ /* Text styles */
2274
+ .radio-label {
2275
+ font-size: var(--rel-fontSizes-sm);
2276
+ font-weight: var(--rel-fontWeights-medium);
2277
+ color: var(--rel-colors-gray-heading);
2278
+ line-height: var(--rel-lineHeights-sm);
2279
+ }
2280
+
2281
+ .radio-supporting {
2282
+ font-size: var(--rel-fontSizes-xs);
2283
+ color: var(--rel-colors-gray-placeholder);
2284
+ margin-left: 28px;
2285
+ line-height: var(--rel-lineHeights-xs);
2286
+ }
2287
+
2288
+ .radio-supporting.error-text {
2289
+ color: var(--rel-colors-red-secondary);
2290
+ }
2291
+ `;
2292
+ __decorateClass([
2293
+ (0, import_decorators16.property)({ type: Array })
2294
+ ], RelRadio.prototype, "options", 2);
2295
+ __decorateClass([
2296
+ (0, import_decorators16.property)({ type: String })
2297
+ ], RelRadio.prototype, "name", 2);
2298
+ __decorateClass([
2299
+ (0, import_decorators16.property)({ type: String })
2300
+ ], RelRadio.prototype, "selectedValue", 2);
2301
+ RelRadio = __decorateClass([
2302
+ (0, import_decorators16.customElement)("rel-radio")
2303
+ ], RelRadio);
2304
+
2305
+ // src/components/rel-segmented-button/rel-segmented-button.ts
2306
+ var import_lit17 = require("lit");
2307
+ var import_decorators17 = require("lit/decorators.js");
2308
+ var RelSegmentedButton = class extends import_lit17.LitElement {
2309
+ constructor() {
2310
+ super(...arguments);
2311
+ this.options = [];
2312
+ this.active = "";
2313
+ this.size = "medium";
2314
+ this.align = "left";
2315
+ }
2316
+ setActive(option) {
2317
+ if (!option.disabled) {
2318
+ this.active = option.value;
2319
+ this.dispatchEvent(
2320
+ new CustomEvent("changed", {
2321
+ detail: { value: option.value },
2322
+ bubbles: true,
2323
+ composed: true
2324
+ })
2325
+ );
2326
+ }
2327
+ }
2328
+ renderSegment(option) {
2329
+ const isActive = this.active === option.value;
2330
+ const classes = [
2331
+ "segment",
2332
+ isActive ? "active" : "",
2333
+ option.disabled ? "disabled" : ""
2334
+ ].filter(Boolean).join(" ");
2335
+ return import_lit17.html`
2336
+ <button
2337
+ class="${classes}"
2338
+ ?disabled="${option.disabled}"
2339
+ @click="${() => this.setActive(option)}">
2340
+ ${option.label}
2341
+ </button>
2342
+ `;
2343
+ }
2344
+ render() {
2345
+ const containerClasses = [
2346
+ "segmented-buttons",
2347
+ this.size,
2348
+ `align-${this.align}`
2349
+ ].join(" ");
2350
+ return import_lit17.html`
2351
+ <div class="${containerClasses}">
2352
+ ${this.options.map((option) => this.renderSegment(option))}
2353
+ </div>
2354
+ `;
2355
+ }
2356
+ };
2357
+ RelSegmentedButton.styles = import_lit17.css`
2358
+ :host {
2359
+ display: inline-block;
2360
+ font-family: var(--rel-fontFamilies-primary);
2361
+ }
2362
+
2363
+ .segmented-buttons {
2364
+ display: inline-flex;
2365
+ border: 2px solid var(--rel-colors-gray-border);
2366
+ border-radius: var(--rel-borders-radius-border-radius-300);
2367
+ overflow: hidden;
2368
+ }
2369
+
2370
+ /* Alignment */
2371
+ .align-left {
2372
+ justify-content: flex-start;
2373
+ }
2374
+
2375
+ .align-middle {
2376
+ justify-content: center;
2377
+ }
2378
+
2379
+ .align-right {
2380
+ justify-content: flex-end;
2381
+ }
2382
+
2383
+ /* Base segment styling */
2384
+ .segment {
2385
+ background: var(--rel-colors-white);
2386
+ border: none;
2387
+ cursor: pointer;
2388
+ font-weight: var(--rel-fontWeights-medium);
2389
+ border-right: 2px solid var(--rel-colors-gray-border);
2390
+ transition: all 0.2s ease-in-out;
2391
+ color: var(--rel-colors-gray-heading);
2392
+ font-family: var(--rel-fontFamilies-primary);
2393
+ outline: none;
2394
+ }
2395
+
2396
+ .segment:last-child {
2397
+ border-right: none;
2398
+ }
2399
+
2400
+ /* Hover */
2401
+ .segment:hover:not(.disabled):not(.active) {
2402
+ background: var(--rel-colors-gray-bg);
2403
+ }
2404
+
2405
+ /* Active */
2406
+ .segment.active {
2407
+ background: var(--rel-colors-black);
2408
+ color: var(--rel-colors-white);
2409
+ }
2410
+
2411
+ .segment.active:hover:not(.disabled) {
2412
+ background: var(--rel-colors-black);
2413
+ color: var(--rel-colors-white);
2414
+ }
2415
+
2416
+ /* Disabled */
2417
+ .segment.disabled,
2418
+ .segment:disabled {
2419
+ cursor: not-allowed;
2420
+ opacity: 0.5;
2421
+ background: var(--rel-colors-gray-bg);
2422
+ color: var(--rel-colors-gray-placeholder);
2423
+ pointer-events: none;
2424
+ }
2425
+
2426
+ /* Sizes */
2427
+ .segmented-buttons.small .segment {
2428
+ padding: var(--rel-spacing-space-3xs) var(--rel-spacing-space-xs);
2429
+ font-size: var(--rel-fontSizes-xs);
2430
+ }
2431
+
2432
+ .segmented-buttons.medium .segment {
2433
+ padding: var(--rel-spacing-space-2xs) var(--rel-spacing-space-sm);
2434
+ font-size: var(--rel-fontSizes-sm);
2435
+ }
2436
+ `;
2437
+ __decorateClass([
2438
+ (0, import_decorators17.property)({ type: Array })
2439
+ ], RelSegmentedButton.prototype, "options", 2);
2440
+ __decorateClass([
2441
+ (0, import_decorators17.property)({ type: String })
2442
+ ], RelSegmentedButton.prototype, "active", 2);
2443
+ __decorateClass([
2444
+ (0, import_decorators17.property)({ type: String })
2445
+ ], RelSegmentedButton.prototype, "size", 2);
2446
+ __decorateClass([
2447
+ (0, import_decorators17.property)({ type: String })
2448
+ ], RelSegmentedButton.prototype, "align", 2);
2449
+ RelSegmentedButton = __decorateClass([
2450
+ (0, import_decorators17.customElement)("rel-segmented-button")
2451
+ ], RelSegmentedButton);
2452
+
2453
+ // src/components/rel-select/rel-select.ts
2454
+ var import_lit18 = require("lit");
2455
+ var import_decorators18 = require("lit/decorators.js");
2456
+ var RelSelect = class extends import_lit18.LitElement {
2457
+ constructor() {
2458
+ super(...arguments);
2459
+ this.label = "";
2460
+ this.options = [];
2461
+ this.selected = "";
2462
+ this.state = "default";
2463
+ this.supportingText = "";
2464
+ this.size = "medium";
2465
+ this.border = "rounded";
2466
+ this.leftIcon = "";
2467
+ this.rightIcon = "";
2468
+ }
2469
+ onChange(event) {
2470
+ const value = event.target.value;
2471
+ this.selected = value;
2472
+ this.dispatchEvent(
2473
+ new CustomEvent("changed", {
2474
+ detail: { value },
2475
+ bubbles: true,
2476
+ composed: true
2477
+ })
2478
+ );
2479
+ }
2480
+ render() {
2481
+ const containerClasses = [
2482
+ "select-container",
2483
+ this.leftIcon ? "with-left-icon" : "",
2484
+ this.rightIcon ? "with-right-icon" : "",
2485
+ `select-${this.size}`
2486
+ ].filter(Boolean).join(" ");
2487
+ const wrapperClasses = [
2488
+ "select-wrapper",
2489
+ `select-${this.state}`,
2490
+ `border-${this.border}`
2491
+ ].join(" ");
2492
+ const selectClasses = [this.state === "error" ? "error" : ""].filter(Boolean).join(" ");
2493
+ const isDisabled = this.state === "disabled";
2494
+ return import_lit18.html`
2495
+ <div class="${wrapperClasses}">
2496
+ ${this.label ? import_lit18.html`<label class="select-label">${this.label}</label>` : ""}
2497
+
2498
+ <div class="${containerClasses}">
2499
+ ${this.leftIcon ? import_lit18.html`<span class="icon left">${this.leftIcon}</span>` : ""}
2500
+
2501
+ <select
2502
+ class="${selectClasses}"
2503
+ ?disabled="${isDisabled}"
2504
+ @change="${this.onChange}"
2505
+ .value="${this.selected}">
2506
+ <option value="" disabled ?selected="${!this.selected}" hidden>
2507
+ Select Option
2508
+ </option>
2509
+ ${this.options.map(
2510
+ (option) => import_lit18.html`
2511
+ <option value="${option}" ?selected="${option === this.selected}">
2512
+ ${option}
2513
+ </option>
2514
+ `
2515
+ )}
2516
+ </select>
2517
+
2518
+ ${this.rightIcon ? import_lit18.html`<span class="icon right">${this.rightIcon}</span>` : ""}
2519
+ </div>
2520
+
2521
+ ${this.supportingText ? import_lit18.html`
2522
+ <span
2523
+ class="supporting-text ${this.state === "error" ? "error-text" : ""}">
2524
+ ${this.supportingText}
2525
+ </span>
2526
+ ` : ""}
2527
+ </div>
2528
+ `;
2529
+ }
2530
+ };
2531
+ RelSelect.styles = import_lit18.css`
2532
+ :host {
2533
+ display: block;
2534
+ font-family: var(--rel-fontFamilies-primary);
2535
+ width: 100%;
2536
+ }
2537
+
2538
+ .select-wrapper {
2539
+ display: flex;
2540
+ flex-direction: column;
2541
+ width: 100%;
2542
+ }
2543
+
2544
+ .select-label {
2545
+ font-size: var(--rel-fontSizes-sm);
2546
+ margin-bottom: var(--rel-spacing-space-3xs);
2547
+ font-weight: var(--rel-fontWeights-medium);
2548
+ color: var(--rel-colors-gray-heading);
2549
+ }
2550
+
2551
+ .select-container {
2552
+ position: relative;
2553
+ display: flex;
2554
+ align-items: center;
2555
+ }
2556
+
2557
+ .icon {
2558
+ position: absolute;
2559
+ display: flex;
2560
+ align-items: center;
2561
+ justify-content: center;
2562
+ pointer-events: none;
2563
+ top: 50%;
2564
+ transform: translateY(-50%);
2565
+ font-size: 16px;
2566
+ color: var(--rel-colors-gray-primary);
2567
+ }
2568
+
2569
+ .icon.left {
2570
+ left: 12px;
2571
+ }
2572
+
2573
+ .icon.right {
2574
+ right: 36px;
2575
+ }
2576
+
2577
+ select {
2578
+ flex: 1;
2579
+ appearance: none;
2580
+ border: 1px solid var(--rel-colors-gray-border);
2581
+ background-color: var(--rel-colors-white);
2582
+ 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");
2583
+ background-repeat: no-repeat;
2584
+ background-position: right 12px center;
2585
+ font-family: var(--rel-fontFamilies-primary);
2586
+ cursor: pointer;
2587
+ transition: all 0.2s ease-in-out;
2588
+ color: var(--rel-colors-gray-heading);
2589
+ width: 100%;
2590
+ outline: none;
2591
+ }
2592
+
2593
+ select:hover:not(:disabled) {
2594
+ border-color: var(--rel-colors-gray-primary);
2595
+ }
2596
+
2597
+ select:focus:not(:disabled) {
2598
+ border-color: var(--rel-colors-black);
2599
+ box-shadow: 0 0 0 3px rgba(0, 0, 0, 0.1);
2600
+ }
2601
+
2602
+ /* States */
2603
+ select.error {
2604
+ border-color: var(--rel-colors-red-secondary);
2605
+ }
2606
+
2607
+ select.error:focus {
2608
+ box-shadow: 0 0 0 3px rgba(213, 0, 0, 0.1);
2609
+ }
2610
+
2611
+ select:disabled {
2612
+ background-color: var(--rel-colors-gray-bg);
2613
+ border-color: var(--rel-colors-gray-border);
2614
+ color: var(--rel-colors-gray-placeholder);
2615
+ cursor: not-allowed;
2616
+ opacity: 0.6;
2617
+ }
2618
+
2619
+ /* Sizes */
2620
+ .select-small select {
2621
+ font-size: var(--rel-fontSizes-xs);
2622
+ padding: var(--rel-spacing-space-3xs) var(--rel-spacing-space-lg)
2623
+ var(--rel-spacing-space-3xs) var(--rel-spacing-space-2xs);
2624
+ }
2625
+
2626
+ .select-medium select {
2627
+ font-size: var(--rel-fontSizes-sm);
2628
+ padding: var(--rel-spacing-space-2xs) var(--rel-spacing-space-xl)
2629
+ var(--rel-spacing-space-2xs) var(--rel-spacing-space-xs);
2630
+ }
2631
+
2632
+ .select-large select {
2633
+ font-size: var(--rel-fontSizes-md);
2634
+ padding: var(--rel-spacing-space-xs) var(--rel-spacing-space-2xl)
2635
+ var(--rel-spacing-space-xs) var(--rel-spacing-space-sm);
2636
+ }
2637
+
2638
+ /* With icons */
2639
+ .with-left-icon.select-small select {
2640
+ padding-left: var(--rel-spacing-space-xl);
2641
+ }
2642
+
2643
+ .with-left-icon.select-medium select {
2644
+ padding-left: var(--rel-spacing-space-2xl);
2645
+ }
2646
+
2647
+ .with-left-icon.select-large select {
2648
+ padding-left: var(--rel-spacing-space-3xl);
2649
+ }
2650
+
2651
+ .with-right-icon.select-small select {
2652
+ padding-right: var(--rel-spacing-space-2xl);
2653
+ }
2654
+
2655
+ .with-right-icon.select-medium select {
2656
+ padding-right: var(--rel-spacing-space-3xl);
2657
+ }
2658
+
2659
+ .with-right-icon.select-large select {
2660
+ padding-right: 4rem;
2661
+ }
2662
+
2663
+ /* Border */
2664
+ .border-rounded select {
2665
+ border-radius: var(--rel-borders-radius-border-radius-300);
2666
+ }
2667
+
2668
+ .border-sharp select {
2669
+ border-radius: 0;
2670
+ }
2671
+
2672
+ /* Supporting text */
2673
+ .supporting-text {
2674
+ font-size: var(--rel-fontSizes-xs);
2675
+ margin-top: var(--rel-spacing-space-3xs);
2676
+ color: var(--rel-colors-gray-placeholder);
2677
+ }
2678
+
2679
+ .error-text {
2680
+ color: var(--rel-colors-red-secondary);
2681
+ }
2682
+ `;
2683
+ __decorateClass([
2684
+ (0, import_decorators18.property)({ type: String })
2685
+ ], RelSelect.prototype, "label", 2);
2686
+ __decorateClass([
2687
+ (0, import_decorators18.property)({ type: Array })
2688
+ ], RelSelect.prototype, "options", 2);
2689
+ __decorateClass([
2690
+ (0, import_decorators18.property)({ type: String })
2691
+ ], RelSelect.prototype, "selected", 2);
2692
+ __decorateClass([
2693
+ (0, import_decorators18.property)({ type: String })
2694
+ ], RelSelect.prototype, "state", 2);
2695
+ __decorateClass([
2696
+ (0, import_decorators18.property)({ type: String })
2697
+ ], RelSelect.prototype, "supportingText", 2);
2698
+ __decorateClass([
2699
+ (0, import_decorators18.property)({ type: String })
2700
+ ], RelSelect.prototype, "size", 2);
2701
+ __decorateClass([
2702
+ (0, import_decorators18.property)({ type: String })
2703
+ ], RelSelect.prototype, "border", 2);
2704
+ __decorateClass([
2705
+ (0, import_decorators18.property)({ type: String })
2706
+ ], RelSelect.prototype, "leftIcon", 2);
2707
+ __decorateClass([
2708
+ (0, import_decorators18.property)({ type: String })
2709
+ ], RelSelect.prototype, "rightIcon", 2);
2710
+ RelSelect = __decorateClass([
2711
+ (0, import_decorators18.customElement)("rel-select")
2712
+ ], RelSelect);
2713
+
2714
+ // src/components/rel-slider/rel-slider.ts
2715
+ var import_lit19 = require("lit");
2716
+ var import_decorators19 = require("lit/decorators.js");
2717
+ var RelSlider = class extends import_lit19.LitElement {
2718
+ constructor() {
2719
+ super(...arguments);
2720
+ this.type = "continuous";
2721
+ this.min = 0;
2722
+ this.max = 100;
2723
+ this.step = 1;
2724
+ this.disabled = false;
2725
+ this.track = "solid";
2726
+ this.showTickLabels = false;
2727
+ this.showBubble = true;
2728
+ this.value = 0;
2729
+ this.ticks = [];
2730
+ }
2731
+ connectedCallback() {
2732
+ super.connectedCallback();
2733
+ this.setupTicks();
2734
+ }
2735
+ updated(changedProperties) {
2736
+ if (changedProperties.has("type") || changedProperties.has("min") || changedProperties.has("max") || changedProperties.has("step")) {
2737
+ this.setupTicks();
2738
+ }
2739
+ if (changedProperties.has("value")) {
2740
+ this.updateActiveWidth();
2741
+ }
2742
+ }
2743
+ get percentage() {
2744
+ if (this.max === this.min) return 0;
2745
+ return (this.value - this.min) / (this.max - this.min) * 100;
2746
+ }
2747
+ setupTicks() {
2748
+ if (this.type !== "discrete") {
2749
+ this.ticks = [];
2750
+ return;
2751
+ }
2752
+ const step = Math.max(1, this.step);
2753
+ const ticks = [];
2754
+ for (let v = this.min; v <= this.max; v += step) {
2755
+ ticks.push(v);
2756
+ }
2757
+ if (ticks[ticks.length - 1] !== this.max) {
2758
+ ticks.push(this.max);
2759
+ }
2760
+ this.ticks = ticks;
2761
+ }
2762
+ getTickLeftPct(tick) {
2763
+ const pct = (tick - this.min) / (this.max - this.min) * 100;
2764
+ return Math.round(pct * 1e3) / 1e3;
2765
+ }
2766
+ isTickActive(tick) {
2767
+ return tick <= this.value;
2768
+ }
2769
+ onInput(ev) {
2770
+ const el = ev.target;
2771
+ let next = Number(el.value);
2772
+ if (this.type === "discrete") {
2773
+ const snapped = Math.round((next - this.min) / this.step) * this.step + this.min;
2774
+ next = Math.min(this.max, Math.max(this.min, snapped));
2775
+ el.value = String(next);
2776
+ }
2777
+ this.value = next;
2778
+ this.updateActiveWidth();
2779
+ this.dispatchEvent(
2780
+ new CustomEvent("valueChange", {
2781
+ detail: { value: this.value },
2782
+ bubbles: true,
2783
+ composed: true
2784
+ })
2785
+ );
2786
+ }
2787
+ updateActiveWidth() {
2788
+ const activeEl = this.shadowRoot?.querySelector(".track-active");
2789
+ if (activeEl) {
2790
+ if (this.type === "discrete") {
2791
+ const stepPercent = this.step / (this.max - this.min) * 100;
2792
+ const snappedPct = Math.round(this.percentage / stepPercent) * stepPercent;
2793
+ activeEl.style.width = `${snappedPct}%`;
2794
+ } else {
2795
+ activeEl.style.width = `${this.percentage}%`;
2796
+ }
2797
+ }
2798
+ }
2799
+ renderThumbContainer() {
2800
+ return import_lit19.html`
2801
+ <div class="thumb-container" style="left: ${this.percentage}%">
2802
+ ${this.showBubble ? import_lit19.html`
2803
+ <div class="value-marker">
2804
+ <svg viewBox="0 0 24 32" xmlns="http://www.w3.org/2000/svg">
2805
+ <path
2806
+ d="M12 0C18.6274 0 24 5.37258 24 12C24 21 12 32 12 32C12 32 0 21 0 12C0 5.37258 5.37258 0 12 0Z"
2807
+ fill="black" />
2808
+ <text
2809
+ x="12"
2810
+ y="16"
2811
+ text-anchor="middle"
2812
+ fill="white"
2813
+ font-size="12"
2814
+ font-family="Poppins"
2815
+ font-weight="600">
2816
+ ${this.value}
2817
+ </text>
2818
+ </svg>
2819
+ </div>
2820
+ ` : ""}
2821
+ <div class="custom-thumb"></div>
2822
+ </div>
2823
+ `;
2824
+ }
2825
+ renderTicks() {
2826
+ if (this.type !== "discrete") return "";
2827
+ return import_lit19.html`
2828
+ <div class="ticks">
2829
+ ${this.ticks.map(
2830
+ (tick) => import_lit19.html`
2831
+ <div
2832
+ class="tick ${this.isTickActive(tick) ? "active" : ""}"
2833
+ style="left: ${this.getTickLeftPct(tick)}%"></div>
2834
+ `
2835
+ )}
2836
+ </div>
2837
+ `;
2838
+ }
2839
+ renderTickLabels() {
2840
+ if (this.type !== "discrete" || !this.showTickLabels) return "";
2841
+ return import_lit19.html`
2842
+ <div class="tick-labels">
2843
+ ${this.ticks.map(
2844
+ (tick) => import_lit19.html`
2845
+ <div
2846
+ class="tick-label"
2847
+ style="left: ${this.getTickLeftPct(tick)}%">
2848
+ ${tick}
2849
+ </div>
2850
+ `
2851
+ )}
2852
+ </div>
2853
+ `;
2854
+ }
2855
+ render() {
2856
+ const sliderClasses = [
2857
+ "rel-slider",
2858
+ this.disabled ? "disabled" : "",
2859
+ this.type === "discrete" ? "has-ticks" : ""
2860
+ ].filter(Boolean).join(" ");
2861
+ const trackActiveClasses = [
2862
+ "track-active",
2863
+ this.track === "dotted" ? "dotted" : ""
2864
+ ].filter(Boolean).join(" ");
2865
+ return import_lit19.html`
2866
+ <div class="${sliderClasses}">
2867
+ <div class="track"></div>
2868
+ <div class="${trackActiveClasses}"></div>
2869
+
2870
+ <input
2871
+ class="slider-input"
2872
+ type="range"
2873
+ .min="${String(this.min)}"
2874
+ .max="${String(this.max)}"
2875
+ .step="${this.type === "discrete" ? String(this.step) : "1"}"
2876
+ .value="${String(this.value)}"
2877
+ ?disabled="${this.disabled}"
2878
+ @input="${this.onInput}" />
2879
+
2880
+ ${this.renderThumbContainer()}
2881
+ ${this.renderTicks()}
2882
+ ${this.renderTickLabels()}
2883
+ </div>
2884
+ `;
2885
+ }
2886
+ };
2887
+ RelSlider.styles = import_lit19.css`
2888
+ :host {
2889
+ --track-height: 5px;
2890
+ --thumb-size: 10px;
2891
+ --thumb-stroke: 7px;
2892
+ --thumb-halo-color: rgba(224, 222, 222, 0.8);
2893
+ --tick-size: 4px;
2894
+ --shadow: 0 2px 4px rgba(0, 0, 0, 0.25);
2895
+ --halo: 0 2px 0 #e9e9e9, 0 6px 10px rgba(0, 0, 0, 0.07);
2896
+ --marker-width: 24px;
2897
+ --marker-height: 28px;
2898
+
2899
+ display: block;
2900
+ font-family: var(--rel-fontFamilies-primary);
2901
+ }
2902
+
2903
+ .rel-slider {
2904
+ position: relative;
2905
+ width: 100%;
2906
+ height: 60px;
2907
+ user-select: none;
2908
+ }
2909
+
2910
+ /* Track */
2911
+ .track {
2912
+ position: absolute;
2913
+ top: 50%;
2914
+ left: 0;
2915
+ width: 100%;
2916
+ height: var(--track-height);
2917
+ background: var(--rel-colors-gray-border);
2918
+ border-radius: 2px;
2919
+ transform: translateY(-50%);
2920
+ pointer-events: none;
2921
+ }
2922
+
2923
+ .track-active {
2924
+ position: absolute;
2925
+ top: 50%;
2926
+ left: 0;
2927
+ height: var(--track-height);
2928
+ background: var(--rel-colors-black);
2929
+ border-radius: 2px;
2930
+ transform: translateY(-50%);
2931
+ pointer-events: none;
2932
+ }
2933
+
2934
+ .track-active.dotted {
2935
+ background: radial-gradient(
2936
+ circle,
2937
+ var(--rel-colors-white) 0 1px,
2938
+ transparent 1px
2939
+ )
2940
+ center/12px 4px repeat-x,
2941
+ var(--rel-colors-black);
2942
+ }
2943
+
2944
+ /* Input */
2945
+ .slider-input {
2946
+ -webkit-appearance: none;
2947
+ appearance: none;
2948
+ position: absolute;
2949
+ top: 0;
2950
+ width: 100%;
2951
+ left: 0;
2952
+ height: 100%;
2953
+ background: transparent;
2954
+ outline: none;
2955
+ cursor: pointer;
2956
+ z-index: 2;
2957
+ margin: 0;
2958
+ padding: 0;
2959
+ }
2960
+
2961
+ .slider-input::-webkit-slider-runnable-track {
2962
+ background: transparent;
2963
+ height: 100%;
2964
+ border: none;
2965
+ }
2966
+
2967
+ .slider-input::-moz-range-track {
2968
+ background: transparent;
2969
+ height: 100%;
2970
+ border: none;
2971
+ }
2972
+
2973
+ /* Hide native thumb */
2974
+ .slider-input::-webkit-slider-thumb {
2975
+ -webkit-appearance: none;
2976
+ appearance: none;
2977
+ width: 1px;
2978
+ height: 1px;
2979
+ background: transparent;
2980
+ border: none;
2981
+ cursor: pointer;
2982
+ }
2983
+
2984
+ .slider-input::-moz-range-thumb {
2985
+ width: 1px;
2986
+ height: 1px;
2987
+ background: transparent;
2988
+ border: none;
2989
+ cursor: pointer;
2990
+ }
2991
+
2992
+ /* Custom Thumb Container */
2993
+ .thumb-container {
2994
+ position: absolute;
2995
+ left: 0;
2996
+ top: 23.5%;
2997
+ transform: translate(-50%, -50%);
2998
+ pointer-events: none;
2999
+ z-index: 5;
3000
+ display: flex;
3001
+ flex-direction: column;
3002
+ align-items: center;
3003
+ gap: 0;
3004
+ }
3005
+
3006
+ /* Value Marker */
3007
+ .value-marker {
3008
+ width: var(--marker-width);
3009
+ height: var(--marker-height);
3010
+ margin-bottom: 4px;
3011
+ }
3012
+
3013
+ .value-marker svg {
3014
+ width: 100%;
3015
+ height: 100%;
3016
+ display: block;
3017
+ }
3018
+
3019
+ /* Custom Thumb */
3020
+ .custom-thumb {
3021
+ width: var(--thumb-size);
3022
+ height: var(--thumb-size);
3023
+ background: var(--rel-colors-black);
3024
+ border-radius: 50%;
3025
+ transition: box-shadow 0.15s ease;
3026
+ }
3027
+
3028
+ .slider-input:active ~ .thumb-container .custom-thumb {
3029
+ box-shadow: 0 0 0 var(--thumb-stroke) var(--thumb-halo-color),
3030
+ var(--shadow), var(--halo);
3031
+ }
3032
+
3033
+ /* Ticks */
3034
+ .ticks {
3035
+ position: absolute;
3036
+ top: 50%;
3037
+ left: 0;
3038
+ width: 100%;
3039
+ transform: translateY(-50%);
3040
+ pointer-events: none;
3041
+ }
3042
+
3043
+ .tick {
3044
+ position: absolute;
3045
+ width: var(--tick-size);
3046
+ height: var(--tick-size);
3047
+ background: var(--rel-colors-gray-primary);
3048
+ border-radius: 50%;
3049
+ transform: translate(-50%, -50%);
3050
+ transition: background 0.2s;
3051
+ z-index: 3;
3052
+ }
3053
+
3054
+ .tick.active {
3055
+ background: var(--rel-colors-white);
3056
+ }
3057
+
3058
+ /* Tick labels */
3059
+ .tick-labels {
3060
+ position: absolute;
3061
+ top: calc(50% + var(--tick-size) + 6px);
3062
+ left: 0;
3063
+ width: 100%;
3064
+ font-size: var(--rel-fontSizes-xs);
3065
+ color: var(--rel-colors-gray-heading);
3066
+ pointer-events: none;
3067
+ }
3068
+
3069
+ .tick-label {
3070
+ position: absolute;
3071
+ transform: translateX(-50%);
3072
+ }
3073
+
3074
+ /* Disabled State */
3075
+ .rel-slider.disabled .track {
3076
+ background: var(--rel-colors-gray-primary);
3077
+ }
3078
+
3079
+ .rel-slider.disabled .track-active {
3080
+ background: var(--rel-colors-gray-placeholder);
3081
+ }
3082
+
3083
+ .rel-slider.disabled .track-active.dotted {
3084
+ background: radial-gradient(
3085
+ circle,
3086
+ #eaeaea 0 1px,
3087
+ transparent 1px
3088
+ )
3089
+ center/12px 4px repeat-x,
3090
+ var(--rel-colors-gray-placeholder);
3091
+ }
3092
+
3093
+ .rel-slider.disabled .tick {
3094
+ background: var(--rel-colors-gray-placeholder);
3095
+ }
3096
+
3097
+ .rel-slider.disabled .tick-label {
3098
+ color: var(--rel-colors-gray-placeholder);
3099
+ }
3100
+
3101
+ .rel-slider.disabled .slider-input {
3102
+ cursor: not-allowed;
3103
+ }
3104
+
3105
+ .rel-slider.disabled .custom-thumb {
3106
+ background: var(--rel-colors-gray-placeholder);
3107
+ box-shadow: 0 0 0 var(--thumb-stroke) #f5f5f5;
3108
+ }
3109
+
3110
+ .rel-slider.disabled .value-marker svg path {
3111
+ fill: var(--rel-colors-gray-placeholder);
3112
+ }
3113
+ `;
3114
+ __decorateClass([
3115
+ (0, import_decorators19.property)({ type: String })
3116
+ ], RelSlider.prototype, "type", 2);
3117
+ __decorateClass([
3118
+ (0, import_decorators19.property)({ type: Number })
3119
+ ], RelSlider.prototype, "min", 2);
3120
+ __decorateClass([
3121
+ (0, import_decorators19.property)({ type: Number })
3122
+ ], RelSlider.prototype, "max", 2);
3123
+ __decorateClass([
3124
+ (0, import_decorators19.property)({ type: Number })
3125
+ ], RelSlider.prototype, "step", 2);
3126
+ __decorateClass([
3127
+ (0, import_decorators19.property)({ type: Boolean })
3128
+ ], RelSlider.prototype, "disabled", 2);
3129
+ __decorateClass([
3130
+ (0, import_decorators19.property)({ type: String })
3131
+ ], RelSlider.prototype, "track", 2);
3132
+ __decorateClass([
3133
+ (0, import_decorators19.property)({ type: Boolean })
3134
+ ], RelSlider.prototype, "showTickLabels", 2);
3135
+ __decorateClass([
3136
+ (0, import_decorators19.property)({ type: Boolean })
3137
+ ], RelSlider.prototype, "showBubble", 2);
3138
+ __decorateClass([
3139
+ (0, import_decorators19.property)({ type: Number })
3140
+ ], RelSlider.prototype, "value", 2);
3141
+ __decorateClass([
3142
+ (0, import_decorators19.state)()
3143
+ ], RelSlider.prototype, "ticks", 2);
3144
+ RelSlider = __decorateClass([
3145
+ (0, import_decorators19.customElement)("rel-slider")
3146
+ ], RelSlider);
3147
+
3148
+ // src/components/rel-snackbar/rel-snackbar.ts
3149
+ var import_lit20 = require("lit");
3150
+ var import_decorators20 = require("lit/decorators.js");
3151
+ var RelSnackbar = class extends import_lit20.LitElement {
3152
+ constructor() {
3153
+ super(...arguments);
3154
+ this.message = "This is a snackbar message";
3155
+ this.longerAction = false;
3156
+ this.iconClose = true;
3157
+ this.lines = "single";
3158
+ this.duration = 4e3;
3159
+ this.visible = true;
3160
+ this.timeout = null;
3161
+ }
3162
+ connectedCallback() {
3163
+ super.connectedCallback();
3164
+ this.setAutoDismiss();
3165
+ }
3166
+ disconnectedCallback() {
3167
+ super.disconnectedCallback();
3168
+ this.clearTimeout();
3169
+ }
3170
+ setAutoDismiss() {
3171
+ if (this.duration > 0) {
3172
+ this.clearTimeout();
3173
+ const delay = this.longerAction ? this.duration * 2 : this.duration;
3174
+ this.timeout = window.setTimeout(() => this.dismiss(), delay);
3175
+ }
3176
+ }
3177
+ clearTimeout() {
3178
+ if (this.timeout !== null) {
3179
+ window.clearTimeout(this.timeout);
3180
+ this.timeout = null;
3181
+ }
3182
+ }
3183
+ onActionClick() {
3184
+ this.dispatchEvent(
3185
+ new CustomEvent("actionClick", {
3186
+ bubbles: true,
3187
+ composed: true
3188
+ })
3189
+ );
3190
+ this.dismiss();
3191
+ }
3192
+ dismiss() {
3193
+ this.visible = false;
3194
+ this.dispatchEvent(
3195
+ new CustomEvent("close", {
3196
+ bubbles: true,
3197
+ composed: true
3198
+ })
3199
+ );
3200
+ }
3201
+ render() {
3202
+ const snackbarClasses = [
3203
+ "snackbar",
3204
+ this.lines === "double" ? "two-line" : "",
3205
+ !this.visible ? "hidden" : ""
3206
+ ].filter(Boolean).join(" ");
3207
+ return import_lit20.html`
3208
+ <div class="${snackbarClasses}">
3209
+ <div class="snackbar-message">${this.message}</div>
3210
+
3211
+ <div class="snackbar-actions">
3212
+ ${this.action ? import_lit20.html`
3213
+ <button class="snackbar-action" @click="${this.onActionClick}">
3214
+ ${this.action}
3215
+ </button>
3216
+ ` : ""}
3217
+ ${this.iconClose ? import_lit20.html`
3218
+ <button class="snackbar-close" @click="${this.dismiss}">
3219
+ ✖
3220
+ </button>
3221
+ ` : ""}
3222
+ </div>
3223
+ </div>
3224
+ `;
3225
+ }
3226
+ };
3227
+ RelSnackbar.styles = import_lit20.css`
3228
+ :host {
3229
+ display: block;
3230
+ font-family: var(--rel-fontFamilies-primary);
3231
+ }
3232
+
3233
+ .snackbar {
3234
+ display: flex;
3235
+ justify-content: space-between;
3236
+ align-items: center;
3237
+ min-width: 280px;
3238
+ max-width: 500px;
3239
+ margin: 0;
3240
+ padding: 12px 16px;
3241
+ border-radius: var(--rel-borders-radius-border-radius-200);
3242
+ background-color: var(--rel-colors-black);
3243
+ color: var(--rel-colors-white);
3244
+ font-family: var(--rel-fontFamilies-primary);
3245
+ box-shadow: var(--rel-shadows-shadow-300);
3246
+ animation: slide-up 0.3s ease-out;
3247
+ }
3248
+
3249
+ .snackbar.two-line {
3250
+ flex-direction: column;
3251
+ align-items: stretch;
3252
+ }
3253
+
3254
+ .snackbar.hidden {
3255
+ display: none;
3256
+ }
3257
+
3258
+ .snackbar-message {
3259
+ font-size: var(--rel-fontSizes-sm);
3260
+ line-height: var(--rel-lineHeights-lineheight-200);
3261
+ margin-right: 12px;
3262
+ flex: 1;
3263
+ }
3264
+
3265
+ .snackbar.two-line .snackbar-message {
3266
+ margin-right: 0;
3267
+ margin-bottom: 8px;
3268
+ flex: none;
3269
+ }
3270
+
3271
+ .snackbar-actions {
3272
+ display: flex;
3273
+ align-items: center;
3274
+ gap: var(--rel-spacing-space-2xs);
3275
+ flex-shrink: 0;
3276
+ align-self: center;
3277
+ }
3278
+
3279
+ .snackbar.two-line .snackbar-actions {
3280
+ align-self: flex-end;
3281
+ }
3282
+
3283
+ .snackbar-action {
3284
+ background: none;
3285
+ border: none;
3286
+ color: var(--rel-colors-green-secondary);
3287
+ font-weight: var(--rel-fontWeights-semibold);
3288
+ font-size: var(--rel-fontSizes-sm);
3289
+ font-family: var(--rel-fontFamilies-primary);
3290
+ cursor: pointer;
3291
+ padding: 0;
3292
+ transition: opacity 0.2s ease;
3293
+ }
3294
+
3295
+ .snackbar-action:hover {
3296
+ opacity: 0.8;
3297
+ }
3298
+
3299
+ .snackbar-action:active {
3300
+ opacity: 0.6;
3301
+ }
3302
+
3303
+ .snackbar-close {
3304
+ background: none;
3305
+ border: none;
3306
+ color: var(--rel-colors-white);
3307
+ cursor: pointer;
3308
+ font-size: 16px;
3309
+ padding: 0;
3310
+ width: 20px;
3311
+ height: 20px;
3312
+ display: flex;
3313
+ align-items: center;
3314
+ justify-content: center;
3315
+ transition: opacity 0.2s ease;
3316
+ }
3317
+
3318
+ .snackbar-close:hover {
3319
+ opacity: 0.8;
3320
+ }
3321
+
3322
+ .snackbar-close:active {
3323
+ opacity: 0.6;
3324
+ }
3325
+
3326
+ @keyframes slide-up {
3327
+ from {
3328
+ transform: translateY(50px);
3329
+ opacity: 0;
3330
+ }
3331
+ to {
3332
+ transform: translateY(0);
3333
+ opacity: 1;
3334
+ }
3335
+ }
3336
+ `;
3337
+ __decorateClass([
3338
+ (0, import_decorators20.property)({ type: String })
3339
+ ], RelSnackbar.prototype, "message", 2);
3340
+ __decorateClass([
3341
+ (0, import_decorators20.property)({ type: String })
3342
+ ], RelSnackbar.prototype, "action", 2);
3343
+ __decorateClass([
3344
+ (0, import_decorators20.property)({ type: Boolean })
3345
+ ], RelSnackbar.prototype, "longerAction", 2);
3346
+ __decorateClass([
3347
+ (0, import_decorators20.property)({ type: Boolean })
3348
+ ], RelSnackbar.prototype, "iconClose", 2);
3349
+ __decorateClass([
3350
+ (0, import_decorators20.property)({ type: String })
3351
+ ], RelSnackbar.prototype, "lines", 2);
3352
+ __decorateClass([
3353
+ (0, import_decorators20.property)({ type: Number })
3354
+ ], RelSnackbar.prototype, "duration", 2);
3355
+ __decorateClass([
3356
+ (0, import_decorators20.state)()
3357
+ ], RelSnackbar.prototype, "visible", 2);
3358
+ RelSnackbar = __decorateClass([
3359
+ (0, import_decorators20.customElement)("rel-snackbar")
3360
+ ], RelSnackbar);
3361
+
3362
+ // src/components/rel-stepper/rel-stepper.ts
3363
+ var import_lit21 = require("lit");
3364
+ var import_decorators21 = require("lit/decorators.js");
3365
+ var RelStepper = class extends import_lit21.LitElement {
3366
+ constructor() {
3367
+ super(...arguments);
3368
+ this.steps = [];
3369
+ this.textAlign = "below";
3370
+ this.orientation = "horizontal";
3371
+ this.size = "large";
3372
+ }
3373
+ isDone(step) {
3374
+ return step.status === "done";
3375
+ }
3376
+ isProgress(step) {
3377
+ return step.status === "progress";
3378
+ }
3379
+ isDisabled(step) {
3380
+ return step.status === "disabled";
3381
+ }
3382
+ getStepClasses(step) {
3383
+ const classes = ["rel-step"];
3384
+ if (this.isDone(step)) classes.push("done");
3385
+ if (this.isProgress(step)) classes.push("progress");
3386
+ if (this.isDisabled(step)) classes.push("disabled");
3387
+ return classes.join(" ");
3388
+ }
3389
+ renderIndicator(step, index) {
3390
+ if (step.status === "done") {
3391
+ return import_lit21.html`
3392
+ <svg
3393
+ xmlns="http://www.w3.org/2000/svg"
3394
+ width="14"
3395
+ height="10"
3396
+ viewBox="0 0 18 14"
3397
+ fill="none"
3398
+ class="check-icon"
3399
+ >
3400
+ <path
3401
+ d="M6.44479 14L0.5 7.36383L1.9862 5.70478L6.44479 10.6819L16.0138 0L17.5 1.65904L6.44479 14Z"
3402
+ fill="white"
3403
+ />
3404
+ </svg>
3405
+ `;
3406
+ }
3407
+ return import_lit21.html`<span>${index + 1}</span>`;
3408
+ }
3409
+ render() {
3410
+ const stepperClasses = [
3411
+ "rel-stepper",
3412
+ this.orientation === "vertical" ? "vertical" : "horizontal",
3413
+ this.textAlign === "below" ? "text-below" : "text-right",
3414
+ this.size === "small" ? "small" : "large"
3415
+ ].filter(Boolean).join(" ");
3416
+ const isVertical = this.orientation === "vertical";
3417
+ const isTextRight = this.textAlign === "right";
3418
+ return import_lit21.html`
3419
+ <div class="${stepperClasses}">
3420
+ ${this.steps.map(
3421
+ (step, idx) => import_lit21.html`
3422
+ <div class="${this.getStepClasses(step)}">
3423
+ ${isVertical && isTextRight ? import_lit21.html`
3424
+ <!-- Indicator with connector below -->
3425
+ <div class="indicator-wrapper">
3426
+ <div class="indicator">
3427
+ ${this.renderIndicator(step, idx)}
3428
+ </div>
3429
+ ${idx < this.steps.length - 1 ? import_lit21.html`<div class="connector"></div>` : ""}
3430
+ </div>
3431
+
3432
+ <!-- Step Label to the right -->
3433
+ <div class="step-label">${step.title}</div>
3434
+ ` : isVertical ? import_lit21.html`
3435
+ <div class="step-content text-below-content">
3436
+ <!-- Step Indicator -->
3437
+ <div class="indicator">
3438
+ ${this.renderIndicator(step, idx)}
3439
+ </div>
3440
+
3441
+ <!-- Step Label -->
3442
+ <div class="step-label">${step.title}</div>
3443
+ </div>
3444
+
3445
+ <!-- Connector -->
3446
+ ${idx < this.steps.length - 1 ? import_lit21.html`<div class="connector"></div>` : ""}
3447
+ ` : import_lit21.html`
3448
+ <!-- Step Indicator -->
3449
+ <div class="indicator">
3450
+ ${this.renderIndicator(step, idx)}
3451
+ </div>
3452
+
3453
+ <!-- Step Label -->
3454
+ <div class="step-label">${step.title}</div>
3455
+
3456
+ <!-- Connector (for horizontal only) -->
3457
+ ${!isVertical && idx < this.steps.length - 1 ? import_lit21.html`<div class="connector"></div>` : ""}
3458
+ `}
3459
+ </div>
3460
+ `
3461
+ )}
3462
+ </div>
3463
+ `;
3464
+ }
3465
+ };
3466
+ RelStepper.styles = import_lit21.css`
3467
+ :host {
3468
+ display: block;
3469
+ font-family: var(--rel-fontFamilies-primary);
3470
+ }
3471
+
3472
+ /********************************************
3473
+ * Base Stepper Styles
3474
+ ********************************************/
3475
+ .rel-stepper {
3476
+ display: flex;
3477
+ font-family: var(--rel-fontFamilies-primary);
3478
+ width: 100%;
3479
+ position: relative;
3480
+ }
3481
+
3482
+ /* Orientation */
3483
+ .rel-stepper.horizontal {
3484
+ flex-direction: row;
3485
+ align-items: flex-start;
3486
+ justify-content: center;
3487
+ }
3488
+
3489
+ .rel-stepper.vertical.text-below {
3490
+ flex-direction: column;
3491
+ align-items: center;
3492
+ justify-content: start;
3493
+ }
3494
+
3495
+ .rel-stepper.vertical.text-right {
3496
+ flex-direction: column;
3497
+ align-items: flex-start;
3498
+ justify-content: start;
3499
+ }
3500
+
3501
+ /********************************************
3502
+ * Step Container
3503
+ ********************************************/
3504
+ .rel-step {
3505
+ display: flex;
3506
+ position: relative;
3507
+ }
3508
+
3509
+ .rel-stepper.horizontal.text-below .rel-step {
3510
+ flex-direction: column;
3511
+ align-items: center;
3512
+ text-align: center;
3513
+ position: relative;
3514
+ flex: 0;
3515
+ }
3516
+
3517
+ .rel-stepper.horizontal.text-right .rel-step {
3518
+ flex-direction: row;
3519
+ align-items: center;
3520
+ position: relative;
3521
+ flex: 0;
3522
+ gap: var(--rel-spacing-space-2xs);
3523
+ }
3524
+
3525
+ /* Vertical layout variants */
3526
+ .rel-stepper.vertical.text-below .rel-step {
3527
+ flex-direction: column;
3528
+ align-items: center;
3529
+ justify-content: start;
3530
+ position: relative;
3531
+ }
3532
+
3533
+ .rel-stepper.vertical.text-right .rel-step {
3534
+ flex-direction: row;
3535
+ align-items: flex-start;
3536
+ justify-content: center;
3537
+ position: relative;
3538
+ gap: var(--rel-spacing-space-2xs);
3539
+ }
3540
+
3541
+ /* Wrapper for indicator and connector */
3542
+ .indicator-wrapper {
3543
+ display: flex;
3544
+ flex-direction: column;
3545
+ align-items: center;
3546
+ position: relative;
3547
+ }
3548
+
3549
+ /* Wrapper for indicator and label (text-below only) */
3550
+ .step-content {
3551
+ display: flex;
3552
+ align-items: center;
3553
+ gap: var(--rel-spacing-space-2xs);
3554
+ }
3555
+
3556
+ .text-below-content {
3557
+ flex-direction: column;
3558
+ }
3559
+
3560
+ .text-right-content {
3561
+ flex-direction: row;
3562
+ }
3563
+
3564
+ /********************************************
3565
+ * Indicator
3566
+ ********************************************/
3567
+ .indicator {
3568
+ display: flex;
3569
+ align-items: center;
3570
+ justify-content: center;
3571
+ width: 22px;
3572
+ height: 22px;
3573
+ border: 2px solid var(--rel-colors-gray-border);
3574
+ background: var(--rel-colors-white);
3575
+ border-radius: 50%;
3576
+ font-size: var(--rel-fontSizes-sm);
3577
+ font-weight: var(--rel-fontWeights-medium);
3578
+ position: relative;
3579
+ z-index: 2;
3580
+ transition: all 0.2s ease;
3581
+ flex-shrink: 0;
3582
+ }
3583
+
3584
+ .indicator svg {
3585
+ width: 12px;
3586
+ height: auto;
3587
+ display: block;
3588
+ }
3589
+
3590
+ /********************************************
3591
+ * Labels
3592
+ ********************************************/
3593
+ .step-label {
3594
+ white-space: nowrap;
3595
+ font-size: var(--rel-fontSizes-sm);
3596
+ color: var(--rel-colors-gray-paragraph);
3597
+ }
3598
+
3599
+ /* Horizontal text-below specific */
3600
+ .rel-stepper.horizontal.text-below .step-label {
3601
+ margin-top: var(--rel-spacing-space-2xs);
3602
+ text-align: center;
3603
+ }
3604
+
3605
+ /* Horizontal text-right specific */
3606
+ .rel-stepper.horizontal.text-right .step-label {
3607
+ margin-top: 0;
3608
+ margin-left: 0;
3609
+ margin-right: var(--rel-spacing-space-xs);
3610
+ text-align: left;
3611
+ }
3612
+
3613
+ /* Vertical text-right specific */
3614
+ .rel-stepper.vertical.text-right .step-label {
3615
+ margin-top: 0;
3616
+ margin-left: 0;
3617
+ text-align: left;
3618
+ }
3619
+
3620
+ /* Vertical text-below specific */
3621
+ .rel-stepper.vertical.text-below .step-label {
3622
+ margin-top: 0;
3623
+ margin-left: 0;
3624
+ text-align: center;
3625
+ }
3626
+
3627
+ /********************************************
3628
+ * Connector Lines
3629
+ ********************************************/
3630
+ .connector {
3631
+ position: absolute;
3632
+ background: var(--rel-colors-gray-border);
3633
+ z-index: 1;
3634
+ }
3635
+
3636
+ /* Horizontal connector */
3637
+ .rel-stepper.horizontal .connector {
3638
+ top: 50%;
3639
+ left: 100%;
3640
+ transform: translateY(-50%);
3641
+ height: 2px;
3642
+ position: absolute;
3643
+ background: var(--rel-colors-gray-border);
3644
+ }
3645
+
3646
+ .rel-stepper.horizontal .rel-step:last-child .connector {
3647
+ display: none;
3648
+ }
3649
+
3650
+ /* Vertical connectors */
3651
+ .rel-stepper.vertical.text-below .connector {
3652
+ top: 100%;
3653
+ left: 50%;
3654
+ transform: translateX(-50%);
3655
+ width: 2px;
3656
+ position: absolute;
3657
+ }
3658
+
3659
+ .rel-stepper.vertical.text-right .connector {
3660
+ top: 100%;
3661
+ left: 50%;
3662
+ transform: translateX(-50%);
3663
+ width: 2px;
3664
+ position: absolute;
3665
+ }
3666
+
3667
+ .rel-stepper.vertical .rel-step:last-child .connector {
3668
+ display: none;
3669
+ }
3670
+
3671
+ .rel-stepper.vertical.text-right .rel-step:last-child .indicator-wrapper .connector {
3672
+ display: none;
3673
+ }
3674
+
3675
+ /********************************************
3676
+ * Step States
3677
+ ********************************************/
3678
+ .rel-step.done .indicator {
3679
+ background: var(--rel-colors-black);
3680
+ border-color: var(--rel-colors-black);
3681
+ color: var(--rel-colors-white);
3682
+ }
3683
+
3684
+ .rel-step.progress .indicator {
3685
+ border-color: var(--rel-colors-black);
3686
+ color: var(--rel-colors-black);
3687
+ background: var(--rel-colors-white);
3688
+ }
3689
+
3690
+ .rel-step.disabled .indicator {
3691
+ background: var(--rel-colors-gray-bg-subtle);
3692
+ border-color: var(--rel-colors-gray-border);
3693
+ color: var(--rel-colors-gray-disabled);
3694
+ }
3695
+
3696
+ .rel-step.done .connector {
3697
+ background: var(--rel-colors-black);
3698
+ }
3699
+
3700
+ .rel-step.progress .connector {
3701
+ background: var(--rel-colors-black);
3702
+ }
3703
+
3704
+ .rel-step.done .step-label {
3705
+ color: var(--rel-colors-black);
3706
+ font-weight: var(--rel-fontWeights-semibold);
3707
+ }
3708
+
3709
+ .rel-step.progress .step-label {
3710
+ color: var(--rel-colors-black);
3711
+ font-weight: var(--rel-fontWeights-semibold);
3712
+ }
3713
+
3714
+ .rel-step.disabled .step-label {
3715
+ color: var(--rel-colors-gray-disabled);
3716
+ }
3717
+
3718
+ /********************************************
3719
+ * Size Property — controls connector length
3720
+ ********************************************/
3721
+ /* Horizontal */
3722
+ .rel-stepper.large.horizontal {
3723
+ gap: 86px;
3724
+ }
3725
+
3726
+ .rel-stepper.small.horizontal {
3727
+ gap: 60px;
3728
+ }
3729
+
3730
+ .rel-stepper.large.horizontal .connector {
3731
+ width: 86px;
3732
+ }
3733
+
3734
+ .rel-stepper.small.horizontal .connector {
3735
+ width: 60px;
3736
+ }
3737
+
3738
+ /* Vertical */
3739
+ .rel-stepper.large.vertical .connector {
3740
+ height: 86px;
3741
+ }
3742
+
3743
+ .rel-stepper.large.vertical {
3744
+ gap: 86px;
3745
+ }
3746
+
3747
+ .rel-stepper.small.vertical .connector {
3748
+ height: 42px;
3749
+ }
3750
+
3751
+ .rel-stepper.small.vertical {
3752
+ gap: 42px;
3753
+ }
3754
+ `;
3755
+ __decorateClass([
3756
+ (0, import_decorators21.property)({ type: Array })
3757
+ ], RelStepper.prototype, "steps", 2);
3758
+ __decorateClass([
3759
+ (0, import_decorators21.property)({ type: String })
3760
+ ], RelStepper.prototype, "textAlign", 2);
3761
+ __decorateClass([
3762
+ (0, import_decorators21.property)({ type: String })
3763
+ ], RelStepper.prototype, "orientation", 2);
3764
+ __decorateClass([
3765
+ (0, import_decorators21.property)({ type: String })
3766
+ ], RelStepper.prototype, "size", 2);
3767
+ RelStepper = __decorateClass([
3768
+ (0, import_decorators21.customElement)("rel-stepper")
3769
+ ], RelStepper);
3770
+
3771
+ // src/components/rel-switch/rel-switch.ts
3772
+ var import_lit22 = require("lit");
3773
+ var import_decorators22 = require("lit/decorators.js");
3774
+ var RelSwitch = class extends import_lit22.LitElement {
3775
+ constructor() {
3776
+ super(...arguments);
3777
+ this.checked = false;
3778
+ this.disabled = false;
3779
+ this.isFocused = false;
3780
+ this.isPressed = false;
3781
+ }
3782
+ toggle() {
3783
+ if (this.disabled) return;
3784
+ this.checked = !this.checked;
3785
+ this.requestUpdate();
3786
+ this.dispatchEvent(
3787
+ new CustomEvent("changed", {
3788
+ detail: this.checked,
3789
+ bubbles: true,
3790
+ composed: true
3791
+ })
3792
+ );
3793
+ }
3794
+ handleFocus() {
3795
+ this.isFocused = true;
3796
+ }
3797
+ handleBlur() {
3798
+ this.isFocused = false;
3799
+ this.isPressed = false;
3800
+ }
3801
+ handleMouseDown() {
3802
+ if (!this.disabled) this.isPressed = true;
3803
+ }
3804
+ handleMouseUp() {
3805
+ if (!this.disabled) this.isPressed = false;
3806
+ }
3807
+ render() {
3808
+ const wrapperClasses = [
3809
+ "switch-wrapper",
3810
+ this.disabled && "switch-disabled",
3811
+ this.isFocused && "switch-focused",
3812
+ this.isPressed && "switch-pressed"
3813
+ ].filter(Boolean).join(" ");
3814
+ return import_lit22.html`
3815
+ <label class="${wrapperClasses}">
3816
+ <input
3817
+ type="checkbox"
3818
+ ?disabled=${this.disabled}
3819
+ .checked=${this.checked}
3820
+ @change=${this.toggle}
3821
+ @focus=${this.handleFocus}
3822
+ @blur=${this.handleBlur}
3823
+ @mousedown=${this.handleMouseDown}
3824
+ @mouseup=${this.handleMouseUp}
3825
+ />
3826
+ <span class="switch-slider"></span>
3827
+ </label>
3828
+ `;
3829
+ }
3830
+ };
3831
+ RelSwitch.styles = import_lit22.css`
3832
+ :host {
3833
+ --switch-track: #7e8186;
3834
+ --switch-knob-on: #000000;
3835
+ --switch-knob-off: #ffffff;
3836
+ --switch-halo: rgba(224, 224, 224, 0.8);
3837
+ --switch-disabled: #d1d5db;
3838
+ display: inline-block;
3839
+ }
3840
+
3841
+ /* Wrapper */
3842
+ .switch-wrapper {
3843
+ position: relative;
3844
+ display: inline-block;
3845
+ width: 42px;
3846
+ height: 22px;
3847
+ cursor: pointer;
3848
+ }
3849
+
3850
+ .switch-wrapper.switch-disabled {
3851
+ cursor: not-allowed;
3852
+ opacity: 0.5;
3853
+ }
3854
+
3855
+ /* Hide native checkbox */
3856
+ .switch-wrapper input {
3857
+ opacity: 0;
3858
+ width: 0;
3859
+ height: 0;
3860
+ }
3861
+
3862
+ /* Track */
3863
+ .switch-slider {
3864
+ position: absolute;
3865
+ top: 50%;
3866
+ left: 4px;
3867
+ right: 4px;
3868
+ height: 12px;
3869
+ background-color: var(--switch-track);
3870
+ border-radius: 999px;
3871
+ transform: translateY(-50%);
3872
+ transition: background-color 0.25s ease;
3873
+ }
3874
+
3875
+ /* Knob */
3876
+ .switch-slider::before {
3877
+ content: "";
3878
+ position: absolute;
3879
+ top: 50%;
3880
+ left: -2px;
3881
+ transform: translateY(-50%);
3882
+ height: 18px;
3883
+ width: 18px;
3884
+ background-color: var(--switch-knob-off);
3885
+ border-radius: 50%;
3886
+ transition: transform 0.25s ease, background-color 0.25s ease,
3887
+ box-shadow 0.2s ease;
3888
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
3889
+ }
3890
+
3891
+ /* ON state */
3892
+ input:checked + .switch-slider::before {
3893
+ background-color: var(--switch-knob-on);
3894
+ transform: translateY(-50%) translateX(22px);
3895
+ }
3896
+
3897
+ /* Hover */
3898
+ .switch-wrapper:hover:not(.switch-disabled) .switch-slider {
3899
+ background-color: #666;
3900
+ }
3901
+
3902
+ /* Focus halo */
3903
+ .switch-focused .switch-slider::before {
3904
+ box-shadow: 0 0 0 6px var(--switch-halo);
3905
+ }
3906
+
3907
+ /* Pressed */
3908
+ .switch-pressed .switch-slider::before {
3909
+ transform: scale(0.9) translateY(-50%);
3910
+ }
3911
+ .switch-pressed input:checked + .switch-slider::before {
3912
+ transform: scale(0.9) translateY(-50%) translateX(22px);
3913
+ }
3914
+
3915
+ /* Disabled */
3916
+ .switch-disabled .switch-slider {
3917
+ background-color: var(--switch-disabled);
3918
+ }
3919
+ .switch-disabled .switch-slider::before {
3920
+ background-color: var(--switch-disabled);
3921
+ }
3922
+ `;
3923
+ __decorateClass([
3924
+ (0, import_decorators22.property)({ type: Boolean })
3925
+ ], RelSwitch.prototype, "checked", 2);
3926
+ __decorateClass([
3927
+ (0, import_decorators22.property)({ type: Boolean })
3928
+ ], RelSwitch.prototype, "disabled", 2);
3929
+ __decorateClass([
3930
+ (0, import_decorators22.state)()
3931
+ ], RelSwitch.prototype, "isFocused", 2);
3932
+ __decorateClass([
3933
+ (0, import_decorators22.state)()
3934
+ ], RelSwitch.prototype, "isPressed", 2);
3935
+ RelSwitch = __decorateClass([
3936
+ (0, import_decorators22.customElement)("rel-switch")
3937
+ ], RelSwitch);
3938
+
3939
+ // src/components/rel-tab/rel-tab.ts
3940
+ var import_lit23 = require("lit");
3941
+ var import_decorators23 = require("lit/decorators.js");
3942
+ var RelTab = class extends import_lit23.LitElement {
3943
+ constructor() {
3944
+ super(...arguments);
3945
+ this.tabs = [];
3946
+ this.activeIndex = 0;
3947
+ }
3948
+ selectTab(index) {
3949
+ if (this.tabs[index]?.disabled) return;
3950
+ this.activeIndex = index;
3951
+ this.dispatchEvent(
3952
+ new CustomEvent("tab-change", {
3953
+ detail: { index },
3954
+ bubbles: true,
3955
+ composed: true
3956
+ })
3957
+ );
3958
+ }
3959
+ onKeyDown(event, index) {
3960
+ if (this.tabs[index]?.disabled) return;
3961
+ if (event.key === "Enter" || event.key === " ") {
3962
+ event.preventDefault();
3963
+ this.selectTab(index);
3964
+ }
3965
+ }
3966
+ render() {
3967
+ return import_lit23.html`
3968
+ <div class="tabs-wrapper">
3969
+ ${this.tabs.map(
3970
+ (tab, i) => import_lit23.html`
3971
+ <div
3972
+ class="tab ${i === this.activeIndex ? "active" : ""} ${tab.disabled ? "disabled" : ""}"
3973
+ role="tab"
3974
+ tabindex="${tab.disabled ? -1 : 0}"
3975
+ @click="${() => this.selectTab(i)}"
3976
+ @keydown="${(e) => this.onKeyDown(e, i)}"
3977
+ >
3978
+ <span class="tab-label">${tab.label}</span>
3979
+ ${tab.badge ? import_lit23.html`<span class="tab-badge">${tab.badge}</span>` : ""}
3980
+ <span class="tab-underline"></span>
3981
+ </div>
3982
+ `
3983
+ )}
3984
+ </div>
3985
+ <div class="tab-content">
3986
+ <slot></slot>
3987
+ </div>
3988
+ `;
3989
+ }
3990
+ };
3991
+ RelTab.styles = import_lit23.css`
3992
+ :host {
3993
+ --tab-active-color: #00f49c;
3994
+ --tab-text-default: #111;
3995
+ --tab-text-disabled: #a5a7aa;
3996
+ --tab-text-hover: #000;
3997
+ --tab-underline-height: 3px;
3998
+ --tab-hover-color: #f3f3f3;
3999
+ display: block;
4000
+ font-family: var(--rel-fontFamilies-primary);
4001
+ }
4002
+
4003
+ .tabs-wrapper {
4004
+ display: flex;
4005
+ border-bottom: 1px solid #e5e5e5;
4006
+ font-family: var(--rel-fontFamilies-primary);
4007
+ user-select: none;
4008
+ }
4009
+
4010
+ .tab {
4011
+ position: relative;
4012
+ padding: 0.75rem 1rem;
4013
+ cursor: pointer;
4014
+ color: var(--tab-text-default);
4015
+ font-size: 0.9rem;
4016
+ font-weight: 500;
4017
+ transition: color 0.2s ease;
4018
+ display: flex;
4019
+ align-items: center;
4020
+ gap: 6px;
4021
+ }
4022
+
4023
+ .tab:hover:not(.disabled) .tab-label {
4024
+ color: var(--tab-text-hover);
4025
+ }
4026
+
4027
+ .tab.disabled {
4028
+ color: var(--tab-text-disabled);
4029
+ cursor: not-allowed;
4030
+ }
4031
+
4032
+ /* Underline */
4033
+ .tab-underline {
4034
+ position: absolute;
4035
+ left: 0;
4036
+ bottom: 0;
4037
+ height: var(--tab-underline-height);
4038
+ width: 100%;
4039
+ background-color: transparent;
4040
+ transition: background-color 0.2s ease, transform 0.2s ease;
4041
+ }
4042
+
4043
+ .tab.active .tab-underline {
4044
+ background-color: var(--tab-active-color);
4045
+ }
4046
+
4047
+ .tab:hover:not(.disabled):not(.active) {
4048
+ background-color: var(--tab-hover-color);
4049
+ }
4050
+
4051
+ /* Badge */
4052
+ .tab-badge {
4053
+ display: inline-flex;
4054
+ justify-content: center;
4055
+ align-items: center;
4056
+ background: #ff0400;
4057
+ color: #fff;
4058
+ border-radius: 50%;
4059
+ font-size: 11px;
4060
+ font-weight: 600;
4061
+ min-width: 16px;
4062
+ text-align: center;
4063
+ height: 16px;
4064
+ padding: 2px;
4065
+ }
4066
+
4067
+ /* Tab content */
4068
+ .tab-content {
4069
+ padding: 1rem 0;
4070
+ }
4071
+ `;
4072
+ __decorateClass([
4073
+ (0, import_decorators23.property)({ type: Array })
4074
+ ], RelTab.prototype, "tabs", 2);
4075
+ __decorateClass([
4076
+ (0, import_decorators23.property)({ type: Number })
4077
+ ], RelTab.prototype, "activeIndex", 2);
4078
+ RelTab = __decorateClass([
4079
+ (0, import_decorators23.customElement)("rel-tab")
4080
+ ], RelTab);
4081
+
4082
+ // src/components/rel-textfield/rel-textfield.ts
4083
+ var import_lit24 = require("lit");
4084
+ var import_decorators24 = require("lit/decorators.js");
4085
+ var RelTextfield = class extends import_lit24.LitElement {
4086
+ constructor() {
4087
+ super(...arguments);
4088
+ this.placeholder = "";
4089
+ this.type = "text";
4090
+ this.value = "";
4091
+ this.state = "default";
4092
+ this.size = "medium";
4093
+ this.internalState = "default";
4094
+ }
4095
+ get currentState() {
4096
+ return this.state !== "default" ? this.state : this.internalState;
4097
+ }
4098
+ handleFocus() {
4099
+ if (this.state !== "disabled" && this.state !== "error") {
4100
+ this.internalState = "focused";
4101
+ }
4102
+ }
4103
+ handleBlur() {
4104
+ if (this.internalState === "focused") {
4105
+ this.internalState = "default";
4106
+ }
4107
+ }
4108
+ handleInput(e) {
4109
+ const input = e.target;
4110
+ this.value = input.value;
4111
+ this.dispatchEvent(
4112
+ new CustomEvent("input-change", {
4113
+ detail: { value: this.value },
4114
+ bubbles: true,
4115
+ composed: true
4116
+ })
4117
+ );
4118
+ }
4119
+ render() {
4120
+ const wrapperClasses = [
4121
+ "textfield-wrapper",
4122
+ this.size,
4123
+ this.currentState
4124
+ ].join(" ");
4125
+ const inputClasses = [
4126
+ "textfield-input",
4127
+ this.leftIcon ? "has-left-icon" : "",
4128
+ this.rightIcon ? "has-right-icon" : ""
4129
+ ].filter(Boolean).join(" ");
4130
+ return import_lit24.html`
4131
+ <div class="${wrapperClasses}">
4132
+ ${this.label ? import_lit24.html`<label class="textfield-label">${this.label}</label>` : ""}
4133
+
4134
+ <div
4135
+ class="textfield-container ${this.state === "disabled" ? "disabled" : ""}"
4136
+ >
4137
+ ${this.leftIcon ? import_lit24.html`<span class="icon left">${this.leftIcon}</span>` : ""}
4138
+
4139
+ <input
4140
+ type="${this.type}"
4141
+ class="${inputClasses}"
4142
+ placeholder="${this.placeholder}"
4143
+ .value="${this.value}"
4144
+ ?disabled="${this.state === "disabled"}"
4145
+ aria-invalid="${this.state === "error"}"
4146
+ @focus="${this.handleFocus}"
4147
+ @blur="${this.handleBlur}"
4148
+ @input="${this.handleInput}"
4149
+ />
4150
+
4151
+ ${this.rightIcon ? import_lit24.html`<span class="icon right">${this.rightIcon}</span>` : ""}
4152
+ </div>
4153
+
4154
+ ${this.supportingText ? import_lit24.html`<div
4155
+ class="textfield-support ${this.state === "error" ? "error" : ""}"
4156
+ >
4157
+ ${this.supportingText}
4158
+ </div>` : ""}
4159
+ </div>
4160
+ `;
4161
+ }
4162
+ };
4163
+ RelTextfield.styles = import_lit24.css`
4164
+ :host {
4165
+ display: block;
4166
+ font-family: var(--rel-fontFamilies-primary);
4167
+ }
4168
+
4169
+ /* Wrapper */
4170
+ .textfield-wrapper {
4171
+ display: flex;
4172
+ flex-direction: column;
4173
+ gap: 4px;
4174
+ width: 100%;
4175
+ }
4176
+
4177
+ /* Label */
4178
+ .textfield-label {
4179
+ font-size: 0.85rem;
4180
+ font-weight: 500;
4181
+ color: #111;
4182
+ }
4183
+
4184
+ /* Container */
4185
+ .textfield-container {
4186
+ display: flex;
4187
+ align-items: center;
4188
+ position: relative;
4189
+ border: 1px solid #ccc;
4190
+ border-radius: 6px;
4191
+ background: white;
4192
+ transition: border 0.2s;
4193
+ }
4194
+
4195
+ .textfield-container.disabled {
4196
+ background: #f5f5f5;
4197
+ cursor: not-allowed;
4198
+ }
4199
+
4200
+ /* Input */
4201
+ .textfield-input {
4202
+ flex: 1;
4203
+ border: none;
4204
+ outline: none;
4205
+ font-size: 0.9rem;
4206
+ padding: 0.5rem 0.75rem;
4207
+ background: transparent;
4208
+ font-family: var(--rel-fontFamilies-primary);
4209
+ }
4210
+
4211
+ .textfield-input:disabled {
4212
+ cursor: not-allowed;
4213
+ color: #999;
4214
+ }
4215
+
4216
+ .icon {
4217
+ position: absolute;
4218
+ display: flex;
4219
+ pointer-events: none;
4220
+ color: #7e8186;
4221
+ }
4222
+
4223
+ .icon.left {
4224
+ left: 8px;
4225
+ }
4226
+
4227
+ .icon.right {
4228
+ right: 8px;
4229
+ }
4230
+
4231
+ .textfield-wrapper.small .textfield-input {
4232
+ padding: 0.5rem 1rem;
4233
+ font-size: 0.9rem;
4234
+ }
4235
+
4236
+ .textfield-wrapper.medium .textfield-input {
4237
+ padding: 0.688rem 1rem;
4238
+ font-size: 1rem;
4239
+ }
4240
+
4241
+ .textfield-wrapper.large .textfield-input {
4242
+ padding: 0.875rem 1rem;
4243
+ font-size: 1.1rem;
4244
+ }
4245
+
4246
+ /* Adjust padding when icons are present */
4247
+ .textfield-wrapper .textfield-input.has-left-icon {
4248
+ padding-left: 2.5rem;
4249
+ }
4250
+
4251
+ .textfield-wrapper .textfield-input.has-right-icon {
4252
+ padding-right: 2.5rem;
4253
+ }
4254
+
4255
+ /* States */
4256
+ .textfield-wrapper.focused .textfield-container {
4257
+ border-color: #111;
4258
+ }
4259
+
4260
+ .textfield-wrapper.error .textfield-container {
4261
+ border-color: #d50000;
4262
+ }
4263
+
4264
+ .textfield-wrapper.disabled .textfield-container {
4265
+ border-color: #d7d9db;
4266
+ }
4267
+
4268
+ /* Supporting text */
4269
+ .textfield-support {
4270
+ font-size: 0.75rem;
4271
+ color: #666;
4272
+ }
4273
+
4274
+ .textfield-support.error {
4275
+ color: #d50000;
4276
+ }
4277
+ `;
4278
+ __decorateClass([
4279
+ (0, import_decorators24.property)({ type: String })
4280
+ ], RelTextfield.prototype, "label", 2);
4281
+ __decorateClass([
4282
+ (0, import_decorators24.property)({ type: String })
4283
+ ], RelTextfield.prototype, "placeholder", 2);
4284
+ __decorateClass([
4285
+ (0, import_decorators24.property)({ type: String })
4286
+ ], RelTextfield.prototype, "type", 2);
4287
+ __decorateClass([
4288
+ (0, import_decorators24.property)({ type: String })
4289
+ ], RelTextfield.prototype, "value", 2);
4290
+ __decorateClass([
4291
+ (0, import_decorators24.property)({ type: String })
4292
+ ], RelTextfield.prototype, "leftIcon", 2);
4293
+ __decorateClass([
4294
+ (0, import_decorators24.property)({ type: String })
4295
+ ], RelTextfield.prototype, "rightIcon", 2);
4296
+ __decorateClass([
4297
+ (0, import_decorators24.property)({ type: String })
4298
+ ], RelTextfield.prototype, "supportingText", 2);
4299
+ __decorateClass([
4300
+ (0, import_decorators24.property)({ type: String })
4301
+ ], RelTextfield.prototype, "state", 2);
4302
+ __decorateClass([
4303
+ (0, import_decorators24.property)({ type: String })
4304
+ ], RelTextfield.prototype, "size", 2);
4305
+ __decorateClass([
4306
+ (0, import_decorators24.state)()
4307
+ ], RelTextfield.prototype, "internalState", 2);
4308
+ RelTextfield = __decorateClass([
4309
+ (0, import_decorators24.customElement)("rel-textfield")
4310
+ ], RelTextfield);
4311
+
4312
+ // src/components/rel-toast/rel-toast.ts
4313
+ var import_lit25 = require("lit");
4314
+ var import_decorators25 = require("lit/decorators.js");
4315
+ var RelToast = class extends import_lit25.LitElement {
4316
+ constructor() {
4317
+ super(...arguments);
4318
+ this.message = "";
4319
+ this.type = "default";
4320
+ this.duration = 4e3;
4321
+ this.visible = false;
4322
+ }
4323
+ show() {
4324
+ this.visible = true;
4325
+ if (this.duration > 0) {
4326
+ this.timeoutId = window.setTimeout(() => this.close(), this.duration);
4327
+ }
4328
+ }
4329
+ close() {
4330
+ this.visible = false;
4331
+ this.dispatchEvent(
4332
+ new CustomEvent("dismissed", {
4333
+ bubbles: true,
4334
+ composed: true
4335
+ })
4336
+ );
4337
+ if (this.timeoutId) {
4338
+ clearTimeout(this.timeoutId);
4339
+ }
4340
+ }
4341
+ handleActionClick(event) {
4342
+ event.stopPropagation();
4343
+ this.dispatchEvent(
4344
+ new CustomEvent("action", {
4345
+ bubbles: true,
4346
+ composed: true
4347
+ })
4348
+ );
4349
+ this.close();
4350
+ }
4351
+ render() {
4352
+ return import_lit25.html`
4353
+ <div class="toast ${this.type} ${this.visible ? "" : "hidden"}">
4354
+ <span class="toast-message">${this.message}</span>
4355
+
4356
+ ${this.actionLabel ? import_lit25.html`<button
4357
+ class="toast-action"
4358
+ @click="${this.handleActionClick}"
4359
+ >
4360
+ ${this.actionLabel}
4361
+ </button>` : ""}
4362
+
4363
+ <button class="toast-close" @click="${this.close}">✕</button>
4364
+ </div>
4365
+ `;
4366
+ }
4367
+ };
4368
+ RelToast.styles = import_lit25.css`
4369
+ :host {
4370
+ position: fixed;
4371
+ bottom: 24px;
4372
+ left: 50%;
4373
+ transform: translateX(-50%);
4374
+ display: flex;
4375
+ justify-content: center;
4376
+ width: 100%;
4377
+ pointer-events: none;
4378
+ z-index: 1000;
4379
+ font-family: var(--rel-fontFamilies-primary);
4380
+ }
4381
+
4382
+ /* Toast container */
4383
+ .toast {
4384
+ display: inline-flex;
4385
+ align-items: center;
4386
+ gap: 12px;
4387
+ background-color: #111;
4388
+ color: #fff;
4389
+ font-family: var(--rel-fontFamilies-primary);
4390
+ font-size: 0.9rem;
4391
+ border-radius: 8px;
4392
+ padding: 1rem 1rem;
4393
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
4394
+ pointer-events: all;
4395
+ animation: fadeInUp 0.25s ease;
4396
+ }
4397
+
4398
+ .toast.error {
4399
+ background-color: #d50000;
4400
+ }
4401
+
4402
+ .toast.hidden {
4403
+ display: none;
4404
+ }
4405
+
4406
+ /* Message */
4407
+ .toast-message {
4408
+ flex: 1;
4409
+ }
4410
+
4411
+ /* Action button */
4412
+ .toast-action {
4413
+ background: transparent;
4414
+ border: none;
4415
+ color: #0edb90;
4416
+ font-weight: 600;
4417
+ font-size: 0.85rem;
4418
+ cursor: pointer;
4419
+ transition: opacity 0.2s;
4420
+ font-family: var(--rel-fontFamilies-primary);
4421
+ }
4422
+
4423
+ .toast-action:hover {
4424
+ opacity: 0.75;
4425
+ }
4426
+
4427
+ /* Close button */
4428
+ .toast-close {
4429
+ background: transparent;
4430
+ border: none;
4431
+ color: inherit;
4432
+ font-size: 1rem;
4433
+ cursor: pointer;
4434
+ line-height: 1;
4435
+ padding: 0;
4436
+ margin-left: 4px;
4437
+ }
4438
+
4439
+ .toast-close:hover {
4440
+ opacity: 0.75;
4441
+ }
4442
+
4443
+ /* Animations */
4444
+ @keyframes fadeInUp {
4445
+ from {
4446
+ opacity: 0;
4447
+ transform: translateY(20px);
4448
+ }
4449
+ to {
4450
+ opacity: 1;
4451
+ transform: translateY(0);
4452
+ }
4453
+ }
4454
+ `;
4455
+ __decorateClass([
4456
+ (0, import_decorators25.property)({ type: String })
4457
+ ], RelToast.prototype, "message", 2);
4458
+ __decorateClass([
4459
+ (0, import_decorators25.property)({ type: String })
4460
+ ], RelToast.prototype, "type", 2);
4461
+ __decorateClass([
4462
+ (0, import_decorators25.property)({ type: String })
4463
+ ], RelToast.prototype, "actionLabel", 2);
4464
+ __decorateClass([
4465
+ (0, import_decorators25.property)({ type: Number })
4466
+ ], RelToast.prototype, "duration", 2);
4467
+ __decorateClass([
4468
+ (0, import_decorators25.state)()
4469
+ ], RelToast.prototype, "visible", 2);
4470
+ RelToast = __decorateClass([
4471
+ (0, import_decorators25.customElement)("rel-toast")
4472
+ ], RelToast);
4473
+
4474
+ // src/components/rel-tooltip/rel-tooltip.ts
4475
+ var import_lit26 = require("lit");
4476
+ var import_decorators26 = require("lit/decorators.js");
4477
+ var RelTooltip = class extends import_lit26.LitElement {
4478
+ constructor() {
4479
+ super(...arguments);
4480
+ this.text = "";
4481
+ this.position = "above";
4482
+ this.showTail = false;
4483
+ }
4484
+ render() {
4485
+ return import_lit26.html`
4486
+ <slot></slot>
4487
+ <div class="tooltip-bubble ${this.position}">
4488
+ ${this.text}
4489
+ ${this.showTail ? import_lit26.html`<span class="tooltip-tail"></span>` : ""}
4490
+ </div>
4491
+ `;
4492
+ }
4493
+ };
4494
+ RelTooltip.styles = import_lit26.css`
4495
+ :host {
4496
+ display: inline-block;
4497
+ position: relative;
4498
+ }
4499
+
4500
+ /* Tooltip container */
4501
+ .tooltip-bubble {
4502
+ position: absolute;
4503
+ left: 50%;
4504
+ transform: translateX(-50%);
4505
+ background-color: #111;
4506
+ color: #fff;
4507
+ padding: 0.5rem 0.75rem;
4508
+ border-radius: 6px;
4509
+ font-size: 0.875rem;
4510
+ font-family: var(--rel-fontFamilies-primary);
4511
+ white-space: nowrap;
4512
+ z-index: 1000;
4513
+ opacity: 0;
4514
+ pointer-events: none;
4515
+ transition: opacity 0.2s ease;
4516
+ }
4517
+
4518
+ :host(:hover) .tooltip-bubble {
4519
+ opacity: 1;
4520
+ }
4521
+
4522
+ /* Positioning */
4523
+ .tooltip-bubble.above {
4524
+ bottom: calc(100% + 8px);
4525
+ }
4526
+
4527
+ .tooltip-bubble.below {
4528
+ top: calc(100% + 8px);
4529
+ }
4530
+
4531
+ /* Tail/Arrow */
4532
+ .tooltip-tail {
4533
+ position: absolute;
4534
+ left: 50%;
4535
+ transform: translateX(-50%);
4536
+ width: 0;
4537
+ height: 0;
4538
+ border-left: 6px solid transparent;
4539
+ border-right: 6px solid transparent;
4540
+ }
4541
+
4542
+ .tooltip-bubble.above .tooltip-tail {
4543
+ bottom: -6px;
4544
+ border-top: 6px solid #111;
4545
+ }
4546
+
4547
+ .tooltip-bubble.below .tooltip-tail {
4548
+ top: -6px;
4549
+ border-bottom: 6px solid #111;
4550
+ }
4551
+ `;
4552
+ __decorateClass([
4553
+ (0, import_decorators26.property)({ type: String })
4554
+ ], RelTooltip.prototype, "text", 2);
4555
+ __decorateClass([
4556
+ (0, import_decorators26.property)({ type: String })
4557
+ ], RelTooltip.prototype, "position", 2);
4558
+ __decorateClass([
4559
+ (0, import_decorators26.property)({ type: Boolean })
4560
+ ], RelTooltip.prototype, "showTail", 2);
4561
+ RelTooltip = __decorateClass([
4562
+ (0, import_decorators26.customElement)("rel-tooltip")
4563
+ ], RelTooltip);
4564
+ // Annotate the CommonJS export names for ESM import in node:
4565
+ 0 && (module.exports = {
4566
+ RelAccordion,
4567
+ RelAlert,
4568
+ RelAvatar,
4569
+ RelBadge,
4570
+ RelBreadcrumbs,
4571
+ RelButton,
4572
+ RelCard,
4573
+ RelCardMedia,
4574
+ RelCheckbox,
4575
+ RelChip,
4576
+ RelContainer,
4577
+ RelDivider,
4578
+ RelLayout,
4579
+ RelMenu,
4580
+ RelProgress,
4581
+ RelRadio,
4582
+ RelSegmentedButton,
4583
+ RelSelect,
4584
+ RelSlider,
4585
+ RelSnackbar,
4586
+ RelStepper,
4587
+ RelSwitch,
4588
+ RelTab,
4589
+ RelTextfield,
4590
+ RelToast,
4591
+ RelTooltip
4592
+ });
4593
+ //# sourceMappingURL=index.js.map