@reliability-design/web 1.3.1 → 1.4.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 (123) hide show
  1. package/dist/components/rel-accordion/README.md +13 -13
  2. package/dist/components/rel-accordion/rel-accordion.ts +80 -45
  3. package/dist/components/rel-alert/README.md +15 -15
  4. package/dist/components/rel-alert/rel-alert.ts +153 -158
  5. package/dist/components/rel-avatar/README.md +15 -15
  6. package/dist/components/rel-avatar/rel-avatar.ts +42 -38
  7. package/dist/components/rel-badge/README.md +5 -5
  8. package/dist/components/rel-badge/rel-badge.ts +46 -11
  9. package/dist/components/rel-breadcrumb/README.md +7 -7
  10. package/dist/components/rel-breadcrumb/rel-breadcrumb.ts +16 -13
  11. package/dist/components/rel-button/README.md +20 -20
  12. package/dist/components/rel-button/rel-button.ts +292 -105
  13. package/dist/components/rel-calendar/README.md +5 -5
  14. package/dist/components/rel-calendar/rel-calendar.ts +61 -45
  15. package/dist/components/rel-card/README.md +6 -6
  16. package/dist/components/rel-card/rel-card.ts +88 -35
  17. package/dist/components/rel-cardmedia/README.md +9 -9
  18. package/dist/components/rel-cardmedia/rel-cardmedia.ts +27 -20
  19. package/dist/components/rel-carousel/README.md +3 -3
  20. package/dist/components/rel-carousel/rel-carousel.ts +174 -90
  21. package/dist/components/rel-chart/README.md +8 -8
  22. package/dist/components/rel-chart/rel-chart.ts +59 -41
  23. package/dist/components/rel-checkbox/README.md +7 -7
  24. package/dist/components/rel-checkbox/rel-checkbox.ts +61 -61
  25. package/dist/components/rel-chip/README.md +16 -16
  26. package/dist/components/rel-chip/rel-chip.ts +143 -111
  27. package/dist/components/rel-container/README.md +11 -11
  28. package/dist/components/rel-container/rel-container.ts +35 -9
  29. package/dist/components/rel-date-picker/README.md +43 -7
  30. package/dist/components/rel-date-picker/date-format.test.ts +43 -0
  31. package/dist/components/rel-date-picker/date-format.ts +47 -0
  32. package/dist/components/rel-date-picker/rel-date-picker.ts +154 -82
  33. package/dist/components/rel-divider/README.md +9 -9
  34. package/dist/components/rel-divider/rel-divider.ts +10 -9
  35. package/dist/components/rel-drawer/README.md +1 -1
  36. package/dist/components/rel-drawer/rel-drawer-footer.ts +1 -1
  37. package/dist/components/rel-drawer/rel-drawer.ts +56 -28
  38. package/dist/components/rel-kbd/README.md +20 -20
  39. package/dist/components/rel-kbd/rel-kbd.ts +119 -25
  40. package/dist/components/rel-layout/README.md +1 -1
  41. package/dist/components/rel-layout/rel-layout.ts +2 -2
  42. package/dist/components/rel-menu/README.md +15 -15
  43. package/dist/components/rel-menu/rel-menu.ts +155 -88
  44. package/dist/components/rel-menubar/README.md +20 -20
  45. package/dist/components/rel-menubar/rel-menubar.ts +47 -31
  46. package/dist/components/rel-nav-menu/README.md +21 -21
  47. package/dist/components/rel-nav-menu/rel-nav-menu-item.ts +17 -14
  48. package/dist/components/rel-nav-menu/rel-nav-menu-panel.ts +33 -14
  49. package/dist/components/rel-nav-menu/rel-nav-menu.ts +14 -7
  50. package/dist/components/rel-navbar/README.md +7 -7
  51. package/dist/components/rel-navbar/rel-navbar.ts +12 -11
  52. package/dist/components/rel-otp/README.md +3 -3
  53. package/dist/components/rel-otp/rel-otp.ts +46 -30
  54. package/dist/components/rel-pagination/README.md +18 -18
  55. package/dist/components/rel-pagination/rel-pagination.ts +141 -90
  56. package/dist/components/rel-popover/README.md +13 -13
  57. package/dist/components/rel-popover/rel-popover-content.ts +39 -14
  58. package/dist/components/rel-popover/rel-popover.ts +18 -7
  59. package/dist/components/rel-progress/README.md +5 -5
  60. package/dist/components/rel-progress/rel-progress.ts +16 -12
  61. package/dist/components/rel-radio/README.md +9 -9
  62. package/dist/components/rel-radio/rel-radio.ts +64 -50
  63. package/dist/components/rel-range-picker/rel-range-picker.ts +120 -117
  64. package/dist/components/rel-resizable/README.md +4 -4
  65. package/dist/components/rel-resizable/rel-resizable-group.ts +15 -4
  66. package/dist/components/rel-resizable/rel-resizable-handle.ts +13 -9
  67. package/dist/components/rel-resizable/rel-resizable-panel.ts +11 -0
  68. package/dist/components/rel-segmented-button/README.md +10 -10
  69. package/dist/components/rel-segmented-button/rel-segmented-button.ts +39 -40
  70. package/dist/components/rel-select/README.md +14 -14
  71. package/dist/components/rel-select/rel-select.ts +120 -188
  72. package/dist/components/rel-sheet/README.md +10 -10
  73. package/dist/components/rel-sheet/rel-sheet.ts +82 -23
  74. package/dist/components/rel-sidebar/README.md +5 -5
  75. package/dist/components/rel-sidebar/rel-sidebar.ts +75 -60
  76. package/dist/components/rel-skeleton/rel-skeleton.ts +8 -13
  77. package/dist/components/rel-slider/README.md +10 -10
  78. package/dist/components/rel-slider/rel-slider.ts +230 -57
  79. package/dist/components/rel-snackbar/README.md +9 -9
  80. package/dist/components/rel-snackbar/rel-snackbar.ts +44 -32
  81. package/dist/components/rel-stepper/README.md +10 -10
  82. package/dist/components/rel-stepper/rel-stepper.ts +110 -46
  83. package/dist/components/rel-switch/README.md +5 -5
  84. package/dist/components/rel-switch/rel-switch.ts +23 -12
  85. package/dist/components/rel-tab/README.md +13 -13
  86. package/dist/components/rel-tab/rel-tab.ts +63 -19
  87. package/dist/components/rel-table/README.md +7 -7
  88. package/dist/components/rel-table/rel-table-body.ts +2 -1
  89. package/dist/components/rel-table/rel-table-caption.ts +10 -7
  90. package/dist/components/rel-table/rel-table-cell.ts +7 -6
  91. package/dist/components/rel-table/rel-table-footer.ts +4 -3
  92. package/dist/components/rel-table/rel-table-head.ts +11 -9
  93. package/dist/components/rel-table/rel-table-header.ts +2 -1
  94. package/dist/components/rel-table/rel-table-row.ts +5 -4
  95. package/dist/components/rel-table/rel-table.ts +16 -7
  96. package/dist/components/rel-textfield/README.md +11 -11
  97. package/dist/components/rel-textfield/rel-textfield.ts +172 -91
  98. package/dist/components/rel-toast/README.md +11 -11
  99. package/dist/components/rel-toast/rel-toast.ts +33 -30
  100. package/dist/components/rel-tooltip/README.md +7 -7
  101. package/dist/components/rel-tooltip/rel-tooltip.ts +160 -123
  102. package/dist/components/rel-topbar/rel-topbar-actions.ts +1 -2
  103. package/dist/components/rel-topbar/rel-topbar-brand.ts +8 -5
  104. package/dist/components/rel-topbar/rel-topbar-dropdown-item.ts +10 -8
  105. package/dist/components/rel-topbar/rel-topbar-dropdown.ts +4 -5
  106. package/dist/components/rel-topbar/rel-topbar-item.ts +23 -22
  107. package/dist/components/rel-topbar/rel-topbar-mobile-panel.ts +0 -1
  108. package/dist/components/rel-topbar/rel-topbar-profile.ts +68 -50
  109. package/dist/components/rel-topbar/rel-topbar-utilities.ts +1 -2
  110. package/dist/components/rel-topbar/rel-topbar.ts +31 -29
  111. package/dist/index.d.mts +151 -39
  112. package/dist/index.d.ts +151 -39
  113. package/dist/index.js +3544 -2289
  114. package/dist/index.js.map +1 -1
  115. package/dist/index.mjs +3876 -2622
  116. package/dist/index.mjs.map +1 -1
  117. package/dist/styles/vars.css +653 -363
  118. package/dist/vars-WY2XCF5G.css +653 -0
  119. package/package.json +3 -2
  120. package/dist/components/rel-range-picker/rel-range-picker.css +0 -349
  121. package/dist/styles/vars-v2.css +0 -525
  122. package/dist/vars-F54UGCHM.css +0 -363
  123. package/dist/vars-v2-VMGWTFJZ.css +0 -525
