@reliability-design/web 1.1.1 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/dist/components/rel-accordion/rel-accordion.ts +289 -150
  2. package/dist/components/rel-alert/rel-alert.ts +34 -34
  3. package/dist/components/rel-avatar/README.md +15 -4
  4. package/dist/components/rel-avatar/rel-avatar.ts +138 -94
  5. package/dist/components/rel-badge/README.md +7 -0
  6. package/dist/components/rel-badge/rel-badge.ts +39 -2
  7. package/dist/components/rel-breadcrumb/rel-breadcrumb.ts +6 -6
  8. package/dist/components/rel-button/rel-button.ts +96 -28
  9. package/dist/components/rel-calendar/rel-calendar.ts +15 -8
  10. package/dist/components/rel-card/rel-card.ts +9 -17
  11. package/dist/components/rel-cardmedia/rel-cardmedia.ts +20 -23
  12. package/dist/components/rel-carousel/rel-carousel.ts +596 -468
  13. package/dist/components/rel-checkbox/rel-checkbox.ts +68 -16
  14. package/dist/components/rel-chip/README.md +7 -0
  15. package/dist/components/rel-chip/rel-chip.ts +411 -244
  16. package/dist/components/rel-container/rel-container.ts +2 -2
  17. package/dist/components/rel-date-picker/rel-date-picker.ts +23 -19
  18. package/dist/components/rel-divider/rel-divider.ts +3 -3
  19. package/dist/components/rel-drawer/rel-drawer-footer.ts +0 -2
  20. package/dist/components/rel-drawer/rel-drawer.ts +46 -90
  21. package/dist/components/rel-kbd/rel-kbd.ts +94 -118
  22. package/dist/components/rel-layout/rel-layout.ts +49 -58
  23. package/dist/components/rel-menu/rel-menu.ts +359 -359
  24. package/dist/components/rel-menubar/rel-menubar-menu.css +3 -0
  25. package/dist/components/rel-menubar/rel-menubar-menu.ts +2 -1
  26. package/dist/components/rel-menubar/rel-menubar.ts +603 -605
  27. package/dist/components/rel-otp/rel-otp.ts +22 -25
  28. package/dist/components/rel-pagination/rel-pagination.ts +442 -381
  29. package/dist/components/rel-popover/rel-popover-content.ts +6 -5
  30. package/dist/components/rel-popover/rel-popover.ts +26 -7
  31. package/dist/components/rel-progress/rel-progress.ts +10 -9
  32. package/dist/components/rel-radio/rel-radio.ts +228 -172
  33. package/dist/components/rel-range-picker/rel-range-picker.css +349 -0
  34. package/dist/components/rel-range-picker/rel-range-picker.ts +1080 -0
  35. package/dist/components/rel-resizable/rel-resizable-handle.ts +8 -7
  36. package/dist/components/rel-segmented-button/rel-segmented-button.ts +41 -20
  37. package/dist/components/rel-select/README.md +34 -28
  38. package/dist/components/rel-select/rel-select.ts +1015 -275
  39. package/dist/components/rel-sheet/rel-sheet.ts +365 -684
  40. package/dist/components/rel-skeleton/rel-skeleton.ts +139 -0
  41. package/dist/components/rel-slider/rel-slider.ts +49 -27
  42. package/dist/components/rel-snackbar/rel-snackbar.ts +28 -28
  43. package/dist/components/rel-stepper/rel-stepper.ts +11 -10
  44. package/dist/components/rel-switch/rel-switch.ts +7 -6
  45. package/dist/components/rel-tab/rel-tab.ts +15 -29
  46. package/dist/components/rel-textfield/rel-textfield.ts +192 -35
  47. package/dist/components/rel-toast/rel-toast.ts +21 -13
  48. package/dist/components/rel-tooltip/rel-tooltip.ts +123 -123
  49. package/dist/components/rel-topbar/rel-topbar-actions.ts +1 -0
  50. package/dist/components/rel-topbar/rel-topbar-brand.ts +1 -0
  51. package/dist/components/rel-topbar/rel-topbar-dropdown-item.ts +32 -2
  52. package/dist/components/rel-topbar/rel-topbar-dropdown.ts +1 -1
  53. package/dist/components/rel-topbar/rel-topbar-item.ts +15 -10
  54. package/dist/components/rel-topbar/rel-topbar-mobile-panel.ts +1 -0
  55. package/dist/components/rel-topbar/rel-topbar-profile.ts +30 -56
  56. package/dist/components/rel-topbar/rel-topbar-utilities.ts +1 -0
  57. package/dist/components/rel-topbar/rel-topbar.ts +137 -28
  58. package/dist/index.d.mts +310 -193
  59. package/dist/index.d.ts +310 -193
  60. package/dist/index.js +5562 -3526
  61. package/dist/index.js.map +1 -1
  62. package/dist/index.mjs +5328 -3284
  63. package/dist/index.mjs.map +1 -1
  64. package/dist/rel-menubar-menu-BEEQDAXW.css +3 -0
  65. package/dist/styles/vars-v2.css +525 -0
  66. package/dist/styles/vars.css +346 -346
  67. package/dist/{vars-TBB4BMSD.css → vars-I2PC74XD.css} +346 -346
  68. package/dist/vars-v2-VMGWTFJZ.css +525 -0
  69. package/package.json +2 -1
