@reliability-design/web 1.3.1 → 1.4.1

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 (124) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/components/rel-accordion/README.md +13 -13
  3. package/dist/components/rel-accordion/rel-accordion.ts +80 -45
  4. package/dist/components/rel-alert/README.md +15 -15
  5. package/dist/components/rel-alert/rel-alert.ts +149 -158
  6. package/dist/components/rel-avatar/README.md +15 -15
  7. package/dist/components/rel-avatar/rel-avatar.ts +42 -38
  8. package/dist/components/rel-badge/README.md +5 -5
  9. package/dist/components/rel-badge/rel-badge.ts +46 -11
  10. package/dist/components/rel-breadcrumb/README.md +7 -7
  11. package/dist/components/rel-breadcrumb/rel-breadcrumb.ts +16 -13
  12. package/dist/components/rel-button/README.md +20 -20
  13. package/dist/components/rel-button/rel-button.ts +292 -105
  14. package/dist/components/rel-calendar/README.md +5 -5
  15. package/dist/components/rel-calendar/rel-calendar.ts +68 -45
  16. package/dist/components/rel-card/README.md +6 -6
  17. package/dist/components/rel-card/rel-card.ts +88 -35
  18. package/dist/components/rel-cardmedia/README.md +9 -9
  19. package/dist/components/rel-cardmedia/rel-cardmedia.ts +27 -20
  20. package/dist/components/rel-carousel/README.md +3 -3
  21. package/dist/components/rel-carousel/rel-carousel.ts +174 -90
  22. package/dist/components/rel-chart/README.md +8 -8
  23. package/dist/components/rel-chart/rel-chart.ts +59 -41
  24. package/dist/components/rel-checkbox/README.md +7 -7
  25. package/dist/components/rel-checkbox/rel-checkbox.ts +61 -61
  26. package/dist/components/rel-chip/README.md +16 -16
  27. package/dist/components/rel-chip/rel-chip.ts +143 -111
  28. package/dist/components/rel-container/README.md +11 -11
  29. package/dist/components/rel-container/rel-container.ts +35 -9
  30. package/dist/components/rel-date-picker/README.md +43 -7
  31. package/dist/components/rel-date-picker/date-format.test.ts +43 -0
  32. package/dist/components/rel-date-picker/date-format.ts +47 -0
  33. package/dist/components/rel-date-picker/rel-date-picker.ts +154 -82
  34. package/dist/components/rel-divider/README.md +9 -9
  35. package/dist/components/rel-divider/rel-divider.ts +10 -9
  36. package/dist/components/rel-drawer/README.md +1 -1
  37. package/dist/components/rel-drawer/rel-drawer-footer.ts +1 -1
  38. package/dist/components/rel-drawer/rel-drawer.ts +88 -25
  39. package/dist/components/rel-kbd/README.md +20 -20
  40. package/dist/components/rel-kbd/rel-kbd.ts +119 -25
  41. package/dist/components/rel-layout/README.md +1 -1
  42. package/dist/components/rel-layout/rel-layout.ts +2 -2
  43. package/dist/components/rel-menu/README.md +15 -15
  44. package/dist/components/rel-menu/rel-menu.ts +155 -88
  45. package/dist/components/rel-menubar/README.md +20 -20
  46. package/dist/components/rel-menubar/rel-menubar.ts +47 -31
  47. package/dist/components/rel-nav-menu/README.md +21 -21
  48. package/dist/components/rel-nav-menu/rel-nav-menu-item.ts +17 -14
  49. package/dist/components/rel-nav-menu/rel-nav-menu-panel.ts +33 -14
  50. package/dist/components/rel-nav-menu/rel-nav-menu.ts +14 -7
  51. package/dist/components/rel-navbar/README.md +7 -7
  52. package/dist/components/rel-navbar/rel-navbar.ts +12 -11
  53. package/dist/components/rel-otp/README.md +3 -3
  54. package/dist/components/rel-otp/rel-otp.ts +46 -30
  55. package/dist/components/rel-pagination/README.md +18 -18
  56. package/dist/components/rel-pagination/rel-pagination.ts +141 -90
  57. package/dist/components/rel-popover/README.md +13 -13
  58. package/dist/components/rel-popover/rel-popover-content.ts +39 -14
  59. package/dist/components/rel-popover/rel-popover.ts +18 -7
  60. package/dist/components/rel-progress/README.md +5 -5
  61. package/dist/components/rel-progress/rel-progress.ts +16 -12
  62. package/dist/components/rel-radio/README.md +9 -9
  63. package/dist/components/rel-radio/rel-radio.ts +64 -50
  64. package/dist/components/rel-range-picker/rel-range-picker.ts +120 -117
  65. package/dist/components/rel-resizable/README.md +4 -4
  66. package/dist/components/rel-resizable/rel-resizable-group.ts +15 -4
  67. package/dist/components/rel-resizable/rel-resizable-handle.ts +13 -9
  68. package/dist/components/rel-resizable/rel-resizable-panel.ts +11 -0
  69. package/dist/components/rel-segmented-button/README.md +10 -10
  70. package/dist/components/rel-segmented-button/rel-segmented-button.ts +39 -40
  71. package/dist/components/rel-select/README.md +14 -14
  72. package/dist/components/rel-select/rel-select.ts +120 -188
  73. package/dist/components/rel-sheet/README.md +10 -10
  74. package/dist/components/rel-sheet/rel-sheet.ts +82 -23
  75. package/dist/components/rel-sidebar/README.md +5 -5
  76. package/dist/components/rel-sidebar/rel-sidebar.ts +75 -60
  77. package/dist/components/rel-skeleton/rel-skeleton.ts +8 -13
  78. package/dist/components/rel-slider/README.md +10 -10
  79. package/dist/components/rel-slider/rel-slider.ts +230 -57
  80. package/dist/components/rel-snackbar/README.md +9 -9
  81. package/dist/components/rel-snackbar/rel-snackbar.ts +44 -32
  82. package/dist/components/rel-stepper/README.md +10 -10
  83. package/dist/components/rel-stepper/rel-stepper.ts +110 -46
  84. package/dist/components/rel-switch/README.md +5 -5
  85. package/dist/components/rel-switch/rel-switch.ts +23 -12
  86. package/dist/components/rel-tab/README.md +13 -13
  87. package/dist/components/rel-tab/rel-tab.ts +63 -19
  88. package/dist/components/rel-table/README.md +7 -7
  89. package/dist/components/rel-table/rel-table-body.ts +2 -1
  90. package/dist/components/rel-table/rel-table-caption.ts +10 -7
  91. package/dist/components/rel-table/rel-table-cell.ts +7 -6
  92. package/dist/components/rel-table/rel-table-footer.ts +4 -3
  93. package/dist/components/rel-table/rel-table-head.ts +11 -9
  94. package/dist/components/rel-table/rel-table-header.ts +2 -1
  95. package/dist/components/rel-table/rel-table-row.ts +5 -4
  96. package/dist/components/rel-table/rel-table.ts +16 -7
  97. package/dist/components/rel-textfield/README.md +11 -11
  98. package/dist/components/rel-textfield/rel-textfield.ts +218 -92
  99. package/dist/components/rel-toast/README.md +11 -11
  100. package/dist/components/rel-toast/rel-toast.ts +33 -30
  101. package/dist/components/rel-tooltip/README.md +7 -7
  102. package/dist/components/rel-tooltip/rel-tooltip.ts +160 -123
  103. package/dist/components/rel-topbar/rel-topbar-actions.ts +1 -2
  104. package/dist/components/rel-topbar/rel-topbar-brand.ts +8 -5
  105. package/dist/components/rel-topbar/rel-topbar-dropdown-item.ts +10 -8
  106. package/dist/components/rel-topbar/rel-topbar-dropdown.ts +4 -5
  107. package/dist/components/rel-topbar/rel-topbar-item.ts +23 -22
  108. package/dist/components/rel-topbar/rel-topbar-mobile-panel.ts +0 -1
  109. package/dist/components/rel-topbar/rel-topbar-profile.ts +68 -50
  110. package/dist/components/rel-topbar/rel-topbar-utilities.ts +1 -2
  111. package/dist/components/rel-topbar/rel-topbar.ts +31 -29
  112. package/dist/index.d.mts +159 -39
  113. package/dist/index.d.ts +159 -39
  114. package/dist/index.js +3600 -2269
  115. package/dist/index.js.map +1 -1
  116. package/dist/index.mjs +3930 -2600
  117. package/dist/index.mjs.map +1 -1
  118. package/dist/styles/vars.css +866 -363
  119. package/dist/vars-BYCEEKWJ.css +866 -0
  120. package/package.json +5 -3
  121. package/dist/components/rel-range-picker/rel-range-picker.css +0 -349
  122. package/dist/styles/vars-v2.css +0 -525
  123. package/dist/vars-F54UGCHM.css +0 -363
  124. package/dist/vars-v2-VMGWTFJZ.css +0 -525