package/dist/index.d.mts 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;
@@ -460,6 +513,20 @@ declare class RelKbd extends LitElement {
460
513
  static styles: lit.CSSResult;
461
514
  render(): lit_html.TemplateResult<1>;
462
515
  }
516
+ /**
517
+ * Multi-key shortcut (Figma Kbd Items=1/2/3/4): renders one <rel-kbd> per
518
+ * entry in `items` with "+" separators between them. Slotted <rel-kbd>
519
+ * children may be used instead of the items array.
520
+ *
521
+ * <rel-kbd-group .items=${["Ctrl", "Shift", "P"]} size="md"></rel-kbd-group>
522
+ */
523
+ declare class RelKbdGroup extends LitElement {
524
+ items: string[];
525
+ size: "sm" | "md" | "lg";
526
+ variant: "default" | "muted";
527
+ static styles: lit.CSSResult;
528
+ render(): lit_html.TemplateResult<1>;
529
+ }
463
530
 
464
531
  declare class RelLayout extends LitElement {
465
532
  gap: string;
@@ -470,7 +537,34 @@ declare class RelLayout extends LitElement {
470
537
  render(): lit_html.TemplateResult<1>;
471
538
  }
472
539
 
473
- type MenuType = "default" | "checkbox" | "arrow";
540
+ interface RadioOption {
541
+ value: string;
542
+ label: string;
543
+ supportingText?: string;
544
+ disabled?: boolean;
545
+ }
546
+ declare class RelRadio extends LitElement {
547
+ options: RadioOption[];
548
+ name: string;
549
+ selectedValue: string | null;
550
+ disabled: boolean;
551
+ error: boolean;
552
+ errorMessage: string;
553
+ value: string;
554
+ checked: boolean;
555
+ private _onChange;
556
+ private _onTouched;
557
+ static styles: lit.CSSResult;
558
+ private onChange;
559
+ registerOnChange(fn: (value: string) => void): void;
560
+ registerOnTouched(fn: () => void): void;
561
+ writeValue(value: string): void;
562
+ private get hasSelection();
563
+ private renderOption;
564
+ render(): lit_html.TemplateResult<1>;
565
+ }
566
+
567
+ type MenuType = "default" | "checkbox" | "arrow" | "select-option" | "fixed" | "fit";
474
568
  interface MenuItem {
475
569
  label: string;
476
570
  active?: boolean;
@@ -492,49 +586,23 @@ declare class RelMenu extends LitElement {
492
586
  items: MenuItem[];
493
587
  private focusedIndex;
494
588
  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 ";
589
+ 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
590
  createRenderRoot(): this;
497
591
  connectedCallback(): void;
498
592
  disconnectedCallback(): void;
499
593
  updated(changedProperties: Map<string, unknown>): void;
594
+ /** Index of a submenu locked open by a click (survives hover-out). -1 = none. */
595
+ private lockedIndex;
500
596
  private handleDocumentClick;
501
597
  private onItemEnter;
502
598
  private onItemLeave;
503
599
  private onItemClick;
504
600
  private onSubClick;
505
- private toggleCheckbox;
506
601
  private onKeydown;
507
602
  private renderMenuItem;
508
603
  render(): lit_html.TemplateResult<1>;
509
604
  }
510
605
 
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
606
  declare class RelMenubar extends LitElement {
539
607
  private menus;
540
608
  private openMenuIndex;
@@ -543,7 +611,7 @@ declare class RelMenubar extends LitElement {
543
611
  private openSubmenuElement;
544
612
  private hoverSwitchEnabled;
545
613
  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 ";
614
+ 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
615
  createRenderRoot(): this;
548
616
  connectedCallback(): void;
549
617
  disconnectedCallback(): void;
@@ -953,6 +1021,8 @@ declare global {
953
1021
 
954
1022
  declare class RelPopoverContent extends LitElement {
955
1023
  ariaLabel: string;
1024
+ /** Figma Size axis (S/M/L): panel padding 12/16/20px. */
1025
+ size: "sm" | "md" | "lg";
956
1026
  static styles: lit.CSSResult;
957
1027
  render(): lit_html.TemplateResult<1>;
958
1028
  }
@@ -1164,6 +1234,11 @@ declare class RelModal extends LitElement {
1164
1234
  description: string;
1165
1235
  dismissible: boolean;
1166
1236
  modal: boolean;
1237
+ /**
1238
+ * Figma "Breakpoint" axis. responsive (default) collapses to a full-width
1239
+ * bottom sheet below 480px; web keeps the fixed desktop panel at every size.
1240
+ */
1241
+ breakpoint: "responsive" | "web";
1167
1242
  private overlayElement;
1168
1243
  private previousFocus;
1169
1244
  private originalBodyOverflow;
@@ -1187,10 +1262,16 @@ declare global {
1187
1262
  }
1188
1263
  }
1189
1264
 
1190
- type SliderType = "continuous" | "discrete";
1265
+ /**
1266
+ * "continuous"/"discrete" are the legacy tick-mode values; Figma's Type axis
1267
+ * adds "default" (alias of continuous) and "range" (dual-thumb interval).
1268
+ */
1269
+ type SliderType = "continuous" | "discrete" | "default" | "range";
1191
1270
  type TrackStyle = "solid" | "dotted";
1192
1271
  declare class RelSlider extends LitElement {
1193
1272
  type: SliderType;
1273
+ /** Figma Size axis (S/M/L): scales track, thumb and ticks. */
1274
+ size: "sm" | "md" | "lg";
1194
1275
  min: number;
1195
1276
  max: number;
1196
1277
  step: number;
@@ -1199,13 +1280,26 @@ declare class RelSlider extends LitElement {
1199
1280
  showTickLabels: boolean;
1200
1281
  showBubble: boolean;
1201
1282
  value: number;
1283
+ /** Upper value when type="range" (attribute value-end). */
1284
+ valueEnd: number;
1202
1285
  private ticks;
1203
1286
  private _onChange;
1204
1287
  private _onTouched;
1205
1288
  static styles: lit.CSSResult;
1206
1289
  connectedCallback(): void;
1207
1290
  updated(changedProperties: Map<string, any>): void;
1291
+ private get isRange();
1208
1292
  private get percentage();
1293
+ private get percentageEnd();
1294
+ private dragThumb;
1295
+ private valueFromPointer;
1296
+ private onRangePointerDown;
1297
+ private onRangePointerMove;
1298
+ private onRangePointerUp;
1299
+ private applyRangeValue;
1300
+ private emitRangeChange;
1301
+ private onRangeInputStart;
1302
+ private onRangeInputEnd;
1209
1303
  private setupTicks;
1210
1304
  private getTickLeftPct;
1211
1305
  private isTickActive;
@@ -1250,6 +1344,10 @@ type StepStatus = "done" | "progress" | "disabled";
1250
1344
  type TextAlign = "right" | "below";
1251
1345
  type Orientation = "horizontal" | "vertical";
1252
1346
  type StepperSize = "small" | "large";
1347
+ /** Figma "Type": indicator content — default (number, check when done), dot, number, icon. */
1348
+ type StepperType = "default" | "dot" | "number" | "icon";
1349
+ /** Figma "Typel": label placement relative to the indicator. */
1350
+ type LabelPlacement = "top" | "centered" | "inverted";
1253
1351
  interface Step {
1254
1352
  title: string;
1255
1353
  status: StepStatus;
@@ -1259,6 +1357,15 @@ declare class RelStepper extends LitElement {
1259
1357
  textAlign: TextAlign;
1260
1358
  orientation: Orientation;
1261
1359
  size: StepperSize;
1360
+ type: StepperType;
1361
+ /**
1362
+ * Figma Typel axis: top = label top-aligned beside the indicator,
1363
+ * centered = label vertically centered beside it, inverted = indicator above
1364
+ * the label. When unset, the legacy textAlign prop drives the layout
1365
+ * (below ≈ inverted, right ≈ centered). Note Figma marks Top+Horizontal
1366
+ * as an unsupported combination.
1367
+ */
1368
+ labelPlacement?: LabelPlacement;
1262
1369
  static styles: lit.CSSResult;
1263
1370
  private isDone;
1264
1371
  private isProgress;
@@ -1307,6 +1414,8 @@ declare class RelTabItem extends LitElement {
1307
1414
  declare class RelTab extends LitElement {
1308
1415
  tabs: TabItem[];
1309
1416
  activeIndex: number;
1417
+ /** Tab size — styled via :host([size]) rules. */
1418
+ size: "sm" | "md" | "lg";
1310
1419
  private _tabItems;
1311
1420
  static styles: lit.CSSResult;
1312
1421
  private _onSlotChange;
@@ -1377,11 +1486,14 @@ declare class RelToast extends LitElement {
1377
1486
  render(): lit_html.TemplateResult<1>;
1378
1487
  }
1379
1488
 
1380
- type TooltipPosition = "above" | "below";
1489
+ type TooltipPosition = "above" | "below" | "left" | "right";
1490
+ type TooltipType = "single-line" | "multi-line";
1381
1491
  declare class RelTooltip extends LitElement {
1382
1492
  text: string;
1383
1493
  position: TooltipPosition;
1384
1494
  showTail: boolean;
1495
+ /** Figma "Type": single-line stays on one line; multi-line wraps at a max width. */
1496
+ type: TooltipType;
1385
1497
  private uniqueId;
1386
1498
  static styles: lit.CSSResult;
1387
1499
  firstUpdated(): void;
@@ -1389,4 +1501,4 @@ declare class RelTooltip extends LitElement {
1389
1501
  render(): lit_html.TemplateResult<1>;
1390
1502
  }
1391
1503
 
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 };
1504
+ 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 };