@@ -1,9 +1,13 @@
1
1
  import { LitElement, html, css } from "lit";
2
- import { customElement, property } from "lit/decorators.js";
2
+ import { customElement, property, state } from "lit/decorators.js";
3
+ import "../../styles/vars-v2.css";
4
+ import "@reliability-design/icons/rel-icon";
3
5
  import "./rel-topbar-brand";
4
6
  import "./rel-topbar-actions";
5
7
  import "./rel-topbar-utilities";
6
8
  import "./rel-topbar-mobile-panel";
9
+ import "./rel-topbar-dropdown";
10
+ import "./rel-topbar-dropdown-item";
7
11
 
8
12
  export type TopbarVariant = "customer" | "carrier";
9
13
  export type TopbarForceLayout = "auto" | "desktop" | "tablet" | "mobile";
@@ -47,20 +51,28 @@ export class RelTopbar extends LitElement {
47
51
  */
48
52
  @property({ type: String }) forceLayout: TopbarForceLayout = "auto";
49
53
 
54
+ private _overflowItems: Element[] = [];
55
+ @state() private _overflowCount: number = 0;
56
+ @state() private _overflowItemsData: Array<{ label: string; href: string; disabled: boolean }> = [];
57
+ private _resizeObserver?: ResizeObserver;
58
+ private _resizeTimer?: number;
59
+ private _measuring = false;
60
+ private _lastNavWidth = 0;
61
+
50
62
  static styles = css`
51
63
  /* ─── Component tokens ─────────────────────────────────────────── */
52
64
  :host {
53
65
  --rel-topbar-height: 64px;
54
66
  --rel-topbar-height-compact: 48px;
55
- --rel-topbar-bg: var(--rel-colors-white, #fff);
67
+ --rel-topbar-bg: var(--rel-color-bg-primary);
56
68
  --rel-topbar-border-color: var(--rel-border-default, #ddd);
57
- --rel-topbar-item-color: var(--rel-text-primary, #333);
69
+ --rel-topbar-item-color: var(--rel-color-text-primary);
58
70
  --rel-topbar-item-active-color: var(--rel-colors-green-tertiary, #00a86b);
59
71
  --rel-topbar-item-active-indicator: var(--rel-colors-green-primary, #00f49c);
60
- --rel-topbar-item-hover-bg: var(--rel-surface-secondary, #fafafa);
72
+ --rel-topbar-item-hover-bg: var(--rel-color-bg-secondary);
61
73
  --rel-topbar-divider-color: var(--rel-border-divider, #bdbdbd);
62
- --rel-topbar-carrier-action-bg: var(--rel-colors-gray-primary, #333);
63
- --rel-topbar-carrier-action-color: var(--rel-colors-white, #fff);
74
+ --rel-topbar-carrier-action-bg: var(--rel-color-text-primary);
75
+ --rel-topbar-carrier-action-color: var(--rel-color-bg-primary);
64
76
  --rel-topbar-z: 100;
65
77
 
66
78
  display: block;
@@ -102,7 +114,7 @@ export class RelTopbar extends LitElement {
102
114
  .nav-region {
103
115
  display: flex;
104
116
  align-items: center;
105
- flex: 1;
117
+ flex: 1 1 0;
106
118
  gap: var(--rel-spacing-space-2xs, 4px);
107
119
  min-width: 0;
108
120
  }
@@ -112,6 +124,7 @@ export class RelTopbar extends LitElement {
112
124
  display: flex;
113
125
  align-items: center;
114
126
  flex-shrink: 0;
127
+ margin-left: auto;
115
128
  gap: var(--rel-spacing-space-xs, 8px);
116
129
  }
117
130
 
@@ -180,6 +193,32 @@ export class RelTopbar extends LitElement {
180
193
  display: block;
181
194
  }
182
195
 
196
+ .mobile-overflow-nav {
197
+ display: flex;
198
+ flex-direction: column;
199
+ padding: var(--rel-spacing-space-xs, 8px) 0;
200
+ border-top: 1px solid var(--rel-topbar-border-color);
201
+ }
202
+
203
+ .mobile-overflow-item {
204
+ display: block;
205
+ padding: var(--rel-spacing-space-xs, 8px) var(--rel-spacing-space-xl, 24px);
206
+ color: var(--rel-topbar-item-color);
207
+ font-family: var(--rel-fontFamilies-primary, Poppins, sans-serif);
208
+ font-size: var(--rel-fontSizes-md, 14px);
209
+ font-weight: var(--rel-fontWeights-medium, 500);
210
+ text-decoration: none;
211
+ }
212
+
213
+ .mobile-overflow-item:hover {
214
+ background: var(--rel-topbar-item-hover-bg);
215
+ }
216
+
217
+ .mobile-overflow-item.disabled {
218
+ opacity: 0.45;
219
+ pointer-events: none;
220
+ }
221
+
183
222
  /* ─── Responsive: auto mode (CSS media queries) ─────────────────── */
184
223
  @media (max-width: 768px) {
185
224
  .topbar:not(.force-desktop) .nav-region {
@@ -217,6 +256,69 @@ export class RelTopbar extends LitElement {
217
256
  }
218
257
  `;
219
258
 
259
+ override firstUpdated() {
260
+ const navRegion = this.renderRoot.querySelector(".nav-region") as HTMLElement;
261
+ if (navRegion) {
262
+ this._resizeObserver = new ResizeObserver(() => {
263
+ clearTimeout(this._resizeTimer);
264
+ this._resizeTimer = window.setTimeout(() => this._measureNav(), 150);
265
+ });
266
+ this._resizeObserver.observe(navRegion);
267
+ }
268
+ requestAnimationFrame(() => this._measureNav());
269
+ }
270
+
271
+ override disconnectedCallback() {
272
+ super.disconnectedCallback();
273
+ this._resizeObserver?.disconnect();
274
+ clearTimeout(this._resizeTimer);
275
+ }
276
+
277
+ private _measureNav() {
278
+ if (this._measuring) return;
279
+ this._measuring = true;
280
+ const navRegion = this.renderRoot.querySelector(".nav-region") as HTMLElement;
281
+ if (!navRegion) return;
282
+ const navSlot = this.renderRoot.querySelector('slot[name="nav"]') as HTMLSlotElement;
283
+ if (!navSlot) return;
284
+ const items = Array.from(navSlot.assignedElements()).filter(
285
+ el => el.tagName.toLowerCase() !== "rel-topbar-item" || !el.hasAttribute("data-more")
286
+ );
287
+ const navWidth = navRegion.getBoundingClientRect().width;
288
+ if (Math.abs(navWidth - this._lastNavWidth) < 2) return;
289
+ this._lastNavWidth = navWidth;
290
+ const available = navWidth - 120;
291
+
292
+ let accumulated = 0;
293
+ let firstOverflowIndex = items.length;
294
+ for (let i = 0; i < items.length; i++) {
295
+ accumulated += items[i].getBoundingClientRect().width;
296
+ if (accumulated > available) {
297
+ firstOverflowIndex = i;
298
+ break;
299
+ }
300
+ }
301
+
302
+ const overflowingElements = Array.from(items).slice(firstOverflowIndex);
303
+ this._overflowItems = overflowingElements;
304
+ this._overflowCount = overflowingElements.length;
305
+ this._overflowItemsData = overflowingElements.map(el => ({
306
+ label: el.getAttribute("label") ?? "",
307
+ href: el.getAttribute("href") ?? "",
308
+ disabled: el.hasAttribute("disabled"),
309
+ }));
310
+
311
+ for (const el of items) {
312
+ if (overflowingElements.includes(el)) {
313
+ el.setAttribute("hidden", "");
314
+ } else {
315
+ el.removeAttribute("hidden");
316
+ }
317
+ }
318
+
319
+ this._measuring = false;
320
+ }
321
+
220
322
  private onRouterSlotChange(e: Event) {
221
323
  const slot = e.target as HTMLSlotElement;
222
324
  for (const el of slot.assignedElements({ flatten: true })) {
@@ -265,7 +367,20 @@ export class RelTopbar extends LitElement {
265
367
  </div>
266
368
 
267
369
  <nav class="nav-region" aria-label="Primary">
268
- <slot name="nav"></slot>
370
+ <slot name="nav" @slotchange=${this._measureNav}></slot>
371
+ ${this._overflowCount > 0 ? html`
372
+ <rel-topbar-item label="More" expandable data-more>
373
+ <rel-topbar-dropdown slot="dropdown">
374
+ ${this._overflowItemsData.map(item => html`
375
+ <rel-topbar-dropdown-item
376
+ label=${item.label}
377
+ href=${item.href}
378
+ ?disabled=${item.disabled}
379
+ ></rel-topbar-dropdown-item>
380
+ `)}
381
+ </rel-topbar-dropdown>
382
+ </rel-topbar-item>
383
+ ` : null}
269
384
  </nav>
270
385
 
271
386
  <div class="right-region">
@@ -288,7 +403,9 @@ export class RelTopbar extends LitElement {
288
403
  aria-controls="mobile-panel"
289
404
  @click=${this.handleMenuToggle}
290
405
  >
291
- ${this.mobileOpen ? _iconClose() : _iconMenu()}
406
+ ${this.mobileOpen
407
+ ? html`<rel-icon name="close" size="md"></rel-icon>`
408
+ : html`<rel-icon name="hamburger" size="md"></rel-icon>`}
292
409
  </button>
293
410
  `
294
411
  : null}
@@ -303,27 +420,19 @@ export class RelTopbar extends LitElement {
303
420
  aria-label="Mobile navigation"
304
421
  >
305
422
  <slot name="mobile-panel"></slot>
423
+ ${this._overflowItemsData.length > 0 ? html`
424
+ <div class="mobile-overflow-nav">
425
+ ${this._overflowItemsData.map(item => html`
426
+ <a
427
+ class="mobile-overflow-item ${item.disabled ? "disabled" : ""}"
428
+ href=${item.href}
429
+ ?aria-disabled=${item.disabled}
430
+ >${item.label}</a>
431
+ `)}
432
+ </div>
433
+ ` : null}
306
434
  </div>
307
435
  `;
308
436
  }
309
437
  }
310
438
 
311
- /* ─── Inline SVG helpers ──────────────────────────────────────────────── */
312
-
313
- function _iconMenu() {
314
- return html`
315
- <svg width="20" height="20" viewBox="0 0 20 20" fill="none" aria-hidden="true" focusable="false">
316
- <rect x="2" y="5" width="16" height="1.5" rx="0.75" fill="currentColor"/>
317
- <rect x="2" y="9.25" width="16" height="1.5" rx="0.75" fill="currentColor"/>
318
- <rect x="2" y="13.5" width="16" height="1.5" rx="0.75" fill="currentColor"/>
319
- </svg>
320
- `;
321
- }
322
-
323
- function _iconClose() {
324
- return html`
325
- <svg width="20" height="20" viewBox="0 0 20 20" fill="none" aria-hidden="true" focusable="false">
326
- <path d="M5 5L15 15M15 5L5 15" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/>
327
- </svg>
328
- `;
329
- }