package/dist/index.d.ts CHANGED
@@ -8,6 +8,8 @@ declare class RelAccordion extends LitElement {
8
8
  open: boolean;
9
9
  size: "md" | "sm";
10
10
  type: "default" | "action";
11
+ /** Figma "Style" axis — named appearance because `style` collides with the HTML style attribute. */
12
+ appearance: "shadow" | "plain";
11
13
  static styles: lit.CSSResult;
12
14
  private toggle;
13
15
  render(): lit_html.TemplateResult<1>;
@@ -15,6 +17,8 @@ declare class RelAccordion extends LitElement {
15
17
 
16
18
  declare class RelAlert extends LitElement {
17
19
  type: "info" | "success" | "warning" | "error" | "neutral";
20
+ /** Visual treatment (Figma "Style"): solid | subtle | outline. "filled" is a deprecated alias of solid. */
21
+ appearance: "solid" | "subtle" | "outline" | "filled";
18
22
  message1: string;
19
23
  message2?: string;
20
24
  urlText?: string;
@@ -23,7 +27,7 @@ declare class RelAlert extends LitElement {
23
27
  dismissed: boolean;
24
28
  static styles: lit.CSSResult;
25
29
  private dismissAlert;
26
- private get iconSvg();
30
+ private get iconTemplate();
27
31
  render(): lit_html.TemplateResult<1>;
28
32
  }
29
33
 
@@ -44,7 +48,7 @@ declare class RelBadge extends LitElement {
44
48
  number: string;
45
49
  ariaLabel: string;
46
50
  suffix: string;
47
- size: "sm" | "md" | "lg";
51
+ size: "sm" | "md" | "lg" | "xl";
48
52
  variant: "dot" | "number";
49
53
  /**
50
54
  * Direct CSS color override for the badge background. Accepts any valid
@@ -76,9 +80,27 @@ declare class RelBreadcrumbs extends LitElement {
76
80
  render(): lit_html.TemplateResult<1>;
77
81
  }
78
82
 
83
+ /**
84
+ * Style axis. Canonical values are the historical ones; "outline"/"ghost" are
85
+ * accepted Figma-vocabulary aliases for "secondary"/"text". "static" is the
86
+ * Figma Style=Static treatment (transparent, static-light label — for use on
87
+ * colored/dark surfaces). Legacy "icon" is the pre-2.0 collapsed icon-button
88
+ * variant and keeps its exact behavior; prefer icon-only + a style instead.
89
+ */
90
+ type ButtonVariant = "default" | "primary" | "secondary" | "text" | "link" | "icon" | "static" | "outline" | "ghost";
91
+ /** Tone axis. "neutral"/"brand"/"danger" are Figma-vocabulary aliases. */
92
+ type ButtonTone = "default" | "primary" | "secondary" | "critical" | "success" | "neutral" | "brand" | "danger";
79
93
  declare class RelButton extends LitElement {
80
- variant: "default" | "primary" | "secondary" | "text" | "link" | "icon";
81
- tone: "default" | "primary" | "secondary" | "critical" | "success";
94
+ variant: ButtonVariant;
95
+ tone: ButtonTone;
96
+ /**
97
+ * Figma "Type=Icon Only" as an independent axis: a square button of the
98
+ * current style/tone. Unlike legacy variant="icon", this composes with
99
+ * every style (outline/ghost/link included).
100
+ */
101
+ iconOnly: boolean;
102
+ /** Figma "State=Loading": shows a spinner, blocks interaction. */
103
+ loading: boolean;
82
104
  size: "small" | "medium" | "large";
83
105
  border: "corner-radius" | "small-corner-radius" | "no-corner-radius";
84
106
  disabled: boolean;
@@ -91,6 +113,10 @@ declare class RelButton extends LitElement {
91
113
  connectedCallback(): void;
92
114
  disconnectedCallback(): void;
93
115
  private handleHostClick;
116
+ /** Style axis with Figma-vocabulary aliases folded onto canonical values. */
117
+ private get styleVariant();
118
+ /** Tone axis with Figma-vocabulary aliases folded onto canonical values. */
119
+ private get effectiveTone();
94
120
  private get classes();
95
121
  private handleClick;
96
122
  render(): lit_html.TemplateResult<1>;
@@ -125,6 +151,12 @@ declare class RelCalendar extends LitElement {
125
151
  }
126
152
 
127
153
  declare class RelCard extends LitElement {
154
+ /**
155
+ * Figma "Type" axis: custom (default) renders slotted content with card
156
+ * padding; media adds a flush media region (slot name="media") above the
157
+ * content — pair it with <rel-card-media>.
158
+ */
159
+ type: "custom" | "media";
128
160
  static styles: lit.CSSResult;
129
161
  render(): lit_html.TemplateResult<1>;
130
162
  }
@@ -137,6 +169,13 @@ declare class RelCarousel extends LitElement {
137
169
  pauseOnHover: boolean;
138
170
  showButtons: boolean;
139
171
  showDots: boolean;
172
+ /**
173
+ * Figma "Type" axis. When set it drives which controls render:
174
+ * default = content only · only-indicators = dots · side-arrows = overlaid
175
+ * arrows + dots · bottom-arrows = dots flanked by arrows below the slide.
176
+ * When unset, the legacy show-buttons/show-dots booleans apply unchanged.
177
+ */
178
+ type?: "default" | "only-indicators" | "side-arrows" | "bottom-arrows";
140
179
  orientation: "horizontal" | "vertical";
141
180
  label: string;
142
181
  gap?: number;
@@ -160,6 +199,9 @@ declare class RelCarousel extends LitElement {
160
199
  firstUpdated(): void;
161
200
  disconnectedCallback(): void;
162
201
  private handleSlotChange;
202
+ private get vertical();
203
+ /** Translate along the orientation axis. */
204
+ private axisTransform;
163
205
  private unit;
164
206
  private updateTransform;
165
207
  private goToPrevious;
@@ -176,6 +218,10 @@ declare class RelCarousel extends LitElement {
176
218
  private handleMouseEnter;
177
219
  private handleMouseLeave;
178
220
  updated(changedProperties: Map<string, any>): void;
221
+ /** Where nav arrows render, honouring the Figma type when set. */
222
+ private get buttonPlacement();
223
+ private get dotsVisible();
224
+ private renderNavButton;
179
225
  render(): lit_html.TemplateResult<1>;
180
226
  }
181
227
 
@@ -223,6 +269,13 @@ declare class RelDatePicker extends LitElement {
223
269
  max: string | null;
224
270
  weekStart: "sun" | "mon";
225
271
  locale: string;
272
+ displayFormat: string | null;
273
+ /**
274
+ * Full control over the selected-value display; wins over `displayFormat`.
275
+ * Reactive (attribute:false) so assigning it after render re-renders the
276
+ * trigger — frameworks set callbacks as properties post-creation.
277
+ */
278
+ formatDate?: (date: Date) => string;
226
279
  open: boolean;
227
280
  closeOnSelect: boolean;
228
281
  clearable: boolean;
@@ -375,7 +428,7 @@ declare global {
375
428
  }
376
429
 
377
430
  declare class RelContainer extends LitElement {
378
- padding: "sm" | "md" | "lg";
431
+ padding: "sm" | "md" | "lg" | "xl";
379
432
  shadow: boolean;
380
433
  background: "light" | "white" | "none";
381
434
  static styles: lit.CSSResult;
@@ -419,6 +472,7 @@ declare class RelDrawer extends LitElement {
419
472
  description: string;
420
473
  private isDragging;
421
474
  private dragOffset;
475
+ private settled;
422
476
  private panelElement;
423
477
  private overlayElement;
424
478
  private previousFocus;
@@ -460,6 +514,20 @@ declare class RelKbd extends LitElement {
460
514
  static styles: lit.CSSResult;
461
515
  render(): lit_html.TemplateResult<1>;
462
516
  }
517
+ /**
518
+ * Multi-key shortcut (Figma Kbd Items=1/2/3/4): renders one <rel-kbd> per
519
+ * entry in `items` with "+" separators between them. Slotted <rel-kbd>
520
+ * children may be used instead of the items array.
521
+ *
522
+ * <rel-kbd-group .items=${["Ctrl", "Shift", "P"]} size="md"></rel-kbd-group>
523
+ */
524
+ declare class RelKbdGroup extends LitElement {
525
+ items: string[];
526
+ size: "sm" | "md" | "lg";
527
+ variant: "default" | "muted";
528
+ static styles: lit.CSSResult;
529
+ render(): lit_html.TemplateResult<1>;
530
+ }
463
531
 
464
532
  declare class RelLayout extends LitElement {
465
533
  gap: string;
@@ -470,7 +538,34 @@ declare class RelLayout extends LitElement {
470
538
  render(): lit_html.TemplateResult<1>;
471
539
  }
472
540
 
473
- type MenuType = "default" | "checkbox" | "arrow";
541
+ interface RadioOption {
542
+ value: string;
543
+ label: string;
544
+ supportingText?: string;
545
+ disabled?: boolean;
546
+ }
547
+ declare class RelRadio extends LitElement {
548
+ options: RadioOption[];
549
+ name: string;
550
+ selectedValue: string | null;
551
+ disabled: boolean;
552
+ error: boolean;
553
+ errorMessage: string;
554
+ value: string;
555
+ checked: boolean;
556
+ private _onChange;
557
+ private _onTouched;
558
+ static styles: lit.CSSResult;
559
+ private onChange;
560
+ registerOnChange(fn: (value: string) => void): void;
561
+ registerOnTouched(fn: () => void): void;
562
+ writeValue(value: string): void;
563
+ private get hasSelection();
564
+ private renderOption;
565
+ render(): lit_html.TemplateResult<1>;
566
+ }
567
+
568
+ type MenuType = "default" | "checkbox" | "arrow" | "select-option" | "fixed" | "fit";
474
569
  interface MenuItem {
475
570
  label: string;
476
571
  active?: boolean;
@@ -492,49 +587,23 @@ declare class RelMenu extends LitElement {
492
587
  items: MenuItem[];
493
588
  private focusedIndex;
494
589
  private _items;
495
- static readonly _css = "\n :host {\n display: inline-block;\n }\n\n .rel-menu {\n position: relative;\n display: inline-block;\n background: var(--rel-color-bg-primary);\n color: var(--rel-color-text-primary);\n border-radius: var(--rel-borders-radius-border-radius-300);\n box-shadow: var(--rel-shadows-shadow-300);\n min-width: 220px;\n font-family: var(--rel-fontFamilies-primary, sans-serif);\n font-size: var(--rel-fontSizes-sm);\n padding: var(--rel-spacing-space-3xs) 0;\n outline: none;\n overflow: hidden;\n }\n\n .rel-menu:focus-visible,\n :host(:focus-visible) .rel-menu {\n outline: 2px solid var(--rel-color-border-focus);\n outline-offset: 2px;\n }\n\n .rel-menu-item {\n position: relative;\n display: flex;\n align-items: center;\n gap: var(--rel-spacing-space-xs);\n padding: var(--rel-spacing-space-xs) var(--rel-spacing-space-sm);\n line-height: var(--rel-lineHeights-sm);\n cursor: pointer;\n transition: background 0.15s ease, color 0.15s ease;\n user-select: none;\n }\n\n .rel-menu-item:hover {\n background: var(--rel-color-bg-hover);\n }\n\n .rel-menu-item:active {\n background: var(--rel-color-bg-hover);\n }\n\n .rel-menu-item.active {\n background: var(--rel-color-bg-hover);\n font-weight: var(--rel-fontWeights-medium);\n }\n\n .rel-menu-item.disabled {\n background-color: transparent;\n color: var(--rel-color-text-disabled);\n cursor: not-allowed;\n }\n\n .rel-menu-item[data-focused=\"true\"] {\n outline: 2px solid var(--rel-color-border-focus);\n outline-offset: -2px;\n }\n\n .menu-check-row {\n display: inline-flex;\n align-items: center;\n gap: var(--rel-spacing-space-2xs);\n width: 100%;\n }\n\n .menu-checkbox {\n width: 16px;\n height: 16px;\n cursor: pointer;\n }\n\n .menu-checkbox:disabled {\n cursor: not-allowed;\n }\n\n .menu-label {\n flex: 1 1 auto;\n }\n\n .chevron {\n font-size: var(--rel-fontSizes-lg);\n opacity: 0.75;\n transform: translateY(1px);\n }\n\n .rel-submenu {\n position: absolute;\n top: calc(-1 * var(--rel-spacing-space-3xs));\n left: calc(100% + var(--rel-spacing-space-2xs));\n min-width: 200px;\n background: var(--rel-color-bg-primary);\n color: var(--rel-color-text-primary);\n border-radius: var(--rel-borders-radius-border-radius-300);\n box-shadow: var(--rel-shadows-shadow-300);\n padding: var(--rel-spacing-space-3xs) 0;\n visibility: hidden;\n pointer-events: none;\n z-index: 20;\n }\n\n .rel-submenu.visible {\n visibility: visible;\n pointer-events: auto;\n }\n\n .rel-submenu .rel-menu-item {\n padding: var(--rel-spacing-space-xs) var(--rel-spacing-space-sm);\n }\n ";
590
+ static readonly _css = "\n :host {\n color: var(--rel-text-default);\n display: inline-block;\n }\n\n .rel-menu {\n position: relative;\n display: inline-block;\n background: var(--rel-bg-neutral);\n color: var(--rel-text-default);\n border-radius: var(--rel-border-radius-md);\n box-shadow: var(--rel-shadows-shadow-300);\n min-width: 220px;\n /* No vertical padding: items fill edge-to-edge so a first/last-item hover\n reaches the menu's top/bottom. NOT overflow:hidden \u2014 that clips the\n type=arrow flyout (position:absolute at left:100%). Instead the first\n and last items carry the outer corner radius so hover backgrounds clip\n to the rounded shape without any overflow. */\n padding: 0;\n outline: none;\n overflow: visible;\n font-family: var(--rel-body-lg-regular-font-family);\n font-weight: var(--rel-body-lg-regular-font-weight);\n font-size: var(--rel-body-lg-regular-font-size);\n line-height: var(--rel-body-lg-regular-line-height);\n letter-spacing: var(--rel-body-lg-regular-letter-spacing);\n }\n\n .rel-menu:focus-visible,\n :host(:focus-visible) .rel-menu {\n outline: 2px solid var(--rel-border-focus);\n outline-offset: 2px;\n }\n\n .rel-menu-item {\n position: relative;\n display: flex;\n align-items: center;\n gap: var(--rel-spacing-xs);\n padding: var(--rel-spacing-xs) var(--rel-spacing-sm);\n line-height: var(--rel-body-sm-regular-line-height);\n cursor: pointer;\n transition: background 0.15s ease, color 0.15s ease;\n user-select: none;\n }\n\n /* First/last items carry the menu's outer radius so their hover fill clips\n to the rounded corners (replaces the removed overflow:hidden). */\n .rel-menu > .rel-menu-item:first-child {\n border-top-left-radius: var(--rel-border-radius-md);\n border-top-right-radius: var(--rel-border-radius-md);\n }\n\n .rel-menu > .rel-menu-item:last-child {\n border-bottom-left-radius: var(--rel-border-radius-md);\n border-bottom-right-radius: var(--rel-border-radius-md);\n }\n\n .rel-menu-item:hover {\n background: var(--rel-bg-neutral-elevated-1);\n }\n\n .rel-menu-item:active {\n background: var(--rel-bg-neutral-elevated-1);\n }\n\n .rel-menu-item.active {\n background: var(--rel-bg-neutral-elevated-2);\n font-weight: var(--rel-body-lg-medium-font-weight);\n }\n\n .rel-menu-item.disabled {\n background-color: transparent;\n color: var(--rel-text-disabled);\n /* Keep the item pointer-interactive so cursor:not-allowed actually\n renders; clicks are already neutralised by the item.disabled guard in\n onItemClick/onItemEnter. pointer-events:none here would make the row\n transparent to the pointer and suppress the cursor. */\n cursor: not-allowed;\n }\n\n .rel-menu-item[data-focused=\"true\"] {\n outline: 2px solid var(--rel-border-focus);\n outline-offset: -2px;\n }\n\n /* Width modes (Figma Type=Fixed / Type=Fit) */\n .rel-menu.fixed {\n width: var(--rel-menu-width, 300px);\n min-width: 0;\n box-sizing: border-box;\n }\n\n .rel-menu.fit {\n min-width: 0;\n width: max-content;\n }\n\n /* Checkbox (Type=Checkbox) / radio (Type=Select Option) rows render the real\n rel-checkbox / rel-radio. pointer-events:none keeps the whole row the click\n target so onItemClick stays the single source of truth. */\n .menu-control {\n pointer-events: none;\n width: 100%;\n }\n\n .menu-label {\n flex: 1 1 auto;\n }\n\n /* Submenu affordance \u2014 same rel-icon chevron the menubar uses. */\n .submenu-chevron {\n margin-left: auto;\n display: inline-flex;\n align-items: center;\n opacity: 0.6;\n pointer-events: none;\n }\n\n /* Shortcut / hint text (Figma body-sm-regular, caption tone) */\n .menu-shortcut,\n ::slotted([slot=\"shortcut\"]) {\n font-family: var(--rel-body-sm-regular-font-family);\n font-weight: var(--rel-body-sm-regular-font-weight);\n font-size: var(--rel-body-sm-regular-font-size);\n line-height: var(--rel-body-sm-regular-line-height);\n letter-spacing: var(--rel-body-sm-regular-letter-spacing);\n color: var(--rel-text-caption);\n margin-left: auto;\n padding-left: var(--rel-spacing-md);\n }\n\n \n .rel-submenu {\n border: 1px solid var(--rel-border-subtle);\n position: absolute;\n top: calc(-1 * var(--rel-spacing-3xs));\n /* flush against the trigger (no gap) so moving the pointer into the flyout\n never crosses a dead zone that would fire the trigger's mouseleave */\n left: 100%;\n min-width: 200px;\n background: var(--rel-bg-neutral);\n color: var(--rel-text-default);\n border-radius: var(--rel-border-radius-md);\n box-shadow: var(--rel-shadows-shadow-300);\n /* padding:0 + overflow:hidden \u2014 safe here (a submenu has no further nested\n flyout to clip) \u2014 so sub-item hovers fill fully and clip to the corners */\n padding: 0;\n overflow: hidden;\n visibility: hidden;\n pointer-events: none;\n z-index: 20;\n }\n\n .rel-submenu.visible {\n visibility: visible;\n pointer-events: auto;\n }\n\n .rel-submenu .rel-menu-item {\n padding: var(--rel-spacing-xs) var(--rel-spacing-sm);\n }\n ";
496
591
  createRenderRoot(): this;
497
592
  connectedCallback(): void;
498
593
  disconnectedCallback(): void;
499
594
  updated(changedProperties: Map<string, unknown>): void;
595
+ /** Index of a submenu locked open by a click (survives hover-out). -1 = none. */
596
+ private lockedIndex;
500
597
  private handleDocumentClick;
501
598
  private onItemEnter;
502
599
  private onItemLeave;
503
600
  private onItemClick;
504
601
  private onSubClick;
505
- private toggleCheckbox;
506
602
  private onKeydown;
507
603
  private renderMenuItem;
508
604
  render(): lit_html.TemplateResult<1>;
509
605
  }
510
606
 
511
- interface RadioOption {
512
- value: string;
513
- label: string;
514
- supportingText?: string;
515
- disabled?: boolean;
516
- }
517
- declare class RelRadio extends LitElement {
518
- options: RadioOption[];
519
- name: string;
520
- selectedValue: string | null;
521
- disabled: boolean;
522
- error: boolean;
523
- errorMessage: string;
524
- value: string;
525
- checked: boolean;
526
- private _onChange;
527
- private _onTouched;
528
- static styles: lit.CSSResult;
529
- private onChange;
530
- registerOnChange(fn: (value: string) => void): void;
531
- registerOnTouched(fn: () => void): void;
532
- writeValue(value: string): void;
533
- private get hasSelection();
534
- private renderOption;
535
- render(): lit_html.TemplateResult<1>;
536
- }
537
-
538
607
  declare class RelMenubar extends LitElement {
539
608
  private menus;
540
609
  private openMenuIndex;
@@ -543,7 +612,7 @@ declare class RelMenubar extends LitElement {
543
612
  private openSubmenuElement;
544
613
  private hoverSwitchEnabled;
545
614
  private _onScroll?;
546
- static readonly _css = "\n :host {\n display: block;\n }\n\n :host > slot {\n display: none;\n }\n\n .menubar-container {\n display: flex;\n align-items: stretch;\n background: var(--rel-color-bg-secondary);\n border: var(--rel-borders-width-stroke-100) solid var(--rel-color-border-default);\n border-radius: var(--rel-borders-radius-border-radius-200);\n overflow: hidden;\n padding: 0;\n gap: var(--rel-spacing-space-3xs);\n font-family: var(--rel-fontFamilies-primary);\n font-size: var(--rel-fontSizes-sm);\n height: 40px;\n width: fit-content;\n }\n\n .menubar-trigger {\n display: flex;\n align-items: center;\n align-self: stretch;\n height: 100%;\n padding: 0 var(--rel-spacing-space-sm);\n background: transparent;\n border: none;\n cursor: pointer;\n font-family: inherit;\n font-size: inherit;\n color: var(--rel-color-text-heading);\n transition: background 0.15s ease;\n user-select: none;\n outline: none;\n }\n\n .menubar-trigger:hover,\n .menubar-trigger.active {\n background: var(--rel-color-bg-selected);\n }\n\n .menubar-trigger:focus-visible {\n outline: 2px solid var(--rel-color-border-focus);\n outline-offset: 2px;\n }\n\n .menubar-panel {\n position: fixed;\n min-width: 220px;\n background: var(--rel-color-bg-primary);\n border: var(--rel-borders-width-stroke-100) solid var(--rel-color-border-default);\n border-radius: var(--rel-borders-radius-border-radius-200);\n box-shadow: var(--rel-shadows-shadow-300);\n padding: 0;\n overflow: hidden;\n z-index: 1000;\n display: none;\n }\n\n .menubar-panel.open {\n display: block;\n }\n\n .menu-item {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--rel-spacing-space-sm);\n padding: var(--rel-spacing-space-xs) var(--rel-spacing-space-md);\n cursor: pointer;\n transition: background 0.15s ease;\n user-select: none;\n color: var(--rel-color-text-heading);\n line-height: var(--rel-lineHeights-sm);\n }\n\n .menu-item:hover,\n .menu-item.focused {\n background: var(--rel-color-bg-selected);\n }\n\n .menu-item[data-disabled=\"true\"] {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .menu-separator {\n height: var(--rel-borders-width-stroke-100);\n background: var(--rel-color-border-divider);\n margin: 0;\n padding: 0;\n }\n\n rel-icon {\n display: inline-flex;\n pointer-events: none;\n }\n\n .menu-submenu-trigger {\n position: relative;\n }\n\n .menu-submenu-trigger rel-icon {\n opacity: 0.6;\n }\n\n .submenu-panel {\n position: fixed;\n min-width: 200px;\n background: var(--rel-color-bg-primary);\n border: var(--rel-borders-width-stroke-100) solid var(--rel-color-border-default);\n border-radius: var(--rel-borders-radius-border-radius-200);\n box-shadow: var(--rel-shadows-shadow-300);\n padding: 0;\n overflow: hidden;\n z-index: 1001;\n display: none;\n }\n\n .submenu-panel.open {\n display: block;\n }\n\n .menu-shortcut {\n opacity: 0.6;\n font-size: var(--rel-fontSizes-xs);\n margin-left: auto;\n display: flex;\n align-items: center;\n gap: var(--rel-spacing-space-3xs);\n }\n\n .menubar-panel rel-checkbox {\n display: block;\n width: 100%;\n padding: var(--rel-spacing-space-xs, 8px) var(--rel-spacing-space-md, 16px);\n box-sizing: border-box;\n cursor: pointer;\n }\n ";
615
+ static readonly _css = "\n /* This component renders into LIGHT DOM (createRenderRoot returns this), so\n :host / <slot> don't work here \u2014 the raw <rel-menubar-menu> definitions\n are data holders that must be hidden with a plain selector. Relying on the\n global rel-menubar-menu.css is not enough: it can't cross a consumer's\n shadow boundary AND it's a no-op in the tsup-built package (css:\"copy\"). */\n rel-menubar {\n color: var(--rel-text-default);\n display: block;\n }\n\n rel-menubar-menu {\n display: none;\n }\n\n .menubar-container {\n display: flex;\n align-items: stretch;\n background: var(--rel-bg-surface-elevated);\n border: var(--rel-stroke-sm) solid var(--rel-border-default);\n border-radius: var(--rel-border-radius-sm);\n overflow: hidden;\n padding: 0;\n gap: var(--rel-spacing-3xs);\n height: 40px;\n width: fit-content;\n font-family: var(--rel-body-sm-regular-font-family);\n font-weight: var(--rel-body-sm-regular-font-weight);\n font-size: var(--rel-body-sm-regular-font-size);\n line-height: var(--rel-body-sm-regular-line-height);\n letter-spacing: var(--rel-body-sm-regular-letter-spacing);\n }\n\n .menubar-trigger {\n display: flex;\n align-items: center;\n align-self: stretch;\n height: 100%;\n padding: 0 var(--rel-spacing-sm);\n background: transparent;\n border: none;\n cursor: pointer;\n font-family: inherit;\n font-size: inherit;\n color: var(--rel-text-label);\n transition: background 0.15s ease;\n user-select: none;\n outline: none;\n }\n\n .menubar-trigger:hover,\n .menubar-trigger.active {\n background: var(--rel-bg-neutral-elevated-2);\n }\n\n .menubar-trigger:focus-visible {\n outline: 2px solid var(--rel-border-focus);\n outline-offset: 2px;\n }\n\n .menubar-panel {\n position: fixed;\n min-width: 220px;\n background: var(--rel-bg-surface);\n border: var(--rel-stroke-sm) solid var(--rel-border-default);\n border-radius: var(--rel-border-radius-sm);\n box-shadow: var(--rel-shadows-shadow-300);\n padding: 0;\n overflow: hidden;\n z-index: 1000;\n display: none;\n }\n\n .menubar-panel.open {\n display: block;\n }\n\n .menu-item {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--rel-spacing-sm);\n padding: var(--rel-spacing-xs) var(--rel-spacing-md);\n cursor: pointer;\n transition: background 0.15s ease;\n user-select: none;\n color: var(--rel-text-label);\n line-height: var(--rel-body-sm-regular-line-height);\n }\n\n .menu-item:hover,\n .menu-item.focused {\n background: var(--rel-bg-neutral-elevated-2);\n }\n\n .menu-item[data-disabled=\"true\"] {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .menu-separator {\n height: var(--rel-stroke-sm);\n background: var(--rel-border-default);\n margin: 0;\n padding: 0;\n }\n\n rel-icon {\n display: inline-flex;\n pointer-events: none;\n }\n\n .menu-submenu-trigger {\n position: relative;\n }\n\n .menu-submenu-trigger rel-icon {\n opacity: 0.6;\n }\n\n .submenu-panel {\n position: fixed;\n min-width: 200px;\n background: var(--rel-bg-surface);\n border: var(--rel-stroke-sm) solid var(--rel-border-default);\n border-radius: var(--rel-border-radius-sm);\n box-shadow: var(--rel-shadows-shadow-300);\n padding: 0;\n overflow: hidden;\n z-index: 1001;\n display: none;\n }\n\n .submenu-panel.open {\n display: block;\n }\n\n .menu-shortcut {\n opacity: 0.6;\n margin-left: auto;\n display: flex;\n align-items: center;\n gap: var(--rel-spacing-3xs);\n font-family: var(--rel-body-xs-regular-font-family);\n font-weight: var(--rel-body-xs-regular-font-weight);\n font-size: var(--rel-body-xs-regular-font-size);\n line-height: var(--rel-body-xs-regular-line-height);\n letter-spacing: var(--rel-body-xs-regular-letter-spacing);\n }\n\n .menubar-panel rel-checkbox {\n display: block;\n width: 100%;\n padding: var(--rel-spacing-xs, 8px) var(--rel-spacing-md, 16px);\n box-sizing: border-box;\n cursor: pointer;\n }\n ";
547
616
  createRenderRoot(): this;
548
617
  connectedCallback(): void;
549
618
  disconnectedCallback(): void;
@@ -953,6 +1022,8 @@ declare global {
953
1022
 
954
1023
  declare class RelPopoverContent extends LitElement {
955
1024
  ariaLabel: string;
1025
+ /** Figma Size axis (S/M/L): panel padding 12/16/20px. */
1026
+ size: "sm" | "md" | "lg";
956
1027
  static styles: lit.CSSResult;
957
1028
  render(): lit_html.TemplateResult<1>;
958
1029
  }
@@ -1164,6 +1235,11 @@ declare class RelModal extends LitElement {
1164
1235
  description: string;
1165
1236
  dismissible: boolean;
1166
1237
  modal: boolean;
1238
+ /**
1239
+ * Figma "Breakpoint" axis. responsive (default) collapses to a full-width
1240
+ * bottom sheet below 480px; web keeps the fixed desktop panel at every size.
1241
+ */
1242
+ breakpoint: "responsive" | "web";
1167
1243
  private overlayElement;
1168
1244
  private previousFocus;
1169
1245
  private originalBodyOverflow;
@@ -1187,10 +1263,16 @@ declare global {
1187
1263
  }
1188
1264
  }
1189
1265
 
1190
- type SliderType = "continuous" | "discrete";
1266
+ /**
1267
+ * "continuous"/"discrete" are the legacy tick-mode values; Figma's Type axis
1268
+ * adds "default" (alias of continuous) and "range" (dual-thumb interval).
1269
+ */
1270
+ type SliderType = "continuous" | "discrete" | "default" | "range";
1191
1271
  type TrackStyle = "solid" | "dotted";
1192
1272
  declare class RelSlider extends LitElement {
1193
1273
  type: SliderType;
1274
+ /** Figma Size axis (S/M/L): scales track, thumb and ticks. */
1275
+ size: "sm" | "md" | "lg";
1194
1276
  min: number;
1195
1277
  max: number;
1196
1278
  step: number;
@@ -1199,13 +1281,26 @@ declare class RelSlider extends LitElement {
1199
1281
  showTickLabels: boolean;
1200
1282
  showBubble: boolean;
1201
1283
  value: number;
1284
+ /** Upper value when type="range" (attribute value-end). */
1285
+ valueEnd: number;
1202
1286
  private ticks;
1203
1287
  private _onChange;
1204
1288
  private _onTouched;
1205
1289
  static styles: lit.CSSResult;
1206
1290
  connectedCallback(): void;
1207
1291
  updated(changedProperties: Map<string, any>): void;
1292
+ private get isRange();
1208
1293
  private get percentage();
1294
+ private get percentageEnd();
1295
+ private dragThumb;
1296
+ private valueFromPointer;
1297
+ private onRangePointerDown;
1298
+ private onRangePointerMove;
1299
+ private onRangePointerUp;
1300
+ private applyRangeValue;
1301
+ private emitRangeChange;
1302
+ private onRangeInputStart;
1303
+ private onRangeInputEnd;
1209
1304
  private setupTicks;
1210
1305
  private getTickLeftPct;
1211
1306
  private isTickActive;
@@ -1250,6 +1345,10 @@ type StepStatus = "done" | "progress" | "disabled";
1250
1345
  type TextAlign = "right" | "below";
1251
1346
  type Orientation = "horizontal" | "vertical";
1252
1347
  type StepperSize = "small" | "large";
1348
+ /** Figma "Type": indicator content — default (number, check when done), dot, number, icon. */
1349
+ type StepperType = "default" | "dot" | "number" | "icon";
1350
+ /** Figma "Typel": label placement relative to the indicator. */
1351
+ type LabelPlacement = "top" | "centered" | "inverted";
1253
1352
  interface Step {
1254
1353
  title: string;
1255
1354
  status: StepStatus;
@@ -1259,6 +1358,15 @@ declare class RelStepper extends LitElement {
1259
1358
  textAlign: TextAlign;
1260
1359
  orientation: Orientation;
1261
1360
  size: StepperSize;
1361
+ type: StepperType;
1362
+ /**
1363
+ * Figma Typel axis: top = label top-aligned beside the indicator,
1364
+ * centered = label vertically centered beside it, inverted = indicator above
1365
+ * the label. When unset, the legacy textAlign prop drives the layout
1366
+ * (below ≈ inverted, right ≈ centered). Note Figma marks Top+Horizontal
1367
+ * as an unsupported combination.
1368
+ */
1369
+ labelPlacement?: LabelPlacement;
1262
1370
  static styles: lit.CSSResult;
1263
1371
  private isDone;
1264
1372
  private isProgress;
@@ -1307,6 +1415,8 @@ declare class RelTabItem extends LitElement {
1307
1415
  declare class RelTab extends LitElement {
1308
1416
  tabs: TabItem[];
1309
1417
  activeIndex: number;
1418
+ /** Tab size — styled via :host([size]) rules. */
1419
+ size: "sm" | "md" | "lg";
1310
1420
  private _tabItems;
1311
1421
  static styles: lit.CSSResult;
1312
1422
  private _onSlotChange;
@@ -1326,6 +1436,11 @@ declare class RelTextfield extends LitElement {
1326
1436
  value: string;
1327
1437
  leftIcon?: string;
1328
1438
  rightIcon?: string;
1439
+ /** Makes the trailing icon interactive (pointer + focusable) and emits
1440
+ * `rel-right-icon-click` — e.g. a password show/hide toggle or clear button. */
1441
+ clickableRightIcon: boolean;
1442
+ /** Accessible label for the trailing icon when it is clickable. */
1443
+ rightIconAriaLabel?: string;
1329
1444
  supportingText?: string;
1330
1445
  state: TextFieldState;
1331
1446
  size: TextFieldSize;
@@ -1355,6 +1470,8 @@ declare class RelTextfield extends LitElement {
1355
1470
  connectedCallback(): void;
1356
1471
  private handleFocus;
1357
1472
  private handleBlur;
1473
+ private handleRightIconClick;
1474
+ private handleRightIconKeydown;
1358
1475
  private handleInput;
1359
1476
  render(): lit_html.TemplateResult<1>;
1360
1477
  }
@@ -1377,11 +1494,14 @@ declare class RelToast extends LitElement {
1377
1494
  render(): lit_html.TemplateResult<1>;
1378
1495
  }
1379
1496
 
1380
- type TooltipPosition = "above" | "below";
1497
+ type TooltipPosition = "above" | "below" | "left" | "right";
1498
+ type TooltipType = "single-line" | "multi-line";
1381
1499
  declare class RelTooltip extends LitElement {
1382
1500
  text: string;
1383
1501
  position: TooltipPosition;
1384
1502
  showTail: boolean;
1503
+ /** Figma "Type": single-line stays on one line; multi-line wraps at a max width. */
1504
+ type: TooltipType;
1385
1505
  private uniqueId;
1386
1506
  static styles: lit.CSSResult;
1387
1507
  firstUpdated(): void;
@@ -1389,4 +1509,4 @@ declare class RelTooltip extends LitElement {
1389
1509
  render(): lit_html.TemplateResult<1>;
1390
1510
  }
1391
1511
 
1392
- export { type BreadcrumbItem, type ChipBorder, type ChipSize, type ChipTone, type ChipVariant, type DrawerCloseReason, type DrawerSide, type MenuItem, type MenuType, type ModalSide, type Orientation, type OtpType, type ProgressMode, type RadioOption, RelAccordion, RelAlert, RelAvatar, RelBadge, RelBreadcrumbs, RelButton, RelCalendar, RelCard, RelCardMedia, RelCarousel, RelCheckbox, RelChip, RelContainer, RelDatePicker, RelDivider, RelDrawer, RelDrawerFooter, RelKbd, RelLayout, RelMenu, RelMenuItem, RelMenubar, RelMenubarMenu, RelModal, RelNavbar, RelOtp, RelPagination, RelPopover, RelPopoverContent, RelProgress, RelRadio, RelRangePicker, RelResizableGroup, RelResizableHandle, RelResizablePanel, RelSegmentedButton, RelSelect, RelSkeleton, RelSlider, RelSnackbar, RelStepper, RelSwitch, RelTab, RelTabItem, RelTextfield, RelToast, RelTooltip, RelTopbar, RelTopbarActions, RelTopbarBrand, RelTopbarDropdown, RelTopbarDropdownItem, RelTopbarItem, RelTopbarMobilePanel, RelTopbarProfile, RelTopbarUtilities, type SegmentAlign, type SegmentOption, type SegmentSize, type SelectBorder, type SelectLabelStyle, type SelectOption, type SelectOptionObject, type SelectSize, type SelectState, type SkeletonAnimation, type SkeletonShape, type SliderType, type SnackbarLines, type SnackbarType, type Step, type StepStatus, type StepperSize, type TabItem, type TextAlign, type TextFieldSize, type TextFieldState, type TextFieldVariant, type ToastType, type TooltipPosition, type TopbarForceLayout, type TopbarProfileType, type TopbarRewardTier, type TopbarVariant, type TrackStyle };
1512
+ export { type BreadcrumbItem, type ButtonTone, type ButtonVariant, type ChipBorder, type ChipSize, type ChipTone, type ChipVariant, type DrawerCloseReason, type DrawerSide, type LabelPlacement, type MenuItem, type MenuType, type ModalSide, type Orientation, type OtpType, type ProgressMode, type RadioOption, RelAccordion, RelAlert, RelAvatar, RelBadge, RelBreadcrumbs, RelButton, RelCalendar, RelCard, RelCardMedia, RelCarousel, RelCheckbox, RelChip, RelContainer, RelDatePicker, RelDivider, RelDrawer, RelDrawerFooter, RelKbd, RelKbdGroup, RelLayout, RelMenu, RelMenuItem, RelMenubar, RelMenubarMenu, RelModal, RelNavbar, RelOtp, RelPagination, RelPopover, RelPopoverContent, RelProgress, RelRadio, RelRangePicker, RelResizableGroup, RelResizableHandle, RelResizablePanel, RelSegmentedButton, RelSelect, RelSkeleton, RelSlider, RelSnackbar, RelStepper, RelSwitch, RelTab, RelTabItem, RelTextfield, RelToast, RelTooltip, RelTopbar, RelTopbarActions, RelTopbarBrand, RelTopbarDropdown, RelTopbarDropdownItem, RelTopbarItem, RelTopbarMobilePanel, RelTopbarProfile, RelTopbarUtilities, type SegmentAlign, type SegmentOption, type SegmentSize, type SelectBorder, type SelectLabelStyle, type SelectOption, type SelectOptionObject, type SelectSize, type SelectState, type SkeletonAnimation, type SkeletonShape, type SliderType, type SnackbarLines, type SnackbarType, type Step, type StepStatus, type StepperSize, type StepperType, type TabItem, type TextAlign, type TextFieldSize, type TextFieldState, type TextFieldVariant, type ToastType, type TooltipPosition, type TooltipType, type TopbarForceLayout, type TopbarProfileType, type TopbarRewardTier, type TopbarVariant, type TrackStyle };